app.1576058431931.js 6.86 MB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524
/******/ (function(modules) { // webpackBootstrap
/******/ 	// install a JSONP callback for chunk loading
/******/ 	function webpackJsonpCallback(data) {
/******/ 		var chunkIds = data[0];
/******/ 		var moreModules = data[1];
/******/
/******/
/******/ 		// add "moreModules" to the modules object,
/******/ 		// then flag all "chunkIds" as loaded and fire callback
/******/ 		var moduleId, chunkId, i = 0, resolves = [];
/******/ 		for(;i < chunkIds.length; i++) {
/******/ 			chunkId = chunkIds[i];
/******/ 			if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
/******/ 				resolves.push(installedChunks[chunkId][0]);
/******/ 			}
/******/ 			installedChunks[chunkId] = 0;
/******/ 		}
/******/ 		for(moduleId in moreModules) {
/******/ 			if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ 				modules[moduleId] = moreModules[moduleId];
/******/ 			}
/******/ 		}
/******/ 		if(parentJsonpFunction) parentJsonpFunction(data);
/******/
/******/ 		while(resolves.length) {
/******/ 			resolves.shift()();
/******/ 		}
/******/
/******/ 	};
/******/
/******/ 	function hotDisposeChunk(chunkId) {
/******/ 		delete installedChunks[chunkId];
/******/ 	}
/******/ 	var parentHotUpdateCallback = (typeof self !== 'undefined' ? self : this)["webpackHotUpdate"];
/******/ 	(typeof self !== 'undefined' ? self : this)["webpackHotUpdate"] = // eslint-disable-next-line no-unused-vars
/******/ 	function webpackHotUpdateCallback(chunkId, moreModules) {
/******/ 		hotAddUpdateChunk(chunkId, moreModules);
/******/ 		if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);
/******/ 	} ;
/******/
/******/ 	// eslint-disable-next-line no-unused-vars
/******/ 	function hotDownloadUpdateChunk(chunkId) {
/******/ 		var script = document.createElement("script");
/******/ 		script.charset = "utf-8";
/******/ 		script.src = __webpack_require__.p + "" + chunkId + "." + hotCurrentHash + ".hot-update.js";
/******/ 		if (null) script.crossOrigin = null;
/******/ 		document.head.appendChild(script);
/******/ 	}
/******/
/******/ 	// eslint-disable-next-line no-unused-vars
/******/ 	function hotDownloadManifest(requestTimeout) {
/******/ 		requestTimeout = requestTimeout || 10000;
/******/ 		return new Promise(function(resolve, reject) {
/******/ 			if (typeof XMLHttpRequest === "undefined") {
/******/ 				return reject(new Error("No browser support"));
/******/ 			}
/******/ 			try {
/******/ 				var request = new XMLHttpRequest();
/******/ 				var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
/******/ 				request.open("GET", requestPath, true);
/******/ 				request.timeout = requestTimeout;
/******/ 				request.send(null);
/******/ 			} catch (err) {
/******/ 				return reject(err);
/******/ 			}
/******/ 			request.onreadystatechange = function() {
/******/ 				if (request.readyState !== 4) return;
/******/ 				if (request.status === 0) {
/******/ 					// timeout
/******/ 					reject(
/******/ 						new Error("Manifest request to " + requestPath + " timed out.")
/******/ 					);
/******/ 				} else if (request.status === 404) {
/******/ 					// no update available
/******/ 					resolve();
/******/ 				} else if (request.status !== 200 && request.status !== 304) {
/******/ 					// other failure
/******/ 					reject(new Error("Manifest request to " + requestPath + " failed."));
/******/ 				} else {
/******/ 					// success
/******/ 					try {
/******/ 						var update = JSON.parse(request.responseText);
/******/ 					} catch (e) {
/******/ 						reject(e);
/******/ 						return;
/******/ 					}
/******/ 					resolve(update);
/******/ 				}
/******/ 			};
/******/ 		});
/******/ 	}
/******/
/******/ 	var hotApplyOnUpdate = true;
/******/ 	// eslint-disable-next-line no-unused-vars
/******/ 	var hotCurrentHash = "2978f5b56a60722646a2";
/******/ 	var hotRequestTimeout = 10000;
/******/ 	var hotCurrentModuleData = {};
/******/ 	var hotCurrentChildModule;
/******/ 	// eslint-disable-next-line no-unused-vars
/******/ 	var hotCurrentParents = [];
/******/ 	// eslint-disable-next-line no-unused-vars
/******/ 	var hotCurrentParentsTemp = [];
/******/
/******/ 	// eslint-disable-next-line no-unused-vars
/******/ 	function hotCreateRequire(moduleId) {
/******/ 		var me = installedModules[moduleId];
/******/ 		if (!me) return __webpack_require__;
/******/ 		var fn = function(request) {
/******/ 			if (me.hot.active) {
/******/ 				if (installedModules[request]) {
/******/ 					if (installedModules[request].parents.indexOf(moduleId) === -1) {
/******/ 						installedModules[request].parents.push(moduleId);
/******/ 					}
/******/ 				} else {
/******/ 					hotCurrentParents = [moduleId];
/******/ 					hotCurrentChildModule = request;
/******/ 				}
/******/ 				if (me.children.indexOf(request) === -1) {
/******/ 					me.children.push(request);
/******/ 				}
/******/ 			} else {
/******/ 				console.warn(
/******/ 					"[HMR] unexpected require(" +
/******/ 						request +
/******/ 						") from disposed module " +
/******/ 						moduleId
/******/ 				);
/******/ 				hotCurrentParents = [];
/******/ 			}
/******/ 			return __webpack_require__(request);
/******/ 		};
/******/ 		var ObjectFactory = function ObjectFactory(name) {
/******/ 			return {
/******/ 				configurable: true,
/******/ 				enumerable: true,
/******/ 				get: function() {
/******/ 					return __webpack_require__[name];
/******/ 				},
/******/ 				set: function(value) {
/******/ 					__webpack_require__[name] = value;
/******/ 				}
/******/ 			};
/******/ 		};
/******/ 		for (var name in __webpack_require__) {
/******/ 			if (
/******/ 				Object.prototype.hasOwnProperty.call(__webpack_require__, name) &&
/******/ 				name !== "e" &&
/******/ 				name !== "t"
/******/ 			) {
/******/ 				Object.defineProperty(fn, name, ObjectFactory(name));
/******/ 			}
/******/ 		}
/******/ 		fn.e = function(chunkId) {
/******/ 			if (hotStatus === "ready") hotSetStatus("prepare");
/******/ 			hotChunksLoading++;
/******/ 			return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) {
/******/ 				finishChunkLoading();
/******/ 				throw err;
/******/ 			});
/******/
/******/ 			function finishChunkLoading() {
/******/ 				hotChunksLoading--;
/******/ 				if (hotStatus === "prepare") {
/******/ 					if (!hotWaitingFilesMap[chunkId]) {
/******/ 						hotEnsureUpdateChunk(chunkId);
/******/ 					}
/******/ 					if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
/******/ 						hotUpdateDownloaded();
/******/ 					}
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 		fn.t = function(value, mode) {
/******/ 			if (mode & 1) value = fn(value);
/******/ 			return __webpack_require__.t(value, mode & ~1);
/******/ 		};
/******/ 		return fn;
/******/ 	}
/******/
/******/ 	// eslint-disable-next-line no-unused-vars
/******/ 	function hotCreateModule(moduleId) {
/******/ 		var hot = {
/******/ 			// private stuff
/******/ 			_acceptedDependencies: {},
/******/ 			_declinedDependencies: {},
/******/ 			_selfAccepted: false,
/******/ 			_selfDeclined: false,
/******/ 			_disposeHandlers: [],
/******/ 			_main: hotCurrentChildModule !== moduleId,
/******/
/******/ 			// Module API
/******/ 			active: true,
/******/ 			accept: function(dep, callback) {
/******/ 				if (dep === undefined) hot._selfAccepted = true;
/******/ 				else if (typeof dep === "function") hot._selfAccepted = dep;
/******/ 				else if (typeof dep === "object")
/******/ 					for (var i = 0; i < dep.length; i++)
/******/ 						hot._acceptedDependencies[dep[i]] = callback || function() {};
/******/ 				else hot._acceptedDependencies[dep] = callback || function() {};
/******/ 			},
/******/ 			decline: function(dep) {
/******/ 				if (dep === undefined) hot._selfDeclined = true;
/******/ 				else if (typeof dep === "object")
/******/ 					for (var i = 0; i < dep.length; i++)
/******/ 						hot._declinedDependencies[dep[i]] = true;
/******/ 				else hot._declinedDependencies[dep] = true;
/******/ 			},
/******/ 			dispose: function(callback) {
/******/ 				hot._disposeHandlers.push(callback);
/******/ 			},
/******/ 			addDisposeHandler: function(callback) {
/******/ 				hot._disposeHandlers.push(callback);
/******/ 			},
/******/ 			removeDisposeHandler: function(callback) {
/******/ 				var idx = hot._disposeHandlers.indexOf(callback);
/******/ 				if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
/******/ 			},
/******/
/******/ 			// Management API
/******/ 			check: hotCheck,
/******/ 			apply: hotApply,
/******/ 			status: function(l) {
/******/ 				if (!l) return hotStatus;
/******/ 				hotStatusHandlers.push(l);
/******/ 			},
/******/ 			addStatusHandler: function(l) {
/******/ 				hotStatusHandlers.push(l);
/******/ 			},
/******/ 			removeStatusHandler: function(l) {
/******/ 				var idx = hotStatusHandlers.indexOf(l);
/******/ 				if (idx >= 0) hotStatusHandlers.splice(idx, 1);
/******/ 			},
/******/
/******/ 			//inherit from previous dispose call
/******/ 			data: hotCurrentModuleData[moduleId]
/******/ 		};
/******/ 		hotCurrentChildModule = undefined;
/******/ 		return hot;
/******/ 	}
/******/
/******/ 	var hotStatusHandlers = [];
/******/ 	var hotStatus = "idle";
/******/
/******/ 	function hotSetStatus(newStatus) {
/******/ 		hotStatus = newStatus;
/******/ 		for (var i = 0; i < hotStatusHandlers.length; i++)
/******/ 			hotStatusHandlers[i].call(null, newStatus);
/******/ 	}
/******/
/******/ 	// while downloading
/******/ 	var hotWaitingFiles = 0;
/******/ 	var hotChunksLoading = 0;
/******/ 	var hotWaitingFilesMap = {};
/******/ 	var hotRequestedFilesMap = {};
/******/ 	var hotAvailableFilesMap = {};
/******/ 	var hotDeferred;
/******/
/******/ 	// The update info
/******/ 	var hotUpdate, hotUpdateNewHash;
/******/
/******/ 	function toModuleId(id) {
/******/ 		var isNumber = +id + "" === id;
/******/ 		return isNumber ? +id : id;
/******/ 	}
/******/
/******/ 	function hotCheck(apply) {
/******/ 		if (hotStatus !== "idle") {
/******/ 			throw new Error("check() is only allowed in idle status");
/******/ 		}
/******/ 		hotApplyOnUpdate = apply;
/******/ 		hotSetStatus("check");
/******/ 		return hotDownloadManifest(hotRequestTimeout).then(function(update) {
/******/ 			if (!update) {
/******/ 				hotSetStatus("idle");
/******/ 				return null;
/******/ 			}
/******/ 			hotRequestedFilesMap = {};
/******/ 			hotWaitingFilesMap = {};
/******/ 			hotAvailableFilesMap = update.c;
/******/ 			hotUpdateNewHash = update.h;
/******/
/******/ 			hotSetStatus("prepare");
/******/ 			var promise = new Promise(function(resolve, reject) {
/******/ 				hotDeferred = {
/******/ 					resolve: resolve,
/******/ 					reject: reject
/******/ 				};
/******/ 			});
/******/ 			hotUpdate = {};
/******/ 			for(var chunkId in installedChunks)
/******/ 			// eslint-disable-next-line no-lone-blocks
/******/ 			{
/******/ 				/*globals chunkId */
/******/ 				hotEnsureUpdateChunk(chunkId);
/******/ 			}
/******/ 			if (
/******/ 				hotStatus === "prepare" &&
/******/ 				hotChunksLoading === 0 &&
/******/ 				hotWaitingFiles === 0
/******/ 			) {
/******/ 				hotUpdateDownloaded();
/******/ 			}
/******/ 			return promise;
/******/ 		});
/******/ 	}
/******/
/******/ 	// eslint-disable-next-line no-unused-vars
/******/ 	function hotAddUpdateChunk(chunkId, moreModules) {
/******/ 		if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])
/******/ 			return;
/******/ 		hotRequestedFilesMap[chunkId] = false;
/******/ 		for (var moduleId in moreModules) {
/******/ 			if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ 				hotUpdate[moduleId] = moreModules[moduleId];
/******/ 			}
/******/ 		}
/******/ 		if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
/******/ 			hotUpdateDownloaded();
/******/ 		}
/******/ 	}
/******/
/******/ 	function hotEnsureUpdateChunk(chunkId) {
/******/ 		if (!hotAvailableFilesMap[chunkId]) {
/******/ 			hotWaitingFilesMap[chunkId] = true;
/******/ 		} else {
/******/ 			hotRequestedFilesMap[chunkId] = true;
/******/ 			hotWaitingFiles++;
/******/ 			hotDownloadUpdateChunk(chunkId);
/******/ 		}
/******/ 	}
/******/
/******/ 	function hotUpdateDownloaded() {
/******/ 		hotSetStatus("ready");
/******/ 		var deferred = hotDeferred;
/******/ 		hotDeferred = null;
/******/ 		if (!deferred) return;
/******/ 		if (hotApplyOnUpdate) {
/******/ 			// Wrap deferred object in Promise to mark it as a well-handled Promise to
/******/ 			// avoid triggering uncaught exception warning in Chrome.
/******/ 			// See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
/******/ 			Promise.resolve()
/******/ 				.then(function() {
/******/ 					return hotApply(hotApplyOnUpdate);
/******/ 				})
/******/ 				.then(
/******/ 					function(result) {
/******/ 						deferred.resolve(result);
/******/ 					},
/******/ 					function(err) {
/******/ 						deferred.reject(err);
/******/ 					}
/******/ 				);
/******/ 		} else {
/******/ 			var outdatedModules = [];
/******/ 			for (var id in hotUpdate) {
/******/ 				if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
/******/ 					outdatedModules.push(toModuleId(id));
/******/ 				}
/******/ 			}
/******/ 			deferred.resolve(outdatedModules);
/******/ 		}
/******/ 	}
/******/
/******/ 	function hotApply(options) {
/******/ 		if (hotStatus !== "ready")
/******/ 			throw new Error("apply() is only allowed in ready status");
/******/ 		options = options || {};
/******/
/******/ 		var cb;
/******/ 		var i;
/******/ 		var j;
/******/ 		var module;
/******/ 		var moduleId;
/******/
/******/ 		function getAffectedStuff(updateModuleId) {
/******/ 			var outdatedModules = [updateModuleId];
/******/ 			var outdatedDependencies = {};
/******/
/******/ 			var queue = outdatedModules.map(function(id) {
/******/ 				return {
/******/ 					chain: [id],
/******/ 					id: id
/******/ 				};
/******/ 			});
/******/ 			while (queue.length > 0) {
/******/ 				var queueItem = queue.pop();
/******/ 				var moduleId = queueItem.id;
/******/ 				var chain = queueItem.chain;
/******/ 				module = installedModules[moduleId];
/******/ 				if (!module || module.hot._selfAccepted) continue;
/******/ 				if (module.hot._selfDeclined) {
/******/ 					return {
/******/ 						type: "self-declined",
/******/ 						chain: chain,
/******/ 						moduleId: moduleId
/******/ 					};
/******/ 				}
/******/ 				if (module.hot._main) {
/******/ 					return {
/******/ 						type: "unaccepted",
/******/ 						chain: chain,
/******/ 						moduleId: moduleId
/******/ 					};
/******/ 				}
/******/ 				for (var i = 0; i < module.parents.length; i++) {
/******/ 					var parentId = module.parents[i];
/******/ 					var parent = installedModules[parentId];
/******/ 					if (!parent) continue;
/******/ 					if (parent.hot._declinedDependencies[moduleId]) {
/******/ 						return {
/******/ 							type: "declined",
/******/ 							chain: chain.concat([parentId]),
/******/ 							moduleId: moduleId,
/******/ 							parentId: parentId
/******/ 						};
/******/ 					}
/******/ 					if (outdatedModules.indexOf(parentId) !== -1) continue;
/******/ 					if (parent.hot._acceptedDependencies[moduleId]) {
/******/ 						if (!outdatedDependencies[parentId])
/******/ 							outdatedDependencies[parentId] = [];
/******/ 						addAllToSet(outdatedDependencies[parentId], [moduleId]);
/******/ 						continue;
/******/ 					}
/******/ 					delete outdatedDependencies[parentId];
/******/ 					outdatedModules.push(parentId);
/******/ 					queue.push({
/******/ 						chain: chain.concat([parentId]),
/******/ 						id: parentId
/******/ 					});
/******/ 				}
/******/ 			}
/******/
/******/ 			return {
/******/ 				type: "accepted",
/******/ 				moduleId: updateModuleId,
/******/ 				outdatedModules: outdatedModules,
/******/ 				outdatedDependencies: outdatedDependencies
/******/ 			};
/******/ 		}
/******/
/******/ 		function addAllToSet(a, b) {
/******/ 			for (var i = 0; i < b.length; i++) {
/******/ 				var item = b[i];
/******/ 				if (a.indexOf(item) === -1) a.push(item);
/******/ 			}
/******/ 		}
/******/
/******/ 		// at begin all updates modules are outdated
/******/ 		// the "outdated" status can propagate to parents if they don't accept the children
/******/ 		var outdatedDependencies = {};
/******/ 		var outdatedModules = [];
/******/ 		var appliedUpdate = {};
/******/
/******/ 		var warnUnexpectedRequire = function warnUnexpectedRequire() {
/******/ 			console.warn(
/******/ 				"[HMR] unexpected require(" + result.moduleId + ") to disposed module"
/******/ 			);
/******/ 		};
/******/
/******/ 		for (var id in hotUpdate) {
/******/ 			if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
/******/ 				moduleId = toModuleId(id);
/******/ 				/** @type {TODO} */
/******/ 				var result;
/******/ 				if (hotUpdate[id]) {
/******/ 					result = getAffectedStuff(moduleId);
/******/ 				} else {
/******/ 					result = {
/******/ 						type: "disposed",
/******/ 						moduleId: id
/******/ 					};
/******/ 				}
/******/ 				/** @type {Error|false} */
/******/ 				var abortError = false;
/******/ 				var doApply = false;
/******/ 				var doDispose = false;
/******/ 				var chainInfo = "";
/******/ 				if (result.chain) {
/******/ 					chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
/******/ 				}
/******/ 				switch (result.type) {
/******/ 					case "self-declined":
/******/ 						if (options.onDeclined) options.onDeclined(result);
/******/ 						if (!options.ignoreDeclined)
/******/ 							abortError = new Error(
/******/ 								"Aborted because of self decline: " +
/******/ 									result.moduleId +
/******/ 									chainInfo
/******/ 							);
/******/ 						break;
/******/ 					case "declined":
/******/ 						if (options.onDeclined) options.onDeclined(result);
/******/ 						if (!options.ignoreDeclined)
/******/ 							abortError = new Error(
/******/ 								"Aborted because of declined dependency: " +
/******/ 									result.moduleId +
/******/ 									" in " +
/******/ 									result.parentId +
/******/ 									chainInfo
/******/ 							);
/******/ 						break;
/******/ 					case "unaccepted":
/******/ 						if (options.onUnaccepted) options.onUnaccepted(result);
/******/ 						if (!options.ignoreUnaccepted)
/******/ 							abortError = new Error(
/******/ 								"Aborted because " + moduleId + " is not accepted" + chainInfo
/******/ 							);
/******/ 						break;
/******/ 					case "accepted":
/******/ 						if (options.onAccepted) options.onAccepted(result);
/******/ 						doApply = true;
/******/ 						break;
/******/ 					case "disposed":
/******/ 						if (options.onDisposed) options.onDisposed(result);
/******/ 						doDispose = true;
/******/ 						break;
/******/ 					default:
/******/ 						throw new Error("Unexception type " + result.type);
/******/ 				}
/******/ 				if (abortError) {
/******/ 					hotSetStatus("abort");
/******/ 					return Promise.reject(abortError);
/******/ 				}
/******/ 				if (doApply) {
/******/ 					appliedUpdate[moduleId] = hotUpdate[moduleId];
/******/ 					addAllToSet(outdatedModules, result.outdatedModules);
/******/ 					for (moduleId in result.outdatedDependencies) {
/******/ 						if (
/******/ 							Object.prototype.hasOwnProperty.call(
/******/ 								result.outdatedDependencies,
/******/ 								moduleId
/******/ 							)
/******/ 						) {
/******/ 							if (!outdatedDependencies[moduleId])
/******/ 								outdatedDependencies[moduleId] = [];
/******/ 							addAllToSet(
/******/ 								outdatedDependencies[moduleId],
/******/ 								result.outdatedDependencies[moduleId]
/******/ 							);
/******/ 						}
/******/ 					}
/******/ 				}
/******/ 				if (doDispose) {
/******/ 					addAllToSet(outdatedModules, [result.moduleId]);
/******/ 					appliedUpdate[moduleId] = warnUnexpectedRequire;
/******/ 				}
/******/ 			}
/******/ 		}
/******/
/******/ 		// Store self accepted outdated modules to require them later by the module system
/******/ 		var outdatedSelfAcceptedModules = [];
/******/ 		for (i = 0; i < outdatedModules.length; i++) {
/******/ 			moduleId = outdatedModules[i];
/******/ 			if (
/******/ 				installedModules[moduleId] &&
/******/ 				installedModules[moduleId].hot._selfAccepted &&
/******/ 				// removed self-accepted modules should not be required
/******/ 				appliedUpdate[moduleId] !== warnUnexpectedRequire
/******/ 			) {
/******/ 				outdatedSelfAcceptedModules.push({
/******/ 					module: moduleId,
/******/ 					errorHandler: installedModules[moduleId].hot._selfAccepted
/******/ 				});
/******/ 			}
/******/ 		}
/******/
/******/ 		// Now in "dispose" phase
/******/ 		hotSetStatus("dispose");
/******/ 		Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
/******/ 			if (hotAvailableFilesMap[chunkId] === false) {
/******/ 				hotDisposeChunk(chunkId);
/******/ 			}
/******/ 		});
/******/
/******/ 		var idx;
/******/ 		var queue = outdatedModules.slice();
/******/ 		while (queue.length > 0) {
/******/ 			moduleId = queue.pop();
/******/ 			module = installedModules[moduleId];
/******/ 			if (!module) continue;
/******/
/******/ 			var data = {};
/******/
/******/ 			// Call dispose handlers
/******/ 			var disposeHandlers = module.hot._disposeHandlers;
/******/ 			for (j = 0; j < disposeHandlers.length; j++) {
/******/ 				cb = disposeHandlers[j];
/******/ 				cb(data);
/******/ 			}
/******/ 			hotCurrentModuleData[moduleId] = data;
/******/
/******/ 			// disable module (this disables requires from this module)
/******/ 			module.hot.active = false;
/******/
/******/ 			// remove module from cache
/******/ 			delete installedModules[moduleId];
/******/
/******/ 			// when disposing there is no need to call dispose handler
/******/ 			delete outdatedDependencies[moduleId];
/******/
/******/ 			// remove "parents" references from all children
/******/ 			for (j = 0; j < module.children.length; j++) {
/******/ 				var child = installedModules[module.children[j]];
/******/ 				if (!child) continue;
/******/ 				idx = child.parents.indexOf(moduleId);
/******/ 				if (idx >= 0) {
/******/ 					child.parents.splice(idx, 1);
/******/ 				}
/******/ 			}
/******/ 		}
/******/
/******/ 		// remove outdated dependency from module children
/******/ 		var dependency;
/******/ 		var moduleOutdatedDependencies;
/******/ 		for (moduleId in outdatedDependencies) {
/******/ 			if (
/******/ 				Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
/******/ 			) {
/******/ 				module = installedModules[moduleId];
/******/ 				if (module) {
/******/ 					moduleOutdatedDependencies = outdatedDependencies[moduleId];
/******/ 					for (j = 0; j < moduleOutdatedDependencies.length; j++) {
/******/ 						dependency = moduleOutdatedDependencies[j];
/******/ 						idx = module.children.indexOf(dependency);
/******/ 						if (idx >= 0) module.children.splice(idx, 1);
/******/ 					}
/******/ 				}
/******/ 			}
/******/ 		}
/******/
/******/ 		// Now in "apply" phase
/******/ 		hotSetStatus("apply");
/******/
/******/ 		hotCurrentHash = hotUpdateNewHash;
/******/
/******/ 		// insert new code
/******/ 		for (moduleId in appliedUpdate) {
/******/ 			if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {
/******/ 				modules[moduleId] = appliedUpdate[moduleId];
/******/ 			}
/******/ 		}
/******/
/******/ 		// call accept handlers
/******/ 		var error = null;
/******/ 		for (moduleId in outdatedDependencies) {
/******/ 			if (
/******/ 				Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
/******/ 			) {
/******/ 				module = installedModules[moduleId];
/******/ 				if (module) {
/******/ 					moduleOutdatedDependencies = outdatedDependencies[moduleId];
/******/ 					var callbacks = [];
/******/ 					for (i = 0; i < moduleOutdatedDependencies.length; i++) {
/******/ 						dependency = moduleOutdatedDependencies[i];
/******/ 						cb = module.hot._acceptedDependencies[dependency];
/******/ 						if (cb) {
/******/ 							if (callbacks.indexOf(cb) !== -1) continue;
/******/ 							callbacks.push(cb);
/******/ 						}
/******/ 					}
/******/ 					for (i = 0; i < callbacks.length; i++) {
/******/ 						cb = callbacks[i];
/******/ 						try {
/******/ 							cb(moduleOutdatedDependencies);
/******/ 						} catch (err) {
/******/ 							if (options.onErrored) {
/******/ 								options.onErrored({
/******/ 									type: "accept-errored",
/******/ 									moduleId: moduleId,
/******/ 									dependencyId: moduleOutdatedDependencies[i],
/******/ 									error: err
/******/ 								});
/******/ 							}
/******/ 							if (!options.ignoreErrored) {
/******/ 								if (!error) error = err;
/******/ 							}
/******/ 						}
/******/ 					}
/******/ 				}
/******/ 			}
/******/ 		}
/******/
/******/ 		// Load self accepted modules
/******/ 		for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
/******/ 			var item = outdatedSelfAcceptedModules[i];
/******/ 			moduleId = item.module;
/******/ 			hotCurrentParents = [moduleId];
/******/ 			try {
/******/ 				__webpack_require__(moduleId);
/******/ 			} catch (err) {
/******/ 				if (typeof item.errorHandler === "function") {
/******/ 					try {
/******/ 						item.errorHandler(err);
/******/ 					} catch (err2) {
/******/ 						if (options.onErrored) {
/******/ 							options.onErrored({
/******/ 								type: "self-accept-error-handler-errored",
/******/ 								moduleId: moduleId,
/******/ 								error: err2,
/******/ 								originalError: err
/******/ 							});
/******/ 						}
/******/ 						if (!options.ignoreErrored) {
/******/ 							if (!error) error = err2;
/******/ 						}
/******/ 						if (!error) error = err;
/******/ 					}
/******/ 				} else {
/******/ 					if (options.onErrored) {
/******/ 						options.onErrored({
/******/ 							type: "self-accept-errored",
/******/ 							moduleId: moduleId,
/******/ 							error: err
/******/ 						});
/******/ 					}
/******/ 					if (!options.ignoreErrored) {
/******/ 						if (!error) error = err;
/******/ 					}
/******/ 				}
/******/ 			}
/******/ 		}
/******/
/******/ 		// handle errors in accept handlers and self accepted module load
/******/ 		if (error) {
/******/ 			hotSetStatus("fail");
/******/ 			return Promise.reject(error);
/******/ 		}
/******/
/******/ 		hotSetStatus("idle");
/******/ 		return new Promise(function(resolve) {
/******/ 			resolve(outdatedModules);
/******/ 		});
/******/ 	}
/******/
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// object to store loaded and loading chunks
/******/ 	// undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ 	// Promise = chunk loading, 0 = chunk loaded
/******/ 	var installedChunks = {
/******/ 		"app": 0
/******/ 	};
/******/
/******/
/******/
/******/ 	// script path function
/******/ 	function jsonpScriptSrc(chunkId) {
/******/ 		return __webpack_require__.p + "static/js/" + ({}[chunkId]||chunkId) + ".1576058431931.js"
/******/ 	}
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {},
/******/ 			hot: hotCreateModule(moduleId),
/******/ 			parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),
/******/ 			children: []
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/ 	// This file contains only the entry chunk.
/******/ 	// The chunk loading function for additional chunks
/******/ 	__webpack_require__.e = function requireEnsure(chunkId) {
/******/ 		var promises = [];
/******/
/******/
/******/ 		// JSONP chunk loading for javascript
/******/
/******/ 		var installedChunkData = installedChunks[chunkId];
/******/ 		if(installedChunkData !== 0) { // 0 means "already installed".
/******/
/******/ 			// a Promise means "currently loading".
/******/ 			if(installedChunkData) {
/******/ 				promises.push(installedChunkData[2]);
/******/ 			} else {
/******/ 				// setup Promise in chunk cache
/******/ 				var promise = new Promise(function(resolve, reject) {
/******/ 					installedChunkData = installedChunks[chunkId] = [resolve, reject];
/******/ 				});
/******/ 				promises.push(installedChunkData[2] = promise);
/******/
/******/ 				// start chunk loading
/******/ 				var script = document.createElement('script');
/******/ 				var onScriptComplete;
/******/
/******/ 				script.charset = 'utf-8';
/******/ 				script.timeout = 120;
/******/ 				if (__webpack_require__.nc) {
/******/ 					script.setAttribute("nonce", __webpack_require__.nc);
/******/ 				}
/******/ 				script.src = jsonpScriptSrc(chunkId);
/******/
/******/ 				// create error before stack unwound to get useful stacktrace later
/******/ 				var error = new Error();
/******/ 				onScriptComplete = function (event) {
/******/ 					// avoid mem leaks in IE.
/******/ 					script.onerror = script.onload = null;
/******/ 					clearTimeout(timeout);
/******/ 					var chunk = installedChunks[chunkId];
/******/ 					if(chunk !== 0) {
/******/ 						if(chunk) {
/******/ 							var errorType = event && (event.type === 'load' ? 'missing' : event.type);
/******/ 							var realSrc = event && event.target && event.target.src;
/******/ 							error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
/******/ 							error.name = 'ChunkLoadError';
/******/ 							error.type = errorType;
/******/ 							error.request = realSrc;
/******/ 							chunk[1](error);
/******/ 						}
/******/ 						installedChunks[chunkId] = undefined;
/******/ 					}
/******/ 				};
/******/ 				var timeout = setTimeout(function(){
/******/ 					onScriptComplete({ type: 'timeout', target: script });
/******/ 				}, 120000);
/******/ 				script.onerror = script.onload = onScriptComplete;
/******/ 				document.head.appendChild(script);
/******/ 			}
/******/ 		}
/******/ 		return Promise.all(promises);
/******/ 	};
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/ 	// on error function for async loading
/******/ 	__webpack_require__.oe = function(err) { console.error(err); throw err; };
/******/
/******/ 	// __webpack_hash__
/******/ 	__webpack_require__.h = function() { return hotCurrentHash; };
/******/
/******/ 	var jsonpArray = (typeof self !== 'undefined' ? self : this)["webpackJsonp"] = (typeof self !== 'undefined' ? self : this)["webpackJsonp"] || [];
/******/ 	var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
/******/ 	jsonpArray.push = webpackJsonpCallback;
/******/ 	jsonpArray = jsonpArray.slice();
/******/ 	for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
/******/ 	var parentJsonpFunction = oldJsonpFunction;
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return hotCreateRequire(0)(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({

/***/ "./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js":
/*!*****************************************************************************************!*\
  !*** ./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js ***!
  \*****************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _defineProperty; });\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuNi4zQEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19AYmFiZWxfcnVudGltZUA3LjYuM0BAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eS5qcz85N2EzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\n");

/***/ }),

/***/ "./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js":
/*!**********************************************************************************!*\
  !*** ./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js ***!
  \**********************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _extends; });\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuNy40QEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX0BiYWJlbF9ydW50aW1lQDcuNy40QEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanM/Y2UwNyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js\n");

/***/ }),

/***/ "./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js":
/*!************************************************************************************************************************!*\
  !*** ./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js ***!
  \************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("function _extends(){return _extends=Object.assign||function(a){for(var b,c=1;c<arguments.length;c++)for(var d in b=arguments[c],b)Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d]);return a},_extends.apply(this,arguments)}var normalMerge=[\"attrs\",\"props\",\"domProps\"],toArrayMerge=[\"class\",\"style\",\"directives\"],functionalMerge=[\"on\",\"nativeOn\"],mergeJsxProps=function(a){return a.reduce(function(c,a){for(var b in a)if(!c[b])c[b]=a[b];else if(-1!==normalMerge.indexOf(b))c[b]=_extends({},c[b],a[b]);else if(-1!==toArrayMerge.indexOf(b)){var d=c[b]instanceof Array?c[b]:[c[b]],e=a[b]instanceof Array?a[b]:[a[b]];c[b]=d.concat(e)}else if(-1!==functionalMerge.indexOf(b)){for(var f in a[b])if(c[b][f]){var g=c[b][f]instanceof Array?c[b][f]:[c[b][f]],h=a[b][f]instanceof Array?a[b][f]:[a[b][f]];c[b][f]=g.concat(h)}else c[b][f]=a[b][f];}else if(\"hook\"==b)for(var i in a[b])c[b][i]=c[b][i]?mergeFn(c[b][i],a[b][i]):a[b][i];else c[b]=a[b];return c},{})},mergeFn=function(a,b){return function(){a&&a.apply(this,arguments),b&&b.apply(this,arguments)}};module.exports=mergeJsxProps;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX0B2dWVfYmFiZWwtaGVscGVyLXZ1ZS1qc3gtbWVyZ2UtcHJvcHNAMS4wLjBAQHZ1ZS9iYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wcy9kaXN0L2hlbHBlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fQHZ1ZV9iYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wc0AxLjAuMEBAdnVlL2JhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzL2Rpc3QvaGVscGVyLmpzPzIzYzQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gX2V4dGVuZHMoKXtyZXR1cm4gX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBiPWFyZ3VtZW50c1tjXSxiKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLGQpJiYoYVtkXT1iW2RdKTtyZXR1cm4gYX0sX2V4dGVuZHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBub3JtYWxNZXJnZT1bXCJhdHRyc1wiLFwicHJvcHNcIixcImRvbVByb3BzXCJdLHRvQXJyYXlNZXJnZT1bXCJjbGFzc1wiLFwic3R5bGVcIixcImRpcmVjdGl2ZXNcIl0sZnVuY3Rpb25hbE1lcmdlPVtcIm9uXCIsXCJuYXRpdmVPblwiXSxtZXJnZUpzeFByb3BzPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlZHVjZShmdW5jdGlvbihjLGEpe2Zvcih2YXIgYiBpbiBhKWlmKCFjW2JdKWNbYl09YVtiXTtlbHNlIGlmKC0xIT09bm9ybWFsTWVyZ2UuaW5kZXhPZihiKSljW2JdPV9leHRlbmRzKHt9LGNbYl0sYVtiXSk7ZWxzZSBpZigtMSE9PXRvQXJyYXlNZXJnZS5pbmRleE9mKGIpKXt2YXIgZD1jW2JdaW5zdGFuY2VvZiBBcnJheT9jW2JdOltjW2JdXSxlPWFbYl1pbnN0YW5jZW9mIEFycmF5P2FbYl06W2FbYl1dO2NbYl09ZC5jb25jYXQoZSl9ZWxzZSBpZigtMSE9PWZ1bmN0aW9uYWxNZXJnZS5pbmRleE9mKGIpKXtmb3IodmFyIGYgaW4gYVtiXSlpZihjW2JdW2ZdKXt2YXIgZz1jW2JdW2ZdaW5zdGFuY2VvZiBBcnJheT9jW2JdW2ZdOltjW2JdW2ZdXSxoPWFbYl1bZl1pbnN0YW5jZW9mIEFycmF5P2FbYl1bZl06W2FbYl1bZl1dO2NbYl1bZl09Zy5jb25jYXQoaCl9ZWxzZSBjW2JdW2ZdPWFbYl1bZl07fWVsc2UgaWYoXCJob29rXCI9PWIpZm9yKHZhciBpIGluIGFbYl0pY1tiXVtpXT1jW2JdW2ldP21lcmdlRm4oY1tiXVtpXSxhW2JdW2ldKTphW2JdW2ldO2Vsc2UgY1tiXT1hW2JdO3JldHVybiBjfSx7fSl9LG1lcmdlRm49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXthJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiJiZiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19O21vZHVsZS5leHBvcnRzPW1lcmdlSnN4UHJvcHM7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\n");

/***/ }),

/***/ "./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/handle_request.js":
/*!******************************************************************************************!*\
  !*** ./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/handle_request.js ***!
  \******************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/utils.js\");\n\nfunction makeResponse(result, config) {\n  return {\n    status: result[0],\n    data: utils.isSimpleObject(result[1]) ? JSON.parse(JSON.stringify(result[1])) : result[1],\n    headers: result[2],\n    config: config\n  };\n}\n\nfunction handleRequest(mockAdapter, resolve, reject, config) {\n  var url = config.url;\n  if (config.baseURL && config.url.substr(0, config.baseURL.length) === config.baseURL) {\n    url = config.url.slice(config.baseURL ? config.baseURL.length : 0);\n  }\n\n  delete config.adapter;\n  mockAdapter.history[config.method].push(config);\n\n  var handler = utils.findHandler(\n    mockAdapter.handlers,\n    config.method,\n    url,\n    config.data,\n    config.params,\n    config.headers,\n    config.baseURL\n  );\n\n  if (handler) {\n    if (handler.length === 7) {\n      utils.purgeIfReplyOnce(mockAdapter, handler);\n    }\n\n    if (handler.length === 2) {\n      // passThrough handler\n      mockAdapter.originalAdapter(config).then(resolve, reject);\n    } else if (typeof handler[3] !== 'function') {\n      utils.settle(\n        resolve,\n        reject,\n        makeResponse(handler.slice(3), config),\n        mockAdapter.delayResponse\n      );\n    } else {\n      var result = handler[3](config);\n      // TODO throw a sane exception when return value is incorrect\n      if (typeof result.then !== 'function') {\n        utils.settle(resolve, reject, makeResponse(result, config), mockAdapter.delayResponse);\n      } else {\n        result.then(\n          function(result) {\n            if (result.config && result.status) {\n              utils.settle(resolve, reject, makeResponse([result.status, result.data, result.headers], result.config), 0);\n            } else {\n              utils.settle(resolve, reject, makeResponse(result, config), mockAdapter.delayResponse);\n            }\n          },\n          function(error) {\n            if (mockAdapter.delayResponse > 0) {\n              setTimeout(function() {\n                reject(error);\n              }, mockAdapter.delayResponse);\n            } else {\n              reject(error);\n            }\n          }\n        );\n      }\n    }\n  } else {\n    // handler not found\n    utils.settle(\n      resolve,\n      reject,\n      {\n        status: 404,\n        config: config\n      },\n      mockAdapter.delayResponse\n    );\n  }\n}\n\nmodule.exports = handleRequest;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zLW1vY2stYWRhcHRlckAxLjE3LjBAYXhpb3MtbW9jay1hZGFwdGVyL3NyYy9oYW5kbGVfcmVxdWVzdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3MtbW9jay1hZGFwdGVyQDEuMTcuMEBheGlvcy1tb2NrLWFkYXB0ZXIvc3JjL2hhbmRsZV9yZXF1ZXN0LmpzPzEwZjkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIG1ha2VSZXNwb25zZShyZXN1bHQsIGNvbmZpZykge1xuICByZXR1cm4ge1xuICAgIHN0YXR1czogcmVzdWx0WzBdLFxuICAgIGRhdGE6IHV0aWxzLmlzU2ltcGxlT2JqZWN0KHJlc3VsdFsxXSkgPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3VsdFsxXSkpIDogcmVzdWx0WzFdLFxuICAgIGhlYWRlcnM6IHJlc3VsdFsyXSxcbiAgICBjb25maWc6IGNvbmZpZ1xuICB9O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KG1vY2tBZGFwdGVyLCByZXNvbHZlLCByZWplY3QsIGNvbmZpZykge1xuICB2YXIgdXJsID0gY29uZmlnLnVybDtcbiAgaWYgKGNvbmZpZy5iYXNlVVJMICYmIGNvbmZpZy51cmwuc3Vic3RyKDAsIGNvbmZpZy5iYXNlVVJMLmxlbmd0aCkgPT09IGNvbmZpZy5iYXNlVVJMKSB7XG4gICAgdXJsID0gY29uZmlnLnVybC5zbGljZShjb25maWcuYmFzZVVSTCA/IGNvbmZpZy5iYXNlVVJMLmxlbmd0aCA6IDApO1xuICB9XG5cbiAgZGVsZXRlIGNvbmZpZy5hZGFwdGVyO1xuICBtb2NrQWRhcHRlci5oaXN0b3J5W2NvbmZpZy5tZXRob2RdLnB1c2goY29uZmlnKTtcblxuICB2YXIgaGFuZGxlciA9IHV0aWxzLmZpbmRIYW5kbGVyKFxuICAgIG1vY2tBZGFwdGVyLmhhbmRsZXJzLFxuICAgIGNvbmZpZy5tZXRob2QsXG4gICAgdXJsLFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5wYXJhbXMsXG4gICAgY29uZmlnLmhlYWRlcnMsXG4gICAgY29uZmlnLmJhc2VVUkxcbiAgKTtcblxuICBpZiAoaGFuZGxlcikge1xuICAgIGlmIChoYW5kbGVyLmxlbmd0aCA9PT0gNykge1xuICAgICAgdXRpbHMucHVyZ2VJZlJlcGx5T25jZShtb2NrQWRhcHRlciwgaGFuZGxlcik7XG4gICAgfVxuXG4gICAgaWYgKGhhbmRsZXIubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBwYXNzVGhyb3VnaCBoYW5kbGVyXG4gICAgICBtb2NrQWRhcHRlci5vcmlnaW5hbEFkYXB0ZXIoY29uZmlnKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaGFuZGxlclszXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXRpbHMuc2V0dGxlKFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgICAgIG1ha2VSZXNwb25zZShoYW5kbGVyLnNsaWNlKDMpLCBjb25maWcpLFxuICAgICAgICBtb2NrQWRhcHRlci5kZWxheVJlc3BvbnNlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0ID0gaGFuZGxlclszXShjb25maWcpO1xuICAgICAgLy8gVE9ETyB0aHJvdyBhIHNhbmUgZXhjZXB0aW9uIHdoZW4gcmV0dXJuIHZhbHVlIGlzIGluY29ycmVjdFxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQudGhlbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1dGlscy5zZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBtYWtlUmVzcG9uc2UocmVzdWx0LCBjb25maWcpLCBtb2NrQWRhcHRlci5kZWxheVJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC50aGVuKFxuICAgICAgICAgIGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5jb25maWcgJiYgcmVzdWx0LnN0YXR1cykge1xuICAgICAgICAgICAgICB1dGlscy5zZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBtYWtlUmVzcG9uc2UoW3Jlc3VsdC5zdGF0dXMsIHJlc3VsdC5kYXRhLCByZXN1bHQuaGVhZGVyc10sIHJlc3VsdC5jb25maWcpLCAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHV0aWxzLnNldHRsZShyZXNvbHZlLCByZWplY3QsIG1ha2VSZXNwb25zZShyZXN1bHQsIGNvbmZpZyksIG1vY2tBZGFwdGVyLmRlbGF5UmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChtb2NrQWRhcHRlci5kZWxheVJlc3BvbnNlID4gMCkge1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgIH0sIG1vY2tBZGFwdGVyLmRlbGF5UmVzcG9uc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGhhbmRsZXIgbm90IGZvdW5kXG4gICAgdXRpbHMuc2V0dGxlKFxuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICB9LFxuICAgICAgbW9ja0FkYXB0ZXIuZGVsYXlSZXNwb25zZVxuICAgICk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYW5kbGVSZXF1ZXN0O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/handle_request.js\n");

/***/ }),

/***/ "./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/index.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/index.js ***!
  \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar deepEqual = __webpack_require__(/*! deep-equal */ \"./node_modules/_deep-equal@1.1.0@deep-equal/index.js\");\n\nvar handleRequest = __webpack_require__(/*! ./handle_request */ \"./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/handle_request.js\");\n\nvar VERBS = ['get', 'post', 'head', 'delete', 'patch', 'put', 'options', 'list'];\n\nfunction adapter() {\n  return function(config) {\n    var mockAdapter = this;\n    // axios >= 0.13.0 only passes the config and expects a promise to be\n    // returned. axios < 0.13.0 passes (config, resolve, reject).\n    if (arguments.length === 3) {\n      handleRequest(mockAdapter, arguments[0], arguments[1], arguments[2]);\n    } else {\n      return new Promise(function(resolve, reject) {\n        handleRequest(mockAdapter, resolve, reject, config);\n      });\n    }\n  }.bind(this);\n}\n\nfunction getVerbObject() {\n  return VERBS.reduce(function(accumulator, verb) {\n    accumulator[verb] = [];\n    return accumulator;\n  }, {});\n}\n\nfunction reset() {\n  resetHandlers.call(this);\n  resetHistory.call(this);\n}\n\nfunction resetHandlers() {\n  this.handlers = getVerbObject();\n}\n\nfunction resetHistory() {\n  this.history = getVerbObject();\n}\n\nfunction MockAdapter(axiosInstance, options) {\n  reset.call(this);\n\n  if (axiosInstance) {\n    this.axiosInstance = axiosInstance;\n    this.originalAdapter = axiosInstance.defaults.adapter;\n    this.delayResponse = options && options.delayResponse > 0 ? options.delayResponse : null;\n    axiosInstance.defaults.adapter = this.adapter.call(this);\n  }\n}\n\nMockAdapter.prototype.adapter = adapter;\n\nMockAdapter.prototype.restore = function restore() {\n  if (this.axiosInstance) {\n    this.axiosInstance.defaults.adapter = this.originalAdapter;\n  }\n};\n\nMockAdapter.prototype.reset = reset;\nMockAdapter.prototype.resetHandlers = resetHandlers;\nMockAdapter.prototype.resetHistory = resetHistory;\n\nVERBS.concat('any').forEach(function(method) {\n  var methodName = 'on' + method.charAt(0).toUpperCase() + method.slice(1);\n  MockAdapter.prototype[methodName] = function(matcher, body, requestHeaders) {\n    var _this = this;\n    var matcher = matcher === undefined ? /.*/ : matcher;\n\n    function reply(code, response, headers) {\n      var handler = [matcher, body, requestHeaders, code, response, headers];\n      addHandler(method, _this.handlers, handler);\n      return _this;\n    }\n\n    function replyOnce(code, response, headers) {\n      var handler = [matcher, body, requestHeaders, code, response, headers, true];\n      addHandler(method, _this.handlers, handler);\n      return _this;\n    }\n\n    return {\n      reply: reply,\n\n      replyOnce: replyOnce,\n\n      passThrough: function passThrough() {\n        var handler = [matcher, body];\n        addHandler(method, _this.handlers, handler);\n        return _this;\n      },\n\n      networkError: function() {\n        reply(function(config) {\n          var error = new Error('Network Error');\n          error.config = config;\n          return Promise.reject(error);\n        });\n      },\n\n      networkErrorOnce: function() {\n        replyOnce(function(config) {\n          var error = new Error('Network Error');\n          error.config = config;\n          return Promise.reject(error);\n        });\n      },\n\n      timeout: function() {\n        reply(function(config) {\n          var error = new Error('timeout of ' + config.timeout + 'ms exceeded');\n          error.config = config;\n          error.code = 'ECONNABORTED';\n          return Promise.reject(error);\n        });\n      },\n\n      timeoutOnce: function() {\n        replyOnce(function(config) {\n          var error = new Error('timeout of ' + config.timeout + 'ms exceeded');\n          error.config = config;\n          error.code = 'ECONNABORTED';\n          return Promise.reject(error);\n        });\n      }\n    };\n  };\n});\n\nfunction findInHandlers(method, handlers, handler) {\n  var index = -1;\n  for (var i = 0; i < handlers[method].length; i += 1) {\n    var item = handlers[method][i];\n    var isReplyOnce = item.length === 7;\n    var comparePaths = item[0] instanceof RegExp && handler[0] instanceof RegExp\n      ? String(item[0]) === String(handler[0])\n      : item[0] === handler[0];\n    var isSame = (\n      comparePaths &&\n      deepEqual(item[1], handler[1], { strict: true }) &&\n      deepEqual(item[2], handler[2], { strict: true })\n    );\n    if (isSame && !isReplyOnce) {\n      index =  i;\n    }\n  }\n  return index;\n}\n\nfunction addHandler(method, handlers, handler) {\n  if (method === 'any') {\n    VERBS.forEach(function(verb) {\n      handlers[verb].push(handler);\n    });\n  } else {\n    var indexOfExistingHandler = findInHandlers(method, handlers, handler);\n    if (indexOfExistingHandler > -1 && handler.length < 7) {\n      handlers[method].splice(indexOfExistingHandler, 1, handler);\n    } else {\n      handlers[method].push(handler);\n    }\n  }\n}\n\nmodule.exports = MockAdapter;\nmodule.exports.default = MockAdapter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zLW1vY2stYWRhcHRlckAxLjE3LjBAYXhpb3MtbW9jay1hZGFwdGVyL3NyYy9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3MtbW9jay1hZGFwdGVyQDEuMTcuMEBheGlvcy1tb2NrLWFkYXB0ZXIvc3JjL2luZGV4LmpzP2JlMDkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZSgnZGVlcC1lcXVhbCcpO1xuXG52YXIgaGFuZGxlUmVxdWVzdCA9IHJlcXVpcmUoJy4vaGFuZGxlX3JlcXVlc3QnKTtcblxudmFyIFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdoZWFkJywgJ2RlbGV0ZScsICdwYXRjaCcsICdwdXQnLCAnb3B0aW9ucycsICdsaXN0J107XG5cbmZ1bmN0aW9uIGFkYXB0ZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb25maWcpIHtcbiAgICB2YXIgbW9ja0FkYXB0ZXIgPSB0aGlzO1xuICAgIC8vIGF4aW9zID49IDAuMTMuMCBvbmx5IHBhc3NlcyB0aGUgY29uZmlnIGFuZCBleHBlY3RzIGEgcHJvbWlzZSB0byBiZVxuICAgIC8vIHJldHVybmVkLiBheGlvcyA8IDAuMTMuMCBwYXNzZXMgKGNvbmZpZywgcmVzb2x2ZSwgcmVqZWN0KS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgaGFuZGxlUmVxdWVzdChtb2NrQWRhcHRlciwgYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaGFuZGxlUmVxdWVzdChtb2NrQWRhcHRlciwgcmVzb2x2ZSwgcmVqZWN0LCBjb25maWcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LmJpbmQodGhpcyk7XG59XG5cbmZ1bmN0aW9uIGdldFZlcmJPYmplY3QoKSB7XG4gIHJldHVybiBWRVJCUy5yZWR1Y2UoZnVuY3Rpb24oYWNjdW11bGF0b3IsIHZlcmIpIHtcbiAgICBhY2N1bXVsYXRvclt2ZXJiXSA9IFtdO1xuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcmVzZXRIYW5kbGVycy5jYWxsKHRoaXMpO1xuICByZXNldEhpc3RvcnkuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYW5kbGVycygpIHtcbiAgdGhpcy5oYW5kbGVycyA9IGdldFZlcmJPYmplY3QoKTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIaXN0b3J5KCkge1xuICB0aGlzLmhpc3RvcnkgPSBnZXRWZXJiT2JqZWN0KCk7XG59XG5cbmZ1bmN0aW9uIE1vY2tBZGFwdGVyKGF4aW9zSW5zdGFuY2UsIG9wdGlvbnMpIHtcbiAgcmVzZXQuY2FsbCh0aGlzKTtcblxuICBpZiAoYXhpb3NJbnN0YW5jZSkge1xuICAgIHRoaXMuYXhpb3NJbnN0YW5jZSA9IGF4aW9zSW5zdGFuY2U7XG4gICAgdGhpcy5vcmlnaW5hbEFkYXB0ZXIgPSBheGlvc0luc3RhbmNlLmRlZmF1bHRzLmFkYXB0ZXI7XG4gICAgdGhpcy5kZWxheVJlc3BvbnNlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlbGF5UmVzcG9uc2UgPiAwID8gb3B0aW9ucy5kZWxheVJlc3BvbnNlIDogbnVsbDtcbiAgICBheGlvc0luc3RhbmNlLmRlZmF1bHRzLmFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIuY2FsbCh0aGlzKTtcbiAgfVxufVxuXG5Nb2NrQWRhcHRlci5wcm90b3R5cGUuYWRhcHRlciA9IGFkYXB0ZXI7XG5cbk1vY2tBZGFwdGVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZSgpIHtcbiAgaWYgKHRoaXMuYXhpb3NJbnN0YW5jZSkge1xuICAgIHRoaXMuYXhpb3NJbnN0YW5jZS5kZWZhdWx0cy5hZGFwdGVyID0gdGhpcy5vcmlnaW5hbEFkYXB0ZXI7XG4gIH1cbn07XG5cbk1vY2tBZGFwdGVyLnByb3RvdHlwZS5yZXNldCA9IHJlc2V0O1xuTW9ja0FkYXB0ZXIucHJvdG90eXBlLnJlc2V0SGFuZGxlcnMgPSByZXNldEhhbmRsZXJzO1xuTW9ja0FkYXB0ZXIucHJvdG90eXBlLnJlc2V0SGlzdG9yeSA9IHJlc2V0SGlzdG9yeTtcblxuVkVSQlMuY29uY2F0KCdhbnknKS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICB2YXIgbWV0aG9kTmFtZSA9ICdvbicgKyBtZXRob2QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBtZXRob2Quc2xpY2UoMSk7XG4gIE1vY2tBZGFwdGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKG1hdGNoZXIsIGJvZHksIHJlcXVlc3RIZWFkZXJzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgbWF0Y2hlciA9IG1hdGNoZXIgPT09IHVuZGVmaW5lZCA/IC8uKi8gOiBtYXRjaGVyO1xuXG4gICAgZnVuY3Rpb24gcmVwbHkoY29kZSwgcmVzcG9uc2UsIGhlYWRlcnMpIHtcbiAgICAgIHZhciBoYW5kbGVyID0gW21hdGNoZXIsIGJvZHksIHJlcXVlc3RIZWFkZXJzLCBjb2RlLCByZXNwb25zZSwgaGVhZGVyc107XG4gICAgICBhZGRIYW5kbGVyKG1ldGhvZCwgX3RoaXMuaGFuZGxlcnMsIGhhbmRsZXIpO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlcGx5T25jZShjb2RlLCByZXNwb25zZSwgaGVhZGVycykge1xuICAgICAgdmFyIGhhbmRsZXIgPSBbbWF0Y2hlciwgYm9keSwgcmVxdWVzdEhlYWRlcnMsIGNvZGUsIHJlc3BvbnNlLCBoZWFkZXJzLCB0cnVlXTtcbiAgICAgIGFkZEhhbmRsZXIobWV0aG9kLCBfdGhpcy5oYW5kbGVycywgaGFuZGxlcik7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcGx5OiByZXBseSxcblxuICAgICAgcmVwbHlPbmNlOiByZXBseU9uY2UsXG5cbiAgICAgIHBhc3NUaHJvdWdoOiBmdW5jdGlvbiBwYXNzVGhyb3VnaCgpIHtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSBbbWF0Y2hlciwgYm9keV07XG4gICAgICAgIGFkZEhhbmRsZXIobWV0aG9kLCBfdGhpcy5oYW5kbGVycywgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG5ldHdvcmtFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlcGx5KGZ1bmN0aW9uKGNvbmZpZykge1xuICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignTmV0d29yayBFcnJvcicpO1xuICAgICAgICAgIGVycm9yLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIG5ldHdvcmtFcnJvck9uY2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXBseU9uY2UoZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdOZXR3b3JrIEVycm9yJyk7XG4gICAgICAgICAgZXJyb3IuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgdGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlcGx5KGZ1bmN0aW9uKGNvbmZpZykge1xuICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigndGltZW91dCBvZiAnICsgY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnKTtcbiAgICAgICAgICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgZXJyb3IuY29kZSA9ICdFQ09OTkFCT1JURUQnO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgdGltZW91dE9uY2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXBseU9uY2UoZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcpO1xuICAgICAgICAgIGVycm9yLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICBlcnJvci5jb2RlID0gJ0VDT05OQUJPUlRFRCc7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn0pO1xuXG5mdW5jdGlvbiBmaW5kSW5IYW5kbGVycyhtZXRob2QsIGhhbmRsZXJzLCBoYW5kbGVyKSB7XG4gIHZhciBpbmRleCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzW21ldGhvZF0ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgaXRlbSA9IGhhbmRsZXJzW21ldGhvZF1baV07XG4gICAgdmFyIGlzUmVwbHlPbmNlID0gaXRlbS5sZW5ndGggPT09IDc7XG4gICAgdmFyIGNvbXBhcmVQYXRocyA9IGl0ZW1bMF0gaW5zdGFuY2VvZiBSZWdFeHAgJiYgaGFuZGxlclswXSBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgPyBTdHJpbmcoaXRlbVswXSkgPT09IFN0cmluZyhoYW5kbGVyWzBdKVxuICAgICAgOiBpdGVtWzBdID09PSBoYW5kbGVyWzBdO1xuICAgIHZhciBpc1NhbWUgPSAoXG4gICAgICBjb21wYXJlUGF0aHMgJiZcbiAgICAgIGRlZXBFcXVhbChpdGVtWzFdLCBoYW5kbGVyWzFdLCB7IHN0cmljdDogdHJ1ZSB9KSAmJlxuICAgICAgZGVlcEVxdWFsKGl0ZW1bMl0sIGhhbmRsZXJbMl0sIHsgc3RyaWN0OiB0cnVlIH0pXG4gICAgKTtcbiAgICBpZiAoaXNTYW1lICYmICFpc1JlcGx5T25jZSkge1xuICAgICAgaW5kZXggPSAgaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5mdW5jdGlvbiBhZGRIYW5kbGVyKG1ldGhvZCwgaGFuZGxlcnMsIGhhbmRsZXIpIHtcbiAgaWYgKG1ldGhvZCA9PT0gJ2FueScpIHtcbiAgICBWRVJCUy5mb3JFYWNoKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGhhbmRsZXJzW3ZlcmJdLnB1c2goaGFuZGxlcik7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGluZGV4T2ZFeGlzdGluZ0hhbmRsZXIgPSBmaW5kSW5IYW5kbGVycyhtZXRob2QsIGhhbmRsZXJzLCBoYW5kbGVyKTtcbiAgICBpZiAoaW5kZXhPZkV4aXN0aW5nSGFuZGxlciA+IC0xICYmIGhhbmRsZXIubGVuZ3RoIDwgNykge1xuICAgICAgaGFuZGxlcnNbbWV0aG9kXS5zcGxpY2UoaW5kZXhPZkV4aXN0aW5nSGFuZGxlciwgMSwgaGFuZGxlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhbmRsZXJzW21ldGhvZF0ucHVzaChoYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrQWRhcHRlcjtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBNb2NrQWRhcHRlcjtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/index.js\n");

/***/ }),

/***/ "./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/utils.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/utils.js ***!
  \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar axios = __webpack_require__(/*! axios */ \"./node_modules/_axios@0.19.0@axios/index.js\");\nvar deepEqual = __webpack_require__(/*! deep-equal */ \"./node_modules/_deep-equal@1.1.0@deep-equal/index.js\");\n\nfunction isEqual(a, b) {\n  return deepEqual(a, b, { strict: true });\n}\n\n// < 0.13.0 will not have default headers set on a custom instance\nvar rejectWithError = !!axios.create().defaults.headers;\n\nfunction find(array, predicate) {\n  var length = array.length;\n  for (var i = 0; i < length; i++) {\n    var value = array[i];\n    if (predicate(value)) return value;\n  }\n}\n\nfunction combineUrls(baseURL, url) {\n  if (baseURL) {\n    return baseURL.replace(/\\/+$/, '') + '/' + url.replace(/^\\/+/, '');\n  }\n\n  return url;\n}\n\nfunction findHandler(handlers, method, url, body, parameters, headers, baseURL) {\n  return find(handlers[method.toLowerCase()], function(handler) {\n    if (typeof handler[0] === 'string') {\n      return (isUrlMatching(url, handler[0]) || isUrlMatching(combineUrls(baseURL, url), handler[0])) && isBodyOrParametersMatching(method, body, parameters, handler[1])  && isRequestHeadersMatching(headers, handler[2]);\n    } else if (handler[0] instanceof RegExp) {\n      return (handler[0].test(url) || handler[0].test(combineUrls(baseURL, url))) && isBodyOrParametersMatching(method, body, parameters, handler[1]) && isRequestHeadersMatching(headers, handler[2]);\n    }\n  });\n}\n\nfunction isUrlMatching(url, required) {\n  var noSlashUrl = url[0] === '/' ? url.substr(1) : url;\n  var noSlashRequired = required[0] === '/' ? required.substr(1) : required;\n  return (noSlashUrl === noSlashRequired);\n}\n\nfunction isRequestHeadersMatching(requestHeaders, required) {\n  if (required === undefined) return true;\n  return isEqual(requestHeaders, required);\n}\n\nfunction isBodyOrParametersMatching(method, body, parameters, required) {\n  var allowedParamsMethods = ['delete', 'get', 'head', 'options'];\n  if (allowedParamsMethods.indexOf(method.toLowerCase()) >= 0 ) {\n    var params = required ? required.params : undefined;\n    return isParametersMatching(parameters, params);\n  } else {\n    return isBodyMatching(body, required);\n  }\n}\n\nfunction isParametersMatching(parameters, required) {\n  if (required === undefined) return true;\n\n  return isEqual(parameters, required);\n}\n\nfunction isBodyMatching(body, requiredBody) {\n  if (requiredBody === undefined) {\n    return true;\n  }\n  var parsedBody;\n  try {\n    parsedBody = JSON.parse(body);\n  } catch (e) { }\n  return parsedBody ? isEqual(parsedBody, requiredBody) : isEqual(body, requiredBody);\n}\n\nfunction purgeIfReplyOnce(mock, handler) {\n  Object.keys(mock.handlers).forEach(function(key) {\n    var index = mock.handlers[key].indexOf(handler);\n    if (index > -1) {\n      mock.handlers[key].splice(index, 1);\n    }\n  });\n}\n\nfunction settle(resolve, reject, response, delay) {\n  if (delay > 0) {\n    setTimeout(function() {\n      settle(resolve, reject, response);\n    }, delay);\n    return;\n  }\n\n  if (response.config && response.config.validateStatus) {\n    response.config.validateStatus(response.status)\n      ? resolve(response)\n      : reject(createErrorResponse(\n        'Request failed with status code ' + response.status,\n        response.config,\n        response\n      ));\n    return;\n  }\n\n  // Support for axios < 0.11\n  if (response.status >= 200 && response.status < 300) {\n    resolve(response);\n  } else {\n    reject(response);\n  }\n}\n\nfunction createErrorResponse(message, config, response) {\n  // Support for axios < 0.13.0\n  if (!rejectWithError) return response;\n\n  var error = new Error(message);\n  error.config = config;\n  error.response = response;\n  return error;\n}\n\nfunction isSimpleObject(value) {\n  return value !== null && value !== undefined && value.toString() === '[object Object]';\n}\n\nmodule.exports = {\n  find: find,\n  findHandler: findHandler,\n  isSimpleObject: isSimpleObject,\n  purgeIfReplyOnce: purgeIfReplyOnce,\n  settle: settle\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zLW1vY2stYWRhcHRlckAxLjE3LjBAYXhpb3MtbW9jay1hZGFwdGVyL3NyYy91dGlscy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3MtbW9jay1hZGFwdGVyQDEuMTcuMEBheGlvcy1tb2NrLWFkYXB0ZXIvc3JjL3V0aWxzLmpzP2NlZTciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoJ2RlZXAtZXF1YWwnKTtcblxuZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7XG4gIHJldHVybiBkZWVwRXF1YWwoYSwgYiwgeyBzdHJpY3Q6IHRydWUgfSk7XG59XG5cbi8vIDwgMC4xMy4wIHdpbGwgbm90IGhhdmUgZGVmYXVsdCBoZWFkZXJzIHNldCBvbiBhIGN1c3RvbSBpbnN0YW5jZVxudmFyIHJlamVjdFdpdGhFcnJvciA9ICEhYXhpb3MuY3JlYXRlKCkuZGVmYXVsdHMuaGVhZGVycztcblxuZnVuY3Rpb24gZmluZChhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpXTtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVVcmxzKGJhc2VVUkwsIHVybCkge1xuICBpZiAoYmFzZVVSTCkge1xuICAgIHJldHVybiBiYXNlVVJMLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgdXJsLnJlcGxhY2UoL15cXC8rLywgJycpO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuZnVuY3Rpb24gZmluZEhhbmRsZXIoaGFuZGxlcnMsIG1ldGhvZCwgdXJsLCBib2R5LCBwYXJhbWV0ZXJzLCBoZWFkZXJzLCBiYXNlVVJMKSB7XG4gIHJldHVybiBmaW5kKGhhbmRsZXJzW21ldGhvZC50b0xvd2VyQ2FzZSgpXSwgZnVuY3Rpb24oaGFuZGxlcikge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlclswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoaXNVcmxNYXRjaGluZyh1cmwsIGhhbmRsZXJbMF0pIHx8IGlzVXJsTWF0Y2hpbmcoY29tYmluZVVybHMoYmFzZVVSTCwgdXJsKSwgaGFuZGxlclswXSkpICYmIGlzQm9keU9yUGFyYW1ldGVyc01hdGNoaW5nKG1ldGhvZCwgYm9keSwgcGFyYW1ldGVycywgaGFuZGxlclsxXSkgICYmIGlzUmVxdWVzdEhlYWRlcnNNYXRjaGluZyhoZWFkZXJzLCBoYW5kbGVyWzJdKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXJbMF0gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiAoaGFuZGxlclswXS50ZXN0KHVybCkgfHwgaGFuZGxlclswXS50ZXN0KGNvbWJpbmVVcmxzKGJhc2VVUkwsIHVybCkpKSAmJiBpc0JvZHlPclBhcmFtZXRlcnNNYXRjaGluZyhtZXRob2QsIGJvZHksIHBhcmFtZXRlcnMsIGhhbmRsZXJbMV0pICYmIGlzUmVxdWVzdEhlYWRlcnNNYXRjaGluZyhoZWFkZXJzLCBoYW5kbGVyWzJdKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1VybE1hdGNoaW5nKHVybCwgcmVxdWlyZWQpIHtcbiAgdmFyIG5vU2xhc2hVcmwgPSB1cmxbMF0gPT09ICcvJyA/IHVybC5zdWJzdHIoMSkgOiB1cmw7XG4gIHZhciBub1NsYXNoUmVxdWlyZWQgPSByZXF1aXJlZFswXSA9PT0gJy8nID8gcmVxdWlyZWQuc3Vic3RyKDEpIDogcmVxdWlyZWQ7XG4gIHJldHVybiAobm9TbGFzaFVybCA9PT0gbm9TbGFzaFJlcXVpcmVkKTtcbn1cblxuZnVuY3Rpb24gaXNSZXF1ZXN0SGVhZGVyc01hdGNoaW5nKHJlcXVlc3RIZWFkZXJzLCByZXF1aXJlZCkge1xuICBpZiAocmVxdWlyZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBpc0VxdWFsKHJlcXVlc3RIZWFkZXJzLCByZXF1aXJlZCk7XG59XG5cbmZ1bmN0aW9uIGlzQm9keU9yUGFyYW1ldGVyc01hdGNoaW5nKG1ldGhvZCwgYm9keSwgcGFyYW1ldGVycywgcmVxdWlyZWQpIHtcbiAgdmFyIGFsbG93ZWRQYXJhbXNNZXRob2RzID0gWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddO1xuICBpZiAoYWxsb3dlZFBhcmFtc01ldGhvZHMuaW5kZXhPZihtZXRob2QudG9Mb3dlckNhc2UoKSkgPj0gMCApIHtcbiAgICB2YXIgcGFyYW1zID0gcmVxdWlyZWQgPyByZXF1aXJlZC5wYXJhbXMgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGlzUGFyYW1ldGVyc01hdGNoaW5nKHBhcmFtZXRlcnMsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlzQm9keU1hdGNoaW5nKGJvZHksIHJlcXVpcmVkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1BhcmFtZXRlcnNNYXRjaGluZyhwYXJhbWV0ZXJzLCByZXF1aXJlZCkge1xuICBpZiAocmVxdWlyZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGlzRXF1YWwocGFyYW1ldGVycywgcmVxdWlyZWQpO1xufVxuXG5mdW5jdGlvbiBpc0JvZHlNYXRjaGluZyhib2R5LCByZXF1aXJlZEJvZHkpIHtcbiAgaWYgKHJlcXVpcmVkQm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHBhcnNlZEJvZHk7XG4gIHRyeSB7XG4gICAgcGFyc2VkQm9keSA9IEpTT04ucGFyc2UoYm9keSk7XG4gIH0gY2F0Y2ggKGUpIHsgfVxuICByZXR1cm4gcGFyc2VkQm9keSA/IGlzRXF1YWwocGFyc2VkQm9keSwgcmVxdWlyZWRCb2R5KSA6IGlzRXF1YWwoYm9keSwgcmVxdWlyZWRCb2R5KTtcbn1cblxuZnVuY3Rpb24gcHVyZ2VJZlJlcGx5T25jZShtb2NrLCBoYW5kbGVyKSB7XG4gIE9iamVjdC5rZXlzKG1vY2suaGFuZGxlcnMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gbW9jay5oYW5kbGVyc1trZXldLmluZGV4T2YoaGFuZGxlcik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIG1vY2suaGFuZGxlcnNba2V5XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlLCBkZWxheSkge1xuICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcbiAgICB9LCBkZWxheSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNvbmZpZyAmJiByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXMpIHtcbiAgICByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgPyByZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgOiByZWplY3QoY3JlYXRlRXJyb3JSZXNwb25zZShcbiAgICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgICByZXNwb25zZVxuICAgICAgKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU3VwcG9ydCBmb3IgYXhpb3MgPCAwLjExXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChyZXNwb25zZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JSZXNwb25zZShtZXNzYWdlLCBjb25maWcsIHJlc3BvbnNlKSB7XG4gIC8vIFN1cHBvcnQgZm9yIGF4aW9zIDwgMC4xMy4wXG4gIGlmICghcmVqZWN0V2l0aEVycm9yKSByZXR1cm4gcmVzcG9uc2U7XG5cbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBmaW5kOiBmaW5kLFxuICBmaW5kSGFuZGxlcjogZmluZEhhbmRsZXIsXG4gIGlzU2ltcGxlT2JqZWN0OiBpc1NpbXBsZU9iamVjdCxcbiAgcHVyZ2VJZlJlcGx5T25jZTogcHVyZ2VJZlJlcGx5T25jZSxcbiAgc2V0dGxlOiBzZXR0bGVcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/utils.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/index.js":
/*!***************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/index.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__(/*! ./lib/axios */ \"./node_modules/_axios@0.19.0@axios/lib/axios.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2luZGV4LmpzPzI0MjciXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9heGlvcycpOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/index.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js":
/*!**************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar settle = __webpack_require__(/*! ./../core/settle */ \"./node_modules/_axios@0.19.0@axios/lib/core/settle.js\");\nvar buildURL = __webpack_require__(/*! ./../helpers/buildURL */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js\");\nvar parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/parseHeaders.js\");\nvar isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/isURLSameOrigin.js\");\nvar createError = __webpack_require__(/*! ../core/createError */ \"./node_modules/_axios@0.19.0@axios/lib/core/createError.js\");\n\nmodule.exports = function xhrAdapter(config) {\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\n    var requestData = config.data;\n    var requestHeaders = config.headers;\n\n    if (utils.isFormData(requestData)) {\n      delete requestHeaders['Content-Type']; // Let the browser set it\n    }\n\n    var request = new XMLHttpRequest();\n\n    // HTTP basic authentication\n    if (config.auth) {\n      var username = config.auth.username || '';\n      var password = config.auth.password || '';\n      requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n    }\n\n    request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\n    // Set the request timeout in MS\n    request.timeout = config.timeout;\n\n    // Listen for ready state\n    request.onreadystatechange = function handleLoad() {\n      if (!request || request.readyState !== 4) {\n        return;\n      }\n\n      // The request errored out and we didn't get a response, this will be\n      // handled by onerror instead\n      // With one exception: request that using file: protocol, most browsers\n      // will return status as 0 even though it's a successful request\n      if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n        return;\n      }\n\n      // Prepare the response\n      var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n      var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n      var response = {\n        data: responseData,\n        status: request.status,\n        statusText: request.statusText,\n        headers: responseHeaders,\n        config: config,\n        request: request\n      };\n\n      settle(resolve, reject, response);\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle browser request cancellation (as opposed to a manual cancellation)\n    request.onabort = function handleAbort() {\n      if (!request) {\n        return;\n      }\n\n      reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle low level network errors\n    request.onerror = function handleError() {\n      // Real errors are hidden from us by the browser\n      // onerror should only fire if it's a network error\n      reject(createError('Network Error', config, null, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle timeout\n    request.ontimeout = function handleTimeout() {\n      reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n        request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Add xsrf header\n    // This is only done if running in a standard browser environment.\n    // Specifically not if we're in a web worker, or react-native.\n    if (utils.isStandardBrowserEnv()) {\n      var cookies = __webpack_require__(/*! ./../helpers/cookies */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/cookies.js\");\n\n      // Add xsrf header\n      var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n        cookies.read(config.xsrfCookieName) :\n        undefined;\n\n      if (xsrfValue) {\n        requestHeaders[config.xsrfHeaderName] = xsrfValue;\n      }\n    }\n\n    // Add headers to the request\n    if ('setRequestHeader' in request) {\n      utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n        if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n          // Remove Content-Type if data is undefined\n          delete requestHeaders[key];\n        } else {\n          // Otherwise add header to the request\n          request.setRequestHeader(key, val);\n        }\n      });\n    }\n\n    // Add withCredentials to request if needed\n    if (config.withCredentials) {\n      request.withCredentials = true;\n    }\n\n    // Add responseType to request if needed\n    if (config.responseType) {\n      try {\n        request.responseType = config.responseType;\n      } catch (e) {\n        // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n        // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n        if (config.responseType !== 'json') {\n          throw e;\n        }\n      }\n    }\n\n    // Handle progress if needed\n    if (typeof config.onDownloadProgress === 'function') {\n      request.addEventListener('progress', config.onDownloadProgress);\n    }\n\n    // Not all browsers support upload events\n    if (typeof config.onUploadProgress === 'function' && request.upload) {\n      request.upload.addEventListener('progress', config.onUploadProgress);\n    }\n\n    if (config.cancelToken) {\n      // Handle cancellation\n      config.cancelToken.promise.then(function onCanceled(cancel) {\n        if (!request) {\n          return;\n        }\n\n        request.abort();\n        reject(cancel);\n        // Clean up request\n        request = null;\n      });\n    }\n\n    if (requestData === undefined) {\n      requestData = null;\n    }\n\n    // Send the request\n    request.send(requestData);\n  });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvYWRhcHRlcnMveGhyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcz8xM2E3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIHNldHRsZSA9IHJlcXVpcmUoJy4vLi4vY29yZS9zZXR0bGUnKTtcbnZhciBidWlsZFVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9idWlsZFVSTCcpO1xudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9wYXJzZUhlYWRlcnMnKTtcbnZhciBpc1VSTFNhbWVPcmlnaW4gPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luJyk7XG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCcuLi9jb3JlL2NyZWF0ZUVycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24geGhyQWRhcHRlcihjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVxdWVzdERhdGEgPSBjb25maWcuZGF0YTtcbiAgICB2YXIgcmVxdWVzdEhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xuICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH1cblxuICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICB2YXIgdXNlcm5hbWUgPSBjb25maWcuYXV0aC51c2VybmFtZSB8fCAnJztcbiAgICAgIHZhciBwYXNzd29yZCA9IGNvbmZpZy5hdXRoLnBhc3N3b3JkIHx8ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVSTChjb25maWcudXJsLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplciksIHRydWUpO1xuXG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcblxuICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGVcbiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QgfHwgcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXG4gICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCA/IHBhcnNlSGVhZGVycyhyZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSA6IG51bGw7XG4gICAgICB2YXIgcmVzcG9uc2VEYXRhID0gIWNvbmZpZy5yZXNwb25zZVR5cGUgfHwgY29uZmlnLnJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnID8gcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBjb25maWcsICdFQ09OTkFCT1JURUQnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKCdOZXR3b3JrIEVycm9yJywgY29uZmlnLCBudWxsLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcigndGltZW91dCBvZiAnICsgY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnLCBjb25maWcsICdFQ09OTkFCT1JURUQnLFxuICAgICAgICByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgICAvLyBTcGVjaWZpY2FsbHkgbm90IGlmIHdlJ3JlIGluIGEgd2ViIHdvcmtlciwgb3IgcmVhY3QtbmF0aXZlLlxuICAgIGlmICh1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpKSB7XG4gICAgICB2YXIgY29va2llcyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9jb29raWVzJyk7XG5cbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgdmFyIHhzcmZWYWx1ZSA9IChjb25maWcud2l0aENyZWRlbnRpYWxzIHx8IGlzVVJMU2FtZU9yaWdpbihjb25maWcudXJsKSkgJiYgY29uZmlnLnhzcmZDb29raWVOYW1lID9cbiAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxuICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVR5cGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgRE9NRXhjZXB0aW9uIHRocm93biBieSBicm93c2VycyBub3QgY29tcGF0aWJsZSBYTUxIdHRwUmVxdWVzdCBMZXZlbCAyLlxuICAgICAgICAvLyBCdXQsIHRoaXMgY2FuIGJlIHN1cHByZXNzZWQgZm9yICdqc29uJyB0eXBlIGFzIGl0IGNhbiBiZSBwYXJzZWQgYnkgZGVmYXVsdCAndHJhbnNmb3JtUmVzcG9uc2UnIGZ1bmN0aW9uLlxuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25Eb3dubG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicgJiYgcmVxdWVzdC51cGxvYWQpIHtcbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbi5wcm9taXNlLnRoZW4oZnVuY3Rpb24gb25DYW5jZWxlZChjYW5jZWwpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZWplY3QoY2FuY2VsKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0RGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/axios.js":
/*!*******************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/axios.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar bind = __webpack_require__(/*! ./helpers/bind */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js\");\nvar Axios = __webpack_require__(/*! ./core/Axios */ \"./node_modules/_axios@0.19.0@axios/lib/core/Axios.js\");\nvar mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ \"./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js\");\nvar defaults = __webpack_require__(/*! ./defaults */ \"./node_modules/_axios@0.19.0@axios/lib/defaults.js\");\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n  var context = new Axios(defaultConfig);\n  var instance = bind(Axios.prototype.request, context);\n\n  // Copy axios.prototype to instance\n  utils.extend(instance, Axios.prototype, context);\n\n  // Copy context to instance\n  utils.extend(instance, context);\n\n  return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n  return createInstance(mergeConfig(axios.defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = __webpack_require__(/*! ./cancel/Cancel */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js\");\naxios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/CancelToken.js\");\naxios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js\");\n\n// Expose all/spread\naxios.all = function all(promises) {\n  return Promise.all(promises);\n};\naxios.spread = __webpack_require__(/*! ./helpers/spread */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/spread.js\");\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvYXhpb3MuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvYXhpb3MuanM/YjI5NSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBBeGlvcyA9IHJlcXVpcmUoJy4vY29yZS9BeGlvcycpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9jb3JlL21lcmdlQ29uZmlnJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIHZhciBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICB2YXIgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCk7XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbnZhciBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzKTtcblxuLy8gRXhwb3NlIEF4aW9zIGNsYXNzIHRvIGFsbG93IGNsYXNzIGluaGVyaXRhbmNlXG5heGlvcy5BeGlvcyA9IEF4aW9zO1xuXG4vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzXG5heGlvcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGF4aW9zLmRlZmF1bHRzLCBpbnN0YW5jZUNvbmZpZykpO1xufTtcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWwnKTtcbmF4aW9zLkNhbmNlbFRva2VuID0gcmVxdWlyZSgnLi9jYW5jZWwvQ2FuY2VsVG9rZW4nKTtcbmF4aW9zLmlzQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvaXNDYW5jZWwnKTtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcbmF4aW9zLnNwcmVhZCA9IHJlcXVpcmUoJy4vaGVscGVycy9zcHJlYWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcblxuLy8gQWxsb3cgdXNlIG9mIGRlZmF1bHQgaW1wb3J0IHN5bnRheCBpbiBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gYXhpb3M7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/axios.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js":
/*!***************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n  this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n  return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY2FuY2VsL0NhbmNlbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsLmpzPzY5MzgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEEgYENhbmNlbGAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBDYW5jZWwobWVzc2FnZSkge1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xufVxuXG5DYW5jZWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnQ2FuY2VsJyArICh0aGlzLm1lc3NhZ2UgPyAnOiAnICsgdGhpcy5tZXNzYWdlIDogJycpO1xufTtcblxuQ2FuY2VsLnByb3RvdHlwZS5fX0NBTkNFTF9fID0gdHJ1ZTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWw7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/cancel/CancelToken.js":
/*!********************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/cancel/CancelToken.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar Cancel = __webpack_require__(/*! ./Cancel */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/Cancel.js\");\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n  if (typeof executor !== 'function') {\n    throw new TypeError('executor must be a function.');\n  }\n\n  var resolvePromise;\n  this.promise = new Promise(function promiseExecutor(resolve) {\n    resolvePromise = resolve;\n  });\n\n  var token = this;\n  executor(function cancel(message) {\n    if (token.reason) {\n      // Cancellation has already been requested\n      return;\n    }\n\n    token.reason = new Cancel(message);\n    resolvePromise(token.reason);\n  });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n  if (this.reason) {\n    throw this.reason;\n  }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n  var cancel;\n  var token = new CancelToken(function executor(c) {\n    cancel = c;\n  });\n  return {\n    token: token,\n    cancel: cancel\n  };\n};\n\nmodule.exports = CancelToken;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz8xYzBmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4vQ2FuY2VsJyk7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsVG9rZW4oZXhlY3V0b3IpIHtcbiAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciByZXNvbHZlUHJvbWlzZTtcbiAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIHZhciB0b2tlbiA9IHRoaXM7XG4gIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlKSB7XG4gICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbChtZXNzYWdlKTtcbiAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5DYW5jZWxUb2tlbi5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZCA9IGZ1bmN0aW9uIHRocm93SWZSZXF1ZXN0ZWQoKSB7XG4gIGlmICh0aGlzLnJlYXNvbikge1xuICAgIHRocm93IHRoaXMucmVhc29uO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBuZXcgYENhbmNlbFRva2VuYCBhbmQgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCxcbiAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gKi9cbkNhbmNlbFRva2VuLnNvdXJjZSA9IGZ1bmN0aW9uIHNvdXJjZSgpIHtcbiAgdmFyIGNhbmNlbDtcbiAgdmFyIHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICBjYW5jZWwgPSBjO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgY2FuY2VsOiBjYW5jZWxcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FuY2VsVG9rZW47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/cancel/CancelToken.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js":
/*!*****************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nmodule.exports = function isCancel(value) {\n  return !!(value && value.__CANCEL__);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY2FuY2VsL2lzQ2FuY2VsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz9kZWFkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/core/Axios.js":
/*!************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/core/Axios.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar buildURL = __webpack_require__(/*! ../helpers/buildURL */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js\");\nvar InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ \"./node_modules/_axios@0.19.0@axios/lib/core/InterceptorManager.js\");\nvar dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ \"./node_modules/_axios@0.19.0@axios/lib/core/dispatchRequest.js\");\nvar mergeConfig = __webpack_require__(/*! ./mergeConfig */ \"./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js\");\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n  this.defaults = instanceConfig;\n  this.interceptors = {\n    request: new InterceptorManager(),\n    response: new InterceptorManager()\n  };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n  /*eslint no-param-reassign:0*/\n  // Allow for axios('example/url'[, config]) a la fetch API\n  if (typeof config === 'string') {\n    config = arguments[1] || {};\n    config.url = arguments[0];\n  } else {\n    config = config || {};\n  }\n\n  config = mergeConfig(this.defaults, config);\n  config.method = config.method ? config.method.toLowerCase() : 'get';\n\n  // Hook up interceptors middleware\n  var chain = [dispatchRequest, undefined];\n  var promise = Promise.resolve(config);\n\n  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n    chain.unshift(interceptor.fulfilled, interceptor.rejected);\n  });\n\n  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n    chain.push(interceptor.fulfilled, interceptor.rejected);\n  });\n\n  while (chain.length) {\n    promise = promise.then(chain.shift(), chain.shift());\n  }\n\n  return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n  config = mergeConfig(this.defaults, config);\n  return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, config) {\n    return this.request(utils.merge(config || {}, {\n      method: method,\n      url: url\n    }));\n  };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, data, config) {\n    return this.request(utils.merge(config || {}, {\n      method: method,\n      url: url,\n      data: data\n    }));\n  };\n});\n\nmodule.exports = Axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9BeGlvcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9jb3JlL0F4aW9zLmpzPzUyMWEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2J1aWxkVVJMJyk7XG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyID0gcmVxdWlyZSgnLi9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSByZXF1aXJlKCcuL2Rpc3BhdGNoUmVxdWVzdCcpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9tZXJnZUNvbmZpZycpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBeGlvcyhpbnN0YW5jZUNvbmZpZykge1xuICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gKi9cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuICAgIGNvbmZpZy51cmwgPSBhcmd1bWVudHNbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICB9XG5cbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgY29uZmlnLm1ldGhvZCA9IGNvbmZpZy5tZXRob2QgPyBjb25maWcubWV0aG9kLnRvTG93ZXJDYXNlKCkgOiAnZ2V0JztcblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuQXhpb3MucHJvdG90eXBlLmdldFVyaSA9IGZ1bmN0aW9uIGdldFVyaShjb25maWcpIHtcbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgcmV0dXJuIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXFw/LywgJycpO1xufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvcztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/Axios.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/core/InterceptorManager.js":
/*!*************************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/core/InterceptorManager.js ***!
  \*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nfunction InterceptorManager() {\n  this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n  this.handlers.push({\n    fulfilled: fulfilled,\n    rejected: rejected\n  });\n  return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n  if (this.handlers[id]) {\n    this.handlers[id] = null;\n  }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n  utils.forEach(this.handlers, function forEachHandler(h) {\n    if (h !== null) {\n      fn(h);\n    }\n  });\n};\n\nmodule.exports = InterceptorManager;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanM/YWM5YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gSW50ZXJjZXB0b3JNYW5hZ2VyKCkge1xuICB0aGlzLmhhbmRsZXJzID0gW107XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gKlxuICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkKSB7XG4gIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQsXG4gICAgcmVqZWN0ZWQ6IHJlamVjdGVkXG4gIH0pO1xuICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZWplY3QgPSBmdW5jdGlvbiBlamVjdChpZCkge1xuICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgZm4oaCk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/InterceptorManager.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/core/createError.js":
/*!******************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/core/createError.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar enhanceError = __webpack_require__(/*! ./enhanceError */ \"./node_modules/_axios@0.19.0@axios/lib/core/enhanceError.js\");\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n  var error = new Error(message);\n  return enhanceError(error, config, code, request, response);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9jcmVhdGVFcnJvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9jb3JlL2NyZWF0ZUVycm9yLmpzPzZkMmYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi9lbmhhbmNlRXJyb3InKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRXJyb3IobWVzc2FnZSwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/createError.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/core/dispatchRequest.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/core/dispatchRequest.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar transformData = __webpack_require__(/*! ./transformData */ \"./node_modules/_axios@0.19.0@axios/lib/core/transformData.js\");\nvar isCancel = __webpack_require__(/*! ../cancel/isCancel */ \"./node_modules/_axios@0.19.0@axios/lib/cancel/isCancel.js\");\nvar defaults = __webpack_require__(/*! ../defaults */ \"./node_modules/_axios@0.19.0@axios/lib/defaults.js\");\nvar isAbsoluteURL = __webpack_require__(/*! ./../helpers/isAbsoluteURL */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/isAbsoluteURL.js\");\nvar combineURLs = __webpack_require__(/*! ./../helpers/combineURLs */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/combineURLs.js\");\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n  if (config.cancelToken) {\n    config.cancelToken.throwIfRequested();\n  }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n  throwIfCancellationRequested(config);\n\n  // Support baseURL config\n  if (config.baseURL && !isAbsoluteURL(config.url)) {\n    config.url = combineURLs(config.baseURL, config.url);\n  }\n\n  // Ensure headers exist\n  config.headers = config.headers || {};\n\n  // Transform request data\n  config.data = transformData(\n    config.data,\n    config.headers,\n    config.transformRequest\n  );\n\n  // Flatten headers\n  config.headers = utils.merge(\n    config.headers.common || {},\n    config.headers[config.method] || {},\n    config.headers || {}\n  );\n\n  utils.forEach(\n    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n    function cleanHeaderConfig(method) {\n      delete config.headers[method];\n    }\n  );\n\n  var adapter = config.adapter || defaults.adapter;\n\n  return adapter(config).then(function onAdapterResolution(response) {\n    throwIfCancellationRequested(config);\n\n    // Transform response data\n    response.data = transformData(\n      response.data,\n      response.headers,\n      config.transformResponse\n    );\n\n    return response;\n  }, function onAdapterRejection(reason) {\n    if (!isCancel(reason)) {\n      throwIfCancellationRequested(config);\n\n      // Transform response data\n      if (reason && reason.response) {\n        reason.response.data = transformData(\n          reason.response.data,\n          reason.response.headers,\n          config.transformResponse\n        );\n      }\n    }\n\n    return Promise.reject(reason);\n  });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanM/NTZiOSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciB0cmFuc2Zvcm1EYXRhID0gcmVxdWlyZSgnLi90cmFuc2Zvcm1EYXRhJyk7XG52YXIgaXNDYW5jZWwgPSByZXF1aXJlKCcuLi9jYW5jZWwvaXNDYW5jZWwnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4uL2RlZmF1bHRzJyk7XG52YXIgaXNBYnNvbHV0ZVVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc0Fic29sdXRlVVJMJyk7XG52YXIgY29tYmluZVVSTHMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvY29tYmluZVVSTHMnKTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAvLyBTdXBwb3J0IGJhc2VVUkwgY29uZmlnXG4gIGlmIChjb25maWcuYmFzZVVSTCAmJiAhaXNBYnNvbHV0ZVVSTChjb25maWcudXJsKSkge1xuICAgIGNvbmZpZy51cmwgPSBjb21iaW5lVVJMcyhjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gIH1cblxuICAvLyBFbnN1cmUgaGVhZGVycyBleGlzdFxuICBjb25maWcuaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzIHx8IHt9O1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5oZWFkZXJzLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gIGNvbmZpZy5oZWFkZXJzID0gdXRpbHMubWVyZ2UoXG4gICAgY29uZmlnLmhlYWRlcnMuY29tbW9uIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzW2NvbmZpZy5tZXRob2RdIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzIHx8IHt9XG4gICk7XG5cbiAgdXRpbHMuZm9yRWFjaChcbiAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICBmdW5jdGlvbiBjbGVhbkhlYWRlckNvbmZpZyhtZXRob2QpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuaGVhZGVyc1ttZXRob2RdO1xuICAgIH1cbiAgKTtcblxuICB2YXIgYWRhcHRlciA9IGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXI7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/dispatchRequest.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/core/enhanceError.js":
/*!*******************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/core/enhanceError.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n  error.config = config;\n  if (code) {\n    error.code = code;\n  }\n\n  error.request = request;\n  error.response = response;\n  error.isAxiosError = true;\n\n  error.toJSON = function() {\n    return {\n      // Standard\n      message: this.message,\n      name: this.name,\n      // Microsoft\n      description: this.description,\n      number: this.number,\n      // Mozilla\n      fileName: this.fileName,\n      lineNumber: this.lineNumber,\n      columnNumber: this.columnNumber,\n      stack: this.stack,\n      // Axios\n      config: this.config,\n      code: this.code\n    };\n  };\n  return error;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9lbmhhbmNlRXJyb3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9lbmhhbmNlRXJyb3IuanM/NTAzYSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXBkYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWcsIGVycm9yIGNvZGUsIGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBUaGUgZXJyb3IgdG8gdXBkYXRlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBlcnJvci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgZXJyb3IuY29uZmlnID0gY29uZmlnO1xuICBpZiAoY29kZSkge1xuICAgIGVycm9yLmNvZGUgPSBjb2RlO1xuICB9XG5cbiAgZXJyb3IucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIGVycm9yLmlzQXhpb3NFcnJvciA9IHRydWU7XG5cbiAgZXJyb3IudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb2RlOiB0aGlzLmNvZGVcbiAgICB9O1xuICB9O1xuICByZXR1cm4gZXJyb3I7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/enhanceError.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js":
/*!******************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n  // eslint-disable-next-line no-param-reassign\n  config2 = config2 || {};\n  var config = {};\n\n  utils.forEach(['url', 'method', 'params', 'data'], function valueFromConfig2(prop) {\n    if (typeof config2[prop] !== 'undefined') {\n      config[prop] = config2[prop];\n    }\n  });\n\n  utils.forEach(['headers', 'auth', 'proxy'], function mergeDeepProperties(prop) {\n    if (utils.isObject(config2[prop])) {\n      config[prop] = utils.deepMerge(config1[prop], config2[prop]);\n    } else if (typeof config2[prop] !== 'undefined') {\n      config[prop] = config2[prop];\n    } else if (utils.isObject(config1[prop])) {\n      config[prop] = utils.deepMerge(config1[prop]);\n    } else if (typeof config1[prop] !== 'undefined') {\n      config[prop] = config1[prop];\n    }\n  });\n\n  utils.forEach([\n    'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer',\n    'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',\n    'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'maxContentLength',\n    'validateStatus', 'maxRedirects', 'httpAgent', 'httpsAgent', 'cancelToken',\n    'socketPath'\n  ], function defaultToConfig2(prop) {\n    if (typeof config2[prop] !== 'undefined') {\n      config[prop] = config2[prop];\n    } else if (typeof config1[prop] !== 'undefined') {\n      config[prop] = config1[prop];\n    }\n  });\n\n  return config;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9tZXJnZUNvbmZpZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9jb3JlL21lcmdlQ29uZmlnLmpzPzE1ZDUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgdmFyIGNvbmZpZyA9IHt9O1xuXG4gIHV0aWxzLmZvckVhY2goWyd1cmwnLCAnbWV0aG9kJywgJ3BhcmFtcycsICdkYXRhJ10sIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIocHJvcCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnMltwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzJbcHJvcF07XG4gICAgfVxuICB9KTtcblxuICB1dGlscy5mb3JFYWNoKFsnaGVhZGVycycsICdhdXRoJywgJ3Byb3h5J10sIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMocHJvcCkge1xuICAgIGlmICh1dGlscy5pc09iamVjdChjb25maWcyW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gdXRpbHMuZGVlcE1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZzJbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcyW3Byb3BdO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNPYmplY3QoY29uZmlnMVtwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IHV0aWxzLmRlZXBNZXJnZShjb25maWcxW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25maWcxW3Byb3BdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnW3Byb3BdID0gY29uZmlnMVtwcm9wXTtcbiAgICB9XG4gIH0pO1xuXG4gIHV0aWxzLmZvckVhY2goW1xuICAgICdiYXNlVVJMJywgJ3RyYW5zZm9ybVJlcXVlc3QnLCAndHJhbnNmb3JtUmVzcG9uc2UnLCAncGFyYW1zU2VyaWFsaXplcicsXG4gICAgJ3RpbWVvdXQnLCAnd2l0aENyZWRlbnRpYWxzJywgJ2FkYXB0ZXInLCAncmVzcG9uc2VUeXBlJywgJ3hzcmZDb29raWVOYW1lJyxcbiAgICAneHNyZkhlYWRlck5hbWUnLCAnb25VcGxvYWRQcm9ncmVzcycsICdvbkRvd25sb2FkUHJvZ3Jlc3MnLCAnbWF4Q29udGVudExlbmd0aCcsXG4gICAgJ3ZhbGlkYXRlU3RhdHVzJywgJ21heFJlZGlyZWN0cycsICdodHRwQWdlbnQnLCAnaHR0cHNBZ2VudCcsICdjYW5jZWxUb2tlbicsXG4gICAgJ3NvY2tldFBhdGgnXG4gIF0sIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIocHJvcCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnMltwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzJbcHJvcF07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnMVtwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzFbcHJvcF07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29uZmlnO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/mergeConfig.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/core/settle.js":
/*!*************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/core/settle.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar createError = __webpack_require__(/*! ./createError */ \"./node_modules/_axios@0.19.0@axios/lib/core/createError.js\");\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n  var validateStatus = response.config.validateStatus;\n  if (!validateStatus || validateStatus(response.status)) {\n    resolve(response);\n  } else {\n    reject(createError(\n      'Request failed with status code ' + response.status,\n      response.config,\n      null,\n      response.request,\n      response\n    ));\n  }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9zZXR0bGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS9zZXR0bGUuanM/OTM3YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICB2YXIgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChjcmVhdGVFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICBudWxsLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/settle.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/core/transformData.js":
/*!********************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/core/transformData.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n  /*eslint no-param-reassign:0*/\n  utils.forEach(fns, function transform(fn) {\n    data = fn(data, headers);\n  });\n\n  return data;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz9mOThjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYmUgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGhlYWRlcnMgVGhlIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShkYXRhLCBoZWFkZXJzLCBmbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4oZGF0YSwgaGVhZGVycyk7XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/core/transformData.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/defaults.js":
/*!**********************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/defaults.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("/* WEBPACK VAR INJECTION */(function(process) {\n\nvar utils = __webpack_require__(/*! ./utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\nvar normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/normalizeHeaderName.js\");\n\nvar DEFAULT_CONTENT_TYPE = {\n  'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n  if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n    headers['Content-Type'] = value;\n  }\n}\n\nfunction getDefaultAdapter() {\n  var adapter;\n  // Only Node.JS has a process variable that is of [[Class]] process\n  if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n    // For node use HTTP adapter\n    adapter = __webpack_require__(/*! ./adapters/http */ \"./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js\");\n  } else if (typeof XMLHttpRequest !== 'undefined') {\n    // For browsers use XHR adapter\n    adapter = __webpack_require__(/*! ./adapters/xhr */ \"./node_modules/_axios@0.19.0@axios/lib/adapters/xhr.js\");\n  }\n  return adapter;\n}\n\nvar defaults = {\n  adapter: getDefaultAdapter(),\n\n  transformRequest: [function transformRequest(data, headers) {\n    normalizeHeaderName(headers, 'Accept');\n    normalizeHeaderName(headers, 'Content-Type');\n    if (utils.isFormData(data) ||\n      utils.isArrayBuffer(data) ||\n      utils.isBuffer(data) ||\n      utils.isStream(data) ||\n      utils.isFile(data) ||\n      utils.isBlob(data)\n    ) {\n      return data;\n    }\n    if (utils.isArrayBufferView(data)) {\n      return data.buffer;\n    }\n    if (utils.isURLSearchParams(data)) {\n      setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n      return data.toString();\n    }\n    if (utils.isObject(data)) {\n      setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n      return JSON.stringify(data);\n    }\n    return data;\n  }],\n\n  transformResponse: [function transformResponse(data) {\n    /*eslint no-param-reassign:0*/\n    if (typeof data === 'string') {\n      try {\n        data = JSON.parse(data);\n      } catch (e) { /* Ignore */ }\n    }\n    return data;\n  }],\n\n  /**\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\n   * timeout is not created.\n   */\n  timeout: 0,\n\n  xsrfCookieName: 'XSRF-TOKEN',\n  xsrfHeaderName: 'X-XSRF-TOKEN',\n\n  maxContentLength: -1,\n\n  validateStatus: function validateStatus(status) {\n    return status >= 200 && status < 300;\n  }\n};\n\ndefaults.headers = {\n  common: {\n    'Accept': 'application/json, text/plain, */*'\n  }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n  defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../_process@0.11.10@process/browser.js */ \"./node_modules/_process@0.11.10@process/browser.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvZGVmYXVsdHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvZGVmYXVsdHMuanM/YTMxMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBub3JtYWxpemVIZWFkZXJOYW1lID0gcmVxdWlyZSgnLi9oZWxwZXJzL25vcm1hbGl6ZUhlYWRlck5hbWUnKTtcblxudmFyIERFRkFVTFRfQ09OVEVOVF9UWVBFID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbmZ1bmN0aW9uIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCB2YWx1ZSkge1xuICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpICYmIHV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSkge1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEFkYXB0ZXIoKSB7XG4gIHZhciBhZGFwdGVyO1xuICAvLyBPbmx5IE5vZGUuSlMgaGFzIGEgcHJvY2VzcyB2YXJpYWJsZSB0aGF0IGlzIG9mIFtbQ2xhc3NdXSBwcm9jZXNzXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpIHtcbiAgICAvLyBGb3Igbm9kZSB1c2UgSFRUUCBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMvaHR0cCcpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMveGhyJyk7XG4gIH1cbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgYWRhcHRlcjogZ2V0RGVmYXVsdEFkYXB0ZXIoKSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQWNjZXB0Jyk7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQ29udGVudC1UeXBlJyk7XG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0Jsb2IoZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogSWdub3JlICovIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH1cbn07XG5cbmRlZmF1bHRzLmhlYWRlcnMgPSB7XG4gIGNvbW1vbjoge1xuICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/defaults.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js":
/*!**************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nmodule.exports = function bind(fn, thisArg) {\n  return function wrap() {\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n    return fn.apply(thisArg, args);\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9iaW5kLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcz9jOWVhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js":
/*!******************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nfunction encode(val) {\n  return encodeURIComponent(val).\n    replace(/%40/gi, '@').\n    replace(/%3A/gi, ':').\n    replace(/%24/g, '$').\n    replace(/%2C/gi, ',').\n    replace(/%20/g, '+').\n    replace(/%5B/gi, '[').\n    replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n  /*eslint no-param-reassign:0*/\n  if (!params) {\n    return url;\n  }\n\n  var serializedParams;\n  if (paramsSerializer) {\n    serializedParams = paramsSerializer(params);\n  } else if (utils.isURLSearchParams(params)) {\n    serializedParams = params.toString();\n  } else {\n    var parts = [];\n\n    utils.forEach(params, function serialize(val, key) {\n      if (val === null || typeof val === 'undefined') {\n        return;\n      }\n\n      if (utils.isArray(val)) {\n        key = key + '[]';\n      } else {\n        val = [val];\n      }\n\n      utils.forEach(val, function parseValue(v) {\n        if (utils.isDate(v)) {\n          v = v.toISOString();\n        } else if (utils.isObject(v)) {\n          v = JSON.stringify(v);\n        }\n        parts.push(encode(key) + '=' + encode(v));\n      });\n    });\n\n    serializedParams = parts.join('&');\n  }\n\n  if (serializedParams) {\n    var hashmarkIndex = url.indexOf('#');\n    if (hashmarkIndex !== -1) {\n      url = url.slice(0, hashmarkIndex);\n    }\n\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n  }\n\n  return url;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9oZWxwZXJzL2J1aWxkVVJMLmpzP2M5NmIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyU0MC9naSwgJ0AnKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgcGFyYW1zU2VyaWFsaXplcikge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdmFyIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIGlmIChwYXJhbXNTZXJpYWxpemVyKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtc1NlcmlhbGl6ZXIocGFyYW1zKTtcbiAgfSBlbHNlIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtcy50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuXG4gICAgdXRpbHMuZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWwsIGtleSkge1xuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAga2V5ID0ga2V5ICsgJ1tdJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IFt2YWxdO1xuICAgICAgfVxuXG4gICAgICB1dGlscy5mb3JFYWNoKHZhbCwgZnVuY3Rpb24gcGFyc2VWYWx1ZSh2KSB7XG4gICAgICAgIGlmICh1dGlscy5pc0RhdGUodikpIHtcbiAgICAgICAgICB2ID0gdi50b0lTT1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzT2JqZWN0KHYpKSB7XG4gICAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlKGtleSkgKyAnPScgKyBlbmNvZGUodikpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFydHMuam9pbignJicpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICB2YXIgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuXG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/buildURL.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/combineURLs.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/helpers/combineURLs.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n  return relativeURL\n    ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n    : baseURL;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9jb21iaW5lVVJMcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fYXhpb3NAMC4xOS4wQGF4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzPzA5MmIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/combineURLs.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/cookies.js":
/*!*****************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/helpers/cookies.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nmodule.exports = (\n  utils.isStandardBrowserEnv() ?\n\n  // Standard browser envs support document.cookie\n    (function standardBrowserEnv() {\n      return {\n        write: function write(name, value, expires, path, domain, secure) {\n          var cookie = [];\n          cookie.push(name + '=' + encodeURIComponent(value));\n\n          if (utils.isNumber(expires)) {\n            cookie.push('expires=' + new Date(expires).toGMTString());\n          }\n\n          if (utils.isString(path)) {\n            cookie.push('path=' + path);\n          }\n\n          if (utils.isString(domain)) {\n            cookie.push('domain=' + domain);\n          }\n\n          if (secure === true) {\n            cookie.push('secure');\n          }\n\n          document.cookie = cookie.join('; ');\n        },\n\n        read: function read(name) {\n          var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n          return (match ? decodeURIComponent(match[3]) : null);\n        },\n\n        remove: function remove(name) {\n          this.write(name, '', Date.now() - 86400000);\n        }\n      };\n    })() :\n\n  // Non standard browser env (web workers, react-native) lack needed support.\n    (function nonStandardBrowserEnv() {\n      return {\n        write: function write() {},\n        read: function read() { return null; },\n        remove: function remove() {}\n      };\n    })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcz8xMjYyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gICAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgICAgICB2YXIgY29va2llID0gW107XG4gICAgICAgICAgY29va2llLnB1c2gobmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKHBhdGgpKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKGRvbWFpbikpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlY3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ3NlY3VyZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQobmFtZSkge1xuICAgICAgICAgIHZhciBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XG4gICAgICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gICAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZSgpIHt9LFxuICAgICAgICByZWFkOiBmdW5jdGlvbiByZWFkKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgICAgfTtcbiAgICB9KSgpXG4pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/cookies.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/isAbsoluteURL.js":
/*!***********************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/helpers/isAbsoluteURL.js ***!
  \***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n  // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n  // by any combination of letters, digits, plus, period, or hyphen.\n  return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9pc0Fic29sdXRlVVJMLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcz85ODg0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkXFwrXFwtXFwuXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/isAbsoluteURL.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/isURLSameOrigin.js":
/*!*************************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/helpers/isURLSameOrigin.js ***!
  \*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nmodule.exports = (\n  utils.isStandardBrowserEnv() ?\n\n  // Standard browser envs have full support of the APIs needed to test\n  // whether the request URL is of the same origin as current location.\n    (function standardBrowserEnv() {\n      var msie = /(msie|trident)/i.test(navigator.userAgent);\n      var urlParsingNode = document.createElement('a');\n      var originURL;\n\n      /**\n    * Parse a URL to discover it's components\n    *\n    * @param {String} url The URL to be parsed\n    * @returns {Object}\n    */\n      function resolveURL(url) {\n        var href = url;\n\n        if (msie) {\n        // IE needs attribute set twice to normalize properties\n          urlParsingNode.setAttribute('href', href);\n          href = urlParsingNode.href;\n        }\n\n        urlParsingNode.setAttribute('href', href);\n\n        // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n        return {\n          href: urlParsingNode.href,\n          protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n          host: urlParsingNode.host,\n          search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n          hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n          hostname: urlParsingNode.hostname,\n          port: urlParsingNode.port,\n          pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n            urlParsingNode.pathname :\n            '/' + urlParsingNode.pathname\n        };\n      }\n\n      originURL = resolveURL(window.location.href);\n\n      /**\n    * Determine if a URL shares the same origin as the current location\n    *\n    * @param {String} requestURL The URL to test\n    * @returns {boolean} True if URL shares the same origin, otherwise false\n    */\n      return function isURLSameOrigin(requestURL) {\n        var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n        return (parsed.protocol === originURL.protocol &&\n            parsed.host === originURL.host);\n      };\n    })() :\n\n  // Non standard browser envs (web workers, react-native) lack needed support.\n    (function nonStandardBrowserEnv() {\n      return function isURLSameOrigin() {\n        return true;\n      };\n    })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanM/ZjFiZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBoYXZlIGZ1bGwgc3VwcG9ydCBvZiB0aGUgQVBJcyBuZWVkZWQgdG8gdGVzdFxuICAvLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cbiAgICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgdmFyIG1zaWUgPSAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgdmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgdmFyIG9yaWdpblVSTDtcblxuICAgICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdCdzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuICAgICAgICB2YXIgaHJlZiA9IHVybDtcblxuICAgICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgICAgICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAgICAgICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICAgICAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgICAgICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgICAgICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgP1xuICAgICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAgIC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVSTCBUaGUgVVJMIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSAodXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG4gICAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgICB9O1xuICAgIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gICAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9KSgpXG4pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/isURLSameOrigin.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/normalizeHeaderName.js":
/*!*****************************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/helpers/normalizeHeaderName.js ***!
  \*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n  utils.forEach(headers, function processHeader(value, name) {\n    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n      headers[normalizedName] = value;\n      delete headers[name];\n    }\n  });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19heGlvc0AwLjE5LjBAYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcz8wM2NlIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsIG5vcm1hbGl6ZWROYW1lKSB7XG4gIHV0aWxzLmZvckVhY2goaGVhZGVycywgZnVuY3Rpb24gcHJvY2Vzc0hlYWRlcih2YWx1ZSwgbmFtZSkge1xuICAgIGlmIChuYW1lICE9PSBub3JtYWxpemVkTmFtZSAmJiBuYW1lLnRvVXBwZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWROYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZE5hbWVdID0gdmFsdWU7XG4gICAgICBkZWxldGUgaGVhZGVyc1tuYW1lXTtcbiAgICB9XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/normalizeHeaderName.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/parseHeaders.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/helpers/parseHeaders.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar utils = __webpack_require__(/*! ./../utils */ \"./node_modules/_axios@0.19.0@axios/lib/utils.js\");\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n  'age', 'authorization', 'content-length', 'content-type', 'etag',\n  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n  'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n  'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n  var parsed = {};\n  var key;\n  var val;\n  var i;\n\n  if (!headers) { return parsed; }\n\n  utils.forEach(headers.split('\\n'), function parser(line) {\n    i = line.indexOf(':');\n    key = utils.trim(line.substr(0, i)).toLowerCase();\n    val = utils.trim(line.substr(i + 1));\n\n    if (key) {\n      if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n        return;\n      }\n      if (key === 'set-cookie') {\n        parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n      } else {\n        parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n      }\n    }\n  });\n\n  return parsed;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanM/ZmI3NSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLy8gSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbnZhciBpZ25vcmVEdXBsaWNhdGVPZiA9IFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gIHZhciBwYXJzZWQgPSB7fTtcbiAgdmFyIGtleTtcbiAgdmFyIHZhbDtcbiAgdmFyIGk7XG5cbiAgaWYgKCFoZWFkZXJzKSB7IHJldHVybiBwYXJzZWQ7IH1cblxuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xcbicpLCBmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKDAsIGkpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZi5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSAocGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSA6IFtdKS5jb25jYXQoW3ZhbF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/parseHeaders.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/helpers/spread.js":
/*!****************************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/helpers/spread.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n *  ```js\n *  function f(x, y, z) {}\n *  var args = [1, 2, 3];\n *  f.apply(null, args);\n *  ```\n *\n * With `spread` this example can be re-written.\n *\n *  ```js\n *  spread(function(x, y, z) {})([1, 2, 3]);\n *  ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n  return function wrap(arr) {\n    return callback.apply(null, arr);\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9zcHJlYWQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvaGVscGVycy9zcHJlYWQuanM/OGNjOSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/helpers/spread.js\n");

/***/ }),

/***/ "./node_modules/_axios@0.19.0@axios/lib/utils.js":
/*!*******************************************************!*\
  !*** ./node_modules/_axios@0.19.0@axios/lib/utils.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar bind = __webpack_require__(/*! ./helpers/bind */ \"./node_modules/_axios@0.19.0@axios/lib/helpers/bind.js\");\nvar isBuffer = __webpack_require__(/*! is-buffer */ \"./node_modules/_is-buffer@2.0.4@is-buffer/index.js\");\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n  return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n  return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n  return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n  var result;\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n    result = ArrayBuffer.isView(val);\n  } else {\n    result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n  }\n  return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n  return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n  return typeof val === 'number';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n  return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n  return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n  return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n  return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n  return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n  return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n  return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n  return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n  return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n *  typeof window -> undefined\n *  typeof document -> undefined\n *\n * react-native:\n *  navigator.product -> 'ReactNative'\n * nativescript\n *  navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n  if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n                                           navigator.product === 'NativeScript' ||\n                                           navigator.product === 'NS')) {\n    return false;\n  }\n  return (\n    typeof window !== 'undefined' &&\n    typeof document !== 'undefined'\n  );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n  // Don't bother if no value provided\n  if (obj === null || typeof obj === 'undefined') {\n    return;\n  }\n\n  // Force an array if not already something iterable\n  if (typeof obj !== 'object') {\n    /*eslint no-param-reassign:0*/\n    obj = [obj];\n  }\n\n  if (isArray(obj)) {\n    // Iterate over array values\n    for (var i = 0, l = obj.length; i < l; i++) {\n      fn.call(null, obj[i], i, obj);\n    }\n  } else {\n    // Iterate over object keys\n    for (var key in obj) {\n      if (Object.prototype.hasOwnProperty.call(obj, key)) {\n        fn.call(null, obj[key], key, obj);\n      }\n    }\n  }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n  var result = {};\n  function assignValue(val, key) {\n    if (typeof result[key] === 'object' && typeof val === 'object') {\n      result[key] = merge(result[key], val);\n    } else {\n      result[key] = val;\n    }\n  }\n\n  for (var i = 0, l = arguments.length; i < l; i++) {\n    forEach(arguments[i], assignValue);\n  }\n  return result;\n}\n\n/**\n * Function equal to merge with the difference being that no reference\n * to original objects is kept.\n *\n * @see merge\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction deepMerge(/* obj1, obj2, obj3, ... */) {\n  var result = {};\n  function assignValue(val, key) {\n    if (typeof result[key] === 'object' && typeof val === 'object') {\n      result[key] = deepMerge(result[key], val);\n    } else if (typeof val === 'object') {\n      result[key] = deepMerge({}, val);\n    } else {\n      result[key] = val;\n    }\n  }\n\n  for (var i = 0, l = arguments.length; i < l; i++) {\n    forEach(arguments[i], assignValue);\n  }\n  return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n  forEach(b, function assignValue(val, key) {\n    if (thisArg && typeof val === 'function') {\n      a[key] = bind(val, thisArg);\n    } else {\n      a[key] = val;\n    }\n  });\n  return a;\n}\n\nmodule.exports = {\n  isArray: isArray,\n  isArrayBuffer: isArrayBuffer,\n  isBuffer: isBuffer,\n  isFormData: isFormData,\n  isArrayBufferView: isArrayBufferView,\n  isString: isString,\n  isNumber: isNumber,\n  isObject: isObject,\n  isUndefined: isUndefined,\n  isDate: isDate,\n  isFile: isFile,\n  isBlob: isBlob,\n  isFunction: isFunction,\n  isStream: isStream,\n  isURLSearchParams: isURLSearchParams,\n  isStandardBrowserEnv: isStandardBrowserEnv,\n  forEach: forEach,\n  merge: merge,\n  deepMerge: deepMerge,\n  extend: extend,\n  trim: trim\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvdXRpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2F4aW9zQDAuMTkuMEBheGlvcy9saWIvdXRpbHMuanM/NGExNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBpc0J1ZmZlciA9IHJlcXVpcmUoJ2lzLWJ1ZmZlcicpO1xuXG4vKmdsb2JhbCB0b1N0cmluZzp0cnVlKi9cblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbCkge1xuICByZXR1cm4gKHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcpICYmICh2YWwgaW5zdGFuY2VvZiBGb3JtRGF0YSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKHZhbC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ZpbGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZpbGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJsb2JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jsb2IodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyZWFtKHZhbCkge1xuICByZXR1cm4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VSTFNlYXJjaFBhcmFtcyh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcztcbn1cblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpLnJlcGxhY2UoL1xccyokLywgJycpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqL1xuZnVuY3Rpb24gaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAobmF2aWdhdG9yLnByb2R1Y3QgPT09ICdSZWFjdE5hdGl2ZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05hdGl2ZVNjcmlwdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05TJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodHlwZW9mIHJlc3VsdFtrZXldID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZShyZXN1bHRba2V5XSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGVxdWFsIHRvIG1lcmdlIHdpdGggdGhlIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCBubyByZWZlcmVuY2VcbiAqIHRvIG9yaWdpbmFsIG9iamVjdHMgaXMga2VwdC5cbiAqXG4gKiBAc2VlIG1lcmdlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBkZWVwTWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodHlwZW9mIHJlc3VsdFtrZXldID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwTWVyZ2UocmVzdWx0W2tleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwTWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZChhLCBiLCB0aGlzQXJnKSB7XG4gIGZvckVhY2goYiwgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodGhpc0FyZyAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXI6IGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YTogaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXc6IGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZzogaXNTdHJpbmcsXG4gIGlzTnVtYmVyOiBpc051bWJlcixcbiAgaXNPYmplY3Q6IGlzT2JqZWN0LFxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gIGlzRGF0ZTogaXNEYXRlLFxuICBpc0ZpbGU6IGlzRmlsZSxcbiAgaXNCbG9iOiBpc0Jsb2IsXG4gIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtOiBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXM6IGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1N0YW5kYXJkQnJvd3NlckVudjogaXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIGZvckVhY2g6IGZvckVhY2gsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZGVlcE1lcmdlOiBkZWVwTWVyZ2UsXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0cmltOiB0cmltXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_axios@0.19.0@axios/lib/utils.js\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js&":
/*!********************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=script&lang=js& ***!
  \********************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es7.object.get-own-property-descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\");\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/defineProperty */ \"./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @utils/utils.js */ \"./src/utils/utils.js\");\n/* harmony import */ var _components_home_header_header_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @components/home/header/header.vue */ \"./src/components/home/header/header.vue\");\n/* harmony import */ var _components_home_footer_footer_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @components/home/footer/footer.vue */ \"./src/components/home/footer/footer.vue\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\nvar UA = __webpack_require__(/*! ua-device */ \"./node_modules/_ua-device@0.1.10@ua-device/index.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  name: \"app\",\n  components: {\n    VHeader: _components_home_header_header_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n    VFooter: _components_home_footer_footer_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n  },\n  computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_4__[\"mapState\"])({\n    isMobile: function isMobile(state) {\n      return state.isMobile;\n    }\n  })),\n  methods: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_4__[\"mapActions\"])([\"pcorphone\"]), {\n    // 设置UA\n    refreshUA: function refreshUA() {\n      var output = new UA(navigator.userAgent);\n      var deviceType = output.device.type;\n      var isMobile = deviceType == \"mobile\";\n      this.$store.commit(\"IS_MOBILE\", isMobile);\n    },\n    refreshProfile: function refreshProfile() {\n      var _this = this;\n\n      var userInfoStr = decodeURIComponent(Object(_utils_utils_js__WEBPACK_IMPORTED_MODULE_5__[\"getCookie\"])(\"_user_profile\"));\n\n      if (userInfoStr) {\n        try {\n          var userInfo = JSON.parse(decodeURIComponent(userInfoStr));\n          this.$store.commit(\"SET_USER_INFO\", userInfo);\n\n          if (userInfo && userInfo.sid) {\n            Object(_api_fetch_api_js__WEBPACK_IMPORTED_MODULE_9__[\"httpPost\"])({\n              url: _api_api__WEBPACK_IMPORTED_MODULE_8___default.a.baseInfo,\n              sidStr: userInfo.sid\n            }).then(function (res) {\n              if (res) {\n                _this.$store.commit(\"SET_USER_INFO\", userInfo);\n              } else {\n                _this.$store.commit(\"SET_USER_INFO\", null);\n              }\n            });\n          }\n        } catch (e) {}\n      }\n    }\n  }),\n  created: function created() {\n    // window.onresize = () => {\n    //   this.refreshUA();\n    // };\n    this.refreshUA(); //\n\n    this.refreshProfile();\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9BcHAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9BcHAudnVlPzIzNGUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8ZGl2IGlkPVwiYXBwXCI+XG4gICAgPHYtaGVhZGVyIGNsYXNzPVwiaGVhZGVyXCI+PC92LWhlYWRlcj5cbiAgICA8bWFpbiByZWY9XCJjb250YWluZXJcIiBjbGFzcz1cIm1haW4tY29udGFpbmVyXCI+XG4gICAgICA8cm91dGVyLXZpZXcgLz5cbiAgICA8L21haW4+XG4gICAgPHYtZm9vdGVyPjwvdi1mb290ZXI+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuXG48c2NyaXB0PlxuaW1wb3J0IHsgbWFwR2V0dGVycywgbWFwQWN0aW9ucywgbWFwU3RhdGUgfSBmcm9tIFwidnVleFwiO1xuaW1wb3J0IHsgZ2V0Q29va2llIH0gZnJvbSBcIkB1dGlscy91dGlscy5qc1wiO1xuaW1wb3J0IFZIZWFkZXIgZnJvbSBcIkBjb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWVcIjtcbmltcG9ydCBWRm9vdGVyIGZyb20gXCJAY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlXCI7XG5cbmltcG9ydCBhcGkgZnJvbSBcIkAvYXBpL2FwaVwiO1xuaW1wb3J0IHsgaHR0cEdldCwgaHR0cFBvc3QgfSBmcm9tIFwiQC9hcGkvZmV0Y2gtYXBpLmpzXCI7XG5cbnZhciBVQSA9IHJlcXVpcmUoXCJ1YS1kZXZpY2VcIik7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogXCJhcHBcIixcbiAgY29tcG9uZW50czoge1xuICAgIFZIZWFkZXIsXG4gICAgVkZvb3RlclxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIC4uLm1hcFN0YXRlKHtcbiAgICAgIGlzTW9iaWxlOiBzdGF0ZSA9PiBzdGF0ZS5pc01vYmlsZVxuICAgIH0pXG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICAuLi5tYXBBY3Rpb25zKFtcInBjb3JwaG9uZVwiXSksXG4gICAgLy8g6K6+572uVUFcbiAgICByZWZyZXNoVUEoKSB7XG4gICAgICBsZXQgb3V0cHV0ID0gbmV3IFVBKG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgbGV0IGRldmljZVR5cGUgPSBvdXRwdXQuZGV2aWNlLnR5cGU7XG4gICAgICBsZXQgaXNNb2JpbGUgPSBkZXZpY2VUeXBlID09IFwibW9iaWxlXCI7XG4gICAgICB0aGlzLiRzdG9yZS5jb21taXQoXCJJU19NT0JJTEVcIiwgaXNNb2JpbGUpO1xuICAgIH0sXG4gICAgcmVmcmVzaFByb2ZpbGUoKSB7XG4gICAgICBsZXQgdXNlckluZm9TdHIgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0Q29va2llKFwiX3VzZXJfcHJvZmlsZVwiKSk7XG4gICAgICBpZiAodXNlckluZm9TdHIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgdXNlckluZm8gPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudCh1c2VySW5mb1N0cikpO1xuICAgICAgICAgIHRoaXMuJHN0b3JlLmNvbW1pdChcIlNFVF9VU0VSX0lORk9cIiwgdXNlckluZm8pO1xuICAgICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zaWQpIHtcbiAgICAgICAgICAgIGh0dHBQb3N0KHsgdXJsOiBhcGkuYmFzZUluZm8sIHNpZFN0cjogdXNlckluZm8uc2lkIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmNvbW1pdChcIlNFVF9VU0VSX0lORk9cIiwgdXNlckluZm8pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmNvbW1pdChcIlNFVF9VU0VSX0lORk9cIiwgbnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGNyZWF0ZWQoKSB7XG4gICAgLy8gd2luZG93Lm9ucmVzaXplID0gKCkgPT4ge1xuICAgIC8vICAgdGhpcy5yZWZyZXNoVUEoKTtcbiAgICAvLyB9O1xuICAgIHRoaXMucmVmcmVzaFVBKCk7XG4gICAgLy9cbiAgICB0aGlzLnJlZnJlc2hQcm9maWxlKCk7XG4gIH1cbn07XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0IFwiQC9zdHlsZXMvX3N1cHBvcnRcIjtcblxuaHRtbCB7XG4gIGZvbnQtZmFtaWx5OiBcIk1pY3Jvc29mdCBZYUhlaVwiLCBcIkFyaWFsXCI7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgd29yZC1zcGFjaW5nOiAxcHg7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIC8vIGNvbG9yOiAjMzMzO1xuICBjb2xvcjogJGNGb250R3JheTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcbiAgLy8gLW1zLXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7XG4gIC8vIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcbiAgLy8gLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbiAgLy8gLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbmJvZHkge1xuICBmb250LXNpemU6ICRmb250U2l6ZTtcbn1cblxuaHRtbCxcbmJvZHkge1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IG5vbmU7XG59XG5cbmJvZHksXG5kaXYge1xuICBib3JkZXI6IDA7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuKixcbio6YmVmb3JlLFxuKjphZnRlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1hcmdpbjogMDtcbn1cblxuYm9keSxcbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNixcbmhyLFxucCxcbmJsb2NrcXVvdGUsXG5kbCxcbmR0LFxuZGQsXG51bCxcbm9sLFxubGksXG5wcmUsXG5mb3JtLFxuZmllbGRzZXQsXG5sZWdlbmQsXG5idXR0b24sXG5pbnB1dCxcbnRleHRhcmVhLFxudGgsXG50ZCxcbmlmcmFtZSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuaW1nLFxuYXJ0aWNsZSxcbmFzaWRlLFxuZGV0YWlscyxcbmZpZ2NhcHRpb24sXG5maWd1cmUsXG5mb290ZXIsXG5oZWFkZXIsXG5tZW51LFxubmF2LFxuc2VjdGlvbixcbnN1bW1hcnksXG50aW1lLFxubWFyayxcbmF1ZGlvLFxudmlkZW8ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICBmb250LXNpemU6IDEwMCU7XG59XG5cbmZpZWxkc2V0LFxuaW1nIHtcbiAgYm9yZGVyOiAwO1xufVxuXG5hZGRyZXNzLFxuY2FwdGlvbixcbmNpdGUsXG5kZm4sXG5lbSxcbnRoLFxudmFyLFxuaSxcbmVtIHtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xufVxuXG5vbCxcbnVsIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuYSB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6IGluaGVyaXQ7XG4gICY6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgfVxufVxuXG5hLFxubGFiZWwsXG5idXR0b24sXG5pbnB1dCxcbnNlbGVjdCB7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcbn1cblxuaW5wdXQsXG5zZWxlY3QsXG5idXR0b24ge1xuICAvLyBmb250OiAxMDAlIHRhaG9tYSwgXCJcXDViOGJcXDRmNTNcIiwgYXJpYWw7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbnNlbGVjdCB7XG4gIG91dGxpbmU6IG5vbmU7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xufVxuc2VsZWN0OjotbXMtZXhwYW5kIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuaW5wdXQge1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG59XG5cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcbmlucHV0LFxuaW5wdXRbdHlwZT1cInJlc2V0XCJdOjotbW96LWZvY3VzLWlubmVyLFxuaW5wdXRbdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixcbmlucHV0W3R5cGU9XCJzdWJtaXRcIl06Oi1tb3otZm9jdXMtaW5uZXIsXG5pbnB1dFt0eXBlPVwiZmlsZVwiXSA+IGlucHV0W3R5cGU9XCJidXR0b25cIl06Oi1tb3otZm9jdXMtaW5uZXIge1xuICBib3JkZXI6IG5vbmU7XG59XG5cbmlucHV0W3R5cGU9XCJjaGVja2JveFwiXSxcbmlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24sXG5pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZSAhaW1wb3J0YW50O1xuICBtYXJnaW46IDA7XG59XG5cbmlucHV0Oi13ZWJraXQtYXV0b2ZpbGwge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAwIDEwMDBweCB3aGl0ZSBpbnNldDtcbn1cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSxcbmlucHV0W3R5cGU9XCJ0ZWxcIl0sXG5pbnB1dFt0eXBlPVwidGV4dFwiXSxcbmlucHV0IHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOyAvKuWOu+mZpOezu+e7n+m7mOiupOeahOagt+W8jyovXG4gIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIC8vIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5pbnB1dDo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbixcbmlucHV0Ojotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLy8gaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xuLy8gICBjb2xvcjogJGNHcmF5ICFpbXBvcnRhbnQ7XG4vLyB9XG5cbjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiAkY0dyYXk7XG4gIG9wYWNpdHk6IDE7XG59XG46LW1vei1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiAkY0dyYXk7XG4gIG9wYWNpdHk6IDE7XG59XG46Oi1tb3otcGxhY2Vob2xkZXIge1xuICBjb2xvcjogJGNHcmF5O1xuICBvcGFjaXR5OiAxO1xufVxuOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7XG4gIGNvbG9yOiAkY0dyYXk7XG4gIG9wYWNpdHk6IDE7XG59XG5cbnNlbGVjdCxcbmlucHV0LFxub3B0aW9uIHtcbiAgY29sb3I6ICRjTGlnaHRCbGFjaztcbn1cblxudGV4dGFyZWEge1xuICBvdXRsaW5lOiBub25lO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIHJlc2l6ZTogbm9uZTtcbiAgLy8gZm9udDogMTAwJSB0YWhvbWEsIFwiXFw1YjhiXFw0ZjUzXCIsIGFyaWFsO1xuICBjb2xvcjogJGNMaWdodEJsYWNrO1xufVxuXG4jYXBwIHtcbiAgYm9yZGVyOiAwO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi5tYWluLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHdpZHRoOiAxMDAlO1xuXG4gICY6OmFmdGVyIHtcbiAgICBkaXNwbGF5OiB0YWJsZTtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIGNsZWFyOiBib3RoO1xuICB9XG59XG5cbi5jb250ZW50IHtcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDAgYXV0bztcbn1cblxuLmJveC13IHtcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDAgYXV0bztcbn1cblxuLmJveCB7XG4gIG1heC13aWR0aDogMTIwMHB4O1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAwIGF1dG87XG59XG5cbi5tLXdpZHRoIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcGFkZGluZzogMCA0JTtcbn1cblxuLmZvY3VzIHtcbiAgYm9yZGVyOiAxcHggc29saWQgJGNPcmFuZ2U7XG59XG5cbi8vIC8vIOinhumikVxuLnZpZGVvLWpzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlclJhZGl1c1NtYWxsO1xufVxuXG4udmlkZW8tanMgLnZqcy10ZWNoLFxuLnZpZGVvLWpzIC52anMtcG9zdGVyIHtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlclJhZGl1c1NtYWxsO1xufVxuXG4udmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b24ge1xuICB0b3A6IDAgIWltcG9ydGFudDtcbiAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gIGxlZnQ6IDAgIWltcG9ydGFudDtcbiAgcmlnaHQ6IDAgIWltcG9ydGFudDtcbiAgbWFyZ2luOiBhdXRvICFpbXBvcnRhbnQ7XG59XG5cbi52aWRlby1qcyAudmpzLXNsaWRlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICRjT3JhbmdlICFpbXBvcnRhbnQ7XG59XG5cbi52aWRlby1qcyAudmpzLXBvc3RlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG59XG5cbi8vIHZhbnRcbi52LWhlYWRlciB7XG4gIC52YW4tY2VsbCB7XG4gICAgcGFkZGluZzogMTZweCAxNnB4ICFpbXBvcnRhbnQ7XG4gIH1cblxuICAudmFuLWNvbGxhcHNlLWl0ZW1fX2NvbnRlbnQge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cblxuICAudmFuLWNlbGw6bm90KDpsYXN0LWNoaWxkKTo6YWZ0ZXIge1xuICAgIGxlZnQ6IDA7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDEyMDBweCkge1xuICAucGFnZS1pbmRleCB7XG4gICAgLnZpZGVvLWpzIHtcbiAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XG4gICAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICB9XG4gIH1cblxuICAjYXBwIHtcbiAgICAuaGVhZGVyIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgICAubWFpbi1jb250YWluZXIge1xuICAgICAgcGFkZGluZy10b3A6ICRuYXZIZWlnaHQtTTtcbiAgICB9XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gICRmb250U2l6ZVRpdGxlOiAkZm9udFNpemVUaXRsZS1NO1xuICAkZm9udFNpemU6ICRmb250U2l6ZS1NO1xuICAkZm9udFNpemVTbWFsbDogJGZvbnRTaXplU21hbGwtTTtcbiAgLm1haW4tY29udGFpbmVyIHtcbiAgICBtYXJnaW4tYm90dG9tOiAkbWFyZ2luTWVkaXVtLU07XG4gIH1cbn1cbjwvc3R5bGU+XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFFQTtBQUFBO0FBQUE7QUFEQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTFCQTtBQTRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&":
/*!*******************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js& ***!
  \*******************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n/* harmony import */ var _utils_biz_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/utils/biz.js */ \"./src/utils/biz.js\");\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  name: \"DropDownList\",\n  data: function data() {\n    return {\n      activeIndex: 0,\n      sTitle: this.dataObj && this.dataObj.name || ''\n    };\n  },\n  props: {\n    type: {\n      type: String,\n      default: function _default() {\n        return \"nav\";\n      }\n    },\n    dataObj: {\n      type: Object,\n      default: function _default() {\n        return {};\n      }\n    },\n    dataList: {\n      type: Array,\n      default: function _default() {\n        return [];\n      }\n    },\n    labelProperty: {\n      type: String,\n      default: function _default() {\n        return \"name\";\n      }\n    }\n  },\n  directives: {\n    dpl: {\n      bind: function bind(el) {\n        el.style.display = \"none\";\n      }\n    }\n  },\n  methods: {\n    onNavHandler: function onNavHandler() {\n      var path = this.dataObj && this.dataObj.path || \"\";\n\n      if (path) {\n        this.$router.push({\n          path: path\n        });\n      }\n    },\n    onOverHandler: function onOverHandler(event) {\n      var ul = event.currentTarget.childNodes[1].childNodes[1];\n      ul.style.display = \"block\";\n    },\n    onOutHandler: function onOutHandler(event) {\n      // console.log(event);\n      var ul = event.currentTarget.childNodes[1].childNodes[1];\n      ul.style.display = \"none\";\n    },\n    onClickHandler: function onClickHandler(event, index) {\n      // 隐藏其他\n      // let path = event.path || (event.composedPath && event.composedPath()); //兼容火狐和safari\n      // path[1].style.display = \"none\";\n      if (this.$refs.ul) {\n        this.$refs.ul.style.display = \"none\";\n      } // 选择item\n\n\n      this.activeIndex = index;\n      var curData = this.dataList[index];\n\n      if (this.type == \"lang\") {\n        // 如果是语言设置,则设置语言\n        var lang = curData.value;\n        this.$i18n.locale = lang;\n        localStorage.setItem(\"lang\", lang);\n        this.sTitle = curData.name;\n        window.location.reload();\n      } else {\n        // if (curData.value == \"logout\") {\n        // \tthis.loginHandler();\n        // } else {\n        // \tthis.$router.push({\n        // \t\tpath: curData.path\n        // \t})\n        // }\n        console.log(curData);\n        var item = curData;\n        var path = item && item.path || \"\";\n\n        if (path) {\n          this.$router.push({\n            path: path\n          });\n        } else {\n          var value = item && item.value || null;\n\n          if (value) {\n            switch (value) {\n              case \"logout\":\n                this.loginHandler();\n                break;\n\n              case \"gotoVHIS\":\n                Object(_utils_biz_js__WEBPACK_IMPORTED_MODULE_4__[\"gotoVHIS\"])(this.locale);\n                break;\n            }\n          }\n        }\n      }\n    },\n    loginHandler: function loginHandler() {\n      var _this = this;\n\n      Object(_api_fetch_api_js__WEBPACK_IMPORTED_MODULE_3__[\"httpPost\"])({\n        url: _api_api__WEBPACK_IMPORTED_MODULE_2___default.a.logout\n      }).then(function () {\n        _this.$store.commit(\"SET_USER_INFO\", null);\n\n        _this.showLogoutTip();\n      });\n    },\n    showLogoutTip: function showLogoutTip() {// 登出后的提示\n      // alert(\"登出成功\");\n    }\n  },\n  computed: {\n    dplLable: function dplLable() {\n      return this.dataList[this.activeIndex][this.labelProperty];\n    }\n  },\n  created: function created() {}\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24uanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9kcm9wZG93bi9kcm9wZG93bi5qcz85Mzc1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdG1hcFN0YXRlXG59IGZyb20gJ3Z1ZXgnXG5cbmltcG9ydCBhcGkgZnJvbSAnQC9hcGkvYXBpJ1xuaW1wb3J0IHtcblx0aHR0cFBvc3Rcbn0gZnJvbSAnQC9hcGkvZmV0Y2gtYXBpLmpzJ1xuXG5pbXBvcnQgeyBnb3RvVkhJUyB9IGZyb20gJ0AvdXRpbHMvYml6LmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuXHRuYW1lOiBcIkRyb3BEb3duTGlzdFwiLFxuXHRkYXRhKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRhY3RpdmVJbmRleDogMCxcblx0XHRcdHNUaXRsZTogdGhpcy5kYXRhT2JqICYmIHRoaXMuZGF0YU9iai5uYW1lIHx8ICcnLFxuXHRcdH07XG5cdH0sXG5cdHByb3BzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0dHlwZTogU3RyaW5nLFxuXHRcdFx0ZGVmYXVsdCgpIHtcblx0XHRcdFx0cmV0dXJuIFwibmF2XCI7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRkYXRhT2JqOiB7XG5cdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRkZWZhdWx0KCkge1xuXHRcdFx0XHRyZXR1cm4ge307XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRkYXRhTGlzdDoge1xuXHRcdFx0dHlwZTogQXJyYXksXG5cdFx0XHRkZWZhdWx0KCkge1xuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRsYWJlbFByb3BlcnR5OiB7XG5cdFx0XHR0eXBlOiBTdHJpbmcsXG5cdFx0XHRkZWZhdWx0KCkge1xuXHRcdFx0XHRyZXR1cm4gXCJuYW1lXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRkaXJlY3RpdmVzOiB7XG5cdFx0ZHBsOiB7XG5cdFx0XHRiaW5kKGVsKSB7XG5cdFx0XHRcdGVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdG1ldGhvZHM6IHtcblx0XHRvbk5hdkhhbmRsZXIoKSB7XG5cdFx0XHRsZXQgcGF0aCA9IHRoaXMuZGF0YU9iaiAmJiB0aGlzLmRhdGFPYmoucGF0aCB8fCBcIlwiO1xuXHRcdFx0aWYgKHBhdGgpIHtcblx0XHRcdFx0dGhpcy4kcm91dGVyLnB1c2goe1xuXHRcdFx0XHRcdHBhdGg6IHBhdGhcblx0XHRcdFx0fSlcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uT3ZlckhhbmRsZXIoZXZlbnQpIHtcblx0XHRcdGxldCB1bCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzFdO1xuXHRcdFx0dWwuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblx0XHR9LFxuXHRcdG9uT3V0SGFuZGxlcihldmVudCkge1xuXHRcdFx0Ly8gY29uc29sZS5sb2coZXZlbnQpO1xuXHRcdFx0bGV0IHVsID0gZXZlbnQuY3VycmVudFRhcmdldC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMV07XG5cdFx0XHR1bC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0fSxcblx0XHRvbkNsaWNrSGFuZGxlcihldmVudCwgaW5kZXgpIHtcblx0XHRcdC8vIOmakOiXj+WFtuS7llxuXHRcdFx0Ly8gbGV0IHBhdGggPSBldmVudC5wYXRoIHx8IChldmVudC5jb21wb3NlZFBhdGggJiYgZXZlbnQuY29tcG9zZWRQYXRoKCkpOyAvL+WFvOWuueeBq+eLkOWSjHNhZmFyaVxuXHRcdFx0Ly8gcGF0aFsxXS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0XHRpZiAodGhpcy4kcmVmcy51bCkge1xuXHRcdFx0XHR0aGlzLiRyZWZzLnVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8g6YCJ5oupaXRlbVxuXHRcdFx0dGhpcy5hY3RpdmVJbmRleCA9IGluZGV4O1xuXHRcdFx0bGV0IGN1ckRhdGEgPSB0aGlzLmRhdGFMaXN0W2luZGV4XTtcblx0XHRcdGlmICh0aGlzLnR5cGUgPT0gXCJsYW5nXCIpIHtcblx0XHRcdFx0Ly8g5aaC5p6c5piv6K+t6KiA6K6+572u77yM5YiZ6K6+572u6K+t6KiAXG5cdFx0XHRcdGxldCBsYW5nID0gY3VyRGF0YS52YWx1ZTtcblx0XHRcdFx0dGhpcy4kaTE4bi5sb2NhbGUgPSBsYW5nO1xuXHRcdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImxhbmdcIiwgbGFuZyk7XG5cdFx0XHRcdHRoaXMuc1RpdGxlID0gY3VyRGF0YS5uYW1lO1xuXHRcdFx0XHR3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBpZiAoY3VyRGF0YS52YWx1ZSA9PSBcImxvZ291dFwiKSB7XG5cdFx0XHRcdC8vIFx0dGhpcy5sb2dpbkhhbmRsZXIoKTtcblx0XHRcdFx0Ly8gfSBlbHNlIHtcblx0XHRcdFx0Ly8gXHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdC8vIFx0XHRwYXRoOiBjdXJEYXRhLnBhdGhcblx0XHRcdFx0Ly8gXHR9KVxuXHRcdFx0XHQvLyB9XG5cdFx0XHRcdGNvbnNvbGUubG9nKGN1ckRhdGEpO1xuXHRcdFx0XHRsZXQgaXRlbSA9IGN1ckRhdGE7XG5cdFx0XHRcdGxldCBwYXRoID0gaXRlbSAmJiBpdGVtLnBhdGggfHwgXCJcIjtcblx0XHRcdFx0aWYgKHBhdGgpIHtcblx0XHRcdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdFx0XHRwYXRoOiBwYXRoXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsZXQgdmFsdWUgPSBpdGVtICYmIGl0ZW0udmFsdWUgfHwgbnVsbDtcblx0XHRcdFx0XHRpZiAodmFsdWUpIHtcblx0XHRcdFx0XHRcdHN3aXRjaCAodmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSBcImxvZ291dFwiOlxuXHRcdFx0XHRcdFx0XHRcdHRoaXMubG9naW5IYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJnb3RvVkhJU1wiOlxuXHRcdFx0XHRcdFx0XHRcdGdvdG9WSElTKHRoaXMubG9jYWxlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGxvZ2luSGFuZGxlcigpIHtcblx0XHRcdGh0dHBQb3N0KHtcblx0XHRcdFx0dXJsOiBhcGkubG9nb3V0XG5cdFx0XHR9KS50aGVuKCgpID0+IHtcblx0XHRcdFx0dGhpcy4kc3RvcmUuY29tbWl0KFwiU0VUX1VTRVJfSU5GT1wiLCBudWxsKTtcblx0XHRcdFx0dGhpcy5zaG93TG9nb3V0VGlwKCk7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdHNob3dMb2dvdXRUaXAoKSB7XG5cdFx0XHQvLyDnmbvlh7rlkI7nmoTmj5DnpLpcblx0XHRcdC8vIGFsZXJ0KFwi55m75Ye65oiQ5YqfXCIpO1xuXHRcdH1cblx0fSxcblx0Y29tcHV0ZWQ6IHtcblx0XHRkcGxMYWJsZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLmRhdGFMaXN0W3RoaXMuYWN0aXZlSW5kZXhdW3RoaXMubGFiZWxQcm9wZXJ0eV07XG5cdFx0fVxuXHR9LFxuXHRjcmVhdGVkKCkgeyB9LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFJQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFuQkE7QUEwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBREE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFOQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQTdFQTtBQStFQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUE3SEEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/footer/footer.js?vue&type=script&lang=js&":
/*!***************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/components/home/footer/footer.js?vue&type=script&lang=js& ***!
  \***************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  data: function data() {\n    return {\n      key: 'value',\n      qrcodeVisible: false\n    };\n  },\n  components: {},\n  methods: {\n    toPage: function toPage(name) {\n      document.documentElement.scrollTop = 0;\n      document.body.scrollTop = 0;\n      this.$router.push({\n        name: name\n      });\n    },\n    toPath: function toPath(path) {\n      document.documentElement.scrollTop = 0;\n      document.body.scrollTop = 0;\n      this.$router.push({\n        path: path\n      });\n    },\n    initData: function initData() {}\n  },\n  mounted: function mounted() {},\n  created: function created() {}\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIuanM/MGNmNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXBpIGZyb20gJ0AvYXBpL2FwaSdcbmltcG9ydCB7XG5cdGh0dHBHZXQsXG5cdGh0dHBQb3N0XG59IGZyb20gJ0AvYXBpL2ZldGNoLWFwaS5qcydcblxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGRhdGEoKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGtleTogJ3ZhbHVlJyxcblx0XHRcdHFyY29kZVZpc2libGU6IGZhbHNlLFxuXHRcdH1cblx0fSxcblx0Y29tcG9uZW50czoge30sXG5cdG1ldGhvZHM6IHtcblx0XHR0b1BhZ2UobmFtZSkge1xuXHRcdFx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG5cdFx0XHRkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IDA7XG5cdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdG5hbWU6IG5hbWVcblx0XHRcdH0pXG5cdFx0fSxcblx0XHR0b1BhdGgocGF0aCl7XG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcblx0XHRcdGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gMDtcblx0XHRcdHRoaXMuJHJvdXRlci5wdXNoKHtcblx0XHRcdFx0cGF0aDogcGF0aFxuXHRcdFx0fSlcblx0XHR9LFxuXHRcdGluaXREYXRhKCkge31cblx0fSxcblx0bW91bnRlZCgpIHt9LFxuXHRjcmVhdGVkKCkge31cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBZkE7QUFpQkE7QUFDQTtBQTFCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/footer/footer.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/header/header.js?vue&type=script&lang=js&":
/*!***************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/components/home/header/header.js?vue&type=script&lang=js& ***!
  \***************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es7.object.get-own-property-descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\");\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/defineProperty */ \"./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @utils/utils.js */ \"./src/utils/utils.js\");\n/* harmony import */ var _components_home_dropdown_dropdown_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @components/home/dropdown/dropdown.vue */ \"./src/components/home/dropdown/dropdown.vue\");\n/* harmony import */ var _components_home_m_dropdown_m_dropdown_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @components/home/m-dropdown/m-dropdown.vue */ \"./src/components/home/m-dropdown/m-dropdown.vue\");\n\n\n\n\n\n\nvar _name$components$comp;\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_name$components$comp = {\n  name: 'VHeader',\n  components: {\n    VDropdown: _components_home_dropdown_dropdown_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n    MDropdown: _components_home_m_dropdown_m_dropdown_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n  },\n  computed: {\n    i18n: function i18n() {\n      return this.$i18n.messages && this.$i18n.locale ? this.$i18n.messages[this.$i18n.locale] : {};\n    }\n  },\n  data: function data() {\n    return {\n      dropdownMVisible: false,\n      loginMVisible: false,\n      maxClientWidth: 1200,\n      navList: [],\n      loginData: {},\n      langData: {\n        name: \"繁\",\n        path: \"\",\n        list: [{\n          name: \"繁\",\n          path: \"\",\n          value: \"tc\"\n        }, {\n          name: \"简\",\n          path: \"\",\n          value: \"zh\"\n        }, {\n          name: \"EN\",\n          path: \"\",\n          value: \"en\"\n        }]\n      }\n    };\n  }\n}, Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"computed\", _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_5__[\"mapState\"])({\n  isSmallScreen: function isSmallScreen(state) {\n    return state.isSmallScreen;\n  },\n  userInfo: function userInfo(state) {\n    return state.userInfo;\n  }\n}))), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"methods\", {\n  toIndex: function toIndex() {\n    this.$router.push({\n      path: \"/\"\n    });\n  },\n  onShowDropdown: function onShowDropdown(evtStr) {\n    this.dropdownMVisible = false;\n    this.loginMVisible = false;\n\n    if (evtStr == 'nav') {\n      this.dropdownMVisible = true;\n    } else if (evtStr == 'login') {\n      this.loginMVisible = true;\n    } else {}\n  },\n  checkIsSmallScreen: function checkIsSmallScreen() {\n    var self = this;\n\n    if (document.body.clientWidth > self.maxClientWidth) {\n      self.$store.commit('IS_SMALL_SCREEN', false);\n    } else {\n      self.$store.commit('IS_SMALL_SCREEN', true);\n    }\n  },\n  initData: function initData() {\n    var i18n = this.$i18n.messages[this.$i18n.locale] || {}; // this.loginData = i18n.nav.loginData;\n\n    this._buildLoginMenu();\n\n    this.navList = i18n.nav.navList;\n    var curLang = Object(_utils_utils_js__WEBPACK_IMPORTED_MODULE_6__[\"getObjByListKeyValue\"])(this.$i18n.locale, \"value\", this.langData.list);\n    this.langData.name = curLang.name;\n  },\n  _buildLoginMenu: function _buildLoginMenu() {\n    // 构建登录页\n    var i18n = this.$i18n.messages[this.$i18n.locale] || {};\n    var menuData = JSON.parse(JSON.stringify(i18n.nav.loginData));\n    var list = [];\n\n    if (this.userInfo && this.userInfo.name) {\n      menuData.name = this.userInfo.name;\n      menuData.list.forEach(function (element) {\n        if (element.type == \"auth\") {\n          list.push(element);\n        }\n      });\n    } else {\n      menuData.list.forEach(function (element) {\n        if (element.type == \"noAuth\") {\n          list.push(element);\n        }\n      });\n    }\n\n    menuData.list = list;\n    this.$set(this, 'loginData', menuData);\n  }\n}), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"beforeDestroy\", function beforeDestroy() {\n  window.removeEventListener('resize', this.checkIsSmallScreen(), false);\n}), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"mounted\", function mounted() {\n  var _this = this;\n\n  // const self = this;\n  // self.checkIsSmallScreen();\n  // document.body.onresize = () => {\n  // \tself.checkIsSmallScreen();\n  // }\n  window.addEventListener('resize', function () {\n    return _this.checkIsSmallScreen();\n  }, false);\n}), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"watch\", {\n  userInfo: function userInfo(val) {\n    this._buildLoginMenu();\n  }\n}), Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_name$components$comp, \"created\", function created() {\n  this.initData();\n}), _name$components$comp);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIuanM/M2FmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRtYXBTdGF0ZVxufSBmcm9tICd2dWV4J1xuXG5pbXBvcnQge1xuXHRnZXRPYmpCeUxpc3RLZXlWYWx1ZVxufSBmcm9tICdAdXRpbHMvdXRpbHMuanMnXG5pbXBvcnQgVkRyb3Bkb3duIGZyb20gJ0Bjb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24udnVlJ1xuaW1wb3J0IE1Ecm9wZG93biBmcm9tICdAY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWUnXG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0bmFtZTogJ1ZIZWFkZXInLFxuXHRjb21wb25lbnRzOiB7XG5cdFx0VkRyb3Bkb3duLFxuXHRcdE1Ecm9wZG93blxuXHR9LFxuXHRjb21wdXRlZDoge1xuXHRcdGkxOG4oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy4kaTE4bi5tZXNzYWdlcyAmJiB0aGlzLiRpMThuLmxvY2FsZSA/IHRoaXMuJGkxOG4ubWVzc2FnZXNbdGhpcy4kaTE4bi5sb2NhbGVdIDoge307XG5cdFx0fVxuXHR9LFxuXHRkYXRhKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRkcm9wZG93bk1WaXNpYmxlOiBmYWxzZSxcblx0XHRcdGxvZ2luTVZpc2libGU6IGZhbHNlLFxuXHRcdFx0bWF4Q2xpZW50V2lkdGg6IDEyMDAsXG5cdFx0XHRuYXZMaXN0OiBbXSxcblx0XHRcdGxvZ2luRGF0YToge30sXG5cdFx0XHRsYW5nRGF0YToge1xuXHRcdFx0XHRuYW1lOiBcIue5gVwiLFxuXHRcdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRcdFx0bmFtZTogXCLnuYFcIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJ0Y1wiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIueugFwiLFxuXHRcdFx0XHRcdFx0cGF0aDogXCJcIixcblx0XHRcdFx0XHRcdHZhbHVlOiBcInpoXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiRU5cIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJlblwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0Y29tcHV0ZWQ6IHtcblx0XHQuLi5tYXBTdGF0ZSh7XG5cdFx0XHRpc1NtYWxsU2NyZWVuOiBzdGF0ZSA9PiBzdGF0ZS5pc1NtYWxsU2NyZWVuLFxuXHRcdFx0dXNlckluZm86IHN0YXRlID0+IHN0YXRlLnVzZXJJbmZvXG5cdFx0fSlcblx0fSxcblx0bWV0aG9kczoge1xuXHRcdHRvSW5kZXgoKSB7XG5cdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdHBhdGg6IFwiL1wiXG5cdFx0XHR9KVxuXHRcdH0sXG5cdFx0b25TaG93RHJvcGRvd24oZXZ0U3RyKSB7XG5cdFx0XHR0aGlzLmRyb3Bkb3duTVZpc2libGUgPSBmYWxzZTtcblx0XHRcdHRoaXMubG9naW5NVmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0aWYgKGV2dFN0ciA9PSAnbmF2Jykge1xuXHRcdFx0XHR0aGlzLmRyb3Bkb3duTVZpc2libGUgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChldnRTdHIgPT0gJ2xvZ2luJykge1xuXHRcdFx0XHR0aGlzLmxvZ2luTVZpc2libGUgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHt9XG5cdFx0fSxcblx0XHRjaGVja0lzU21hbGxTY3JlZW4oKSB7XG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdGlmIChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoID4gc2VsZi5tYXhDbGllbnRXaWR0aCkge1xuXHRcdFx0XHRzZWxmLiRzdG9yZS5jb21taXQoJ0lTX1NNQUxMX1NDUkVFTicsIGZhbHNlKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi4kc3RvcmUuY29tbWl0KCdJU19TTUFMTF9TQ1JFRU4nLCB0cnVlKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aW5pdERhdGEoKSB7XG5cdFx0XHRsZXQgaTE4biA9IHRoaXMuJGkxOG4ubWVzc2FnZXNbdGhpcy4kaTE4bi5sb2NhbGVdIHx8IHt9O1xuXHRcdFx0Ly8gdGhpcy5sb2dpbkRhdGEgPSBpMThuLm5hdi5sb2dpbkRhdGE7XG5cdFx0XHR0aGlzLl9idWlsZExvZ2luTWVudSgpO1xuXHRcdFx0dGhpcy5uYXZMaXN0ID0gaTE4bi5uYXYubmF2TGlzdDtcblx0XHRcdGxldCBjdXJMYW5nID0gZ2V0T2JqQnlMaXN0S2V5VmFsdWUodGhpcy4kaTE4bi5sb2NhbGUsIFwidmFsdWVcIiwgdGhpcy5sYW5nRGF0YS5saXN0KVxuXHRcdFx0dGhpcy5sYW5nRGF0YS5uYW1lID0gY3VyTGFuZy5uYW1lO1xuXHRcdH0sXG5cdFx0X2J1aWxkTG9naW5NZW51KCkge1xuXHRcdFx0Ly8g5p6E5bu655m75b2V6aG1XG5cdFx0XHRsZXQgaTE4biA9IHRoaXMuJGkxOG4ubWVzc2FnZXNbdGhpcy4kaTE4bi5sb2NhbGVdIHx8IHt9O1xuXHRcdFx0bGV0IG1lbnVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpMThuLm5hdi5sb2dpbkRhdGEpKTtcblx0XHRcdGxldCBsaXN0ID0gW107XG5cdFx0XHRpZiAodGhpcy51c2VySW5mbyAmJiB0aGlzLnVzZXJJbmZvLm5hbWUpIHtcblx0XHRcdFx0bWVudURhdGEubmFtZSA9IHRoaXMudXNlckluZm8ubmFtZTtcblx0XHRcdFx0bWVudURhdGEubGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXHRcdFx0XHRcdGlmIChlbGVtZW50LnR5cGUgPT0gXCJhdXRoXCIpIHtcblx0XHRcdFx0XHRcdGxpc3QucHVzaChlbGVtZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWVudURhdGEubGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXHRcdFx0XHRcdGlmIChlbGVtZW50LnR5cGUgPT0gXCJub0F1dGhcIikge1xuXHRcdFx0XHRcdFx0bGlzdC5wdXNoKGVsZW1lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRtZW51RGF0YS5saXN0ID0gbGlzdDtcblx0XHRcdHRoaXMuJHNldCh0aGlzLCAnbG9naW5EYXRhJywgbWVudURhdGEpO1xuXHRcdH1cblx0fSxcblx0YmVmb3JlRGVzdHJveSgpIHtcblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5jaGVja0lzU21hbGxTY3JlZW4oKSwgZmFsc2UpXG5cdH0sXG5cdG1vdW50ZWQoKSB7XG5cdFx0Ly8gY29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0Ly8gc2VsZi5jaGVja0lzU21hbGxTY3JlZW4oKTtcblx0XHQvLyBkb2N1bWVudC5ib2R5Lm9ucmVzaXplID0gKCkgPT4ge1xuXHRcdC8vIFx0c2VsZi5jaGVja0lzU21hbGxTY3JlZW4oKTtcblx0XHQvLyB9XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuY2hlY2tJc1NtYWxsU2NyZWVuKCksIGZhbHNlKTtcblxuXHR9LFxuXHR3YXRjaDoge1xuXHRcdHVzZXJJbmZvKHZhbCkge1xuXHRcdFx0dGhpcy5fYnVpbGRMb2dpbk1lbnUoKTtcblx0XHR9XG5cdH0sXG5cdGNyZWF0ZWQoKSB7XG5cdFx0dGhpcy5pbml0RGF0YSgpO1xuXHR9LFxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBSUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFiQTtBQU5BO0FBMkJBO0FBdkNBO0FBMENBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBcERBO0FBdURBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/header/header.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&":
/*!***********************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js& ***!
  \***********************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es7.object.get-own-property-descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\");\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/defineProperty */ \"./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n/* harmony import */ var _utils_biz_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/utils/biz.js */ \"./src/utils/biz.js\");\n\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  name: \"DropDownList\",\n  data: function data() {\n    return {\n      navList: [],\n      activeNames: [],\n      activeName: [],\n      activeIndex: -1,\n      borderBoo: false\n    };\n  },\n  props: {\n    visible: {\n      type: Boolean,\n      default: function _default() {\n        return false;\n      }\n    },\n    type: {\n      type: String,\n      default: function _default() {\n        return \"nav\";\n      }\n    },\n    langList: {\n      type: Array,\n      default: function _default() {\n        return [];\n      }\n    },\n    // 显示/隐藏移动端导航\n    showDropdownM: {\n      type: Function,\n      default: null\n    }\n  },\n  computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_5__[\"mapState\"])({\n    isSmallScreen: function isSmallScreen(state) {\n      return state.isSmallScreen;\n    },\n    userInfo: function userInfo(state) {\n      return state.userInfo;\n    }\n  }), {\n    locale: function locale() {\n      return this.$i18n.locale || 'tc';\n    },\n    i18n: function i18n() {\n      return this.$i18n.messages && this.$i18n.locale ? this.$i18n.messages[this.$i18n.locale] : {};\n    }\n  }),\n  methods: {\n    // 跳转菜单\n    onClickHandler: function onClickHandler(item) {\n      var path = item && item.path || \"\";\n\n      if (path) {\n        this.showDropdownM('');\n        this.$router.push({\n          path: path\n        });\n      } else {\n        var value = item && item.value || null;\n\n        if (value) {\n          switch (value) {\n            case \"logout\":\n              this.loginHandler();\n              break;\n\n            case \"gotoVHIS\":\n              Object(_utils_biz_js__WEBPACK_IMPORTED_MODULE_8__[\"gotoVHIS\"])(this.locale);\n              break;\n          }\n        }\n      }\n    },\n    loginHandler: function loginHandler() {\n      var _this = this;\n\n      Object(_api_fetch_api_js__WEBPACK_IMPORTED_MODULE_7__[\"httpPost\"])({\n        url: _api_api__WEBPACK_IMPORTED_MODULE_6___default.a.logout\n      }).then(function () {\n        _this.$store.commit(\"SET_USER_INFO\", null);\n\n        _this.showLogoutTip();\n      });\n    },\n    // 点击item\n    onChangeHandler: function onChangeHandler(evt) {\n      this.activeIndex = evt;\n    },\n\n    /**\n     * 设置语言\n     */\n    setLangHandler: function setLangHandler(curData) {\n      this.showDropdownM(''); // 如果是语言设置,则设置语言\n\n      var lang = curData.value;\n      this.$i18n.locale = lang;\n      localStorage.setItem(\"lang\", lang);\n      this.sTitle = curData.name;\n      window.location.reload();\n    },\n    initData: function initData() {\n      var _this2 = this;\n\n      var navList = [];\n\n      if (this.type == \"nav\") {\n        navList = this.i18n.nav.navList;\n        navList.forEach(function (element) {\n          _this2.activeNames.push([]);\n        });\n      } else if (this.type == \"login\") {\n        // 构建登陆页面\n        var i18n = this.$i18n.messages[this.$i18n.locale] || {};\n        var menuData = JSON.parse(JSON.stringify(i18n.nav.loginData));\n        var list = [];\n\n        if (this.userInfo && this.userInfo.name) {\n          menuData.name = this.userInfo.name;\n          menuData.list.forEach(function (element) {\n            if (element.type == \"auth\") {\n              list.push(element);\n            }\n          });\n        } else {\n          menuData.list.forEach(function (element) {\n            if (element.type == \"noAuth\") {\n              list.push(element);\n            }\n          });\n        } // menuData.list = list;\n\n\n        navList = list; // console.log(\"navList:\", navList);\n      }\n\n      this.navList = navList;\n    }\n  },\n  created: function created() {\n    this.initData();\n  },\n  watch: {\n    visible: function visible(newVal, oldVal) {\n      var _this3 = this;\n\n      this.$nextTick(function () {\n        _this3.$refs.panel.scrollTop = 0;\n      });\n    },\n    userInfo: function userInfo(val) {\n      this.initData();\n    }\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvbS1kcm9wZG93bi9tLWRyb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvbS1kcm9wZG93bi9tLWRyb3Bkb3duLmpzPzNmNDQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0bWFwU3RhdGVcbn0gZnJvbSAndnVleCdcblxuaW1wb3J0IGFwaSBmcm9tICdAL2FwaS9hcGknXG5pbXBvcnQge1xuXHRodHRwUG9zdFxufSBmcm9tICdAL2FwaS9mZXRjaC1hcGkuanMnXG5cbmltcG9ydCB7IGdvdG9WSElTIH0gZnJvbSAnQC91dGlscy9iaXouanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cdG5hbWU6IFwiRHJvcERvd25MaXN0XCIsXG5cdGRhdGEoKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hdkxpc3Q6IFtdLFxuXHRcdFx0YWN0aXZlTmFtZXM6IFtdLFxuXHRcdFx0YWN0aXZlTmFtZTogW10sXG5cdFx0XHRhY3RpdmVJbmRleDogLTEsXG5cdFx0XHRib3JkZXJCb286IGZhbHNlXG5cdFx0fTtcblx0fSxcblx0cHJvcHM6IHtcblx0XHR2aXNpYmxlOiB7XG5cdFx0XHR0eXBlOiBCb29sZWFuLFxuXHRcdFx0ZGVmYXVsdCgpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0dHlwZToge1xuXHRcdFx0dHlwZTogU3RyaW5nLFxuXHRcdFx0ZGVmYXVsdCgpIHtcblx0XHRcdFx0cmV0dXJuIFwibmF2XCI7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRsYW5nTGlzdDoge1xuXHRcdFx0dHlwZTogQXJyYXksXG5cdFx0XHRkZWZhdWx0KCkge1xuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyDmmL7npLov6ZqQ6JeP56e75Yqo56uv5a+86IiqXG5cdFx0c2hvd0Ryb3Bkb3duTToge1xuXHRcdFx0dHlwZTogRnVuY3Rpb24sXG5cdFx0XHRkZWZhdWx0OiBudWxsXG5cdFx0fSxcblx0fSxcblx0Y29tcHV0ZWQ6IHtcblx0XHQuLi5tYXBTdGF0ZSh7XG5cdFx0XHRpc1NtYWxsU2NyZWVuOiBzdGF0ZSA9PiBzdGF0ZS5pc1NtYWxsU2NyZWVuLFxuXHRcdFx0dXNlckluZm86IHN0YXRlID0+IHN0YXRlLnVzZXJJbmZvXG5cdFx0fSksXG5cdFx0bG9jYWxlKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuJGkxOG4ubG9jYWxlIHx8ICd0Yyc7XG5cdFx0fSxcblx0XHRpMThuKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuJGkxOG4ubWVzc2FnZXMgJiYgdGhpcy4kaTE4bi5sb2NhbGUgPyB0aGlzLiRpMThuLm1lc3NhZ2VzW3RoaXMuJGkxOG4ubG9jYWxlXSA6IHt9O1xuXHRcdH0sXG5cdH0sXG5cdG1ldGhvZHM6IHtcblx0XHQvLyDot7Povazoj5zljZVcblx0XHRvbkNsaWNrSGFuZGxlcihpdGVtKSB7XG5cdFx0XHRsZXQgcGF0aCA9IGl0ZW0gJiYgaXRlbS5wYXRoIHx8IFwiXCI7XG5cdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHR0aGlzLnNob3dEcm9wZG93bk0oJycpO1xuXHRcdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdFx0cGF0aDogcGF0aFxuXHRcdFx0XHR9KVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGV0IHZhbHVlID0gaXRlbSAmJiBpdGVtLnZhbHVlIHx8IG51bGw7XG5cdFx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRcdHN3aXRjaCAodmFsdWUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJsb2dvdXRcIjpcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dpbkhhbmRsZXIoKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiZ290b1ZISVNcIjpcblx0XHRcdFx0XHRcdFx0Z290b1ZISVModGhpcy5sb2NhbGUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGxvZ2luSGFuZGxlcigpIHtcblx0XHRcdGh0dHBQb3N0KHtcblx0XHRcdFx0dXJsOiBhcGkubG9nb3V0XG5cdFx0XHR9KS50aGVuKCgpID0+IHtcblx0XHRcdFx0dGhpcy4kc3RvcmUuY29tbWl0KFwiU0VUX1VTRVJfSU5GT1wiLCBudWxsKTtcblx0XHRcdFx0dGhpcy5zaG93TG9nb3V0VGlwKCk7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdC8vIOeCueWHu2l0ZW1cblx0XHRvbkNoYW5nZUhhbmRsZXIoZXZ0KSB7XG5cdFx0XHR0aGlzLmFjdGl2ZUluZGV4ID0gZXZ0O1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICog6K6+572u6K+t6KiAXG5cdFx0ICovXG5cdFx0c2V0TGFuZ0hhbmRsZXIoY3VyRGF0YSkge1xuXHRcdFx0dGhpcy5zaG93RHJvcGRvd25NKCcnKTtcblx0XHRcdC8vIOWmguaenOaYr+ivreiogOiuvue9ru+8jOWImeiuvue9ruivreiogFxuXHRcdFx0bGV0IGxhbmcgPSBjdXJEYXRhLnZhbHVlO1xuXHRcdFx0dGhpcy4kaTE4bi5sb2NhbGUgPSBsYW5nO1xuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJsYW5nXCIsIGxhbmcpO1xuXHRcdFx0dGhpcy5zVGl0bGUgPSBjdXJEYXRhLm5hbWU7XG5cdFx0XHR3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG5cdFx0fSxcblx0XHRpbml0RGF0YSgpIHtcblx0XHRcdGxldCBuYXZMaXN0ID0gW107XG5cdFx0XHRpZiAodGhpcy50eXBlID09IFwibmF2XCIpIHtcblx0XHRcdFx0bmF2TGlzdCA9IHRoaXMuaTE4bi5uYXYubmF2TGlzdDtcblx0XHRcdFx0bmF2TGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXHRcdFx0XHRcdHRoaXMuYWN0aXZlTmFtZXMucHVzaChcblx0XHRcdFx0XHRcdFtdXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy50eXBlID09IFwibG9naW5cIikge1xuXHRcdFx0XHQvLyDmnoTlu7rnmbvpmYbpobXpnaJcblx0XHRcdFx0bGV0IGkxOG4gPSB0aGlzLiRpMThuLm1lc3NhZ2VzW3RoaXMuJGkxOG4ubG9jYWxlXSB8fCB7fTtcblx0XHRcdFx0bGV0IG1lbnVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpMThuLm5hdi5sb2dpbkRhdGEpKTtcblx0XHRcdFx0bGV0IGxpc3QgPSBbXTtcblx0XHRcdFx0aWYgKHRoaXMudXNlckluZm8gJiYgdGhpcy51c2VySW5mby5uYW1lKSB7XG5cdFx0XHRcdFx0bWVudURhdGEubmFtZSA9IHRoaXMudXNlckluZm8ubmFtZTtcblx0XHRcdFx0XHRtZW51RGF0YS5saXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudC50eXBlID09IFwiYXV0aFwiKSB7XG5cdFx0XHRcdFx0XHRcdGxpc3QucHVzaChlbGVtZW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtZW51RGF0YS5saXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudC50eXBlID09IFwibm9BdXRoXCIpIHtcblx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKGVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIG1lbnVEYXRhLmxpc3QgPSBsaXN0O1xuXHRcdFx0XHRuYXZMaXN0ID0gbGlzdDtcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJuYXZMaXN0OlwiLCBuYXZMaXN0KTtcblx0XHRcdH1cblx0XHRcdHRoaXMubmF2TGlzdCA9IG5hdkxpc3Q7XG5cblx0XHR9XG5cdH0sXG5cdGNyZWF0ZWQoKSB7XG5cdFx0dGhpcy5pbml0RGF0YSgpO1xuXHR9LFxuXHR3YXRjaDoge1xuXHRcdHZpc2libGUobmV3VmFsLCBvbGRWYWwpIHtcblx0XHRcdHRoaXMuJG5leHRUaWNrKCgpID0+IHtcblx0XHRcdFx0dGhpcy4kcmVmcy5wYW5lbC5zY3JvbGxUb3AgPSAwO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHR1c2VySW5mbyh2YWwpIHtcblx0XHRcdHRoaXMuaW5pdERhdGEoKTtcblx0XHR9XG5cdH0sXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFJQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBcEJBO0FBeUJBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQWpGQTtBQW1GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUF0SUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/pages/index/index.js?vue&type=script&lang=js&":
/*!******************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./src/pages/index?vue&type=script&lang=js& ***!
  \******************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es7.object.get-own-property-descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\");\n/* harmony import */ var core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_object_get_own_property_descriptors__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/defineProperty */ \"./node_modules/_@babel_runtime@7.6.3@@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/api/api */ \"./src/api/api.js\");\n/* harmony import */ var _api_api__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_api_api__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _api_fetch_api_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/api/fetch-api.js */ \"./src/api/fetch-api.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _utils_biz_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/utils/biz.js */ \"./src/utils/biz.js\");\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { Object(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\nvar UA = __webpack_require__(/*! ua-device */ \"./node_modules/_ua-device@0.1.10@ua-device/index.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  data: function data() {\n    return {\n      key: 'value',\n      // swiper\n      swiperOption: {\n        // navigation: {\n        // \tnextEl: '.swiper-button-next',\n        // \tprevEl: '.swiper-button-prev'\n        // },\n        pagination: {\n          el: '.swiper-pagination',\n          clickable: true\n        },\n        autoplay: {\n          delay: 5000,\n          stopOnLastSlide: false,\n          disableOnInteraction: false\n        },\n        speed: 1000\n      },\n      // 视频\n      playerOptions: {}\n    };\n  },\n  components: {},\n  computed: _objectSpread({}, Object(vuex__WEBPACK_IMPORTED_MODULE_6__[\"mapState\"])({\n    isSmallScreen: function isSmallScreen(state) {\n      return state.isSmallScreen;\n    }\n  }), {\n    locale: function locale() {\n      return this.$i18n.locale || 'tc';\n    },\n    i18n: function i18n() {\n      return this.$i18n.messages && this.$i18n.locale ? this.$i18n.messages[this.$i18n.locale] : {};\n    },\n    player: function player() {\n      return this.$refs.videoPlayer.player;\n    }\n  }),\n  methods: {\n    toVhis: function toVhis() {\n      Object(_utils_biz_js__WEBPACK_IMPORTED_MODULE_7__[\"gotoVHIS\"])(this.locale);\n    },\n\n    /**\n     * 推荐产品\n     */\n    onRecommendHandler: function onRecommendHandler(val) {\n      if (val == 1) {\n        this.$router.push({\n          path: \"/product\"\n        });\n      }\n\n      if (val == 2) {\n        this.$router.push({\n          path: \"/custom/service?q=m6\"\n        });\n      }\n\n      if (val == 3) {\n        this.$router.push({\n          path: \"/custom/product\"\n        });\n      }\n\n      if (val == 4) {\n        this.$router.push({\n          path: \"/news/list\"\n        });\n      }\n    },\n\n    /**\n     * 推荐产品\n     */\n    onMoreNewsHandler: function onMoreNewsHandler() {\n      this.$router.push({\n        path: \"/news/list\"\n      });\n    },\n\n    /**\n     * 去新闻详情页面\n     * 需要带id\n     */\n    toNewsDetail: function toNewsDetail() {\n      this.$router.push({\n        path: '/news/detail'\n      });\n    },\n    toProfile: function toProfile() {\n      this.$router.push({\n        path: '/profile'\n      });\n    },\n    refreshVideoPlayer: function refreshVideoPlayer() {\n      var playerOptions = {\n        width: 800,\n        height: 450,\n        // aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如\"16:9\"或\"4:3\")\n        autoplay: false,\n        //如果true,浏览器准备好时开始回放。\n        muted: true,\n        // 默认情况下将会消除任何音频。\n        language: 'en',\n        // playbackRates: [0.7, 1.0, 1.5, 2.0],//播放速度\n        sources: [{\n          type: \"video/mp4\",\n          // mp4\n          src: \"https://ow.go.qudone.com/jyesupload/ee516bb327484197b7ca72f3dc4be9e6.mp4\" // webm\n          // src: \"https://cdn.theguardian.tv/webM/2015/07/20/150716YesMen_synd_768k_vp8.webm\"\n\n        }],\n        poster: 'images/video-poster.png',\n        controlBar: {\n          timeDivider: true,\n          durationDisplay: true,\n          remainingTimeDisplay: false,\n          fullscreenToggle: true //全屏按钮\n\n        }\n      };\n      var output = new UA(navigator.userAgent);\n      var deviceType = output.device.type;\n      var isMobile = deviceType == \"mobile\"; // if (this.isSmallScreen) {\n\n      if (isMobile) {\n        playerOptions.aspectRatio = \"16:9\";\n      }\n\n      this.playerOptions = playerOptions;\n    },\n    initData: function initData() {}\n  },\n  beforeDestroy: function beforeDestroy() {\n    window.removeEventListener('resize', this.refreshVideoPlayer(), false);\n  },\n  mounted: function mounted() {\n    var _this = this;\n\n    this.refreshVideoPlayer();\n    window.addEventListener('resize', function () {\n      return _this.refreshVideoPlayer();\n    }, false);\n  },\n  created: function created() {}\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPyEuL3NyYy9wYWdlcy9pbmRleC9pbmRleC5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXguanM/NDRlYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXBpIGZyb20gJ0AvYXBpL2FwaSc7XG5pbXBvcnQge1xuXHRodHRwR2V0LFxuXHRodHRwUG9zdFxufSBmcm9tICdAL2FwaS9mZXRjaC1hcGkuanMnO1xuaW1wb3J0IHtcblx0bWFwR2V0dGVycyxcblx0bWFwQWN0aW9ucyxcblx0bWFwU3RhdGVcbn0gZnJvbSBcInZ1ZXhcIjtcbnZhciBVQSA9IHJlcXVpcmUoXCJ1YS1kZXZpY2VcIik7XG5cbmltcG9ydCB7IGdvdG9WSElTIH0gZnJvbSAnQC91dGlscy9iaXouanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGRhdGEoKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGtleTogJ3ZhbHVlJyxcblx0XHRcdC8vIHN3aXBlclxuXHRcdFx0c3dpcGVyT3B0aW9uOiB7XG5cdFx0XHRcdC8vIG5hdmlnYXRpb246IHtcblx0XHRcdFx0Ly8gXHRuZXh0RWw6ICcuc3dpcGVyLWJ1dHRvbi1uZXh0Jyxcblx0XHRcdFx0Ly8gXHRwcmV2RWw6ICcuc3dpcGVyLWJ1dHRvbi1wcmV2J1xuXHRcdFx0XHQvLyB9LFxuXHRcdFx0XHRwYWdpbmF0aW9uOiB7XG5cdFx0XHRcdFx0ZWw6ICcuc3dpcGVyLXBhZ2luYXRpb24nLFxuXHRcdFx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0YXV0b3BsYXk6IHtcblx0XHRcdFx0XHRkZWxheTogNTAwMCxcblx0XHRcdFx0XHRzdG9wT25MYXN0U2xpZGU6IGZhbHNlLFxuXHRcdFx0XHRcdGRpc2FibGVPbkludGVyYWN0aW9uOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzcGVlZDogMTAwMCxcblxuXHRcdFx0fSxcblx0XHRcdC8vIOinhumikVxuXHRcdFx0cGxheWVyT3B0aW9uczoge30sXG5cblx0XHR9XG5cdH0sXG5cdGNvbXBvbmVudHM6IHt9LFxuXHRjb21wdXRlZDoge1xuXHRcdC4uLm1hcFN0YXRlKHtcblx0XHRcdGlzU21hbGxTY3JlZW46IHN0YXRlID0+IHN0YXRlLmlzU21hbGxTY3JlZW5cblx0XHR9KSxcblx0XHRsb2NhbGUoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy4kaTE4bi5sb2NhbGUgfHwgJ3RjJztcblx0XHR9LFxuXHRcdGkxOG4oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy4kaTE4bi5tZXNzYWdlcyAmJiB0aGlzLiRpMThuLmxvY2FsZSA/IHRoaXMuJGkxOG4ubWVzc2FnZXNbdGhpcy4kaTE4bi5sb2NhbGVdIDoge307XG5cdFx0fSxcblx0XHRwbGF5ZXIoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy4kcmVmcy52aWRlb1BsYXllci5wbGF5ZXJcblx0XHR9LFxuXG5cdH0sXG5cdG1ldGhvZHM6IHtcblx0XHR0b1ZoaXMoKXtcblx0XHRcdGdvdG9WSElTKHRoaXMubG9jYWxlKTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIOaOqOiNkOS6p+WTgVxuXHRcdCAqL1xuXHRcdG9uUmVjb21tZW5kSGFuZGxlcih2YWwpIHtcblx0XHRcdGlmICh2YWwgPT0gMSkge1xuXHRcdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdFx0cGF0aDogXCIvcHJvZHVjdFwiXG5cdFx0XHRcdH0pXG5cdFx0XHR9XG5cdFx0XHRpZiAodmFsID09IDIpIHtcblx0XHRcdFx0dGhpcy4kcm91dGVyLnB1c2goe1xuXHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTZcIlxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXHRcdFx0aWYgKHZhbCA9PSAzKSB7XG5cdFx0XHRcdHRoaXMuJHJvdXRlci5wdXNoKHtcblx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vcHJvZHVjdFwiXG5cdFx0XHRcdH0pXG5cdFx0XHR9XG5cdFx0XHRpZih2YWwgPT0gNCl7XG5cdFx0XHRcdHRoaXMuJHJvdXRlci5wdXNoKHtcblx0XHRcdFx0XHRwYXRoOiBcIi9uZXdzL2xpc3RcIlxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIOaOqOiNkOS6p+WTgVxuXHRcdCAqL1xuXHRcdG9uTW9yZU5ld3NIYW5kbGVyKCkge1xuXHRcdFx0dGhpcy4kcm91dGVyLnB1c2goe1xuXHRcdFx0XHRwYXRoOiBcIi9uZXdzL2xpc3RcIlxuXHRcdFx0fSlcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICog5Y675paw6Ze76K+m5oOF6aG16Z2iXG5cdFx0ICog6ZyA6KaB5bimaWRcblx0XHQgKi9cblx0XHR0b05ld3NEZXRhaWwoKSB7XG5cdFx0XHR0aGlzLiRyb3V0ZXIucHVzaCh7XG5cdFx0XHRcdHBhdGg6ICcvbmV3cy9kZXRhaWwnXG5cdFx0XHR9KVxuXHRcdH0sXG5cdFx0dG9Qcm9maWxlKCkge1xuXHRcdFx0dGhpcy4kcm91dGVyLnB1c2goe1xuXHRcdFx0XHRwYXRoOiAnL3Byb2ZpbGUnXG5cdFx0XHR9KVxuXHRcdH0sXG5cdFx0cmVmcmVzaFZpZGVvUGxheWVyKCkge1xuXG5cdFx0XHRsZXQgcGxheWVyT3B0aW9ucyA9IHtcblx0XHRcdFx0d2lkdGg6IDgwMCxcblx0XHRcdFx0aGVpZ2h0OiA0NTAsXG5cdFx0XHRcdC8vIGFzcGVjdFJhdGlvOiAnMTY6OScsIC8vIOWwhuaSreaUvuWZqOe9ruS6jua1geeVheaooeW8j++8jOW5tuWcqOiuoeeul+aSreaUvuWZqOeahOWKqOaAgeWkp+Wwj+aXtuS9v+eUqOivpeWAvOOAguWAvOW6lOivpeS7o+ihqOS4gOS4quavlOS+iyAtIOeUqOWGkuWPt+WIhumalOeahOS4pOS4quaVsOWtl++8iOS+i+WmglwiMTY6OVwi5oiWXCI0OjNcIu+8iVxuXHRcdFx0XHRhdXRvcGxheTogZmFsc2UsIC8v5aaC5p6cdHJ1ZSzmtY/op4jlmajlh4blpIflpb3ml7blvIDlp4vlm57mlL7jgIJcblx0XHRcdFx0bXV0ZWQ6IHRydWUsIC8vIOm7mOiupOaDheWGteS4i+WwhuS8mua2iOmZpOS7u+S9lemfs+mikeOAglxuXHRcdFx0XHRsYW5ndWFnZTogJ2VuJyxcblx0XHRcdFx0Ly8gcGxheWJhY2tSYXRlczogWzAuNywgMS4wLCAxLjUsIDIuMF0sLy/mkq3mlL7pgJ/luqZcblx0XHRcdFx0c291cmNlczogW3tcblx0XHRcdFx0XHR0eXBlOiBcInZpZGVvL21wNFwiLFxuXHRcdFx0XHRcdC8vIG1wNFxuXHRcdFx0XHRcdHNyYzogXCJodHRwczovL293LmdvLnF1ZG9uZS5jb20vanllc3VwbG9hZC9lZTUxNmJiMzI3NDg0MTk3YjdjYTcyZjNkYzRiZTllNi5tcDRcIixcblx0XHRcdFx0XHQvLyB3ZWJtXG5cdFx0XHRcdFx0Ly8gc3JjOiBcImh0dHBzOi8vY2RuLnRoZWd1YXJkaWFuLnR2L3dlYk0vMjAxNS8wNy8yMC8xNTA3MTZZZXNNZW5fc3luZF83NjhrX3ZwOC53ZWJtXCJcblx0XHRcdFx0fV0sXG5cdFx0XHRcdHBvc3RlcjogJ2ltYWdlcy92aWRlby1wb3N0ZXIucG5nJyxcblx0XHRcdFx0Y29udHJvbEJhcjoge1xuXHRcdFx0XHRcdHRpbWVEaXZpZGVyOiB0cnVlLFxuXHRcdFx0XHRcdGR1cmF0aW9uRGlzcGxheTogdHJ1ZSxcblx0XHRcdFx0XHRyZW1haW5pbmdUaW1lRGlzcGxheTogZmFsc2UsXG5cdFx0XHRcdFx0ZnVsbHNjcmVlblRvZ2dsZTogdHJ1ZSAvL+WFqOWxj+aMiemSrlxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsZXQgb3V0cHV0ID0gbmV3IFVBKG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXHRcdFx0bGV0IGRldmljZVR5cGUgPSBvdXRwdXQuZGV2aWNlLnR5cGU7XG5cdFx0XHRsZXQgaXNNb2JpbGUgPSBkZXZpY2VUeXBlID09IFwibW9iaWxlXCI7XG5cdFx0XHQvLyBpZiAodGhpcy5pc1NtYWxsU2NyZWVuKSB7XG5cdFx0XHRpZiAoaXNNb2JpbGUpIHtcblx0XHRcdFx0cGxheWVyT3B0aW9ucy5hc3BlY3RSYXRpbyA9IFwiMTY6OVwiO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5wbGF5ZXJPcHRpb25zID0gcGxheWVyT3B0aW9ucztcblx0XHR9LFxuXHRcdGluaXREYXRhKCkge31cblx0fSxcblx0YmVmb3JlRGVzdHJveSgpIHtcblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZWZyZXNoVmlkZW9QbGF5ZXIoKSwgZmFsc2UpO1xuXHR9LFxuXHRtb3VudGVkKCkge1xuXHRcdHRoaXMucmVmcmVzaFZpZGVvUGxheWVyKCk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMucmVmcmVzaFZpZGVvUGxheWVyKCksIGZhbHNlKTtcblx0fSxcblx0Y3JlYXRlZCgpIHtcblxuXHR9XG5cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQWRBO0FBaUJBO0FBQ0E7QUFyQkE7QUF3QkE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQU5BO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQWhCQTtBQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBeEZBO0FBMEZBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQTVJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/pages/index/index.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=template&id=7ba5bd90&":
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"274ecb62-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=template&id=7ba5bd90& ***!
  \***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\n    \"div\",\n    { attrs: { id: \"app\" } },\n    [\n      _c(\"v-header\", { staticClass: \"header\" }),\n      _c(\n        \"main\",\n        { ref: \"container\", staticClass: \"main-container\" },\n        [_c(\"router-view\")],\n        1\n      ),\n      _c(\"v-footer\")\n    ],\n    1\n  )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIyNzRlY2I2Mi12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9BcHAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdiYTViZDkwJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9BcHAudnVlPzdlZWUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcbiAgICBcImRpdlwiLFxuICAgIHsgYXR0cnM6IHsgaWQ6IFwiYXBwXCIgfSB9LFxuICAgIFtcbiAgICAgIF9jKFwidi1oZWFkZXJcIiwgeyBzdGF0aWNDbGFzczogXCJoZWFkZXJcIiB9KSxcbiAgICAgIF9jKFxuICAgICAgICBcIm1haW5cIixcbiAgICAgICAgeyByZWY6IFwiY29udGFpbmVyXCIsIHN0YXRpY0NsYXNzOiBcIm1haW4tY29udGFpbmVyXCIgfSxcbiAgICAgICAgW19jKFwicm91dGVyLXZpZXdcIildLFxuICAgICAgICAxXG4gICAgICApLFxuICAgICAgX2MoXCJ2LWZvb3RlclwiKVxuICAgIF0sXG4gICAgMVxuICApXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=template&id=7ba5bd90&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&":
/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"274ecb62-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& ***!
  \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\"div\", [\n    _c(\n      \"div\",\n      {\n        staticClass: \"drop-list\",\n        class: { login: _vm.type == \"login\" },\n        on: {\n          mouseover: function($event) {\n            return _vm.onOverHandler($event)\n          },\n          mouseout: function($event) {\n            return _vm.onOutHandler($event)\n          }\n        }\n      },\n      [\n        _vm.type == \"login\"\n          ? [\n              _c(\"div\", { staticClass: \"user\" }, [\n                _c(\"img\", {\n                  staticClass: \"icon-img\",\n                  attrs: { src: __webpack_require__(/*! @/assets/images/home/icon-user.png */ \"./src/assets/images/home/icon-user.png\") }\n                }),\n                _c(\"span\", [_vm._v(_vm._s(_vm.dataObj.name))])\n              ])\n            ]\n          : [\n              _c(\n                \"span\",\n                {\n                  on: {\n                    click: function($event) {\n                      return _vm.onNavHandler()\n                    }\n                  }\n                },\n                [\n                  _vm._v(\n                    \"\\n\\t\\t\\t\\t\" +\n                      _vm._s(\n                        _vm.type == \"lang\" ? _vm.sTitle : _vm.dataObj.name\n                      ) +\n                      \"\\n\\t\\t\\t\"\n                  )\n                ]\n              )\n            ],\n        _c(\"div\", { staticClass: \"list\" }, [\n          _c(\"div\", { staticClass: \"space\" }),\n          _c(\n            \"ul\",\n            { directives: [{ name: \"dpl\", rawName: \"v-dpl\" }], ref: \"ul\" },\n            _vm._l(_vm.dataList, function(item, index) {\n              return _c(\n                \"li\",\n                {\n                  key: index,\n                  on: {\n                    mousedown: function($event) {\n                      return _vm.onClickHandler($event, index)\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(item[_vm.labelProperty]))]\n              )\n            }),\n            0\n          )\n        ])\n      ],\n      2\n    )\n  ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIyNzRlY2I2Mi12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNiNGYzNWFmJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24udnVlP2RmNDUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3ZtID0gdGhpc1xuICB2YXIgX2ggPSBfdm0uJGNyZWF0ZUVsZW1lbnRcbiAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gIHJldHVybiBfYyhcImRpdlwiLCBbXG4gICAgX2MoXG4gICAgICBcImRpdlwiLFxuICAgICAge1xuICAgICAgICBzdGF0aWNDbGFzczogXCJkcm9wLWxpc3RcIixcbiAgICAgICAgY2xhc3M6IHsgbG9naW46IF92bS50eXBlID09IFwibG9naW5cIiB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3ZtLm9uT3ZlckhhbmRsZXIoJGV2ZW50KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF92bS5vbk91dEhhbmRsZXIoJGV2ZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtcbiAgICAgICAgX3ZtLnR5cGUgPT0gXCJsb2dpblwiXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwidXNlclwiIH0sIFtcbiAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJpY29uLWltZ1wiLFxuICAgICAgICAgICAgICAgICAgYXR0cnM6IHsgc3JjOiByZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi11c2VyLnBuZ1wiKSB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgX2MoXCJzcGFuXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS5kYXRhT2JqLm5hbWUpKV0pXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uTmF2SGFuZGxlcigpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgXCJcXG5cXHRcXHRcXHRcXHRcIiArXG4gICAgICAgICAgICAgICAgICAgICAgX3ZtLl9zKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnR5cGUgPT0gXCJsYW5nXCIgPyBfdm0uc1RpdGxlIDogX3ZtLmRhdGFPYmoubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuXFx0XFx0XFx0XCJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0sXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibGlzdFwiIH0sIFtcbiAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInNwYWNlXCIgfSksXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcInVsXCIsXG4gICAgICAgICAgICB7IGRpcmVjdGl2ZXM6IFt7IG5hbWU6IFwiZHBsXCIsIHJhd05hbWU6IFwidi1kcGxcIiB9XSwgcmVmOiBcInVsXCIgfSxcbiAgICAgICAgICAgIF92bS5fbChfdm0uZGF0YUxpc3QsIGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfYyhcbiAgICAgICAgICAgICAgICBcImxpXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIG1vdXNlZG93bjogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vbkNsaWNrSGFuZGxlcigkZXZlbnQsIGluZGV4KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhpdGVtW192bS5sYWJlbFByb3BlcnR5XSkpXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApXG4gICAgICAgIF0pXG4gICAgICBdLFxuICAgICAgMlxuICAgIClcbiAgXSlcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxucmVuZGVyLl93aXRoU3RyaXBwZWQgPSB0cnVlXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&":
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"274ecb62-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true& ***!
  \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\"footer\", { staticClass: \"v-footer \" }, [\n    _c(\"div\", { staticClass: \"footer-containter \" }, [\n      _c(\"div\", { staticClass: \"cont\" }, [\n        _vm._m(0),\n        _c(\"div\", { staticClass: \"line\" }),\n        _c(\"div\", { staticClass: \"info\" }, [\n          _c(\"div\", { staticClass: \"hotline\" }, [\n            _c(\"div\", { staticClass: \"contact\" }, [\n              _c(\"div\", { staticClass: \"n-item\" }, [\n                _vm._v(_vm._s(_vm.$t(\"footer.hkPhone\")))\n              ]),\n              _c(\"div\", { staticClass: \"phone\" }, [_vm._v(\"(852)2983 8866\")])\n            ]),\n            _c(\"div\", { staticClass: \"contact\" }, [\n              _c(\"div\", { staticClass: \"n-item\" }, [\n                _vm._v(_vm._s(_vm.$t(\"footer.cnPhone\")))\n              ]),\n              _c(\"div\", { staticClass: \"phone\" }, [_vm._v(\"(86)40078 95511\")])\n            ])\n          ]),\n          _c(\"div\", { staticClass: \"nav\" }, [\n            _c(\"div\", { staticClass: \"nav-v\" }, [\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"profile\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.aboutUs\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"profile\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.companyIntroduction\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"newsList\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.news\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"empty\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.joinUs\")))]\n              )\n            ]),\n            _c(\"div\", { staticClass: \"nav-v\" }, [\n              _c(\"div\", { staticClass: \"n-item\" }, [\n                _vm._v(_vm._s(_vm.$t(\"footer.helpCenter\")))\n              ]),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"privacy\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.privacy\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"terms\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.terms\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"personalDataCollection\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.protocol\")))]\n              )\n            ]),\n            _c(\"div\", { staticClass: \"nav-v\" }, [\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPath(\"/custom/service?q=m1\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.contactUs\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"empty\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.contactInformation\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"empty\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.service\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"empty\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.map\")))]\n              )\n            ])\n          ]),\n          _c(\"div\", { staticClass: \"nav nav2\" }, [\n            _c(\"div\", { staticClass: \"nav-v\" }, [\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"privacy\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.privacy\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"terms\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.terms\")))]\n              ),\n              _c(\n                \"div\",\n                {\n                  staticClass: \"n-item\",\n                  on: {\n                    click: function($event) {\n                      return _vm.toPage(\"personalDataCollection\")\n                    }\n                  }\n                },\n                [_vm._v(_vm._s(_vm.$t(\"footer.protocol\")))]\n              )\n            ])\n          ]),\n          _c(\n            \"div\",\n            { staticClass: \"public\" },\n            [\n              _c(\"div\", { staticClass: \"tit\" }, [\n                _vm._v(_vm._s(_vm.$t(\"footer.qrcode\")))\n              ]),\n              _vm.qrcodeVisible\n                ? _c(\n                    \"div\",\n                    {\n                      staticClass: \"qrcode-wrap\",\n                      on: {\n                        click: function($event) {\n                          _vm.qrcodeVisible = !_vm.qrcodeVisible\n                        }\n                      }\n                    },\n                    [\n                      _c(\"img\", {\n                        attrs: {\n                          src: __webpack_require__(/*! @/assets/images/home/qrcode.png */ \"./src/assets/images/home/qrcode.png\"),\n                          alt: \"\"\n                        }\n                      }),\n                      _c(\"div\", { staticClass: \"c1\" }, [_vm._v(\"官方公眾號\")])\n                    ]\n                  )\n                : [\n                    _c(\"img\", {\n                      staticClass: \"icon pointer\",\n                      attrs: {\n                        src: __webpack_require__(/*! @/assets/images/home/footer-icon-1.png */ \"./src/assets/images/home/footer-icon-1.png\"),\n                        alt: \"\"\n                      },\n                      on: {\n                        click: function($event) {\n                          _vm.qrcodeVisible = !_vm.qrcodeVisible\n                        }\n                      }\n                    }),\n                    _c(\"img\", {\n                      staticClass: \"icon pointer\",\n                      attrs: {\n                        src: __webpack_require__(/*! @/assets/images/home/footer-icon-2.png */ \"./src/assets/images/home/footer-icon-2.png\"),\n                        alt: \"\"\n                      }\n                    }),\n                    _c(\"img\", {\n                      staticClass: \"icon pointer\",\n                      attrs: {\n                        src: __webpack_require__(/*! @/assets/images/home/footer-icon-3.png */ \"./src/assets/images/home/footer-icon-3.png\"),\n                        alt: \"\"\n                      }\n                    })\n                  ]\n            ],\n            2\n          )\n        ]),\n        _c(\"div\", { staticClass: \"line\" }),\n        _c(\"div\", { staticClass: \"copyright\" }, [\n          _vm._v(\n            \"\\n\\t\\t\\t\\t\" + _vm._s(_vm.$t(\"footer.copyright\")) + \"\\n\\t\\t\\t\\t\"\n          ),\n          _c(\"br\"),\n          _vm._v(\n            \"Copyright © PING AN INSURANCE (GROUP) COMPANY OF CHINA ,LTD. All Rights Reserved\\n\\t\\t\\t\"\n          )\n        ])\n      ])\n    ])\n  ])\n}\nvar staticRenderFns = [\n  function() {\n    var _vm = this\n    var _h = _vm.$createElement\n    var _c = _vm._self._c || _h\n    return _c(\"div\", { staticClass: \"logo-wrap\" }, [\n      _c(\"img\", {\n        staticClass: \"logo-img\",\n        attrs: {\n          src: __webpack_require__(/*! @/assets/images/home/footer-logo.png */ \"./src/assets/images/home/footer-logo.png\"),\n          alt: \"中国平安人寿保险\"\n        }\n      })\n    ])\n  }\n]\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIyNzRlY2I2Mi12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZjY3OGZjMjImc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9mb290ZXIvZm9vdGVyLnZ1ZT9hNDAyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJmb290ZXJcIiwgeyBzdGF0aWNDbGFzczogXCJ2LWZvb3RlciBcIiB9LCBbXG4gICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJmb290ZXItY29udGFpbnRlciBcIiB9LCBbXG4gICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImNvbnRcIiB9LCBbXG4gICAgICAgIF92bS5fbSgwKSxcbiAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJsaW5lXCIgfSksXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiaW5mb1wiIH0sIFtcbiAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImhvdGxpbmVcIiB9LCBbXG4gICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImNvbnRhY3RcIiB9LCBbXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLmhrUGhvbmVcIikpKVxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJwaG9uZVwiIH0sIFtfdm0uX3YoXCIoODUyKTI5ODMgODg2NlwiKV0pXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiY29udGFjdFwiIH0sIFtcbiAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIuY25QaG9uZVwiKSkpXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInBob25lXCIgfSwgW192bS5fdihcIig4Nik0MDA3OCA5NTUxMVwiKV0pXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibmF2XCIgfSwgW1xuICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuYXYtdlwiIH0sIFtcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcInByb2ZpbGVcIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLmFib3V0VXNcIikpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcInByb2ZpbGVcIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLmNvbXBhbnlJbnRyb2R1Y3Rpb25cIikpKV1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLnRvUGFnZShcIm5ld3NMaXN0XCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5uZXdzXCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJlbXB0eVwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIuam9pblVzXCIpKSldXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuYXYtdlwiIH0sIFtcbiAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuLWl0ZW1cIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIuaGVscENlbnRlclwiKSkpXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcIm4taXRlbVwiLFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0udG9QYWdlKFwicHJpdmFjeVwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIucHJpdmFjeVwiKSkpXVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcIm4taXRlbVwiLFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0udG9QYWdlKFwidGVybXNcIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLnRlcm1zXCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJwZXJzb25hbERhdGFDb2xsZWN0aW9uXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5wcm90b2NvbFwiKSkpXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibmF2LXZcIiB9LCBbXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhdGgoXCIvY3VzdG9tL3NlcnZpY2U/cT1tMVwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIuY29udGFjdFVzXCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJlbXB0eVwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIuY29udGFjdEluZm9ybWF0aW9uXCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJlbXB0eVwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIuc2VydmljZVwiKSkpXVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcIm4taXRlbVwiLFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0udG9QYWdlKFwiZW1wdHlcIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLm1hcFwiKSkpXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibmF2IG5hdjJcIiB9LCBbXG4gICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcIm5hdi12XCIgfSwgW1xuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcIm4taXRlbVwiLFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0udG9QYWdlKFwicHJpdmFjeVwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIucHJpdmFjeVwiKSkpXVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcIm4taXRlbVwiLFxuICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0udG9QYWdlKFwidGVybXNcIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLnRlcm1zXCIpKSldXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwibi1pdGVtXCIsXG4gICAgICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS50b1BhZ2UoXCJwZXJzb25hbERhdGFDb2xsZWN0aW9uXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImZvb3Rlci5wcm90b2NvbFwiKSkpXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwicHVibGljXCIgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJ0aXRcIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJmb290ZXIucXJjb2RlXCIpKSlcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF92bS5xcmNvZGVWaXNpYmxlXG4gICAgICAgICAgICAgICAgPyBfYyhcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcInFyY29kZS13cmFwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnFyY29kZVZpc2libGUgPSAhX3ZtLnFyY29kZVZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaG9tZS9xcmNvZGUucG5nXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImMxXCIgfSwgW192bS5fdihcIuWumOaWueWFrOecvuiZn1wiKV0pXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJpbWdcIiwge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImljb24gcG9pbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaG9tZS9mb290ZXItaWNvbi0xLnBuZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdDogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLnFyY29kZVZpc2libGUgPSAhX3ZtLnFyY29kZVZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiaWNvbiBwb2ludGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogcmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1pY29uLTIucG5nXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0OiBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgX2MoXCJpbWdcIiwge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImljb24gcG9pbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaG9tZS9mb290ZXItaWNvbi0zLnBuZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdDogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICBdKSxcbiAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJsaW5lXCIgfSksXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiY29weXJpZ2h0XCIgfSwgW1xuICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgIFwiXFxuXFx0XFx0XFx0XFx0XCIgKyBfdm0uX3MoX3ZtLiR0KFwiZm9vdGVyLmNvcHlyaWdodFwiKSkgKyBcIlxcblxcdFxcdFxcdFxcdFwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfYyhcImJyXCIpLFxuICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgIFwiQ29weXJpZ2h0IMKpIFBJTkcgQU4gSU5TVVJBTkNFIChHUk9VUCkgQ09NUEFOWSBPRiBDSElOQSDvvIxMVEQuIEFsbCBSaWdodHMgUmVzZXJ2ZWRcXG5cXHRcXHRcXHRcIlxuICAgICAgICAgIClcbiAgICAgICAgXSlcbiAgICAgIF0pXG4gICAgXSlcbiAgXSlcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXG4gIGZ1bmN0aW9uKCkge1xuICAgIHZhciBfdm0gPSB0aGlzXG4gICAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gICAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oXG4gICAgcmV0dXJuIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibG9nby13cmFwXCIgfSwgW1xuICAgICAgX2MoXCJpbWdcIiwge1xuICAgICAgICBzdGF0aWNDbGFzczogXCJsb2dvLWltZ1wiLFxuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHNyYzogcmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1sb2dvLnBuZ1wiKSxcbiAgICAgICAgICBhbHQ6IFwi5Lit5Zu95bmz5a6J5Lq65a+/5L+d6ZmpXCJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdKVxuICB9XG5dXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&":
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"274ecb62-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true& ***!
  \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\"header\", { staticClass: \"v-header\" }, [\n    _c(\"div\", { staticClass: \"header-container\" }, [\n      _c(\"img\", {\n        staticClass: \"logo-img\",\n        attrs: {\n          src: __webpack_require__(/*! @/assets/images/home/header-logo.png */ \"./src/assets/images/home/header-logo.png\"),\n          alt: \"中国平安人寿保险\"\n        },\n        on: { click: _vm.toIndex }\n      }),\n      _c(\"div\", { staticClass: \"main-nav\" }, [\n        _c(\n          \"div\",\n          { staticClass: \"nav-list-m mobile\" },\n          [\n            _c(\"div\", { staticClass: \"mobile-nav-list\" }, [\n              !_vm.loginMVisible\n                ? _c(\"img\", {\n                    attrs: {\n                      src: __webpack_require__(/*! @/assets/images/home/mobile-user.png */ \"./src/assets/images/home/mobile-user.png\"),\n                      alt: \"\"\n                    },\n                    on: {\n                      click: function($event) {\n                        return _vm.onShowDropdown(\"login\")\n                      }\n                    }\n                  })\n                : _c(\"img\", {\n                    attrs: {\n                      src: __webpack_require__(/*! @/assets/images/home/mobile-user.png */ \"./src/assets/images/home/mobile-user.png\"),\n                      alt: \"\"\n                    },\n                    on: {\n                      click: function($event) {\n                        return _vm.onShowDropdown(\"\")\n                      }\n                    }\n                  }),\n              !_vm.dropdownMVisible\n                ? _c(\"img\", {\n                    attrs: {\n                      src: __webpack_require__(/*! @/assets/images/home/mobile-nav.png */ \"./src/assets/images/home/mobile-nav.png\"),\n                      alt: \"\"\n                    },\n                    on: {\n                      click: function($event) {\n                        return _vm.onShowDropdown(\"nav\")\n                      }\n                    }\n                  })\n                : _c(\"img\", {\n                    attrs: {\n                      src: __webpack_require__(/*! @/assets/images/home/mobile-nav-close.png */ \"./src/assets/images/home/mobile-nav-close.png\"),\n                      alt: \"\"\n                    },\n                    on: {\n                      click: function($event) {\n                        return _vm.onShowDropdown(\"\")\n                      }\n                    }\n                  })\n            ]),\n            _c(\"m-dropdown\", {\n              staticClass: \"lang\",\n              attrs: {\n                type: \"nav\",\n                visible: _vm.dropdownMVisible,\n                \"show-dropdown-m\": _vm.onShowDropdown,\n                \"lang-list\": _vm.langData.list\n              }\n            }),\n            _c(\"m-dropdown\", {\n              staticClass: \"lang\",\n              attrs: {\n                type: \"login\",\n                visible: _vm.loginMVisible,\n                \"show-dropdown-m\": _vm.onShowDropdown\n              }\n            })\n          ],\n          1\n        ),\n        _c(\"div\", { staticClass: \"nav-list pc\" }, [\n          _c(\n            \"div\",\n            { staticClass: \"main-nav-list\" },\n            _vm._l(_vm.navList, function(item) {\n              return _c(\"v-dropdown\", {\n                key: item.id,\n                attrs: { \"data-obj\": item, \"data-list\": item.list }\n              })\n            }),\n            1\n          ),\n          _c(\"div\", { staticClass: \"nav-item search\" }),\n          _c(\n            \"div\",\n            { staticClass: \"nav-item auth\" },\n            [\n              _c(\"v-dropdown\", {\n                staticClass: \"lang\",\n                attrs: {\n                  type: \"login\",\n                  \"data-obj\": _vm.loginData,\n                  \"data-list\": _vm.loginData.list\n                }\n              }),\n              _c(\"v-dropdown\", {\n                staticClass: \"lang\",\n                attrs: {\n                  type: \"lang\",\n                  \"data-obj\": _vm.langData,\n                  \"data-list\": _vm.langData.list\n                }\n              })\n            ],\n            1\n          )\n        ])\n      ])\n    ])\n  ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIyNzRlY2I2Mi12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NmZiYThkYWYmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9oZWFkZXIvaGVhZGVyLnZ1ZT9iMGJhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJoZWFkZXJcIiwgeyBzdGF0aWNDbGFzczogXCJ2LWhlYWRlclwiIH0sIFtcbiAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImhlYWRlci1jb250YWluZXJcIiB9LCBbXG4gICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgIHN0YXRpY0NsYXNzOiBcImxvZ28taW1nXCIsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgc3JjOiByZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvaGVhZGVyLWxvZ28ucG5nXCIpLFxuICAgICAgICAgIGFsdDogXCLkuK3lm73lubPlronkurrlr7/kv53pmalcIlxuICAgICAgICB9LFxuICAgICAgICBvbjogeyBjbGljazogX3ZtLnRvSW5kZXggfVxuICAgICAgfSksXG4gICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcIm1haW4tbmF2XCIgfSwgW1xuICAgICAgICBfYyhcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwibmF2LWxpc3QtbSBtb2JpbGVcIiB9LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwibW9iaWxlLW5hdi1saXN0XCIgfSwgW1xuICAgICAgICAgICAgICAhX3ZtLmxvZ2luTVZpc2libGVcbiAgICAgICAgICAgICAgICA/IF9jKFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaG9tZS9tb2JpbGUtdXNlci5wbmdcIiksXG4gICAgICAgICAgICAgICAgICAgICAgYWx0OiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vblNob3dEcm9wZG93bihcImxvZ2luXCIpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogX2MoXCJpbWdcIiwge1xuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgIHNyYzogcmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9ob21lL21vYmlsZS11c2VyLnBuZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uU2hvd0Ryb3Bkb3duKFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgIV92bS5kcm9wZG93bk1WaXNpYmxlXG4gICAgICAgICAgICAgICAgPyBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3JjOiByZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvbW9iaWxlLW5hdi5wbmdcIiksXG4gICAgICAgICAgICAgICAgICAgICAgYWx0OiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vblNob3dEcm9wZG93bihcIm5hdlwiKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IF9jKFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaG9tZS9tb2JpbGUtbmF2LWNsb3NlLnBuZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uU2hvd0Ryb3Bkb3duKFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBfYyhcIm0tZHJvcGRvd25cIiwge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJsYW5nXCIsXG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJuYXZcIixcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiBfdm0uZHJvcGRvd25NVmlzaWJsZSxcbiAgICAgICAgICAgICAgICBcInNob3ctZHJvcGRvd24tbVwiOiBfdm0ub25TaG93RHJvcGRvd24sXG4gICAgICAgICAgICAgICAgXCJsYW5nLWxpc3RcIjogX3ZtLmxhbmdEYXRhLmxpc3RcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBfYyhcIm0tZHJvcGRvd25cIiwge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJsYW5nXCIsXG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJsb2dpblwiLFxuICAgICAgICAgICAgICAgIHZpc2libGU6IF92bS5sb2dpbk1WaXNpYmxlLFxuICAgICAgICAgICAgICAgIFwic2hvdy1kcm9wZG93bi1tXCI6IF92bS5vblNob3dEcm9wZG93blxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF0sXG4gICAgICAgICAgMVxuICAgICAgICApLFxuICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcIm5hdi1saXN0IHBjXCIgfSwgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHsgc3RhdGljQ2xhc3M6IFwibWFpbi1uYXYtbGlzdFwiIH0sXG4gICAgICAgICAgICBfdm0uX2woX3ZtLm5hdkxpc3QsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9jKFwidi1kcm9wZG93blwiLCB7XG4gICAgICAgICAgICAgICAga2V5OiBpdGVtLmlkLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7IFwiZGF0YS1vYmpcIjogaXRlbSwgXCJkYXRhLWxpc3RcIjogaXRlbS5saXN0IH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJuYXYtaXRlbSBzZWFyY2hcIiB9KSxcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcIm5hdi1pdGVtIGF1dGhcIiB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcInYtZHJvcGRvd25cIiwge1xuICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImxhbmdcIixcbiAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJsb2dpblwiLFxuICAgICAgICAgICAgICAgICAgXCJkYXRhLW9ialwiOiBfdm0ubG9naW5EYXRhLFxuICAgICAgICAgICAgICAgICAgXCJkYXRhLWxpc3RcIjogX3ZtLmxvZ2luRGF0YS5saXN0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgX2MoXCJ2LWRyb3Bkb3duXCIsIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJsYW5nXCIsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwibGFuZ1wiLFxuICAgICAgICAgICAgICAgICAgXCJkYXRhLW9ialwiOiBfdm0ubGFuZ0RhdGEsXG4gICAgICAgICAgICAgICAgICBcImRhdGEtbGlzdFwiOiBfdm0ubGFuZ0RhdGEubGlzdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICBdKVxuICAgICAgXSlcbiAgICBdKVxuICBdKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"274ecb62-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& ***!
  \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\"div\", [\n    _c(\n      \"div\",\n      { ref: \"panel\", staticClass: \"panel\", class: { hide: !_vm.visible } },\n      [\n        _c(\"div\", {\n          staticClass: \"mask\",\n          on: {\n            click: function($event) {\n              return _vm.showDropdownM(\"\")\n            }\n          }\n        }),\n        _c(\n          \"div\",\n          { staticClass: \"list\" },\n          _vm._l(_vm.navList, function(item, index) {\n            return _c(\n              \"div\",\n              { key: item.id, attrs: { index: index } },\n              [\n                item && item.list && item.list.length > 0\n                  ? _c(\n                      \"van-collapse\",\n                      {\n                        on: { change: _vm.onChangeHandler },\n                        model: {\n                          value: _vm.activeNames[index],\n                          callback: function($$v) {\n                            _vm.$set(_vm.activeNames, index, $$v)\n                          },\n                          expression: \"activeNames[index]\"\n                        }\n                      },\n                      [\n                        _c(\n                          \"van-collapse-item\",\n                          {\n                            attrs: {\n                              border: _vm.borderBoo,\n                              title: item.name,\n                              name: index\n                            }\n                          },\n                          [\n                            _c(\n                              \"div\",\n                              { attrs: { slot: \"title\" }, slot: \"title\" },\n                              [\n                                _c(\n                                  \"span\",\n                                  {\n                                    class: {\n                                      \"coll-item-act\": index == _vm.activeIndex\n                                    }\n                                  },\n                                  [_vm._v(_vm._s(item.name))]\n                                )\n                              ]\n                            ),\n                            _c(\n                              \"div\",\n                              {\n                                attrs: { slot: \"right-icon\" },\n                                slot: \"right-icon\"\n                              },\n                              [\n                                _c(\"div\", { staticClass: \"icon-wrap\" }, [\n                                  _c(\"div\", {\n                                    staticClass: \"plus-icon\",\n                                    class: {\n                                      \"plus-icon-act\": index == _vm.activeIndex\n                                    }\n                                  })\n                                ])\n                              ]\n                            ),\n                            _vm._l(item.list, function(item2) {\n                              return _c(\n                                \"div\",\n                                {\n                                  key: item2.id,\n                                  staticClass: \"list-item\",\n                                  on: {\n                                    click: function($event) {\n                                      return _vm.onClickHandler(item2)\n                                    }\n                                  }\n                                },\n                                [\n                                  _c(\"div\", { staticClass: \"arrow-icon\" }),\n                                  _c(\"div\", { staticClass: \"txt\" }, [\n                                    _vm._v(_vm._s(item2.name))\n                                  ])\n                                ]\n                              )\n                            })\n                          ],\n                          2\n                        )\n                      ],\n                      1\n                    )\n                  : _c(\n                      \"div\",\n                      {\n                        staticClass: \"list-item\",\n                        on: {\n                          click: function($event) {\n                            return _vm.onClickHandler(item)\n                          }\n                        }\n                      },\n                      [\n                        _vm._v(\n                          \"\\n\\t\\t\\t\\t\\t\" + _vm._s(item.name) + \"\\n\\t\\t\\t\\t\"\n                        )\n                      ]\n                    )\n              ],\n              1\n            )\n          }),\n          0\n        ),\n        _vm.langList && _vm.langList.length > 0\n          ? _c(\n              \"div\",\n              { staticClass: \"lang\" },\n              _vm._l(_vm.langList, function(item) {\n                return _c(\n                  \"div\",\n                  {\n                    key: item.id,\n                    staticClass: \"lang-item pointer\",\n                    class: { \"lang-item-act\": _vm.locale == item.value },\n                    on: {\n                      click: function($event) {\n                        return _vm.setLangHandler(item)\n                      }\n                    }\n                  },\n                  [_vm._v(\"\\n\\t\\t\\t\\t\" + _vm._s(item.name) + \"\\n\\t\\t\\t\")]\n                )\n              }),\n              0\n            )\n          : _vm._e()\n      ]\n    )\n  ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIyNzRlY2I2Mi12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9jb21wb25lbnRzL2hvbWUvbS1kcm9wZG93bi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNGM1NWUyZiZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/MTMyYSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFwiZGl2XCIsIFtcbiAgICBfYyhcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7IHJlZjogXCJwYW5lbFwiLCBzdGF0aWNDbGFzczogXCJwYW5lbFwiLCBjbGFzczogeyBoaWRlOiAhX3ZtLnZpc2libGUgfSB9LFxuICAgICAgW1xuICAgICAgICBfYyhcImRpdlwiLCB7XG4gICAgICAgICAgc3RhdGljQ2xhc3M6IFwibWFza1wiLFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdm0uc2hvd0Ryb3Bkb3duTShcIlwiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIF9jKFxuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJsaXN0XCIgfSxcbiAgICAgICAgICBfdm0uX2woX3ZtLm5hdkxpc3QsIGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgIHsga2V5OiBpdGVtLmlkLCBhdHRyczogeyBpbmRleDogaW5kZXggfSB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgaXRlbSAmJiBpdGVtLmxpc3QgJiYgaXRlbS5saXN0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgXCJ2YW4tY29sbGFwc2VcIixcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbjogeyBjaGFuZ2U6IF92bS5vbkNoYW5nZUhhbmRsZXIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uYWN0aXZlTmFtZXNbaW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJCR2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZtLiRzZXQoX3ZtLmFjdGl2ZU5hbWVzLCBpbmRleCwgJCR2KVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImFjdGl2ZU5hbWVzW2luZGV4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YW4tY29sbGFwc2UtaXRlbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogX3ZtLmJvcmRlckJvbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYXR0cnM6IHsgc2xvdDogXCJ0aXRsZVwiIH0sIHNsb3Q6IFwidGl0bGVcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbGwtaXRlbS1hY3RcIjogaW5kZXggPT0gX3ZtLmFjdGl2ZUluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhpdGVtLm5hbWUpKV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczogeyBzbG90OiBcInJpZ2h0LWljb25cIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90OiBcInJpZ2h0LWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJpY29uLXdyYXBcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwicGx1cy1pY29uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBsdXMtaWNvbi1hY3RcIjogaW5kZXggPT0gX3ZtLmFjdGl2ZUluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fbChpdGVtLmxpc3QsIGZ1bmN0aW9uKGl0ZW0yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW0yLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImxpc3QtaXRlbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25DbGlja0hhbmRsZXIoaXRlbTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJhcnJvdy1pY29uXCIgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJ0eHRcIiB9LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm0uX3YoX3ZtLl9zKGl0ZW0yLm5hbWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIDogX2MoXG4gICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJsaXN0LWl0ZW1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uQ2xpY2tIYW5kbGVyKGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG5cXHRcXHRcXHRcXHRcXHRcIiArIF92bS5fcyhpdGVtLm5hbWUpICsgXCJcXG5cXHRcXHRcXHRcXHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICAgICAgMFxuICAgICAgICApLFxuICAgICAgICBfdm0ubGFuZ0xpc3QgJiYgX3ZtLmxhbmdMaXN0Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IF9jKFxuICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImxhbmdcIiB9LFxuICAgICAgICAgICAgICBfdm0uX2woX3ZtLmxhbmdMaXN0LCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jKFxuICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBpdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJsYW5nLWl0ZW0gcG9pbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzczogeyBcImxhbmctaXRlbS1hY3RcIjogX3ZtLmxvY2FsZSA9PSBpdGVtLnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5zZXRMYW5nSGFuZGxlcihpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFtfdm0uX3YoXCJcXG5cXHRcXHRcXHRcXHRcIiArIF92bS5fcyhpdGVtLm5hbWUpICsgXCJcXG5cXHRcXHRcXHRcIildXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogX3ZtLl9lKClcbiAgICAgIF1cbiAgICApXG4gIF0pXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&":
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"274ecb62-vue-loader-template"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true& ***!
  \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\"div\", { staticClass: \"page page-index\" }, [\n    _c(\"div\", { staticClass: \"banner-contaner\" }, [\n      _c(\n        \"div\",\n        { staticClass: \"banner banner-pc\" },\n        [\n          _c(\n            \"swiper\",\n            { attrs: { options: _vm.swiperOption } },\n            [\n              _c(\"swiper-slide\", [\n                _c(\"img\", {\n                  staticClass: \"banner-img\",\n                  attrs: {\n                    src: __webpack_require__(\"./src/assets/images/index sync recursive ^\\\\.\\\\/banner\\\\-p1\\\\-.*\\\\.png$\")(\"./banner-p1-\" +\n                      _vm.locale +\n                      \".png\")\n                  },\n                  on: { click: _vm.toVhis }\n                })\n              ]),\n              _c(\"swiper-slide\", [\n                _c(\"img\", {\n                  staticClass: \"banner-img\",\n                  attrs: {\n                    src: __webpack_require__(\"./src/assets/images/index sync recursive ^\\\\.\\\\/banner\\\\-p2\\\\-.*\\\\.png$\")(\"./banner-p2-\" +\n                      _vm.locale +\n                      \".png\")\n                  },\n                  on: { click: _vm.toVhis }\n                })\n              ]),\n              _c(\"div\", {\n                staticClass: \"swiper-pagination\",\n                attrs: { slot: \"pagination\" },\n                slot: \"pagination\"\n              })\n            ],\n            1\n          )\n        ],\n        1\n      ),\n      _c(\n        \"div\",\n        { staticClass: \"banner banner-mobile\" },\n        [\n          _c(\n            \"swiper\",\n            { staticClass: \"swiper\", attrs: { options: _vm.swiperOption } },\n            [\n              _c(\"swiper-slide\", [\n                _c(\"img\", {\n                  staticClass: \"banner-img\",\n                  attrs: {\n                    src: __webpack_require__(\"./src/assets/images/index sync recursive ^\\\\.\\\\/banner\\\\-m1\\\\-.*\\\\.jpg$\")(\"./banner-m1-\" +\n                      _vm.locale +\n                      \".jpg\")\n                  },\n                  on: { click: _vm.toVhis }\n                })\n              ]),\n              _c(\"swiper-slide\", [\n                _c(\"img\", {\n                  staticClass: \"banner-img\",\n                  attrs: {\n                    src: __webpack_require__(\"./src/assets/images/index sync recursive ^\\\\.\\\\/banner\\\\-m2\\\\-.*\\\\.jpg$\")(\"./banner-m2-\" +\n                      _vm.locale +\n                      \".jpg\")\n                  },\n                  on: { click: _vm.toVhis }\n                })\n              ]),\n              _c(\"div\", {\n                staticClass: \"swiper-pagination\",\n                attrs: { slot: \"pagination\" },\n                slot: \"pagination\"\n              })\n            ],\n            1\n          )\n        ],\n        1\n      )\n    ]),\n    _c(\"div\", { staticClass: \"content\" }, [\n      _c(\"div\", { staticClass: \"box recommend gird-g\" }, [\n        _c(\"div\", { staticClass: \"recommend-item pure-u-1 pure-u-md-1-2\" }, [\n          _c(\n            \"div\",\n            {\n              staticClass: \"btn pointer\",\n              on: {\n                click: function($event) {\n                  return _vm.onRecommendHandler(1)\n                }\n              }\n            },\n            [_vm._v(_vm._s(_vm.$t(\"index.recommend.t1\")))]\n          ),\n          _c(\"div\", { staticClass: \"img img1\" })\n        ]),\n        _c(\"div\", { staticClass: \"recommend-item pure-u-1 pure-u-md-1-2\" }, [\n          _c(\n            \"div\",\n            {\n              staticClass: \"btn pointer\",\n              on: {\n                click: function($event) {\n                  return _vm.onRecommendHandler(3)\n                }\n              }\n            },\n            [_vm._v(_vm._s(_vm.$t(\"index.recommend.t2\")))]\n          ),\n          _c(\"div\", { staticClass: \"img img2\" })\n        ]),\n        _c(\"div\", { staticClass: \"recommend-item pure-u-1 pure-u-md-1-2\" }, [\n          _c(\n            \"div\",\n            {\n              staticClass: \"btn pointer\",\n              on: {\n                click: function($event) {\n                  return _vm.onRecommendHandler(1)\n                }\n              }\n            },\n            [_vm._v(_vm._s(_vm.$t(\"index.recommend.t3\")))]\n          ),\n          _c(\"div\", { staticClass: \"img img3\" })\n        ]),\n        _c(\"div\", { staticClass: \"recommend-item pure-u-1 pure-u-md-1-2\" }, [\n          _c(\n            \"div\",\n            {\n              staticClass: \"btn pointer\",\n              on: {\n                click: function($event) {\n                  return _vm.onRecommendHandler(4)\n                }\n              }\n            },\n            [_vm._v(_vm._s(_vm.$t(\"index.recommend.t4\")))]\n          ),\n          _c(\"div\", { staticClass: \"img img4\" })\n        ])\n      ]),\n      _c(\n        \"div\",\n        { staticClass: \"box detail\" },\n        [\n          _c(\"video-player\", {\n            ref: \"videoPlayer\",\n            staticClass: \"vjs-custom-skin\",\n            attrs: { options: _vm.playerOptions, playsinline: true }\n          }),\n          _vm.$i18n.locale == \"zh\"\n            ? _c(\"div\", { staticClass: \"txt\" }, [\n                _vm._v(\n                  \"\\n\\t\\t\\t\\t中国平安人寿保险股份有限公司成立于2002年,是中国平安保险(集团)股份有限公司旗下的重要成员。截至2017年12月31日,平安人寿注册资本为338亿元,在全国拥有42家分公司(含7家电话销售中心)及超过3,300个营业网点,寿险代理人达138.6万名。公司个险、银保、电销、互联网多渠道齐头并进,实现协同发展,运营管理水平及客户体验领先市场,并依托集团“金融+科技”双驱动战略,在合规经营、防范风险的前提下,开启平台经营新时代,持续提升产品、科技两大核心竞争力,推动内含价值及规模持续、健康、稳定增长。\\n\\t\\t\\t\"\n                )\n              ])\n            : _vm.$i18n.locale == \"tc\"\n            ? _c(\"div\", { staticClass: \"txt\" }, [\n                _vm._v(\n                  \"\\n\\t\\t\\t\\t中國平安人壽保險股份有限公司成立於2002年,是中國平安保險(集團)股份有限公司旗下的重要成員。截至2017年12月31日,平安人壽註冊資本為338億元,在全國擁有42家分公司(含7家電話銷售中心)及超過3,300個營業網點,壽險代理人達138.6萬名。公司個險、銀保、電銷、互聯網多渠道齊頭並進,實現協同發展,運營管理水平及客戶體驗領先市場,並依托集團“金融+科技”雙驅動戰略,在合規經營、防範風險的前提下,開啟平臺經營新時代,持續提升產品、科技兩大核心競爭力,推動內含價值及規模持續、健康、穩定增長。\\n\\t\\t\\t\"\n                )\n              ])\n            : _c(\"div\", { staticClass: \"txt\" }, [\n                _vm._v(\n                  \"\\n\\t\\t\\t\\tPing An Life Insurance Co., Ltd. of China was founded in 2002. It is an important member of Ping An insurance (Group) Co., Ltd. As of December 31, 2017, Ping An life had a registered capital of 33.8 billion yuan. It has 42 branches (including 7 telemarketing centers) and more than 3300 business outlets nationwide, with 1.386 million life insurance agents. The company's personal insurance, bancassurance, telemarketing and Internet multi-channel go hand in hand to achieve coordinated development, leading the market in operation and management level and customer experience, and relying on the group's \\\"Finance + technology\\\" dual drive strategy, under the premise of compliant operation and risk prevention, to open a new era of platform operation, continuously improve the two core competitiveness of products and technology, and promote the sustainability of embedded value and scale Healthy and stable growth.\\n\\t\\t\\t\"\n                )\n              ])\n        ],\n        1\n      )\n    ])\n  ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/e1wiY2FjaGVEaXJlY3RvcnlcIjpcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclwiLFwiY2FjaGVJZGVudGlmaWVyXCI6XCIyNzRlY2I2Mi12dWUtbG9hZGVyLXRlbXBsYXRlXCJ9IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPyEuL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MWJhZGM4MDEmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL2luZGV4L2luZGV4LnZ1ZT85MDczIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF92bSA9IHRoaXNcbiAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50XG4gIHZhciBfYyA9IF92bS5fc2VsZi5fYyB8fCBfaFxuICByZXR1cm4gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJwYWdlIHBhZ2UtaW5kZXhcIiB9LCBbXG4gICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJiYW5uZXItY29udGFuZXJcIiB9LCBbXG4gICAgICBfYyhcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAgeyBzdGF0aWNDbGFzczogXCJiYW5uZXIgYmFubmVyLXBjXCIgfSxcbiAgICAgICAgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJzd2lwZXJcIixcbiAgICAgICAgICAgIHsgYXR0cnM6IHsgb3B0aW9uczogX3ZtLnN3aXBlck9wdGlvbiB9IH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFwic3dpcGVyLXNsaWRlXCIsIFtcbiAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJiYW5uZXItaW1nXCIsXG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLXAxLVwiICtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0ubG9jYWxlICtcbiAgICAgICAgICAgICAgICAgICAgICBcIi5wbmdcIilcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLnRvVmhpcyB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF9jKFwic3dpcGVyLXNsaWRlXCIsIFtcbiAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJiYW5uZXItaW1nXCIsXG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLXAyLVwiICtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0ubG9jYWxlICtcbiAgICAgICAgICAgICAgICAgICAgICBcIi5wbmdcIilcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLnRvVmhpcyB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJzd2lwZXItcGFnaW5hdGlvblwiLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNsb3Q6IFwicGFnaW5hdGlvblwiIH0sXG4gICAgICAgICAgICAgICAgc2xvdDogXCJwYWdpbmF0aW9uXCJcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICBdLFxuICAgICAgICAxXG4gICAgICApLFxuICAgICAgX2MoXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHsgc3RhdGljQ2xhc3M6IFwiYmFubmVyIGJhbm5lci1tb2JpbGVcIiB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcInN3aXBlclwiLFxuICAgICAgICAgICAgeyBzdGF0aWNDbGFzczogXCJzd2lwZXJcIiwgYXR0cnM6IHsgb3B0aW9uczogX3ZtLnN3aXBlck9wdGlvbiB9IH0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIF9jKFwic3dpcGVyLXNsaWRlXCIsIFtcbiAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJiYW5uZXItaW1nXCIsXG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLW0xLVwiICtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0ubG9jYWxlICtcbiAgICAgICAgICAgICAgICAgICAgICBcIi5qcGdcIilcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLnRvVmhpcyB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF9jKFwic3dpcGVyLXNsaWRlXCIsIFtcbiAgICAgICAgICAgICAgICBfYyhcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJiYW5uZXItaW1nXCIsXG4gICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICBzcmM6IHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLW0yLVwiICtcbiAgICAgICAgICAgICAgICAgICAgICBfdm0ubG9jYWxlICtcbiAgICAgICAgICAgICAgICAgICAgICBcIi5qcGdcIilcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBvbjogeyBjbGljazogX3ZtLnRvVmhpcyB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF9jKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJzd2lwZXItcGFnaW5hdGlvblwiLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7IHNsb3Q6IFwicGFnaW5hdGlvblwiIH0sXG4gICAgICAgICAgICAgICAgc2xvdDogXCJwYWdpbmF0aW9uXCJcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICBdLFxuICAgICAgICAxXG4gICAgICApXG4gICAgXSksXG4gICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJjb250ZW50XCIgfSwgW1xuICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJib3ggcmVjb21tZW5kIGdpcmQtZ1wiIH0sIFtcbiAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJyZWNvbW1lbmQtaXRlbSBwdXJlLXUtMSBwdXJlLXUtbWQtMS0yXCIgfSwgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiYnRuIHBvaW50ZXJcIixcbiAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uUmVjb21tZW5kSGFuZGxlcigxKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImluZGV4LnJlY29tbWVuZC50MVwiKSkpXVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJpbWcgaW1nMVwiIH0pXG4gICAgICAgIF0pLFxuICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInJlY29tbWVuZC1pdGVtIHB1cmUtdS0xIHB1cmUtdS1tZC0xLTJcIiB9LCBbXG4gICAgICAgICAgX2MoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGF0aWNDbGFzczogXCJidG4gcG9pbnRlclwiLFxuICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfdm0ub25SZWNvbW1lbmRIYW5kbGVyKDMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW192bS5fdihfdm0uX3MoX3ZtLiR0KFwiaW5kZXgucmVjb21tZW5kLnQyXCIpKSldXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcImltZyBpbWcyXCIgfSlcbiAgICAgICAgXSksXG4gICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwicmVjb21tZW5kLWl0ZW0gcHVyZS11LTEgcHVyZS11LW1kLTEtMlwiIH0sIFtcbiAgICAgICAgICBfYyhcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImJ0biBwb2ludGVyXCIsXG4gICAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5vblJlY29tbWVuZEhhbmRsZXIoMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbX3ZtLl92KF92bS5fcyhfdm0uJHQoXCJpbmRleC5yZWNvbW1lbmQudDNcIikpKV1cbiAgICAgICAgICApLFxuICAgICAgICAgIF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwiaW1nIGltZzNcIiB9KVxuICAgICAgICBdKSxcbiAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJyZWNvbW1lbmQtaXRlbSBwdXJlLXUtMSBwdXJlLXUtbWQtMS0yXCIgfSwgW1xuICAgICAgICAgIF9jKFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhdGljQ2xhc3M6IFwiYnRuIHBvaW50ZXJcIixcbiAgICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3ZtLm9uUmVjb21tZW5kSGFuZGxlcig0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtfdm0uX3YoX3ZtLl9zKF92bS4kdChcImluZGV4LnJlY29tbWVuZC50NFwiKSkpXVxuICAgICAgICAgICksXG4gICAgICAgICAgX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJpbWcgaW1nNFwiIH0pXG4gICAgICAgIF0pXG4gICAgICBdKSxcbiAgICAgIF9jKFxuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7IHN0YXRpY0NsYXNzOiBcImJveCBkZXRhaWxcIiB9LFxuICAgICAgICBbXG4gICAgICAgICAgX2MoXCJ2aWRlby1wbGF5ZXJcIiwge1xuICAgICAgICAgICAgcmVmOiBcInZpZGVvUGxheWVyXCIsXG4gICAgICAgICAgICBzdGF0aWNDbGFzczogXCJ2anMtY3VzdG9tLXNraW5cIixcbiAgICAgICAgICAgIGF0dHJzOiB7IG9wdGlvbnM6IF92bS5wbGF5ZXJPcHRpb25zLCBwbGF5c2lubGluZTogdHJ1ZSB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgX3ZtLiRpMThuLmxvY2FsZSA9PSBcInpoXCJcbiAgICAgICAgICAgID8gX2MoXCJkaXZcIiwgeyBzdGF0aWNDbGFzczogXCJ0eHRcIiB9LCBbXG4gICAgICAgICAgICAgICAgX3ZtLl92KFxuICAgICAgICAgICAgICAgICAgXCJcXG5cXHRcXHRcXHRcXHTkuK3lm73lubPlronkurrlr7/kv53pmanogqHku73mnInpmZDlhazlj7jmiJDnq4vkuo4yMDAy5bm0LOaYr+S4reWbveW5s+WuieS/nemZqe+8iOmbhuWbou+8ieiCoeS7veaciemZkOWFrOWPuOaXl+S4i+eahOmHjeimgeaIkOWRmOOAguaIquiHszIwMTflubQxMuaciDMx5pelLOW5s+WuieS6uuWvv+azqOWGjOi1hOacrOS4ujMzOOS6v+WFg++8jOWcqOWFqOWbveaLpeaciTQy5a625YiG5YWs5Y+477yI5ZCrN+WutueUteivnemUgOWUruS4reW/g++8ieWPiui2hei/hzMsMzAw5Liq6JCl5Lia572R54K5LOWvv+mZqeS7o+eQhuS6uui+vjEzOC425LiH5ZCN44CC5YWs5Y+45Liq6Zmp44CB6ZO25L+d44CB55S16ZSA44CB5LqS6IGU572R5aSa5rig6YGT6b2Q5aS05bm26L+b77yM5a6e546w5Y2P5ZCM5Y+R5bGV77yM6L+Q6JCl566h55CG5rC05bmz5Y+K5a6i5oi35L2T6aqM6aKG5YWI5biC5Zy677yM5bm25L6d5omY6ZuG5Zui4oCc6YeR6J6NK+enkeaKgOKAneWPjOmpseWKqOaImOeVpe+8jOWcqOWQiOinhOe7j+iQpeOAgemYsuiMg+mjjumZqeeahOWJjeaPkOS4i++8jOW8gOWQr+W5s+WPsOe7j+iQpeaWsOaXtuS7o++8jOaMgee7reaPkOWNh+S6p+WTgeOAgeenkeaKgOS4pOWkp+aguOW/g+ernuS6ieWKm++8jOaOqOWKqOWGheWQq+S7t+WAvOWPiuinhOaooeaMgee7reOAgeWBpeW6t+OAgeeos+WumuWinumVv+OAglxcblxcdFxcdFxcdFwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgOiBfdm0uJGkxOG4ubG9jYWxlID09IFwidGNcIlxuICAgICAgICAgICAgPyBfYyhcImRpdlwiLCB7IHN0YXRpY0NsYXNzOiBcInR4dFwiIH0sIFtcbiAgICAgICAgICAgICAgICBfdm0uX3YoXG4gICAgICAgICAgICAgICAgICBcIlxcblxcdFxcdFxcdFxcdOS4reWci+W5s+WuieS6uuWjveS/nemaquiCoeS7veaciemZkOWFrOWPuOaIkOeri+aWvDIwMDLlubQs5piv5Lit5ZyL5bmz5a6J5L+d6Zqq77yI6ZuG5ZyY77yJ6IKh5Lu95pyJ6ZmQ5YWs5Y+45peX5LiL55qE6YeN6KaB5oiQ5ZOh44CC5oiq6IezMjAxN+W5tDEy5pyIMzHml6Us5bmz5a6J5Lq65aO96Ki75YaK6LOH5pys54K6MzM45YSE5YWD77yM5Zyo5YWo5ZyL5pOB5pyJNDLlrrbliIblhazlj7jvvIjlkKs35a626Zu76Kmx6Yq35ZSu5Lit5b+D77yJ5Y+K6LaF6YGOMywzMDDlgIvnh5/mpa3ntrLpu54s5aO96Zqq5Luj55CG5Lq66YGUMTM4LjbokKzlkI3jgILlhazlj7jlgIvpmqrjgIHpioDkv53jgIHpm7vpirfjgIHkupLoga/ntrLlpJrmuKDpgZPpvYrpoK3kuKbpgLLvvIzlr6bnj77ljZTlkIznmbzlsZXvvIzpgYvnh5/nrqHnkIbmsLTlubPlj4rlrqLmiLbpq5TpqZfpoJjlhYjluILloLTvvIzkuKbkvp3miZjpm4blnJjigJzph5Hono0r56eR5oqA4oCd6ZuZ6amF5YuV5oiw55Wl77yM5Zyo5ZCI6KaP57aT54ef44CB6Ziy56+E6aKo6Zqq55qE5YmN5o+Q5LiL77yM6ZaL5ZWf5bmz6Ie657aT54ef5paw5pmC5Luj77yM5oyB57qM5o+Q5Y2H55Si5ZOB44CB56eR5oqA5YWp5aSn5qC45b+D56u254it5Yqb77yM5o6o5YuV5YWn5ZCr5YO55YC85Y+K6KaP5qih5oyB57qM44CB5YGl5bq344CB56mp5a6a5aKe6ZW344CCXFxuXFx0XFx0XFx0XCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICA6IF9jKFwiZGl2XCIsIHsgc3RhdGljQ2xhc3M6IFwidHh0XCIgfSwgW1xuICAgICAgICAgICAgICAgIF92bS5fdihcbiAgICAgICAgICAgICAgICAgIFwiXFxuXFx0XFx0XFx0XFx0UGluZyBBbiBMaWZlIEluc3VyYW5jZSBDby4sIEx0ZC4gb2YgQ2hpbmEgd2FzIGZvdW5kZWQgaW4gMjAwMi4gSXQgaXMgYW4gaW1wb3J0YW50IG1lbWJlciBvZiBQaW5nIEFuIGluc3VyYW5jZSAoR3JvdXApIENvLiwgTHRkLiBBcyBvZiBEZWNlbWJlciAzMSwgMjAxNywgUGluZyBBbiBsaWZlIGhhZCBhIHJlZ2lzdGVyZWQgY2FwaXRhbCBvZiAzMy44IGJpbGxpb24geXVhbi4gSXQgaGFzIDQyIGJyYW5jaGVzIChpbmNsdWRpbmcgNyB0ZWxlbWFya2V0aW5nIGNlbnRlcnMpIGFuZCBtb3JlIHRoYW4gMzMwMCBidXNpbmVzcyBvdXRsZXRzIG5hdGlvbndpZGUsIHdpdGggMS4zODYgbWlsbGlvbiBsaWZlIGluc3VyYW5jZSBhZ2VudHMuIFRoZSBjb21wYW55J3MgcGVyc29uYWwgaW5zdXJhbmNlLCBiYW5jYXNzdXJhbmNlLCB0ZWxlbWFya2V0aW5nIGFuZCBJbnRlcm5ldCBtdWx0aS1jaGFubmVsIGdvIGhhbmQgaW4gaGFuZCB0byBhY2hpZXZlIGNvb3JkaW5hdGVkIGRldmVsb3BtZW50LCBsZWFkaW5nIHRoZSBtYXJrZXQgaW4gb3BlcmF0aW9uIGFuZCBtYW5hZ2VtZW50IGxldmVsIGFuZCBjdXN0b21lciBleHBlcmllbmNlLCBhbmQgcmVseWluZyBvbiB0aGUgZ3JvdXAncyBcXFwiRmluYW5jZSArIHRlY2hub2xvZ3lcXFwiIGR1YWwgZHJpdmUgc3RyYXRlZ3ksIHVuZGVyIHRoZSBwcmVtaXNlIG9mIGNvbXBsaWFudCBvcGVyYXRpb24gYW5kIHJpc2sgcHJldmVudGlvbiwgdG8gb3BlbiBhIG5ldyBlcmEgb2YgcGxhdGZvcm0gb3BlcmF0aW9uLCBjb250aW51b3VzbHkgaW1wcm92ZSB0aGUgdHdvIGNvcmUgY29tcGV0aXRpdmVuZXNzIG9mIHByb2R1Y3RzIGFuZCB0ZWNobm9sb2d5LCBhbmQgcHJvbW90ZSB0aGUgc3VzdGFpbmFiaWxpdHkgb2YgZW1iZWRkZWQgdmFsdWUgYW5kIHNjYWxlIEhlYWx0aHkgYW5kIHN0YWJsZSBncm93dGguXFxuXFx0XFx0XFx0XCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgIF0sXG4gICAgICAgIDFcbiAgICAgIClcbiAgICBdKVxuICBdKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWVcblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzPzg0NTEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_add-to-unscopables.js":
/*!*****************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_add-to-unscopables.js ***!
  \*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\")(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcz9hYjE5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5pZiAoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSByZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_add-to-unscopables.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js":
/*!*******************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js ***!
  \*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\nvar at = __webpack_require__(/*! ./_string-at */ \"./node_modules/_core-js@2.6.10@core-js/modules/_string-at.js\")(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n  return index + (unicode ? at(S, index).length : 1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYWR2YW5jZS1zdHJpbmctaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYWR2YW5jZS1zdHJpbmctaW5kZXguanM/ZmYwNCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuIC8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYWR2YW5jZXN0cmluZ2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTLCBpbmRleCwgdW5pY29kZSkge1xuICByZXR1cm4gaW5kZXggKyAodW5pY29kZSA/IGF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_an-instance.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_an-instance.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanM/NWUwMSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_an-instance.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcz84Y2FjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_array-includes.js":
/*!*************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_array-includes.js ***!
  \*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-absolute-index.js\");\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanM/MWY5ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_array-includes.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_classof.js":
/*!******************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_classof.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\");\nvar TAG = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY2xhc3NvZi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzPzAyZjIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_classof.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_cof.js":
/*!**************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_cof.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY29mLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2NvZi5qcz82MDc3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_core.js":
/*!***************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_core.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var core = module.exports = { version: '2.6.10' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY29yZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzP2RhMjciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNi4xMCcgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_core.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_create-property.js":
/*!**************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_create-property.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\nvar $defineProperty = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\");\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\");\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY3JlYXRlLXByb3BlcnR5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qcz9lMzIzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICBpZiAoaW5kZXggaW4gb2JqZWN0KSAkZGVmaW5lUHJvcGVydHkuZihvYmplY3QsIGluZGV4LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2luZGV4XSA9IHZhbHVlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_create-property.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js":
/*!**************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// optional / simple context binding\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\");\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fY3R4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2N0eC5qcz9lODVlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_defined.js":
/*!******************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_defined.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZGVmaW5lZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzPzMwMzgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\")(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanM/ZjlhNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar document = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\").document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzPzY2MTgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js":
/*!************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzP2Q5M2YiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_export.js":
/*!*****************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_export.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\");\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcz8yNDk4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_export.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_fails.js":
/*!****************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_fails.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZmFpbHMuanM/MGNjMSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n__webpack_require__(/*! ./es6.regexp.exec */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.exec.js\");\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\");\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\");\nvar wks = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\");\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js\");\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n  // #replace needs built-in support for named groups.\n  // #match works fine because it just return the exec results, even if it has\n  // a \"grops\" property.\n  var re = /./;\n  re.exec = function () {\n    var result = [];\n    result.groups = { a: '7' };\n    return result;\n  };\n  return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n  // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n  var re = /(?:)/;\n  var originalExec = re.exec;\n  re.exec = function () { return originalExec.apply(this, arguments); };\n  var result = 'ab'.split(re);\n  return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n\n  var DELEGATES_TO_SYMBOL = !fails(function () {\n    // String methods call symbol-named RegEp methods\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  });\n\n  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n    // Symbol-named RegExp methods call .exec\n    var execCalled = false;\n    var re = /a/;\n    re.exec = function () { execCalled = true; return null; };\n    if (KEY === 'split') {\n      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n      // a new one. We need to return the patched regex when creating the new one.\n      re.constructor = {};\n      re.constructor[SPECIES] = function () { return re; };\n    }\n    re[SYMBOL]('');\n    return !execCalled;\n  }) : undefined;\n\n  if (\n    !DELEGATES_TO_SYMBOL ||\n    !DELEGATES_TO_EXEC ||\n    (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n    (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n  ) {\n    var nativeRegExpMethod = /./[SYMBOL];\n    var fns = exec(\n      defined,\n      SYMBOL,\n      ''[KEY],\n      function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n        if (regexp.exec === regexpExec) {\n          if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n            // The native String method already delegates to @@method (this\n            // polyfilled function), leasing to infinite recursion.\n            // We avoid it by directly calling the native @@method method.\n            return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n          }\n          return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n        }\n        return { done: false };\n      }\n    );\n    var strfn = fns[0];\n    var rxfn = fns[1];\n\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return rxfn.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return rxfn.call(string, this); }\n    );\n  }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19maXgtcmUtd2tzLmpzPzZhZjYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmV4ZWMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcblxudmFyIFNQRUNJRVMgPSB3a3MoJ3NwZWNpZXMnKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gI3JlcGxhY2UgbmVlZHMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgbmFtZWQgZ3JvdXBzLlxuICAvLyAjbWF0Y2ggd29ya3MgZmluZSBiZWNhdXNlIGl0IGp1c3QgcmV0dXJuIHRoZSBleGVjIHJlc3VsdHMsIGV2ZW4gaWYgaXQgaGFzXG4gIC8vIGEgXCJncm9wc1wiIHByb3BlcnR5LlxuICB2YXIgcmUgPSAvLi87XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7XG59KTtcblxudmFyIFNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIENocm9tZSA1MSBoYXMgYSBidWdneSBcInNwbGl0XCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlY1xuICB2YXIgcmUgPSAvKD86KS87XG4gIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3JpZ2luYWxFeGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gIHZhciByZXN1bHQgPSAnYWInLnNwbGl0KHJlKTtcbiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IDIgJiYgcmVzdWx0WzBdID09PSAnYScgJiYgcmVzdWx0WzFdID09PSAnYic7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGxlbmd0aCwgZXhlYykge1xuICB2YXIgU1lNQk9MID0gd2tzKEtFWSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19TWU1CT0wgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN0cmluZyBtZXRob2RzIGNhbGwgc3ltYm9sLW5hbWVkIFJlZ0VwIG1ldGhvZHNcbiAgICB2YXIgTyA9IHt9O1xuICAgIE9bU1lNQk9MXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCA/ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWNcbiAgICB2YXIgZXhlY0NhbGxlZCA9IGZhbHNlO1xuICAgIHZhciByZSA9IC9hLztcbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG4gICAgaWYgKEtFWSA9PT0gJ3NwbGl0Jykge1xuICAgICAgLy8gUmVnRXhwW0BAc3BsaXRdIGRvZXNuJ3QgY2FsbCB0aGUgcmVnZXgncyBleGVjIG1ldGhvZCwgYnV0IGZpcnN0IGNyZWF0ZXNcbiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS5cbiAgICAgIHJlLmNvbnN0cnVjdG9yID0ge307XG4gICAgICByZS5jb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlOyB9O1xuICAgIH1cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pIDogdW5kZWZpbmVkO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIChLRVkgPT09ICdyZXBsYWNlJyAmJiAhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMpIHx8XG4gICAgKEtFWSA9PT0gJ3NwbGl0JyAmJiAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDKVxuICApIHtcbiAgICB2YXIgbmF0aXZlUmVnRXhwTWV0aG9kID0gLy4vW1NZTUJPTF07XG4gICAgdmFyIGZucyA9IGV4ZWMoXG4gICAgICBkZWZpbmVkLFxuICAgICAgU1lNQk9MLFxuICAgICAgJydbS0VZXSxcbiAgICAgIGZ1bmN0aW9uIG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHtcbiAgICAgICAgICBpZiAoREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZm9yY2VTdHJpbmdNZXRob2QpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpc1xuICAgICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgICAgLy8gV2UgYXZvaWQgaXQgYnkgZGlyZWN0bHkgY2FsbGluZyB0aGUgbmF0aXZlIEBAbWV0aG9kIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZU1ldGhvZC5jYWxsKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07XG4gICAgICB9XG4gICAgKTtcbiAgICB2YXIgc3RyZm4gPSBmbnNbMF07XG4gICAgdmFyIHJ4Zm4gPSBmbnNbMV07XG5cbiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmZuKTtcbiAgICBoaWRlKFJlZ0V4cC5wcm90b3R5cGUsIFNZTUJPTCwgbGVuZ3RoID09IDJcbiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSlcbiAgICAgIC8vIDIxLjIuNS4xMSBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdKHN0cmluZywgbGltaXQpXG4gICAgICA/IGZ1bmN0aW9uIChzdHJpbmcsIGFyZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_flags.js":
/*!****************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_flags.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZmxhZ3MuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZmxhZ3MuanM/ZTdhMSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFnc1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBpZiAodGhhdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmICh0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG4gIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JztcbiAgaWYgKHRoYXQuc3RpY2t5KSByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_flags.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_for-of.js":
/*!*****************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_for-of.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\");\nvar call = __webpack_require__(/*! ./_iter-call */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-call.js\");\nvar isArrayIter = __webpack_require__(/*! ./_is-array-iter */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-array-iter.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ \"./node_modules/_core-js@2.6.10@core-js/modules/core.get-iterator-method.js\");\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2Zvci1vZi5qcz8yMmFlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_for-of.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_function-to-string.js":
/*!*****************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_function-to-string.js ***!
  \*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__(/*! ./_shared */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared.js\")('native-function-to-string', Function.toString);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZnVuY3Rpb24tdG8tc3RyaW5nLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2Z1bmN0aW9uLXRvLXN0cmluZy5qcz82ZmUwIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ25hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmcnLCBGdW5jdGlvbi50b1N0cmluZyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_function-to-string.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_global.js":
/*!*****************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_global.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qcz8zZjhiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_global.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_has.js":
/*!**************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_has.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faGFzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2hhcy5qcz81NDlkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_has.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_hide.js":
/*!***************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_hide.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\");\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\");\nmodule.exports = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faGlkZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzP2I4ZWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_html.js":
/*!***************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_html.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var document = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\").document;\nmodule.exports = document && document.documentElement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faHRtbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19odG1sLmpzPzE3Y2IiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_html.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js":
/*!*************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js ***!
  \*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = !__webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") && !__webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\")(function () {\n  return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js\")('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanM/MjVhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_inherit-if-required.js":
/*!******************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_inherit-if-required.js ***!
  \******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar setPrototypeOf = __webpack_require__(/*! ./_set-proto */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-proto.js\").set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faW5oZXJpdC1pZi1yZXF1aXJlZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19pbmhlcml0LWlmLXJlcXVpcmVkLmpzPzFlMDEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCB0YXJnZXQsIEMpIHtcbiAgdmFyIFMgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gIHZhciBQO1xuICBpZiAoUyAhPT0gQyAmJiB0eXBlb2YgUyA9PSAnZnVuY3Rpb24nICYmIChQID0gUy5wcm90b3R5cGUpICE9PSBDLnByb3RvdHlwZSAmJiBpc09iamVjdChQKSAmJiBzZXRQcm90b3R5cGVPZikge1xuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xuICB9IHJldHVybiB0aGF0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_inherit-if-required.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_invoke.js":
/*!*****************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_invoke.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcz8yZjFlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_invoke.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js":
/*!******************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\");\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzPzk5NTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_is-array-iter.js":
/*!************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_is-array-iter.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// check on default Array iterator\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nvar ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzPzY3YzEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_is-array-iter.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcz9kYTBiIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar cof = __webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\");\nvar MATCH = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXMtcmVnZXhwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcz81ZjljIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-call.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-call.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2l0ZXItY2FsbC5qcz9kZDgwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-call.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-create.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-create.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\nvar create = __webpack_require__(/*! ./_object-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-create.js\");\nvar descriptor = __webpack_require__(/*! ./_property-desc */ \"./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\");\nvar setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js\");\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\")(IteratorPrototype, __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanM/YzI2NCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-create.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-define.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-define.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/_core-js@2.6.10@core-js/modules/_library.js\");\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nvar $iterCreate = __webpack_require__(/*! ./_iter-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-create.js\");\nvar setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js\");\nvar getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gpo.js\");\nvar ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanM/NGFlZiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgJGl0ZXJDcmVhdGUgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpOyAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG52YXIgRkZfSVRFUkFUT1IgPSAnQEBpdGVyYXRvcic7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICBpZiAoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pIHJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTO1xuICB2YXIgVkFMVUVTX0JVRyA9IGZhbHNlO1xuICB2YXIgcHJvdG8gPSBCYXNlLnByb3RvdHlwZTtcbiAgdmFyICRuYXRpdmUgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF07XG4gIHZhciAkZGVmYXVsdCA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpO1xuICB2YXIgJGVudHJpZXMgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkO1xuICB2YXIgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7XG4gIHZhciBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmICgkYW55TmF0aXZlKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYgKCFMSUJSQVJZICYmIHR5cGVvZiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKSB7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSA9IHJldHVyblRoaXM7XG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gcHJvdG8pKSByZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-define.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-detect.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-detect.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanM/YjMwOSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbiAoKSB7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgc2tpcENsb3NpbmcpIHtcbiAgaWYgKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IFs3XTtcbiAgICB2YXIgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGRvbmU6IHNhZmUgPSB0cnVlIH07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-detect.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iter-step.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_iter-step.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcz9jOGU5Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iter-step.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcz9lM2IzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0ge307XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_library.js":
/*!******************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_library.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzPzZjYzIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_library.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_microtask.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_microtask.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar macrotask = __webpack_require__(/*! ./_task */ \"./node_modules/_core-js@2.6.10@core-js/modules/_task.js\").set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\")(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    // Promise.resolve without an argument throws an error in LG WebOS 2\n    var promise = Promise.resolve(undefined);\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcz85NDk3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIE9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIFNhZmFyaSAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChPYnNlcnZlciAmJiAhKGdsb2JhbC5uYXZpZ2F0b3IgJiYgZ2xvYmFsLm5hdmlnYXRvci5zdGFuZGFsb25lKSkge1xuICAgIHZhciB0b2dnbGUgPSB0cnVlO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_microtask.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js ***!
  \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\");\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzPzIxY2IiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5cbmZ1bmN0aW9uIFByb21pc2VDYXBhYmlsaXR5KEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-assign.js":
/*!************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-assign.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\");\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\");\nvar gOPS = __webpack_require__(/*! ./_object-gops */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js\");\nvar pIE = __webpack_require__(/*! ./_object-pie */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js\");\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\");\nvar IObject = __webpack_require__(/*! ./_iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js\");\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\")(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n    }\n  } return T;\n} : $assign;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzPzg3YzUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgUyA9IFN5bWJvbCgpO1xuICB2YXIgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICB3aGlsZSAoYUxlbiA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBpc0VudW0uY2FsbChTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-assign.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-create.js":
/*!************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-create.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar dPs = __webpack_require__(/*! ./_object-dps */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dps.js\");\nvar enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js\");\nvar IE_PROTO = __webpack_require__(/*! ./_shared-key */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js\")('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(/*! ./_dom-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js\")('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  __webpack_require__(/*! ./_html */ \"./node_modules/_core-js@2.6.10@core-js/modules/_html.js\").appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzPzY1YzMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-create.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js\");\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js\");\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcz9kM2Q4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-dps.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-dps.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\");\n\nmodule.exports = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzPzhkNjkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-dps.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var pIE = __webpack_require__(/*! ./_object-pie */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js\");\nvar createDesc = __webpack_require__(/*! ./_property-desc */ \"./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\");\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\nvar toPrimitive = __webpack_require__(/*! ./_to-primitive */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js\");\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ie8-dom-define.js\");\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanM/ZTQ5MyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0lPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBnT1BEKE8sIFApO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(/*! ./_object-keys-internal */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js\");\nvar hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js\").concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanM/Y2IyZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuNyAvIDE1LjIuMy40IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJykuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("exports.f = Object.getOwnPropertySymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanM/OWQ2MSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-gpo.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-gpo.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\");\nvar IE_PROTO = __webpack_require__(/*! ./_shared-key */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js\")('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzP2QxNWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-gpo.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js":
/*!*******************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js ***!
  \*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\nvar arrayIndexOf = __webpack_require__(/*! ./_array-includes */ \"./node_modules/_core-js@2.6.10@core-js/modules/_array-includes.js\")(false);\nvar IE_PROTO = __webpack_require__(/*! ./_shared-key */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js\")('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanM/N2FmZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(/*! ./_object-keys-internal */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys-internal.js\");\nvar enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_enum-bug-keys.js\");\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanM/N2Q1NiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("exports.f = {}.propertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzP2M4NjQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-pie.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_object-sap.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_object-sap.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\");\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\");\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXNhcC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19vYmplY3Qtc2FwLmpzPzg4NjgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjKSB7XG4gIHZhciBmbiA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXTtcbiAgdmFyIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_object-sap.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_own-keys.js":
/*!*******************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_own-keys.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js\");\nvar gOPS = __webpack_require__(/*! ./_object-gops */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gops.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar Reflect = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\").Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb3duLWtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fb3duLWtleXMuanM/ZjM2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBSZWZsZWN0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdDtcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJiBSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdPUE4uZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgcmV0dXJuIGdldFN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_own-keys.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_perform.js":
/*!******************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_perform.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19wZXJmb3JtLmpzP2Q4YmQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGU6IGZhbHNlLCB2OiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7IGU6IHRydWUsIHY6IGUgfTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_perform.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js":
/*!**************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar newPromiseCapability = __webpack_require__(/*! ./_new-promise-capability */ \"./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js\");\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcHJvbWlzZS1yZXNvbHZlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcz9hMDdjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js":
/*!************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzPzA2MTQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_property-desc.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_redefine-all.js":
/*!***********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_redefine-all.js ***!
  \***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nmodule.exports = function (target, src, safe) {\n  for (var key in src) redefine(target, key, src[key], safe);\n  return target;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcz9hMTdjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_redefine-all.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js":
/*!*******************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar SRC = __webpack_require__(/*! ./_uid */ \"./node_modules/_core-js@2.6.10@core-js/modules/_uid.js\")('src');\nvar $toString = __webpack_require__(/*! ./_function-to-string */ \"./node_modules/_core-js@2.6.10@core-js/modules/_function-to-string.js\");\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\").inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanM/YTZkNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBTUkMgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJyk7XG52YXIgJHRvU3RyaW5nID0gcmVxdWlyZSgnLi9fZnVuY3Rpb24tdG8tc3RyaW5nJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciBUUEwgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7XG5cbnJlcXVpcmUoJy4vX2NvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWwsIHNhZmUpIHtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgdmFsID09ICdmdW5jdGlvbic7XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCAnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIGlmIChPW2tleV0gPT09IHZhbCkgcmV0dXJuO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgU1JDKSB8fCBoaWRlKHZhbCwgU1JDLCBPW2tleV0gPyAnJyArIE9ba2V5XSA6IFRQTC5qb2luKFN0cmluZyhrZXkpKSk7XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSBpZiAoIXNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9IGVsc2UgaWYgKE9ba2V5XSkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js":
/*!*******************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js ***!
  \*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar classof = __webpack_require__(/*! ./_classof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_classof.js\");\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n  var exec = R.exec;\n  if (typeof exec === 'function') {\n    var result = exec.call(R, S);\n    if (typeof result !== 'object') {\n      throw new TypeError('RegExp exec method returned something other than an Object or null');\n    }\n    return result;\n  }\n  if (classof(R) !== 'RegExp') {\n    throw new TypeError('RegExp#exec called on incompatible receiver');\n  }\n  return builtinExec.call(R, S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanM/MjEzNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIGJ1aWx0aW5FeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuXG4gLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwZXhlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoUiwgUykge1xuICB2YXIgZXhlYyA9IFIuZXhlYztcbiAgaWYgKHR5cGVvZiBleGVjID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlc3VsdCA9IGV4ZWMuY2FsbChSLCBTKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZ0V4cCBleGVjIG1ldGhvZCByZXR1cm5lZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBPYmplY3Qgb3IgbnVsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmIChjbGFzc29mKFIpICE9PSAnUmVnRXhwJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZ0V4cCNleGVjIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXInKTtcbiAgfVxuICByZXR1cm4gYnVpbHRpbkV4ZWMuY2FsbChSLCBTKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar regexpFlags = __webpack_require__(/*! ./_flags */ \"./node_modules/_core-js@2.6.10@core-js/modules/_flags.js\");\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n  var re1 = /a/,\n      re2 = /b*/g;\n  nativeExec.call(re1, 'a');\n  nativeExec.call(re2, 'a');\n  return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n  patchedExec = function exec(str) {\n    var re = this;\n    var lastIndex, reCopy, match, i;\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n    }\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n    match = nativeExec.call(re, str);\n\n    if (UPDATES_LAST_INDEX_WRONG && match) {\n      re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n    }\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n      // eslint-disable-next-line no-loop-func\n      nativeReplace.call(match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMuanM/MTMzYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciByZWdleHBGbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG5cbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuLy8gVGhpcyBhbHdheXMgcmVmZXJzIHRvIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24sIGJlY2F1c2UgdGhlXG4vLyBTdHJpbmcjcmVwbGFjZSBwb2x5ZmlsbCB1c2VzIC4vZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyxcbi8vIHdoaWNoIGxvYWRzIHRoaXMgZmlsZSBiZWZvcmUgcGF0Y2hpbmcgdGhlIG1ldGhvZC5cbnZhciBuYXRpdmVSZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xuXG52YXIgcGF0Y2hlZEV4ZWMgPSBuYXRpdmVFeGVjO1xuXG52YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xuXG52YXIgVVBEQVRFU19MQVNUX0lOREVYX1dST05HID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlMSA9IC9hLyxcbiAgICAgIHJlMiA9IC9iKi9nO1xuICBuYXRpdmVFeGVjLmNhbGwocmUxLCAnYScpO1xuICBuYXRpdmVFeGVjLmNhbGwocmUyLCAnYScpO1xuICByZXR1cm4gcmUxW0xBU1RfSU5ERVhdICE9PSAwIHx8IHJlMltMQVNUX0lOREVYXSAhPT0gMDtcbn0pKCk7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEO1xuXG5pZiAoUEFUQ0gpIHtcbiAgcGF0Y2hlZEV4ZWMgPSBmdW5jdGlvbiBleGVjKHN0cikge1xuICAgIHZhciByZSA9IHRoaXM7XG4gICAgdmFyIGxhc3RJbmRleCwgcmVDb3B5LCBtYXRjaCwgaTtcblxuICAgIGlmIChOUENHX0lOQ0xVREVEKSB7XG4gICAgICByZUNvcHkgPSBuZXcgUmVnRXhwKCdeJyArIHJlLnNvdXJjZSArICckKD8hXFxcXHMpJywgcmVnZXhwRmxhZ3MuY2FsbChyZSkpO1xuICAgIH1cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HKSBsYXN0SW5kZXggPSByZVtMQVNUX0lOREVYXTtcblxuICAgIG1hdGNoID0gbmF0aXZlRXhlYy5jYWxsKHJlLCBzdHIpO1xuXG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkge1xuICAgICAgcmVbTEFTVF9JTkRFWF0gPSByZS5nbG9iYWwgPyBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCA6IGxhc3RJbmRleDtcbiAgICB9XG4gICAgaWYgKE5QQ0dfSU5DTFVERUQgJiYgbWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGBcbiAgICAgIC8vIGZvciBOUENHLCBsaWtlIElFOC4gTk9URTogVGhpcyBkb2Vzbicgd29yayBmb3IgLyguPyk/L1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICAgICAgbmF0aXZlUmVwbGFjZS5jYWxsKG1hdGNoWzBdLCByZUNvcHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHtcbiAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldID09PSB1bmRlZmluZWQpIG1hdGNoW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hlZEV4ZWM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_set-proto.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_set-proto.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\")(Function.call, __webpack_require__(/*! ./_object-gopd */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js\").f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXByb3RvLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qcz9hZTZlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbiAodGVzdCwgYnVnZ3ksIHNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgYnVnZ3kgPSB0cnVlOyB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZiAoYnVnZ3kpIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgICAgIGVsc2Ugc2V0KE8sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIE87XG4gICAgICB9O1xuICAgIH0oe30sIGZhbHNlKSA6IHVuZGVmaW5lZCksXG4gIGNoZWNrOiBjaGVja1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_set-proto.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\");\nvar SPECIES = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanM/ZTQ2NSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZiAoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSkgZFAuZihDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js":
/*!****************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js ***!
  \****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var def = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\").f;\nvar has = __webpack_require__(/*! ./_has */ \"./node_modules/_core-js@2.6.10@core-js/modules/_has.js\");\nvar TAG = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanM/M2Q4NyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var shared = __webpack_require__(/*! ./_shared */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared.js\")('keys');\nvar uid = __webpack_require__(/*! ./_uid */ \"./node_modules/_core-js@2.6.10@core-js/modules/_uid.js\");\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzPzk5NDciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_shared-key.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_shared.js":
/*!*****************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_shared.js ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var core = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: __webpack_require__(/*! ./_library */ \"./node_modules/_core-js@2.6.10@core-js/modules/_library.js\") ? 'pure' : 'global',\n  copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qcz9mMzQxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogY29yZS52ZXJzaW9uLFxuICBtb2RlOiByZXF1aXJlKCcuL19saWJyYXJ5JykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_shared.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js":
/*!******************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js ***!
  \******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\");\nvar SPECIES = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzPzk1ZTMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_string-at.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_string-at.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\");\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\");\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcz8xZWIwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_string-at.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_task.js":
/*!***************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_task.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\");\nvar invoke = __webpack_require__(/*! ./_invoke */ \"./node_modules/_core-js@2.6.10@core-js/modules/_invoke.js\");\nvar html = __webpack_require__(/*! ./_html */ \"./node_modules/_core-js@2.6.10@core-js/modules/_html.js\");\nvar cel = __webpack_require__(/*! ./_dom-create */ \"./node_modules/_core-js@2.6.10@core-js/modules/_dom-create.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (__webpack_require__(/*! ./_cof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_cof.js\")(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdGFzay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL190YXNrLmpzPzJkYmMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGludm9rZSA9IHJlcXVpcmUoJy4vX2ludm9rZScpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY2VsID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBzZXRUYXNrID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhclRhc2sgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpZCA9ICt0aGlzO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0VGFzayB8fCAhY2xlYXJUYXNrKSB7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2VzcycpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3coY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_task.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-absolute-index.js":
/*!****************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-absolute-index.js ***!
  \****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\");\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanM/YzNhOSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-absolute-index.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzP2E2YWQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(/*! ./_iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iobject.js\");\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\");\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8taW9iamVjdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzPzYxMTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.1.15 ToLength\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\");\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcz84OTQxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js":
/*!********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(/*! ./_defined */ \"./node_modules/_core-js@2.6.10@core-js/modules/_defined.js\");\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcz9hOWNmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js":
/*!***********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js ***!
  \***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcz8yYWIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_to-primitive.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_uid.js":
/*!**************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_uid.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdWlkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3VpZC5qcz80ZDJjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_uid.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_user-agent.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_user-agent.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fdXNlci1hZ2VudC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL191c2VyLWFnZW50LmpzPzFjZDciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG5hdmlnYXRvciA9IGdsb2JhbC5uYXZpZ2F0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_user-agent.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/_wks.js":
/*!**************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/_wks.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var store = __webpack_require__(/*! ./_shared */ \"./node_modules/_core-js@2.6.10@core-js/modules/_shared.js\")('wks');\nvar uid = __webpack_require__(/*! ./_uid */ \"./node_modules/_core-js@2.6.10@core-js/modules/_uid.js\");\nvar Symbol = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\").Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9fd2tzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvX3drcy5qcz8xMjc3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/core.get-iterator-method.js":
/*!**********************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/core.get-iterator-method.js ***!
  \**********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var classof = __webpack_require__(/*! ./_classof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_classof.js\");\nvar ITERATOR = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('iterator');\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nmodule.exports = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\").getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanM/NWZmZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/core.get-iterator-method.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js":
/*!****************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js ***!
  \****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\nvar addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ \"./node_modules/_core-js@2.6.10@core-js/modules/_add-to-unscopables.js\");\nvar step = __webpack_require__(/*! ./_iter-step */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-step.js\");\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(/*! ./_iter-define */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-define.js\")(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanM/OTZkZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBraW5kID0gdGhpcy5faztcbiAgdmFyIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZiAoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpIHtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js":
/*!***************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js ***!
  \***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\").f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") && dP(FProto, NAME, {\n  configurable: true,\n  get: function () {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzPzdjZmQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBGUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgbmFtZVJFID0gL15cXHMqZnVuY3Rpb24gKFteIChdKikvO1xudmFyIE5BTUUgPSAnbmFtZSc7XG5cbi8vIDE5LjIuNC4yIG5hbWVcbk5BTUUgaW4gRlByb3RvIHx8IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgZFAoRlByb3RvLCBOQU1FLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js":
/*!***************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js ***!
  \***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(/*! ./_object-assign */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-assign.js\") });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduLmpzP2U3ODMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0JywgeyBhc3NpZ246IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js":
/*!*************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js ***!
  \*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\");\nvar $keys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\");\n\n__webpack_require__(/*! ./_object-sap */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-sap.js\")('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanM/ZWQ4YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\nvar LIBRARY = __webpack_require__(/*! ./_library */ \"./node_modules/_core-js@2.6.10@core-js/modules/_library.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar ctx = __webpack_require__(/*! ./_ctx */ \"./node_modules/_core-js@2.6.10@core-js/modules/_ctx.js\");\nvar classof = __webpack_require__(/*! ./_classof */ \"./node_modules/_core-js@2.6.10@core-js/modules/_classof.js\");\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar isObject = __webpack_require__(/*! ./_is-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-object.js\");\nvar aFunction = __webpack_require__(/*! ./_a-function */ \"./node_modules/_core-js@2.6.10@core-js/modules/_a-function.js\");\nvar anInstance = __webpack_require__(/*! ./_an-instance */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-instance.js\");\nvar forOf = __webpack_require__(/*! ./_for-of */ \"./node_modules/_core-js@2.6.10@core-js/modules/_for-of.js\");\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js\");\nvar task = __webpack_require__(/*! ./_task */ \"./node_modules/_core-js@2.6.10@core-js/modules/_task.js\").set;\nvar microtask = __webpack_require__(/*! ./_microtask */ \"./node_modules/_core-js@2.6.10@core-js/modules/_microtask.js\")();\nvar newPromiseCapabilityModule = __webpack_require__(/*! ./_new-promise-capability */ \"./node_modules/_core-js@2.6.10@core-js/modules/_new-promise-capability.js\");\nvar perform = __webpack_require__(/*! ./_perform */ \"./node_modules/_core-js@2.6.10@core-js/modules/_perform.js\");\nvar userAgent = __webpack_require__(/*! ./_user-agent */ \"./node_modules/_core-js@2.6.10@core-js/modules/_user-agent.js\");\nvar promiseResolve = __webpack_require__(/*! ./_promise-resolve */ \"./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js\");\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[__webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function')\n      && promise.then(empty) instanceof FakePromise\n      // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n      // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n      // we can't detect it synchronously, so just check versions\n      && v8.indexOf('6.6') !== 0\n      && userAgent.indexOf('Chrome/66') === -1;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = __webpack_require__(/*! ./_redefine-all */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine-all.js\")($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(/*! ./_set-to-string-tag */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-to-string-tag.js\")($Promise, PROMISE);\n__webpack_require__(/*! ./_set-species */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js\")(PROMISE);\nWrapper = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\")[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(/*! ./_iter-detect */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iter-detect.js\")(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY29yZS1qc0AyLjYuMTBAY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzP2E2MGEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52OCB8fCAnJztcbnZhciAkUHJvbWlzZSA9IGdsb2JhbFtQUk9NSVNFXTtcbnZhciBpc05vZGUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcbnZhciBlbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBJbnRlcm5hbCwgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSAkUHJvbWlzZS5yZXNvbHZlKDEpO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW3JlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyldID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICAgIGV4ZWMoZW1wdHksIGVtcHR5KTtcbiAgICB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpXG4gICAgICAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2VcbiAgICAgIC8vIHY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgICAgLy8gd2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgICAgICYmIHY4LmluZGV4T2YoJzYuNicpICE9PSAwXG4gICAgICAmJiB1c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lLzY2JykgPT09IC0xO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHByb21pc2UsIGlzUmVqZWN0KSB7XG4gIGlmIChwcm9taXNlLl9uKSByZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIG9rID0gcHJvbWlzZS5fcyA9PSAxO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24gKHJlYWN0aW9uKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlLl9oID09IDIpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIG1heSB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkgcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKSBvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIHVuaGFuZGxlZCA9IGlzVW5oYW5kbGVkKHByb21pc2UpO1xuICAgIHZhciByZXN1bHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYgKHVuaGFuZGxlZCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodW5oYW5kbGVkICYmIHJlc3VsdC5lKSB0aHJvdyByZXN1bHQudjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgcmV0dXJuIHByb21pc2UuX2ggIT09IDEgJiYgKHByb21pc2UuX2EgfHwgcHJvbWlzZS5fYykubGVuZ3RoID09PSAwO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZiAoaXNOb2RlKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKSB7XG4gICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92IH0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmICghcHJvbWlzZS5fYSkgcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIHZhciB0aGVuO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZiAodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgICRyZWplY3QuY2FsbCh7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmICghVVNFX05BVElWRSkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fYSkgdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9zKSBub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGN0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09ICRQcm9taXNlIHx8IEMgPT09IFdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBQcm9taXNlOiAkUHJvbWlzZSB9KTtcbnJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJykoJFByb21pc2UsIFBST01JU0UpO1xucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSByZXF1aXJlKCcuL19jb3JlJylbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgdmFyICQkcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChMSUJSQVJZIHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKExJQlJBUlkgJiYgdGhpcyA9PT0gV3JhcHBlciA/ICRQcm9taXNlIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikge1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciAkaW5kZXggPSBpbmRleCsrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.constructor.js":
/*!********************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.constructor.js ***!
  \********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ \"./node_modules/_core-js@2.6.10@core-js/modules/_inherit-if-required.js\");\nvar dP = __webpack_require__(/*! ./_object-dp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-dp.js\").f;\nvar gOPN = __webpack_require__(/*! ./_object-gopn */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gopn.js\").f;\nvar isRegExp = __webpack_require__(/*! ./_is-regexp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js\");\nvar $flags = __webpack_require__(/*! ./_flags */ \"./node_modules/_core-js@2.6.10@core-js/modules/_flags.js\");\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (__webpack_require__(/*! ./_descriptors */ \"./node_modules/_core-js@2.6.10@core-js/modules/_descriptors.js\") && (!CORRECT_NEW || __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\")(function () {\n  re2[__webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\")('match')] = false;\n  // RegExp constructor can alter flags and IsRegExp works correct with @@match\n  return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n  $RegExp = function RegExp(p, f) {\n    var tiRE = this instanceof $RegExp;\n    var piRE = isRegExp(p);\n    var fiU = f === undefined;\n    return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n      : inheritIfRequired(CORRECT_NEW\n        ? new Base(piRE && !fiU ? p.source : p, f)\n        : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n      , tiRE ? this : proto, $RegExp);\n  };\n  var proxy = function (key) {\n    key in $RegExp || dP($RegExp, key, {\n      configurable: true,\n      get: function () { return Base[key]; },\n      set: function (it) { Base[key] = it; }\n    });\n  };\n  for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n  proto.constructor = $RegExp;\n  $RegExp.prototype = proto;\n  __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\")(global, 'RegExp', $RegExp);\n}\n\n__webpack_require__(/*! ./_set-species */ \"./node_modules/_core-js@2.6.10@core-js/modules/_set-species.js\")('RegExp');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcz9kNDc5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyICRmbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG52YXIgJFJlZ0V4cCA9IGdsb2JhbC5SZWdFeHA7XG52YXIgQmFzZSA9ICRSZWdFeHA7XG52YXIgcHJvdG8gPSAkUmVnRXhwLnByb3RvdHlwZTtcbnZhciByZTEgPSAvYS9nO1xudmFyIHJlMiA9IC9hL2c7XG4vLyBcIm5ld1wiIGNyZWF0ZXMgYSBuZXcgb2JqZWN0LCBvbGQgd2Via2l0IGJ1Z2d5IGhlcmVcbnZhciBDT1JSRUNUX05FVyA9IG5ldyAkUmVnRXhwKHJlMSkgIT09IHJlMTtcblxuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgKCFDT1JSRUNUX05FVyB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmUyW3JlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpXSA9IGZhbHNlO1xuICAvLyBSZWdFeHAgY29uc3RydWN0b3IgY2FuIGFsdGVyIGZsYWdzIGFuZCBJc1JlZ0V4cCB3b3JrcyBjb3JyZWN0IHdpdGggQEBtYXRjaFxuICByZXR1cm4gJFJlZ0V4cChyZTEpICE9IHJlMSB8fCAkUmVnRXhwKHJlMikgPT0gcmUyIHx8ICRSZWdFeHAocmUxLCAnaScpICE9ICcvYS9pJztcbn0pKSkge1xuICAkUmVnRXhwID0gZnVuY3Rpb24gUmVnRXhwKHAsIGYpIHtcbiAgICB2YXIgdGlSRSA9IHRoaXMgaW5zdGFuY2VvZiAkUmVnRXhwO1xuICAgIHZhciBwaVJFID0gaXNSZWdFeHAocCk7XG4gICAgdmFyIGZpVSA9IGYgPT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gIXRpUkUgJiYgcGlSRSAmJiBwLmNvbnN0cnVjdG9yID09PSAkUmVnRXhwICYmIGZpVSA/IHBcbiAgICAgIDogaW5oZXJpdElmUmVxdWlyZWQoQ09SUkVDVF9ORVdcbiAgICAgICAgPyBuZXcgQmFzZShwaVJFICYmICFmaVUgPyBwLnNvdXJjZSA6IHAsIGYpXG4gICAgICAgIDogQmFzZSgocGlSRSA9IHAgaW5zdGFuY2VvZiAkUmVnRXhwKSA/IHAuc291cmNlIDogcCwgcGlSRSAmJiBmaVUgPyAkZmxhZ3MuY2FsbChwKSA6IGYpXG4gICAgICAsIHRpUkUgPyB0aGlzIDogcHJvdG8sICRSZWdFeHApO1xuICB9O1xuICB2YXIgcHJveHkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAga2V5IGluICRSZWdFeHAgfHwgZFAoJFJlZ0V4cCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEJhc2Vba2V5XTsgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKGl0KSB7IEJhc2Vba2V5XSA9IGl0OyB9XG4gICAgfSk7XG4gIH07XG4gIGZvciAodmFyIGtleXMgPSBnT1BOKEJhc2UpLCBpID0gMDsga2V5cy5sZW5ndGggPiBpOykgcHJveHkoa2V5c1tpKytdKTtcbiAgcHJvdG8uY29uc3RydWN0b3IgPSAkUmVnRXhwO1xuICAkUmVnRXhwLnByb3RvdHlwZSA9IHByb3RvO1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKGdsb2JhbCwgJ1JlZ0V4cCcsICRSZWdFeHApO1xufVxuXG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKCdSZWdFeHAnKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.constructor.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.exec.js":
/*!*************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.exec.js ***!
  \*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js\");\n__webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\")({\n  target: 'RegExp',\n  proto: true,\n  forced: regexpExec !== /./.exec\n}, {\n  exec: regexpExec\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmV4ZWMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmV4ZWMuanM/YjNmMyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgcmVnZXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjJyk7XG5yZXF1aXJlKCcuL19leHBvcnQnKSh7XG4gIHRhcmdldDogJ1JlZ0V4cCcsXG4gIHByb3RvOiB0cnVlLFxuICBmb3JjZWQ6IHJlZ2V4cEV4ZWMgIT09IC8uLy5leGVjXG59LCB7XG4gIGV4ZWM6IHJlZ2V4cEV4ZWNcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.exec.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.match.js":
/*!**************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.match.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ \"./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js\");\nvar regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js\");\n\n// @@match logic\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js\")('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n  return [\n    // `String.prototype.match` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.match\n    function match(regexp) {\n      var O = defined(this);\n      var fn = regexp == undefined ? undefined : regexp[MATCH];\n      return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n    },\n    // `RegExp.prototype[@@match]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n    function (regexp) {\n      var res = maybeCallNative($match, regexp, this);\n      if (res.done) return res.value;\n      var rx = anObject(regexp);\n      var S = String(this);\n      if (!rx.global) return regExpExec(rx, S);\n      var fullUnicode = rx.unicode;\n      rx.lastIndex = 0;\n      var A = [];\n      var n = 0;\n      var result;\n      while ((result = regExpExec(rx, S)) !== null) {\n        var matchStr = String(result[0]);\n        A[n] = matchStr;\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n        n++;\n      }\n      return n === 0 ? null : A;\n    }\n  ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qcz9lYmVjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuL19hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG4vLyBAQG1hdGNoIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ21hdGNoJywgMSwgZnVuY3Rpb24gKGRlZmluZWQsIE1BVENILCAkbWF0Y2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLm1hdGNoXG4gICAgZnVuY3Rpb24gbWF0Y2gocmVnZXhwKSB7XG4gICAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgICB2YXIgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXShTdHJpbmcoTykpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBtYXRjaFxuICAgIGZ1bmN0aW9uIChyZWdleHApIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoJG1hdGNoLCByZWdleHAsIHRoaXMpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgaWYgKCFyeC5nbG9iYWwpIHJldHVybiByZWdFeHBFeGVjKHJ4LCBTKTtcbiAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHZhciBuID0gMDtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICB3aGlsZSAoKHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpKSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.match.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js":
/*!****************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js ***!
  \****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar toObject = __webpack_require__(/*! ./_to-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-object.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar toInteger = __webpack_require__(/*! ./_to-integer */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-integer.js\");\nvar advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ \"./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js\");\nvar regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js\");\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n  return it === undefined ? it : String(it);\n};\n\n// @@replace logic\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js\")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n  return [\n    // `String.prototype.replace` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n    function replace(searchValue, replaceValue) {\n      var O = defined(this);\n      var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n      return fn !== undefined\n        ? fn.call(searchValue, O, replaceValue)\n        : $replace.call(String(O), searchValue, replaceValue);\n    },\n    // `RegExp.prototype[@@replace]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n    function (regexp, replaceValue) {\n      var res = maybeCallNative($replace, regexp, this, replaceValue);\n      if (res.done) return res.value;\n\n      var rx = anObject(regexp);\n      var S = String(this);\n      var functionalReplace = typeof replaceValue === 'function';\n      if (!functionalReplace) replaceValue = String(replaceValue);\n      var global = rx.global;\n      if (global) {\n        var fullUnicode = rx.unicode;\n        rx.lastIndex = 0;\n      }\n      var results = [];\n      while (true) {\n        var result = regExpExec(rx, S);\n        if (result === null) break;\n        results.push(result);\n        if (!global) break;\n        var matchStr = String(result[0]);\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n      }\n      var accumulatedResult = '';\n      var nextSourcePosition = 0;\n      for (var i = 0; i < results.length; i++) {\n        result = results[i];\n        var matched = String(result[0]);\n        var position = max(min(toInteger(result.index), S.length), 0);\n        var captures = [];\n        // NOTE: This is equivalent to\n        //   captures = result.slice(1).map(maybeToString)\n        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n        // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n        for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n        var namedCaptures = result.groups;\n        if (functionalReplace) {\n          var replacerArgs = [matched].concat(captures, position, S);\n          if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n          var replacement = String(replaceValue.apply(undefined, replacerArgs));\n        } else {\n          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n        }\n        if (position >= nextSourcePosition) {\n          accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n          nextSourcePosition = position + matched.length;\n        }\n      }\n      return accumulatedResult + S.slice(nextSourcePosition);\n    }\n  ];\n\n    // https://tc39.github.io/ecma262/#sec-getsubstitution\n  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n    var tailPos = position + matched.length;\n    var m = captures.length;\n    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n    if (namedCaptures !== undefined) {\n      namedCaptures = toObject(namedCaptures);\n      symbols = SUBSTITUTION_SYMBOLS;\n    }\n    return $replace.call(replacement, symbols, function (match, ch) {\n      var capture;\n      switch (ch.charAt(0)) {\n        case '$': return '$';\n        case '&': return matched;\n        case '`': return str.slice(0, position);\n        case \"'\": return str.slice(tailPos);\n        case '<':\n          capture = namedCaptures[ch.slice(1, -1)];\n          break;\n        default: // \\d\\d?\n          var n = +ch;\n          if (n === 0) return match;\n          if (n > m) {\n            var f = floor(n / 10);\n            if (f === 0) return match;\n            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n            return match;\n          }\n          capture = captures[n - 1];\n      }\n      return capture === undefined ? '' : capture;\n    });\n  }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanM/YzA0MSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFMgPSAvXFwkKFskJmAnXXxcXGRcXGQ/fDxbXj5dKj4pL2c7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQgPSAvXFwkKFskJmAnXXxcXGRcXGQ/KS9nO1xuXG52YXIgbWF5YmVUb1N0cmluZyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG5cbi8vIEBAcmVwbGFjZSBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFJFUExBQ0UsICRyZXBsYWNlLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGxhY2VcbiAgICBmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICAgIHZhciBmbiA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBmbi5jYWxsKHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpXG4gICAgICAgIDogJHJlcGxhY2UuY2FsbChTdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHJlcGxhY2VcbiAgICBmdW5jdGlvbiAocmVnZXhwLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoJHJlcGxhY2UsIHJlZ2V4cCwgdGhpcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIGZ1bmN0aW9uYWxSZXBsYWNlID0gdHlwZW9mIHJlcGxhY2VWYWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGlmICghZnVuY3Rpb25hbFJlcGxhY2UpIHJlcGxhY2VWYWx1ZSA9IFN0cmluZyhyZXBsYWNlVmFsdWUpO1xuICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDtcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIGJyZWFrO1xuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgaWYgKG1hdGNoU3RyID09PSAnJykgcngubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKHJ4Lmxhc3RJbmRleCksIGZ1bGxVbmljb2RlKTtcbiAgICAgIH1cbiAgICAgIHZhciBhY2N1bXVsYXRlZFJlc3VsdCA9ICcnO1xuICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1tpXTtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTtcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gW107XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKVxuICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgLy8gdGhlIHNsaWNlIHBvbHlmaWxsIHdoZW4gc2xpY2luZyBuYXRpdmUgYXJyYXlzKSBcImRvZXNuJ3Qgd29ya1wiIGluIHNhZmFyaSA5IGFuZFxuICAgICAgICAvLyBjYXVzZXMgYSBjcmFzaCAoaHR0cHM6Ly9wYXN0ZWJpbi5jb20vTjIxUXplUUEpIHdoZW4gdHJ5aW5nIHRvIGRlYnVnIGl0LlxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7XG4gICAgICAgICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgcmVwbGFjZXJBcmdzLnB1c2gobmFtZWRDYXB0dXJlcyk7XG4gICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gU3RyaW5nKHJlcGxhY2VWYWx1ZS5hcHBseSh1bmRlZmluZWQsIHJlcGxhY2VyQXJncykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIFMsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgYWNjdW11bGF0ZWRSZXN1bHQgKz0gUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIFMuc2xpY2UobmV4dFNvdXJjZVBvc2l0aW9uKTtcbiAgICB9XG4gIF07XG5cbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRzdWJzdGl0dXRpb25cbiAgZnVuY3Rpb24gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuICAgIHZhciB0YWlsUG9zID0gcG9zaXRpb24gKyBtYXRjaGVkLmxlbmd0aDtcbiAgICB2YXIgbSA9IGNhcHR1cmVzLmxlbmd0aDtcbiAgICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEO1xuICAgIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5hbWVkQ2FwdHVyZXMgPSB0b09iamVjdChuYW1lZENhcHR1cmVzKTtcbiAgICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUztcbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHtcbiAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgc3dpdGNoIChjaC5jaGFyQXQoMCkpIHtcbiAgICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICAgIGNhc2UgJyYnOiByZXR1cm4gbWF0Y2hlZDtcbiAgICAgICAgY2FzZSAnYCc6IHJldHVybiBzdHIuc2xpY2UoMCwgcG9zaXRpb24pO1xuICAgICAgICBjYXNlIFwiJ1wiOiByZXR1cm4gc3RyLnNsaWNlKHRhaWxQb3MpO1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICBjYXB0dXJlID0gbmFtZWRDYXB0dXJlc1tjaC5zbGljZSgxLCAtMSldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBcXGRcXGQ/XG4gICAgICAgICAgdmFyIG4gPSArY2g7XG4gICAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBpZiAobiA+IG0pIHtcbiAgICAgICAgICAgIHZhciBmID0gZmxvb3IobiAvIDEwKTtcbiAgICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICBpZiAoZiA8PSBtKSByZXR1cm4gY2FwdHVyZXNbZiAtIDFdID09PSB1bmRlZmluZWQgPyBjaC5jaGFyQXQoMSkgOiBjYXB0dXJlc1tmIC0gMV0gKyBjaC5jaGFyQXQoMSk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FwdHVyZSA9PT0gdW5kZWZpbmVkID8gJycgOiBjYXB0dXJlO1xuICAgIH0pO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.split.js":
/*!**************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.split.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar isRegExp = __webpack_require__(/*! ./_is-regexp */ \"./node_modules/_core-js@2.6.10@core-js/modules/_is-regexp.js\");\nvar anObject = __webpack_require__(/*! ./_an-object */ \"./node_modules/_core-js@2.6.10@core-js/modules/_an-object.js\");\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js\");\nvar advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ \"./node_modules/_core-js@2.6.10@core-js/modules/_advance-string-index.js\");\nvar toLength = __webpack_require__(/*! ./_to-length */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-length.js\");\nvar callRegExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec-abstract.js\");\nvar regexpExec = __webpack_require__(/*! ./_regexp-exec */ \"./node_modules/_core-js@2.6.10@core-js/modules/_regexp-exec.js\");\nvar fails = __webpack_require__(/*! ./_fails */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fails.js\");\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\n__webpack_require__(/*! ./_fix-re-wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_fix-re-wks.js\")('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n  var internalSplit;\n  if (\n    'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n    'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n    'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n    '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n    '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n    ''[$SPLIT](/.?/)[LENGTH]\n  ) {\n    // based on es5-shim implementation, need to rework it\n    internalSplit = function (separator, limit) {\n      var string = String(this);\n      if (separator === undefined && limit === 0) return [];\n      // If `separator` is not a regex, use native split\n      if (!isRegExp(separator)) return $split.call(string, separator, limit);\n      var output = [];\n      var flags = (separator.ignoreCase ? 'i' : '') +\n                  (separator.multiline ? 'm' : '') +\n                  (separator.unicode ? 'u' : '') +\n                  (separator.sticky ? 'y' : '');\n      var lastLastIndex = 0;\n      var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n      // Make `global` and avoid `lastIndex` issues by working with a copy\n      var separatorCopy = new RegExp(separator.source, flags + 'g');\n      var match, lastIndex, lastLength;\n      while (match = regexpExec.call(separatorCopy, string)) {\n        lastIndex = separatorCopy[LAST_INDEX];\n        if (lastIndex > lastLastIndex) {\n          output.push(string.slice(lastLastIndex, match.index));\n          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n          lastLength = match[0][LENGTH];\n          lastLastIndex = lastIndex;\n          if (output[LENGTH] >= splitLimit) break;\n        }\n        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n      }\n      if (lastLastIndex === string[LENGTH]) {\n        if (lastLength || !separatorCopy.test('')) output.push('');\n      } else output.push(string.slice(lastLastIndex));\n      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n    };\n  // Chakra, V8\n  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n    internalSplit = function (separator, limit) {\n      return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n    };\n  } else {\n    internalSplit = $split;\n  }\n\n  return [\n    // `String.prototype.split` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.split\n    function split(separator, limit) {\n      var O = defined(this);\n      var splitter = separator == undefined ? undefined : separator[SPLIT];\n      return splitter !== undefined\n        ? splitter.call(separator, O, limit)\n        : internalSplit.call(String(O), separator, limit);\n    },\n    // `RegExp.prototype[@@split]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n    //\n    // NOTE: This cannot be properly polyfilled in engines that don't support\n    // the 'y' flag.\n    function (regexp, limit) {\n      var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n      if (res.done) return res.value;\n\n      var rx = anObject(regexp);\n      var S = String(this);\n      var C = speciesConstructor(rx, RegExp);\n\n      var unicodeMatching = rx.unicode;\n      var flags = (rx.ignoreCase ? 'i' : '') +\n                  (rx.multiline ? 'm' : '') +\n                  (rx.unicode ? 'u' : '') +\n                  (SUPPORTS_Y ? 'y' : 'g');\n\n      // ^(? + rx + ) is needed, in combination with some S slicing, to\n      // simulate the 'y' flag.\n      var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n      if (lim === 0) return [];\n      if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n      var p = 0;\n      var q = 0;\n      var A = [];\n      while (q < S.length) {\n        splitter.lastIndex = SUPPORTS_Y ? q : 0;\n        var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n        var e;\n        if (\n          z === null ||\n          (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n        ) {\n          q = advanceStringIndex(S, q, unicodeMatching);\n        } else {\n          A.push(S.slice(p, q));\n          if (A.length === lim) return A;\n          for (var i = 1; i <= z.length - 1; i++) {\n            A.push(z[i]);\n            if (A.length === lim) return A;\n          }\n          q = p = e;\n        }\n      }\n      A.push(S.slice(p));\n      return A;\n    }\n  ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcz9lNmQxIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNhbGxSZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJG1pbiA9IE1hdGgubWluO1xudmFyICRwdXNoID0gW10ucHVzaDtcbnZhciAkU1BMSVQgPSAnc3BsaXQnO1xudmFyIExFTkdUSCA9ICdsZW5ndGgnO1xudmFyIExBU1RfSU5ERVggPSAnbGFzdEluZGV4JztcbnZhciBNQVhfVUlOVDMyID0gMHhmZmZmZmZmZjtcblxuLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCd4JywgJ3knKSAtPiAveC95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBTVVBQT1JUU19ZID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsgUmVnRXhwKE1BWF9VSU5UMzIsICd5Jyk7IH0pO1xuXG4vLyBAQHNwbGl0IGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NwbGl0JywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFNQTElULCAkc3BsaXQsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICB2YXIgaW50ZXJuYWxTcGxpdDtcbiAgaWYgKFxuICAgICdhYmJjJ1skU1BMSVRdKC8oYikqLylbMV0gPT0gJ2MnIHx8XG4gICAgJ3Rlc3QnWyRTUExJVF0oLyg/OikvLCAtMSlbTEVOR1RIXSAhPSA0IHx8XG4gICAgJ2FiJ1skU1BMSVRdKC8oPzphYikqLylbTEVOR1RIXSAhPSAyIHx8XG4gICAgJy4nWyRTUExJVF0oLyguPykoLj8pLylbTEVOR1RIXSAhPSA0IHx8XG4gICAgJy4nWyRTUExJVF0oLygpKCkvKVtMRU5HVEhdID4gMSB8fFxuICAgICcnWyRTUExJVF0oLy4/LylbTEVOR1RIXVxuICApIHtcbiAgICAvLyBiYXNlZCBvbiBlczUtc2hpbSBpbXBsZW1lbnRhdGlvbiwgbmVlZCB0byByZXdvcmsgaXRcbiAgICBpbnRlcm5hbFNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHZhciBzdHJpbmcgPSBTdHJpbmcodGhpcyk7XG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDApIHJldHVybiBbXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHJldHVybiAkc3BsaXQuY2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgICAgdmFyIG91dHB1dCA9IFtdO1xuICAgICAgdmFyIGZsYWdzID0gKHNlcGFyYXRvci5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnN0aWNreSA/ICd5JyA6ICcnKTtcbiAgICAgIHZhciBsYXN0TGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBzcGxpdExpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIC8vIE1ha2UgYGdsb2JhbGAgYW5kIGF2b2lkIGBsYXN0SW5kZXhgIGlzc3VlcyBieSB3b3JraW5nIHdpdGggYSBjb3B5XG4gICAgICB2YXIgc2VwYXJhdG9yQ29weSA9IG5ldyBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgZmxhZ3MgKyAnZycpO1xuICAgICAgdmFyIG1hdGNoLCBsYXN0SW5kZXgsIGxhc3RMZW5ndGg7XG4gICAgICB3aGlsZSAobWF0Y2ggPSByZWdleHBFeGVjLmNhbGwoc2VwYXJhdG9yQ29weSwgc3RyaW5nKSkge1xuICAgICAgICBsYXN0SW5kZXggPSBzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdO1xuICAgICAgICBpZiAobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCkge1xuICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaFtMRU5HVEhdID4gMSAmJiBtYXRjaC5pbmRleCA8IHN0cmluZ1tMRU5HVEhdKSAkcHVzaC5hcHBseShvdXRwdXQsIG1hdGNoLnNsaWNlKDEpKTtcbiAgICAgICAgICBsYXN0TGVuZ3RoID0gbWF0Y2hbMF1bTEVOR1RIXTtcbiAgICAgICAgICBsYXN0TGFzdEluZGV4ID0gbGFzdEluZGV4O1xuICAgICAgICAgIGlmIChvdXRwdXRbTEVOR1RIXSA+PSBzcGxpdExpbWl0KSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0rKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYXN0SW5kZXggPT09IHN0cmluZ1tMRU5HVEhdKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXRbTEVOR1RIXSA+IHNwbGl0TGltaXQgPyBvdXRwdXQuc2xpY2UoMCwgc3BsaXRMaW1pdCkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYgKCcwJ1skU1BMSVRdKHVuZGVmaW5lZCwgMClbTEVOR1RIXSkge1xuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiAkc3BsaXQuY2FsbCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGludGVybmFsU3BsaXQgPSAkc3BsaXQ7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNwbGl0XG4gICAgZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIHNwbGl0dGVyID0gc2VwYXJhdG9yID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlcGFyYXRvcltTUExJVF07XG4gICAgICByZXR1cm4gc3BsaXR0ZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHNwbGl0dGVyLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgICAgOiBpbnRlcm5hbFNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc3BsaXRcbiAgICAvL1xuICAgIC8vIE5PVEU6IFRoaXMgY2Fubm90IGJlIHByb3Blcmx5IHBvbHlmaWxsZWQgaW4gZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnRcbiAgICAvLyB0aGUgJ3knIGZsYWcuXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgbGltaXQpIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoaW50ZXJuYWxTcGxpdCwgcmVnZXhwLCB0aGlzLCBsaW1pdCwgaW50ZXJuYWxTcGxpdCAhPT0gJHNwbGl0KTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG5cbiAgICAgIHZhciB1bmljb2RlTWF0Y2hpbmcgPSByeC51bmljb2RlO1xuICAgICAgdmFyIGZsYWdzID0gKHJ4Lmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4Lm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocngudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoU1VQUE9SVFNfWSA/ICd5JyA6ICdnJyk7XG5cbiAgICAgIC8vIF4oPyArIHJ4ICsgKSBpcyBuZWVkZWQsIGluIGNvbWJpbmF0aW9uIHdpdGggc29tZSBTIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKGxpbSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107XG4gICAgICB2YXIgcCA9IDA7XG4gICAgICB2YXIgcSA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgd2hpbGUgKHEgPCBTLmxlbmd0aCkge1xuICAgICAgICBzcGxpdHRlci5sYXN0SW5kZXggPSBTVVBQT1JUU19ZID8gcSA6IDA7XG4gICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeiA9PT0gbnVsbCB8fFxuICAgICAgICAgIChlID0gJG1pbih0b0xlbmd0aChzcGxpdHRlci5sYXN0SW5kZXggKyAoU1VQUE9SVFNfWSA/IDAgOiBxKSksIFMubGVuZ3RoKSkgPT09IHBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcSA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCBxLCB1bmljb2RlTWF0Y2hpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEEucHVzaChTLnNsaWNlKHAsIHEpKTtcbiAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gei5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIEEucHVzaCh6W2ldKTtcbiAgICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcSA9IHAgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBBLnB1c2goUy5zbGljZShwKSk7XG4gICAgICByZXR1cm4gQTtcbiAgICB9XG4gIF07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.split.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js":
/*!*************************************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js ***!
  \*************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar ownKeys = __webpack_require__(/*! ./_own-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_own-keys.js\");\nvar toIObject = __webpack_require__(/*! ./_to-iobject */ \"./node_modules/_core-js@2.6.10@core-js/modules/_to-iobject.js\");\nvar gOPD = __webpack_require__(/*! ./_object-gopd */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-gopd.js\");\nvar createProperty = __webpack_require__(/*! ./_create-property */ \"./node_modules/_core-js@2.6.10@core-js/modules/_create-property.js\");\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n    return result;\n  }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanM/ZWZjZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi9fb3duLWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgICB2YXIgZ2V0RGVzYyA9IGdPUEQuZjtcbiAgICB2YXIga2V5cyA9IG93bktleXMoTyk7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5LCBkZXNjO1xuICAgIHdoaWxlIChrZXlzLmxlbmd0aCA+IGkpIHtcbiAgICAgIGRlc2MgPSBnZXREZXNjKE8sIGtleSA9IGtleXNbaSsrXSk7XG4gICAgICBpZiAoZGVzYyAhPT0gdW5kZWZpbmVkKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGtleSwgZGVzYyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es7.object.get-own-property-descriptors.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js":
/*!*****************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js ***!
  \*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("// https://github.com/tc39/proposal-promise-finally\n\nvar $export = __webpack_require__(/*! ./_export */ \"./node_modules/_core-js@2.6.10@core-js/modules/_export.js\");\nvar core = __webpack_require__(/*! ./_core */ \"./node_modules/_core-js@2.6.10@core-js/modules/_core.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar speciesConstructor = __webpack_require__(/*! ./_species-constructor */ \"./node_modules/_core-js@2.6.10@core-js/modules/_species-constructor.js\");\nvar promiseResolve = __webpack_require__(/*! ./_promise-resolve */ \"./node_modules/_core-js@2.6.10@core-js/modules/_promise-resolve.js\");\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n  var C = speciesConstructor(this, core.Promise || global.Promise);\n  var isFunction = typeof onFinally == 'function';\n  return this.then(\n    isFunction ? function (x) {\n      return promiseResolve(C, onFinally()).then(function () { return x; });\n    } : onFinally,\n    isFunction ? function (e) {\n      return promiseResolve(C, onFinally()).then(function () { throw e; });\n    } : onFinally\n  );\n} });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseS5qcz84YjFmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtZmluYWxseVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1Byb21pc2UnLCB7ICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpO1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHRoaXMudGhlbihcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICB9IDogb25GaW5hbGx5LFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgfSA6IG9uRmluYWxseVxuICApO1xufSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js\n");

/***/ }),

/***/ "./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js":
/*!**************************************************************************!*\
  !*** ./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var $iterators = __webpack_require__(/*! ./es6.array.iterator */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js\");\nvar getKeys = __webpack_require__(/*! ./_object-keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/_object-keys.js\");\nvar redefine = __webpack_require__(/*! ./_redefine */ \"./node_modules/_core-js@2.6.10@core-js/modules/_redefine.js\");\nvar global = __webpack_require__(/*! ./_global */ \"./node_modules/_core-js@2.6.10@core-js/modules/_global.js\");\nvar hide = __webpack_require__(/*! ./_hide */ \"./node_modules/_core-js@2.6.10@core-js/modules/_hide.js\");\nvar Iterators = __webpack_require__(/*! ./_iterators */ \"./node_modules/_core-js@2.6.10@core-js/modules/_iterators.js\");\nvar wks = __webpack_require__(/*! ./_wks */ \"./node_modules/_core-js@2.6.10@core-js/modules/_wks.js\");\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2NvcmUtanNAMi42LjEwQGNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19jb3JlLWpzQDIuNi4xMEBjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcz80NjM0Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkaXRlcmF0b3JzID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciBJVEVSQVRPUiA9IHdrcygnaXRlcmF0b3InKTtcbnZhciBUT19TVFJJTkdfVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpO1xudmFyIEFycmF5VmFsdWVzID0gSXRlcmF0b3JzLkFycmF5O1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBDU1NSdWxlTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IGZhbHNlLFxuICBDU1NWYWx1ZUxpc3Q6IGZhbHNlLFxuICBDbGllbnRSZWN0TGlzdDogZmFsc2UsXG4gIERPTVJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NU3RyaW5nTGlzdDogZmFsc2UsXG4gIERPTVRva2VuTGlzdDogdHJ1ZSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IGZhbHNlLFxuICBGaWxlTGlzdDogZmFsc2UsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MRm9ybUVsZW1lbnQ6IGZhbHNlLFxuICBIVE1MU2VsZWN0RWxlbWVudDogZmFsc2UsXG4gIE1lZGlhTGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIE1pbWVUeXBlQXJyYXk6IGZhbHNlLFxuICBOYW1lZE5vZGVNYXA6IGZhbHNlLFxuICBOb2RlTGlzdDogdHJ1ZSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogZmFsc2UsXG4gIFBsdWdpbjogZmFsc2UsXG4gIFBsdWdpbkFycmF5OiBmYWxzZSxcbiAgU1ZHTGVuZ3RoTGlzdDogZmFsc2UsXG4gIFNWR051bWJlckxpc3Q6IGZhbHNlLFxuICBTVkdQYXRoU2VnTGlzdDogZmFsc2UsXG4gIFNWR1BvaW50TGlzdDogZmFsc2UsXG4gIFNWR1N0cmluZ0xpc3Q6IGZhbHNlLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiBmYWxzZSxcbiAgU291cmNlQnVmZmVyTGlzdDogZmFsc2UsXG4gIFN0eWxlU2hlZXRMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgVGV4dFRyYWNrQ3VlTGlzdDogZmFsc2UsXG4gIFRleHRUcmFja0xpc3Q6IGZhbHNlLFxuICBUb3VjaExpc3Q6IGZhbHNlXG59O1xuXG5mb3IgKHZhciBjb2xsZWN0aW9ucyA9IGdldEtleXMoRE9NSXRlcmFibGVzKSwgaSA9IDA7IGkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IGNvbGxlY3Rpb25zW2ldO1xuICB2YXIgZXhwbGljaXQgPSBET01JdGVyYWJsZXNbTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdO1xuICB2YXIgcHJvdG8gPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICB2YXIga2V5O1xuICBpZiAocHJvdG8pIHtcbiAgICBpZiAoIXByb3RvW0lURVJBVE9SXSkgaGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZiAoIXByb3RvW1RPX1NUUklOR19UQUddKSBoaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBBcnJheVZhbHVlcztcbiAgICBpZiAoZXhwbGljaXQpIGZvciAoa2V5IGluICRpdGVyYXRvcnMpIGlmICghcHJvdG9ba2V5XSkgcmVkZWZpbmUocHJvdG8sIGtleSwgJGl0ZXJhdG9yc1trZXldLCB0cnVlKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css":
/*!*******************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css ***!
  \*******************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("exports = module.exports = __webpack_require__(/*! ../../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"/**\\n * Swiper 4.5.1\\n * Most modern mobile touch slider and framework with hardware accelerated transitions\\n * http://www.idangero.us/swiper/\\n *\\n * Copyright 2014-2019 Vladimir Kharlampidi\\n *\\n * Released under the MIT License\\n *\\n * Released on: September 13, 2019\\n */\\n.swiper-container {\\n  margin-left: auto;\\n  margin-right: auto;\\n  position: relative;\\n  overflow: hidden;\\n  list-style: none;\\n  padding: 0;\\n  /* Fix of Webkit flickering */\\n  z-index: 1;\\n}\\n.swiper-container-no-flexbox .swiper-slide {\\n  float: left;\\n}\\n.swiper-container-vertical > .swiper-wrapper {\\n  -webkit-box-orient: vertical;\\n  -webkit-box-direction: normal;\\n  -webkit-flex-direction: column;\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n}\\n.swiper-wrapper {\\n  position: relative;\\n  width: 100%;\\n  height: 100%;\\n  z-index: 1;\\n  display: -webkit-box;\\n  display: -webkit-flex;\\n  display: -ms-flexbox;\\n  display: flex;\\n  -webkit-transition-property: -webkit-transform;\\n  transition-property: -webkit-transform;\\n  -o-transition-property: transform;\\n  transition-property: transform;\\n  transition-property: transform, -webkit-transform;\\n  -webkit-box-sizing: content-box;\\n  box-sizing: content-box;\\n}\\n.swiper-container-android .swiper-slide,\\n.swiper-wrapper {\\n  -webkit-transform: translate3d(0px, 0, 0);\\n  transform: translate3d(0px, 0, 0);\\n}\\n.swiper-container-multirow > .swiper-wrapper {\\n  -webkit-flex-wrap: wrap;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n}\\n.swiper-container-free-mode > .swiper-wrapper {\\n  -webkit-transition-timing-function: ease-out;\\n  -o-transition-timing-function: ease-out;\\n  transition-timing-function: ease-out;\\n  margin: 0 auto;\\n}\\n.swiper-slide {\\n  -webkit-flex-shrink: 0;\\n  -ms-flex-negative: 0;\\n  flex-shrink: 0;\\n  width: 100%;\\n  height: 100%;\\n  position: relative;\\n  -webkit-transition-property: -webkit-transform;\\n  transition-property: -webkit-transform;\\n  -o-transition-property: transform;\\n  transition-property: transform;\\n  transition-property: transform, -webkit-transform;\\n}\\n.swiper-slide-invisible-blank {\\n  visibility: hidden;\\n}\\n/* Auto Height */\\n.swiper-container-autoheight,\\n.swiper-container-autoheight .swiper-slide {\\n  height: auto;\\n}\\n.swiper-container-autoheight .swiper-wrapper {\\n  -webkit-box-align: start;\\n  -webkit-align-items: flex-start;\\n  -ms-flex-align: start;\\n  align-items: flex-start;\\n  -webkit-transition-property: height, -webkit-transform;\\n  transition-property: height, -webkit-transform;\\n  -o-transition-property: transform, height;\\n  transition-property: transform, height;\\n  transition-property: transform, height, -webkit-transform;\\n}\\n/* 3D Effects */\\n.swiper-container-3d {\\n  -webkit-perspective: 1200px;\\n  perspective: 1200px;\\n}\\n.swiper-container-3d .swiper-wrapper,\\n.swiper-container-3d .swiper-slide,\\n.swiper-container-3d .swiper-slide-shadow-left,\\n.swiper-container-3d .swiper-slide-shadow-right,\\n.swiper-container-3d .swiper-slide-shadow-top,\\n.swiper-container-3d .swiper-slide-shadow-bottom,\\n.swiper-container-3d .swiper-cube-shadow {\\n  -webkit-transform-style: preserve-3d;\\n  transform-style: preserve-3d;\\n}\\n.swiper-container-3d .swiper-slide-shadow-left,\\n.swiper-container-3d .swiper-slide-shadow-right,\\n.swiper-container-3d .swiper-slide-shadow-top,\\n.swiper-container-3d .swiper-slide-shadow-bottom {\\n  position: absolute;\\n  left: 0;\\n  top: 0;\\n  width: 100%;\\n  height: 100%;\\n  pointer-events: none;\\n  z-index: 10;\\n}\\n.swiper-container-3d .swiper-slide-shadow-left {\\n  background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));\\n  background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n  background-image: -o-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n  background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n}\\n.swiper-container-3d .swiper-slide-shadow-right {\\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));\\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n}\\n.swiper-container-3d .swiper-slide-shadow-top {\\n  background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));\\n  background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n  background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n  background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n}\\n.swiper-container-3d .swiper-slide-shadow-bottom {\\n  background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));\\n  background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n  background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n  background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\\n}\\n/* IE10 Windows Phone 8 Fixes */\\n.swiper-container-wp8-horizontal,\\n.swiper-container-wp8-horizontal > .swiper-wrapper {\\n  -ms-touch-action: pan-y;\\n  touch-action: pan-y;\\n}\\n.swiper-container-wp8-vertical,\\n.swiper-container-wp8-vertical > .swiper-wrapper {\\n  -ms-touch-action: pan-x;\\n  touch-action: pan-x;\\n}\\n.swiper-button-prev,\\n.swiper-button-next {\\n  position: absolute;\\n  top: 50%;\\n  width: 27px;\\n  height: 44px;\\n  margin-top: -22px;\\n  z-index: 10;\\n  cursor: pointer;\\n  background-size: 27px 44px;\\n  background-position: center;\\n  background-repeat: no-repeat;\\n}\\n.swiper-button-prev.swiper-button-disabled,\\n.swiper-button-next.swiper-button-disabled {\\n  opacity: 0.35;\\n  cursor: auto;\\n  pointer-events: none;\\n}\\n.swiper-button-prev,\\n.swiper-container-rtl .swiper-button-next {\\n  background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E\\\");\\n  left: 10px;\\n  right: auto;\\n}\\n.swiper-button-next,\\n.swiper-container-rtl .swiper-button-prev {\\n  background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E\\\");\\n  right: 10px;\\n  left: auto;\\n}\\n.swiper-button-prev.swiper-button-white,\\n.swiper-container-rtl .swiper-button-next.swiper-button-white {\\n  background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E\\\");\\n}\\n.swiper-button-next.swiper-button-white,\\n.swiper-container-rtl .swiper-button-prev.swiper-button-white {\\n  background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E\\\");\\n}\\n.swiper-button-prev.swiper-button-black,\\n.swiper-container-rtl .swiper-button-next.swiper-button-black {\\n  background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E\\\");\\n}\\n.swiper-button-next.swiper-button-black,\\n.swiper-container-rtl .swiper-button-prev.swiper-button-black {\\n  background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E\\\");\\n}\\n.swiper-button-lock {\\n  display: none;\\n}\\n.swiper-pagination {\\n  position: absolute;\\n  text-align: center;\\n  -webkit-transition: 300ms opacity;\\n  -o-transition: 300ms opacity;\\n  transition: 300ms opacity;\\n  -webkit-transform: translate3d(0, 0, 0);\\n  transform: translate3d(0, 0, 0);\\n  z-index: 10;\\n}\\n.swiper-pagination.swiper-pagination-hidden {\\n  opacity: 0;\\n}\\n/* Common Styles */\\n.swiper-pagination-fraction,\\n.swiper-pagination-custom,\\n.swiper-container-horizontal > .swiper-pagination-bullets {\\n  bottom: 10px;\\n  left: 0;\\n  width: 100%;\\n}\\n/* Bullets */\\n.swiper-pagination-bullets-dynamic {\\n  overflow: hidden;\\n  font-size: 0;\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {\\n  -webkit-transform: scale(0.33);\\n  -ms-transform: scale(0.33);\\n  transform: scale(0.33);\\n  position: relative;\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active {\\n  -webkit-transform: scale(1);\\n  -ms-transform: scale(1);\\n  transform: scale(1);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main {\\n  -webkit-transform: scale(1);\\n  -ms-transform: scale(1);\\n  transform: scale(1);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev {\\n  -webkit-transform: scale(0.66);\\n  -ms-transform: scale(0.66);\\n  transform: scale(0.66);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev {\\n  -webkit-transform: scale(0.33);\\n  -ms-transform: scale(0.33);\\n  transform: scale(0.33);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next {\\n  -webkit-transform: scale(0.66);\\n  -ms-transform: scale(0.66);\\n  transform: scale(0.66);\\n}\\n.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next {\\n  -webkit-transform: scale(0.33);\\n  -ms-transform: scale(0.33);\\n  transform: scale(0.33);\\n}\\n.swiper-pagination-bullet {\\n  width: 8px;\\n  height: 8px;\\n  display: inline-block;\\n  border-radius: 100%;\\n  background: #000;\\n  opacity: 0.2;\\n}\\nbutton.swiper-pagination-bullet {\\n  border: none;\\n  margin: 0;\\n  padding: 0;\\n  -webkit-box-shadow: none;\\n  box-shadow: none;\\n  -webkit-appearance: none;\\n  -moz-appearance: none;\\n  appearance: none;\\n}\\n.swiper-pagination-clickable .swiper-pagination-bullet {\\n  cursor: pointer;\\n}\\n.swiper-pagination-bullet-active {\\n  opacity: 1;\\n  background: #007aff;\\n}\\n.swiper-container-vertical > .swiper-pagination-bullets {\\n  right: 10px;\\n  top: 50%;\\n  -webkit-transform: translate3d(0px, -50%, 0);\\n  transform: translate3d(0px, -50%, 0);\\n}\\n.swiper-container-vertical > .swiper-pagination-bullets .swiper-pagination-bullet {\\n  margin: 6px 0;\\n  display: block;\\n}\\n.swiper-container-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic {\\n  top: 50%;\\n  -webkit-transform: translateY(-50%);\\n  -ms-transform: translateY(-50%);\\n  transform: translateY(-50%);\\n  width: 8px;\\n}\\n.swiper-container-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {\\n  display: inline-block;\\n  -webkit-transition: 200ms top, 200ms -webkit-transform;\\n  transition: 200ms top, 200ms -webkit-transform;\\n  -o-transition: 200ms transform, 200ms top;\\n  transition: 200ms transform, 200ms top;\\n  transition: 200ms transform, 200ms top, 200ms -webkit-transform;\\n}\\n.swiper-container-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet {\\n  margin: 0 4px;\\n}\\n.swiper-container-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic {\\n  left: 50%;\\n  -webkit-transform: translateX(-50%);\\n  -ms-transform: translateX(-50%);\\n  transform: translateX(-50%);\\n  white-space: nowrap;\\n}\\n.swiper-container-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {\\n  -webkit-transition: 200ms left, 200ms -webkit-transform;\\n  transition: 200ms left, 200ms -webkit-transform;\\n  -o-transition: 200ms transform, 200ms left;\\n  transition: 200ms transform, 200ms left;\\n  transition: 200ms transform, 200ms left, 200ms -webkit-transform;\\n}\\n.swiper-container-horizontal.swiper-container-rtl > .swiper-pagination-bullets-dynamic .swiper-pagination-bullet {\\n  -webkit-transition: 200ms right, 200ms -webkit-transform;\\n  transition: 200ms right, 200ms -webkit-transform;\\n  -o-transition: 200ms transform, 200ms right;\\n  transition: 200ms transform, 200ms right;\\n  transition: 200ms transform, 200ms right, 200ms -webkit-transform;\\n}\\n/* Progress */\\n.swiper-pagination-progressbar {\\n  background: rgba(0, 0, 0, 0.25);\\n  position: absolute;\\n}\\n.swiper-pagination-progressbar .swiper-pagination-progressbar-fill {\\n  background: #007aff;\\n  position: absolute;\\n  left: 0;\\n  top: 0;\\n  width: 100%;\\n  height: 100%;\\n  -webkit-transform: scale(0);\\n  -ms-transform: scale(0);\\n  transform: scale(0);\\n  -webkit-transform-origin: left top;\\n  -ms-transform-origin: left top;\\n  transform-origin: left top;\\n}\\n.swiper-container-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill {\\n  -webkit-transform-origin: right top;\\n  -ms-transform-origin: right top;\\n  transform-origin: right top;\\n}\\n.swiper-container-horizontal > .swiper-pagination-progressbar,\\n.swiper-container-vertical > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite {\\n  width: 100%;\\n  height: 4px;\\n  left: 0;\\n  top: 0;\\n}\\n.swiper-container-vertical > .swiper-pagination-progressbar,\\n.swiper-container-horizontal > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite {\\n  width: 4px;\\n  height: 100%;\\n  left: 0;\\n  top: 0;\\n}\\n.swiper-pagination-white .swiper-pagination-bullet-active {\\n  background: #ffffff;\\n}\\n.swiper-pagination-progressbar.swiper-pagination-white {\\n  background: rgba(255, 255, 255, 0.25);\\n}\\n.swiper-pagination-progressbar.swiper-pagination-white .swiper-pagination-progressbar-fill {\\n  background: #ffffff;\\n}\\n.swiper-pagination-black .swiper-pagination-bullet-active {\\n  background: #000000;\\n}\\n.swiper-pagination-progressbar.swiper-pagination-black {\\n  background: rgba(0, 0, 0, 0.25);\\n}\\n.swiper-pagination-progressbar.swiper-pagination-black .swiper-pagination-progressbar-fill {\\n  background: #000000;\\n}\\n.swiper-pagination-lock {\\n  display: none;\\n}\\n/* Scrollbar */\\n.swiper-scrollbar {\\n  border-radius: 10px;\\n  position: relative;\\n  -ms-touch-action: none;\\n  background: rgba(0, 0, 0, 0.1);\\n}\\n.swiper-container-horizontal > .swiper-scrollbar {\\n  position: absolute;\\n  left: 1%;\\n  bottom: 3px;\\n  z-index: 50;\\n  height: 5px;\\n  width: 98%;\\n}\\n.swiper-container-vertical > .swiper-scrollbar {\\n  position: absolute;\\n  right: 3px;\\n  top: 1%;\\n  z-index: 50;\\n  width: 5px;\\n  height: 98%;\\n}\\n.swiper-scrollbar-drag {\\n  height: 100%;\\n  width: 100%;\\n  position: relative;\\n  background: rgba(0, 0, 0, 0.5);\\n  border-radius: 10px;\\n  left: 0;\\n  top: 0;\\n}\\n.swiper-scrollbar-cursor-drag {\\n  cursor: move;\\n}\\n.swiper-scrollbar-lock {\\n  display: none;\\n}\\n.swiper-zoom-container {\\n  width: 100%;\\n  height: 100%;\\n  display: -webkit-box;\\n  display: -webkit-flex;\\n  display: -ms-flexbox;\\n  display: flex;\\n  -webkit-box-pack: center;\\n  -webkit-justify-content: center;\\n  -ms-flex-pack: center;\\n  justify-content: center;\\n  -webkit-box-align: center;\\n  -webkit-align-items: center;\\n  -ms-flex-align: center;\\n  align-items: center;\\n  text-align: center;\\n}\\n.swiper-zoom-container > img,\\n.swiper-zoom-container > svg,\\n.swiper-zoom-container > canvas {\\n  max-width: 100%;\\n  max-height: 100%;\\n  -o-object-fit: contain;\\n  object-fit: contain;\\n}\\n.swiper-slide-zoomed {\\n  cursor: move;\\n}\\n/* Preloader */\\n.swiper-lazy-preloader {\\n  width: 42px;\\n  height: 42px;\\n  position: absolute;\\n  left: 50%;\\n  top: 50%;\\n  margin-left: -21px;\\n  margin-top: -21px;\\n  z-index: 10;\\n  -webkit-transform-origin: 50%;\\n  -ms-transform-origin: 50%;\\n  transform-origin: 50%;\\n  -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;\\n  animation: swiper-preloader-spin 1s steps(12, end) infinite;\\n}\\n.swiper-lazy-preloader:after {\\n  display: block;\\n  content: '';\\n  width: 100%;\\n  height: 100%;\\n  background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\\\");\\n  background-position: 50%;\\n  background-size: 100%;\\n  background-repeat: no-repeat;\\n}\\n.swiper-lazy-preloader-white:after {\\n  background-image: url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\\\");\\n}\\n@-webkit-keyframes swiper-preloader-spin {\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@keyframes swiper-preloader-spin {\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n/* a11y */\\n.swiper-container .swiper-notification {\\n  position: absolute;\\n  left: 0;\\n  top: 0;\\n  pointer-events: none;\\n  opacity: 0;\\n  z-index: -1000;\\n}\\n.swiper-container-fade.swiper-container-free-mode .swiper-slide {\\n  -webkit-transition-timing-function: ease-out;\\n  -o-transition-timing-function: ease-out;\\n  transition-timing-function: ease-out;\\n}\\n.swiper-container-fade .swiper-slide {\\n  pointer-events: none;\\n  -webkit-transition-property: opacity;\\n  -o-transition-property: opacity;\\n  transition-property: opacity;\\n}\\n.swiper-container-fade .swiper-slide .swiper-slide {\\n  pointer-events: none;\\n}\\n.swiper-container-fade .swiper-slide-active,\\n.swiper-container-fade .swiper-slide-active .swiper-slide-active {\\n  pointer-events: auto;\\n}\\n.swiper-container-cube {\\n  overflow: visible;\\n}\\n.swiper-container-cube .swiper-slide {\\n  pointer-events: none;\\n  -webkit-backface-visibility: hidden;\\n  backface-visibility: hidden;\\n  z-index: 1;\\n  visibility: hidden;\\n  -webkit-transform-origin: 0 0;\\n  -ms-transform-origin: 0 0;\\n  transform-origin: 0 0;\\n  width: 100%;\\n  height: 100%;\\n}\\n.swiper-container-cube .swiper-slide .swiper-slide {\\n  pointer-events: none;\\n}\\n.swiper-container-cube.swiper-container-rtl .swiper-slide {\\n  -webkit-transform-origin: 100% 0;\\n  -ms-transform-origin: 100% 0;\\n  transform-origin: 100% 0;\\n}\\n.swiper-container-cube .swiper-slide-active,\\n.swiper-container-cube .swiper-slide-active .swiper-slide-active {\\n  pointer-events: auto;\\n}\\n.swiper-container-cube .swiper-slide-active,\\n.swiper-container-cube .swiper-slide-next,\\n.swiper-container-cube .swiper-slide-prev,\\n.swiper-container-cube .swiper-slide-next + .swiper-slide {\\n  pointer-events: auto;\\n  visibility: visible;\\n}\\n.swiper-container-cube .swiper-slide-shadow-top,\\n.swiper-container-cube .swiper-slide-shadow-bottom,\\n.swiper-container-cube .swiper-slide-shadow-left,\\n.swiper-container-cube .swiper-slide-shadow-right {\\n  z-index: 0;\\n  -webkit-backface-visibility: hidden;\\n  backface-visibility: hidden;\\n}\\n.swiper-container-cube .swiper-cube-shadow {\\n  position: absolute;\\n  left: 0;\\n  bottom: 0px;\\n  width: 100%;\\n  height: 100%;\\n  background: #000;\\n  opacity: 0.6;\\n  -webkit-filter: blur(50px);\\n  filter: blur(50px);\\n  z-index: 0;\\n}\\n.swiper-container-flip {\\n  overflow: visible;\\n}\\n.swiper-container-flip .swiper-slide {\\n  pointer-events: none;\\n  -webkit-backface-visibility: hidden;\\n  backface-visibility: hidden;\\n  z-index: 1;\\n}\\n.swiper-container-flip .swiper-slide .swiper-slide {\\n  pointer-events: none;\\n}\\n.swiper-container-flip .swiper-slide-active,\\n.swiper-container-flip .swiper-slide-active .swiper-slide-active {\\n  pointer-events: auto;\\n}\\n.swiper-container-flip .swiper-slide-shadow-top,\\n.swiper-container-flip .swiper-slide-shadow-bottom,\\n.swiper-container-flip .swiper-slide-shadow-left,\\n.swiper-container-flip .swiper-slide-shadow-right {\\n  z-index: 0;\\n  -webkit-backface-visibility: hidden;\\n  backface-visibility: hidden;\\n}\\n.swiper-container-coverflow .swiper-wrapper {\\n  /* Windows 8 IE 10 fix */\\n  -ms-perspective: 1200px;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3N3aXBlckA0LjUuMUBzd2lwZXIvZGlzdC9jc3Mvc3dpcGVyLmNzcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fc3dpcGVyQDQuNS4xQHN3aXBlci9kaXN0L2Nzcy9zd2lwZXIuY3NzPzQ3ZTciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKGZhbHNlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi8qKlxcbiAqIFN3aXBlciA0LjUuMVxcbiAqIE1vc3QgbW9kZXJuIG1vYmlsZSB0b3VjaCBzbGlkZXIgYW5kIGZyYW1ld29yayB3aXRoIGhhcmR3YXJlIGFjY2VsZXJhdGVkIHRyYW5zaXRpb25zXFxuICogaHR0cDovL3d3dy5pZGFuZ2Vyby51cy9zd2lwZXIvXFxuICpcXG4gKiBDb3B5cmlnaHQgMjAxNC0yMDE5IFZsYWRpbWlyIEtoYXJsYW1waWRpXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcXG4gKlxcbiAqIFJlbGVhc2VkIG9uOiBTZXB0ZW1iZXIgMTMsIDIwMTlcXG4gKi9cXG4uc3dpcGVyLWNvbnRhaW5lciB7XFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBsaXN0LXN0eWxlOiBub25lO1xcbiAgcGFkZGluZzogMDtcXG4gIC8qIEZpeCBvZiBXZWJraXQgZmxpY2tlcmluZyAqL1xcbiAgei1pbmRleDogMTtcXG59XFxuLnN3aXBlci1jb250YWluZXItbm8tZmxleGJveCAuc3dpcGVyLXNsaWRlIHtcXG4gIGZsb2F0OiBsZWZ0O1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci12ZXJ0aWNhbCA+IC5zd2lwZXItd3JhcHBlciB7XFxuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XFxuICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxufVxcbi5zd2lwZXItd3JhcHBlciB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHotaW5kZXg6IDE7XFxuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcXG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07XFxuICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgLXdlYmtpdC10cmFuc2Zvcm07XFxuICAtd2Via2l0LWJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWFuZHJvaWQgLnN3aXBlci1zbGlkZSxcXG4uc3dpcGVyLXdyYXBwZXIge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDBweCwgMCwgMCk7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDBweCwgMCwgMCk7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLW11bHRpcm93ID4gLnN3aXBlci13cmFwcGVyIHtcXG4gIC13ZWJraXQtZmxleC13cmFwOiB3cmFwO1xcbiAgLW1zLWZsZXgtd3JhcDogd3JhcDtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG59XFxuLnN3aXBlci1jb250YWluZXItZnJlZS1tb2RlID4gLnN3aXBlci13cmFwcGVyIHtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xcbiAgLW8tdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xcbiAgbWFyZ2luOiAwIGF1dG87XFxufVxcbi5zd2lwZXItc2xpZGUge1xcbiAgLXdlYmtpdC1mbGV4LXNocmluazogMDtcXG4gIC1tcy1mbGV4LW5lZ2F0aXZlOiAwO1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07XFxuICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgLXdlYmtpdC10cmFuc2Zvcm07XFxufVxcbi5zd2lwZXItc2xpZGUtaW52aXNpYmxlLWJsYW5rIHtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcXG59XFxuLyogQXV0byBIZWlnaHQgKi9cXG4uc3dpcGVyLWNvbnRhaW5lci1hdXRvaGVpZ2h0LFxcbi5zd2lwZXItY29udGFpbmVyLWF1dG9oZWlnaHQgLnN3aXBlci1zbGlkZSB7XFxuICBoZWlnaHQ6IGF1dG87XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWF1dG9oZWlnaHQgLnN3aXBlci13cmFwcGVyIHtcXG4gIC13ZWJraXQtYm94LWFsaWduOiBzdGFydDtcXG4gIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxuICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7XFxuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogaGVpZ2h0LCAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGhlaWdodCwgLXdlYmtpdC10cmFuc2Zvcm07XFxuICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGhlaWdodDtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgaGVpZ2h0O1xcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBoZWlnaHQsIC13ZWJraXQtdHJhbnNmb3JtO1xcbn1cXG4vKiAzRCBFZmZlY3RzICovXFxuLnN3aXBlci1jb250YWluZXItM2Qge1xcbiAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogMTIwMHB4O1xcbiAgcGVyc3BlY3RpdmU6IDEyMDBweDtcXG59XFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci13cmFwcGVyLFxcbi5zd2lwZXItY29udGFpbmVyLTNkIC5zd2lwZXItc2xpZGUsXFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCxcXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCxcXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3AsXFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLFxcbi5zd2lwZXItY29udGFpbmVyLTNkIC5zd2lwZXItY3ViZS1zaGFkb3cge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xcbiAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcXG59XFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCxcXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCxcXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3AsXFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgei1pbmRleDogMTA7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLTNkIC5zd2lwZXItc2xpZGUtc2hhZG93LWxlZnQge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIHJpZ2h0IHRvcCwgbGVmdCB0b3AsIGZyb20ocmdiYSgwLCAwLCAwLCAwLjUpKSwgdG8ocmdiYSgwLCAwLCAwLCAwKSkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMCwgMCwgMCwgMC41KSwgcmdiYSgwLCAwLCAwLCAwKSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMCwgMCwgMCwgMC41KSwgcmdiYSgwLCAwLCAwLCAwKSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgcmdiYSgwLCAwLCAwLCAwLjUpLCByZ2JhKDAsIDAsIDAsIDApKTtcXG59XFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctcmlnaHQge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCByaWdodCB0b3AsIGZyb20ocmdiYSgwLCAwLCAwLCAwLjUpKSwgdG8ocmdiYSgwLCAwLCAwLCAwKSkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSgwLCAwLCAwLCAwLjUpLCByZ2JhKDAsIDAsIDAsIDApKTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsIDAsIDAsIDAuNSksIHJnYmEoMCwgMCwgMCwgMCkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNSksIHJnYmEoMCwgMCwgMCwgMCkpO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci0zZCAuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3Age1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgYm90dG9tLCBsZWZ0IHRvcCwgZnJvbShyZ2JhKDAsIDAsIDAsIDAuNSkpLCB0byhyZ2JhKDAsIDAsIDAsIDApKSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChib3R0b20sIHJnYmEoMCwgMCwgMCwgMC41KSwgcmdiYSgwLCAwLCAwLCAwKSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNSksIHJnYmEoMCwgMCwgMCwgMCkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgcmdiYSgwLCAwLCAwLCAwLjUpLCByZ2JhKDAsIDAsIDAsIDApKTtcXG59XFxuLnN3aXBlci1jb250YWluZXItM2QgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20ocmdiYSgwLCAwLCAwLCAwLjUpKSwgdG8ocmdiYSgwLCAwLCAwLCAwKSkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDAsIDAsIDAsIDAuNSksIHJnYmEoMCwgMCwgMCwgMCkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiYSgwLCAwLCAwLCAwLjUpLCByZ2JhKDAsIDAsIDAsIDApKTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC41KSwgcmdiYSgwLCAwLCAwLCAwKSk7XFxufVxcbi8qIElFMTAgV2luZG93cyBQaG9uZSA4IEZpeGVzICovXFxuLnN3aXBlci1jb250YWluZXItd3A4LWhvcml6b250YWwsXFxuLnN3aXBlci1jb250YWluZXItd3A4LWhvcml6b250YWwgPiAuc3dpcGVyLXdyYXBwZXIge1xcbiAgLW1zLXRvdWNoLWFjdGlvbjogcGFuLXk7XFxuICB0b3VjaC1hY3Rpb246IHBhbi15O1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci13cDgtdmVydGljYWwsXFxuLnN3aXBlci1jb250YWluZXItd3A4LXZlcnRpY2FsID4gLnN3aXBlci13cmFwcGVyIHtcXG4gIC1tcy10b3VjaC1hY3Rpb246IHBhbi14O1xcbiAgdG91Y2gtYWN0aW9uOiBwYW4teDtcXG59XFxuLnN3aXBlci1idXR0b24tcHJldixcXG4uc3dpcGVyLWJ1dHRvbi1uZXh0IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogNTAlO1xcbiAgd2lkdGg6IDI3cHg7XFxuICBoZWlnaHQ6IDQ0cHg7XFxuICBtYXJnaW4tdG9wOiAtMjJweDtcXG4gIHotaW5kZXg6IDEwO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYmFja2dyb3VuZC1zaXplOiAyN3B4IDQ0cHg7XFxuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbn1cXG4uc3dpcGVyLWJ1dHRvbi1wcmV2LnN3aXBlci1idXR0b24tZGlzYWJsZWQsXFxuLnN3aXBlci1idXR0b24tbmV4dC5zd2lwZXItYnV0dG9uLWRpc2FibGVkIHtcXG4gIG9wYWNpdHk6IDAuMzU7XFxuICBjdXJzb3I6IGF1dG87XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLnN3aXBlci1idXR0b24tcHJldixcXG4uc3dpcGVyLWNvbnRhaW5lci1ydGwgLnN3aXBlci1idXR0b24tbmV4dCB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHhtbG5zJTNEJ2h0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyclMjB2aWV3Qm94JTNEJzAlMjAwJTIwMjclMjA0NCclM0UlM0NwYXRoJTIwZCUzRCdNMCUyQzIyTDIyJTJDMGwyLjElMkMyLjFMNC4yJTJDMjJsMTkuOSUyQzE5LjlMMjIlMkM0NEwwJTJDMjJMMCUyQzIyTDAlMkMyMnonJTIwZmlsbCUzRCclMjMwMDdhZmYnJTJGJTNFJTNDJTJGc3ZnJTNFXFxcIik7XFxuICBsZWZ0OiAxMHB4O1xcbiAgcmlnaHQ6IGF1dG87XFxufVxcbi5zd2lwZXItYnV0dG9uLW5leHQsXFxuLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItYnV0dG9uLXByZXYge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmclMjB4bWxucyUzRCdodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmcnJTIwdmlld0JveCUzRCcwJTIwMCUyMDI3JTIwNDQnJTNFJTNDcGF0aCUyMGQlM0QnTTI3JTJDMjJMMjclMkMyMkw1JTJDNDRsLTIuMS0yLjFMMjIuOCUyQzIyTDIuOSUyQzIuMUw1JTJDMEwyNyUyQzIyTDI3JTJDMjJ6JyUyMGZpbGwlM0QnJTIzMDA3YWZmJyUyRiUzRSUzQyUyRnN2ZyUzRVxcXCIpO1xcbiAgcmlnaHQ6IDEwcHg7XFxuICBsZWZ0OiBhdXRvO1xcbn1cXG4uc3dpcGVyLWJ1dHRvbi1wcmV2LnN3aXBlci1idXR0b24td2hpdGUsXFxuLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItYnV0dG9uLW5leHQuc3dpcGVyLWJ1dHRvbi13aGl0ZSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHhtbG5zJTNEJ2h0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyclMjB2aWV3Qm94JTNEJzAlMjAwJTIwMjclMjA0NCclM0UlM0NwYXRoJTIwZCUzRCdNMCUyQzIyTDIyJTJDMGwyLjElMkMyLjFMNC4yJTJDMjJsMTkuOSUyQzE5LjlMMjIlMkM0NEwwJTJDMjJMMCUyQzIyTDAlMkMyMnonJTIwZmlsbCUzRCclMjNmZmZmZmYnJTJGJTNFJTNDJTJGc3ZnJTNFXFxcIik7XFxufVxcbi5zd2lwZXItYnV0dG9uLW5leHQuc3dpcGVyLWJ1dHRvbi13aGl0ZSxcXG4uc3dpcGVyLWNvbnRhaW5lci1ydGwgLnN3aXBlci1idXR0b24tcHJldi5zd2lwZXItYnV0dG9uLXdoaXRlIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJTNDc3ZnJTIweG1sbnMlM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJyUyMHZpZXdCb3glM0QnMCUyMDAlMjAyNyUyMDQ0JyUzRSUzQ3BhdGglMjBkJTNEJ00yNyUyQzIyTDI3JTJDMjJMNSUyQzQ0bC0yLjEtMi4xTDIyLjglMkMyMkwyLjklMkMyLjFMNSUyQzBMMjclMkMyMkwyNyUyQzIyeiclMjBmaWxsJTNEJyUyM2ZmZmZmZiclMkYlM0UlM0MlMkZzdmclM0VcXFwiKTtcXG59XFxuLnN3aXBlci1idXR0b24tcHJldi5zd2lwZXItYnV0dG9uLWJsYWNrLFxcbi5zd2lwZXItY29udGFpbmVyLXJ0bCAuc3dpcGVyLWJ1dHRvbi1uZXh0LnN3aXBlci1idXR0b24tYmxhY2sge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmclMjB4bWxucyUzRCdodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmcnJTIwdmlld0JveCUzRCcwJTIwMCUyMDI3JTIwNDQnJTNFJTNDcGF0aCUyMGQlM0QnTTAlMkMyMkwyMiUyQzBsMi4xJTJDMi4xTDQuMiUyQzIybDE5LjklMkMxOS45TDIyJTJDNDRMMCUyQzIyTDAlMkMyMkwwJTJDMjJ6JyUyMGZpbGwlM0QnJTIzMDAwMDAwJyUyRiUzRSUzQyUyRnN2ZyUzRVxcXCIpO1xcbn1cXG4uc3dpcGVyLWJ1dHRvbi1uZXh0LnN3aXBlci1idXR0b24tYmxhY2ssXFxuLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItYnV0dG9uLXByZXYuc3dpcGVyLWJ1dHRvbi1ibGFjayB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHhtbG5zJTNEJ2h0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyclMjB2aWV3Qm94JTNEJzAlMjAwJTIwMjclMjA0NCclM0UlM0NwYXRoJTIwZCUzRCdNMjclMkMyMkwyNyUyQzIyTDUlMkM0NGwtMi4xLTIuMUwyMi44JTJDMjJMMi45JTJDMi4xTDUlMkMwTDI3JTJDMjJMMjclMkMyMnonJTIwZmlsbCUzRCclMjMwMDAwMDAnJTJGJTNFJTNDJTJGc3ZnJTNFXFxcIik7XFxufVxcbi5zd2lwZXItYnV0dG9uLWxvY2sge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogMzAwbXMgb3BhY2l0eTtcXG4gIC1vLXRyYW5zaXRpb246IDMwMG1zIG9wYWNpdHk7XFxuICB0cmFuc2l0aW9uOiAzMDBtcyBvcGFjaXR5O1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcXG4gIHotaW5kZXg6IDEwO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24uc3dpcGVyLXBhZ2luYXRpb24taGlkZGVuIHtcXG4gIG9wYWNpdHk6IDA7XFxufVxcbi8qIENvbW1vbiBTdHlsZXMgKi9cXG4uc3dpcGVyLXBhZ2luYXRpb24tZnJhY3Rpb24sXFxuLnN3aXBlci1wYWdpbmF0aW9uLWN1c3RvbSxcXG4uc3dpcGVyLWNvbnRhaW5lci1ob3Jpem9udGFsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMge1xcbiAgYm90dG9tOiAxMHB4O1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG4vKiBCdWxsZXRzICovXFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyB7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgZm9udC1zaXplOiAwO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMzMpO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMC4zMyk7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMzMpO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZS1tYWluIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZS1wcmV2IHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjY2KTtcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuNjYpO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjY2KTtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZS1wcmV2LXByZXYge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMzMpO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMC4zMyk7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMzMpO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlLW5leHQge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNjYpO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMC42Nik7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuNjYpO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlLW5leHQtbmV4dCB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4zMyk7XFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjMzKTtcXG4gIHRyYW5zZm9ybTogc2NhbGUoMC4zMyk7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgd2lkdGg6IDhweDtcXG4gIGhlaWdodDogOHB4O1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gIGJhY2tncm91bmQ6ICMwMDA7XFxuICBvcGFjaXR5OiAwLjI7XFxufVxcbmJ1dHRvbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMDtcXG4gIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XFxuICBhcHBlYXJhbmNlOiBub25lO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tY2xpY2thYmxlIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZSB7XFxuICBvcGFjaXR5OiAxO1xcbiAgYmFja2dyb3VuZDogIzAwN2FmZjtcXG59XFxuLnN3aXBlci1jb250YWluZXItdmVydGljYWwgPiAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cyB7XFxuICByaWdodDogMTBweDtcXG4gIHRvcDogNTAlO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDBweCwgLTUwJSwgMCk7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDBweCwgLTUwJSwgMCk7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLXZlcnRpY2FsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMgLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCB7XFxuICBtYXJnaW46IDZweCAwO1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLXZlcnRpY2FsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIHtcXG4gIHRvcDogNTAlO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XFxuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xcbiAgd2lkdGg6IDhweDtcXG59XFxuLnN3aXBlci1jb250YWluZXItdmVydGljYWwgPiAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzLWR5bmFtaWMgLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IDIwMG1zIHRvcCwgMjAwbXMgLXdlYmtpdC10cmFuc2Zvcm07XFxuICB0cmFuc2l0aW9uOiAyMDBtcyB0b3AsIDIwMG1zIC13ZWJraXQtdHJhbnNmb3JtO1xcbiAgLW8tdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyB0b3A7XFxuICB0cmFuc2l0aW9uOiAyMDBtcyB0cmFuc2Zvcm0sIDIwMG1zIHRvcDtcXG4gIHRyYW5zaXRpb246IDIwMG1zIHRyYW5zZm9ybSwgMjAwbXMgdG9wLCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG59XFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgbWFyZ2luOiAwIDRweDtcXG59XFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMtZHluYW1pYyB7XFxuICBsZWZ0OiA1MCU7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcXG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1ob3Jpem9udGFsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHMuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cy1keW5hbWljIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiAyMDBtcyBsZWZ0LCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb246IDIwMG1zIGxlZnQsIDIwMG1zIC13ZWJraXQtdHJhbnNmb3JtO1xcbiAgLW8tdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyBsZWZ0O1xcbiAgdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyBsZWZ0O1xcbiAgdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyBsZWZ0LCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG59XFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbC5zd2lwZXItY29udGFpbmVyLXJ0bCA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzLWR5bmFtaWMgLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IDIwMG1zIHJpZ2h0LCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIHRyYW5zaXRpb246IDIwMG1zIHJpZ2h0LCAyMDBtcyAtd2Via2l0LXRyYW5zZm9ybTtcXG4gIC1vLXRyYW5zaXRpb246IDIwMG1zIHRyYW5zZm9ybSwgMjAwbXMgcmlnaHQ7XFxuICB0cmFuc2l0aW9uOiAyMDBtcyB0cmFuc2Zvcm0sIDIwMG1zIHJpZ2h0O1xcbiAgdHJhbnNpdGlvbjogMjAwbXMgdHJhbnNmb3JtLCAyMDBtcyByaWdodCwgMjAwbXMgLXdlYmtpdC10cmFuc2Zvcm07XFxufVxcbi8qIFByb2dyZXNzICovXFxuLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2JhciAuc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXItZmlsbCB7XFxuICBiYWNrZ3JvdW5kOiAjMDA3YWZmO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApO1xcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMCk7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDApO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDtcXG4gIC1tcy10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1ydGwgLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyIC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci1maWxsIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDtcXG59XFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2JhcixcXG4uc3dpcGVyLWNvbnRhaW5lci12ZXJ0aWNhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci1vcHBvc2l0ZSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogNHB4O1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG59XFxuLnN3aXBlci1jb250YWluZXItdmVydGljYWwgPiAuc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXIsXFxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci1vcHBvc2l0ZSB7XFxuICB3aWR0aDogNHB4O1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLXdoaXRlIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlIHtcXG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci5zd2lwZXItcGFnaW5hdGlvbi13aGl0ZSB7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXIuc3dpcGVyLXBhZ2luYXRpb24td2hpdGUgLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyLWZpbGwge1xcbiAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJsYWNrIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlIHtcXG4gIGJhY2tncm91bmQ6ICMwMDAwMDA7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci5zd2lwZXItcGFnaW5hdGlvbi1ibGFjayB7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXIuc3dpcGVyLXBhZ2luYXRpb24tYmxhY2sgLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyLWZpbGwge1xcbiAgYmFja2dyb3VuZDogIzAwMDAwMDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWxvY2sge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuLyogU2Nyb2xsYmFyICovXFxuLnN3aXBlci1zY3JvbGxiYXIge1xcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIC1tcy10b3VjaC1hY3Rpb246IG5vbmU7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMSk7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWhvcml6b250YWwgPiAuc3dpcGVyLXNjcm9sbGJhciB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBsZWZ0OiAxJTtcXG4gIGJvdHRvbTogM3B4O1xcbiAgei1pbmRleDogNTA7XFxuICBoZWlnaHQ6IDVweDtcXG4gIHdpZHRoOiA5OCU7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLXZlcnRpY2FsID4gLnN3aXBlci1zY3JvbGxiYXIge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IDNweDtcXG4gIHRvcDogMSU7XFxuICB6LWluZGV4OiA1MDtcXG4gIHdpZHRoOiA1cHg7XFxuICBoZWlnaHQ6IDk4JTtcXG59XFxuLnN3aXBlci1zY3JvbGxiYXItZHJhZyB7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogMTAwJTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcXG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbn1cXG4uc3dpcGVyLXNjcm9sbGJhci1jdXJzb3ItZHJhZyB7XFxuICBjdXJzb3I6IG1vdmU7XFxufVxcbi5zd2lwZXItc2Nyb2xsYmFyLWxvY2sge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuLnN3aXBlci16b29tLWNvbnRhaW5lciB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcbiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcXG4gIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uc3dpcGVyLXpvb20tY29udGFpbmVyID4gaW1nLFxcbi5zd2lwZXItem9vbS1jb250YWluZXIgPiBzdmcsXFxuLnN3aXBlci16b29tLWNvbnRhaW5lciA+IGNhbnZhcyB7XFxuICBtYXgtd2lkdGg6IDEwMCU7XFxuICBtYXgtaGVpZ2h0OiAxMDAlO1xcbiAgLW8tb2JqZWN0LWZpdDogY29udGFpbjtcXG4gIG9iamVjdC1maXQ6IGNvbnRhaW47XFxufVxcbi5zd2lwZXItc2xpZGUtem9vbWVkIHtcXG4gIGN1cnNvcjogbW92ZTtcXG59XFxuLyogUHJlbG9hZGVyICovXFxuLnN3aXBlci1sYXp5LXByZWxvYWRlciB7XFxuICB3aWR0aDogNDJweDtcXG4gIGhlaWdodDogNDJweDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDUwJTtcXG4gIHRvcDogNTAlO1xcbiAgbWFyZ2luLWxlZnQ6IC0yMXB4O1xcbiAgbWFyZ2luLXRvcDogLTIxcHg7XFxuICB6LWluZGV4OiAxMDtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogNTAlO1xcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDUwJTtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IDUwJTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzd2lwZXItcHJlbG9hZGVyLXNwaW4gMXMgc3RlcHMoMTIsIGVuZCkgaW5maW5pdGU7XFxuICBhbmltYXRpb246IHN3aXBlci1wcmVsb2FkZXItc3BpbiAxcyBzdGVwcygxMiwgZW5kKSBpbmZpbml0ZTtcXG59XFxuLnN3aXBlci1sYXp5LXByZWxvYWRlcjphZnRlciB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIGNvbnRlbnQ6ICcnO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHZpZXdCb3glM0QnMCUyMDAlMjAxMjAlMjAxMjAnJTIweG1sbnMlM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJyUyMHhtbG5zJTNBeGxpbmslM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGxpbmsnJTNFJTNDZGVmcyUzRSUzQ2xpbmUlMjBpZCUzRCdsJyUyMHgxJTNEJzYwJyUyMHgyJTNEJzYwJyUyMHkxJTNEJzcnJTIweTIlM0QnMjcnJTIwc3Ryb2tlJTNEJyUyMzZjNmM2YyclMjBzdHJva2Utd2lkdGglM0QnMTEnJTIwc3Ryb2tlLWxpbmVjYXAlM0Qncm91bmQnJTJGJTNFJTNDJTJGZGVmcyUzRSUzQ2clM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDMwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuMjcnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSg2MCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjI3JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoOTAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDEyMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjI3JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMTUwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuMzcnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSgxODAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy40NiclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDIxMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjU2JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMjQwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuNjYnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSgyNzAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy43NSclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDMwMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjg1JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMzMwJTIwNjAlMkM2MCknJTJGJTNFJTNDJTJGZyUzRSUzQyUyRnN2ZyUzRVxcXCIpO1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlO1xcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlO1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG59XFxuLnN3aXBlci1sYXp5LXByZWxvYWRlci13aGl0ZTphZnRlciB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCUzQ3N2ZyUyMHZpZXdCb3glM0QnMCUyMDAlMjAxMjAlMjAxMjAnJTIweG1sbnMlM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJyUyMHhtbG5zJTNBeGxpbmslM0QnaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGxpbmsnJTNFJTNDZGVmcyUzRSUzQ2xpbmUlMjBpZCUzRCdsJyUyMHgxJTNEJzYwJyUyMHgyJTNEJzYwJyUyMHkxJTNEJzcnJTIweTIlM0QnMjcnJTIwc3Ryb2tlJTNEJyUyM2ZmZiclMjBzdHJva2Utd2lkdGglM0QnMTEnJTIwc3Ryb2tlLWxpbmVjYXAlM0Qncm91bmQnJTJGJTNFJTNDJTJGZGVmcyUzRSUzQ2clM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDMwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuMjcnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSg2MCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjI3JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoOTAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy4yNyclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDEyMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjI3JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMTUwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuMzcnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSgxODAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy40NiclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDIxMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjU2JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMjQwJTIwNjAlMkM2MCknJTJGJTNFJTNDdXNlJTIweGxpbmslM0FocmVmJTNEJyUyM2wnJTIwb3BhY2l0eSUzRCcuNjYnJTIwdHJhbnNmb3JtJTNEJ3JvdGF0ZSgyNzAlMjA2MCUyQzYwKSclMkYlM0UlM0N1c2UlMjB4bGluayUzQWhyZWYlM0QnJTIzbCclMjBvcGFjaXR5JTNEJy43NSclMjB0cmFuc2Zvcm0lM0Qncm90YXRlKDMwMCUyMDYwJTJDNjApJyUyRiUzRSUzQ3VzZSUyMHhsaW5rJTNBaHJlZiUzRCclMjNsJyUyMG9wYWNpdHklM0QnLjg1JyUyMHRyYW5zZm9ybSUzRCdyb3RhdGUoMzMwJTIwNjAlMkM2MCknJTJGJTNFJTNDJTJGZyUzRSUzQyUyRnN2ZyUzRVxcXCIpO1xcbn1cXG5ALXdlYmtpdC1rZXlmcmFtZXMgc3dpcGVyLXByZWxvYWRlci1zcGluIHtcXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgc3dpcGVyLXByZWxvYWRlci1zcGluIHtcXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICB9XFxufVxcbi8qIGExMXkgKi9cXG4uc3dpcGVyLWNvbnRhaW5lciAuc3dpcGVyLW5vdGlmaWNhdGlvbiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBvcGFjaXR5OiAwO1xcbiAgei1pbmRleDogLTEwMDA7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWZhZGUuc3dpcGVyLWNvbnRhaW5lci1mcmVlLW1vZGUgLnN3aXBlci1zbGlkZSB7XFxuICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcXG4gIC1vLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcXG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcXG59XFxuLnN3aXBlci1jb250YWluZXItZmFkZSAuc3dpcGVyLXNsaWRlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xcbiAgLW8tdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTtcXG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHk7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWZhZGUgLnN3aXBlci1zbGlkZSAuc3dpcGVyLXNsaWRlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1mYWRlIC5zd2lwZXItc2xpZGUtYWN0aXZlLFxcbi5zd2lwZXItY29udGFpbmVyLWZhZGUgLnN3aXBlci1zbGlkZS1hY3RpdmUgLnN3aXBlci1zbGlkZS1hY3RpdmUge1xcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUge1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZSB7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgei1pbmRleDogMTtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogMCAwO1xcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDAgMDtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IDAgMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1jdWJlIC5zd2lwZXItc2xpZGUgLnN3aXBlci1zbGlkZSB7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLnN3aXBlci1jb250YWluZXItY3ViZS5zd2lwZXItY29udGFpbmVyLXJ0bCAuc3dpcGVyLXNsaWRlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogMTAwJSAwO1xcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgMDtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IDEwMCUgMDtcXG59XFxuLnN3aXBlci1jb250YWluZXItY3ViZSAuc3dpcGVyLXNsaWRlLWFjdGl2ZSxcXG4uc3dpcGVyLWNvbnRhaW5lci1jdWJlIC5zd2lwZXItc2xpZGUtYWN0aXZlIC5zd2lwZXItc2xpZGUtYWN0aXZlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1jdWJlIC5zd2lwZXItc2xpZGUtYWN0aXZlLFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1uZXh0LFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1wcmV2LFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1uZXh0ICsgLnN3aXBlci1zbGlkZSB7XFxuICBwb2ludGVyLWV2ZW50czogYXV0bztcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLFxcbi5zd2lwZXItY29udGFpbmVyLWN1YmUgLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCxcXG4uc3dpcGVyLWNvbnRhaW5lci1jdWJlIC5zd2lwZXItc2xpZGUtc2hhZG93LXJpZ2h0IHtcXG4gIHotaW5kZXg6IDA7XFxuICAtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcXG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcXG59XFxuLnN3aXBlci1jb250YWluZXItY3ViZSAuc3dpcGVyLWN1YmUtc2hhZG93IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDA7XFxuICBib3R0b206IDBweDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgYmFja2dyb3VuZDogIzAwMDtcXG4gIG9wYWNpdHk6IDAuNjtcXG4gIC13ZWJraXQtZmlsdGVyOiBibHVyKDUwcHgpO1xcbiAgZmlsdGVyOiBibHVyKDUwcHgpO1xcbiAgei1pbmRleDogMDtcXG59XFxuLnN3aXBlci1jb250YWluZXItZmxpcCB7XFxuICBvdmVyZmxvdzogdmlzaWJsZTtcXG59XFxuLnN3aXBlci1jb250YWluZXItZmxpcCAuc3dpcGVyLXNsaWRlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XFxuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XFxuICB6LWluZGV4OiAxO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUgLnN3aXBlci1zbGlkZSB7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLnN3aXBlci1jb250YWluZXItZmxpcCAuc3dpcGVyLXNsaWRlLWFjdGl2ZSxcXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUtYWN0aXZlIC5zd2lwZXItc2xpZGUtYWN0aXZlIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xcbn1cXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUtc2hhZG93LXRvcCxcXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUtc2hhZG93LWJvdHRvbSxcXG4uc3dpcGVyLWNvbnRhaW5lci1mbGlwIC5zd2lwZXItc2xpZGUtc2hhZG93LWxlZnQsXFxuLnN3aXBlci1jb250YWluZXItZmxpcCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCB7XFxuICB6LWluZGV4OiAwO1xcbiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XFxuICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XFxufVxcbi5zd2lwZXItY29udGFpbmVyLWNvdmVyZmxvdyAuc3dpcGVyLXdyYXBwZXIge1xcbiAgLyogV2luZG93cyA4IElFIDEwIGZpeCAqL1xcbiAgLW1zLXBlcnNwZWN0aXZlOiAxMjAwcHg7XFxufVxcblwiLCBcIlwiXSk7XG5cbi8vIGV4cG9ydHNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css":
/*!***********************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css ***!
  \***********************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("exports = module.exports = __webpack_require__(/*! ../../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \".van-collapse-item__title .van-cell__right-icon::before{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.van-collapse-item__title::after{visibility:hidden}.van-collapse-item__title--expanded .van-cell__right-icon::before{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.van-collapse-item__title--expanded::after{visibility:visible}.van-collapse-item__title--disabled,.van-collapse-item__title--disabled .van-cell__right-icon{color:#c8c9cc}.van-collapse-item__title--disabled:active{background-color:#fff}.van-collapse-item__wrapper{overflow:hidden;-webkit-transition:height .3s ease-in-out;transition:height .3s ease-in-out;will-change:height}.van-collapse-item__content{padding:16px;color:#969799;font-size:13px;line-height:1.5;background-color:#fff}\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5jc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5jc3M/N2MyMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoZmFsc2UpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZSAudmFuLWNlbGxfX3JpZ2h0LWljb246OmJlZm9yZXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpOy13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuM3M7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjNzO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcywtd2Via2l0LXRyYW5zZm9ybSAuM3N9LnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZTo6YWZ0ZXJ7dmlzaWJpbGl0eTpoaWRkZW59LnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZS0tZXhwYW5kZWQgLnZhbi1jZWxsX19yaWdodC1pY29uOjpiZWZvcmV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpfS52YW4tY29sbGFwc2UtaXRlbV9fdGl0bGUtLWV4cGFuZGVkOjphZnRlcnt2aXNpYmlsaXR5OnZpc2libGV9LnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZS0tZGlzYWJsZWQsLnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZS0tZGlzYWJsZWQgLnZhbi1jZWxsX19yaWdodC1pY29ue2NvbG9yOiNjOGM5Y2N9LnZhbi1jb2xsYXBzZS1pdGVtX190aXRsZS0tZGlzYWJsZWQ6YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2ZmZn0udmFuLWNvbGxhcHNlLWl0ZW1fX3dyYXBwZXJ7b3ZlcmZsb3c6aGlkZGVuOy13ZWJraXQtdHJhbnNpdGlvbjpoZWlnaHQgLjNzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246aGVpZ2h0IC4zcyBlYXNlLWluLW91dDt3aWxsLWNoYW5nZTpoZWlnaHR9LnZhbi1jb2xsYXBzZS1pdGVtX19jb250ZW50e3BhZGRpbmc6MTZweDtjb2xvcjojOTY5Nzk5O2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9XCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css":
/*!***************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_vant@2.2.16@vant/es/image/index.css ***!
  \***************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("exports = module.exports = __webpack_require__(/*! ../../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \".van-image{position:relative;display:inline-block}.van-image--round{overflow:hidden;border-radius:50%}.van-image--round img{border-radius:inherit}.van-image__error,.van-image__img,.van-image__loading{display:block;width:100%;height:100%}.van-image__error,.van-image__loading{position:absolute;top:0;left:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;color:#969799;font-size:14px;background-color:#f8f8f8}\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW1hZ2UvaW5kZXguY3NzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL2ltYWdlL2luZGV4LmNzcz81ZmJhIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIudmFuLWltYWdle3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrfS52YW4taW1hZ2UtLXJvdW5ke292ZXJmbG93OmhpZGRlbjtib3JkZXItcmFkaXVzOjUwJX0udmFuLWltYWdlLS1yb3VuZCBpbWd7Ym9yZGVyLXJhZGl1czppbmhlcml0fS52YW4taW1hZ2VfX2Vycm9yLC52YW4taW1hZ2VfX2ltZywudmFuLWltYWdlX19sb2FkaW5ne2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0udmFuLWltYWdlX19lcnJvciwudmFuLWltYWdlX19sb2FkaW5ne3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstd2Via2l0LWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjstd2Via2l0LWJveC1wYWNrOmNlbnRlcjstd2Via2l0LWp1c3RpZnktY29udGVudDpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtjb2xvcjojOTY5Nzk5O2ZvbnQtc2l6ZToxNHB4O2JhY2tncm91bmQtY29sb3I6I2Y4ZjhmOH1cIiwgXCJcIl0pO1xuXG4vLyBleHBvcnRzXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css":
/*!**************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_vant@2.2.16@vant/es/style/base.css ***!
  \**************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("exports = module.exports = __webpack_require__(/*! ../../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@-webkit-keyframes van-slide-up-enter{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes van-slide-up-enter{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@-webkit-keyframes van-slide-up-leave{to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes van-slide-up-leave{to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@-webkit-keyframes van-slide-down-enter{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes van-slide-down-enter{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@-webkit-keyframes van-slide-down-leave{to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes van-slide-down-leave{to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@-webkit-keyframes van-slide-left-enter{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes van-slide-left-enter{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@-webkit-keyframes van-slide-left-leave{to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes van-slide-left-leave{to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@-webkit-keyframes van-slide-right-enter{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes van-slide-right-enter{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@-webkit-keyframes van-slide-right-leave{to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes van-slide-right-leave{to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@-webkit-keyframes van-fade-in{0%{opacity:0}to{opacity:1}}@keyframes van-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes van-fade-out{0%{opacity:1}to{opacity:0}}@keyframes van-fade-out{0%{opacity:1}to{opacity:0}}@-webkit-keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes van-circular{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40}to{stroke-dasharray:90,150;stroke-dashoffset:-120}}@keyframes van-circular{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40}to{stroke-dasharray:90,150;stroke-dashoffset:-120}}html{-webkit-tap-highlight-color:transparent}body{margin:0}a{text-decoration:none}[class*=van-]:focus,a:focus,button:focus,input:focus,textarea:focus{outline:0}ol,ul{margin:0;padding:0;list-style:none}button,input,textarea{color:inherit;font:inherit}.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix::after{display:table;clear:both;content:''}[class*=van-hairline]::after{position:absolute;box-sizing:border-box;content:' ';pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #ebedf0;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--top::after{border-top-width:1px}.van-hairline--left::after{border-left-width:1px}.van-hairline--right::after{border-right-width:1px}.van-hairline--bottom::after{border-bottom-width:1px}.van-hairline--top-bottom::after,.van-hairline-unset--top-bottom::after{border-width:1px 0}.van-hairline--surround::after{border-width:1px}.van-fade-enter-active{-webkit-animation:.3s van-fade-in;animation:.3s van-fade-in}.van-fade-leave-active{-webkit-animation:.3s van-fade-out;animation:.3s van-fade-out}.van-slide-up-enter-active{-webkit-animation:van-slide-up-enter .3s both ease;animation:van-slide-up-enter .3s both ease}.van-slide-up-leave-active{-webkit-animation:van-slide-up-leave .3s both ease;animation:van-slide-up-leave .3s both ease}.van-slide-down-enter-active{-webkit-animation:van-slide-down-enter .3s both ease;animation:van-slide-down-enter .3s both ease}.van-slide-down-leave-active{-webkit-animation:van-slide-down-leave .3s both ease;animation:van-slide-down-leave .3s both ease}.van-slide-left-enter-active{-webkit-animation:van-slide-left-enter .3s both ease;animation:van-slide-left-enter .3s both ease}.van-slide-left-leave-active{-webkit-animation:van-slide-left-leave .3s both ease;animation:van-slide-left-leave .3s both ease}.van-slide-right-enter-active{-webkit-animation:van-slide-right-enter .3s both ease;animation:van-slide-right-enter .3s both ease}.van-slide-right-leave-active{-webkit-animation:van-slide-right-leave .3s both ease;animation:van-slide-right-leave .3s both ease}.van-info{position:absolute;top:0;right:0;box-sizing:border-box;min-width:16px;padding:0 3px;color:#fff;font-weight:500;font-size:12px;font-family:PingFang SC,Helvetica Neue,Arial,sans-serif;line-height:14px;text-align:center;background-color:#ee0a24;border:1px solid #fff;border-radius:16px;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100%;transform-origin:100%}.van-info--dot{width:8px;min-width:0;height:8px;background-color:#ee0a24;border-radius:100%}@font-face{font-weight:400;font-family:'vant-icon';font-style:normal;font-display:auto;src:url(https://img.yzcdn.cn/vant/vant-icon-0bc654.woff2) format('woff2'),url(https://img.yzcdn.cn/vant/vant-icon-0bc654.woff) format('woff'),url(https://img.yzcdn.cn/vant/vant-icon-0bc654.ttf) format('truetype')}.van-icon{position:relative;font:14px/1 \\\"vant-icon\\\";font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}.van-icon,.van-icon::before{display:inline-block}.van-icon-add-o:before{content:\\\"\\\\F000\\\"}.van-icon-add-square:before{content:\\\"\\\\F001\\\"}.van-icon-add:before{content:\\\"\\\\F002\\\"}.van-icon-after-sale:before{content:\\\"\\\\F003\\\"}.van-icon-aim:before{content:\\\"\\\\F004\\\"}.van-icon-alipay:before{content:\\\"\\\\F005\\\"}.van-icon-apps-o:before{content:\\\"\\\\F006\\\"}.van-icon-arrow-down:before{content:\\\"\\\\F007\\\"}.van-icon-arrow-left:before{content:\\\"\\\\F008\\\"}.van-icon-arrow-up:before{content:\\\"\\\\F009\\\"}.van-icon-arrow:before{content:\\\"\\\\F00A\\\"}.van-icon-ascending:before{content:\\\"\\\\F00B\\\"}.van-icon-audio:before{content:\\\"\\\\F00C\\\"}.van-icon-award-o:before{content:\\\"\\\\F00D\\\"}.van-icon-award:before{content:\\\"\\\\F00E\\\"}.van-icon-bag-o:before{content:\\\"\\\\F00F\\\"}.van-icon-bag:before{content:\\\"\\\\F010\\\"}.van-icon-balance-list-o:before{content:\\\"\\\\F011\\\"}.van-icon-balance-list:before{content:\\\"\\\\F012\\\"}.van-icon-balance-o:before{content:\\\"\\\\F013\\\"}.van-icon-balance-pay:before{content:\\\"\\\\F014\\\"}.van-icon-bar-chart-o:before{content:\\\"\\\\F015\\\"}.van-icon-bars:before{content:\\\"\\\\F016\\\"}.van-icon-bell:before{content:\\\"\\\\F017\\\"}.van-icon-bill-o:before{content:\\\"\\\\F018\\\"}.van-icon-bill:before{content:\\\"\\\\F019\\\"}.van-icon-birthday-cake-o:before{content:\\\"\\\\F01A\\\"}.van-icon-bookmark-o:before{content:\\\"\\\\F01B\\\"}.van-icon-bookmark:before{content:\\\"\\\\F01C\\\"}.van-icon-browsing-history-o:before{content:\\\"\\\\F01D\\\"}.van-icon-browsing-history:before{content:\\\"\\\\F01E\\\"}.van-icon-brush-o:before{content:\\\"\\\\F01F\\\"}.van-icon-bulb-o:before{content:\\\"\\\\F020\\\"}.van-icon-bullhorn-o:before{content:\\\"\\\\F021\\\"}.van-icon-calender-o:before{content:\\\"\\\\F022\\\"}.van-icon-card:before{content:\\\"\\\\F023\\\"}.van-icon-cart-circle-o:before{content:\\\"\\\\F024\\\"}.van-icon-cart-circle:before{content:\\\"\\\\F025\\\"}.van-icon-cart-o:before{content:\\\"\\\\F026\\\"}.van-icon-cart:before{content:\\\"\\\\F027\\\"}.van-icon-cash-back-record:before{content:\\\"\\\\F028\\\"}.van-icon-cash-on-deliver:before{content:\\\"\\\\F029\\\"}.van-icon-cashier-o:before{content:\\\"\\\\F02A\\\"}.van-icon-certificate:before{content:\\\"\\\\F02B\\\"}.van-icon-chart-trending-o:before{content:\\\"\\\\F02C\\\"}.van-icon-chat-o:before{content:\\\"\\\\F02D\\\"}.van-icon-chat:before{content:\\\"\\\\F02E\\\"}.van-icon-checked:before{content:\\\"\\\\F02F\\\"}.van-icon-circle:before{content:\\\"\\\\F030\\\"}.van-icon-clear:before{content:\\\"\\\\F031\\\"}.van-icon-clock-o:before{content:\\\"\\\\F032\\\"}.van-icon-clock:before{content:\\\"\\\\F033\\\"}.van-icon-close:before{content:\\\"\\\\F034\\\"}.van-icon-closed-eye:before{content:\\\"\\\\F035\\\"}.van-icon-cluster-o:before{content:\\\"\\\\F036\\\"}.van-icon-cluster:before{content:\\\"\\\\F037\\\"}.van-icon-column:before{content:\\\"\\\\F038\\\"}.van-icon-comment-circle-o:before{content:\\\"\\\\F039\\\"}.van-icon-comment-circle:before{content:\\\"\\\\F03A\\\"}.van-icon-comment-o:before{content:\\\"\\\\F03B\\\"}.van-icon-comment:before{content:\\\"\\\\F03C\\\"}.van-icon-completed:before{content:\\\"\\\\F03D\\\"}.van-icon-contact:before{content:\\\"\\\\F03E\\\"}.van-icon-coupon-o:before{content:\\\"\\\\F03F\\\"}.van-icon-coupon:before{content:\\\"\\\\F040\\\"}.van-icon-credit-pay:before{content:\\\"\\\\F041\\\"}.van-icon-cross:before{content:\\\"\\\\F042\\\"}.van-icon-debit-pay:before{content:\\\"\\\\F043\\\"}.van-icon-delete:before{content:\\\"\\\\F044\\\"}.van-icon-descending:before{content:\\\"\\\\F045\\\"}.van-icon-description:before{content:\\\"\\\\F046\\\"}.van-icon-desktop-o:before{content:\\\"\\\\F047\\\"}.van-icon-diamond-o:before{content:\\\"\\\\F048\\\"}.van-icon-diamond:before{content:\\\"\\\\F049\\\"}.van-icon-discount:before{content:\\\"\\\\F04A\\\"}.van-icon-down:before{content:\\\"\\\\F04B\\\"}.van-icon-ecard-pay:before{content:\\\"\\\\F04C\\\"}.van-icon-edit:before{content:\\\"\\\\F04D\\\"}.van-icon-ellipsis:before{content:\\\"\\\\F04E\\\"}.van-icon-empty:before{content:\\\"\\\\F04F\\\"}.van-icon-envelop-o:before{content:\\\"\\\\F050\\\"}.van-icon-exchange:before{content:\\\"\\\\F051\\\"}.van-icon-expand-o:before{content:\\\"\\\\F052\\\"}.van-icon-expand:before{content:\\\"\\\\F053\\\"}.van-icon-eye-o:before{content:\\\"\\\\F054\\\"}.van-icon-eye:before{content:\\\"\\\\F055\\\"}.van-icon-fail:before{content:\\\"\\\\F056\\\"}.van-icon-failure:before{content:\\\"\\\\F057\\\"}.van-icon-filter-o:before{content:\\\"\\\\F058\\\"}.van-icon-fire-o:before{content:\\\"\\\\F059\\\"}.van-icon-fire:before{content:\\\"\\\\F05A\\\"}.van-icon-flag-o:before{content:\\\"\\\\F05B\\\"}.van-icon-flower-o:before{content:\\\"\\\\F05C\\\"}.van-icon-free-postage:before{content:\\\"\\\\F05D\\\"}.van-icon-friends-o:before{content:\\\"\\\\F05E\\\"}.van-icon-friends:before{content:\\\"\\\\F05F\\\"}.van-icon-gem-o:before{content:\\\"\\\\F060\\\"}.van-icon-gem:before{content:\\\"\\\\F061\\\"}.van-icon-gift-card-o:before{content:\\\"\\\\F062\\\"}.van-icon-gift-card:before{content:\\\"\\\\F063\\\"}.van-icon-gift-o:before{content:\\\"\\\\F064\\\"}.van-icon-gift:before{content:\\\"\\\\F065\\\"}.van-icon-gold-coin-o:before{content:\\\"\\\\F066\\\"}.van-icon-gold-coin:before{content:\\\"\\\\F067\\\"}.van-icon-good-job-o:before{content:\\\"\\\\F068\\\"}.van-icon-good-job:before{content:\\\"\\\\F069\\\"}.van-icon-goods-collect-o:before{content:\\\"\\\\F06A\\\"}.van-icon-goods-collect:before{content:\\\"\\\\F06B\\\"}.van-icon-graphic:before{content:\\\"\\\\F06C\\\"}.van-icon-home-o:before{content:\\\"\\\\F06D\\\"}.van-icon-hot-o:before{content:\\\"\\\\F06E\\\"}.van-icon-hot-sale-o:before{content:\\\"\\\\F06F\\\"}.van-icon-hot-sale:before{content:\\\"\\\\F070\\\"}.van-icon-hot:before{content:\\\"\\\\F071\\\"}.van-icon-hotel-o:before{content:\\\"\\\\F072\\\"}.van-icon-idcard:before{content:\\\"\\\\F073\\\"}.van-icon-info-o:before{content:\\\"\\\\F074\\\"}.van-icon-info:before{content:\\\"\\\\F075\\\"}.van-icon-invition:before{content:\\\"\\\\F076\\\"}.van-icon-label-o:before{content:\\\"\\\\F077\\\"}.van-icon-label:before{content:\\\"\\\\F078\\\"}.van-icon-like-o:before{content:\\\"\\\\F079\\\"}.van-icon-like:before{content:\\\"\\\\F07A\\\"}.van-icon-live:before{content:\\\"\\\\F07B\\\"}.van-icon-location-o:before{content:\\\"\\\\F07C\\\"}.van-icon-location:before{content:\\\"\\\\F07D\\\"}.van-icon-lock:before{content:\\\"\\\\F07E\\\"}.van-icon-logistics:before{content:\\\"\\\\F07F\\\"}.van-icon-manager-o:before{content:\\\"\\\\F080\\\"}.van-icon-manager:before{content:\\\"\\\\F081\\\"}.van-icon-map-marked:before{content:\\\"\\\\F082\\\"}.van-icon-medel-o:before{content:\\\"\\\\F083\\\"}.van-icon-medel:before{content:\\\"\\\\F084\\\"}.van-icon-more-o:before{content:\\\"\\\\F085\\\"}.van-icon-more:before{content:\\\"\\\\F086\\\"}.van-icon-music-o:before{content:\\\"\\\\F087\\\"}.van-icon-music:before{content:\\\"\\\\F088\\\"}.van-icon-new-arrival-o:before{content:\\\"\\\\F089\\\"}.van-icon-new-arrival:before{content:\\\"\\\\F08A\\\"}.van-icon-new-o:before{content:\\\"\\\\F08B\\\"}.van-icon-new:before{content:\\\"\\\\F08C\\\"}.van-icon-newspaper-o:before{content:\\\"\\\\F08D\\\"}.van-icon-notes-o:before{content:\\\"\\\\F08E\\\"}.van-icon-orders-o:before{content:\\\"\\\\F08F\\\"}.van-icon-other-pay:before{content:\\\"\\\\F090\\\"}.van-icon-paid:before{content:\\\"\\\\F091\\\"}.van-icon-passed:before{content:\\\"\\\\F092\\\"}.van-icon-pause-circle-o:before{content:\\\"\\\\F093\\\"}.van-icon-pause-circle:before{content:\\\"\\\\F094\\\"}.van-icon-pause:before{content:\\\"\\\\F095\\\"}.van-icon-peer-pay:before{content:\\\"\\\\F096\\\"}.van-icon-pending-payment:before{content:\\\"\\\\F097\\\"}.van-icon-phone-circle-o:before{content:\\\"\\\\F098\\\"}.van-icon-phone-circle:before{content:\\\"\\\\F099\\\"}.van-icon-phone-o:before{content:\\\"\\\\F09A\\\"}.van-icon-phone:before{content:\\\"\\\\F09B\\\"}.van-icon-photo-o:before{content:\\\"\\\\F09C\\\"}.van-icon-photo:before{content:\\\"\\\\F09D\\\"}.van-icon-photograph:before{content:\\\"\\\\F09E\\\"}.van-icon-play-circle-o:before{content:\\\"\\\\F09F\\\"}.van-icon-play-circle:before{content:\\\"\\\\F0A0\\\"}.van-icon-play:before{content:\\\"\\\\F0A1\\\"}.van-icon-plus:before{content:\\\"\\\\F0A2\\\"}.van-icon-point-gift-o:before{content:\\\"\\\\F0A3\\\"}.van-icon-point-gift:before{content:\\\"\\\\F0A4\\\"}.van-icon-points:before{content:\\\"\\\\F0A5\\\"}.van-icon-printer:before{content:\\\"\\\\F0A6\\\"}.van-icon-qr-invalid:before{content:\\\"\\\\F0A7\\\"}.van-icon-qr:before{content:\\\"\\\\F0A8\\\"}.van-icon-question-o:before{content:\\\"\\\\F0A9\\\"}.van-icon-question:before{content:\\\"\\\\F0AA\\\"}.van-icon-records:before{content:\\\"\\\\F0AB\\\"}.van-icon-refund-o:before{content:\\\"\\\\F0AC\\\"}.van-icon-replay:before{content:\\\"\\\\F0AD\\\"}.van-icon-scan:before{content:\\\"\\\\F0AE\\\"}.van-icon-search:before{content:\\\"\\\\F0AF\\\"}.van-icon-send-gift-o:before{content:\\\"\\\\F0B0\\\"}.van-icon-send-gift:before{content:\\\"\\\\F0B1\\\"}.van-icon-service-o:before{content:\\\"\\\\F0B2\\\"}.van-icon-service:before{content:\\\"\\\\F0B3\\\"}.van-icon-setting-o:before{content:\\\"\\\\F0B4\\\"}.van-icon-setting:before{content:\\\"\\\\F0B5\\\"}.van-icon-share:before{content:\\\"\\\\F0B6\\\"}.van-icon-shop-collect-o:before{content:\\\"\\\\F0B7\\\"}.van-icon-shop-collect:before{content:\\\"\\\\F0B8\\\"}.van-icon-shop-o:before{content:\\\"\\\\F0B9\\\"}.van-icon-shop:before{content:\\\"\\\\F0BA\\\"}.van-icon-shopping-cart-o:before{content:\\\"\\\\F0BB\\\"}.van-icon-shopping-cart:before{content:\\\"\\\\F0BC\\\"}.van-icon-shrink:before{content:\\\"\\\\F0BD\\\"}.van-icon-sign:before{content:\\\"\\\\F0BE\\\"}.van-icon-smile-comment-o:before{content:\\\"\\\\F0BF\\\"}.van-icon-smile-comment:before{content:\\\"\\\\F0C0\\\"}.van-icon-smile-o:before{content:\\\"\\\\F0C1\\\"}.van-icon-smile:before{content:\\\"\\\\F0C2\\\"}.van-icon-star-o:before{content:\\\"\\\\F0C3\\\"}.van-icon-star:before{content:\\\"\\\\F0C4\\\"}.van-icon-stop-circle-o:before{content:\\\"\\\\F0C5\\\"}.van-icon-stop-circle:before{content:\\\"\\\\F0C6\\\"}.van-icon-stop:before{content:\\\"\\\\F0C7\\\"}.van-icon-success:before{content:\\\"\\\\F0C8\\\"}.van-icon-thumb-circle-o:before{content:\\\"\\\\F0C9\\\"}.van-icon-thumb-circle:before{content:\\\"\\\\F0CA\\\"}.van-icon-todo-list-o:before{content:\\\"\\\\F0CB\\\"}.van-icon-todo-list:before{content:\\\"\\\\F0CC\\\"}.van-icon-tosend:before{content:\\\"\\\\F0CD\\\"}.van-icon-tv-o:before{content:\\\"\\\\F0CE\\\"}.van-icon-umbrella-circle:before{content:\\\"\\\\F0CF\\\"}.van-icon-underway-o:before{content:\\\"\\\\F0D0\\\"}.van-icon-underway:before{content:\\\"\\\\F0D1\\\"}.van-icon-upgrade:before{content:\\\"\\\\F0D2\\\"}.van-icon-user-circle-o:before{content:\\\"\\\\F0D3\\\"}.van-icon-user-o:before{content:\\\"\\\\F0D4\\\"}.van-icon-video-o:before{content:\\\"\\\\F0D5\\\"}.van-icon-video:before{content:\\\"\\\\F0D6\\\"}.van-icon-vip-card-o:before{content:\\\"\\\\F0D7\\\"}.van-icon-vip-card:before{content:\\\"\\\\F0D8\\\"}.van-icon-volume-o:before{content:\\\"\\\\F0D9\\\"}.van-icon-volume:before{content:\\\"\\\\F0DA\\\"}.van-icon-wap-home-o:before{content:\\\"\\\\F0DB\\\"}.van-icon-wap-home:before{content:\\\"\\\\F0DC\\\"}.van-icon-wap-nav:before{content:\\\"\\\\F0DD\\\"}.van-icon-warn-o:before{content:\\\"\\\\F0DE\\\"}.van-icon-warning-o:before{content:\\\"\\\\F0DF\\\"}.van-icon-warning:before{content:\\\"\\\\F0E0\\\"}.van-icon-weapp-nav:before{content:\\\"\\\\F0E1\\\"}.van-icon-wechat:before{content:\\\"\\\\F0E2\\\"}.van-icon-youzan-shield:before{content:\\\"\\\\F0E3\\\"}.van-icon__image{width:1em;height:1em}.van-loading,.van-loading__spinner{position:relative;vertical-align:middle}.van-loading{color:#c8c9cc;font-size:0}.van-loading__spinner{display:inline-block;width:30px;max-width:100%;height:30px;max-height:100%;-webkit-animation:van-rotate .8s linear infinite;animation:van-rotate .8s linear infinite}.van-loading__spinner--spinner{-webkit-animation-timing-function:steps(12);animation-timing-function:steps(12)}.van-loading__spinner--spinner i{position:absolute;top:0;left:0;width:100%;height:100%}.van-loading__spinner--spinner i::before{display:block;width:2px;height:25%;margin:0 auto;background-color:currentColor;border-radius:40%;content:' '}.van-loading__spinner--circular{-webkit-animation-duration:2s;animation-duration:2s}.van-loading__circular{display:block;width:100%;height:100%}.van-loading__circular circle{-webkit-animation:van-circular 1.5s ease-in-out infinite;animation:van-circular 1.5s ease-in-out infinite;stroke:currentColor;stroke-width:3;stroke-linecap:round}.van-loading__text{display:inline-block;margin-left:8px;color:#969799;font-size:14px;vertical-align:middle}.van-loading--vertical{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.van-loading--vertical .van-loading__text{margin:8px 0 0}.van-loading__spinner--spinner i:nth-of-type(1){-webkit-transform:rotate(30deg);transform:rotate(30deg);opacity:1}.van-loading__spinner--spinner i:nth-of-type(2){-webkit-transform:rotate(60deg);transform:rotate(60deg);opacity:.9375}.van-loading__spinner--spinner i:nth-of-type(3){-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:.875}.van-loading__spinner--spinner i:nth-of-type(4){-webkit-transform:rotate(120deg);transform:rotate(120deg);opacity:.8125}.van-loading__spinner--spinner i:nth-of-type(5){-webkit-transform:rotate(150deg);transform:rotate(150deg);opacity:.75}.van-loading__spinner--spinner i:nth-of-type(6){-webkit-transform:rotate(180deg);transform:rotate(180deg);opacity:.6875}.van-loading__spinner--spinner i:nth-of-type(7){-webkit-transform:rotate(210deg);transform:rotate(210deg);opacity:.625}.van-loading__spinner--spinner i:nth-of-type(8){-webkit-transform:rotate(240deg);transform:rotate(240deg);opacity:.5625}.van-loading__spinner--spinner i:nth-of-type(9){-webkit-transform:rotate(270deg);transform:rotate(270deg);opacity:.5}.van-loading__spinner--spinner i:nth-of-type(10){-webkit-transform:rotate(300deg);transform:rotate(300deg);opacity:.4375}.van-loading__spinner--spinner i:nth-of-type(11){-webkit-transform:rotate(330deg);transform:rotate(330deg);opacity:.375}.van-loading__spinner--spinner i:nth-of-type(12){-webkit-transform:rotate(360deg);transform:rotate(360deg);opacity:.3125}.van-button{position:relative;display:inline-block;box-sizing:border-box;height:44px;margin:0;padding:0;font-size:16px;line-height:42px;text-align:center;border-radius:2px;-webkit-transition:opacity .2s;transition:opacity .2s;-webkit-appearance:none;-webkit-text-size-adjust:100%}.van-button::before{position:absolute;top:50%;left:50%;width:100%;height:100%;background-color:#000;border:inherit;border-color:#000;border-radius:inherit;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;content:' '}.van-button:active::before{opacity:.1}.van-button--disabled::before,.van-button--loading::before{display:none}.van-button--default{color:#323233;background-color:#fff;border:1px solid #ebedf0}.van-button--primary{color:#fff;background-color:#07c160;border:1px solid #07c160}.van-button--info{color:#fff;background-color:#1989fa;border:1px solid #1989fa}.van-button--danger{color:#fff;background-color:#ee0a24;border:1px solid #ee0a24}.van-button--warning{color:#fff;background-color:#ff976a;border:1px solid #ff976a}.van-button--plain{background-color:#fff}.van-button--plain.van-button--primary{color:#07c160}.van-button--plain.van-button--info{color:#1989fa}.van-button--plain.van-button--danger{color:#ee0a24}.van-button--plain.van-button--warning{color:#ff976a}.van-button--large{width:100%;height:50px;line-height:48px}.van-button--normal{padding:0 15px;font-size:14px}.van-button--small{min-width:60px;height:30px;padding:0 8px;font-size:12px;line-height:28px}.van-button__loading{display:inline-block;color:inherit;vertical-align:top}.van-button--mini{display:inline-block;min-width:50px;height:22px;font-size:10px;line-height:20px}.van-button--mini+.van-button--mini{margin-left:4px}.van-button--block{display:block;width:100%}.van-button--disabled{opacity:.5}.van-button--hairline.van-button--round::after,.van-button--round{border-radius:999px}.van-button--hairline.van-button--square::after,.van-button--square{border-radius:0}.van-button__icon{min-width:1em;font-size:1.2em;line-height:inherit;vertical-align:top}.van-button__icon+.van-button__text,.van-button__loading+.van-button__text{display:inline-block;margin-left:5px;vertical-align:top}.van-button--hairline{border-width:0}.van-button--hairline::after{border-color:inherit;border-radius:4px}.van-cell{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;box-sizing:border-box;width:100%;padding:10px 16px;overflow:hidden;color:#323233;font-size:14px;line-height:24px;background-color:#fff}.van-cell:not(:last-child)::after{position:absolute;box-sizing:border-box;content:' ';pointer-events:none;right:0;bottom:0;left:16px;border-bottom:1px solid #ebedf0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.van-cell--borderless::after{display:none}.van-cell__label{margin-top:3px;color:#969799;font-size:12px;line-height:18px}.van-cell__title,.van-cell__value{-webkit-box-flex:1;-webkit-flex:1;flex:1}.van-cell__value{position:relative;overflow:hidden;color:#969799;text-align:right;vertical-align:middle;word-wrap:break-word}.van-cell__value--alone{color:#323233;text-align:left}.van-cell__left-icon,.van-cell__right-icon{min-width:1em;height:24px;font-size:16px;line-height:24px}.van-cell__left-icon{margin-right:5px}.van-cell__right-icon{margin-left:5px;color:#969799}.van-cell--clickable:active{background-color:#f2f3f5}.van-cell--required{overflow:visible}.van-cell--required::before{position:absolute;left:8px;color:#ee0a24;font-size:14px;content:'*'}.van-cell--center{-webkit-box-align:center;-webkit-align-items:center;align-items:center}.van-cell--large{padding-top:12px;padding-bottom:12px}.van-cell--large .van-cell__title{font-size:16px}.van-cell--large .van-cell__label{font-size:14px}.van-cell-group{background-color:#fff}.van-cell-group__title{padding:16px 16px 8px;color:#969799;font-size:14px;line-height:16px}.van-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.7)}\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvc3R5bGUvYmFzZS5jc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvc3R5bGUvYmFzZS5jc3M/MWEyOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoZmFsc2UpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiQC13ZWJraXQta2V5ZnJhbWVzIHZhbi1zbGlkZS11cC1lbnRlcnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtdXAtZW50ZXJ7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9fUAtd2Via2l0LWtleWZyYW1lcyB2YW4tc2xpZGUtdXAtbGVhdmV7dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9fUBrZXlmcmFtZXMgdmFuLXNsaWRlLXVwLWxlYXZle3Rvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLWRvd24tZW50ZXJ7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtZG93bi1lbnRlcnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLWRvd24tbGVhdmV7dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtZG93bi1sZWF2ZXt0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLWxlZnQtZW50ZXJ7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtbGVmdC1lbnRlcnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLWxlZnQtbGVhdmV7dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtbGVmdC1sZWF2ZXt0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLXNsaWRlLXJpZ2h0LWVudGVyezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfX1Aa2V5ZnJhbWVzIHZhbi1zbGlkZS1yaWdodC1lbnRlcnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX19QC13ZWJraXQta2V5ZnJhbWVzIHZhbi1zbGlkZS1yaWdodC1sZWF2ZXt0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX19QGtleWZyYW1lcyB2YW4tc2xpZGUtcmlnaHQtbGVhdmV7dG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fUAtd2Via2l0LWtleWZyYW1lcyB2YW4tZmFkZS1pbnswJXtvcGFjaXR5OjB9dG97b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHZhbi1mYWRlLWluezAle29wYWNpdHk6MH10b3tvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyB2YW4tZmFkZS1vdXR7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MH19QGtleWZyYW1lcyB2YW4tZmFkZS1vdXR7MCV7b3BhY2l0eToxfXRve29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHZhbi1yb3RhdGV7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIHZhbi1yb3RhdGV7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmFuLWNpcmN1bGFyezAle3N0cm9rZS1kYXNoYXJyYXk6MSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6MH01MCV7c3Ryb2tlLWRhc2hhcnJheTo5MCwxNTA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTQwfXRve3N0cm9rZS1kYXNoYXJyYXk6OTAsMTUwO3N0cm9rZS1kYXNob2Zmc2V0Oi0xMjB9fUBrZXlmcmFtZXMgdmFuLWNpcmN1bGFyezAle3N0cm9rZS1kYXNoYXJyYXk6MSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6MH01MCV7c3Ryb2tlLWRhc2hhcnJheTo5MCwxNTA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTQwfXRve3N0cm9rZS1kYXNoYXJyYXk6OTAsMTUwO3N0cm9rZS1kYXNob2Zmc2V0Oi0xMjB9fWh0bWx7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fWJvZHl7bWFyZ2luOjB9YXt0ZXh0LWRlY29yYXRpb246bm9uZX1bY2xhc3MqPXZhbi1dOmZvY3VzLGE6Zm9jdXMsYnV0dG9uOmZvY3VzLGlucHV0OmZvY3VzLHRleHRhcmVhOmZvY3Vze291dGxpbmU6MH1vbCx1bHttYXJnaW46MDtwYWRkaW5nOjA7bGlzdC1zdHlsZTpub25lfWJ1dHRvbixpbnB1dCx0ZXh0YXJlYXtjb2xvcjppbmhlcml0O2ZvbnQ6aW5oZXJpdH0udmFuLWVsbGlwc2lze292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpc30udmFuLW11bHRpLWVsbGlwc2lzLS1sMiwudmFuLW11bHRpLWVsbGlwc2lzLS1sM3tkaXNwbGF5Oi13ZWJraXQtYm94O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOy13ZWJraXQtbGluZS1jbGFtcDoyOy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbH0udmFuLW11bHRpLWVsbGlwc2lzLS1sM3std2Via2l0LWxpbmUtY2xhbXA6M30udmFuLWNsZWFyZml4OjphZnRlcntkaXNwbGF5OnRhYmxlO2NsZWFyOmJvdGg7Y29udGVudDonJ31bY2xhc3MqPXZhbi1oYWlybGluZV06OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb250ZW50OicgJztwb2ludGVyLWV2ZW50czpub25lO3RvcDotNTAlO3JpZ2h0Oi01MCU7Ym90dG9tOi01MCU7bGVmdDotNTAlO2JvcmRlcjowIHNvbGlkICNlYmVkZjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjUpO3RyYW5zZm9ybTpzY2FsZSguNSl9LnZhbi1oYWlybGluZSwudmFuLWhhaXJsaW5lLS1ib3R0b20sLnZhbi1oYWlybGluZS0tbGVmdCwudmFuLWhhaXJsaW5lLS1yaWdodCwudmFuLWhhaXJsaW5lLS1zdXJyb3VuZCwudmFuLWhhaXJsaW5lLS10b3AsLnZhbi1oYWlybGluZS0tdG9wLWJvdHRvbXtwb3NpdGlvbjpyZWxhdGl2ZX0udmFuLWhhaXJsaW5lLS10b3A6OmFmdGVye2JvcmRlci10b3Atd2lkdGg6MXB4fS52YW4taGFpcmxpbmUtLWxlZnQ6OmFmdGVye2JvcmRlci1sZWZ0LXdpZHRoOjFweH0udmFuLWhhaXJsaW5lLS1yaWdodDo6YWZ0ZXJ7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweH0udmFuLWhhaXJsaW5lLS1ib3R0b206OmFmdGVye2JvcmRlci1ib3R0b20td2lkdGg6MXB4fS52YW4taGFpcmxpbmUtLXRvcC1ib3R0b206OmFmdGVyLC52YW4taGFpcmxpbmUtdW5zZXQtLXRvcC1ib3R0b206OmFmdGVye2JvcmRlci13aWR0aDoxcHggMH0udmFuLWhhaXJsaW5lLS1zdXJyb3VuZDo6YWZ0ZXJ7Ym9yZGVyLXdpZHRoOjFweH0udmFuLWZhZGUtZW50ZXItYWN0aXZley13ZWJraXQtYW5pbWF0aW9uOi4zcyB2YW4tZmFkZS1pbjthbmltYXRpb246LjNzIHZhbi1mYWRlLWlufS52YW4tZmFkZS1sZWF2ZS1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246LjNzIHZhbi1mYWRlLW91dDthbmltYXRpb246LjNzIHZhbi1mYWRlLW91dH0udmFuLXNsaWRlLXVwLWVudGVyLWFjdGl2ZXstd2Via2l0LWFuaW1hdGlvbjp2YW4tc2xpZGUtdXAtZW50ZXIgLjNzIGJvdGggZWFzZTthbmltYXRpb246dmFuLXNsaWRlLXVwLWVudGVyIC4zcyBib3RoIGVhc2V9LnZhbi1zbGlkZS11cC1sZWF2ZS1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246dmFuLXNsaWRlLXVwLWxlYXZlIC4zcyBib3RoIGVhc2U7YW5pbWF0aW9uOnZhbi1zbGlkZS11cC1sZWF2ZSAuM3MgYm90aCBlYXNlfS52YW4tc2xpZGUtZG93bi1lbnRlci1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246dmFuLXNsaWRlLWRvd24tZW50ZXIgLjNzIGJvdGggZWFzZTthbmltYXRpb246dmFuLXNsaWRlLWRvd24tZW50ZXIgLjNzIGJvdGggZWFzZX0udmFuLXNsaWRlLWRvd24tbGVhdmUtYWN0aXZley13ZWJraXQtYW5pbWF0aW9uOnZhbi1zbGlkZS1kb3duLWxlYXZlIC4zcyBib3RoIGVhc2U7YW5pbWF0aW9uOnZhbi1zbGlkZS1kb3duLWxlYXZlIC4zcyBib3RoIGVhc2V9LnZhbi1zbGlkZS1sZWZ0LWVudGVyLWFjdGl2ZXstd2Via2l0LWFuaW1hdGlvbjp2YW4tc2xpZGUtbGVmdC1lbnRlciAuM3MgYm90aCBlYXNlO2FuaW1hdGlvbjp2YW4tc2xpZGUtbGVmdC1lbnRlciAuM3MgYm90aCBlYXNlfS52YW4tc2xpZGUtbGVmdC1sZWF2ZS1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246dmFuLXNsaWRlLWxlZnQtbGVhdmUgLjNzIGJvdGggZWFzZTthbmltYXRpb246dmFuLXNsaWRlLWxlZnQtbGVhdmUgLjNzIGJvdGggZWFzZX0udmFuLXNsaWRlLXJpZ2h0LWVudGVyLWFjdGl2ZXstd2Via2l0LWFuaW1hdGlvbjp2YW4tc2xpZGUtcmlnaHQtZW50ZXIgLjNzIGJvdGggZWFzZTthbmltYXRpb246dmFuLXNsaWRlLXJpZ2h0LWVudGVyIC4zcyBib3RoIGVhc2V9LnZhbi1zbGlkZS1yaWdodC1sZWF2ZS1hY3RpdmV7LXdlYmtpdC1hbmltYXRpb246dmFuLXNsaWRlLXJpZ2h0LWxlYXZlIC4zcyBib3RoIGVhc2U7YW5pbWF0aW9uOnZhbi1zbGlkZS1yaWdodC1sZWF2ZSAuM3MgYm90aCBlYXNlfS52YW4taW5mb3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JveC1zaXppbmc6Ym9yZGVyLWJveDttaW4td2lkdGg6MTZweDtwYWRkaW5nOjAgM3B4O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlBpbmdGYW5nIFNDLEhlbHZldGljYSBOZXVlLEFyaWFsLHNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNlZTBhMjQ7Ym9yZGVyOjFweCBzb2xpZCAjZmZmO2JvcmRlci1yYWRpdXM6MTZweDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNTAlLC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNTAlLC01MCUpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjoxMDAlO3RyYW5zZm9ybS1vcmlnaW46MTAwJX0udmFuLWluZm8tLWRvdHt3aWR0aDo4cHg7bWluLXdpZHRoOjA7aGVpZ2h0OjhweDtiYWNrZ3JvdW5kLWNvbG9yOiNlZTBhMjQ7Ym9yZGVyLXJhZGl1czoxMDAlfUBmb250LWZhY2V7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtZmFtaWx5Oid2YW50LWljb24nO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTphdXRvO3NyYzp1cmwoaHR0cHM6Ly9pbWcueXpjZG4uY24vdmFudC92YW50LWljb24tMGJjNjU0LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyksdXJsKGh0dHBzOi8vaW1nLnl6Y2RuLmNuL3ZhbnQvdmFudC1pY29uLTBiYzY1NC53b2ZmKSBmb3JtYXQoJ3dvZmYnKSx1cmwoaHR0cHM6Ly9pbWcueXpjZG4uY24vdmFudC92YW50LWljb24tMGJjNjU0LnR0ZikgZm9ybWF0KCd0cnVldHlwZScpfS52YW4taWNvbntwb3NpdGlvbjpyZWxhdGl2ZTtmb250OjE0cHgvMSBcXFwidmFudC1pY29uXFxcIjtmb250LXNpemU6aW5oZXJpdDt0ZXh0LXJlbmRlcmluZzphdXRvOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWR9LnZhbi1pY29uLC52YW4taWNvbjo6YmVmb3Jle2Rpc3BsYXk6aW5saW5lLWJsb2NrfS52YW4taWNvbi1hZGQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDBcXFwifS52YW4taWNvbi1hZGQtc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAwMVxcXCJ9LnZhbi1pY29uLWFkZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDJcXFwifS52YW4taWNvbi1hZnRlci1zYWxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAwM1xcXCJ9LnZhbi1pY29uLWFpbTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDRcXFwifS52YW4taWNvbi1hbGlwYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDA1XFxcIn0udmFuLWljb24tYXBwcy1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAwNlxcXCJ9LnZhbi1pY29uLWFycm93LWRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDA3XFxcIn0udmFuLWljb24tYXJyb3ctbGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDhcXFwifS52YW4taWNvbi1hcnJvdy11cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMDlcXFwifS52YW4taWNvbi1hcnJvdzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMEFcXFwifS52YW4taWNvbi1hc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDBCXFxcIn0udmFuLWljb24tYXVkaW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDBDXFxcIn0udmFuLWljb24tYXdhcmQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMERcXFwifS52YW4taWNvbi1hd2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMEVcXFwifS52YW4taWNvbi1iYWctbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMEZcXFwifS52YW4taWNvbi1iYWc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDEwXFxcIn0udmFuLWljb24tYmFsYW5jZS1saXN0LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDExXFxcIn0udmFuLWljb24tYmFsYW5jZS1saXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxMlxcXCJ9LnZhbi1pY29uLWJhbGFuY2UtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMTNcXFwifS52YW4taWNvbi1iYWxhbmNlLXBheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMTRcXFwifS52YW4taWNvbi1iYXItY2hhcnQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMTVcXFwifS52YW4taWNvbi1iYXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxNlxcXCJ9LnZhbi1pY29uLWJlbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDE3XFxcIn0udmFuLWljb24tYmlsbC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxOFxcXCJ9LnZhbi1pY29uLWJpbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDE5XFxcIn0udmFuLWljb24tYmlydGhkYXktY2FrZS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxQVxcXCJ9LnZhbi1pY29uLWJvb2ttYXJrLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDFCXFxcIn0udmFuLWljb24tYm9va21hcms6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDFDXFxcIn0udmFuLWljb24tYnJvd3NpbmctaGlzdG9yeS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAxRFxcXCJ9LnZhbi1pY29uLWJyb3dzaW5nLWhpc3Rvcnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDFFXFxcIn0udmFuLWljb24tYnJ1c2gtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMUZcXFwifS52YW4taWNvbi1idWxiLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDIwXFxcIn0udmFuLWljb24tYnVsbGhvcm4tbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjFcXFwifS52YW4taWNvbi1jYWxlbmRlci1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAyMlxcXCJ9LnZhbi1pY29uLWNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDIzXFxcIn0udmFuLWljb24tY2FydC1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjRcXFwifS52YW4taWNvbi1jYXJ0LWNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjVcXFwifS52YW4taWNvbi1jYXJ0LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDI2XFxcIn0udmFuLWljb24tY2FydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjdcXFwifS52YW4taWNvbi1jYXNoLWJhY2stcmVjb3JkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAyOFxcXCJ9LnZhbi1pY29uLWNhc2gtb24tZGVsaXZlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMjlcXFwifS52YW4taWNvbi1jYXNoaWVyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDJBXFxcIn0udmFuLWljb24tY2VydGlmaWNhdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDJCXFxcIn0udmFuLWljb24tY2hhcnQtdHJlbmRpbmctbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMkNcXFwifS52YW4taWNvbi1jaGF0LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDJEXFxcIn0udmFuLWljb24tY2hhdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMkVcXFwifS52YW4taWNvbi1jaGVja2VkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAyRlxcXCJ9LnZhbi1pY29uLWNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMzBcXFwifS52YW4taWNvbi1jbGVhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwMzFcXFwifS52YW4taWNvbi1jbG9jay1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzMlxcXCJ9LnZhbi1pY29uLWNsb2NrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzM1xcXCJ9LnZhbi1pY29uLWNsb3NlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzNFxcXCJ9LnZhbi1pY29uLWNsb3NlZC1leWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDM1XFxcIn0udmFuLWljb24tY2x1c3Rlci1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzNlxcXCJ9LnZhbi1pY29uLWNsdXN0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDM3XFxcIn0udmFuLWljb24tY29sdW1uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzOFxcXCJ9LnZhbi1pY29uLWNvbW1lbnQtY2lyY2xlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDM5XFxcIn0udmFuLWljb24tY29tbWVudC1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDNBXFxcIn0udmFuLWljb24tY29tbWVudC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzQlxcXCJ9LnZhbi1pY29uLWNvbW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDNDXFxcIn0udmFuLWljb24tY29tcGxldGVkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjAzRFxcXCJ9LnZhbi1pY29uLWNvbnRhY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDNFXFxcIn0udmFuLWljb24tY291cG9uLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDNGXFxcIn0udmFuLWljb24tY291cG9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0MFxcXCJ9LnZhbi1pY29uLWNyZWRpdC1wYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDQxXFxcIn0udmFuLWljb24tY3Jvc3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDQyXFxcIn0udmFuLWljb24tZGViaXQtcGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0M1xcXCJ9LnZhbi1pY29uLWRlbGV0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNDRcXFwifS52YW4taWNvbi1kZXNjZW5kaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0NVxcXCJ9LnZhbi1pY29uLWRlc2NyaXB0aW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0NlxcXCJ9LnZhbi1pY29uLWRlc2t0b3AtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNDdcXFwifS52YW4taWNvbi1kaWFtb25kLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDQ4XFxcIn0udmFuLWljb24tZGlhbW9uZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNDlcXFwifS52YW4taWNvbi1kaXNjb3VudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNEFcXFwifS52YW4taWNvbi1kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0QlxcXCJ9LnZhbi1pY29uLWVjYXJkLXBheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNENcXFwifS52YW4taWNvbi1lZGl0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0RFxcXCJ9LnZhbi1pY29uLWVsbGlwc2lzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0RVxcXCJ9LnZhbi1pY29uLWVtcHR5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA0RlxcXCJ9LnZhbi1pY29uLWVudmVsb3AtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNTBcXFwifS52YW4taWNvbi1leGNoYW5nZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNTFcXFwifS52YW4taWNvbi1leHBhbmQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNTJcXFwifS52YW4taWNvbi1leHBhbmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDUzXFxcIn0udmFuLWljb24tZXllLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDU0XFxcIn0udmFuLWljb24tZXllOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA1NVxcXCJ9LnZhbi1pY29uLWZhaWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDU2XFxcIn0udmFuLWljb24tZmFpbHVyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNTdcXFwifS52YW4taWNvbi1maWx0ZXItbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNThcXFwifS52YW4taWNvbi1maXJlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDU5XFxcIn0udmFuLWljb24tZmlyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNUFcXFwifS52YW4taWNvbi1mbGFnLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDVCXFxcIn0udmFuLWljb24tZmxvd2VyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDVDXFxcIn0udmFuLWljb24tZnJlZS1wb3N0YWdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA1RFxcXCJ9LnZhbi1pY29uLWZyaWVuZHMtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNUVcXFwifS52YW4taWNvbi1mcmllbmRzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA1RlxcXCJ9LnZhbi1pY29uLWdlbS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA2MFxcXCJ9LnZhbi1pY29uLWdlbTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNjFcXFwifS52YW4taWNvbi1naWZ0LWNhcmQtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNjJcXFwifS52YW4taWNvbi1naWZ0LWNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDYzXFxcIn0udmFuLWljb24tZ2lmdC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA2NFxcXCJ9LnZhbi1pY29uLWdpZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDY1XFxcIn0udmFuLWljb24tZ29sZC1jb2luLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDY2XFxcIn0udmFuLWljb24tZ29sZC1jb2luOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA2N1xcXCJ9LnZhbi1pY29uLWdvb2Qtam9iLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDY4XFxcIn0udmFuLWljb24tZ29vZC1qb2I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDY5XFxcIn0udmFuLWljb24tZ29vZHMtY29sbGVjdC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA2QVxcXCJ9LnZhbi1pY29uLWdvb2RzLWNvbGxlY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDZCXFxcIn0udmFuLWljb24tZ3JhcGhpYzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNkNcXFwifS52YW4taWNvbi1ob21lLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDZEXFxcIn0udmFuLWljb24taG90LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDZFXFxcIn0udmFuLWljb24taG90LXNhbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNkZcXFwifS52YW4taWNvbi1ob3Qtc2FsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNzBcXFwifS52YW4taWNvbi1ob3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDcxXFxcIn0udmFuLWljb24taG90ZWwtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNzJcXFwifS52YW4taWNvbi1pZGNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDczXFxcIn0udmFuLWljb24taW5mby1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA3NFxcXCJ9LnZhbi1pY29uLWluZm86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDc1XFxcIn0udmFuLWljb24taW52aXRpb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDc2XFxcIn0udmFuLWljb24tbGFiZWwtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNzdcXFwifS52YW4taWNvbi1sYWJlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwNzhcXFwifS52YW4taWNvbi1saWtlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDc5XFxcIn0udmFuLWljb24tbGlrZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwN0FcXFwifS52YW4taWNvbi1saXZlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA3QlxcXCJ9LnZhbi1pY29uLWxvY2F0aW9uLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDdDXFxcIn0udmFuLWljb24tbG9jYXRpb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDdEXFxcIn0udmFuLWljb24tbG9jazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwN0VcXFwifS52YW4taWNvbi1sb2dpc3RpY3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDdGXFxcIn0udmFuLWljb24tbWFuYWdlci1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA4MFxcXCJ9LnZhbi1pY29uLW1hbmFnZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDgxXFxcIn0udmFuLWljb24tbWFwLW1hcmtlZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwODJcXFwifS52YW4taWNvbi1tZWRlbC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA4M1xcXCJ9LnZhbi1pY29uLW1lZGVsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA4NFxcXCJ9LnZhbi1pY29uLW1vcmUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwODVcXFwifS52YW4taWNvbi1tb3JlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA4NlxcXCJ9LnZhbi1pY29uLW11c2ljLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDg3XFxcIn0udmFuLWljb24tbXVzaWM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDg4XFxcIn0udmFuLWljb24tbmV3LWFycml2YWwtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwODlcXFwifS52YW4taWNvbi1uZXctYXJyaXZhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOEFcXFwifS52YW4taWNvbi1uZXctbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOEJcXFwifS52YW4taWNvbi1uZXc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDhDXFxcIn0udmFuLWljb24tbmV3c3BhcGVyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDhEXFxcIn0udmFuLWljb24tbm90ZXMtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOEVcXFwifS52YW4taWNvbi1vcmRlcnMtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOEZcXFwifS52YW4taWNvbi1vdGhlci1wYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDkwXFxcIn0udmFuLWljb24tcGFpZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOTFcXFwifS52YW4taWNvbi1wYXNzZWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDkyXFxcIn0udmFuLWljb24tcGF1c2UtY2lyY2xlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDkzXFxcIn0udmFuLWljb24tcGF1c2UtY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5NFxcXCJ9LnZhbi1pY29uLXBhdXNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5NVxcXCJ9LnZhbi1pY29uLXBlZXItcGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5NlxcXCJ9LnZhbi1pY29uLXBlbmRpbmctcGF5bWVudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOTdcXFwifS52YW4taWNvbi1waG9uZS1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOThcXFwifS52YW4taWNvbi1waG9uZS1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDk5XFxcIn0udmFuLWljb24tcGhvbmUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOUFcXFwifS52YW4taWNvbi1waG9uZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOUJcXFwifS52YW4taWNvbi1waG90by1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5Q1xcXCJ9LnZhbi1pY29uLXBob3RvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjA5RFxcXCJ9LnZhbi1pY29uLXBob3RvZ3JhcGg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMDlFXFxcIn0udmFuLWljb24tcGxheS1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwOUZcXFwifS52YW4taWNvbi1wbGF5LWNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQTBcXFwifS52YW4taWNvbi1wbGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBMVxcXCJ9LnZhbi1pY29uLXBsdXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEEyXFxcIn0udmFuLWljb24tcG9pbnQtZ2lmdC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBM1xcXCJ9LnZhbi1pY29uLXBvaW50LWdpZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEE0XFxcIn0udmFuLWljb24tcG9pbnRzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBNVxcXCJ9LnZhbi1pY29uLXByaW50ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEE2XFxcIn0udmFuLWljb24tcXItaW52YWxpZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQTdcXFwifS52YW4taWNvbi1xcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQThcXFwifS52YW4taWNvbi1xdWVzdGlvbi1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBOVxcXCJ9LnZhbi1pY29uLXF1ZXN0aW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBQVxcXCJ9LnZhbi1pY29uLXJlY29yZHM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEFCXFxcIn0udmFuLWljb24tcmVmdW5kLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEFDXFxcIn0udmFuLWljb24tcmVwbGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBRFxcXCJ9LnZhbi1pY29uLXNjYW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEFFXFxcIn0udmFuLWljb24tc2VhcmNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBBRlxcXCJ9LnZhbi1pY29uLXNlbmQtZ2lmdC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCMFxcXCJ9LnZhbi1pY29uLXNlbmQtZ2lmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjFcXFwifS52YW4taWNvbi1zZXJ2aWNlLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEIyXFxcIn0udmFuLWljb24tc2VydmljZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjNcXFwifS52YW4taWNvbi1zZXR0aW5nLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEI0XFxcIn0udmFuLWljb24tc2V0dGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjVcXFwifS52YW4taWNvbi1zaGFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjZcXFwifS52YW4taWNvbi1zaG9wLWNvbGxlY3QtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQjdcXFwifS52YW4taWNvbi1zaG9wLWNvbGxlY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEI4XFxcIn0udmFuLWljb24tc2hvcC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCOVxcXCJ9LnZhbi1pY29uLXNob3A6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEJBXFxcIn0udmFuLWljb24tc2hvcHBpbmctY2FydC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCQlxcXCJ9LnZhbi1pY29uLXNob3BwaW5nLWNhcnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEJDXFxcIn0udmFuLWljb24tc2hyaW5rOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCRFxcXCJ9LnZhbi1pY29uLXNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEJFXFxcIn0udmFuLWljb24tc21pbGUtY29tbWVudC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBCRlxcXCJ9LnZhbi1pY29uLXNtaWxlLWNvbW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEMwXFxcIn0udmFuLWljb24tc21pbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzFcXFwifS52YW4taWNvbi1zbWlsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzJcXFwifS52YW4taWNvbi1zdGFyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEMzXFxcIn0udmFuLWljb24tc3RhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzRcXFwifS52YW4taWNvbi1zdG9wLWNpcmNsZS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBDNVxcXCJ9LnZhbi1pY29uLXN0b3AtY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBDNlxcXCJ9LnZhbi1pY29uLXN0b3A6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEM3XFxcIn0udmFuLWljb24tc3VjY2VzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzhcXFwifS52YW4taWNvbi10aHVtYi1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQzlcXFwifS52YW4taWNvbi10aHVtYi1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMENBXFxcIn0udmFuLWljb24tdG9kby1saXN0LW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMENCXFxcIn0udmFuLWljb24tdG9kby1saXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBDQ1xcXCJ9LnZhbi1pY29uLXRvc2VuZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQ0RcXFwifS52YW4taWNvbi10di1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBDRVxcXCJ9LnZhbi1pY29uLXVtYnJlbGxhLWNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwQ0ZcXFwifS52YW4taWNvbi11bmRlcndheS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEMFxcXCJ9LnZhbi1pY29uLXVuZGVyd2F5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEMVxcXCJ9LnZhbi1pY29uLXVwZ3JhZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEQyXFxcIn0udmFuLWljb24tdXNlci1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRDNcXFwifS52YW4taWNvbi11c2VyLW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEQ0XFxcIn0udmFuLWljb24tdmlkZW8tbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRDVcXFwifS52YW4taWNvbi12aWRlbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRDZcXFwifS52YW4taWNvbi12aXAtY2FyZC1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEN1xcXCJ9LnZhbi1pY29uLXZpcC1jYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEOFxcXCJ9LnZhbi1pY29uLXZvbHVtZS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEOVxcXCJ9LnZhbi1pY29uLXZvbHVtZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwREFcXFwifS52YW4taWNvbi13YXAtaG9tZS1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEQlxcXCJ9LnZhbi1pY29uLXdhcC1ob21lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBEQ1xcXCJ9LnZhbi1pY29uLXdhcC1uYXY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEREXFxcIn0udmFuLWljb24td2Fybi1vOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBERVxcXCJ9LnZhbi1pY29uLXdhcm5pbmctbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwREZcXFwifS52YW4taWNvbi13YXJuaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcRjBFMFxcXCJ9LnZhbi1pY29uLXdlYXBwLW5hdjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRTFcXFwifS52YW4taWNvbi13ZWNoYXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxGMEUyXFxcIn0udmFuLWljb24teW91emFuLXNoaWVsZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXEYwRTNcXFwifS52YW4taWNvbl9faW1hZ2V7d2lkdGg6MWVtO2hlaWdodDoxZW19LnZhbi1sb2FkaW5nLC52YW4tbG9hZGluZ19fc3Bpbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnZhbi1sb2FkaW5ne2NvbG9yOiNjOGM5Y2M7Zm9udC1zaXplOjB9LnZhbi1sb2FkaW5nX19zcGlubmVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjMwcHg7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OjMwcHg7bWF4LWhlaWdodDoxMDAlOy13ZWJraXQtYW5pbWF0aW9uOnZhbi1yb3RhdGUgLjhzIGxpbmVhciBpbmZpbml0ZTthbmltYXRpb246dmFuLXJvdGF0ZSAuOHMgbGluZWFyIGluZmluaXRlfS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lcnstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246c3RlcHMoMTIpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246c3RlcHMoMTIpfS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpe3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOjpiZWZvcmV7ZGlzcGxheTpibG9jazt3aWR0aDoycHg7aGVpZ2h0OjI1JTttYXJnaW46MCBhdXRvO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yO2JvcmRlci1yYWRpdXM6NDAlO2NvbnRlbnQ6JyAnfS52YW4tbG9hZGluZ19fc3Bpbm5lci0tY2lyY3VsYXJ7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MnM7YW5pbWF0aW9uLWR1cmF0aW9uOjJzfS52YW4tbG9hZGluZ19fY2lyY3VsYXJ7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS52YW4tbG9hZGluZ19fY2lyY3VsYXIgY2lyY2xley13ZWJraXQtYW5pbWF0aW9uOnZhbi1jaXJjdWxhciAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlO2FuaW1hdGlvbjp2YW4tY2lyY3VsYXIgMS41cyBlYXNlLWluLW91dCBpbmZpbml0ZTtzdHJva2U6Y3VycmVudENvbG9yO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lY2FwOnJvdW5kfS52YW4tbG9hZGluZ19fdGV4dHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDo4cHg7Y29sb3I6Izk2OTc5OTtmb250LXNpemU6MTRweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnZhbi1sb2FkaW5nLS12ZXJ0aWNhbHtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstd2Via2l0LWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0udmFuLWxvYWRpbmctLXZlcnRpY2FsIC52YW4tbG9hZGluZ19fdGV4dHttYXJnaW46OHB4IDAgMH0udmFuLWxvYWRpbmdfX3NwaW5uZXItLXNwaW5uZXIgaTpudGgtb2YtdHlwZSgxKXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzBkZWcpO29wYWNpdHk6MX0udmFuLWxvYWRpbmdfX3NwaW5uZXItLXNwaW5uZXIgaTpudGgtb2YtdHlwZSgyKXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNjBkZWcpO29wYWNpdHk6LjkzNzV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoMyl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKTtvcGFjaXR5Oi44NzV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoNCl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDEyMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgxMjBkZWcpO29wYWNpdHk6LjgxMjV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoNSl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDE1MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgxNTBkZWcpO29wYWNpdHk6Ljc1fS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOm50aC1vZi10eXBlKDYpey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKTtvcGFjaXR5Oi42ODc1fS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOm50aC1vZi10eXBlKDcpey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgyMTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMjEwZGVnKTtvcGFjaXR5Oi42MjV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoOCl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDI0MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgyNDBkZWcpO29wYWNpdHk6LjU2MjV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoOSl7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDI3MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpO29wYWNpdHk6LjV9LnZhbi1sb2FkaW5nX19zcGlubmVyLS1zcGlubmVyIGk6bnRoLW9mLXR5cGUoMTApey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzMDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzAwZGVnKTtvcGFjaXR5Oi40Mzc1fS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOm50aC1vZi10eXBlKDExKXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzMwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDMzMGRlZyk7b3BhY2l0eTouMzc1fS52YW4tbG9hZGluZ19fc3Bpbm5lci0tc3Bpbm5lciBpOm50aC1vZi10eXBlKDEyKXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7b3BhY2l0eTouMzEyNX0udmFuLWJ1dHRvbntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjQ0cHg7bWFyZ2luOjA7cGFkZGluZzowO2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjQycHg7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjJzO3RyYW5zaXRpb246b3BhY2l0eSAuMnM7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCV9LnZhbi1idXR0b246OmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjojMDAwO2JvcmRlcjppbmhlcml0O2JvcmRlci1jb2xvcjojMDAwO2JvcmRlci1yYWRpdXM6aW5oZXJpdDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSk7b3BhY2l0eTowO2NvbnRlbnQ6JyAnfS52YW4tYnV0dG9uOmFjdGl2ZTo6YmVmb3Jle29wYWNpdHk6LjF9LnZhbi1idXR0b24tLWRpc2FibGVkOjpiZWZvcmUsLnZhbi1idXR0b24tLWxvYWRpbmc6OmJlZm9yZXtkaXNwbGF5Om5vbmV9LnZhbi1idXR0b24tLWRlZmF1bHR7Y29sb3I6IzMyMzIzMztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZWJlZGYwfS52YW4tYnV0dG9uLS1wcmltYXJ5e2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDdjMTYwO2JvcmRlcjoxcHggc29saWQgIzA3YzE2MH0udmFuLWJ1dHRvbi0taW5mb3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzE5ODlmYTtib3JkZXI6MXB4IHNvbGlkICMxOTg5ZmF9LnZhbi1idXR0b24tLWRhbmdlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2VlMGEyNDtib3JkZXI6MXB4IHNvbGlkICNlZTBhMjR9LnZhbi1idXR0b24tLXdhcm5pbmd7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk3NmE7Ym9yZGVyOjFweCBzb2xpZCAjZmY5NzZhfS52YW4tYnV0dG9uLS1wbGFpbntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LnZhbi1idXR0b24tLXBsYWluLnZhbi1idXR0b24tLXByaW1hcnl7Y29sb3I6IzA3YzE2MH0udmFuLWJ1dHRvbi0tcGxhaW4udmFuLWJ1dHRvbi0taW5mb3tjb2xvcjojMTk4OWZhfS52YW4tYnV0dG9uLS1wbGFpbi52YW4tYnV0dG9uLS1kYW5nZXJ7Y29sb3I6I2VlMGEyNH0udmFuLWJ1dHRvbi0tcGxhaW4udmFuLWJ1dHRvbi0td2FybmluZ3tjb2xvcjojZmY5NzZhfS52YW4tYnV0dG9uLS1sYXJnZXt3aWR0aDoxMDAlO2hlaWdodDo1MHB4O2xpbmUtaGVpZ2h0OjQ4cHh9LnZhbi1idXR0b24tLW5vcm1hbHtwYWRkaW5nOjAgMTVweDtmb250LXNpemU6MTRweH0udmFuLWJ1dHRvbi0tc21hbGx7bWluLXdpZHRoOjYwcHg7aGVpZ2h0OjMwcHg7cGFkZGluZzowIDhweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoyOHB4fS52YW4tYnV0dG9uX19sb2FkaW5ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO2NvbG9yOmluaGVyaXQ7dmVydGljYWwtYWxpZ246dG9wfS52YW4tYnV0dG9uLS1taW5pe2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi13aWR0aDo1MHB4O2hlaWdodDoyMnB4O2ZvbnQtc2l6ZToxMHB4O2xpbmUtaGVpZ2h0OjIwcHh9LnZhbi1idXR0b24tLW1pbmkrLnZhbi1idXR0b24tLW1pbml7bWFyZ2luLWxlZnQ6NHB4fS52YW4tYnV0dG9uLS1ibG9ja3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9LnZhbi1idXR0b24tLWRpc2FibGVke29wYWNpdHk6LjV9LnZhbi1idXR0b24tLWhhaXJsaW5lLnZhbi1idXR0b24tLXJvdW5kOjphZnRlciwudmFuLWJ1dHRvbi0tcm91bmR7Ym9yZGVyLXJhZGl1czo5OTlweH0udmFuLWJ1dHRvbi0taGFpcmxpbmUudmFuLWJ1dHRvbi0tc3F1YXJlOjphZnRlciwudmFuLWJ1dHRvbi0tc3F1YXJle2JvcmRlci1yYWRpdXM6MH0udmFuLWJ1dHRvbl9faWNvbnttaW4td2lkdGg6MWVtO2ZvbnQtc2l6ZToxLjJlbTtsaW5lLWhlaWdodDppbmhlcml0O3ZlcnRpY2FsLWFsaWduOnRvcH0udmFuLWJ1dHRvbl9faWNvbisudmFuLWJ1dHRvbl9fdGV4dCwudmFuLWJ1dHRvbl9fbG9hZGluZysudmFuLWJ1dHRvbl9fdGV4dHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDo1cHg7dmVydGljYWwtYWxpZ246dG9wfS52YW4tYnV0dG9uLS1oYWlybGluZXtib3JkZXItd2lkdGg6MH0udmFuLWJ1dHRvbi0taGFpcmxpbmU6OmFmdGVye2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1yYWRpdXM6NHB4fS52YW4tY2VsbHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MTAwJTtwYWRkaW5nOjEwcHggMTZweDtvdmVyZmxvdzpoaWRkZW47Y29sb3I6IzMyMzIzMztmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoyNHB4O2JhY2tncm91bmQtY29sb3I6I2ZmZn0udmFuLWNlbGw6bm90KDpsYXN0LWNoaWxkKTo6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O2NvbnRlbnQ6JyAnO3BvaW50ZXItZXZlbnRzOm5vbmU7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjE2cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ViZWRmMDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVkoLjUpO3RyYW5zZm9ybTpzY2FsZVkoLjUpfS52YW4tY2VsbC0tYm9yZGVybGVzczo6YWZ0ZXJ7ZGlzcGxheTpub25lfS52YW4tY2VsbF9fbGFiZWx7bWFyZ2luLXRvcDozcHg7Y29sb3I6Izk2OTc5OTtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxOHB4fS52YW4tY2VsbF9fdGl0bGUsLnZhbi1jZWxsX192YWx1ZXstd2Via2l0LWJveC1mbGV4OjE7LXdlYmtpdC1mbGV4OjE7ZmxleDoxfS52YW4tY2VsbF9fdmFsdWV7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVuO2NvbG9yOiM5Njk3OTk7dGV4dC1hbGlnbjpyaWdodDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d29yZC13cmFwOmJyZWFrLXdvcmR9LnZhbi1jZWxsX192YWx1ZS0tYWxvbmV7Y29sb3I6IzMyMzIzMzt0ZXh0LWFsaWduOmxlZnR9LnZhbi1jZWxsX19sZWZ0LWljb24sLnZhbi1jZWxsX19yaWdodC1pY29ue21pbi13aWR0aDoxZW07aGVpZ2h0OjI0cHg7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjRweH0udmFuLWNlbGxfX2xlZnQtaWNvbnttYXJnaW4tcmlnaHQ6NXB4fS52YW4tY2VsbF9fcmlnaHQtaWNvbnttYXJnaW4tbGVmdDo1cHg7Y29sb3I6Izk2OTc5OX0udmFuLWNlbGwtLWNsaWNrYWJsZTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZjJmM2Y1fS52YW4tY2VsbC0tcmVxdWlyZWR7b3ZlcmZsb3c6dmlzaWJsZX0udmFuLWNlbGwtLXJlcXVpcmVkOjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7Y29sb3I6I2VlMGEyNDtmb250LXNpemU6MTRweDtjb250ZW50OicqJ30udmFuLWNlbGwtLWNlbnRlcnstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LXdlYmtpdC1hbGlnbi1pdGVtczpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS52YW4tY2VsbC0tbGFyZ2V7cGFkZGluZy10b3A6MTJweDtwYWRkaW5nLWJvdHRvbToxMnB4fS52YW4tY2VsbC0tbGFyZ2UgLnZhbi1jZWxsX190aXRsZXtmb250LXNpemU6MTZweH0udmFuLWNlbGwtLWxhcmdlIC52YW4tY2VsbF9fbGFiZWx7Zm9udC1zaXplOjE0cHh9LnZhbi1jZWxsLWdyb3Vwe2JhY2tncm91bmQtY29sb3I6I2ZmZn0udmFuLWNlbGwtZ3JvdXBfX3RpdGxle3BhZGRpbmc6MTZweCAxNnB4IDhweDtjb2xvcjojOTY5Nzk5O2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjE2cHh9LnZhbi1vdmVybGF5e3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNyl9XCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css":
/*!*********************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css ***!
  \*********************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("exports = module.exports = __webpack_require__(/*! ../../_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n.vjs-modal-dialog .vjs-modal-dialog-content, .video-js .vjs-modal-dialog, .vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n}\\n\\n.vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\\n  text-align: center;\\n}\\n\\n@font-face {\\n  font-family: VideoJS;\\n  src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAABDkAAsAAAAAG6gAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIslek9TLzIAAAFEAAAAPgAAAFZRiV3hY21hcAAAAYQAAADaAAADPv749/pnbHlmAAACYAAAC3AAABHQZg6OcWhlYWQAAA3QAAAAKwAAADYZw251aGhlYQAADfwAAAAdAAAAJA+RCLFobXR4AAAOHAAAABMAAACM744AAGxvY2EAAA4wAAAASAAAAEhF6kqubWF4cAAADngAAAAfAAAAIAE0AIFuYW1lAAAOmAAAASUAAAIK1cf1oHBvc3QAAA/AAAABJAAAAdPExYuNeJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCACY7BUgAeJxjYGS7wTiBgZWBgaWQ5RkDA8MvCM0cwxDOeI6BgYmBlZkBKwhIc01hcPjI+FGJHcRdyA4RZgQRADK3CxEAAHic7dFZbsMgAEXRS0ycyZnnOeG7y+qC8pU1dHusIOXxuoxaOlwZYWQB0Aea4quIEN4E9LzKbKjzDeM6H/mua6Lmc/p8yhg0lvdYx15ZG8uOLQOGjMp3EzqmzJizYMmKNRu27Nhz4MiJMxeu3Ljz4Ekqm7T8P52G8PP3lnTOVk++Z6iN6QZzNN1F7ptuN7eGOjDUoaGODHVsuvU8MdTO9Hd5aqgzQ50b6sJQl4a6MtS1oW4MdWuoO0PdG+rBUI+GejLUs6FeDPVqqDdDvRvqw1CfhpqM9At0iFLaAAB4nJ1YDXBTVRZ+5/22TUlJ8we0pHlJm7RJf5O8F2j6EymlSPkpxaL8U2xpa3DKj0CBhc2IW4eWKSokIoLsuMqssM64f+jA4HSdWXXXscBq67IOs3FXZ1ZYWVyRFdo899yXtIBQZ90k7717zz3v3HPPOfd854YCCj9cL9dL0RQFOqCbGJnrHb5EayiKIWN8iA/hWBblo6hUWm8TtCDwE80WMJus/irwyxOdxeB0MDb14VNJHnXYoLLSl6FfCUYO9nYPTA8Epg9090LprfbBbZ2hY0UlJUXHQp3/vtWkS6EBv8+rPMq5u9692f/dNxJNiqwC1xPE9TCUgCsSdQWgE3XQD25lkG4CN2xmTcOXWBOyser6RN6KnGbKSbmQ3+d0OI1m2W8QzLLkI2sykrWAgJJEtA8vGGW/2Q+CmT3n8zS9wZwu2DCvtuZKZN3xkrLh36yCZuUomQSqGpY8t/25VfHVhw8z4ebGBtfLb0ya9PCaDc+8dGTvk2dsh6z7WzvowlXKUSWo9MJ15a3KrEP2loOr2Ojhw6iW6hf2BDdEccQvZGpaAy7YovSwq8kr7HGllxpd71rkS6G0Sf11sl9OvMK1+jwPPODxjUwkOim9CU3ix1wNjXDfmJSEn618Bs6lpWwUpU+8PCqLMY650zjq8VhCIP17NEKTx3eaLL+s5Pi6yJWaWjTHLR1jYzPSV9VF/6Ojdb/1kO3Mk3uhHC0x6gc1BjlKQ+nQFxTYdaJkZ7ySVxLBbhR1dsboNXp1tCYKW2LRaEzpYcIx2BKNxaL0ZaUnSqfFoiNhHKR/GkX6PWUSAaJelQaqZL1EpoHNsajSEyPSoJ9IjhIxTdjHLmwZvhRDOiFTY/YeQnvrVZmiTQtGncECXtFTBZLOVwwMRgoXHAkXzMzPn1nAJJ8jYSbMDaqN2waGLzNhih/bZynUBMpIWSg7VYi7DRx2m8ALkIdRCJwI6ArJx2EI8kaDWeTQKeAFk9fjl/1AvwktjQ1P7NjyMGQyfd4vjipX6M/i52D7Cq80kqlcxEcGXRr/FEcgs0u5uGgB4VWuMFfpdn2Re6Hi3PqzmxWKsz6+ae2Pn9hXXw/fqM859UiGC0oKYYILJBqJrsn1Z1E5qOs9rQCiUQRREjm8yJcbHF5cUJufX1vAHlefw0XgUoboS3ETfQlTxBC4SOtuE8VPRJTBSCQSjZCpk7Gqzu+masaZ2y7Zjehho4F3g82BNDkAHpORG4+OCS+f6JTPmtRn/PH1kch6d04sp7AQb25aQ/pqUyXeQ8vrebG8OYQdXOQ+585u0sdW9rqalzRURiJ+9F4MweRFrKUjl1GUYhH1A27WOHw5cTFSFPMo9EeUIGnQTZHIaJ7AHLaOKsOODaNF9jkBjYG2QEsQ2xjMUAx2bBEbeTBWMHwskBjngq56S/yfgkBnWBa4K9sqKtq2t1UI8S9He5XuBRbawAdatrQEAi30Aks2+LM8WeCbalVZkWNylvJ+dqJnzVb+OHlSoKW8nPCP7Rd+CcZ2DdWAGqJ2CBFOphgywFFCFBNtfAbGtNPBCwxvygHeYMZMY9ZboBqwq/pVrsbgN5tkv152ODlbMfiqwGMBgxa4Exz3QhovRIUp6acqZmQzRq0ypDXS2TPLT02YIkQETnOE445oOGxOmXAqUJNNG7XgupMjPq2ua9asrj5yY/yuKteO1Kx0YNJTufrirLe1mZnat7OL6rnUdCWenpW6I8mAnbsY8KWs1PuSovCW9A/Z25PQ24a7cNOqgmTkLmBMgh4THgc4b9k2IVv1/g/F5nGljwPLfOgHAzJzh45V/4+WenTzmMtR5Z7us2Tys909UHqrPY7KbckoxRvRHhmVc3cJGE97uml0R1S0jdULVl7EvZtDFVBF35N9cEdjpgmAiOlFZ+Dtoh93+D3zzHr8RRNZQhnCNMNbcegOvpEwZoL+06cJQ07h+th3fZ/7PVbVC6ngTAV/KoLFuO6+2KFcU651gEb5ugPSIb1D+Xp8V4+k3sEIGnw5mYe4If4k1lFYr6SCzmM2EQ8iWtmwjnBI9kTwe1TlfAmXh7H02by9fW2gsjKwtv0aaURKil4OdV7rDL1MXIFNrhdxohcZXYTnq47WisrKitaObbf5+yvkLi5J6lCNZZ+B6GC38VNBZBDidSS/+mSvh6s+srgC8pyKMvDtt+de3c9fU76ZPfuM8ud4Kv0fyP/LqfepMT/3oZxSqpZaTa1DaQYLY8TFsHYbWYsPoRhRWfL5eSSQbhUGgGC3YLbVMk6PitTFNGpAsNrC6D1VNBKgBHMejaiuRWEWGgsSDBTJjqWIl8kJLlsaLJ2tXDr6xGfT85bM2Q06a46x2HTgvdnV8z5YDy/27J4zt6x2VtkzjoYpkq36kaBr4eQSg7tyiVweWubXZugtadl58ydapfbORfKsDTuZ0OBgx4cfdjCf5tbWNITnL120fdOi1RV1C3uKGzNdwYLcMvZ3BxoPyTOCD1XvXTp7U10gWCVmTV9b3r2z0SkGWovb2hp9I89O8a2smlyaO8muMU+dRmtzp60IzAoFpjLr1n388boLyf0dRvxhsHZ0qbWqDkwqvvpkj4l0fY6EIXRi5sQSrAvsVYwXRy4qJ2EVtD1AN7a0HWth9ymvL1xc3WTUKK/TAHA/bXDVtVWfOMfuGxGZv4Ln/jVr9jc3j1yMv0tndmyt9Vq88Y9gH1wtLX3KWjot5++jWHgAoZZkQ14wGQ20Fli71UmKJAy4xKMSTGbVdybW7FDDAut9XpD5AzWrYO7zQ8qffqF8+Ynd/clrHcdyxGy3a/3+mfNnzC/cBsveTjnTvXf1o6vzOlZw7WtqtdmPK/Errz/6NNtD72zmNOZfbmYdTGHfoofqI79Oc+R2n1lrnL6pOm0Up7kwxhTW12Amm7WYkXR2qYrF2AmgmbAsxZjwy1xpg/m1Je2vrp8v/nz2xpmlBg4E9hrMU341wVpTOh/OfmGvAnra8q6uctr60ZQHV3Q+WMQJykMj8ZsWn2QBOmmHMB+m5pDIpTFonYigiaKAhGEiAHF7EliVnQkjoLVIMPtJpBKHYd3A8GYH9jJzrWwmHx5Qjp7vDAX0suGRym1vtm/9W1/HyR8vczfMs6Sk8DSv855/5dlX9oQq52hT8syyp2rx5Id17IAyAM3wIjQPMOHzytEB64q6D5zT91yNbnx3V/nqnd017S9Y0605k3izoXLpsxde2n38yoOV9s1LcjwzNjbdX6asnBVaBj/6/DwKwPkpcqbDG7BnsXoSqWnUAmottYF6jMSdVyYZh3zVXCjwTiwwHH6sGuRiEHQGzuRX6whZkp123oy1BWE2mEfJ/tvIRtM4ZM5bDXiMsPMaAKOTyc5uL57rqyyc5y5JE5pm1i2S2iUX0CcaQ6lC6Zog7JqSqZmYlosl2K6pwNA84zRnQW6SaALYZQGW5lhCtU/W34N6o+bKfZ8cf3/Cl/+iTX3wBzpOY4mRkeNf3rptycGSshQWgGbYt5jFc2e0+DglIrwl6DVWQ7BuwaJ3Xk1J4VL5urnLl/Wf+gHU/hZoZdKNym6lG+I34FaNeZKcSpJIo2IeCVvpdsDGfKvzJnAwmeD37Ow65ZWwSowpgwX5T69s/rB55dP5BcpgDKFV8p7q2sn/1uc93bVzT/w6UrCqDTWvfCq/oCD/qZXNoUj8BL5Kp6GU017frfNXkAtiiyf/SOCEeLqnd8R/Ql9GlCRfctS6k5chvIBuQ1zCCjoCHL2DHNHIXxMJ3kQeO8lbsUXONeSfA5EjcG6/E+KdhN4bP04vBhdi883+BFBzQbxFbvZzQeY9LNBZc0FNfn5NwfDn6rCTnTw6R8o+gfpf5hCom33cRuiTlss3KHmZjD+BPN+5gXuA2ziS/Q73mLxUkpbKN/eqwz5uK0X9F3h2d1V4nGNgZGBgAOJd776+iue3+crAzc4AAje5Bfcg0xz9YHEOBiYQBQA8FQlFAHicY2BkYGBnAAGOPgaG//85+hkYGVCBMgBGGwNYAAAAeJxjYGBgYB8EmKOPgQEAQ04BfgAAAAAAAA4AaAB+AMwA4AECAUIBbAGYAcICGAJYArQC4AMwA7AD3gQwBJYE3AUkBWYFigYgBmYGtAbqB1gIEghYCG4IhAi2COh4nGNgZGBgUGYoZWBnAAEmIOYCQgaG/2A+AwAYCQG2AHicXZBNaoNAGIZfE5PQCKFQ2lUps2oXBfOzzAESyDKBQJdGR2NQR3QSSE/QE/QEPUUPUHqsvsrXjTMw83zPvPMNCuAWP3DQDAejdm1GjzwS7pMmwi75XngAD4/CQ/oX4TFe4Qt7uMMbOzjuDc0EmXCP/C7cJ38Iu+RP4QEe8CU8pP8WHmOPX2EPz87TPo202ey2OjlnQSXV/6arOjWFmvszMWtd6CqwOlKHq6ovycLaWMWVydXKFFZnmVFlZU46tP7R2nI5ncbi/dDkfDtFBA2DDXbYkhKc+V0Bqs5Zt9JM1HQGBRTm/EezTmZNKtpcAMs9Yu6AK9caF76zoLWIWcfMGOSkVduvSWechqZsz040Ib2PY3urxBJTzriT95lipz+TN1fmAAAAeJxtkMl2wjAMRfOAhABlKm2h80C3+ajgCKKDY6cegP59TYBzukAL+z1Zsq8ctaJTTKPrsUQLbXQQI0EXKXroY4AbDDHCGBNMcYsZ7nCPB8yxwCOe8IwXvOIN7/jAJ76wxHfUqWX+OzgumWAjJMV17i0Ndlr6irLKO+qftdT7i6y4uFSUvCknay+lFYZIZaQcmfH/xIFdYn98bqhra1aKTM/6lWMnyaYirx1rFUQZFBkb2zJUtoXeJCeg0WnLtHeSFc3OtrnozNwqi0TkSpBMDB1nSde5oJXW23hTS2/T0LilglXX7dmFVxLnq5U0vYATHFk3zX3BOisoQHNDFDeZnqKDy9hRNawN7Vh727hFzcJ5c8TILrKZfH7tIPxAFP0BpLeJPA==) format(\\\"woff\\\");\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-play, .video-js .vjs-play-control .vjs-icon-placeholder, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-play:before, .video-js .vjs-play-control .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F101\\\";\\n}\\n\\n.vjs-icon-play-circle {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-play-circle:before {\\n  content: \\\"\\\\F102\\\";\\n}\\n\\n.vjs-icon-pause, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F103\\\";\\n}\\n\\n.vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F104\\\";\\n}\\n\\n.vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F105\\\";\\n}\\n\\n.vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F106\\\";\\n}\\n\\n.vjs-icon-volume-high, .video-js .vjs-mute-control .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-volume-high:before, .video-js .vjs-mute-control .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F107\\\";\\n}\\n\\n.vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F108\\\";\\n}\\n\\n.vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F109\\\";\\n}\\n\\n.vjs-icon-square {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-square:before {\\n  content: \\\"\\\\F10A\\\";\\n}\\n\\n.vjs-icon-spinner {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-spinner:before {\\n  content: \\\"\\\\F10B\\\";\\n}\\n\\n.vjs-icon-subtitles, .video-js .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-subtitles-button .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-subtitles:before, .video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-subtitles-button .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F10C\\\";\\n}\\n\\n.vjs-icon-captions, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,\\n.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-captions-button .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-captions:before, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,\\n.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-captions-button .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F10D\\\";\\n}\\n\\n.vjs-icon-chapters, .video-js .vjs-chapters-button .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-chapters:before, .video-js .vjs-chapters-button .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F10E\\\";\\n}\\n\\n.vjs-icon-share {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-share:before {\\n  content: \\\"\\\\F10F\\\";\\n}\\n\\n.vjs-icon-cog {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-cog:before {\\n  content: \\\"\\\\F110\\\";\\n}\\n\\n.vjs-icon-circle, .vjs-seek-to-live-control .vjs-icon-placeholder, .video-js .vjs-volume-level, .video-js .vjs-play-progress {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-circle:before, .vjs-seek-to-live-control .vjs-icon-placeholder:before, .video-js .vjs-volume-level:before, .video-js .vjs-play-progress:before {\\n  content: \\\"\\\\F111\\\";\\n}\\n\\n.vjs-icon-circle-outline {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-circle-outline:before {\\n  content: \\\"\\\\F112\\\";\\n}\\n\\n.vjs-icon-circle-inner-circle {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-circle-inner-circle:before {\\n  content: \\\"\\\\F113\\\";\\n}\\n\\n.vjs-icon-hd {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-hd:before {\\n  content: \\\"\\\\F114\\\";\\n}\\n\\n.vjs-icon-cancel, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-cancel:before, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F115\\\";\\n}\\n\\n.vjs-icon-replay, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-replay:before, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F116\\\";\\n}\\n\\n.vjs-icon-facebook {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-facebook:before {\\n  content: \\\"\\\\F117\\\";\\n}\\n\\n.vjs-icon-gplus {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-gplus:before {\\n  content: \\\"\\\\F118\\\";\\n}\\n\\n.vjs-icon-linkedin {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-linkedin:before {\\n  content: \\\"\\\\F119\\\";\\n}\\n\\n.vjs-icon-twitter {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-twitter:before {\\n  content: \\\"\\\\F11A\\\";\\n}\\n\\n.vjs-icon-tumblr {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-tumblr:before {\\n  content: \\\"\\\\F11B\\\";\\n}\\n\\n.vjs-icon-pinterest {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-pinterest:before {\\n  content: \\\"\\\\F11C\\\";\\n}\\n\\n.vjs-icon-audio-description, .video-js .vjs-descriptions-button .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-audio-description:before, .video-js .vjs-descriptions-button .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F11D\\\";\\n}\\n\\n.vjs-icon-audio, .video-js .vjs-audio-button .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-audio:before, .video-js .vjs-audio-button .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F11E\\\";\\n}\\n\\n.vjs-icon-next-item {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-next-item:before {\\n  content: \\\"\\\\F11F\\\";\\n}\\n\\n.vjs-icon-previous-item {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-previous-item:before {\\n  content: \\\"\\\\F120\\\";\\n}\\n\\n.vjs-icon-picture-in-picture-enter, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-picture-in-picture-enter:before, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F121\\\";\\n}\\n\\n.vjs-icon-picture-in-picture-exit, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder {\\n  font-family: VideoJS;\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.vjs-icon-picture-in-picture-exit:before, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before {\\n  content: \\\"\\\\F122\\\";\\n}\\n\\n.video-js {\\n  display: block;\\n  vertical-align: top;\\n  box-sizing: border-box;\\n  color: #fff;\\n  background-color: #000;\\n  position: relative;\\n  padding: 0;\\n  font-size: 10px;\\n  line-height: 1;\\n  font-weight: normal;\\n  font-style: normal;\\n  font-family: Arial, Helvetica, sans-serif;\\n  word-break: initial;\\n}\\n.video-js:-moz-full-screen {\\n  position: absolute;\\n}\\n.video-js:-webkit-full-screen {\\n  width: 100% !important;\\n  height: 100% !important;\\n}\\n\\n.video-js[tabindex=\\\"-1\\\"] {\\n  outline: none;\\n}\\n\\n.video-js *,\\n.video-js *:before,\\n.video-js *:after {\\n  box-sizing: inherit;\\n}\\n\\n.video-js ul {\\n  font-family: inherit;\\n  font-size: inherit;\\n  line-height: inherit;\\n  list-style-position: outside;\\n  margin-left: 0;\\n  margin-right: 0;\\n  margin-top: 0;\\n  margin-bottom: 0;\\n}\\n\\n.video-js.vjs-fluid,\\n.video-js.vjs-16-9,\\n.video-js.vjs-4-3 {\\n  width: 100%;\\n  max-width: 100%;\\n  height: 0;\\n}\\n\\n.video-js.vjs-16-9 {\\n  padding-top: 56.25%;\\n}\\n\\n.video-js.vjs-4-3 {\\n  padding-top: 75%;\\n}\\n\\n.video-js.vjs-fill {\\n  width: 100%;\\n  height: 100%;\\n}\\n\\n.video-js .vjs-tech {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n}\\n\\nbody.vjs-full-window {\\n  padding: 0;\\n  margin: 0;\\n  height: 100%;\\n}\\n\\n.vjs-full-window .video-js.vjs-fullscreen {\\n  position: fixed;\\n  overflow: hidden;\\n  z-index: 1000;\\n  left: 0;\\n  top: 0;\\n  bottom: 0;\\n  right: 0;\\n}\\n\\n.video-js.vjs-fullscreen {\\n  width: 100% !important;\\n  height: 100% !important;\\n  padding-top: 0 !important;\\n}\\n\\n.video-js.vjs-fullscreen.vjs-user-inactive {\\n  cursor: none;\\n}\\n\\n.vjs-hidden {\\n  display: none !important;\\n}\\n\\n.vjs-disabled {\\n  opacity: 0.5;\\n  cursor: default;\\n}\\n\\n.video-js .vjs-offscreen {\\n  height: 1px;\\n  left: -9999px;\\n  position: absolute;\\n  top: 0;\\n  width: 1px;\\n}\\n\\n.vjs-lock-showing {\\n  display: block !important;\\n  opacity: 1;\\n  visibility: visible;\\n}\\n\\n.vjs-no-js {\\n  padding: 20px;\\n  color: #fff;\\n  background-color: #000;\\n  font-size: 18px;\\n  font-family: Arial, Helvetica, sans-serif;\\n  text-align: center;\\n  width: 300px;\\n  height: 150px;\\n  margin: 0px auto;\\n}\\n\\n.vjs-no-js a,\\n.vjs-no-js a:visited {\\n  color: #66A8CC;\\n}\\n\\n.video-js .vjs-big-play-button {\\n  font-size: 3em;\\n  line-height: 1.5em;\\n  height: 1.63332em;\\n  width: 3em;\\n  display: block;\\n  position: absolute;\\n  top: 10px;\\n  left: 10px;\\n  padding: 0;\\n  cursor: pointer;\\n  opacity: 1;\\n  border: 0.06666em solid #fff;\\n  background-color: #2B333F;\\n  background-color: rgba(43, 51, 63, 0.7);\\n  border-radius: 0.3em;\\n  transition: all 0.4s;\\n}\\n.vjs-big-play-centered .vjs-big-play-button {\\n  top: 50%;\\n  left: 50%;\\n  margin-top: -0.81666em;\\n  margin-left: -1.5em;\\n}\\n\\n.video-js:hover .vjs-big-play-button,\\n.video-js .vjs-big-play-button:focus {\\n  border-color: #fff;\\n  background-color: #73859f;\\n  background-color: rgba(115, 133, 159, 0.5);\\n  transition: all 0s;\\n}\\n\\n.vjs-controls-disabled .vjs-big-play-button,\\n.vjs-has-started .vjs-big-play-button,\\n.vjs-using-native-controls .vjs-big-play-button,\\n.vjs-error .vjs-big-play-button {\\n  display: none;\\n}\\n\\n.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause .vjs-big-play-button {\\n  display: block;\\n}\\n\\n.video-js button {\\n  background: none;\\n  border: none;\\n  color: inherit;\\n  display: inline-block;\\n  font-size: inherit;\\n  line-height: inherit;\\n  text-transform: none;\\n  text-decoration: none;\\n  transition: none;\\n  -webkit-appearance: none;\\n  -moz-appearance: none;\\n  appearance: none;\\n}\\n\\n.vjs-control .vjs-button {\\n  width: 100%;\\n  height: 100%;\\n}\\n\\n.video-js .vjs-control.vjs-close-button {\\n  cursor: pointer;\\n  height: 3em;\\n  position: absolute;\\n  right: 0;\\n  top: 0.5em;\\n  z-index: 2;\\n}\\n.video-js .vjs-modal-dialog {\\n  background: rgba(0, 0, 0, 0.8);\\n  background: linear-gradient(180deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0));\\n  overflow: auto;\\n}\\n\\n.video-js .vjs-modal-dialog > * {\\n  box-sizing: border-box;\\n}\\n\\n.vjs-modal-dialog .vjs-modal-dialog-content {\\n  font-size: 1.2em;\\n  line-height: 1.5;\\n  padding: 20px 24px;\\n  z-index: 1;\\n}\\n\\n.vjs-menu-button {\\n  cursor: pointer;\\n}\\n\\n.vjs-menu-button.vjs-disabled {\\n  cursor: default;\\n}\\n\\n.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu {\\n  display: none;\\n}\\n\\n.vjs-menu .vjs-menu-content {\\n  display: block;\\n  padding: 0;\\n  margin: 0;\\n  font-family: Arial, Helvetica, sans-serif;\\n  overflow: auto;\\n}\\n\\n.vjs-menu .vjs-menu-content > * {\\n  box-sizing: border-box;\\n}\\n\\n.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu {\\n  display: none;\\n}\\n\\n.vjs-menu li {\\n  list-style: none;\\n  margin: 0;\\n  padding: 0.2em 0;\\n  line-height: 1.4em;\\n  font-size: 1.2em;\\n  text-align: center;\\n  text-transform: lowercase;\\n}\\n\\n.vjs-menu li.vjs-menu-item:focus,\\n.vjs-menu li.vjs-menu-item:hover,\\n.js-focus-visible .vjs-menu li.vjs-menu-item:hover {\\n  background-color: #73859f;\\n  background-color: rgba(115, 133, 159, 0.5);\\n}\\n\\n.vjs-menu li.vjs-selected,\\n.vjs-menu li.vjs-selected:focus,\\n.vjs-menu li.vjs-selected:hover,\\n.js-focus-visible .vjs-menu li.vjs-selected:hover {\\n  background-color: #fff;\\n  color: #2B333F;\\n}\\n\\n.vjs-menu li.vjs-menu-title {\\n  text-align: center;\\n  text-transform: uppercase;\\n  font-size: 1em;\\n  line-height: 2em;\\n  padding: 0;\\n  margin: 0 0 0.3em 0;\\n  font-weight: bold;\\n  cursor: default;\\n}\\n\\n.vjs-menu-button-popup .vjs-menu {\\n  display: none;\\n  position: absolute;\\n  bottom: 0;\\n  width: 10em;\\n  left: -3em;\\n  height: 0em;\\n  margin-bottom: 1.5em;\\n  border-top-color: rgba(43, 51, 63, 0.7);\\n}\\n\\n.vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n  background-color: #2B333F;\\n  background-color: rgba(43, 51, 63, 0.7);\\n  position: absolute;\\n  width: 100%;\\n  bottom: 1.5em;\\n  max-height: 15em;\\n}\\n\\n.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content,\\n.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n  max-height: 5em;\\n}\\n\\n.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n  max-height: 10em;\\n}\\n\\n.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n  max-height: 14em;\\n}\\n\\n.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,\\n.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,\\n.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\\n  max-height: 25em;\\n}\\n\\n.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu,\\n.vjs-menu-button-popup .vjs-menu.vjs-lock-showing {\\n  display: block;\\n}\\n\\n.video-js .vjs-menu-button-inline {\\n  transition: all 0.4s;\\n  overflow: hidden;\\n}\\n\\n.video-js .vjs-menu-button-inline:before {\\n  width: 2.222222222em;\\n}\\n\\n.video-js .vjs-menu-button-inline:hover,\\n.video-js .vjs-menu-button-inline:focus,\\n.video-js .vjs-menu-button-inline.vjs-slider-active,\\n.video-js.vjs-no-flex .vjs-menu-button-inline {\\n  width: 12em;\\n}\\n\\n.vjs-menu-button-inline .vjs-menu {\\n  opacity: 0;\\n  height: 100%;\\n  width: auto;\\n  position: absolute;\\n  left: 4em;\\n  top: 0;\\n  padding: 0;\\n  margin: 0;\\n  transition: all 0.4s;\\n}\\n\\n.vjs-menu-button-inline:hover .vjs-menu,\\n.vjs-menu-button-inline:focus .vjs-menu,\\n.vjs-menu-button-inline.vjs-slider-active .vjs-menu {\\n  display: block;\\n  opacity: 1;\\n}\\n\\n.vjs-no-flex .vjs-menu-button-inline .vjs-menu {\\n  display: block;\\n  opacity: 1;\\n  position: relative;\\n  width: auto;\\n}\\n\\n.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu,\\n.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,\\n.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu {\\n  width: auto;\\n}\\n\\n.vjs-menu-button-inline .vjs-menu-content {\\n  width: auto;\\n  height: 100%;\\n  margin: 0;\\n  overflow: hidden;\\n}\\n\\n.video-js .vjs-control-bar {\\n  display: none;\\n  width: 100%;\\n  position: absolute;\\n  bottom: 0;\\n  left: 0;\\n  right: 0;\\n  height: 3em;\\n  background-color: #2B333F;\\n  background-color: rgba(43, 51, 63, 0.7);\\n}\\n\\n.vjs-has-started .vjs-control-bar {\\n  display: flex;\\n  visibility: visible;\\n  opacity: 1;\\n  transition: visibility 0.1s, opacity 0.1s;\\n}\\n\\n.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\\n  visibility: visible;\\n  opacity: 0;\\n  transition: visibility 1s, opacity 1s;\\n}\\n\\n.vjs-controls-disabled .vjs-control-bar,\\n.vjs-using-native-controls .vjs-control-bar,\\n.vjs-error .vjs-control-bar {\\n  display: none !important;\\n}\\n\\n.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\\n  opacity: 1;\\n  visibility: visible;\\n}\\n\\n.vjs-has-started.vjs-no-flex .vjs-control-bar {\\n  display: table;\\n}\\n\\n.video-js .vjs-control {\\n  position: relative;\\n  text-align: center;\\n  margin: 0;\\n  padding: 0;\\n  height: 100%;\\n  width: 4em;\\n  flex: none;\\n}\\n\\n.vjs-button > .vjs-icon-placeholder:before {\\n  font-size: 1.8em;\\n  line-height: 1.67;\\n}\\n\\n.video-js .vjs-control:focus:before,\\n.video-js .vjs-control:hover:before,\\n.video-js .vjs-control:focus {\\n  text-shadow: 0em 0em 1em white;\\n}\\n\\n.video-js .vjs-control-text {\\n  border: 0;\\n  clip: rect(0 0 0 0);\\n  height: 1px;\\n  overflow: hidden;\\n  padding: 0;\\n  position: absolute;\\n  width: 1px;\\n}\\n\\n.vjs-no-flex .vjs-control {\\n  display: table-cell;\\n  vertical-align: middle;\\n}\\n\\n.video-js .vjs-custom-control-spacer {\\n  display: none;\\n}\\n\\n.video-js .vjs-progress-control {\\n  cursor: pointer;\\n  flex: auto;\\n  display: flex;\\n  align-items: center;\\n  min-width: 4em;\\n  touch-action: none;\\n}\\n\\n.video-js .vjs-progress-control.disabled {\\n  cursor: default;\\n}\\n\\n.vjs-live .vjs-progress-control {\\n  display: none;\\n}\\n\\n.vjs-liveui .vjs-progress-control {\\n  display: flex;\\n  align-items: center;\\n}\\n\\n.vjs-no-flex .vjs-progress-control {\\n  width: auto;\\n}\\n\\n.video-js .vjs-progress-holder {\\n  flex: auto;\\n  transition: all 0.2s;\\n  height: 0.3em;\\n}\\n\\n.video-js .vjs-progress-control .vjs-progress-holder {\\n  margin: 0 10px;\\n}\\n\\n.video-js .vjs-progress-control:hover .vjs-progress-holder {\\n  font-size: 1.6666666667em;\\n}\\n\\n.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled {\\n  font-size: 1em;\\n}\\n\\n.video-js .vjs-progress-holder .vjs-play-progress,\\n.video-js .vjs-progress-holder .vjs-load-progress,\\n.video-js .vjs-progress-holder .vjs-load-progress div {\\n  position: absolute;\\n  display: block;\\n  height: 100%;\\n  margin: 0;\\n  padding: 0;\\n  width: 0;\\n}\\n\\n.video-js .vjs-play-progress {\\n  background-color: #fff;\\n}\\n.video-js .vjs-play-progress:before {\\n  font-size: 0.9em;\\n  position: absolute;\\n  right: -0.5em;\\n  top: -0.3333333333em;\\n  z-index: 1;\\n}\\n\\n.video-js .vjs-load-progress {\\n  background: rgba(115, 133, 159, 0.5);\\n}\\n\\n.video-js .vjs-load-progress div {\\n  background: rgba(115, 133, 159, 0.75);\\n}\\n\\n.video-js .vjs-time-tooltip {\\n  background-color: #fff;\\n  background-color: rgba(255, 255, 255, 0.8);\\n  border-radius: 0.3em;\\n  color: #000;\\n  float: right;\\n  font-family: Arial, Helvetica, sans-serif;\\n  font-size: 1em;\\n  padding: 6px 8px 8px 8px;\\n  pointer-events: none;\\n  position: absolute;\\n  top: -3.4em;\\n  visibility: hidden;\\n  z-index: 1;\\n}\\n\\n.video-js .vjs-progress-holder:focus .vjs-time-tooltip {\\n  display: none;\\n}\\n\\n.video-js .vjs-progress-control:hover .vjs-time-tooltip,\\n.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip {\\n  display: block;\\n  font-size: 0.6em;\\n  visibility: visible;\\n}\\n\\n.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip {\\n  font-size: 1em;\\n}\\n\\n.video-js .vjs-progress-control .vjs-mouse-display {\\n  display: none;\\n  position: absolute;\\n  width: 1px;\\n  height: 100%;\\n  background-color: #000;\\n  z-index: 1;\\n}\\n\\n.vjs-no-flex .vjs-progress-control .vjs-mouse-display {\\n  z-index: 0;\\n}\\n\\n.video-js .vjs-progress-control:hover .vjs-mouse-display {\\n  display: block;\\n}\\n\\n.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display {\\n  visibility: hidden;\\n  opacity: 0;\\n  transition: visibility 1s, opacity 1s;\\n}\\n\\n.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display {\\n  display: none;\\n}\\n\\n.vjs-mouse-display .vjs-time-tooltip {\\n  color: #fff;\\n  background-color: #000;\\n  background-color: rgba(0, 0, 0, 0.8);\\n}\\n\\n.video-js .vjs-slider {\\n  position: relative;\\n  cursor: pointer;\\n  padding: 0;\\n  margin: 0 0.45em 0 0.45em;\\n  /* iOS Safari */\\n  -webkit-touch-callout: none;\\n  /* Safari */\\n  -webkit-user-select: none;\\n  /* Konqueror HTML */\\n  /* Firefox */\\n  -moz-user-select: none;\\n  /* Internet Explorer/Edge */\\n  -ms-user-select: none;\\n  /* Non-prefixed version, currently supported by Chrome and Opera */\\n  user-select: none;\\n  background-color: #73859f;\\n  background-color: rgba(115, 133, 159, 0.5);\\n}\\n\\n.video-js .vjs-slider.disabled {\\n  cursor: default;\\n}\\n\\n.video-js .vjs-slider:focus {\\n  text-shadow: 0em 0em 1em white;\\n  box-shadow: 0 0 1em #fff;\\n}\\n\\n.video-js .vjs-mute-control {\\n  cursor: pointer;\\n  flex: none;\\n}\\n.video-js .vjs-volume-control {\\n  cursor: pointer;\\n  margin-right: 1em;\\n  display: flex;\\n}\\n\\n.video-js .vjs-volume-control.vjs-volume-horizontal {\\n  width: 5em;\\n}\\n\\n.video-js .vjs-volume-panel .vjs-volume-control {\\n  visibility: visible;\\n  opacity: 0;\\n  width: 1px;\\n  height: 1px;\\n  margin-left: -1px;\\n}\\n\\n.video-js .vjs-volume-panel {\\n  transition: width 1s;\\n}\\n.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control, .video-js .vjs-volume-panel:active .vjs-volume-control, .video-js .vjs-volume-panel:focus .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control:active, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active {\\n  visibility: visible;\\n  opacity: 1;\\n  position: relative;\\n  transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s;\\n}\\n.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal {\\n  width: 5em;\\n  height: 3em;\\n  margin-right: 0;\\n}\\n.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical {\\n  left: -3.5em;\\n  transition: left 0s;\\n}\\n.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active {\\n  width: 10em;\\n  transition: width 0.1s;\\n}\\n.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only {\\n  width: 4em;\\n}\\n\\n.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {\\n  height: 8em;\\n  width: 3em;\\n  left: -3000em;\\n  transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s;\\n}\\n\\n.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal {\\n  transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s;\\n}\\n\\n.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal {\\n  width: 5em;\\n  height: 3em;\\n  visibility: visible;\\n  opacity: 1;\\n  position: relative;\\n  transition: none;\\n}\\n\\n.video-js.vjs-no-flex .vjs-volume-control.vjs-volume-vertical,\\n.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {\\n  position: absolute;\\n  bottom: 3em;\\n  left: 0.5em;\\n}\\n\\n.video-js .vjs-volume-panel {\\n  display: flex;\\n}\\n\\n.video-js .vjs-volume-bar {\\n  margin: 1.35em 0.45em;\\n}\\n\\n.vjs-volume-bar.vjs-slider-horizontal {\\n  width: 5em;\\n  height: 0.3em;\\n}\\n\\n.vjs-volume-bar.vjs-slider-vertical {\\n  width: 0.3em;\\n  height: 5em;\\n  margin: 1.35em auto;\\n}\\n\\n.video-js .vjs-volume-level {\\n  position: absolute;\\n  bottom: 0;\\n  left: 0;\\n  background-color: #fff;\\n}\\n.video-js .vjs-volume-level:before {\\n  position: absolute;\\n  font-size: 0.9em;\\n}\\n\\n.vjs-slider-vertical .vjs-volume-level {\\n  width: 0.3em;\\n}\\n.vjs-slider-vertical .vjs-volume-level:before {\\n  top: -0.5em;\\n  left: -0.3em;\\n}\\n\\n.vjs-slider-horizontal .vjs-volume-level {\\n  height: 0.3em;\\n}\\n.vjs-slider-horizontal .vjs-volume-level:before {\\n  top: -0.3em;\\n  right: -0.5em;\\n}\\n\\n.video-js .vjs-volume-panel.vjs-volume-panel-vertical {\\n  width: 4em;\\n}\\n\\n.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level {\\n  height: 100%;\\n}\\n\\n.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {\\n  width: 100%;\\n}\\n\\n.video-js .vjs-volume-vertical {\\n  width: 3em;\\n  height: 8em;\\n  bottom: 8em;\\n  background-color: #2B333F;\\n  background-color: rgba(43, 51, 63, 0.7);\\n}\\n\\n.video-js .vjs-volume-horizontal .vjs-menu {\\n  left: -2em;\\n}\\n\\n.vjs-poster {\\n  display: inline-block;\\n  vertical-align: middle;\\n  background-repeat: no-repeat;\\n  background-position: 50% 50%;\\n  background-size: contain;\\n  background-color: #000000;\\n  cursor: pointer;\\n  margin: 0;\\n  padding: 0;\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  height: 100%;\\n}\\n\\n.vjs-has-started .vjs-poster {\\n  display: none;\\n}\\n\\n.vjs-audio.vjs-has-started .vjs-poster {\\n  display: block;\\n}\\n\\n.vjs-using-native-controls .vjs-poster {\\n  display: none;\\n}\\n\\n.video-js .vjs-live-control {\\n  display: flex;\\n  align-items: flex-start;\\n  flex: auto;\\n  font-size: 1em;\\n  line-height: 3em;\\n}\\n\\n.vjs-no-flex .vjs-live-control {\\n  display: table-cell;\\n  width: auto;\\n  text-align: left;\\n}\\n\\n.video-js:not(.vjs-live) .vjs-live-control,\\n.video-js.vjs-liveui .vjs-live-control {\\n  display: none;\\n}\\n\\n.video-js .vjs-seek-to-live-control {\\n  cursor: pointer;\\n  flex: none;\\n  display: inline-flex;\\n  height: 100%;\\n  padding-left: 0.5em;\\n  padding-right: 0.5em;\\n  font-size: 1em;\\n  line-height: 3em;\\n  width: auto;\\n  min-width: 4em;\\n}\\n\\n.vjs-no-flex .vjs-seek-to-live-control {\\n  display: table-cell;\\n  width: auto;\\n  text-align: left;\\n}\\n\\n.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control,\\n.video-js:not(.vjs-live) .vjs-seek-to-live-control {\\n  display: none;\\n}\\n\\n.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge {\\n  cursor: auto;\\n}\\n\\n.vjs-seek-to-live-control .vjs-icon-placeholder {\\n  margin-right: 0.5em;\\n  color: #888;\\n}\\n\\n.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder {\\n  color: red;\\n}\\n\\n.video-js .vjs-time-control {\\n  flex: none;\\n  font-size: 1em;\\n  line-height: 3em;\\n  min-width: 2em;\\n  width: auto;\\n  padding-left: 1em;\\n  padding-right: 1em;\\n}\\n\\n.vjs-live .vjs-time-control {\\n  display: none;\\n}\\n\\n.video-js .vjs-current-time,\\n.vjs-no-flex .vjs-current-time {\\n  display: none;\\n}\\n\\n.video-js .vjs-duration,\\n.vjs-no-flex .vjs-duration {\\n  display: none;\\n}\\n\\n.vjs-time-divider {\\n  display: none;\\n  line-height: 3em;\\n}\\n\\n.vjs-live .vjs-time-divider {\\n  display: none;\\n}\\n\\n.video-js .vjs-play-control {\\n  cursor: pointer;\\n}\\n\\n.video-js .vjs-play-control .vjs-icon-placeholder {\\n  flex: none;\\n}\\n\\n.vjs-text-track-display {\\n  position: absolute;\\n  bottom: 3em;\\n  left: 0;\\n  right: 0;\\n  top: 0;\\n  pointer-events: none;\\n}\\n\\n.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display {\\n  bottom: 1em;\\n}\\n\\n.video-js .vjs-text-track {\\n  font-size: 1.4em;\\n  text-align: center;\\n  margin-bottom: 0.1em;\\n}\\n\\n.vjs-subtitles {\\n  color: #fff;\\n}\\n\\n.vjs-captions {\\n  color: #fc6;\\n}\\n\\n.vjs-tt-cue {\\n  display: block;\\n}\\n\\nvideo::-webkit-media-text-track-display {\\n  transform: translateY(-3em);\\n}\\n\\n.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display {\\n  transform: translateY(-1.5em);\\n}\\n\\n.video-js .vjs-picture-in-picture-control {\\n  cursor: pointer;\\n  flex: none;\\n}\\n.video-js .vjs-fullscreen-control {\\n  cursor: pointer;\\n  flex: none;\\n}\\n.vjs-playback-rate > .vjs-menu-button,\\n.vjs-playback-rate .vjs-playback-rate-value {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n}\\n\\n.vjs-playback-rate .vjs-playback-rate-value {\\n  pointer-events: none;\\n  font-size: 1.5em;\\n  line-height: 2;\\n  text-align: center;\\n}\\n\\n.vjs-playback-rate .vjs-menu {\\n  width: 4em;\\n  left: 0em;\\n}\\n\\n.vjs-error .vjs-error-display .vjs-modal-dialog-content {\\n  font-size: 1.4em;\\n  text-align: center;\\n}\\n\\n.vjs-error .vjs-error-display:before {\\n  color: #fff;\\n  content: \\\"X\\\";\\n  font-family: Arial, Helvetica, sans-serif;\\n  font-size: 4em;\\n  left: 0;\\n  line-height: 1;\\n  margin-top: -0.5em;\\n  position: absolute;\\n  text-shadow: 0.05em 0.05em 0.1em #000;\\n  text-align: center;\\n  top: 50%;\\n  vertical-align: middle;\\n  width: 100%;\\n}\\n\\n.vjs-loading-spinner {\\n  display: none;\\n  position: absolute;\\n  top: 50%;\\n  left: 50%;\\n  margin: -25px 0 0 -25px;\\n  opacity: 0.85;\\n  text-align: left;\\n  border: 6px solid rgba(43, 51, 63, 0.7);\\n  box-sizing: border-box;\\n  background-clip: padding-box;\\n  width: 50px;\\n  height: 50px;\\n  border-radius: 25px;\\n  visibility: hidden;\\n}\\n\\n.vjs-seeking .vjs-loading-spinner,\\n.vjs-waiting .vjs-loading-spinner {\\n  display: block;\\n  -webkit-animation: vjs-spinner-show 0s linear 0.3s forwards;\\n          animation: vjs-spinner-show 0s linear 0.3s forwards;\\n}\\n\\n.vjs-loading-spinner:before,\\n.vjs-loading-spinner:after {\\n  content: \\\"\\\";\\n  position: absolute;\\n  margin: -6px;\\n  box-sizing: inherit;\\n  width: inherit;\\n  height: inherit;\\n  border-radius: inherit;\\n  opacity: 1;\\n  border: inherit;\\n  border-color: transparent;\\n  border-top-color: white;\\n}\\n\\n.vjs-seeking .vjs-loading-spinner:before,\\n.vjs-seeking .vjs-loading-spinner:after,\\n.vjs-waiting .vjs-loading-spinner:before,\\n.vjs-waiting .vjs-loading-spinner:after {\\n  -webkit-animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;\\n  animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;\\n}\\n\\n.vjs-seeking .vjs-loading-spinner:before,\\n.vjs-waiting .vjs-loading-spinner:before {\\n  border-top-color: white;\\n}\\n\\n.vjs-seeking .vjs-loading-spinner:after,\\n.vjs-waiting .vjs-loading-spinner:after {\\n  border-top-color: white;\\n  -webkit-animation-delay: 0.44s;\\n  animation-delay: 0.44s;\\n}\\n\\n@keyframes vjs-spinner-show {\\n  to {\\n    visibility: visible;\\n  }\\n}\\n@-webkit-keyframes vjs-spinner-show {\\n  to {\\n    visibility: visible;\\n  }\\n}\\n@keyframes vjs-spinner-spin {\\n  100% {\\n    transform: rotate(360deg);\\n  }\\n}\\n@-webkit-keyframes vjs-spinner-spin {\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n  }\\n}\\n@keyframes vjs-spinner-fade {\\n  0% {\\n    border-top-color: #73859f;\\n  }\\n  20% {\\n    border-top-color: #73859f;\\n  }\\n  35% {\\n    border-top-color: white;\\n  }\\n  60% {\\n    border-top-color: #73859f;\\n  }\\n  100% {\\n    border-top-color: #73859f;\\n  }\\n}\\n@-webkit-keyframes vjs-spinner-fade {\\n  0% {\\n    border-top-color: #73859f;\\n  }\\n  20% {\\n    border-top-color: #73859f;\\n  }\\n  35% {\\n    border-top-color: white;\\n  }\\n  60% {\\n    border-top-color: #73859f;\\n  }\\n  100% {\\n    border-top-color: #73859f;\\n  }\\n}\\n.vjs-chapters-button .vjs-menu ul {\\n  width: 24em;\\n}\\n\\n.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder {\\n  vertical-align: middle;\\n  display: inline-block;\\n  margin-bottom: -0.1em;\\n}\\n\\n.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before {\\n  font-family: VideoJS;\\n  content: \\\"\\\\F10D\\\";\\n  font-size: 1.5em;\\n  line-height: inherit;\\n}\\n\\n.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder {\\n  vertical-align: middle;\\n  display: inline-block;\\n  margin-bottom: -0.1em;\\n}\\n\\n.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before {\\n  font-family: VideoJS;\\n  content: \\\" \\\\F11D\\\";\\n  font-size: 1.5em;\\n  line-height: inherit;\\n}\\n\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-current-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-time-divider,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-duration,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-remaining-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-playback-rate,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-chapters-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-descriptions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-captions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-subtitles-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-audio-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-control, .video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-current-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-time-divider,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-duration,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-remaining-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-playback-rate,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-chapters-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-descriptions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-captions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-subtitles-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-audio-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-control, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-current-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-time-divider,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-duration,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-remaining-time,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-playback-rate,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-chapters-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-descriptions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-captions-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-subtitles-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-audio-button,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-control {\\n  display: none;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,\\n.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active,\\n.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active {\\n  width: auto;\\n  width: initial;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small:not(.vjs-liveui) .vjs-subs-caps-button, .video-js:not(.vjs-fullscreen).vjs-layout-x-small:not(.vjs-live) .vjs-subs-caps-button, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-subs-caps-button {\\n  display: none;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small.vjs-liveui .vjs-custom-control-spacer, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-custom-control-spacer {\\n  flex: auto;\\n  display: block;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small.vjs-liveui.vjs-no-flex .vjs-custom-control-spacer, .video-js:not(.vjs-fullscreen).vjs-layout-tiny.vjs-no-flex .vjs-custom-control-spacer {\\n  width: auto;\\n}\\n.video-js:not(.vjs-fullscreen).vjs-layout-x-small.vjs-liveui .vjs-progress-control, .video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-progress-control {\\n  display: none;\\n}\\n\\n.vjs-modal-dialog.vjs-text-track-settings {\\n  background-color: #2B333F;\\n  background-color: rgba(43, 51, 63, 0.75);\\n  color: #fff;\\n  height: 70%;\\n}\\n\\n.vjs-text-track-settings .vjs-modal-dialog-content {\\n  display: table;\\n}\\n\\n.vjs-text-track-settings .vjs-track-settings-colors,\\n.vjs-text-track-settings .vjs-track-settings-font,\\n.vjs-text-track-settings .vjs-track-settings-controls {\\n  display: table-cell;\\n}\\n\\n.vjs-text-track-settings .vjs-track-settings-controls {\\n  text-align: right;\\n  vertical-align: bottom;\\n}\\n\\n@supports (display: grid) {\\n  .vjs-text-track-settings .vjs-modal-dialog-content {\\n    display: grid;\\n    grid-template-columns: 1fr 1fr;\\n    grid-template-rows: 1fr;\\n    padding: 20px 24px 0px 24px;\\n  }\\n\\n  .vjs-track-settings-controls .vjs-default-button {\\n    margin-bottom: 20px;\\n  }\\n\\n  .vjs-text-track-settings .vjs-track-settings-controls {\\n    grid-column: 1/-1;\\n  }\\n\\n  .vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content,\\n.vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content,\\n.vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content {\\n    grid-template-columns: 1fr;\\n  }\\n}\\n.vjs-track-setting > select {\\n  margin-right: 1em;\\n  margin-bottom: 0.5em;\\n}\\n\\n.vjs-text-track-settings fieldset {\\n  margin: 5px;\\n  padding: 3px;\\n  border: none;\\n}\\n\\n.vjs-text-track-settings fieldset span {\\n  display: inline-block;\\n}\\n\\n.vjs-text-track-settings fieldset span > select {\\n  max-width: 7.3em;\\n}\\n\\n.vjs-text-track-settings legend {\\n  color: #fff;\\n  margin: 0 0 5px 0;\\n}\\n\\n.vjs-text-track-settings .vjs-label {\\n  position: absolute;\\n  clip: rect(1px 1px 1px 1px);\\n  clip: rect(1px, 1px, 1px, 1px);\\n  display: block;\\n  margin: 0 0 5px 0;\\n  padding: 0;\\n  border: 0;\\n  height: 1px;\\n  width: 1px;\\n  overflow: hidden;\\n}\\n\\n.vjs-track-settings-controls button:focus,\\n.vjs-track-settings-controls button:active {\\n  outline-style: solid;\\n  outline-width: medium;\\n  background-image: linear-gradient(0deg, #fff 88%, #73859f 100%);\\n}\\n\\n.vjs-track-settings-controls button:hover {\\n  color: rgba(43, 51, 63, 0.75);\\n}\\n\\n.vjs-track-settings-controls button {\\n  background-color: #fff;\\n  background-image: linear-gradient(-180deg, #fff 88%, #73859f 100%);\\n  color: #2B333F;\\n  cursor: pointer;\\n  border-radius: 2px;\\n}\\n\\n.vjs-track-settings-controls .vjs-default-button {\\n  margin-right: 1em;\\n}\\n\\n@media print {\\n  .video-js > *:not(.vjs-tech):not(.vjs-poster) {\\n    visibility: hidden;\\n  }\\n}\\n.vjs-resize-manager {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  border: none;\\n  z-index: -1000;\\n}\\n\\n.js-focus-visible .video-js *:focus:not(.focus-visible) {\\n  outline: none;\\n  background: none;\\n}\\n\\n.video-js *:focus:not(:focus-visible),\\n.video-js .vjs-menu *:focus:not(:focus-visible) {\\n  outline: none;\\n  background: none;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3ZpZGVvLmpzQDcuNi42QHZpZGVvLmpzL2Rpc3QvdmlkZW8tanMuY3NzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlby5qc0A3LjYuNkB2aWRlby5qcy9kaXN0L3ZpZGVvLWpzLmNzcz9kZTg4Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi52anMtbW9kYWwtZGlhbG9nIC52anMtbW9kYWwtZGlhbG9nLWNvbnRlbnQsIC52aWRlby1qcyAudmpzLW1vZGFsLWRpYWxvZywgLnZqcy1idXR0b24gPiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcblxcbi52anMtYnV0dG9uID4gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtYmlnLXBsYXktYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R1JnQUJBQUFBQUJEa0FBc0FBQUFBRzZnQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJIVTFWQ0FBQUJDQUFBQURzQUFBQlVJSXNsZWs5VEx6SUFBQUZFQUFBQVBnQUFBRlpSaVYzaFkyMWhjQUFBQVlRQUFBRGFBQUFEUHY3NDkvcG5iSGxtQUFBQ1lBQUFDM0FBQUJIUVpnNk9jV2hsWVdRQUFBM1FBQUFBS3dBQUFEWVp3MjUxYUdobFlRQUFEZndBQUFBZEFBQUFKQStSQ0xGb2JYUjRBQUFPSEFBQUFCTUFBQUNNNzQ0QUFHeHZZMkVBQUE0d0FBQUFTQUFBQUVoRjZrcXViV0Y0Y0FBQURuZ0FBQUFmQUFBQUlBRTBBSUZ1WVcxbEFBQU9tQUFBQVNVQUFBSUsxY2Yxb0hCdmMzUUFBQS9BQUFBQkpBQUFBZFBFeFl1TmVKeGpZR1JnWU9CaU1HQ3dZMkJ5Y2ZNSlllRExTU3pKWTVCaVlHR0FBSkE4TXBzeEp6TTlrWUVEeGdQS3NZQnBEaUJtZzRnQ0FDWTdCVWdBZUp4allHUzd3VGlCZ1pXQmdhV1E1UmtEQThNdkNNMGN3eERPZUk2QmdZbUJsWmtCS3doSWMwMWhjUGpJK0ZHSkhjUmR5QTRSWmdRUkFESzNDeEVBQUhpYzdkRlpic01nQUVYUlMweWN5Wm5uT2VHN3krcUM4cFUxZEh1c0lPWHh1b3hhT2x3WllXUUIwQWVhNHF1SUVONEU5THpLYktqekRlTTZIL211YTZMbWMvcDh5aGcwbHZkWXgxNVpHOHVPTFFPR2pNcDNFenFtekppellNbUtOUnUyN05oejRNaUpNeGV1M0xqejRFa3FtN1Q4UDUyRzhQUDNsblRPVmsrK1o2aU42UVp6Tk4xRjdwdHVON2VHT2pEVW9hR09ESFZzdXZVOE1kVE85SGQ1YXFnelE1MGI2c0pRbDRhNk10UzFvVzRNZFd1b08wUGRHK3JCVUkrR2VqTFVzNkZlRFBWcXFEZER2UnZxdzFDZmhwcU05QXQwaUZMYUFBQjRuSjFZRFhCVFZSWis1LzIyVFVsSjh3ZTBwSGxKbTdSSmY1TzhGMmo2RXltbFNQa3B4YUw4VTJ4cGEzREtqMENCaGMySVc0ZVdLU29rSW9Mc3VNcXNzTTY0ZitqQTRIU2RXWFhYc2NCcTY3SU9zM0ZYWjFaWVdWeVJGZG84OTl5WHRJQlFaOTBrNzcxN3p6M3YzSFBQT2ZkODU0WUNDajljTDlkTDBSUUZPcUNiR0puckhiNUVheWlLSVdOOGlBL2hXQmJsbzZoVVdtOFR0Q0R3RTgwV01KdXMvaXJ3eXhPZHhlQjBNRGIxNFZOSkhuWFlvTExTbDZGZkNVWU85bllQVEE4RXBnOTA5MExwcmZiQmJaMmhZMFVsSlVYSFFwMy92dFdrUzZFQnY4K3JQTXE1dTk2OTJmL2ROeEpOaXF3QzF4UEU5VENVZ0NzU2RRV2dFM1hRRDI1bGtHNENOMnhtVGNPWFdCT3lzZXI2Uk42S25HYktTYm1RMytkME9JMW0yVzhRekxMa0kyc3lrcldBZ0pKRXRBOHZHR1cvMlErQ21UM244elM5d1p3dTJEQ3Z0dVpLWk4zeGtyTGgzNnlDWnVVb21RU3FHcFk4dC8yNVZmSFZodzh6NGViR0J0ZkxiMHlhOVBDYURjKzhkR1R2azJkc2g2ejdXenZvd2xYS1VTV285TUoxNWEzS3JFUDJsb09yMk9qaHc2aVc2aGYyQkRkRWNjUXZaR3BhQXk3WW92U3dxOGtyN0hHbGx4cGQ3MXJrUzZHMFNmMTFzbDlPdk1LMStqd1BQT0R4alV3a09pbTlDVTNpeDF3TmpYRGZtSlNFbjYxOEJzNmxwV3dVcFUrOFBDcUxNWTY1MHpqcThWaENJUDE3TkVLVHgzZWFMTCtzNVBpNnlKV2FXalRITFIxall6UFNWOVZGLzZPamRiLzFrTzNNazN1aEhDMHg2Z2MxQmpsS1ErblFGeFRZZGFKa1o3eVNWeExCYmhSMWRzYm9OWHAxdENZS1cyTFJhRXpwWWNJeDJCS054YUwwWmFVblNxZkZvaU5oSEtSL0drWDZQV1VTQWFKZWxRYXFaTDFFcG9ITnNhalNFeVBTb0o5SWpoSXhUZGpITG13WnZoUkRPaUZUWS9ZZVFudnJWWm1pVFF0R25jRUNYdEZUQlpMT1Z3d01SZ29YSEFrWHpNelBuMW5BSko4allTYk1EYXFOMndhR0x6TmhpaC9iWnluVUJNcElXU2c3VllpN0RSeDJtOEFMa0lkUkNKd0k2QXJKeDJFSThrYURXZVRRS2VBRms5ZmpsLzFBdndrdGpRMVA3Tmp5TUdReWZkNHZqaXBYNk0vaTUyRDdDcTgwa3FsY3hFY0dYUnIvRkVjZ3MwdTV1R2dCNFZXdU1GZnBkbjJSZTZIaTNQcXpteFdLc3o2K2FlMlBuOWhYWHcvZnFNODU5VWlHQzBvS1lZSUxKQnFKcnNuMVoxRTVxT3M5clFDaVVRUlJFam04eUpjYkhGNWNVSnVmWDF2QUhsZWZ3MFhnVW9ib1MzRVRmUWxUeEJDNFNPdHVFOFZQUkpUQlNDUVNqWkNwazdHcXp1K21hc2FaMnk3WmplaGhvNEYzZzgyQk5Ea0FIcE9SRzQrT0NTK2Y2SlRQbXRSbi9QSDFrY2g2ZDA0c3A3QVFiMjVhUS9wcVV5WGVROHZyZWJHOE9ZUWRYT1ErNTg1dTBzZFc5cnFhbHpSVVJpSis5RjRNd2VSRnJLVWpsMUdVWWhIMUEyN1dPSHc1Y1RGU0ZQTW85RWVVSUduUVRaSElhSjdBSExhT0tzT09EYU5GOWprQmpZRzJRRXNRMnhqTVVBeDJiQkViZVRCV01Id3NrQmpuZ3E1NlMveWZna0JuV0JhNEs5c3FLdHEydDFVSThTOUhlNVh1QlJiYXdBZGF0clFFQWkzMEFrczIrTE04V2VDYmFsVlprV055bHZKK2RxSm56VmIrT0hsU29LVzhuUENQN1JkK0NjWjJEZFdBR3FKMkNCRk9waGd5d0ZGQ0ZCTnRmQWJHdE5QQkN3eHZ5Z0hlWU1aTVk5WmJvQnF3cS9wVnJzYmdONXRrdjE1Mk9EbGJNZmlxd0dNQmd4YTRFeHozUWhvdlJJVXA2YWNxWm1RelJxMHlwRFhTMlRQTFQwMllJa1FFVG5PRTQ0NW9PR3hPbVhBcVVKTk5HN1hndXBNalBxMnVhOWFzcmo1eVkveXVLdGVPMUt4MFlOSlR1ZnJpckxlMW1abmF0N09MNnJuVWRDV2VucFc2SThtQW5ic1k4S1dzMVB1U292Q1c5QS9aMjVQUTI0YTdjTk9xZ21Ua0xtQk1naDRUSGdjNGI5azJJVnYxL2cvRjVuR2xqd1BMZk9nSEF6SnpoNDVWLzQrV2VuVHptTXRSNVo3dXMyVHlzOTA5VUhxclBZN0tiY2tveFJ2UkhobVZjM2NKR0U5N3VtbDBSMVMwamRVTFZsN0V2WnRERlZCRjM1TjljRWRqcGdtQWlPbEZaK0R0b2g5MytEM3p6SHI4UlJOWlFobkNOTU5iY2VnT3ZwRXdab0wrMDZjSlEwN2grdGgzZlovN1BWYlZDNm5nVEFWL0tvTEZ1TzYrMktGY1U2NTFnRWI1dWdQU0liMUQrWHA4VjQrazNzRUlHbnc1bVllNElmNGsxbEZZcjZTQ3ptTTJFUThpV3Rtd2puQkk5a1R3ZTFUbGZBbVhoN0gwMmJ5OWZXMmdzakt3dHYwYWFVUktpbDRPZFY3ckRMMU1YSUZOcmhkeG9oY1pYWVRucTQ3V2lzcktpdGFPYmJmNSt5dmtMaTVKNmxDTlpaK0I2R0MzOFZOQlpCRGlkU1MvK21Tdmg2cytzcmdDOHB5S012RHR0K2RlM2M5ZlU3NlpQZnVNOHVkNEt2MGZ5UC9McWZlcE1ULzNvWnhTcXBaYVRhMURhUVlMWThURnNIWWJXWXNQb1JoUldmTDVlU1NRYmhVR2dHQzNZTGJWTWs2UGl0VEZOR3BBc05yQzZEMVZOQktnQkhNZWphaXVSV0VXR2dzU0RCVEpqcVdJbDhrSkxsc2FMSjJ0WERyNnhHZlQ4NWJNMlEwNmE0NngySFRndmRuVjh6NVlEeS8yN0o0enQ2eDJWdGt6am9ZcGtxMzZrYUJyNGVRU2c3dHlpVndlV3ViWFp1Z3RhZGw1OHlkYXBmYk9SZktzRFR1WjBPQmd4NGNmZGpDZjV0YldOSVRuTDEyMGZkT2kxUlYxQzN1S0d6TmR3WUxjTXZaM0J4b1B5VE9DRDFYdlhUcDdVMTBnV0NWbVRWOWIzcjJ6MFNrR1dvdmIyaHA5STg5TzhhMnNtbHlhTzhtdU1VK2RSbXR6cDYwSXpBb0ZwakxyMW4zODhib0x5ZjBkUnZ4aHNIWjBxYldxRGt3cXZ2cGtqNGwwZlk2RUlYUmk1c1FTckF2c1ZZd1hSeTRxSjJFVnREMUFON2EwSFd0aDl5bXZMMXhjM1dUVUtLL1RBSEEvYlhEVnRWV2ZPTWZ1R3hHWnY0TG4valZyOWpjM2oxeU12MHRuZG15dDlWcTg4WTlnSDF3dExYM0tXam90NSsraldIZ0FvWlprUTE0d0dRMjBGbGk3MVVtS0pBeTR4S01TVEdiVmR5Ylc3RkREQXV0OVhwRDVBeldyWU83elE4cWZmcUY4K1luZC9jbHJIY2R5eEd5M2EvMyttZk5uekMvY0JzdmVUam5UdlhmMW82dnpPbFp3N1d0cXRkbVBLL0VycnovNk5OdEQ3MnptTk9aZmJtWWRUR0hmb29mcUk3OU9jK1IybjFscm5MNnBPbTBVcDdrd3hoVFcxMkFtbTdXWWtYUjJxWXJGMkFtZ21iQXN4Wmp3eTF4cGcvbTFKZTJ2cnA4di9uejJ4cG1sQmc0RTlock1VMzQxd1ZwVE9oL09mbUd2QW5yYThxNnVjdHI2MFpRSFYzUStXTVFKeWtNajhac1duMlFCT21tSE1CK201cERJcFRGb25ZaWdpYUtBaEdFaUFIRjdFbGlWblFram9MVklNUHRKcEJLSFlkM0E4R1lIOWpKenJXd21IeDVRanA3dkRBWDBzdUdSeW0xdnRtLzlXMS9IeVI4dmN6Zk1zNlNrOERTdjg1NS81ZGxYOW9RcTUyaFQ4c3l5cDJyeDVJZDE3SUF5QU0zd0lqUVBNT0h6eXRFQjY0cTZENXpUOTF5TmJueDNWL25xbmQwMTdTOVkwNjA1azNpem9YTHBzeGRlMm4zOHlvT1Y5czFMY2p3ek5qYmRYNmFzbkJWYUJqLzYvRHdLd1BrcGNxYkRHN0Juc1hvU3FXblVBbW90dFlGNmpNU2RWeVlaaDN6VlhDandUaXd3SEg2c0d1UmlFSFFHenVSWDZ3aFprcDEyM295MUJXRTJtRWZKL3R2SVJ0TTRaTTViRFhpTXNQTWFBS09UeWM1dUw1N3JxeXljNXk1SkU1cG0xaTJTMmlVWDBDY2FRNmxDNlpvZzdKcVNxWm1ZbG9zbDJLNnB3TkE4NHpSblFXNlNhQUxZWlFHVzVsaEN0VS9XMzRONm8rYktmWjhjZjMvQ2wvK2lUWDN3QnpwT1k0bVJrZU5mM3JwdHljR1NzaFFXZ0diWXQ1akZjMmUwK0RnbElyd2w2RFZXUTdCdXdhSjNYazFKNFZMNXVybkxsL1dmK2dIVS9oWm9aZEtOeW02bEcrSTM0RmFOZVpLY1NwSklvMkllQ1Z2cGRzREdmS3Z6Sm5Bd21lRDM3T3c2NVpXd1Nvd3Bnd1g1VDY5cy9yQjU1ZFA1QmNwZ0RLRlY4cDdxMnNuLzF1YzkzYlZ6VC93NlVyQ3FEVFd2ZkNxL29DRC9xWlhOb1VqOEJMNUtwNkdVMDE3ZnJmTlhrQXRpaXlmL1NPQ0VlTHFuZDhSL1FsOUdsQ1JmY3RTNms1Y2h2SUJ1UTF6Q0Nqb0NITDJESE5ISVh4TUoza1FlTzhsYnNVWE9OZVNmQTVFamNHNi9FK0tkaE40YlAwNHZCaGRpODgzK0JGQnpRYnhGYnZaelFlWTlMTkJaYzBGTmZuNU53ZkRuNnJDVG5UdzZSOG8rZ2ZwZjVoQ29tMzNjUnVpVGxzczNLSG1aakQrQlBOKzVnWHVBMnppUy9RNzNtTHhVa3BiS04vZXF3ejV1SzBYOUYzaDJkMVY0bkdOZ1pHQmdBT0pkNzc2K2l1ZTMrY3JBemM0QUFqZTVCZmNnMHh6OVlIRU9CaVlRQlFBOEZRbEZBSGljWTJCa1lHQm5BQUdPUGdhRy8vODUraGtZR1ZDQk1nQkdHd05ZQUFBQWVKeGpZR0JnWUI4RW1LT1BnUUVBUTA0QmZnQUFBQUFBQUE0QWFBQitBTXdBNEFFQ0FVSUJiQUdZQWNJQ0dBSllBclFDNEFNd0E3QUQzZ1F3QkpZRTNBVWtCV1lGaWdZZ0JtWUd0QWJxQjFnSUVnaFlDRzRJaEFpMkNPaDRuR05nWkdCZ1VHWW9aV0JuQUFFbUlPWUNRZ2FHLzJBK0F3QVlDUUcyQUhpY1haQk5hb05BR0laZkU1UFFDS0ZRMmxVcHMyb1hCZk96ekFFU3lES0JRSmRHUjJOUVIzUVNTRS9RRS9RRVBVVVBVSHFzdnNyWGpUTXc4M3pQdlBNTkN1QVdQM0RRREFlamRtMUdqendTN3BNbXdpNzVYbmdBRDQvQ1Evb1g0VEZlNFF0N3VNTWJPemp1RGMwRW1YQ1AvQzdjSjM4SXUrUlA0UUVlOENVOHBQOFdIbU9QWDJFUHo4N1RQbzIwMmV5Mk9qbG5RU1hWLzZhck9qV0ZtdnN6TVd0ZDZDcXdPbEtIcTZvdnljTGFXTVdWeWRYS0ZGWm5tVkZsWlU0NnRQN1Iybkk1bmNiaS9kRGtmRHRGQkEyRERYYllraEtjK1YwQnFzNVp0OUpNMUhRR0JSVG0vRWV6VG1aTkt0cGNBTXM5WXU2QUs5Y2FGNzZ6b0xXSVdjZk1HT1NrVmR1dlNXZWNocVpzejA0MEliMlBZM3VyeEJKVHpyaVQ5NWxpcHorVE4xZm1BQUFBZUp4dGtNbDJ3akFNUmZPQWhBQmxLbTJoODBDMythamdDS0tEWTZjZWdQNTlUWUJ6dWtBTCt6MVpzcThjdGFKVFRLUHJzVVFMYlhRUUkwRVhLWHJvWTRBYkRESENHQk5NY1lzWjduQ1BCOHl4d0NPZThJd1h2T0lONy9qQUo3Nnd4SGZVcVdYK096Z3VtV0FqSk1WMTdpME5kbHI2aXJMS08rcWZ0ZFQ3aTZ5NHVGU1V2Q2tuYXkrbEZZWklaYVFjbWZIL3hJRmRZbjk4YnFocmExYUtUTS82bFdNbnlhWWlyeDFyRlVRWkZCa2IyekpVdG9YZUpDZWcwV25MdEhlU0ZjM090cm5vek53cWkwVGtTcEJNREIxblNkZTVvSlhXMjNoVFMyL1QwTGlsZ2xYWDdkbUZWeExucTVVMHZZQVRIRmszelgzQk9pc29RSE5ERkRlWm5xS0R5OWhSTmF3TjdWaDcyN2hGemNKNWM4VElMcktaZkg3dElQeEFGUDBCcExlSlBBPT0pIGZvcm1hdChcXFwid29mZlxcXCIpO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBsYXksIC52aWRlby1qcyAudmpzLXBsYXktY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXIsIC52aWRlby1qcyAudmpzLWJpZy1wbGF5LWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBsYXk6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtYmlnLXBsYXktYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTAxXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXBsYXktY2lyY2xlIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBsYXktY2lyY2xlOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMDJcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tcGF1c2UsIC52aWRlby1qcyAudmpzLXBsYXktY29udHJvbC52anMtcGxheWluZyAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tcGF1c2U6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wudmpzLXBsYXlpbmcgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMDNcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tdm9sdW1lLW11dGUsIC52aWRlby1qcyAudmpzLW11dGUtY29udHJvbC52anMtdm9sLTAgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXZvbHVtZS1tdXRlOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sLnZqcy12b2wtMCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwNFxcXCI7XFxufVxcblxcbi52anMtaWNvbi12b2x1bWUtbG93LCAudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wudmpzLXZvbC0xIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi12b2x1bWUtbG93OmJlZm9yZSwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sLnZqcy12b2wtMSAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwNVxcXCI7XFxufVxcblxcbi52anMtaWNvbi12b2x1bWUtbWlkLCAudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wudmpzLXZvbC0yIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi12b2x1bWUtbWlkOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sLnZqcy12b2wtMiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwNlxcXCI7XFxufVxcblxcbi52anMtaWNvbi12b2x1bWUtaGlnaCwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi12b2x1bWUtaGlnaDpiZWZvcmUsIC52aWRlby1qcyAudmpzLW11dGUtY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwN1xcXCI7XFxufVxcblxcbi52anMtaWNvbi1mdWxsc2NyZWVuLWVudGVyLCAudmlkZW8tanMgLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWZ1bGxzY3JlZW4tZW50ZXI6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMDhcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tZnVsbHNjcmVlbi1leGl0LCAudmlkZW8tanMudmpzLWZ1bGxzY3JlZW4gLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWZ1bGxzY3JlZW4tZXhpdDpiZWZvcmUsIC52aWRlby1qcy52anMtZnVsbHNjcmVlbiAudmpzLWZ1bGxzY3JlZW4tY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwOVxcXCI7XFxufVxcblxcbi52anMtaWNvbi1zcXVhcmUge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tc3F1YXJlOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMEFcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tc3Bpbm5lciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1zcGlubmVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMEJcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tc3VidGl0bGVzLCAudmlkZW8tanMgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcixcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1HQikgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcixcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1JRSkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcixcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1BVSkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcixcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1OWikgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciwgLnZpZGVvLWpzIC52anMtc3VidGl0bGVzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tc3VidGl0bGVzOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLFxcbi52aWRlby1qcy52aWRlby1qczpsYW5nKGVuLUdCKSAudmpzLXN1YnMtY2Fwcy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSxcXG4udmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1JRSkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUsXFxuLnZpZGVvLWpzLnZpZGVvLWpzOmxhbmcoZW4tQVUpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLFxcbi52aWRlby1qcy52aWRlby1qczpsYW5nKGVuLU5aKSAudmpzLXN1YnMtY2Fwcy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtc3VidGl0bGVzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwQ1xcXCI7XFxufVxcblxcbi52anMtaWNvbi1jYXB0aW9ucywgLnZpZGVvLWpzOmxhbmcoZW4pIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIsXFxuLnZpZGVvLWpzOmxhbmcoZnItQ0EpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIsIC52aWRlby1qcyAudmpzLWNhcHRpb25zLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tY2FwdGlvbnM6YmVmb3JlLCAudmlkZW8tanM6bGFuZyhlbikgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUsXFxuLnZpZGVvLWpzOmxhbmcoZnItQ0EpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1jYXB0aW9ucy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMERcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tY2hhcHRlcnMsIC52aWRlby1qcyAudmpzLWNoYXB0ZXJzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tY2hhcHRlcnM6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1jaGFwdGVycy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMEVcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tc2hhcmUge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tc2hhcmU6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwRlxcXCI7XFxufVxcblxcbi52anMtaWNvbi1jb2cge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tY29nOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMTBcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tY2lyY2xlLCAudmpzLXNlZWstdG8tbGl2ZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciwgLnZpZGVvLWpzIC52anMtdm9sdW1lLWxldmVsLCAudmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWNpcmNsZTpiZWZvcmUsIC52anMtc2Vlay10by1saXZlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtcGxheS1wcm9ncmVzczpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTExXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLWNpcmNsZS1vdXRsaW5lIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWNpcmNsZS1vdXRsaW5lOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMTJcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tY2lyY2xlLWlubmVyLWNpcmNsZSB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1jaXJjbGUtaW5uZXItY2lyY2xlOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMTNcXFwiO1xcbn1cXG5cXG4udmpzLWljb24taGQge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24taGQ6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjExNFxcXCI7XFxufVxcblxcbi52anMtaWNvbi1jYW5jZWwsIC52aWRlby1qcyAudmpzLWNvbnRyb2wudmpzLWNsb3NlLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tY2FuY2VsOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtY29udHJvbC52anMtY2xvc2UtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTE1XFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXJlcGxheSwgLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sLnZqcy1lbmRlZCAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tcmVwbGF5OmJlZm9yZSwgLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sLnZqcy1lbmRlZCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjExNlxcXCI7XFxufVxcblxcbi52anMtaWNvbi1mYWNlYm9vayB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1mYWNlYm9vazpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTE3XFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLWdwbHVzIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLWdwbHVzOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMThcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tbGlua2VkaW4ge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tbGlua2VkaW46YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjExOVxcXCI7XFxufVxcblxcbi52anMtaWNvbi10d2l0dGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXR3aXR0ZXI6YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjExQVxcXCI7XFxufVxcblxcbi52anMtaWNvbi10dW1ibHIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tdHVtYmxyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMUJcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tcGludGVyZXN0IHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBpbnRlcmVzdDpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTFDXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLWF1ZGlvLWRlc2NyaXB0aW9uLCAudmlkZW8tanMgLnZqcy1kZXNjcmlwdGlvbnMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1hdWRpby1kZXNjcmlwdGlvbjpiZWZvcmUsIC52aWRlby1qcyAudmpzLWRlc2NyaXB0aW9ucy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMURcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tYXVkaW8sIC52aWRlby1qcyAudmpzLWF1ZGlvLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tYXVkaW86YmVmb3JlLCAudmlkZW8tanMgLnZqcy1hdWRpby1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMUVcXFwiO1xcbn1cXG5cXG4udmpzLWljb24tbmV4dC1pdGVtIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLW5leHQtaXRlbTpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTFGXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXByZXZpb3VzLWl0ZW0ge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4udmpzLWljb24tcHJldmlvdXMtaXRlbTpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTIwXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXBpY3R1cmUtaW4tcGljdHVyZS1lbnRlciwgLnZpZGVvLWpzIC52anMtcGljdHVyZS1pbi1waWN0dXJlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZvbnQtZmFtaWx5OiBWaWRlb0pTO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuLnZqcy1pY29uLXBpY3R1cmUtaW4tcGljdHVyZS1lbnRlcjpiZWZvcmUsIC52aWRlby1qcyAudmpzLXBpY3R1cmUtaW4tcGljdHVyZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIlxcXFxGMTIxXFxcIjtcXG59XFxuXFxuLnZqcy1pY29uLXBpY3R1cmUtaW4tcGljdHVyZS1leGl0LCAudmlkZW8tanMudmpzLXBpY3R1cmUtaW4tcGljdHVyZSAudmpzLXBpY3R1cmUtaW4tcGljdHVyZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi52anMtaWNvbi1waWN0dXJlLWluLXBpY3R1cmUtZXhpdDpiZWZvcmUsIC52aWRlby1qcy52anMtcGljdHVyZS1pbi1waWN0dXJlIC52anMtcGljdHVyZS1pbi1waWN0dXJlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiXFxcXEYxMjJcXFwiO1xcbn1cXG5cXG4udmlkZW8tanMge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGNvbG9yOiAjZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHBhZGRpbmc6IDA7XFxuICBmb250LXNpemU6IDEwcHg7XFxuICBsaW5lLWhlaWdodDogMTtcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIHdvcmQtYnJlYWs6IGluaXRpYWw7XFxufVxcbi52aWRlby1qczotbW96LWZ1bGwtc2NyZWVuIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuLnZpZGVvLWpzOi13ZWJraXQtZnVsbC1zY3JlZW4ge1xcbiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG4gIGhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4udmlkZW8tanNbdGFiaW5kZXg9XFxcIi0xXFxcIl0ge1xcbiAgb3V0bGluZTogbm9uZTtcXG59XFxuXFxuLnZpZGVvLWpzICosXFxuLnZpZGVvLWpzICo6YmVmb3JlLFxcbi52aWRlby1qcyAqOmFmdGVyIHtcXG4gIGJveC1zaXppbmc6IGluaGVyaXQ7XFxufVxcblxcbi52aWRlby1qcyB1bCB7XFxuICBmb250LWZhbWlseTogaW5oZXJpdDtcXG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xcbiAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTtcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcbiAgbWFyZ2luLXJpZ2h0OiAwO1xcbiAgbWFyZ2luLXRvcDogMDtcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblxcbi52aWRlby1qcy52anMtZmx1aWQsXFxuLnZpZGVvLWpzLnZqcy0xNi05LFxcbi52aWRlby1qcy52anMtNC0zIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAwO1xcbn1cXG5cXG4udmlkZW8tanMudmpzLTE2LTkge1xcbiAgcGFkZGluZy10b3A6IDU2LjI1JTtcXG59XFxuXFxuLnZpZGVvLWpzLnZqcy00LTMge1xcbiAgcGFkZGluZy10b3A6IDc1JTtcXG59XFxuXFxuLnZpZGVvLWpzLnZqcy1maWxsIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy10ZWNoIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMDtcXG4gIGxlZnQ6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuYm9keS52anMtZnVsbC13aW5kb3cge1xcbiAgcGFkZGluZzogMDtcXG4gIG1hcmdpbjogMDtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLnZqcy1mdWxsLXdpbmRvdyAudmlkZW8tanMudmpzLWZ1bGxzY3JlZW4ge1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHotaW5kZXg6IDEwMDA7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbiAgYm90dG9tOiAwO1xcbiAgcmlnaHQ6IDA7XFxufVxcblxcbi52aWRlby1qcy52anMtZnVsbHNjcmVlbiB7XFxuICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbiAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XFxuICBwYWRkaW5nLXRvcDogMCAhaW1wb3J0YW50O1xcbn1cXG5cXG4udmlkZW8tanMudmpzLWZ1bGxzY3JlZW4udmpzLXVzZXItaW5hY3RpdmUge1xcbiAgY3Vyc29yOiBub25lO1xcbn1cXG5cXG4udmpzLWhpZGRlbiB7XFxuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XFxufVxcblxcbi52anMtZGlzYWJsZWQge1xcbiAgb3BhY2l0eTogMC41O1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1vZmZzY3JlZW4ge1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBsZWZ0OiAtOTk5OXB4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgd2lkdGg6IDFweDtcXG59XFxuXFxuLnZqcy1sb2NrLXNob3dpbmcge1xcbiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcXG4gIG9wYWNpdHk6IDE7XFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbn1cXG5cXG4udmpzLW5vLWpzIHtcXG4gIHBhZGRpbmc6IDIwcHg7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxuICBmb250LXNpemU6IDE4cHg7XFxuICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHdpZHRoOiAzMDBweDtcXG4gIGhlaWdodDogMTUwcHg7XFxuICBtYXJnaW46IDBweCBhdXRvO1xcbn1cXG5cXG4udmpzLW5vLWpzIGEsXFxuLnZqcy1uby1qcyBhOnZpc2l0ZWQge1xcbiAgY29sb3I6ICM2NkE4Q0M7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWJpZy1wbGF5LWJ1dHRvbiB7XFxuICBmb250LXNpemU6IDNlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjVlbTtcXG4gIGhlaWdodDogMS42MzMzMmVtO1xcbiAgd2lkdGg6IDNlbTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAxMHB4O1xcbiAgbGVmdDogMTBweDtcXG4gIHBhZGRpbmc6IDA7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBvcGFjaXR5OiAxO1xcbiAgYm9yZGVyOiAwLjA2NjY2ZW0gc29saWQgI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyQjMzM0Y7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDQzLCA1MSwgNjMsIDAuNyk7XFxuICBib3JkZXItcmFkaXVzOiAwLjNlbTtcXG4gIHRyYW5zaXRpb246IGFsbCAwLjRzO1xcbn1cXG4udmpzLWJpZy1wbGF5LWNlbnRlcmVkIC52anMtYmlnLXBsYXktYnV0dG9uIHtcXG4gIHRvcDogNTAlO1xcbiAgbGVmdDogNTAlO1xcbiAgbWFyZ2luLXRvcDogLTAuODE2NjZlbTtcXG4gIG1hcmdpbi1sZWZ0OiAtMS41ZW07XFxufVxcblxcbi52aWRlby1qczpob3ZlciAudmpzLWJpZy1wbGF5LWJ1dHRvbixcXG4udmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b246Zm9jdXMge1xcbiAgYm9yZGVyLWNvbG9yOiAjZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzczODU5ZjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTE1LCAxMzMsIDE1OSwgMC41KTtcXG4gIHRyYW5zaXRpb246IGFsbCAwcztcXG59XFxuXFxuLnZqcy1jb250cm9scy1kaXNhYmxlZCAudmpzLWJpZy1wbGF5LWJ1dHRvbixcXG4udmpzLWhhcy1zdGFydGVkIC52anMtYmlnLXBsYXktYnV0dG9uLFxcbi52anMtdXNpbmctbmF0aXZlLWNvbnRyb2xzIC52anMtYmlnLXBsYXktYnV0dG9uLFxcbi52anMtZXJyb3IgLnZqcy1iaWctcGxheS1idXR0b24ge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnZqcy1oYXMtc3RhcnRlZC52anMtcGF1c2VkLnZqcy1zaG93LWJpZy1wbGF5LWJ1dHRvbi1vbi1wYXVzZSAudmpzLWJpZy1wbGF5LWJ1dHRvbiB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuLnZpZGVvLWpzIGJ1dHRvbiB7XFxuICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgdHJhbnNpdGlvbjogbm9uZTtcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcXG4gIGFwcGVhcmFuY2U6IG5vbmU7XFxufVxcblxcbi52anMtY29udHJvbCAudmpzLWJ1dHRvbiB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtY29udHJvbC52anMtY2xvc2UtYnV0dG9uIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGhlaWdodDogM2VtO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IDA7XFxuICB0b3A6IDAuNWVtO1xcbiAgei1pbmRleDogMjtcXG59XFxuLnZpZGVvLWpzIC52anMtbW9kYWwtZGlhbG9nIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTtcXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMCwgMCwgMCwgMC44KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSk7XFxuICBvdmVyZmxvdzogYXV0bztcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtbW9kYWwtZGlhbG9nID4gKiB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4udmpzLW1vZGFsLWRpYWxvZyAudmpzLW1vZGFsLWRpYWxvZy1jb250ZW50IHtcXG4gIGZvbnQtc2l6ZTogMS4yZW07XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgcGFkZGluZzogMjBweCAyNHB4O1xcbiAgei1pbmRleDogMTtcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbiB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi52anMtbWVudS1idXR0b24udmpzLWRpc2FibGVkIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuXFxuLnZqcy13b3JraW5naG92ZXIgLnZqcy1tZW51LWJ1dHRvbi52anMtZGlzYWJsZWQ6aG92ZXIgLnZqcy1tZW51IHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtbWVudSAudmpzLW1lbnUtY29udGVudCB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxuICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4udmpzLW1lbnUgLnZqcy1tZW51LWNvbnRlbnQgPiAqIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcbi52anMtc2NydWJiaW5nIC52anMtY29udHJvbC52anMtbWVudS1idXR0b246aG92ZXIgLnZqcy1tZW51IHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtbWVudSBsaSB7XFxuICBsaXN0LXN0eWxlOiBub25lO1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMC4yZW0gMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjRlbTtcXG4gIGZvbnQtc2l6ZTogMS4yZW07XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlO1xcbn1cXG5cXG4udmpzLW1lbnUgbGkudmpzLW1lbnUtaXRlbTpmb2N1cyxcXG4udmpzLW1lbnUgbGkudmpzLW1lbnUtaXRlbTpob3ZlcixcXG4uanMtZm9jdXMtdmlzaWJsZSAudmpzLW1lbnUgbGkudmpzLW1lbnUtaXRlbTpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzM4NTlmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMTUsIDEzMywgMTU5LCAwLjUpO1xcbn1cXG5cXG4udmpzLW1lbnUgbGkudmpzLXNlbGVjdGVkLFxcbi52anMtbWVudSBsaS52anMtc2VsZWN0ZWQ6Zm9jdXMsXFxuLnZqcy1tZW51IGxpLnZqcy1zZWxlY3RlZDpob3ZlcixcXG4uanMtZm9jdXMtdmlzaWJsZSAudmpzLW1lbnUgbGkudmpzLXNlbGVjdGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBjb2xvcjogIzJCMzMzRjtcXG59XFxuXFxuLnZqcy1tZW51IGxpLnZqcy1tZW51LXRpdGxlIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuICBmb250LXNpemU6IDFlbTtcXG4gIGxpbmUtaGVpZ2h0OiAyZW07XFxuICBwYWRkaW5nOiAwO1xcbiAgbWFyZ2luOiAwIDAgMC4zZW0gMDtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4udmpzLW1lbnUtYnV0dG9uLXBvcHVwIC52anMtbWVudSB7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiAwO1xcbiAgd2lkdGg6IDEwZW07XFxuICBsZWZ0OiAtM2VtO1xcbiAgaGVpZ2h0OiAwZW07XFxuICBtYXJnaW4tYm90dG9tOiAxLjVlbTtcXG4gIGJvcmRlci10b3AtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43KTtcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbi1wb3B1cCAudmpzLW1lbnUgLnZqcy1tZW51LWNvbnRlbnQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJCMzMzRjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43KTtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm90dG9tOiAxLjVlbTtcXG4gIG1heC1oZWlnaHQ6IDE1ZW07XFxufVxcblxcbi52anMtbGF5b3V0LXRpbnkgLnZqcy1tZW51LWJ1dHRvbi1wb3B1cCAudmpzLW1lbnUgLnZqcy1tZW51LWNvbnRlbnQsXFxuLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLW1lbnUtYnV0dG9uLXBvcHVwIC52anMtbWVudSAudmpzLW1lbnUtY29udGVudCB7XFxuICBtYXgtaGVpZ2h0OiA1ZW07XFxufVxcblxcbi52anMtbGF5b3V0LXNtYWxsIC52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IC52anMtbWVudS1jb250ZW50IHtcXG4gIG1heC1oZWlnaHQ6IDEwZW07XFxufVxcblxcbi52anMtbGF5b3V0LW1lZGl1bSAudmpzLW1lbnUtYnV0dG9uLXBvcHVwIC52anMtbWVudSAudmpzLW1lbnUtY29udGVudCB7XFxuICBtYXgtaGVpZ2h0OiAxNGVtO1xcbn1cXG5cXG4udmpzLWxheW91dC1sYXJnZSAudmpzLW1lbnUtYnV0dG9uLXBvcHVwIC52anMtbWVudSAudmpzLW1lbnUtY29udGVudCxcXG4udmpzLWxheW91dC14LWxhcmdlIC52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IC52anMtbWVudS1jb250ZW50LFxcbi52anMtbGF5b3V0LWh1Z2UgLnZqcy1tZW51LWJ1dHRvbi1wb3B1cCAudmpzLW1lbnUgLnZqcy1tZW51LWNvbnRlbnQge1xcbiAgbWF4LWhlaWdodDogMjVlbTtcXG59XFxuXFxuLnZqcy13b3JraW5naG92ZXIgLnZqcy1tZW51LWJ1dHRvbi1wb3B1cC52anMtaG92ZXIgLnZqcy1tZW51LFxcbi52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51LnZqcy1sb2NrLXNob3dpbmcge1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi52aWRlby1qcyAudmpzLW1lbnUtYnV0dG9uLWlubGluZSB7XFxuICB0cmFuc2l0aW9uOiBhbGwgMC40cztcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcblxcbi52aWRlby1qcyAudmpzLW1lbnUtYnV0dG9uLWlubGluZTpiZWZvcmUge1xcbiAgd2lkdGg6IDIuMjIyMjIyMjIyZW07XFxufVxcblxcbi52aWRlby1qcyAudmpzLW1lbnUtYnV0dG9uLWlubGluZTpob3ZlcixcXG4udmlkZW8tanMgLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmU6Zm9jdXMsXFxuLnZpZGVvLWpzIC52anMtbWVudS1idXR0b24taW5saW5lLnZqcy1zbGlkZXItYWN0aXZlLFxcbi52aWRlby1qcy52anMtbm8tZmxleCAudmpzLW1lbnUtYnV0dG9uLWlubGluZSB7XFxuICB3aWR0aDogMTJlbTtcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmUgLnZqcy1tZW51IHtcXG4gIG9wYWNpdHk6IDA7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogYXV0bztcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDRlbTtcXG4gIHRvcDogMDtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxuICB0cmFuc2l0aW9uOiBhbGwgMC40cztcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmU6aG92ZXIgLnZqcy1tZW51LFxcbi52anMtbWVudS1idXR0b24taW5saW5lOmZvY3VzIC52anMtbWVudSxcXG4udmpzLW1lbnUtYnV0dG9uLWlubGluZS52anMtc2xpZGVyLWFjdGl2ZSAudmpzLW1lbnUge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udmpzLW5vLWZsZXggLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmUgLnZqcy1tZW51IHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgb3BhY2l0eTogMTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiBhdXRvO1xcbn1cXG5cXG4udmpzLW5vLWZsZXggLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmU6aG92ZXIgLnZqcy1tZW51LFxcbi52anMtbm8tZmxleCAudmpzLW1lbnUtYnV0dG9uLWlubGluZTpmb2N1cyAudmpzLW1lbnUsXFxuLnZqcy1uby1mbGV4IC52anMtbWVudS1idXR0b24taW5saW5lLnZqcy1zbGlkZXItYWN0aXZlIC52anMtbWVudSB7XFxuICB3aWR0aDogYXV0bztcXG59XFxuXFxuLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmUgLnZqcy1tZW51LWNvbnRlbnQge1xcbiAgd2lkdGg6IGF1dG87XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBtYXJnaW46IDA7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1jb250cm9sLWJhciB7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBoZWlnaHQ6IDNlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyQjMzM0Y7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDQzLCA1MSwgNjMsIDAuNyk7XFxufVxcblxcbi52anMtaGFzLXN0YXJ0ZWQgLnZqcy1jb250cm9sLWJhciB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIG9wYWNpdHk6IDE7XFxuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMXMsIG9wYWNpdHkgMC4xcztcXG59XFxuXFxuLnZqcy1oYXMtc3RhcnRlZC52anMtdXNlci1pbmFjdGl2ZS52anMtcGxheWluZyAudmpzLWNvbnRyb2wtYmFyIHtcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcztcXG59XFxuXFxuLnZqcy1jb250cm9scy1kaXNhYmxlZCAudmpzLWNvbnRyb2wtYmFyLFxcbi52anMtdXNpbmctbmF0aXZlLWNvbnRyb2xzIC52anMtY29udHJvbC1iYXIsXFxuLnZqcy1lcnJvciAudmpzLWNvbnRyb2wtYmFyIHtcXG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcXG59XFxuXFxuLnZqcy1hdWRpby52anMtaGFzLXN0YXJ0ZWQudmpzLXVzZXItaW5hY3RpdmUudmpzLXBsYXlpbmcgLnZqcy1jb250cm9sLWJhciB7XFxuICBvcGFjaXR5OiAxO1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG59XFxuXFxuLnZqcy1oYXMtc3RhcnRlZC52anMtbm8tZmxleCAudmpzLWNvbnRyb2wtYmFyIHtcXG4gIGRpc3BsYXk6IHRhYmxlO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1jb250cm9sIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIG1hcmdpbjogMDtcXG4gIHBhZGRpbmc6IDA7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogNGVtO1xcbiAgZmxleDogbm9uZTtcXG59XFxuXFxuLnZqcy1idXR0b24gPiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHtcXG4gIGZvbnQtc2l6ZTogMS44ZW07XFxuICBsaW5lLWhlaWdodDogMS42NztcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtY29udHJvbDpmb2N1czpiZWZvcmUsXFxuLnZpZGVvLWpzIC52anMtY29udHJvbDpob3ZlcjpiZWZvcmUsXFxuLnZpZGVvLWpzIC52anMtY29udHJvbDpmb2N1cyB7XFxuICB0ZXh0LXNoYWRvdzogMGVtIDBlbSAxZW0gd2hpdGU7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWNvbnRyb2wtdGV4dCB7XFxuICBib3JkZXI6IDA7XFxuICBjbGlwOiByZWN0KDAgMCAwIDApO1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgcGFkZGluZzogMDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHdpZHRoOiAxcHg7XFxufVxcblxcbi52anMtbm8tZmxleCAudmpzLWNvbnRyb2wge1xcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGZsZXg6IGF1dG87XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIG1pbi13aWR0aDogNGVtO1xcbiAgdG91Y2gtYWN0aW9uOiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sLmRpc2FibGVkIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuXFxuLnZqcy1saXZlIC52anMtcHJvZ3Jlc3MtY29udHJvbCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmpzLWxpdmV1aSAudmpzLXByb2dyZXNzLWNvbnRyb2wge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbi52anMtbm8tZmxleCAudmpzLXByb2dyZXNzLWNvbnRyb2wge1xcbiAgd2lkdGg6IGF1dG87XFxufVxcblxcbi52aWRlby1qcyAudmpzLXByb2dyZXNzLWhvbGRlciB7XFxuICBmbGV4OiBhdXRvO1xcbiAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XFxuICBoZWlnaHQ6IDAuM2VtO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtcHJvZ3Jlc3MtaG9sZGVyIHtcXG4gIG1hcmdpbjogMCAxMHB4O1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sOmhvdmVyIC52anMtcHJvZ3Jlc3MtaG9sZGVyIHtcXG4gIGZvbnQtc2l6ZTogMS42NjY2NjY2NjY3ZW07XFxufVxcblxcbi52aWRlby1qcyAudmpzLXByb2dyZXNzLWNvbnRyb2w6aG92ZXIgLnZqcy1wcm9ncmVzcy1ob2xkZXIuZGlzYWJsZWQge1xcbiAgZm9udC1zaXplOiAxZW07XFxufVxcblxcbi52aWRlby1qcyAudmpzLXByb2dyZXNzLWhvbGRlciAudmpzLXBsYXktcHJvZ3Jlc3MsXFxuLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtaG9sZGVyIC52anMtbG9hZC1wcm9ncmVzcyxcXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1ob2xkZXIgLnZqcy1sb2FkLXByb2dyZXNzIGRpdiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIGhlaWdodDogMTAwJTtcXG4gIG1hcmdpbjogMDtcXG4gIHBhZGRpbmc6IDA7XFxuICB3aWR0aDogMDtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtcGxheS1wcm9ncmVzcyB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbn1cXG4udmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzOmJlZm9yZSB7XFxuICBmb250LXNpemU6IDAuOWVtO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IC0wLjVlbTtcXG4gIHRvcDogLTAuMzMzMzMzMzMzM2VtO1xcbiAgei1pbmRleDogMTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtbG9hZC1wcm9ncmVzcyB7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDExNSwgMTMzLCAxNTksIDAuNSk7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWxvYWQtcHJvZ3Jlc3MgZGl2IHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTE1LCAxMzMsIDE1OSwgMC43NSk7XFxufVxcblxcbi52aWRlby1qcyAudmpzLXRpbWUtdG9vbHRpcCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zZW07XFxuICBjb2xvcjogIzAwMDtcXG4gIGZsb2F0OiByaWdodDtcXG4gIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAxZW07XFxuICBwYWRkaW5nOiA2cHggOHB4IDhweCA4cHg7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogLTMuNGVtO1xcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgei1pbmRleDogMTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtaG9sZGVyOmZvY3VzIC52anMtdGltZS10b29sdGlwIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52aWRlby1qcyAudmpzLXByb2dyZXNzLWNvbnRyb2w6aG92ZXIgLnZqcy10aW1lLXRvb2x0aXAsXFxuLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbDpob3ZlciAudmpzLXByb2dyZXNzLWhvbGRlcjpmb2N1cyAudmpzLXRpbWUtdG9vbHRpcCB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIGZvbnQtc2l6ZTogMC42ZW07XFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sLmRpc2FibGVkOmhvdmVyIC52anMtdGltZS10b29sdGlwIHtcXG4gIGZvbnQtc2l6ZTogMWVtO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtbW91c2UtZGlzcGxheSB7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgd2lkdGg6IDFweDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxuICB6LWluZGV4OiAxO1xcbn1cXG5cXG4udmpzLW5vLWZsZXggLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtbW91c2UtZGlzcGxheSB7XFxuICB6LWluZGV4OiAwO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sOmhvdmVyIC52anMtbW91c2UtZGlzcGxheSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuLnZpZGVvLWpzLnZqcy11c2VyLWluYWN0aXZlIC52anMtcHJvZ3Jlc3MtY29udHJvbCAudmpzLW1vdXNlLWRpc3BsYXkge1xcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgb3BhY2l0eTogMDtcXG4gIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXM7XFxufVxcblxcbi52aWRlby1qcy52anMtdXNlci1pbmFjdGl2ZS52anMtbm8tZmxleCAudmpzLXByb2dyZXNzLWNvbnRyb2wgLnZqcy1tb3VzZS1kaXNwbGF5IHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtbW91c2UtZGlzcGxheSAudmpzLXRpbWUtdG9vbHRpcCB7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7XFxufVxcblxcbi52aWRlby1qcyAudmpzLXNsaWRlciB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBwYWRkaW5nOiAwO1xcbiAgbWFyZ2luOiAwIDAuNDVlbSAwIDAuNDVlbTtcXG4gIC8qIGlPUyBTYWZhcmkgKi9cXG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTtcXG4gIC8qIFNhZmFyaSAqL1xcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXG4gIC8qIEtvbnF1ZXJvciBIVE1MICovXFxuICAvKiBGaXJlZm94ICovXFxuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgLyogSW50ZXJuZXQgRXhwbG9yZXIvRWRnZSAqL1xcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcbiAgLyogTm9uLXByZWZpeGVkIHZlcnNpb24sIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgQ2hyb21lIGFuZCBPcGVyYSAqL1xcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzM4NTlmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMTUsIDEzMywgMTU5LCAwLjUpO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1zbGlkZXIuZGlzYWJsZWQge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1zbGlkZXI6Zm9jdXMge1xcbiAgdGV4dC1zaGFkb3c6IDBlbSAwZW0gMWVtIHdoaXRlO1xcbiAgYm94LXNoYWRvdzogMCAwIDFlbSAjZmZmO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgZmxleDogbm9uZTtcXG59XFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLWNvbnRyb2wge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgbWFyZ2luLXJpZ2h0OiAxZW07XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwge1xcbiAgd2lkdGg6IDVlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wge1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIG9wYWNpdHk6IDA7XFxuICB3aWR0aDogMXB4O1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBtYXJnaW4tbGVmdDogLTFweDtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIHtcXG4gIHRyYW5zaXRpb246IHdpZHRoIDFzO1xcbn1cXG4udmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLWhvdmVyIC52anMtdm9sdW1lLWNvbnRyb2wsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDphY3RpdmUgLnZqcy12b2x1bWUtY29udHJvbCwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmZvY3VzIC52anMtdm9sdW1lLWNvbnRyb2wsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sOmFjdGl2ZSwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsLnZqcy1ob3ZlciAudmpzLW11dGUtY29udHJvbCB+IC52anMtdm9sdW1lLWNvbnRyb2wsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sLnZqcy1zbGlkZXItYWN0aXZlIHtcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICBvcGFjaXR5OiAxO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjFzLCBvcGFjaXR5IDAuMXMsIGhlaWdodCAwLjFzLCB3aWR0aCAwLjFzLCBsZWZ0IDBzLCB0b3AgMHM7XFxufVxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtaG92ZXIgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDphY3RpdmUgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDpmb2N1cyAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtaG9yaXpvbnRhbCwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2w6YWN0aXZlLnZqcy12b2x1bWUtaG9yaXpvbnRhbCwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsLnZqcy1ob3ZlciAudmpzLW11dGUtY29udHJvbCB+IC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS1ob3Jpem9udGFsLCAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtc2xpZGVyLWFjdGl2ZS52anMtdm9sdW1lLWhvcml6b250YWwge1xcbiAgd2lkdGg6IDVlbTtcXG4gIGhlaWdodDogM2VtO1xcbiAgbWFyZ2luLXJpZ2h0OiAwO1xcbn1cXG4udmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLWhvdmVyIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmFjdGl2ZSAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDpmb2N1cyAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sOmFjdGl2ZS52anMtdm9sdW1lLXZlcnRpY2FsLCAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLWhvdmVyIC52anMtbXV0ZS1jb250cm9sIH4gLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsLCAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtc2xpZGVyLWFjdGl2ZS52anMtdm9sdW1lLXZlcnRpY2FsIHtcXG4gIGxlZnQ6IC0zLjVlbTtcXG4gIHRyYW5zaXRpb246IGxlZnQgMHM7XFxufVxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLWhvdmVyLCAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsOmFjdGl2ZSwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbC52anMtc2xpZGVyLWFjdGl2ZSB7XFxuICB3aWR0aDogMTBlbTtcXG4gIHRyYW5zaXRpb246IHdpZHRoIDAuMXM7XFxufVxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLW11dGUtdG9nZ2xlLW9ubHkge1xcbiAgd2lkdGg6IDRlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCB7XFxuICBoZWlnaHQ6IDhlbTtcXG4gIHdpZHRoOiAzZW07XFxuICBsZWZ0OiAtMzAwMGVtO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcywgaGVpZ2h0IDFzIDFzLCB3aWR0aCAxcyAxcywgbGVmdCAxcyAxcywgdG9wIDFzIDFzO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwge1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcywgaGVpZ2h0IDFzIDFzLCB3aWR0aCAxcywgbGVmdCAxcyAxcywgdG9wIDFzIDFzO1xcbn1cXG5cXG4udmlkZW8tanMudmpzLW5vLWZsZXggLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwge1xcbiAgd2lkdGg6IDVlbTtcXG4gIGhlaWdodDogM2VtO1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIG9wYWNpdHk6IDE7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB0cmFuc2l0aW9uOiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMudmpzLW5vLWZsZXggLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsLFxcbi52aWRlby1qcy52anMtbm8tZmxleCAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiAzZW07XFxuICBsZWZ0OiAwLjVlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1iYXIge1xcbiAgbWFyZ2luOiAxLjM1ZW0gMC40NWVtO1xcbn1cXG5cXG4udmpzLXZvbHVtZS1iYXIudmpzLXNsaWRlci1ob3Jpem9udGFsIHtcXG4gIHdpZHRoOiA1ZW07XFxuICBoZWlnaHQ6IDAuM2VtO1xcbn1cXG5cXG4udmpzLXZvbHVtZS1iYXIudmpzLXNsaWRlci12ZXJ0aWNhbCB7XFxuICB3aWR0aDogMC4zZW07XFxuICBoZWlnaHQ6IDVlbTtcXG4gIG1hcmdpbjogMS4zNWVtIGF1dG87XFxufVxcblxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1sZXZlbCB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG59XFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBmb250LXNpemU6IDAuOWVtO1xcbn1cXG5cXG4udmpzLXNsaWRlci12ZXJ0aWNhbCAudmpzLXZvbHVtZS1sZXZlbCB7XFxuICB3aWR0aDogMC4zZW07XFxufVxcbi52anMtc2xpZGVyLXZlcnRpY2FsIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSB7XFxuICB0b3A6IC0wLjVlbTtcXG4gIGxlZnQ6IC0wLjNlbTtcXG59XFxuXFxuLnZqcy1zbGlkZXItaG9yaXpvbnRhbCAudmpzLXZvbHVtZS1sZXZlbCB7XFxuICBoZWlnaHQ6IDAuM2VtO1xcbn1cXG4udmpzLXNsaWRlci1ob3Jpem9udGFsIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSB7XFxuICB0b3A6IC0wLjNlbTtcXG4gIHJpZ2h0OiAtMC41ZW07XFxufVxcblxcbi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLXZlcnRpY2FsIHtcXG4gIHdpZHRoOiA0ZW07XFxufVxcblxcbi52anMtdm9sdW1lLWJhci52anMtc2xpZGVyLXZlcnRpY2FsIC52anMtdm9sdW1lLWxldmVsIHtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLnZqcy12b2x1bWUtYmFyLnZqcy1zbGlkZXItaG9yaXpvbnRhbCAudmpzLXZvbHVtZS1sZXZlbCB7XFxuICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLXZlcnRpY2FsIHtcXG4gIHdpZHRoOiAzZW07XFxuICBoZWlnaHQ6IDhlbTtcXG4gIGJvdHRvbTogOGVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJCMzMzRjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43KTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdm9sdW1lLWhvcml6b250YWwgLnZqcy1tZW51IHtcXG4gIGxlZnQ6IC0yZW07XFxufVxcblxcbi52anMtcG9zdGVyIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTtcXG4gIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBtYXJnaW46IDA7XFxuICBwYWRkaW5nOiAwO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG5cXG4udmpzLWhhcy1zdGFydGVkIC52anMtcG9zdGVyIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtYXVkaW8udmpzLWhhcy1zdGFydGVkIC52anMtcG9zdGVyIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4udmpzLXVzaW5nLW5hdGl2ZS1jb250cm9scyAudmpzLXBvc3RlciB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1saXZlLWNvbnRyb2wge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xcbiAgZmxleDogYXV0bztcXG4gIGZvbnQtc2l6ZTogMWVtO1xcbiAgbGluZS1oZWlnaHQ6IDNlbTtcXG59XFxuXFxuLnZqcy1uby1mbGV4IC52anMtbGl2ZS1jb250cm9sIHtcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxuICB3aWR0aDogYXV0bztcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcblxcbi52aWRlby1qczpub3QoLnZqcy1saXZlKSAudmpzLWxpdmUtY29udHJvbCxcXG4udmlkZW8tanMudmpzLWxpdmV1aSAudmpzLWxpdmUtY29udHJvbCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1zZWVrLXRvLWxpdmUtY29udHJvbCB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBmbGV4OiBub25lO1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBwYWRkaW5nLWxlZnQ6IDAuNWVtO1xcbiAgcGFkZGluZy1yaWdodDogMC41ZW07XFxuICBmb250LXNpemU6IDFlbTtcXG4gIGxpbmUtaGVpZ2h0OiAzZW07XFxuICB3aWR0aDogYXV0bztcXG4gIG1pbi13aWR0aDogNGVtO1xcbn1cXG5cXG4udmpzLW5vLWZsZXggLnZqcy1zZWVrLXRvLWxpdmUtY29udHJvbCB7XFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcbiAgd2lkdGg6IGF1dG87XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbn1cXG5cXG4udmlkZW8tanMudmpzLWxpdmU6bm90KC52anMtbGl2ZXVpKSAudmpzLXNlZWstdG8tbGl2ZS1jb250cm9sLFxcbi52aWRlby1qczpub3QoLnZqcy1saXZlKSAudmpzLXNlZWstdG8tbGl2ZS1jb250cm9sIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52anMtc2Vlay10by1saXZlLWNvbnRyb2wudmpzLWNvbnRyb2wudmpzLWF0LWxpdmUtZWRnZSB7XFxuICBjdXJzb3I6IGF1dG87XFxufVxcblxcbi52anMtc2Vlay10by1saXZlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIG1hcmdpbi1yaWdodDogMC41ZW07XFxuICBjb2xvcjogIzg4ODtcXG59XFxuXFxuLnZqcy1zZWVrLXRvLWxpdmUtY29udHJvbC52anMtY29udHJvbC52anMtYXQtbGl2ZS1lZGdlIC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICBjb2xvcjogcmVkO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy10aW1lLWNvbnRyb2wge1xcbiAgZmxleDogbm9uZTtcXG4gIGZvbnQtc2l6ZTogMWVtO1xcbiAgbGluZS1oZWlnaHQ6IDNlbTtcXG4gIG1pbi13aWR0aDogMmVtO1xcbiAgd2lkdGg6IGF1dG87XFxuICBwYWRkaW5nLWxlZnQ6IDFlbTtcXG4gIHBhZGRpbmctcmlnaHQ6IDFlbTtcXG59XFxuXFxuLnZqcy1saXZlIC52anMtdGltZS1jb250cm9sIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWN1cnJlbnQtdGltZSxcXG4udmpzLW5vLWZsZXggLnZqcy1jdXJyZW50LXRpbWUge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtZHVyYXRpb24sXFxuLnZqcy1uby1mbGV4IC52anMtZHVyYXRpb24ge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnZqcy10aW1lLWRpdmlkZXIge1xcbiAgZGlzcGxheTogbm9uZTtcXG4gIGxpbmUtaGVpZ2h0OiAzZW07XFxufVxcblxcbi52anMtbGl2ZSAudmpzLXRpbWUtZGl2aWRlciB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHtcXG4gIGZsZXg6IG5vbmU7XFxufVxcblxcbi52anMtdGV4dC10cmFjay1kaXNwbGF5IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvdHRvbTogM2VtO1xcbiAgbGVmdDogMDtcXG4gIHJpZ2h0OiAwO1xcbiAgdG9wOiAwO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi52aWRlby1qcy52anMtdXNlci1pbmFjdGl2ZS52anMtcGxheWluZyAudmpzLXRleHQtdHJhY2stZGlzcGxheSB7XFxuICBib3R0b206IDFlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtdGV4dC10cmFjayB7XFxuICBmb250LXNpemU6IDEuNGVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgbWFyZ2luLWJvdHRvbTogMC4xZW07XFxufVxcblxcbi52anMtc3VidGl0bGVzIHtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG5cXG4udmpzLWNhcHRpb25zIHtcXG4gIGNvbG9yOiAjZmM2O1xcbn1cXG5cXG4udmpzLXR0LWN1ZSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxudmlkZW86Oi13ZWJraXQtbWVkaWEtdGV4dC10cmFjay1kaXNwbGF5IHtcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtM2VtKTtcXG59XFxuXFxuLnZpZGVvLWpzLnZqcy11c2VyLWluYWN0aXZlLnZqcy1wbGF5aW5nIHZpZGVvOjotd2Via2l0LW1lZGlhLXRleHQtdHJhY2stZGlzcGxheSB7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNWVtKTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtcGljdHVyZS1pbi1waWN0dXJlLWNvbnRyb2wge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgZmxleDogbm9uZTtcXG59XFxuLnZpZGVvLWpzIC52anMtZnVsbHNjcmVlbi1jb250cm9sIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGZsZXg6IG5vbmU7XFxufVxcbi52anMtcGxheWJhY2stcmF0ZSA+IC52anMtbWVudS1idXR0b24sXFxuLnZqcy1wbGF5YmFjay1yYXRlIC52anMtcGxheWJhY2stcmF0ZS12YWx1ZSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcblxcbi52anMtcGxheWJhY2stcmF0ZSAudmpzLXBsYXliYWNrLXJhdGUtdmFsdWUge1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBmb250LXNpemU6IDEuNWVtO1xcbiAgbGluZS1oZWlnaHQ6IDI7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbi52anMtcGxheWJhY2stcmF0ZSAudmpzLW1lbnUge1xcbiAgd2lkdGg6IDRlbTtcXG4gIGxlZnQ6IDBlbTtcXG59XFxuXFxuLnZqcy1lcnJvciAudmpzLWVycm9yLWRpc3BsYXkgLnZqcy1tb2RhbC1kaWFsb2ctY29udGVudCB7XFxuICBmb250LXNpemU6IDEuNGVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG4udmpzLWVycm9yIC52anMtZXJyb3ItZGlzcGxheTpiZWZvcmUge1xcbiAgY29sb3I6ICNmZmY7XFxuICBjb250ZW50OiBcXFwiWFxcXCI7XFxuICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogNGVtO1xcbiAgbGVmdDogMDtcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcbiAgbWFyZ2luLXRvcDogLTAuNWVtO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdGV4dC1zaGFkb3c6IDAuMDVlbSAwLjA1ZW0gMC4xZW0gIzAwMDtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHRvcDogNTAlO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4udmpzLWxvYWRpbmctc3Bpbm5lciB7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiA1MCU7XFxuICBsZWZ0OiA1MCU7XFxuICBtYXJnaW46IC0yNXB4IDAgMCAtMjVweDtcXG4gIG9wYWNpdHk6IDAuODU7XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgYm9yZGVyOiA2cHggc29saWQgcmdiYSg0MywgNTEsIDYzLCAwLjcpO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxuICB3aWR0aDogNTBweDtcXG4gIGhlaWdodDogNTBweDtcXG4gIGJvcmRlci1yYWRpdXM6IDI1cHg7XFxuICB2aXNpYmlsaXR5OiBoaWRkZW47XFxufVxcblxcbi52anMtc2Vla2luZyAudmpzLWxvYWRpbmctc3Bpbm5lcixcXG4udmpzLXdhaXRpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXIge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogdmpzLXNwaW5uZXItc2hvdyAwcyBsaW5lYXIgMC4zcyBmb3J3YXJkcztcXG4gICAgICAgICAgYW5pbWF0aW9uOiB2anMtc3Bpbm5lci1zaG93IDBzIGxpbmVhciAwLjNzIGZvcndhcmRzO1xcbn1cXG5cXG4udmpzLWxvYWRpbmctc3Bpbm5lcjpiZWZvcmUsXFxuLnZqcy1sb2FkaW5nLXNwaW5uZXI6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBtYXJnaW46IC02cHg7XFxuICBib3gtc2l6aW5nOiBpbmhlcml0O1xcbiAgd2lkdGg6IGluaGVyaXQ7XFxuICBoZWlnaHQ6IGluaGVyaXQ7XFxuICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbiAgb3BhY2l0eTogMTtcXG4gIGJvcmRlcjogaW5oZXJpdDtcXG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcXG59XFxuXFxuLnZqcy1zZWVraW5nIC52anMtbG9hZGluZy1zcGlubmVyOmJlZm9yZSxcXG4udmpzLXNlZWtpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXI6YWZ0ZXIsXFxuLnZqcy13YWl0aW5nIC52anMtbG9hZGluZy1zcGlubmVyOmJlZm9yZSxcXG4udmpzLXdhaXRpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXI6YWZ0ZXIge1xcbiAgLXdlYmtpdC1hbmltYXRpb246IHZqcy1zcGlubmVyLXNwaW4gMS4xcyBjdWJpYy1iZXppZXIoMC42LCAwLjIsIDAsIDAuOCkgaW5maW5pdGUsIHZqcy1zcGlubmVyLWZhZGUgMS4xcyBsaW5lYXIgaW5maW5pdGU7XFxuICBhbmltYXRpb246IHZqcy1zcGlubmVyLXNwaW4gMS4xcyBjdWJpYy1iZXppZXIoMC42LCAwLjIsIDAsIDAuOCkgaW5maW5pdGUsIHZqcy1zcGlubmVyLWZhZGUgMS4xcyBsaW5lYXIgaW5maW5pdGU7XFxufVxcblxcbi52anMtc2Vla2luZyAudmpzLWxvYWRpbmctc3Bpbm5lcjpiZWZvcmUsXFxuLnZqcy13YWl0aW5nIC52anMtbG9hZGluZy1zcGlubmVyOmJlZm9yZSB7XFxuICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcXG59XFxuXFxuLnZqcy1zZWVraW5nIC52anMtbG9hZGluZy1zcGlubmVyOmFmdGVyLFxcbi52anMtd2FpdGluZyAudmpzLWxvYWRpbmctc3Bpbm5lcjphZnRlciB7XFxuICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjQ0cztcXG4gIGFuaW1hdGlvbi1kZWxheTogMC40NHM7XFxufVxcblxcbkBrZXlmcmFtZXMgdmpzLXNwaW5uZXItc2hvdyB7XFxuICB0byB7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICB9XFxufVxcbkAtd2Via2l0LWtleWZyYW1lcyB2anMtc3Bpbm5lci1zaG93IHtcXG4gIHRvIHtcXG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIH1cXG59XFxuQGtleWZyYW1lcyB2anMtc3Bpbm5lci1zcGluIHtcXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgfVxcbn1cXG5ALXdlYmtpdC1rZXlmcmFtZXMgdmpzLXNwaW5uZXItc3BpbiB7XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgfVxcbn1cXG5Aa2V5ZnJhbWVzIHZqcy1zcGlubmVyLWZhZGUge1xcbiAgMCUge1xcbiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmO1xcbiAgfVxcbiAgMjAlIHtcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogIzczODU5ZjtcXG4gIH1cXG4gIDM1JSB7XFxuICAgIGJvcmRlci10b3AtY29sb3I6IHdoaXRlO1xcbiAgfVxcbiAgNjAlIHtcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogIzczODU5ZjtcXG4gIH1cXG4gIDEwMCUge1xcbiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmO1xcbiAgfVxcbn1cXG5ALXdlYmtpdC1rZXlmcmFtZXMgdmpzLXNwaW5uZXItZmFkZSB7XFxuICAwJSB7XFxuICAgIGJvcmRlci10b3AtY29sb3I6ICM3Mzg1OWY7XFxuICB9XFxuICAyMCUge1xcbiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmO1xcbiAgfVxcbiAgMzUlIHtcXG4gICAgYm9yZGVyLXRvcC1jb2xvcjogd2hpdGU7XFxuICB9XFxuICA2MCUge1xcbiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmO1xcbiAgfVxcbiAgMTAwJSB7XFxuICAgIGJvcmRlci10b3AtY29sb3I6ICM3Mzg1OWY7XFxuICB9XFxufVxcbi52anMtY2hhcHRlcnMtYnV0dG9uIC52anMtbWVudSB1bCB7XFxuICB3aWR0aDogMjRlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtc3Vicy1jYXBzLWJ1dHRvbiArIC52anMtbWVudSAudmpzLWNhcHRpb25zLW1lbnUtaXRlbSAudmpzLW1lbnUtaXRlbS10ZXh0IC52anMtaWNvbi1wbGFjZWhvbGRlciB7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbWFyZ2luLWJvdHRvbTogLTAuMWVtO1xcbn1cXG5cXG4udmlkZW8tanMgLnZqcy1zdWJzLWNhcHMtYnV0dG9uICsgLnZqcy1tZW51IC52anMtY2FwdGlvbnMtbWVudS1pdGVtIC52anMtbWVudS1pdGVtLXRleHQgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7XFxuICBmb250LWZhbWlseTogVmlkZW9KUztcXG4gIGNvbnRlbnQ6IFxcXCJcXFxcRjEwRFxcXCI7XFxuICBmb250LXNpemU6IDEuNWVtO1xcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XFxufVxcblxcbi52aWRlby1qcyAudmpzLWF1ZGlvLWJ1dHRvbiArIC52anMtbWVudSAudmpzLW1haW4tZGVzYy1tZW51LWl0ZW0gLnZqcy1tZW51LWl0ZW0tdGV4dCAudmpzLWljb24tcGxhY2Vob2xkZXIge1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIG1hcmdpbi1ib3R0b206IC0wLjFlbTtcXG59XFxuXFxuLnZpZGVvLWpzIC52anMtYXVkaW8tYnV0dG9uICsgLnZqcy1tZW51IC52anMtbWFpbi1kZXNjLW1lbnUtaXRlbSAudmpzLW1lbnUtaXRlbS10ZXh0IC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUge1xcbiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7XFxuICBjb250ZW50OiBcXFwiIFxcXFxGMTFEXFxcIjtcXG4gIGZvbnQtc2l6ZTogMS41ZW07XFxuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG59XFxuXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy1jdXJyZW50LXRpbWUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy10aW1lLWRpdmlkZXIsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy1kdXJhdGlvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC1zbWFsbCAudmpzLXJlbWFpbmluZy10aW1lLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtcGxheWJhY2stcmF0ZSxcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC1zbWFsbCAudmpzLWNoYXB0ZXJzLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC1zbWFsbCAudmpzLWRlc2NyaXB0aW9ucy1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy1jYXB0aW9ucy1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtc21hbGwgLnZqcy1zdWJ0aXRsZXMtYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtYXVkaW8tYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtdm9sdW1lLWNvbnRyb2wsIC52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy1jdXJyZW50LXRpbWUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLXRpbWUtZGl2aWRlcixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC14LXNtYWxsIC52anMtZHVyYXRpb24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLXJlbWFpbmluZy10aW1lLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy1wbGF5YmFjay1yYXRlLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy1jaGFwdGVycy1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLWRlc2NyaXB0aW9ucy1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLWNhcHRpb25zLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC14LXNtYWxsIC52anMtc3VidGl0bGVzLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC14LXNtYWxsIC52anMtYXVkaW8tYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy12b2x1bWUtY29udHJvbCwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLWN1cnJlbnQtdGltZSxcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtdGltZS1kaXZpZGVyLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXRpbnkgLnZqcy1kdXJhdGlvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtcmVtYWluaW5nLXRpbWUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLXBsYXliYWNrLXJhdGUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLWNoYXB0ZXJzLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtZGVzY3JpcHRpb25zLWJ1dHRvbixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtY2FwdGlvbnMtYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXRpbnkgLnZqcy1zdWJ0aXRsZXMtYnV0dG9uLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXRpbnkgLnZqcy1hdWRpby1idXR0b24sXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLXZvbHVtZS1jb250cm9sIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbDpob3ZlcixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC1zbWFsbCAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWw6YWN0aXZlLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXNtYWxsIC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbC52anMtc2xpZGVyLWFjdGl2ZSwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWw6aG92ZXIsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbCAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWw6YWN0aXZlLFxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsLnZqcy1zbGlkZXItYWN0aXZlLCAudmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbDpob3ZlcixcXG4udmlkZW8tanM6bm90KC52anMtZnVsbHNjcmVlbikudmpzLWxheW91dC10aW55IC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbDphY3RpdmUsXFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLXNsaWRlci1hY3RpdmUge1xcbiAgd2lkdGg6IGF1dG87XFxuICB3aWR0aDogaW5pdGlhbDtcXG59XFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbDpub3QoLnZqcy1saXZldWkpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbDpub3QoLnZqcy1saXZlKSAudmpzLXN1YnMtY2Fwcy1idXR0b24sIC52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXRpbnkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwudmpzLWxpdmV1aSAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciB7XFxuICBmbGV4OiBhdXRvO1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcbi52aWRlby1qczpub3QoLnZqcy1mdWxsc2NyZWVuKS52anMtbGF5b3V0LXgtc21hbGwudmpzLWxpdmV1aS52anMtbm8tZmxleCAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueS52anMtbm8tZmxleCAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciB7XFxuICB3aWR0aDogYXV0bztcXG59XFxuLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQteC1zbWFsbC52anMtbGl2ZXVpIC52anMtcHJvZ3Jlc3MtY29udHJvbCwgLnZpZGVvLWpzOm5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1sYXlvdXQtdGlueSAudmpzLXByb2dyZXNzLWNvbnRyb2wge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnZqcy1tb2RhbC1kaWFsb2cudmpzLXRleHQtdHJhY2stc2V0dGluZ3Mge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJCMzMzRjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43NSk7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGhlaWdodDogNzAlO1xcbn1cXG5cXG4udmpzLXRleHQtdHJhY2stc2V0dGluZ3MgLnZqcy1tb2RhbC1kaWFsb2ctY29udGVudCB7XFxuICBkaXNwbGF5OiB0YWJsZTtcXG59XFxuXFxuLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIC52anMtdHJhY2stc2V0dGluZ3MtY29sb3JzLFxcbi52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLXRyYWNrLXNldHRpbmdzLWZvbnQsXFxuLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIC52anMtdHJhY2stc2V0dGluZ3MtY29udHJvbHMge1xcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcXG59XFxuXFxuLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIC52anMtdHJhY2stc2V0dGluZ3MtY29udHJvbHMge1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xcbn1cXG5cXG5Ac3VwcG9ydHMgKGRpc3BsYXk6IGdyaWQpIHtcXG4gIC52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLW1vZGFsLWRpYWxvZy1jb250ZW50IHtcXG4gICAgZGlzcGxheTogZ3JpZDtcXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmcjtcXG4gICAgcGFkZGluZzogMjBweCAyNHB4IDBweCAyNHB4O1xcbiAgfVxcblxcbiAgLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyAudmpzLWRlZmF1bHQtYnV0dG9uIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gIH1cXG5cXG4gIC52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIHtcXG4gICAgZ3JpZC1jb2x1bW46IDEvLTE7XFxuICB9XFxuXFxuICAudmpzLWxheW91dC1zbWFsbCAudmpzLXRleHQtdHJhY2stc2V0dGluZ3MgLnZqcy1tb2RhbC1kaWFsb2ctY29udGVudCxcXG4udmpzLWxheW91dC14LXNtYWxsIC52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLW1vZGFsLWRpYWxvZy1jb250ZW50LFxcbi52anMtbGF5b3V0LXRpbnkgLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIC52anMtbW9kYWwtZGlhbG9nLWNvbnRlbnQge1xcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcXG4gIH1cXG59XFxuLnZqcy10cmFjay1zZXR0aW5nID4gc2VsZWN0IHtcXG4gIG1hcmdpbi1yaWdodDogMWVtO1xcbiAgbWFyZ2luLWJvdHRvbTogMC41ZW07XFxufVxcblxcbi52anMtdGV4dC10cmFjay1zZXR0aW5ncyBmaWVsZHNldCB7XFxuICBtYXJnaW46IDVweDtcXG4gIHBhZGRpbmc6IDNweDtcXG4gIGJvcmRlcjogbm9uZTtcXG59XFxuXFxuLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIGZpZWxkc2V0IHNwYW4ge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4udmpzLXRleHQtdHJhY2stc2V0dGluZ3MgZmllbGRzZXQgc3BhbiA+IHNlbGVjdCB7XFxuICBtYXgtd2lkdGg6IDcuM2VtO1xcbn1cXG5cXG4udmpzLXRleHQtdHJhY2stc2V0dGluZ3MgbGVnZW5kIHtcXG4gIGNvbG9yOiAjZmZmO1xcbiAgbWFyZ2luOiAwIDAgNXB4IDA7XFxufVxcblxcbi52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLWxhYmVsIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTtcXG4gIGNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiAwIDAgNXB4IDA7XFxuICBwYWRkaW5nOiAwO1xcbiAgYm9yZGVyOiAwO1xcbiAgaGVpZ2h0OiAxcHg7XFxuICB3aWR0aDogMXB4O1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyBidXR0b246Zm9jdXMsXFxuLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyBidXR0b246YWN0aXZlIHtcXG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xcbiAgb3V0bGluZS13aWR0aDogbWVkaXVtO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDBkZWcsICNmZmYgODglLCAjNzM4NTlmIDEwMCUpO1xcbn1cXG5cXG4udmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIGJ1dHRvbjpob3ZlciB7XFxuICBjb2xvcjogcmdiYSg0MywgNTEsIDYzLCAwLjc1KTtcXG59XFxuXFxuLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyBidXR0b24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgtMTgwZGVnLCAjZmZmIDg4JSwgIzczODU5ZiAxMDAlKTtcXG4gIGNvbG9yOiAjMkIzMzNGO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xcbn1cXG5cXG4udmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIC52anMtZGVmYXVsdC1idXR0b24ge1xcbiAgbWFyZ2luLXJpZ2h0OiAxZW07XFxufVxcblxcbkBtZWRpYSBwcmludCB7XFxuICAudmlkZW8tanMgPiAqOm5vdCgudmpzLXRlY2gpOm5vdCgudmpzLXBvc3Rlcikge1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICB9XFxufVxcbi52anMtcmVzaXplLW1hbmFnZXIge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgei1pbmRleDogLTEwMDA7XFxufVxcblxcbi5qcy1mb2N1cy12aXNpYmxlIC52aWRlby1qcyAqOmZvY3VzOm5vdCguZm9jdXMtdmlzaWJsZSkge1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxufVxcblxcbi52aWRlby1qcyAqOmZvY3VzOm5vdCg6Zm9jdXMtdmlzaWJsZSksXFxuLnZpZGVvLWpzIC52anMtbWVudSAqOmZvY3VzOm5vdCg6Zm9jdXMtdmlzaWJsZSkge1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxufVxcblwiLCBcIlwiXSk7XG5cbi8vIGV4cG9ydHNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&":
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=style&index=0&lang=scss& ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var escape = __webpack_require__(/*! ../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis {\\n  background-repeat: no-repeat;\\n  background-size: 100% 100%;\\n}\\n.fl {\\n  display: flex;\\n}\\n.flc {\\n  display: flex;\\n  justify-content: center;\\n}\\n.flb {\\n  display: flex;\\n  justify-content: space-between;\\n}\\n.fla {\\n  display: flex;\\n  align-items: center;\\n}\\n.fcc {\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n}\\n.bb, .alert, .ipt-wrap .ipt {\\n  box-sizing: border-box;\\n}\\n.fullp {\\n  width: 100%;\\n  height: 100%;\\n}\\n.pointer {\\n  cursor: pointer;\\n}\\n.text-l {\\n  text-align: left;\\n}\\n.text-r {\\n  text-align: right;\\n}\\n.text-c {\\n  text-align: center;\\n}\\n.bc {\\n  text-align: center;\\n}\\n.flex1 {\\n  flex: 1;\\n}\\n.disabled {\\n  cursor: default !important;\\n  color: #4c4948 !important;\\n  background-color: #dcdddd !important;\\n  background-image: none !important;\\n  box-shadow: none !important;\\n}\\n.cOrange {\\n  color: #f05a23;\\n}\\n.cGreen {\\n  color: #006441;\\n}\\n.cGray {\\n  color: #bfbfbf;\\n}\\n.cDark {\\n  color: #dcdcdc;\\n}\\n.alert {\\n  display: flex;\\n  align-items: center;\\n  position: relative;\\n  width: 100%;\\n  border-radius: 10px;\\n  border: solid 1px #dcdddd;\\n  background-color: #f2f2f2;\\n  margin: 0 auto 12px;\\n  padding: 6px 36px;\\n}\\n.alert .icon {\\n    margin-right: 5px;\\n    display: inline-block;\\n}\\n.alert .btn {\\n    color: #f05a23;\\n}\\n.alert .close {\\n    position: absolute;\\n    right: 17px;\\n}\\n.ipt-wrap .ipt {\\n  width: 100%;\\n  height: 4.5rem;\\n  border-radius: 4.5rem;\\n  border: solid 1px #dcdddd !important;\\n  background-color: #ffffff;\\n  padding: 0 2rem;\\n  flex: 1;\\n  letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow {\\n  position: absolute;\\n  top: 2.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n  width: 1rem;\\n  height: .666667rem;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye {\\n  position: absolute;\\n  top: 1.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n  width: 27px;\\n  height: 24px;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye-act {\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt:focus {\\n  border-color: #f05a23 !important;\\n}\\n.ipt.err {\\n  border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet {\\n  width: 1rem !important;\\n  height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active {\\n  background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert {\\n    padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n  font-family: 'iconfont';\\n  src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont {\\n  font-family: 'iconfont' !important;\\n  font-size: 16px;\\n  font-style: normal;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh:before {\\n  content: '\\\\E874';\\n}\\n.iconempty:before {\\n  content: '\\\\E6A6';\\n}\\n.iconclose:before {\\n  content: '\\\\E849';\\n}\\nhtml {\\n  font-family: \\\"Microsoft YaHei\\\", \\\"Arial\\\";\\n  font-size: 12px;\\n  word-spacing: 1px;\\n  word-break: break-word;\\n  text-rendering: optimizeLegibility;\\n  color: #4c4948;\\n  background-color: #ffffff;\\n  box-sizing: border-box;\\n}\\nbody {\\n  font-size: 14px;\\n}\\nhtml,\\nbody {\\n  -webkit-text-size-adjust: none;\\n}\\nbody,\\ndiv {\\n  border: 0;\\n  margin: 0;\\n  padding: 0;\\n}\\n*,\\n*:before,\\n*:after {\\n  box-sizing: border-box;\\n  margin: 0;\\n}\\nbody,\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6,\\nhr,\\np,\\nblockquote,\\ndl,\\ndt,\\ndd,\\nul,\\nol,\\nli,\\npre,\\nform,\\nfieldset,\\nlegend,\\nbutton,\\ninput,\\ntextarea,\\nth,\\ntd,\\niframe {\\n  margin: 0;\\n  padding: 0;\\n}\\nimg,\\narticle,\\naside,\\ndetails,\\nfigcaption,\\nfigure,\\nfooter,\\nheader,\\nmenu,\\nnav,\\nsection,\\nsummary,\\ntime,\\nmark,\\naudio,\\nvideo {\\n  display: block;\\n  margin: 0;\\n  padding: 0;\\n}\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n  font-size: 100%;\\n}\\nfieldset,\\nimg {\\n  border: 0;\\n}\\naddress,\\ncaption,\\ncite,\\ndfn,\\nem,\\nth,\\nvar,\\ni,\\nem {\\n  font-style: normal;\\n  font-weight: normal;\\n}\\nol,\\nul {\\n  list-style: none;\\n}\\na {\\n  text-decoration: none;\\n  color: inherit;\\n}\\na:hover {\\n    text-decoration: none;\\n}\\na,\\nlabel,\\nbutton,\\ninput,\\nselect {\\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\ninput,\\nselect,\\nbutton {\\n  vertical-align: baseline;\\n  border-radius: 0;\\n  background-color: transparent;\\n}\\nselect {\\n  outline: none;\\n  -webkit-appearance: none;\\n  -moz-appearance: none;\\n}\\nselect::-ms-expand {\\n  display: none;\\n}\\ninput {\\n  background: none;\\n  outline: none;\\n  border: none;\\n}\\nbutton::-moz-focus-inner,\\ninput,\\ninput[type=\\\"reset\\\"]::-moz-focus-inner,\\ninput[type=\\\"button\\\"]::-moz-focus-inner,\\ninput[type=\\\"submit\\\"]::-moz-focus-inner,\\ninput[type=\\\"file\\\"] > input[type=\\\"button\\\"]::-moz-focus-inner {\\n  border: none;\\n}\\ninput[type=\\\"checkbox\\\"],\\ninput[type=\\\"radio\\\"] {\\n  vertical-align: middle;\\n}\\ninput[type=\\\"number\\\"]::-webkit-outer-spin-button,\\ninput[type=\\\"number\\\"]::-webkit-inner-spin-button {\\n  -webkit-appearance: none !important;\\n  -moz-appearance: none !important;\\n  margin: 0;\\n}\\ninput:-webkit-autofill {\\n  -webkit-box-shadow: 0 0 0 1000px white inset;\\n}\\ninput[type=\\\"search\\\"],\\ninput[type=\\\"tel\\\"],\\ninput[type=\\\"text\\\"],\\ninput {\\n  -webkit-appearance: none;\\n  /*去除系统默认的样式*/\\n  -webkit-box-sizing: content-box;\\n  font-size: 100%;\\n  box-sizing: border-box;\\n}\\ninput::-webkit-search-decoration,\\ninput::-webkit-search-cancel-button {\\n  display: none;\\n}\\n::-webkit-input-placeholder {\\n  color: #bfbfbf;\\n  opacity: 1;\\n}\\n:-moz-placeholder {\\n  color: #bfbfbf;\\n  opacity: 1;\\n}\\n::-moz-placeholder {\\n  color: #bfbfbf;\\n  opacity: 1;\\n}\\n:-ms-input-placeholder {\\n  color: #bfbfbf;\\n  opacity: 1;\\n}\\nselect,\\ninput,\\noption {\\n  color: #333333;\\n}\\ntextarea {\\n  outline: none;\\n  border-radius: 0;\\n  -webkit-appearance: none;\\n  -moz-appearance: none;\\n  overflow: auto;\\n  resize: none;\\n  color: #333333;\\n}\\n#app {\\n  border: 0;\\n  margin: 0;\\n  padding: 0;\\n}\\n.main-container {\\n  position: relative;\\n  margin: 0 auto;\\n  width: 100%;\\n}\\n.main-container::after {\\n    display: table;\\n    content: \\\"\\\";\\n    clear: both;\\n}\\n.content {\\n  max-width: 1200px;\\n  width: 100%;\\n  margin: 0 auto;\\n}\\n.box-w {\\n  max-width: 1200px;\\n  width: 100%;\\n  margin: 0 auto;\\n}\\n.box {\\n  max-width: 1200px;\\n  width: 100%;\\n  margin: 0 auto;\\n}\\n.m-width {\\n  box-sizing: border-box;\\n  padding: 0 4%;\\n}\\n.focus {\\n  border: 1px solid #f05a23;\\n}\\n.video-js {\\n  background-color: transparent !important;\\n  border-radius: 5px;\\n}\\n.video-js .vjs-tech,\\n.video-js .vjs-poster {\\n  border-radius: 5px;\\n}\\n.video-js .vjs-big-play-button {\\n  top: 0 !important;\\n  bottom: 0 !important;\\n  left: 0 !important;\\n  right: 0 !important;\\n  margin: auto !important;\\n}\\n.video-js .vjs-slider {\\n  background-color: #f05a23 !important;\\n}\\n.video-js .vjs-poster {\\n  background-color: transparent !important;\\n}\\n.v-header .van-cell {\\n  padding: 16px 16px !important;\\n}\\n.v-header .van-collapse-item__content {\\n  padding: 0;\\n}\\n.v-header .van-cell:not(:last-child)::after {\\n  left: 0;\\n}\\n@media (max-width: 1200px) {\\n.page-index .video-js {\\n    width: 100% !important;\\n    max-width: 100% !important;\\n}\\n#app .header {\\n    position: fixed;\\n    width: 100%;\\n}\\n#app .main-container {\\n    padding-top: 72px;\\n}\\n}\\n@media (max-width: 768px) {\\n.main-container {\\n    margin-bottom: 20px;\\n}\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT9iZjcwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBlc2NhcGUgPSByZXF1aXJlKFwiLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL3VybC9lc2NhcGUuanNcIik7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKGZhbHNlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIkBjaGFyc2V0IFxcXCJVVEYtOFxcXCI7XFxuLyoqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICog5pSv5oyB5paH5Lu2XFxuICog6ZyA6KaB5byV55So55qE5Zyw5pa55Z2H6ZyA6KaB5Yqg5LiK6L+Z5Liq5pSv5oyB5paH5Lu2XFxuICpcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIFNhc3MgTWlueGluc1xcbiAqXFxuICog5Y+C6ICD5pS26ZuG77yaXFxuICogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwLXNhc3MvdHJlZS9tYXN0ZXIvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnNcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIFNhc3Mg5Y+Y6YePXFxuICpcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi5iaXMge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmwge1xcbiAgZGlzcGxheTogZmxleDtcXG59XFxuLmZsYyB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcbi5mbGIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmZjYyB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uYmIsIC5hbGVydCwgLmlwdC13cmFwIC5pcHQge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuLmZ1bGxwIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4ucG9pbnRlciB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi50ZXh0LWwge1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG59XFxuLnRleHQtciB7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG59XFxuLnRleHQtYyB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5iYyB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5mbGV4MSB7XFxuICBmbGV4OiAxO1xcbn1cXG4uZGlzYWJsZWQge1xcbiAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XFxuICBjb2xvcjogIzRjNDk0OCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xcbn1cXG4uY09yYW5nZSB7XFxuICBjb2xvcjogI2YwNWEyMztcXG59XFxuLmNHcmVlbiB7XFxuICBjb2xvcjogIzAwNjQ0MTtcXG59XFxuLmNHcmF5IHtcXG4gIGNvbG9yOiAjYmZiZmJmO1xcbn1cXG4uY0Rhcmsge1xcbiAgY29sb3I6ICNkY2RjZGM7XFxufVxcbi5hbGVydCB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyO1xcbiAgbWFyZ2luOiAwIGF1dG8gMTJweDtcXG4gIHBhZGRpbmc6IDZweCAzNnB4O1xcbn1cXG4uYWxlcnQgLmljb24ge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uYWxlcnQgLmJ0biB7XFxuICAgIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4uYWxlcnQgLmNsb3NlIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogMTdweDtcXG59XFxuLmlwdC13cmFwIC5pcHQge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDQuNXJlbTtcXG4gIGJvcmRlci1yYWRpdXM6IDQuNXJlbTtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQgIWltcG9ydGFudDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICBwYWRkaW5nOiAwIDJyZW07XFxuICBmbGV4OiAxO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMXJlbTtcXG59XFxuLmlwdC13cmFwIC5kb3duLWFycm93IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMi4ycmVtO1xcbiAgcmlnaHQ6IDJyZW07XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vZG93bi1hcnJvdy5wbmdcIikpICsgXCIpO1xcbiAgd2lkdGg6IDFyZW07XFxuICBoZWlnaHQ6IC42NjY2NjdyZW07XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLmlwdC13cmFwIC5leWUge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAxLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb2ZmLnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMjdweDtcXG4gIGhlaWdodDogMjRweDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZS1hY3Qge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2ljb24tZXllcy1vbi5wbmdcIikpICsgXCIpO1xcbn1cXG4uaXB0OmZvY3VzIHtcXG4gIGJvcmRlci1jb2xvcjogI2YwNWEyMyAhaW1wb3J0YW50O1xcbn1cXG4uaXB0LmVyciB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCB7XFxuICB3aWR0aDogMXJlbSAhaW1wb3J0YW50O1xcbiAgaGVpZ2h0OiAxcmVtICFpbXBvcnRhbnQ7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlIHtcXG4gIGJhY2tncm91bmQ6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XFxuLmFsZXJ0IHtcXG4gICAgcGFkZGluZzogNHB4IDM2cHggNHB4IDEycHg7XFxufVxcbn1cXG5cXG4vKiDlm77niYflrZfkvZMgKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnO1xcbiAgc3JjOiB1cmwoXFxcImRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFBU0VBQXNBQUFBQUNTQUFBQVEzQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIRUlHVmdDRFNBcUZHSVFuQVRZQ0pBTVlDdzRBQkNBRmhHMEhWQnZaQnhHVm5OdklmaHpZRFYrQkFlOXd0SmlHT05UR1l1SEJaL09oNzdRM094dXBJdE9lRkZUY1FqcFJYd0srQUlibjA4bmU3NjZYcHBzaXdSS1Brc1FUajdBTzR4QU92M2ZPQWRzSmMwS05aTzNJbzg5TGY4SzlCa1krY2UrNGRmNERtcyt5WE1hY05OYkVBT09BQXRyYkYxbUJ4QWxxeS9EcTh1cXdyZ01CaVBHQUQ0ZzZkYmdHUWhTc2VRUkFLc3RLOGlGTW1GQVZCTUhTZHNGV0Zwa05IaFl6aGJrRVlKYjNlZklHUVVRSURDYUZ0WFEwbDFLRWhPZktWK0cwMTlBcnk3R2diemdIQUdFWFVJQVBBQlpJWjZHckdUU0krb0JpYTcvQTRnVkFpb1dCZXE1OHZ2SGxrSmVOcjhJTkJoSXl5MGR3d1Y4ZXNKZzRNQkFnZkdDVmxLVU5qL0hndVpJYXdHcnFqWmdMUEhnNXhBQ0sxWTJZQ3d5OENwZGNsbzQvWUlNSWNCTEFOWmg5WUdrSVBIdGEyTm9yVEt4VVNsVU5WN0tvejJ6c3dvMG1SZk5OUnM5ZmJGcThZSnI1dUVYTFdvN2NFZCs2cGJsOVczdjNyajRnN3R6UnBVKzdIYXVSMFlibUoyK2RhbExFTFp5NnVkZTB1R2grNzVacDVpWEZDeFpNVzJRKzBJUU9Lc2E3U01KSUtIMThoM3k5aFdZK21ONHRFdFcwYllUMm1lbVdwazFkYjdMODF0UTdkZ3MzaXNVYnQxcnJsMGtVMHl5MVN6YTdaQ3cwbTRsQ0l6Rk1GMnd3MTUrUXAxdTQzc1JrL2hKVDdZSk41dWFMbHVvbFBaU1R2cTFtNHZtYmdSN3ZlTTExNk9qQkdwMksyMW9NYmtSR252cWdsbkNMVmhhcnVBTTZnbCt0b1ROWVBaczVkb3laRFh5SGJ4L1JTdlpNdDZ0TnR4N1JsemtXbGN5c1dReVNWMkkrUGlvMDA4TnA4bVF2TC9qMENFVkxMSUl0bG9pRUlQSUZuQ0JETjdacEM2bjNpL2VyRTB1WElDVC90KzI2OXJWcmp4NGRlK3dyd3luZmpvMUJhTi90WFFtekozd0lGOWtyZ2hVSHFOMWVGQjRmTXZ1Q1JPcm52Vndka1VlV0xmZjJrNzBJaU84ZnMyeU9hYlhwSEhkbHZYK0E1cm1LNmR4NHBpWGxiSHVuaWIraU5lVk0rVW5YRnZXWmpSMnVsZVZGL2pzYksxMndvOE9XRHBZK1RSSDBqUDhzeUxzMFdJbE9BSURoRkhPUCtnSUExVEYza0NPQk9jYmFqOUZqZ1lDSjk3Q0VGdnd0MzVHZktaMllxNGo1SmlHVXNBQytKdXU3c2FTWmF2REsxV2dzL2plYWFnQi9RMFdVc3VZdXRUT2RJS0RsbVRMaEFUYTAzTXNrTjArRzB0MXZjanlFVENNTUFyWTRDTG1RaXVhRFNTSUVUU2dlbTdkQnUwL0c2bzJSRWdHZUppQVFTcnZBa0RzS1N1a3lpYVU5Qm8rWmQrQlRaZ3d4WGRaSFNyakZybzRab3FLbGdqK1ZTZTRVc2RhVlgzaURmZ2VSNDFLUDhVSXVOa0NCZmdIcHhCVWQ4aEFyR2o3NjBGZ1ZjWmtqcGFMYkVBSlRiV1lIV1RlbHRmYU52ejlYOUtKTkljZkJTcklNaEFwYXBNQWZLU094am5KNlY2dk0rMjlBZXd1RVhORlI0MzJCckxDRGswQitBaHFRcnFxdVVjZWxqRzd3b1IwMHFoUTdpNU94aUtSaUJ3U0lNbEpiUE1rQnFkb283UkR1TmZ5WmJseFQxV1o2VGJ6TGZiQlo1M1FZUWdsTGVJUlBCQkI5aFBUSEg5b0xNaFE1cjVpcERGd3dNUnd4UmV6cmZ6QUFBQT09XFxcIikgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO1xcbn1cXG4uaWNvbmZvbnQge1xcbiAgZm9udC1mYW1pbHk6ICdpY29uZm9udCcgIWltcG9ydGFudDtcXG4gIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG59XFxuLmljb25yZWZyZXNoOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU4NzQnO1xcbn1cXG4uaWNvbmVtcHR5OmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU2QTYnO1xcbn1cXG4uaWNvbmNsb3NlOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU4NDknO1xcbn1cXG5odG1sIHtcXG4gIGZvbnQtZmFtaWx5OiBcXFwiTWljcm9zb2Z0IFlhSGVpXFxcIiwgXFxcIkFyaWFsXFxcIjtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIHdvcmQtc3BhY2luZzogMXB4O1xcbiAgd29yZC1icmVhazogYnJlYWstd29yZDtcXG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XFxuICBjb2xvcjogIzRjNDk0ODtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5ib2R5IHtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuaHRtbCxcXG5ib2R5IHtcXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogbm9uZTtcXG59XFxuYm9keSxcXG5kaXYge1xcbiAgYm9yZGVyOiAwO1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMDtcXG59XFxuKixcXG4qOmJlZm9yZSxcXG4qOmFmdGVyIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBtYXJnaW46IDA7XFxufVxcbmJvZHksXFxuaDEsXFxuaDIsXFxuaDMsXFxuaDQsXFxuaDUsXFxuaDYsXFxuaHIsXFxucCxcXG5ibG9ja3F1b3RlLFxcbmRsLFxcbmR0LFxcbmRkLFxcbnVsLFxcbm9sLFxcbmxpLFxcbnByZSxcXG5mb3JtLFxcbmZpZWxkc2V0LFxcbmxlZ2VuZCxcXG5idXR0b24sXFxuaW5wdXQsXFxudGV4dGFyZWEsXFxudGgsXFxudGQsXFxuaWZyYW1lIHtcXG4gIG1hcmdpbjogMDtcXG4gIHBhZGRpbmc6IDA7XFxufVxcbmltZyxcXG5hcnRpY2xlLFxcbmFzaWRlLFxcbmRldGFpbHMsXFxuZmlnY2FwdGlvbixcXG5maWd1cmUsXFxuZm9vdGVyLFxcbmhlYWRlcixcXG5tZW51LFxcbm5hdixcXG5zZWN0aW9uLFxcbnN1bW1hcnksXFxudGltZSxcXG5tYXJrLFxcbmF1ZGlvLFxcbnZpZGVvIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMDtcXG59XFxuaDEsXFxuaDIsXFxuaDMsXFxuaDQsXFxuaDUsXFxuaDYge1xcbiAgZm9udC1zaXplOiAxMDAlO1xcbn1cXG5maWVsZHNldCxcXG5pbWcge1xcbiAgYm9yZGVyOiAwO1xcbn1cXG5hZGRyZXNzLFxcbmNhcHRpb24sXFxuY2l0ZSxcXG5kZm4sXFxuZW0sXFxudGgsXFxudmFyLFxcbmksXFxuZW0ge1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxub2wsXFxudWwge1xcbiAgbGlzdC1zdHlsZTogbm9uZTtcXG59XFxuYSB7XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICBjb2xvcjogaW5oZXJpdDtcXG59XFxuYTpob3ZlciB7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG59XFxuYSxcXG5sYWJlbCxcXG5idXR0b24sXFxuaW5wdXQsXFxuc2VsZWN0IHtcXG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcXG59XFxuaW5wdXQsXFxuc2VsZWN0LFxcbmJ1dHRvbiB7XFxuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XFxuICBib3JkZXItcmFkaXVzOiAwO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcbnNlbGVjdCB7XFxuICBvdXRsaW5lOiBub25lO1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xcbn1cXG5zZWxlY3Q6Oi1tcy1leHBhbmQge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuaW5wdXQge1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIG91dGxpbmU6IG5vbmU7XFxuICBib3JkZXI6IG5vbmU7XFxufVxcbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcXG5pbnB1dCxcXG5pbnB1dFt0eXBlPVxcXCJyZXNldFxcXCJdOjotbW96LWZvY3VzLWlubmVyLFxcbmlucHV0W3R5cGU9XFxcImJ1dHRvblxcXCJdOjotbW96LWZvY3VzLWlubmVyLFxcbmlucHV0W3R5cGU9XFxcInN1Ym1pdFxcXCJdOjotbW96LWZvY3VzLWlubmVyLFxcbmlucHV0W3R5cGU9XFxcImZpbGVcXFwiXSA+IGlucHV0W3R5cGU9XFxcImJ1dHRvblxcXCJdOjotbW96LWZvY3VzLWlubmVyIHtcXG4gIGJvcmRlcjogbm9uZTtcXG59XFxuaW5wdXRbdHlwZT1cXFwiY2hlY2tib3hcXFwiXSxcXG5pbnB1dFt0eXBlPVxcXCJyYWRpb1xcXCJdIHtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxufVxcbmlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLFxcbmlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgLW1vei1hcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XFxuICBtYXJnaW46IDA7XFxufVxcbmlucHV0Oi13ZWJraXQtYXV0b2ZpbGwge1xcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMCAxMDAwcHggd2hpdGUgaW5zZXQ7XFxufVxcbmlucHV0W3R5cGU9XFxcInNlYXJjaFxcXCJdLFxcbmlucHV0W3R5cGU9XFxcInRlbFxcXCJdLFxcbmlucHV0W3R5cGU9XFxcInRleHRcXFwiXSxcXG5pbnB1dCB7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICAvKuWOu+mZpOezu+e7n+m7mOiupOeahOagt+W8jyovXFxuICAtd2Via2l0LWJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xcbiAgZm9udC1zaXplOiAxMDAlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuaW5wdXQ6Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24sXFxuaW5wdXQ6Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24ge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcXG4gIGNvbG9yOiAjYmZiZmJmO1xcbiAgb3BhY2l0eTogMTtcXG59XFxuOi1tb3otcGxhY2Vob2xkZXIge1xcbiAgY29sb3I6ICNiZmJmYmY7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG46Oi1tb3otcGxhY2Vob2xkZXIge1xcbiAgY29sb3I6ICNiZmJmYmY7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG46LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcXG4gIGNvbG9yOiAjYmZiZmJmO1xcbiAgb3BhY2l0eTogMTtcXG59XFxuc2VsZWN0LFxcbmlucHV0LFxcbm9wdGlvbiB7XFxuICBjb2xvcjogIzMzMzMzMztcXG59XFxudGV4dGFyZWEge1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGJvcmRlci1yYWRpdXM6IDA7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XFxuICBvdmVyZmxvdzogYXV0bztcXG4gIHJlc2l6ZTogbm9uZTtcXG4gIGNvbG9yOiAjMzMzMzMzO1xcbn1cXG4jYXBwIHtcXG4gIGJvcmRlcjogMDtcXG4gIG1hcmdpbjogMDtcXG4gIHBhZGRpbmc6IDA7XFxufVxcbi5tYWluLWNvbnRhaW5lciB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBtYXJnaW46IDAgYXV0bztcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG4ubWFpbi1jb250YWluZXI6OmFmdGVyIHtcXG4gICAgZGlzcGxheTogdGFibGU7XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgICBjbGVhcjogYm90aDtcXG59XFxuLmNvbnRlbnQge1xcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1hcmdpbjogMCBhdXRvO1xcbn1cXG4uYm94LXcge1xcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1hcmdpbjogMCBhdXRvO1xcbn1cXG4uYm94IHtcXG4gIG1heC13aWR0aDogMTIwMHB4O1xcbiAgd2lkdGg6IDEwMCU7XFxuICBtYXJnaW46IDAgYXV0bztcXG59XFxuLm0td2lkdGgge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHBhZGRpbmc6IDAgNCU7XFxufVxcbi5mb2N1cyB7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjZjA1YTIzO1xcbn1cXG4udmlkZW8tanMge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcXG4gIGJvcmRlci1yYWRpdXM6IDVweDtcXG59XFxuLnZpZGVvLWpzIC52anMtdGVjaCxcXG4udmlkZW8tanMgLnZqcy1wb3N0ZXIge1xcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xcbn1cXG4udmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b24ge1xcbiAgdG9wOiAwICFpbXBvcnRhbnQ7XFxuICBib3R0b206IDAgIWltcG9ydGFudDtcXG4gIGxlZnQ6IDAgIWltcG9ydGFudDtcXG4gIHJpZ2h0OiAwICFpbXBvcnRhbnQ7XFxuICBtYXJnaW46IGF1dG8gIWltcG9ydGFudDtcXG59XFxuLnZpZGVvLWpzIC52anMtc2xpZGVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLnZpZGVvLWpzIC52anMtcG9zdGVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XFxufVxcbi52LWhlYWRlciAudmFuLWNlbGwge1xcbiAgcGFkZGluZzogMTZweCAxNnB4ICFpbXBvcnRhbnQ7XFxufVxcbi52LWhlYWRlciAudmFuLWNvbGxhcHNlLWl0ZW1fX2NvbnRlbnQge1xcbiAgcGFkZGluZzogMDtcXG59XFxuLnYtaGVhZGVyIC52YW4tY2VsbDpub3QoOmxhc3QtY2hpbGQpOjphZnRlciB7XFxuICBsZWZ0OiAwO1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7XFxuLnBhZ2UtaW5kZXggLnZpZGVvLWpzIHtcXG4gICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcbiNhcHAgLmhlYWRlciB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcbiNhcHAgLm1haW4tY29udGFpbmVyIHtcXG4gICAgcGFkZGluZy10b3A6IDcycHg7XFxufVxcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXG4ubWFpbi1jb250YWluZXIge1xcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbn1cXG59XFxuXCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&":
/*!********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& ***!
  \********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var escape = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-3b4f35af] {\\n  background-repeat: no-repeat;\\n  background-size: 100% 100%;\\n}\\n.fl[data-v-3b4f35af] {\\n  display: flex;\\n}\\n.flc[data-v-3b4f35af] {\\n  display: flex;\\n  justify-content: center;\\n}\\n.flb[data-v-3b4f35af] {\\n  display: flex;\\n  justify-content: space-between;\\n}\\n.fla[data-v-3b4f35af] {\\n  display: flex;\\n  align-items: center;\\n}\\n.fcc[data-v-3b4f35af] {\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n}\\n.bb[data-v-3b4f35af], .alert[data-v-3b4f35af], .ipt-wrap .ipt[data-v-3b4f35af] {\\n  box-sizing: border-box;\\n}\\n.fullp[data-v-3b4f35af] {\\n  width: 100%;\\n  height: 100%;\\n}\\n.pointer[data-v-3b4f35af] {\\n  cursor: pointer;\\n}\\n.text-l[data-v-3b4f35af] {\\n  text-align: left;\\n}\\n.text-r[data-v-3b4f35af] {\\n  text-align: right;\\n}\\n.text-c[data-v-3b4f35af] {\\n  text-align: center;\\n}\\n.bc[data-v-3b4f35af] {\\n  text-align: center;\\n}\\n.flex1[data-v-3b4f35af] {\\n  flex: 1;\\n}\\n.disabled[data-v-3b4f35af] {\\n  cursor: default !important;\\n  color: #4c4948 !important;\\n  background-color: #dcdddd !important;\\n  background-image: none !important;\\n  box-shadow: none !important;\\n}\\n.cOrange[data-v-3b4f35af] {\\n  color: #f05a23;\\n}\\n.cGreen[data-v-3b4f35af] {\\n  color: #006441;\\n}\\n.cGray[data-v-3b4f35af] {\\n  color: #bfbfbf;\\n}\\n.cDark[data-v-3b4f35af] {\\n  color: #dcdcdc;\\n}\\n.alert[data-v-3b4f35af] {\\n  display: flex;\\n  align-items: center;\\n  position: relative;\\n  width: 100%;\\n  border-radius: 10px;\\n  border: solid 1px #dcdddd;\\n  background-color: #f2f2f2;\\n  margin: 0 auto 12px;\\n  padding: 6px 36px;\\n}\\n.alert .icon[data-v-3b4f35af] {\\n    margin-right: 5px;\\n    display: inline-block;\\n}\\n.alert .btn[data-v-3b4f35af] {\\n    color: #f05a23;\\n}\\n.alert .close[data-v-3b4f35af] {\\n    position: absolute;\\n    right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-3b4f35af] {\\n  width: 100%;\\n  height: 4.5rem;\\n  border-radius: 4.5rem;\\n  border: solid 1px #dcdddd !important;\\n  background-color: #ffffff;\\n  padding: 0 2rem;\\n  flex: 1;\\n  letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-3b4f35af] {\\n  position: absolute;\\n  top: 2.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n  width: 1rem;\\n  height: .666667rem;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye[data-v-3b4f35af] {\\n  position: absolute;\\n  top: 1.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n  width: 27px;\\n  height: 24px;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-3b4f35af] {\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-3b4f35af]:focus {\\n  border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-3b4f35af] {\\n  border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-3b4f35af] {\\n  width: 1rem !important;\\n  height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-3b4f35af] {\\n  background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-3b4f35af] {\\n    padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n  font-family: 'iconfont';\\n  src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-3b4f35af] {\\n  font-family: 'iconfont' !important;\\n  font-size: 16px;\\n  font-style: normal;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-3b4f35af]:before {\\n  content: '\\\\E874';\\n}\\n.iconempty[data-v-3b4f35af]:before {\\n  content: '\\\\E6A6';\\n}\\n.iconclose[data-v-3b4f35af]:before {\\n  content: '\\\\E849';\\n}\\n.drop-list[data-v-3b4f35af] {\\n  display: inline-block;\\n  min-width: 10rem;\\n  position: relative;\\n  margin: 0 1rem;\\n  font-size: 16px;\\n}\\n.drop-list .list[data-v-3b4f35af] {\\n    position: absolute;\\n    width: 110%;\\n    left: 0;\\n    right: 0;\\n    margin: 0 auto;\\n    font-size: 14px;\\n}\\n.drop-list .list .space[data-v-3b4f35af] {\\n      height: 1.5rem;\\n}\\n.drop-list span[data-v-3b4f35af] {\\n    display: block;\\n    text-align: center;\\n}\\n.drop-list ul[data-v-3b4f35af] {\\n    display: none;\\n    overflow: hidden;\\n    box-shadow: 0 0 1.5rem 0 rgba(255, 87, 0, 0.15);\\n    border-radius: .5rem;\\n}\\n.drop-list ul li[data-v-3b4f35af] {\\n      background: #ffffff;\\n      text-align: center;\\n      padding: 1.5rem 0;\\n      position: relative;\\n}\\n.drop-list ul li[data-v-3b4f35af]:after {\\n        content: \\\"\\\";\\n        width: 7rem;\\n        height: 1px;\\n        background: #f1f1f1;\\n        position: absolute;\\n        bottom: 0;\\n        left: 50%;\\n        transform: translateX(-50%);\\n}\\n.drop-list ul li[data-v-3b4f35af]:last-child {\\n      border-bottom: none;\\n}\\n.drop-list ul li[data-v-3b4f35af]:last-child:after {\\n        background: transparent;\\n}\\n.drop-list ul li[data-v-3b4f35af]:hover {\\n      color: #f05a23;\\n}\\n.user[data-v-3b4f35af] {\\n  width: 9.25rem;\\n  height: 3rem;\\n  border-radius: 3rem;\\n  background-color: #f05a23;\\n  display: flex;\\n  align-items: center;\\n  justify-content: center;\\n  color: #ffffff;\\n  margin: 0 auto;\\n}\\n.user span[data-v-3b4f35af] {\\n    max-width: 4.25rem;\\n    overflow: hidden;\\n    white-space: nowrap;\\n    text-overflow: ellipsis;\\n}\\n.user .icon-img[data-v-3b4f35af] {\\n    margin: 0 .5rem;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT83NGE4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBlc2NhcGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL3VybC9lc2NhcGUuanNcIik7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKGZhbHNlKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIkBjaGFyc2V0IFxcXCJVVEYtOFxcXCI7XFxuLyoqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICog5pSv5oyB5paH5Lu2XFxuICog6ZyA6KaB5byV55So55qE5Zyw5pa55Z2H6ZyA6KaB5Yqg5LiK6L+Z5Liq5pSv5oyB5paH5Lu2XFxuICpcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIFNhc3MgTWlueGluc1xcbiAqXFxuICog5Y+C6ICD5pS26ZuG77yaXFxuICogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwLXNhc3MvdHJlZS9tYXN0ZXIvYXNzZXRzL3N0eWxlc2hlZXRzL2Jvb3RzdHJhcC9taXhpbnNcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIFNhc3Mg5Y+Y6YePXFxuICpcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKlxcbiAqL1xcbi5iaXNbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbiAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7XFxufVxcbi5mbFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxufVxcbi5mbGNbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcbi5mbGJbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbn1cXG4uZmxhW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcbi5mY2NbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uYmJbZGF0YS12LTNiNGYzNWFmXSwgLmFsZXJ0W2RhdGEtdi0zYjRmMzVhZl0sIC5pcHQtd3JhcCAuaXB0W2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuLmZ1bGxwW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcbi5wb2ludGVyW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4udGV4dC1sW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG59XFxuLnRleHQtcltkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcbn1cXG4udGV4dC1jW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uYmNbZGF0YS12LTNiNGYzNWFmXSB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5mbGV4MVtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGZsZXg6IDE7XFxufVxcbi5kaXNhYmxlZFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xcbiAgY29sb3I6ICM0YzQ5NDggIWltcG9ydGFudDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkY2RkZGQgIWltcG9ydGFudDtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmUgIWltcG9ydGFudDtcXG4gIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcXG59XFxuLmNPcmFuZ2VbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBjb2xvcjogI2YwNWEyMztcXG59XFxuLmNHcmVlbltkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGNvbG9yOiAjMDA2NDQxO1xcbn1cXG4uY0dyYXlbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBjb2xvcjogI2JmYmZiZjtcXG59XFxuLmNEYXJrW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgY29sb3I6ICNkY2RjZGM7XFxufVxcbi5hbGVydFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgYm9yZGVyOiBzb2xpZCAxcHggI2RjZGRkZDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7XFxuICBtYXJnaW46IDAgYXV0byAxMnB4O1xcbiAgcGFkZGluZzogNnB4IDM2cHg7XFxufVxcbi5hbGVydCAuaWNvbltkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLmFsZXJ0IC5idG5bZGF0YS12LTNiNGYzNWFmXSB7XFxuICAgIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4uYWxlcnQgLmNsb3NlW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAxN3B4O1xcbn1cXG4uaXB0LXdyYXAgLmlwdFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiA0LjVyZW07XFxuICBib3JkZXItcmFkaXVzOiA0LjVyZW07XFxuICBib3JkZXI6IHNvbGlkIDFweCAjZGNkZGRkICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbiAgcGFkZGluZzogMCAycmVtO1xcbiAgZmxleDogMTtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjFyZW07XFxufVxcbi5pcHQtd3JhcCAuZG93bi1hcnJvd1tkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMi4ycmVtO1xcbiAgcmlnaHQ6IDJyZW07XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vZG93bi1hcnJvdy5wbmdcIikpICsgXCIpO1xcbiAgd2lkdGg6IDFyZW07XFxuICBoZWlnaHQ6IC42NjY2NjdyZW07XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLmlwdC13cmFwIC5leWVbZGF0YS12LTNiNGYzNWFmXSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDEuMnJlbTtcXG4gIHJpZ2h0OiAycmVtO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2ljb24tZXllcy1vZmYucG5nXCIpKSArIFwiKTtcXG4gIHdpZHRoOiAyN3B4O1xcbiAgaGVpZ2h0OiAyNHB4O1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5pcHQtd3JhcCAuZXllLWFjdFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb24ucG5nXCIpKSArIFwiKTtcXG59XFxuLmlwdFtkYXRhLXYtM2I0ZjM1YWZdOmZvY3VzIHtcXG4gIGJvcmRlci1jb2xvcjogI2YwNWEyMyAhaW1wb3J0YW50O1xcbn1cXG4uaXB0LmVycltkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGJvcmRlci1jb2xvcjogI2YwNWEyMyAhaW1wb3J0YW50O1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0W2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgd2lkdGg6IDFyZW0gIWltcG9ydGFudDtcXG4gIGhlaWdodDogMXJlbSAhaW1wb3J0YW50O1xcbn1cXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZVtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGJhY2tncm91bmQ6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XFxuLmFsZXJ0W2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgICBwYWRkaW5nOiA0cHggMzZweCA0cHggMTJweDtcXG59XFxufVxcblxcbi8qIOWbvueJh+Wtl+S9kyAqL1xcbkBmb250LWZhY2Uge1xcbiAgZm9udC1mYW1pbHk6ICdpY29uZm9udCc7XFxuICBzcmM6IHVybChcXFwiZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtd29mZjI7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R01nQUJBQUFBQUFTRUFBc0FBQUFBQ1NBQUFBUTNBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUhFSUdWZ0NEU0FxRkdJUW5BVFlDSkFNWUN3NEFCQ0FGaEcwSFZCdlpCeEdWbk52SWZoellEVitCQWU5d3RKaUdPTlRHWXVIQlovT2g3N1EzT3h1cEl0T2VGRlRjUWpwUlh3SytBSWJuMDhuZTc2NlhwcHNpd1JLUGtzUVRqN0FPNHhBT3YzZk9BZHNKYzBLTlpPM0lvODlMZjhLOUJrWStjZSs0ZGY0RG1zK3lYTWFjTk5iRUFPT0FBdHJiRjFtQnhBbHF5L0RxOHVxd3JnTUJpUEdBRDRnNmRiZ0dRaFNzZVFSQUtzdEs4aUZNbUZBVkJNSFNkc0ZXRnBrTkhoWXpoYmtFWUpiM2VmSUdRVVFJRENhRnRYUTBsMUtFaE9mS1YrRzAxOUFyeTdHZ2J6Z0hBR0VYVUlBUEFCWklaNkdyR1RTSStvQmlhNy9BNGdWQWlvV0JlcTU4dnZIbGtKZU5yOElOQmhJeXkwZHd3Vjhlc0pnNE1CQWdmR0NWbEtVTmovSGd1Wklhd0dycWpaZ0xQSGc1eEFDSzFZMllDd3k4Q3BkY2xvNC9ZSU1JY0JMQU5aaDlZR2tJUEh0YTJOb3JUS3hVU2xVTlY3S296Mnpzd28wbVJmTk5SczlmYkZxOFlKcjV1RVhMV283Y0VkKzZwYmw5VzN2M3JqNGc3dHpScFUrN0hhdVIwWWJtSjIrZGFsTEVMWnk2dWRlMHVHaCs3NVpwNWlYRkN4Wk1XMlErMElRT0tzYTdTTUpJS0gxOGgzeTloV1krbU40dEV0VzBiWVQybWVtV3BrMWRiN0w4MXRRN2RnczNpc1VidDFycmwwa1UweXkxU3phN1pDdzBtNGxDSXpGTUYyd3cxNStRcDF1NDNzUmsvaEpUN1lKTjV1YUxsdW9sUFpTVHZxMW00dm1iZ1I3dmVNMTE2T2pCR3AySzIxb01ia1JHbnZxZ2xuQ0xWaGFydUFNNmdsK3RvVE5ZUFpzNWRveVpEWHlIYngvUlN2Wk10NnROdHg3Umx6a1dsY3lzV1F5U1YySStQaW8wMDhOcDhtUXZML2owQ0VWTExJSXRsb2lFSVBJRm5DQkRON1pwQzZuM2kvZXJFMHVYSUNUL3QrMjY5clZyang0ZGUrd3J3eW5mam8xQmFOL3RYUW16SjN3SUY5a3JnaFVIcU4xZUZCNGZNdnVDUk9ybnZWd2RrVWVXTGZmMms3MElpTzhmczJ5T2FiWHBISGRsdlgrQTVybUs2ZHg0cGlYbGJIdW5pYitpTmVWTStVblhGdldaalIydWxlVkYvanNiSzEyd284T1dEcFkrVFJIMGpQOHN5THMwV0lsT0FJRGhGSE9QK2dJQTFURjNrQ09CT2NiYWo5RmpnWUNKOTdDRUZ2d3QzNUdmS1oyWXE0ajVKaUdVc0FDK0p1dTdzYVNaYXZESzFXZ3MvamVhYWdCL1EwV1VzdVl1dFRPZElLRGxtVExoQVRhMDNNc2tOMCtHMHQxdmNqeUVUQ01NQXJZNENMbVFpdWFEU1NJRVRTZ2VtN2RCdTAvRzZvMlJFZ0dlSmlBUVNydkFrRHNLU3VreWlhVTlCbytaZCtCVFpnd3hYZFpIU3JqRnJvNFpvcUtsZ2orVlNlNFVzZGFWWDNpRGZnZVI0MUtQOFVJdU5rQ0JmZ0hweEJVZDhoQXJHajc2MEZnVmNaa2pwYUxiRUFKVGJXWUhXVGVsdGZhTnZ6OVg5S0pOSWNmQlNySU1oQXBhcE1BZktTT3hqbko2VjZ2TSsyOUFld3VFWE5GUjQzMkJyTENEazBCK0FocVFycXF1VWNlbGpHN3dvUjAwcWhRN2k1T3hpS1JpQndTSU1sSmJQTWtCcWRvbzdSRHVOZnlaYmx4VDFXWjZUYnpMZmJCWjUzUVlRZ2xMZUlSUEJCQjloUFRISDlvTE1oUTVyNWlwREZ3d01Sd3hSZXpyZnpBQUFBPT1cXFwiKSBmb3JtYXQoXFxcIndvZmYyXFxcIik7XFxufVxcbi5pY29uZm9udFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnICFpbXBvcnRhbnQ7XFxuICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XFxufVxcbi5pY29ucmVmcmVzaFtkYXRhLXYtM2I0ZjM1YWZdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU4NzQnO1xcbn1cXG4uaWNvbmVtcHR5W2RhdGEtdi0zYjRmMzVhZl06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTZBNic7XFxufVxcbi5pY29uY2xvc2VbZGF0YS12LTNiNGYzNWFmXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFODQ5JztcXG59XFxuLmRyb3AtbGlzdFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIG1pbi13aWR0aDogMTByZW07XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBtYXJnaW46IDAgMXJlbTtcXG4gIGZvbnQtc2l6ZTogMTZweDtcXG59XFxuLmRyb3AtbGlzdCAubGlzdFtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB3aWR0aDogMTEwJTtcXG4gICAgbGVmdDogMDtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIG1hcmdpbjogMCBhdXRvO1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxufVxcbi5kcm9wLWxpc3QgLmxpc3QgLnNwYWNlW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgICAgIGhlaWdodDogMS41cmVtO1xcbn1cXG4uZHJvcC1saXN0IHNwYW5bZGF0YS12LTNiNGYzNWFmXSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5kcm9wLWxpc3QgdWxbZGF0YS12LTNiNGYzNWFmXSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGJveC1zaGFkb3c6IDAgMCAxLjVyZW0gMCByZ2JhKDI1NSwgODcsIDAsIDAuMTUpO1xcbiAgICBib3JkZXItcmFkaXVzOiAuNXJlbTtcXG59XFxuLmRyb3AtbGlzdCB1bCBsaVtkYXRhLXYtM2I0ZjM1YWZdIHtcXG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgICBwYWRkaW5nOiAxLjVyZW0gMDtcXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5kcm9wLWxpc3QgdWwgbGlbZGF0YS12LTNiNGYzNWFmXTphZnRlciB7XFxuICAgICAgICBjb250ZW50OiBcXFwiXFxcIjtcXG4gICAgICAgIHdpZHRoOiA3cmVtO1xcbiAgICAgICAgaGVpZ2h0OiAxcHg7XFxuICAgICAgICBiYWNrZ3JvdW5kOiAjZjFmMWYxO1xcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICAgICAgYm90dG9tOiAwO1xcbiAgICAgICAgbGVmdDogNTAlO1xcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xcbn1cXG4uZHJvcC1saXN0IHVsIGxpW2RhdGEtdi0zYjRmMzVhZl06bGFzdC1jaGlsZCB7XFxuICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcXG59XFxuLmRyb3AtbGlzdCB1bCBsaVtkYXRhLXYtM2I0ZjM1YWZdOmxhc3QtY2hpbGQ6YWZ0ZXIge1xcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxufVxcbi5kcm9wLWxpc3QgdWwgbGlbZGF0YS12LTNiNGYzNWFmXTpob3ZlciB7XFxuICAgICAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi51c2VyW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgd2lkdGg6IDkuMjVyZW07XFxuICBoZWlnaHQ6IDNyZW07XFxuICBib3JkZXItcmFkaXVzOiAzcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwNWEyMztcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBjb2xvcjogI2ZmZmZmZjtcXG4gIG1hcmdpbjogMCBhdXRvO1xcbn1cXG4udXNlciBzcGFuW2RhdGEtdi0zYjRmMzVhZl0ge1xcbiAgICBtYXgtd2lkdGg6IDQuMjVyZW07XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbn1cXG4udXNlciAuaWNvbi1pbWdbZGF0YS12LTNiNGYzNWFmXSB7XFxuICAgIG1hcmdpbjogMCAuNXJlbTtcXG59XFxuXCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var escape = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-f678fc22] {\\n  background-repeat: no-repeat;\\n  background-size: 100% 100%;\\n}\\n.fl[data-v-f678fc22] {\\n  display: flex;\\n}\\n.flc[data-v-f678fc22] {\\n  display: flex;\\n  justify-content: center;\\n}\\n.flb[data-v-f678fc22] {\\n  display: flex;\\n  justify-content: space-between;\\n}\\n.fla[data-v-f678fc22] {\\n  display: flex;\\n  align-items: center;\\n}\\n.fcc[data-v-f678fc22] {\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n}\\n.bb[data-v-f678fc22], .alert[data-v-f678fc22], .ipt-wrap .ipt[data-v-f678fc22] {\\n  box-sizing: border-box;\\n}\\n.fullp[data-v-f678fc22] {\\n  width: 100%;\\n  height: 100%;\\n}\\n.pointer[data-v-f678fc22] {\\n  cursor: pointer;\\n}\\n.text-l[data-v-f678fc22] {\\n  text-align: left;\\n}\\n.text-r[data-v-f678fc22] {\\n  text-align: right;\\n}\\n.text-c[data-v-f678fc22] {\\n  text-align: center;\\n}\\n.bc[data-v-f678fc22] {\\n  text-align: center;\\n}\\n.flex1[data-v-f678fc22] {\\n  flex: 1;\\n}\\n.disabled[data-v-f678fc22] {\\n  cursor: default !important;\\n  color: #4c4948 !important;\\n  background-color: #dcdddd !important;\\n  background-image: none !important;\\n  box-shadow: none !important;\\n}\\n.cOrange[data-v-f678fc22] {\\n  color: #f05a23;\\n}\\n.cGreen[data-v-f678fc22] {\\n  color: #006441;\\n}\\n.cGray[data-v-f678fc22] {\\n  color: #bfbfbf;\\n}\\n.cDark[data-v-f678fc22] {\\n  color: #dcdcdc;\\n}\\n.alert[data-v-f678fc22] {\\n  display: flex;\\n  align-items: center;\\n  position: relative;\\n  width: 100%;\\n  border-radius: 10px;\\n  border: solid 1px #dcdddd;\\n  background-color: #f2f2f2;\\n  margin: 0 auto 12px;\\n  padding: 6px 36px;\\n}\\n.alert .icon[data-v-f678fc22] {\\n    margin-right: 5px;\\n    display: inline-block;\\n}\\n.alert .btn[data-v-f678fc22] {\\n    color: #f05a23;\\n}\\n.alert .close[data-v-f678fc22] {\\n    position: absolute;\\n    right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-f678fc22] {\\n  width: 100%;\\n  height: 4.5rem;\\n  border-radius: 4.5rem;\\n  border: solid 1px #dcdddd !important;\\n  background-color: #ffffff;\\n  padding: 0 2rem;\\n  flex: 1;\\n  letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-f678fc22] {\\n  position: absolute;\\n  top: 2.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n  width: 1rem;\\n  height: .666667rem;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye[data-v-f678fc22] {\\n  position: absolute;\\n  top: 1.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n  width: 27px;\\n  height: 24px;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-f678fc22] {\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-f678fc22]:focus {\\n  border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-f678fc22] {\\n  border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-f678fc22] {\\n  width: 1rem !important;\\n  height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-f678fc22] {\\n  background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-f678fc22] {\\n    padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n  font-family: 'iconfont';\\n  src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-f678fc22] {\\n  font-family: 'iconfont' !important;\\n  font-size: 16px;\\n  font-style: normal;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-f678fc22]:before {\\n  content: '\\\\E874';\\n}\\n.iconempty[data-v-f678fc22]:before {\\n  content: '\\\\E6A6';\\n}\\n.iconclose[data-v-f678fc22]:before {\\n  content: '\\\\E849';\\n}\\n.v-footer[data-v-f678fc22] {\\n  color: #ffffff;\\n  background-color: #2e2b2a;\\n  font-size: 14px;\\n}\\n.v-footer .footer-containter[data-v-f678fc22] {\\n    margin: 0 auto;\\n    max-width: 1200px;\\n}\\n.v-footer .footer-containter .cont .logo-wrap[data-v-f678fc22] {\\n      padding: 2.166667rem 0;\\n}\\n.v-footer .footer-containter .cont .logo-wrap .logo-img[data-v-f678fc22] {\\n        cursor: pointer;\\n}\\n.v-footer .footer-containter .cont .line[data-v-f678fc22] {\\n      width: 100%;\\n      height: 1px;\\n      opacity: 0.2;\\n      background-color: #ffffff;\\n}\\n.v-footer .footer-containter .cont .info[data-v-f678fc22] {\\n      padding: 2rem 0 2rem;\\n      display: flex;\\n}\\n.v-footer .footer-containter .cont .info .hotline[data-v-f678fc22] {\\n        min-width: 24.5rem;\\n}\\n.v-footer .footer-containter .cont .info .hotline .contact .n-item[data-v-f678fc22] {\\n          margin-bottom: 0.6rem;\\n}\\n.v-footer .footer-containter .cont .info .hotline .contact .phone[data-v-f678fc22] {\\n          color: #f05a23;\\n          font-size: 16px;\\n          font-weight: bold;\\n}\\n.v-footer .footer-containter .cont .info .hotline .contact[data-v-f678fc22]:first-child {\\n          margin-bottom: 2rem;\\n}\\n.v-footer .footer-containter .cont .info .nav[data-v-f678fc22] {\\n        display: flex;\\n}\\n.v-footer .footer-containter .cont .info .nav .n-item[data-v-f678fc22] {\\n          cursor: pointer;\\n          min-width: 14.75rem;\\n}\\n.v-footer .footer-containter .cont .info .nav2[data-v-f678fc22] {\\n        display: none;\\n}\\n.v-footer .footer-containter .cont .info .public[data-v-f678fc22] {\\n        position: relative;\\n        text-align: left;\\n        margin-left: 5.32rem;\\n}\\n.v-footer .footer-containter .cont .info .public .qrcode-wrap[data-v-f678fc22] {\\n          text-align: center;\\n          margin-top: 0.3rem;\\n          width: 8.416667rem;\\n          height: 8.833333rem;\\n}\\n.v-footer .footer-containter .cont .info .public .qrcode-wrap .c1[data-v-f678fc22] {\\n            margin-top: 0.3rem;\\n}\\n.v-footer .footer-containter .cont .info .public .icon[data-v-f678fc22] {\\n          margin-top: .75rem;\\n          margin-right: 1rem;\\n          display: inline-block;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22] {\\n        margin-bottom: 2rem;\\n        color: #dcdddd;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22]:first-child {\\n          margin-bottom: 2.666667rem;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22]:last-child {\\n          margin-bottom: 0;\\n}\\n.v-footer .footer-containter .cont .copyright[data-v-f678fc22] {\\n      color: rgba(179, 177, 168, 0.5);\\n      padding: 1.5rem 0;\\n      line-height: 1.58;\\n      font-size: 12px;\\n}\\n@media (max-width: 1200px) {\\n.v-footer[data-v-f678fc22] {\\n    box-sizing: border-box;\\n    padding: 0 4%;\\n}\\n.v-footer .footer-containter .cont .info[data-v-f678fc22] {\\n      display: block;\\n}\\n.v-footer .footer-containter .cont .info .nav[data-v-f678fc22] {\\n        margin-top: 2rem;\\n        display: flex;\\n}\\n.v-footer .footer-containter .cont .info .nav .nav-v[data-v-f678fc22] {\\n          width: 100%;\\n}\\n.v-footer .footer-containter .cont .info .nav .n-item[data-v-f678fc22] {\\n          min-width: 0;\\n          margin-right: 0;\\n}\\n.v-footer .footer-containter .cont .info .nav2[data-v-f678fc22] {\\n        display: none;\\n}\\n.v-footer .footer-containter .cont .info .public[data-v-f678fc22] {\\n        margin: 0;\\n        margin-top: 3rem;\\n        text-align: left;\\n        min-height: 12rem;\\n}\\n.v-footer .footer-containter .cont .copyright[data-v-f678fc22] {\\n      box-sizing: border-box;\\n      padding-right: 2rem;\\n}\\n}\\n@media (max-width: 768px) {\\n.v-footer[data-v-f678fc22] {\\n    font-size: 12px;\\n}\\n.v-footer .footer-containter .cont .info[data-v-f678fc22] {\\n      display: flex;\\n      justify-content: space-between;\\n}\\n.v-footer .footer-containter .cont .info .hotline[data-v-f678fc22] {\\n        min-width: 0;\\n}\\n.v-footer .footer-containter .cont .info .hotline .phone[data-v-f678fc22] {\\n          font-size: 12px !important;\\n          font-weight: bold !important;\\n}\\n.v-footer .footer-containter .cont .info .nav[data-v-f678fc22] {\\n        display: none;\\n        margin-top: 0;\\n}\\n.v-footer .footer-containter .cont .info .nav2[data-v-f678fc22] {\\n        display: block;\\n}\\n.v-footer .footer-containter .cont .info .public[data-v-f678fc22] {\\n        margin: 0;\\n        min-width: 9rem;\\n}\\n.v-footer .footer-containter .cont .info .public .qrcode-wrap img[data-v-f678fc22] {\\n          width: 7rem;\\n}\\n.v-footer .footer-containter .cont .info .public .qrcode-wrap .c1[data-v-f678fc22] {\\n          display: none;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22] {\\n        margin-bottom: 2rem;\\n}\\n.v-footer .footer-containter .cont .info .n-item[data-v-f678fc22]:first-child {\\n          margin-bottom: 2rem;\\n}\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/NzhjZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZXNjYXBlID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi91cmwvZXNjYXBlLmpzXCIpO1xuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIOaUr+aMgeaWh+S7tlxcbiAqIOmcgOimgeW8leeUqOeahOWcsOaWueWdh+mcgOimgeWKoOS4iui/meS4quaUr+aMgeaWh+S7tlxcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIE1pbnhpbnNcXG4gKlxcbiAqIOWPguiAg+aUtumbhu+8mlxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC1zYXNzL3RyZWUvbWFzdGVyL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIOWPmOmHj1xcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4uYmlzW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmxbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4uZmxjW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4uZmxiW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZmNjW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmJiW2RhdGEtdi1mNjc4ZmMyMl0sIC5hbGVydFtkYXRhLXYtZjY3OGZjMjJdLCAuaXB0LXdyYXAgLmlwdFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5mdWxscFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4ucG9pbnRlcltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnRleHQtbFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcbi50ZXh0LXJbZGF0YS12LWY2NzhmYzIyXSB7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG59XFxuLnRleHQtY1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmJjW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZmxleDFbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBmbGV4OiAxO1xcbn1cXG4uZGlzYWJsZWRbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcXG4gIGNvbG9yOiAjNGM0OTQ4ICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkZGRkICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7XFxuICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XFxufVxcbi5jT3JhbmdlW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5jR3JlZW5bZGF0YS12LWY2NzhmYzIyXSB7XFxuICBjb2xvcjogIzAwNjQ0MTtcXG59XFxuLmNHcmF5W2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgY29sb3I6ICNiZmJmYmY7XFxufVxcbi5jRGFya1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGNvbG9yOiAjZGNkY2RjO1xcbn1cXG4uYWxlcnRbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyO1xcbiAgbWFyZ2luOiAwIGF1dG8gMTJweDtcXG4gIHBhZGRpbmc6IDZweCAzNnB4O1xcbn1cXG4uYWxlcnQgLmljb25bZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5hbGVydCAuYnRuW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICBjb2xvcjogI2YwNWEyMztcXG59XFxuLmFsZXJ0IC5jbG9zZVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogMTdweDtcXG59XFxuLmlwdC13cmFwIC5pcHRbZGF0YS12LWY2NzhmYzIyXSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogNC41cmVtO1xcbiAgYm9yZGVyLXJhZGl1czogNC41cmVtO1xcbiAgYm9yZGVyOiBzb2xpZCAxcHggI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG4gIHBhZGRpbmc6IDAgMnJlbTtcXG4gIGZsZXg6IDE7XFxuICBsZXR0ZXItc3BhY2luZzogMC4xcmVtO1xcbn1cXG4uaXB0LXdyYXAgLmRvd24tYXJyb3dbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDIuMnJlbTtcXG4gIHJpZ2h0OiAycmVtO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2Rvd24tYXJyb3cucG5nXCIpKSArIFwiKTtcXG4gIHdpZHRoOiAxcmVtO1xcbiAgaGVpZ2h0OiAuNjY2NjY3cmVtO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5pcHQtd3JhcCAuZXllW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAxLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb2ZmLnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMjdweDtcXG4gIGhlaWdodDogMjRweDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZS1hY3RbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9uLnBuZ1wiKSkgKyBcIik7XFxufVxcbi5pcHRbZGF0YS12LWY2NzhmYzIyXTpmb2N1cyB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLmlwdC5lcnJbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIHdpZHRoOiAxcmVtICFpbXBvcnRhbnQ7XFxuICBoZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldC1hY3RpdmVbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBiYWNrZ3JvdW5kOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcbi5hbGVydFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgcGFkZGluZzogNHB4IDM2cHggNHB4IDEycHg7XFxufVxcbn1cXG5cXG4vKiDlm77niYflrZfkvZMgKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnO1xcbiAgc3JjOiB1cmwoXFxcImRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFBU0VBQXNBQUFBQUNTQUFBQVEzQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIRUlHVmdDRFNBcUZHSVFuQVRZQ0pBTVlDdzRBQkNBRmhHMEhWQnZaQnhHVm5OdklmaHpZRFYrQkFlOXd0SmlHT05UR1l1SEJaL09oNzdRM094dXBJdE9lRkZUY1FqcFJYd0srQUlibjA4bmU3NjZYcHBzaXdSS1Brc1FUajdBTzR4QU92M2ZPQWRzSmMwS05aTzNJbzg5TGY4SzlCa1krY2UrNGRmNERtcyt5WE1hY05OYkVBT09BQXRyYkYxbUJ4QWxxeS9EcTh1cXdyZ01CaVBHQUQ0ZzZkYmdHUWhTc2VRUkFLc3RLOGlGTW1GQVZCTUhTZHNGV0Zwa05IaFl6aGJrRVlKYjNlZklHUVVRSURDYUZ0WFEwbDFLRWhPZktWK0cwMTlBcnk3R2diemdIQUdFWFVJQVBBQlpJWjZHckdUU0krb0JpYTcvQTRnVkFpb1dCZXE1OHZ2SGxrSmVOcjhJTkJoSXl5MGR3d1Y4ZXNKZzRNQkFnZkdDVmxLVU5qL0hndVpJYXdHcnFqWmdMUEhnNXhBQ0sxWTJZQ3d5OENwZGNsbzQvWUlNSWNCTEFOWmg5WUdrSVBIdGEyTm9yVEt4VVNsVU5WN0tvejJ6c3dvMG1SZk5OUnM5ZmJGcThZSnI1dUVYTFdvN2NFZCs2cGJsOVczdjNyajRnN3R6UnBVKzdIYXVSMFlibUoyK2RhbExFTFp5NnVkZTB1R2grNzVacDVpWEZDeFpNVzJRKzBJUU9Lc2E3U01KSUtIMThoM3k5aFdZK21ONHRFdFcwYllUMm1lbVdwazFkYjdMODF0UTdkZ3MzaXNVYnQxcnJsMGtVMHl5MVN6YTdaQ3cwbTRsQ0l6Rk1GMnd3MTUrUXAxdTQzc1JrL2hKVDdZSk41dWFMbHVvbFBaU1R2cTFtNHZtYmdSN3ZlTTExNk9qQkdwMksyMW9NYmtSR252cWdsbkNMVmhhcnVBTTZnbCt0b1ROWVBaczVkb3laRFh5SGJ4L1JTdlpNdDZ0TnR4N1JsemtXbGN5c1dReVNWMkkrUGlvMDA4TnA4bVF2TC9qMENFVkxMSUl0bG9pRUlQSUZuQ0JETjdacEM2bjNpL2VyRTB1WElDVC90KzI2OXJWcmp4NGRlK3dyd3luZmpvMUJhTi90WFFtekozd0lGOWtyZ2hVSHFOMWVGQjRmTXZ1Q1JPcm52Vndka1VlV0xmZjJrNzBJaU84ZnMyeU9hYlhwSEhkbHZYK0E1cm1LNmR4NHBpWGxiSHVuaWIraU5lVk0rVW5YRnZXWmpSMnVsZVZGL2pzYksxMndvOE9XRHBZK1RSSDBqUDhzeUxzMFdJbE9BSURoRkhPUCtnSUExVEYza0NPQk9jYmFqOUZqZ1lDSjk3Q0VGdnd0MzVHZktaMllxNGo1SmlHVXNBQytKdXU3c2FTWmF2REsxV2dzL2plYWFnQi9RMFdVc3VZdXRUT2RJS0RsbVRMaEFUYTAzTXNrTjArRzB0MXZjanlFVENNTUFyWTRDTG1RaXVhRFNTSUVUU2dlbTdkQnUwL0c2bzJSRWdHZUppQVFTcnZBa0RzS1N1a3lpYVU5Qm8rWmQrQlRaZ3d4WGRaSFNyakZybzRab3FLbGdqK1ZTZTRVc2RhVlgzaURmZ2VSNDFLUDhVSXVOa0NCZmdIcHhCVWQ4aEFyR2o3NjBGZ1ZjWmtqcGFMYkVBSlRiV1lIV1RlbHRmYU52ejlYOUtKTkljZkJTcklNaEFwYXBNQWZLU094am5KNlY2dk0rMjlBZXd1RVhORlI0MzJCckxDRGswQitBaHFRcnFxdVVjZWxqRzd3b1IwMHFoUTdpNU94aUtSaUJ3U0lNbEpiUE1rQnFkb283UkR1TmZ5WmJseFQxV1o2VGJ6TGZiQlo1M1FZUWdsTGVJUlBCQkI5aFBUSEg5b0xNaFE1cjVpcERGd3dNUnd4UmV6cmZ6QUFBQT09XFxcIikgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO1xcbn1cXG4uaWNvbmZvbnRbZGF0YS12LWY2NzhmYzIyXSB7XFxuICBmb250LWZhbWlseTogJ2ljb25mb250JyAhaW1wb3J0YW50O1xcbiAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbn1cXG4uaWNvbnJlZnJlc2hbZGF0YS12LWY2NzhmYzIyXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFODc0JztcXG59XFxuLmljb25lbXB0eVtkYXRhLXYtZjY3OGZjMjJdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU2QTYnO1xcbn1cXG4uaWNvbmNsb3NlW2RhdGEtdi1mNjc4ZmMyMl06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTg0OSc7XFxufVxcbi52LWZvb3RlcltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gIGNvbG9yOiAjZmZmZmZmO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJlMmIyYTtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlcltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgbWFyZ2luOiAwIGF1dG87XFxuICAgIG1heC13aWR0aDogMTIwMHB4O1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5sb2dvLXdyYXBbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgcGFkZGluZzogMi4xNjY2NjdyZW0gMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAubG9nby13cmFwIC5sb2dvLWltZ1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAubGluZVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICB3aWR0aDogMTAwJTtcXG4gICAgICBoZWlnaHQ6IDFweDtcXG4gICAgICBvcGFjaXR5OiAwLjI7XFxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mb1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICBwYWRkaW5nOiAycmVtIDAgMnJlbTtcXG4gICAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5ob3RsaW5lW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgbWluLXdpZHRoOiAyNC41cmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5ob3RsaW5lIC5jb250YWN0IC5uLWl0ZW1bZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNnJlbTtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAuaG90bGluZSAuY29udGFjdCAucGhvbmVbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICAgIGNvbG9yOiAjZjA1YTIzO1xcbiAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5ob3RsaW5lIC5jb250YWN0W2RhdGEtdi1mNjc4ZmMyMl06Zmlyc3QtY2hpbGQge1xcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAycmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXZbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXYgLm4taXRlbVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICAgICAgICBtaW4td2lkdGg6IDE0Ljc1cmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXYyW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgZGlzcGxheTogbm9uZTtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAucHVibGljW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA1LjMycmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5wdWJsaWMgLnFyY29kZS13cmFwW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDAuM3JlbTtcXG4gICAgICAgICAgd2lkdGg6IDguNDE2NjY3cmVtO1xcbiAgICAgICAgICBoZWlnaHQ6IDguODMzMzMzcmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5wdWJsaWMgLnFyY29kZS13cmFwIC5jMVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAwLjNyZW07XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLnB1YmxpYyAuaWNvbltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogLjc1cmVtO1xcbiAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDFyZW07XFxuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAubi1pdGVtW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMnJlbTtcXG4gICAgICAgIGNvbG9yOiAjZGNkZGRkO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uLWl0ZW1bZGF0YS12LWY2NzhmYzIyXTpmaXJzdC1jaGlsZCB7XFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIuNjY2NjY3cmVtO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uLWl0ZW1bZGF0YS12LWY2NzhmYzIyXTpsYXN0LWNoaWxkIHtcXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuY29weXJpZ2h0W2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgIGNvbG9yOiByZ2JhKDE3OSwgMTc3LCAxNjgsIDAuNSk7XFxuICAgICAgcGFkZGluZzogMS41cmVtIDA7XFxuICAgICAgbGluZS1oZWlnaHQ6IDEuNTg7XFxuICAgICAgZm9udC1zaXplOiAxMnB4O1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7XFxuLnYtZm9vdGVyW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBwYWRkaW5nOiAwIDQlO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXZbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICBtYXJnaW4tdG9wOiAycmVtO1xcbiAgICAgICAgZGlzcGxheTogZmxleDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAubmF2IC5uYXYtdltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgICAgd2lkdGg6IDEwMCU7XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLm5hdiAubi1pdGVtW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgICBtaW4td2lkdGg6IDA7XFxuICAgICAgICAgIG1hcmdpbi1yaWdodDogMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAubmF2MltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLnB1YmxpY1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIG1hcmdpbjogMDtcXG4gICAgICAgIG1hcmdpbi10b3A6IDNyZW07XFxuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICAgICAgbWluLWhlaWdodDogMTJyZW07XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmNvcHlyaWdodFtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDJyZW07XFxufVxcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXG4udi1mb290ZXJbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mb1tkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAuaG90bGluZVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIG1pbi13aWR0aDogMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAuaG90bGluZSAucGhvbmVbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xcbiAgICAgICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5uYXZbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICBkaXNwbGF5OiBub25lO1xcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAubmF2MltkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG4udi1mb290ZXIgLmZvb3Rlci1jb250YWludGVyIC5jb250IC5pbmZvIC5wdWJsaWNbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICBtYXJnaW46IDA7XFxuICAgICAgICBtaW4td2lkdGg6IDlyZW07XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLnB1YmxpYyAucXJjb2RlLXdyYXAgaW1nW2RhdGEtdi1mNjc4ZmMyMl0ge1xcbiAgICAgICAgICB3aWR0aDogN3JlbTtcXG59XFxuLnYtZm9vdGVyIC5mb290ZXItY29udGFpbnRlciAuY29udCAuaW5mbyAucHVibGljIC5xcmNvZGUtd3JhcCAuYzFbZGF0YS12LWY2NzhmYzIyXSB7XFxuICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLm4taXRlbVtkYXRhLXYtZjY3OGZjMjJdIHtcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDJyZW07XFxufVxcbi52LWZvb3RlciAuZm9vdGVyLWNvbnRhaW50ZXIgLmNvbnQgLmluZm8gLm4taXRlbVtkYXRhLXYtZjY3OGZjMjJdOmZpcnN0LWNoaWxkIHtcXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMnJlbTtcXG59XFxufVxcblwiLCBcIlwiXSk7XG5cbi8vIGV4cG9ydHNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var escape = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-6fba8daf] {\\n  background-repeat: no-repeat;\\n  background-size: 100% 100%;\\n}\\n.fl[data-v-6fba8daf] {\\n  display: flex;\\n}\\n.flc[data-v-6fba8daf] {\\n  display: flex;\\n  justify-content: center;\\n}\\n.flb[data-v-6fba8daf] {\\n  display: flex;\\n  justify-content: space-between;\\n}\\n.fla[data-v-6fba8daf] {\\n  display: flex;\\n  align-items: center;\\n}\\n.fcc[data-v-6fba8daf] {\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n}\\n.bb[data-v-6fba8daf], .alert[data-v-6fba8daf], .ipt-wrap .ipt[data-v-6fba8daf] {\\n  box-sizing: border-box;\\n}\\n.fullp[data-v-6fba8daf] {\\n  width: 100%;\\n  height: 100%;\\n}\\n.pointer[data-v-6fba8daf] {\\n  cursor: pointer;\\n}\\n.text-l[data-v-6fba8daf] {\\n  text-align: left;\\n}\\n.text-r[data-v-6fba8daf] {\\n  text-align: right;\\n}\\n.text-c[data-v-6fba8daf] {\\n  text-align: center;\\n}\\n.bc[data-v-6fba8daf] {\\n  text-align: center;\\n}\\n.flex1[data-v-6fba8daf] {\\n  flex: 1;\\n}\\n.disabled[data-v-6fba8daf] {\\n  cursor: default !important;\\n  color: #4c4948 !important;\\n  background-color: #dcdddd !important;\\n  background-image: none !important;\\n  box-shadow: none !important;\\n}\\n.cOrange[data-v-6fba8daf] {\\n  color: #f05a23;\\n}\\n.cGreen[data-v-6fba8daf] {\\n  color: #006441;\\n}\\n.cGray[data-v-6fba8daf] {\\n  color: #bfbfbf;\\n}\\n.cDark[data-v-6fba8daf] {\\n  color: #dcdcdc;\\n}\\n.alert[data-v-6fba8daf] {\\n  display: flex;\\n  align-items: center;\\n  position: relative;\\n  width: 100%;\\n  border-radius: 10px;\\n  border: solid 1px #dcdddd;\\n  background-color: #f2f2f2;\\n  margin: 0 auto 12px;\\n  padding: 6px 36px;\\n}\\n.alert .icon[data-v-6fba8daf] {\\n    margin-right: 5px;\\n    display: inline-block;\\n}\\n.alert .btn[data-v-6fba8daf] {\\n    color: #f05a23;\\n}\\n.alert .close[data-v-6fba8daf] {\\n    position: absolute;\\n    right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-6fba8daf] {\\n  width: 100%;\\n  height: 4.5rem;\\n  border-radius: 4.5rem;\\n  border: solid 1px #dcdddd !important;\\n  background-color: #ffffff;\\n  padding: 0 2rem;\\n  flex: 1;\\n  letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-6fba8daf] {\\n  position: absolute;\\n  top: 2.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n  width: 1rem;\\n  height: .666667rem;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye[data-v-6fba8daf] {\\n  position: absolute;\\n  top: 1.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n  width: 27px;\\n  height: 24px;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-6fba8daf] {\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-6fba8daf]:focus {\\n  border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-6fba8daf] {\\n  border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-6fba8daf] {\\n  width: 1rem !important;\\n  height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-6fba8daf] {\\n  background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-6fba8daf] {\\n    padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n  font-family: 'iconfont';\\n  src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-6fba8daf] {\\n  font-family: 'iconfont' !important;\\n  font-size: 16px;\\n  font-style: normal;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-6fba8daf]:before {\\n  content: '\\\\E874';\\n}\\n.iconempty[data-v-6fba8daf]:before {\\n  content: '\\\\E6A6';\\n}\\n.iconclose[data-v-6fba8daf]:before {\\n  content: '\\\\E849';\\n}\\n.v-header[data-v-6fba8daf] {\\n  height: 7.66667rem;\\n  background-color: #fff;\\n  color: #4c4948;\\n  position: relative;\\n  z-index: 11;\\n  font-size: 14px;\\n}\\n.v-header .header-container[data-v-6fba8daf] {\\n    max-width: 1200px;\\n    height: 100%;\\n    margin: auto;\\n    display: flex;\\n    align-items: center;\\n    position: relative;\\n}\\n.v-header .main-nav[data-v-6fba8daf] {\\n    height: 100%;\\n    flex: 1 0 auto;\\n}\\n.v-header .logo-img[data-v-6fba8daf] {\\n    margin-right: 2rem;\\n    max-width: 17.75rem;\\n    cursor: pointer;\\n}\\n.v-header .nav-list[data-v-6fba8daf] {\\n    height: 100%;\\n    display: flex;\\n    align-items: center;\\n    justify-content: flex-end;\\n    position: relative;\\n}\\n.v-header .nav-item[data-v-6fba8daf] {\\n    display: flex;\\n    align-items: center;\\n    height: 100%;\\n    margin: 0;\\n    -ms-flex-pack: center;\\n    justify-content: center;\\n    position: relative;\\n    cursor: pointer;\\n}\\n.v-header .main-nav-list[data-v-6fba8daf] {\\n    display: flex;\\n    cursor: pointer;\\n}\\n.v-header .nav-item.link-item[data-v-6fba8daf] {\\n    padding: 0 50px;\\n    height: 5rem;\\n}\\n.v-header .nav-item.search[data-v-6fba8daf] {\\n    flex: 1 1 auto;\\n}\\n.v-header .nav-item.auth[data-v-6fba8daf] {\\n    color: #ffffff;\\n}\\n.v-header .nav-item.auth .user[data-v-6fba8daf] {\\n      width: 7.333333rem;\\n      height: 2.25rem;\\n      background-color: #f05a23;\\n      border-radius: 1.333333rem;\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n}\\n.v-header .nav-item.auth .user .icon-img[data-v-6fba8daf] {\\n        margin: 0 .5rem;\\n}\\n.v-header .nav-item.auth .lang[data-v-6fba8daf] {\\n      color: #f05a23;\\n}\\n.pc[data-v-6fba8daf] {\\n  display: block;\\n}\\n.mobile[data-v-6fba8daf] {\\n  display: none;\\n}\\n.mobile-nav-list[data-v-6fba8daf] {\\n    position: absolute;\\n    right: 0;\\n    top: 24px;\\n    display: flex;\\n    align-items: center;\\n}\\n.mobile-nav-list img[data-v-6fba8daf] {\\n      width: 20px;\\n      margin-left: 20px;\\n}\\n@media (max-width: 1200px) {\\n.v-header[data-v-6fba8daf] {\\n    box-sizing: border-box;\\n    padding: 0 4%;\\n}\\n.v-header .logo-img[data-v-6fba8daf] {\\n      max-width: 17.75rem;\\n      margin: 0;\\n}\\n.v-header .pc[data-v-6fba8daf] {\\n      display: none;\\n}\\n.v-header .mobile[data-v-6fba8daf] {\\n      display: block;\\n}\\n.v-header .mobile-nav-list[data-v-6fba8daf] {\\n        top: 32px;\\n}\\n}\\n@media (max-width: 768px) {\\n.v-header[data-v-6fba8daf] {\\n    height: 72px;\\n}\\n.v-header .logo-img[data-v-6fba8daf] {\\n      width: 15.5rem;\\n      margin: 0;\\n}\\n.v-header .mobile[data-v-6fba8daf] {\\n      display: block;\\n}\\n.v-header .mobile-nav-list[data-v-6fba8daf] {\\n        top: 24px;\\n}\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/MDZjOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZXNjYXBlID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi91cmwvZXNjYXBlLmpzXCIpO1xuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIOaUr+aMgeaWh+S7tlxcbiAqIOmcgOimgeW8leeUqOeahOWcsOaWueWdh+mcgOimgeWKoOS4iui/meS4quaUr+aMgeaWh+S7tlxcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIE1pbnhpbnNcXG4gKlxcbiAqIOWPguiAg+aUtumbhu+8mlxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC1zYXNzL3RyZWUvbWFzdGVyL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIOWPmOmHj1xcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4uYmlzW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmxbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4uZmxjW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4uZmxiW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYVtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZmNjW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmJiW2RhdGEtdi02ZmJhOGRhZl0sIC5hbGVydFtkYXRhLXYtNmZiYThkYWZdLCAuaXB0LXdyYXAgLmlwdFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5mdWxscFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4ucG9pbnRlcltkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnRleHQtbFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcbi50ZXh0LXJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG59XFxuLnRleHQtY1tkYXRhLXYtNmZiYThkYWZdIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmJjW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZmxleDFbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBmbGV4OiAxO1xcbn1cXG4uZGlzYWJsZWRbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcXG4gIGNvbG9yOiAjNGM0OTQ4ICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkZGRkICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7XFxuICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XFxufVxcbi5jT3JhbmdlW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5jR3JlZW5bZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBjb2xvcjogIzAwNjQ0MTtcXG59XFxuLmNHcmF5W2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgY29sb3I6ICNiZmJmYmY7XFxufVxcbi5jRGFya1tkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGNvbG9yOiAjZGNkY2RjO1xcbn1cXG4uYWxlcnRbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyO1xcbiAgbWFyZ2luOiAwIGF1dG8gMTJweDtcXG4gIHBhZGRpbmc6IDZweCAzNnB4O1xcbn1cXG4uYWxlcnQgLmljb25bZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5hbGVydCAuYnRuW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBjb2xvcjogI2YwNWEyMztcXG59XFxuLmFsZXJ0IC5jbG9zZVtkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogMTdweDtcXG59XFxuLmlwdC13cmFwIC5pcHRbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogNC41cmVtO1xcbiAgYm9yZGVyLXJhZGl1czogNC41cmVtO1xcbiAgYm9yZGVyOiBzb2xpZCAxcHggI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG4gIHBhZGRpbmc6IDAgMnJlbTtcXG4gIGZsZXg6IDE7XFxuICBsZXR0ZXItc3BhY2luZzogMC4xcmVtO1xcbn1cXG4uaXB0LXdyYXAgLmRvd24tYXJyb3dbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDIuMnJlbTtcXG4gIHJpZ2h0OiAycmVtO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2Rvd24tYXJyb3cucG5nXCIpKSArIFwiKTtcXG4gIHdpZHRoOiAxcmVtO1xcbiAgaGVpZ2h0OiAuNjY2NjY3cmVtO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5pcHQtd3JhcCAuZXllW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAxLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb2ZmLnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMjdweDtcXG4gIGhlaWdodDogMjRweDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZS1hY3RbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9uLnBuZ1wiKSkgKyBcIik7XFxufVxcbi5pcHRbZGF0YS12LTZmYmE4ZGFmXTpmb2N1cyB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLmlwdC5lcnJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIHdpZHRoOiAxcmVtICFpbXBvcnRhbnQ7XFxuICBoZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldC1hY3RpdmVbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBiYWNrZ3JvdW5kOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcbi5hbGVydFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgcGFkZGluZzogNHB4IDM2cHggNHB4IDEycHg7XFxufVxcbn1cXG5cXG4vKiDlm77niYflrZfkvZMgKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnO1xcbiAgc3JjOiB1cmwoXFxcImRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFBU0VBQXNBQUFBQUNTQUFBQVEzQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIRUlHVmdDRFNBcUZHSVFuQVRZQ0pBTVlDdzRBQkNBRmhHMEhWQnZaQnhHVm5OdklmaHpZRFYrQkFlOXd0SmlHT05UR1l1SEJaL09oNzdRM094dXBJdE9lRkZUY1FqcFJYd0srQUlibjA4bmU3NjZYcHBzaXdSS1Brc1FUajdBTzR4QU92M2ZPQWRzSmMwS05aTzNJbzg5TGY4SzlCa1krY2UrNGRmNERtcyt5WE1hY05OYkVBT09BQXRyYkYxbUJ4QWxxeS9EcTh1cXdyZ01CaVBHQUQ0ZzZkYmdHUWhTc2VRUkFLc3RLOGlGTW1GQVZCTUhTZHNGV0Zwa05IaFl6aGJrRVlKYjNlZklHUVVRSURDYUZ0WFEwbDFLRWhPZktWK0cwMTlBcnk3R2diemdIQUdFWFVJQVBBQlpJWjZHckdUU0krb0JpYTcvQTRnVkFpb1dCZXE1OHZ2SGxrSmVOcjhJTkJoSXl5MGR3d1Y4ZXNKZzRNQkFnZkdDVmxLVU5qL0hndVpJYXdHcnFqWmdMUEhnNXhBQ0sxWTJZQ3d5OENwZGNsbzQvWUlNSWNCTEFOWmg5WUdrSVBIdGEyTm9yVEt4VVNsVU5WN0tvejJ6c3dvMG1SZk5OUnM5ZmJGcThZSnI1dUVYTFdvN2NFZCs2cGJsOVczdjNyajRnN3R6UnBVKzdIYXVSMFlibUoyK2RhbExFTFp5NnVkZTB1R2grNzVacDVpWEZDeFpNVzJRKzBJUU9Lc2E3U01KSUtIMThoM3k5aFdZK21ONHRFdFcwYllUMm1lbVdwazFkYjdMODF0UTdkZ3MzaXNVYnQxcnJsMGtVMHl5MVN6YTdaQ3cwbTRsQ0l6Rk1GMnd3MTUrUXAxdTQzc1JrL2hKVDdZSk41dWFMbHVvbFBaU1R2cTFtNHZtYmdSN3ZlTTExNk9qQkdwMksyMW9NYmtSR252cWdsbkNMVmhhcnVBTTZnbCt0b1ROWVBaczVkb3laRFh5SGJ4L1JTdlpNdDZ0TnR4N1JsemtXbGN5c1dReVNWMkkrUGlvMDA4TnA4bVF2TC9qMENFVkxMSUl0bG9pRUlQSUZuQ0JETjdacEM2bjNpL2VyRTB1WElDVC90KzI2OXJWcmp4NGRlK3dyd3luZmpvMUJhTi90WFFtekozd0lGOWtyZ2hVSHFOMWVGQjRmTXZ1Q1JPcm52Vndka1VlV0xmZjJrNzBJaU84ZnMyeU9hYlhwSEhkbHZYK0E1cm1LNmR4NHBpWGxiSHVuaWIraU5lVk0rVW5YRnZXWmpSMnVsZVZGL2pzYksxMndvOE9XRHBZK1RSSDBqUDhzeUxzMFdJbE9BSURoRkhPUCtnSUExVEYza0NPQk9jYmFqOUZqZ1lDSjk3Q0VGdnd0MzVHZktaMllxNGo1SmlHVXNBQytKdXU3c2FTWmF2REsxV2dzL2plYWFnQi9RMFdVc3VZdXRUT2RJS0RsbVRMaEFUYTAzTXNrTjArRzB0MXZjanlFVENNTUFyWTRDTG1RaXVhRFNTSUVUU2dlbTdkQnUwL0c2bzJSRWdHZUppQVFTcnZBa0RzS1N1a3lpYVU5Qm8rWmQrQlRaZ3d4WGRaSFNyakZybzRab3FLbGdqK1ZTZTRVc2RhVlgzaURmZ2VSNDFLUDhVSXVOa0NCZmdIcHhCVWQ4aEFyR2o3NjBGZ1ZjWmtqcGFMYkVBSlRiV1lIV1RlbHRmYU52ejlYOUtKTkljZkJTcklNaEFwYXBNQWZLU094am5KNlY2dk0rMjlBZXd1RVhORlI0MzJCckxDRGswQitBaHFRcnFxdVVjZWxqRzd3b1IwMHFoUTdpNU94aUtSaUJ3U0lNbEpiUE1rQnFkb283UkR1TmZ5WmJseFQxV1o2VGJ6TGZiQlo1M1FZUWdsTGVJUlBCQkI5aFBUSEg5b0xNaFE1cjVpcERGd3dNUnd4UmV6cmZ6QUFBQT09XFxcIikgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO1xcbn1cXG4uaWNvbmZvbnRbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBmb250LWZhbWlseTogJ2ljb25mb250JyAhaW1wb3J0YW50O1xcbiAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbn1cXG4uaWNvbnJlZnJlc2hbZGF0YS12LTZmYmE4ZGFmXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFODc0JztcXG59XFxuLmljb25lbXB0eVtkYXRhLXYtNmZiYThkYWZdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU2QTYnO1xcbn1cXG4uaWNvbmNsb3NlW2RhdGEtdi02ZmJhOGRhZl06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTg0OSc7XFxufVxcbi52LWhlYWRlcltkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGhlaWdodDogNy42NjY2N3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBjb2xvcjogIzRjNDk0ODtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHotaW5kZXg6IDExO1xcbiAgZm9udC1zaXplOiAxNHB4O1xcbn1cXG4udi1oZWFkZXIgLmhlYWRlci1jb250YWluZXJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIG1heC13aWR0aDogMTIwMHB4O1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIG1hcmdpbjogYXV0bztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4udi1oZWFkZXIgLm1haW4tbmF2W2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIGZsZXg6IDEgMCBhdXRvO1xcbn1cXG4udi1oZWFkZXIgLmxvZ28taW1nW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDJyZW07XFxuICAgIG1heC13aWR0aDogMTcuNzVyZW07XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnYtaGVhZGVyIC5uYXYtbGlzdFtkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi52LWhlYWRlciAubmF2LWl0ZW1bZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGhlaWdodDogMTAwJTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnYtaGVhZGVyIC5tYWluLW5hdi1saXN0W2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi52LWhlYWRlciAubmF2LWl0ZW0ubGluay1pdGVtW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBwYWRkaW5nOiAwIDUwcHg7XFxuICAgIGhlaWdodDogNXJlbTtcXG59XFxuLnYtaGVhZGVyIC5uYXYtaXRlbS5zZWFyY2hbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIGZsZXg6IDEgMSBhdXRvO1xcbn1cXG4udi1oZWFkZXIgLm5hdi1pdGVtLmF1dGhbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIGNvbG9yOiAjZmZmZmZmO1xcbn1cXG4udi1oZWFkZXIgLm5hdi1pdGVtLmF1dGggLnVzZXJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgd2lkdGg6IDcuMzMzMzMzcmVtO1xcbiAgICAgIGhlaWdodDogMi4yNXJlbTtcXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjA1YTIzO1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEuMzMzMzMzcmVtO1xcbiAgICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG59XFxuLnYtaGVhZGVyIC5uYXYtaXRlbS5hdXRoIC51c2VyIC5pY29uLWltZ1tkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgICAgIG1hcmdpbjogMCAuNXJlbTtcXG59XFxuLnYtaGVhZGVyIC5uYXYtaXRlbS5hdXRoIC5sYW5nW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICAgIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4ucGNbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuLm1vYmlsZVtkYXRhLXYtNmZiYThkYWZdIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcbi5tb2JpbGUtbmF2LWxpc3RbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIHRvcDogMjRweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLm1vYmlsZS1uYXYtbGlzdCBpbWdbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgd2lkdGg6IDIwcHg7XFxuICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiAxMjAwcHgpIHtcXG4udi1oZWFkZXJbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIHBhZGRpbmc6IDAgNCU7XFxufVxcbi52LWhlYWRlciAubG9nby1pbWdbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgbWF4LXdpZHRoOiAxNy43NXJlbTtcXG4gICAgICBtYXJnaW46IDA7XFxufVxcbi52LWhlYWRlciAucGNbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgZGlzcGxheTogbm9uZTtcXG59XFxuLnYtaGVhZGVyIC5tb2JpbGVbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgZGlzcGxheTogYmxvY2s7XFxufVxcbi52LWhlYWRlciAubW9iaWxlLW5hdi1saXN0W2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICAgICAgdG9wOiAzMnB4O1xcbn1cXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XFxuLnYtaGVhZGVyW2RhdGEtdi02ZmJhOGRhZl0ge1xcbiAgICBoZWlnaHQ6IDcycHg7XFxufVxcbi52LWhlYWRlciAubG9nby1pbWdbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgd2lkdGg6IDE1LjVyZW07XFxuICAgICAgbWFyZ2luOiAwO1xcbn1cXG4udi1oZWFkZXIgLm1vYmlsZVtkYXRhLXYtNmZiYThkYWZdIHtcXG4gICAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuLnYtaGVhZGVyIC5tb2JpbGUtbmF2LWxpc3RbZGF0YS12LTZmYmE4ZGFmXSB7XFxuICAgICAgICB0b3A6IDI0cHg7XFxufVxcbn1cXG5cIiwgXCJcIl0pO1xuXG4vLyBleHBvcnRzXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&":
/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& ***!
  \************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var escape = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-04c55e2f], .plus-icon[data-v-04c55e2f], .arrow-icon[data-v-04c55e2f] {\\n  background-repeat: no-repeat;\\n  background-size: 100% 100%;\\n}\\n.fl[data-v-04c55e2f] {\\n  display: flex;\\n}\\n.flc[data-v-04c55e2f] {\\n  display: flex;\\n  justify-content: center;\\n}\\n.flb[data-v-04c55e2f] {\\n  display: flex;\\n  justify-content: space-between;\\n}\\n.fla[data-v-04c55e2f] {\\n  display: flex;\\n  align-items: center;\\n}\\n.fcc[data-v-04c55e2f], .panel .lang-item[data-v-04c55e2f], .icon-wrap[data-v-04c55e2f] {\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n}\\n.bb[data-v-04c55e2f], .alert[data-v-04c55e2f], .ipt-wrap .ipt[data-v-04c55e2f], .list-item[data-v-04c55e2f] {\\n  box-sizing: border-box;\\n}\\n.fullp[data-v-04c55e2f] {\\n  width: 100%;\\n  height: 100%;\\n}\\n.pointer[data-v-04c55e2f] {\\n  cursor: pointer;\\n}\\n.text-l[data-v-04c55e2f] {\\n  text-align: left;\\n}\\n.text-r[data-v-04c55e2f] {\\n  text-align: right;\\n}\\n.text-c[data-v-04c55e2f] {\\n  text-align: center;\\n}\\n.bc[data-v-04c55e2f] {\\n  text-align: center;\\n}\\n.flex1[data-v-04c55e2f] {\\n  flex: 1;\\n}\\n.disabled[data-v-04c55e2f] {\\n  cursor: default !important;\\n  color: #4c4948 !important;\\n  background-color: #dcdddd !important;\\n  background-image: none !important;\\n  box-shadow: none !important;\\n}\\n.cOrange[data-v-04c55e2f] {\\n  color: #f05a23;\\n}\\n.cGreen[data-v-04c55e2f] {\\n  color: #006441;\\n}\\n.cGray[data-v-04c55e2f] {\\n  color: #bfbfbf;\\n}\\n.cDark[data-v-04c55e2f] {\\n  color: #dcdcdc;\\n}\\n.alert[data-v-04c55e2f] {\\n  display: flex;\\n  align-items: center;\\n  position: relative;\\n  width: 100%;\\n  border-radius: 10px;\\n  border: solid 1px #dcdddd;\\n  background-color: #f2f2f2;\\n  margin: 0 auto 12px;\\n  padding: 6px 36px;\\n}\\n.alert .icon[data-v-04c55e2f] {\\n    margin-right: 5px;\\n    display: inline-block;\\n}\\n.alert .btn[data-v-04c55e2f] {\\n    color: #f05a23;\\n}\\n.alert .close[data-v-04c55e2f] {\\n    position: absolute;\\n    right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-04c55e2f] {\\n  width: 100%;\\n  height: 4.5rem;\\n  border-radius: 4.5rem;\\n  border: solid 1px #dcdddd !important;\\n  background-color: #ffffff;\\n  padding: 0 2rem;\\n  flex: 1;\\n  letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-04c55e2f] {\\n  position: absolute;\\n  top: 2.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n  width: 1rem;\\n  height: .666667rem;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye[data-v-04c55e2f] {\\n  position: absolute;\\n  top: 1.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n  width: 27px;\\n  height: 24px;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-04c55e2f] {\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-04c55e2f]:focus {\\n  border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-04c55e2f] {\\n  border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-04c55e2f] {\\n  width: 1rem !important;\\n  height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-04c55e2f] {\\n  background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-04c55e2f] {\\n    padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n  font-family: 'iconfont';\\n  src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-04c55e2f] {\\n  font-family: 'iconfont' !important;\\n  font-size: 16px;\\n  font-style: normal;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-04c55e2f]:before {\\n  content: '\\\\E874';\\n}\\n.iconempty[data-v-04c55e2f]:before {\\n  content: '\\\\E6A6';\\n}\\n.iconclose[data-v-04c55e2f]:before {\\n  content: '\\\\E849';\\n}\\n.panel[data-v-04c55e2f] {\\n  z-index: 9999;\\n  display: block;\\n  left: 0;\\n  top: 72px;\\n  position: fixed;\\n  width: 100%;\\n  height: 100%;\\n  background-color: #ffffff;\\n  overflow: scroll;\\n  padding-bottom: 200px;\\n}\\n.panel .mask[data-v-04c55e2f] {\\n    width: 100%;\\n    height: 100%;\\n    position: fixed;\\n    z-index: 1001;\\n    left: 0;\\n    top: 0;\\n}\\n.panel .list[data-v-04c55e2f] {\\n    position: relative;\\n    z-index: 2001;\\n    padding: 0 20px;\\n}\\n.panel .lang[data-v-04c55e2f] {\\n    position: relative;\\n    z-index: 2002;\\n    display: flex;\\n    background-color: #ffffff;\\n    padding: 20px 36px;\\n}\\n.panel .lang-item[data-v-04c55e2f] {\\n      border-right: solid 1px #ebedf0;\\n      padding: 0 12px;\\n}\\n.panel .lang-item[data-v-04c55e2f]:first-child {\\n        padding: 0 10px 0 0;\\n}\\n.panel .lang-item-act[data-v-04c55e2f] {\\n        color: #f05a23;\\n}\\n.coll-item-act[data-v-04c55e2f] {\\n  color: #f05a23;\\n}\\n.list-item[data-v-04c55e2f] {\\n  display: flex;\\n  align-items: center;\\n  padding: 16px 16px;\\n  position: relative;\\n  border-bottom: 1px solid #ebedf0;\\n  font-size: 14px;\\n  color: #4c4948;\\n  background-color: #fff;\\n}\\n.list-item .txt[data-v-04c55e2f] {\\n    flex: 1;\\n}\\n.icon-wrap[data-v-04c55e2f] {\\n  height: 100%;\\n}\\n.plus-icon[data-v-04c55e2f] {\\n  width: 21px;\\n  height: 21px;\\n  background: url(\" + escape(__webpack_require__(/*! @/assets/images/home/icon-head-plus.png */ \"./src/assets/images/home/icon-head-plus.png\")) + \") no-repeat center;\\n  transform: scale(0.6);\\n}\\n.arrow-icon[data-v-04c55e2f] {\\n  width: 21px;\\n  height: 21px;\\n  background: url(\" + escape(__webpack_require__(/*! @/assets/images/home/icon-head-right-arrow.png */ \"./src/assets/images/home/icon-head-right-arrow.png\")) + \") no-repeat center;\\n  transform: scale(0.6);\\n}\\n.plus-icon-act[data-v-04c55e2f] {\\n  background: url(\" + escape(__webpack_require__(/*! @/assets/images/home/icon-head-plus-act.png */ \"./src/assets/images/home/icon-head-plus-act.png\")) + \") no-repeat center;\\n}\\n.hide[data-v-04c55e2f] {\\n  display: none;\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wNGM1NWUyZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlP2M2ZGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGVzY2FwZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvdXJsL2VzY2FwZS5qc1wiKTtcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoZmFsc2UpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiQGNoYXJzZXQgXFxcIlVURi04XFxcIjtcXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiDmlK/mjIHmlofku7ZcXG4gKiDpnIDopoHlvJXnlKjnmoTlnLDmlrnlnYfpnIDopoHliqDkuIrov5nkuKrmlK/mjIHmlofku7ZcXG4gKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqXFxuICovXFxuLyoqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICogU2FzcyBNaW54aW5zXFxuICpcXG4gKiDlj4LogIPmlLbpm4bvvJpcXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAtc2Fzcy90cmVlL21hc3Rlci9hc3NldHMvc3R5bGVzaGVldHMvYm9vdHN0cmFwL21peGluc1xcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqXFxuICovXFxuLyoqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICogU2FzcyDlj5jph49cXG4gKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqXFxuICovXFxuLmJpc1tkYXRhLXYtMDRjNTVlMmZdLCAucGx1cy1pY29uW2RhdGEtdi0wNGM1NWUyZl0sIC5hcnJvdy1pY29uW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmxbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4uZmxjW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4uZmxiW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYVtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZmNjW2RhdGEtdi0wNGM1NWUyZl0sIC5wYW5lbCAubGFuZy1pdGVtW2RhdGEtdi0wNGM1NWUyZl0sIC5pY29uLXdyYXBbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uYmJbZGF0YS12LTA0YzU1ZTJmXSwgLmFsZXJ0W2RhdGEtdi0wNGM1NWUyZl0sIC5pcHQtd3JhcCAuaXB0W2RhdGEtdi0wNGM1NWUyZl0sIC5saXN0LWl0ZW1bZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG4uZnVsbHBbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuLnBvaW50ZXJbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi50ZXh0LWxbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbn1cXG4udGV4dC1yW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxufVxcbi50ZXh0LWNbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5iY1tkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmZsZXgxW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZmxleDogMTtcXG59XFxuLmRpc2FibGVkW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XFxuICBjb2xvcjogIzRjNDk0OCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xcbn1cXG4uY09yYW5nZVtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIGNvbG9yOiAjZjA1YTIzO1xcbn1cXG4uY0dyZWVuW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgY29sb3I6ICMwMDY0NDE7XFxufVxcbi5jR3JheVtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIGNvbG9yOiAjYmZiZmJmO1xcbn1cXG4uY0RhcmtbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBjb2xvcjogI2RjZGNkYztcXG59XFxuLmFsZXJ0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICBib3JkZXI6IHNvbGlkIDFweCAjZGNkZGRkO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjtcXG4gIG1hcmdpbjogMCBhdXRvIDEycHg7XFxuICBwYWRkaW5nOiA2cHggMzZweDtcXG59XFxuLmFsZXJ0IC5pY29uW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uYWxlcnQgLmJ0bltkYXRhLXYtMDRjNTVlMmZdIHtcXG4gICAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5hbGVydCAuY2xvc2VbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDE3cHg7XFxufVxcbi5pcHQtd3JhcCAuaXB0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDQuNXJlbTtcXG4gIGJvcmRlci1yYWRpdXM6IDQuNXJlbTtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQgIWltcG9ydGFudDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICBwYWRkaW5nOiAwIDJyZW07XFxuICBmbGV4OiAxO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMXJlbTtcXG59XFxuLmlwdC13cmFwIC5kb3duLWFycm93W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAyLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9kb3duLWFycm93LnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMXJlbTtcXG4gIGhlaWdodDogLjY2NjY2N3JlbTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZVtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMS4ycmVtO1xcbiAgcmlnaHQ6IDJyZW07XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9mZi5wbmdcIikpICsgXCIpO1xcbiAgd2lkdGg6IDI3cHg7XFxuICBoZWlnaHQ6IDI0cHg7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLmlwdC13cmFwIC5leWUtYWN0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2ljb24tZXllcy1vbi5wbmdcIikpICsgXCIpO1xcbn1cXG4uaXB0W2RhdGEtdi0wNGM1NWUyZl06Zm9jdXMge1xcbiAgYm9yZGVyLWNvbG9yOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbi5pcHQuZXJyW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgYm9yZGVyLWNvbG9yOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB3aWR0aDogMXJlbSAhaW1wb3J0YW50O1xcbiAgaGVpZ2h0OiAxcmVtICFpbXBvcnRhbnQ7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQtYWN0aXZlW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgYmFja2dyb3VuZDogI2YwNWEyMyAhaW1wb3J0YW50O1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXG4uYWxlcnRbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICAgIHBhZGRpbmc6IDRweCAzNnB4IDRweCAxMnB4O1xcbn1cXG59XFxuXFxuLyog5Zu+54mH5a2X5L2TICovXFxuQGZvbnQtZmFjZSB7XFxuICBmb250LWZhbWlseTogJ2ljb25mb250JztcXG4gIHNyYzogdXJsKFxcXCJkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC13b2ZmMjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHTWdBQkFBQUFBQVNFQUFzQUFBQUFDU0FBQUFRM0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSEVJR1ZnQ0RTQXFGR0lRbkFUWUNKQU1ZQ3c0QUJDQUZoRzBIVkJ2WkJ4R1ZuTnZJZmh6WURWK0JBZTl3dEppR09OVEdZdUhCWi9PaDc3UTNPeHVwSXRPZUZGVGNRanBSWHdLK0FJYm4wOG5lNzY2WHBwc2l3UktQa3NRVGo3QU80eEFPdjNmT0Fkc0pjMEtOWk8zSW84OUxmOEs5QmtZK2NlKzRkZjREbXMreVhNYWNOTmJFQU9PQUF0cmJGMW1CeEFscXkvRHE4dXF3cmdNQmlQR0FENGc2ZGJnR1FoU3NlUVJBS3N0SzhpRk1tRkFWQk1IU2RzRldGcGtOSGhZemhia0VZSmIzZWZJR1FVUUlEQ2FGdFhRMGwxS0VoT2ZLVitHMDE5QXJ5N0dnYnpnSEFHRVhVSUFQQUJaSVo2R3JHVFNJK29CaWE3L0E0Z1ZBaW9XQmVxNTh2dkhsa0plTnI4SU5CaEl5eTBkd3dWOGVzSmc0TUJBZ2ZHQ1ZsS1VOai9IZ3VaSWF3R3JxalpnTFBIZzV4QUNLMVkyWUN3eThDcGRjbG80L1lJTUljQkxBTlpoOVlHa0lQSHRhMk5vclRLeFVTbFVOVjdLb3oyenN3bzBtUmZOTlJzOWZiRnE4WUpyNXVFWExXbzdjRWQrNnBibDlXM3Yzcmo0Zzd0elJwVSs3SGF1UjBZYm1KMitkYWxMRUxaeTZ1ZGUwdUdoKzc1WnA1aVhGQ3haTVcyUSswSVFPS3NhN1NNSklLSDE4aDN5OWhXWSttTjR0RXRXMGJZVDJtZW1XcGsxZGI3TDgxdFE3ZGdzM2lzVWJ0MXJybDBrVTB5eTFTemE3WkN3MG00bENJekZNRjJ3dzE1K1FwMXU0M3NSay9oSlQ3WUpONXVhTGx1b2xQWlNUdnExbTR2bWJnUjd2ZU0xMTZPakJHcDJLMjFvTWJrUkdudnFnbG5DTFZoYXJ1QU02Z2wrdG9UTllQWnM1ZG95WkRYeUhieC9SU3ZaTXQ2dE50eDdSbHprV2xjeXNXUXlTVjJJK1BpbzAwOE5wOG1RdkwvajBDRVZMTElJdGxvaUVJUElGbkNCRE43WnBDNm4zaS9lckUwdVhJQ1QvdCsyNjlyVnJqeDRkZSt3cnd5bmZqbzFCYU4vdFhRbXpKM3dJRjlrcmdoVUhxTjFlRkI0Zk12dUNST3JudlZ3ZGtVZVdMZmYyazcwSWlPOGZzMnlPYWJYcEhIZGx2WCtBNXJtSzZkeDRwaVhsYkh1bmliK2lOZVZNK1VuWEZ2V1pqUjJ1bGVWRi9qc2JLMTJ3bzhPV0RwWStUUkgwalA4c3lMczBXSWxPQUlEaEZIT1ArZ0lBMVRGM2tDT0JPY2JhajlGamdZQ0o5N0NFRnZ3dDM1R2ZLWjJZcTRqNUppR1VzQUMrSnV1N3NhU1phdkRLMVdncy9qZWFhZ0IvUTBXVXN1WXV0VE9kSUtEbG1UTGhBVGEwM01za04wK0cwdDF2Y2p5RVRDTU1Bclk0Q0xtUWl1YURTU0lFVFNnZW03ZEJ1MC9HNm8yUkVnR2VKaUFRU3J2QWtEc0tTdWt5aWFVOUJvK1pkK0JUWmd3eFhkWkhTcmpGcm80Wm9xS2xnaitWU2U0VXNkYVZYM2lEZmdlUjQxS1A4VUl1TmtDQmZnSHB4QlVkOGhBckdqNzYwRmdWY1pranBhTGJFQUpUYldZSFdUZWx0ZmFOdno5WDlLSk5JY2ZCU3JJTWhBcGFwTUFmS1NPeGpuSjZWNnZNKzI5QWV3dUVYTkZSNDMyQnJMQ0RrMEIrQWhxUXJxcXVVY2Vsakc3d29SMDBxaFE3aTVPeGlLUmlCd1NJTWxKYlBNa0JxZG9vN1JEdU5meVpibHhUMVdaNlRiekxmYkJaNTNRWVFnbExlSVJQQkJCOWhQVEhIOW9MTWhRNXI1aXBERnd3TVJ3eFJlenJmekFBQUE9PVxcXCIpIGZvcm1hdChcXFwid29mZjJcXFwiKTtcXG59XFxuLmljb25mb250W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgZm9udC1mYW1pbHk6ICdpY29uZm9udCcgIWltcG9ydGFudDtcXG4gIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG59XFxuLmljb25yZWZyZXNoW2RhdGEtdi0wNGM1NWUyZl06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTg3NCc7XFxufVxcbi5pY29uZW1wdHlbZGF0YS12LTA0YzU1ZTJmXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFNkE2JztcXG59XFxuLmljb25jbG9zZVtkYXRhLXYtMDRjNTVlMmZdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU4NDknO1xcbn1cXG4ucGFuZWxbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB6LWluZGV4OiA5OTk5O1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiA3MnB4O1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbiAgb3ZlcmZsb3c6IHNjcm9sbDtcXG4gIHBhZGRpbmctYm90dG9tOiAyMDBweDtcXG59XFxuLnBhbmVsIC5tYXNrW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIHotaW5kZXg6IDEwMDE7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHRvcDogMDtcXG59XFxuLnBhbmVsIC5saXN0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHotaW5kZXg6IDIwMDE7XFxuICAgIHBhZGRpbmc6IDAgMjBweDtcXG59XFxuLnBhbmVsIC5sYW5nW2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHotaW5kZXg6IDIwMDI7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICAgIHBhZGRpbmc6IDIwcHggMzZweDtcXG59XFxuLnBhbmVsIC5sYW5nLWl0ZW1bZGF0YS12LTA0YzU1ZTJmXSB7XFxuICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggI2ViZWRmMDtcXG4gICAgICBwYWRkaW5nOiAwIDEycHg7XFxufVxcbi5wYW5lbCAubGFuZy1pdGVtW2RhdGEtdi0wNGM1NWUyZl06Zmlyc3QtY2hpbGQge1xcbiAgICAgICAgcGFkZGluZzogMCAxMHB4IDAgMDtcXG59XFxuLnBhbmVsIC5sYW5nLWl0ZW0tYWN0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgICAgICAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5jb2xsLWl0ZW0tYWN0W2RhdGEtdi0wNGM1NWUyZl0ge1xcbiAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5saXN0LWl0ZW1bZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIHBhZGRpbmc6IDE2cHggMTZweDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWJlZGYwO1xcbiAgZm9udC1zaXplOiAxNHB4O1xcbiAgY29sb3I6ICM0YzQ5NDg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbn1cXG4ubGlzdC1pdGVtIC50eHRbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICAgIGZsZXg6IDE7XFxufVxcbi5pY29uLXdyYXBbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBoZWlnaHQ6IDEwMCU7XFxufVxcbi5wbHVzLWljb25bZGF0YS12LTA0YzU1ZTJmXSB7XFxuICB3aWR0aDogMjFweDtcXG4gIGhlaWdodDogMjFweDtcXG4gIGJhY2tncm91bmQ6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1oZWFkLXBsdXMucG5nXCIpKSArIFwiKSBuby1yZXBlYXQgY2VudGVyO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xcbn1cXG4uYXJyb3ctaWNvbltkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIHdpZHRoOiAyMXB4O1xcbiAgaGVpZ2h0OiAyMXB4O1xcbiAgYmFja2dyb3VuZDogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWhlYWQtcmlnaHQtYXJyb3cucG5nXCIpKSArIFwiKSBuby1yZXBlYXQgY2VudGVyO1xcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xcbn1cXG4ucGx1cy1pY29uLWFjdFtkYXRhLXYtMDRjNTVlMmZdIHtcXG4gIGJhY2tncm91bmQ6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1oZWFkLXBsdXMtYWN0LnBuZ1wiKSkgKyBcIikgbm8tcmVwZWF0IGNlbnRlcjtcXG59XFxuLmhpZGVbZGF0YS12LTA0YzU1ZTJmXSB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cIiwgXCJcIl0pO1xuXG4vLyBleHBvcnRzXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var escape = __webpack_require__(/*! ../../../node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\");\nexports = module.exports = __webpack_require__(/*! ../../../node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js */ \"./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \"@charset \\\"UTF-8\\\";\\n/**\\n * ------------------------------------------------------------------\\n * 支持文件\\n * 需要引用的地方均需要加上这个支持文件\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass Minxins\\n *\\n * 参考收集:\\n * https://github.com/twbs/bootstrap-sass/tree/master/assets/stylesheets/bootstrap/mixins\\n * ------------------------------------------------------------------\\n *\\n */\\n/**\\n * ------------------------------------------------------------------\\n * Sass 变量\\n *\\n * ------------------------------------------------------------------\\n *\\n */\\n.bis[data-v-1badc801] {\\n  background-repeat: no-repeat;\\n  background-size: 100% 100%;\\n}\\n.fl[data-v-1badc801] {\\n  display: flex;\\n}\\n.flc[data-v-1badc801] {\\n  display: flex;\\n  justify-content: center;\\n}\\n.flb[data-v-1badc801] {\\n  display: flex;\\n  justify-content: space-between;\\n}\\n.fla[data-v-1badc801] {\\n  display: flex;\\n  align-items: center;\\n}\\n.fcc[data-v-1badc801], .detail .txt[data-v-1badc801] {\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n}\\n.bb[data-v-1badc801], .alert[data-v-1badc801], .ipt-wrap .ipt[data-v-1badc801], .recommend-item[data-v-1badc801], .detail .txt[data-v-1badc801] {\\n  box-sizing: border-box;\\n}\\n.fullp[data-v-1badc801] {\\n  width: 100%;\\n  height: 100%;\\n}\\n.pointer[data-v-1badc801] {\\n  cursor: pointer;\\n}\\n.text-l[data-v-1badc801] {\\n  text-align: left;\\n}\\n.text-r[data-v-1badc801] {\\n  text-align: right;\\n}\\n.text-c[data-v-1badc801] {\\n  text-align: center;\\n}\\n.bc[data-v-1badc801] {\\n  text-align: center;\\n}\\n.flex1[data-v-1badc801] {\\n  flex: 1;\\n}\\n.disabled[data-v-1badc801] {\\n  cursor: default !important;\\n  color: #4c4948 !important;\\n  background-color: #dcdddd !important;\\n  background-image: none !important;\\n  box-shadow: none !important;\\n}\\n.cOrange[data-v-1badc801] {\\n  color: #f05a23;\\n}\\n.cGreen[data-v-1badc801] {\\n  color: #006441;\\n}\\n.cGray[data-v-1badc801] {\\n  color: #bfbfbf;\\n}\\n.cDark[data-v-1badc801] {\\n  color: #dcdcdc;\\n}\\n.alert[data-v-1badc801] {\\n  display: flex;\\n  align-items: center;\\n  position: relative;\\n  width: 100%;\\n  border-radius: 10px;\\n  border: solid 1px #dcdddd;\\n  background-color: #f2f2f2;\\n  margin: 0 auto 12px;\\n  padding: 6px 36px;\\n}\\n.alert .icon[data-v-1badc801] {\\n    margin-right: 5px;\\n    display: inline-block;\\n}\\n.alert .btn[data-v-1badc801] {\\n    color: #f05a23;\\n}\\n.alert .close[data-v-1badc801] {\\n    position: absolute;\\n    right: 17px;\\n}\\n.ipt-wrap .ipt[data-v-1badc801] {\\n  width: 100%;\\n  height: 4.5rem;\\n  border-radius: 4.5rem;\\n  border: solid 1px #dcdddd !important;\\n  background-color: #ffffff;\\n  padding: 0 2rem;\\n  flex: 1;\\n  letter-spacing: 0.1rem;\\n}\\n.ipt-wrap .down-arrow[data-v-1badc801] {\\n  position: absolute;\\n  top: 2.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/down-arrow.png */ \"./src/assets/images/common/down-arrow.png\")) + \");\\n  width: 1rem;\\n  height: .666667rem;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye[data-v-1badc801] {\\n  position: absolute;\\n  top: 1.2rem;\\n  right: 2rem;\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-off.png */ \"./src/assets/images/common/icon-eyes-off.png\")) + \");\\n  width: 27px;\\n  height: 24px;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n.ipt-wrap .eye-act[data-v-1badc801] {\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/icon-eyes-on.png */ \"./src/assets/images/common/icon-eyes-on.png\")) + \");\\n}\\n.ipt[data-v-1badc801]:focus {\\n  border-color: #f05a23 !important;\\n}\\n.ipt.err[data-v-1badc801] {\\n  border-color: #f05a23 !important;\\n}\\n.swiper-pagination-bullet[data-v-1badc801] {\\n  width: 1rem !important;\\n  height: 1rem !important;\\n}\\n.swiper-pagination-bullet-active[data-v-1badc801] {\\n  background: #f05a23 !important;\\n}\\n@media (max-width: 768px) {\\n.alert[data-v-1badc801] {\\n    padding: 4px 36px 4px 12px;\\n}\\n}\\n\\n/* 图片字体 */\\n@font-face {\\n  font-family: 'iconfont';\\n  src: url(\\\"data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAASEAAsAAAAACSAAAAQ3AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDSAqFGIQnATYCJAMYCw4ABCAFhG0HVBvZBxGVnNvIfhzYDV+BAe9wtJiGONTGYuHBZ/Oh77Q3OxupItOeFFTcQjpRXwK+AIbn08ne766XppsiwRKPksQTj7AO4xAOv3fOAdsJc0KNZO3Io89Lf8K9BkY+ce+4df4Dms+yXMacNNbEAOOAAtrbF1mBxAlqy/Dq8uqwrgMBiPGAD4g6dbgGQhSseQRAKstK8iFMmFAVBMHSdsFWFpkNHhYzhbkEYJb3efIGQUQIDCaFtXQ0l1KEhOfKV+G019Ary7GgbzgHAGEXUIAPABZIZ6GrGTSI+oBia7/A4gVAioWBeq58vvHlkJeNr8INBhIyy0dwwV8esJg4MBAgfGCVlKUNj/HguZIawGrqjZgLPHg5xACK1Y2YCwy8Cpdclo4/YIMIcBLANZh9YGkIPHta2NorTKxUSlUNV7Koz2zswo0mRfNNRs9fbFq8YJr5uEXLWo7cEd+6pbl9W3v3rj4g7tzRpU+7HauR0YbmJ2+dalLELZy6ude0uGh+75Zp5iXFCxZMW2Q+0IQOKsa7SMJIKH18h3y9hWY+mN4tEtW0bYT2memWpk1db7L81tQ7dgs3isUbt1rrl0kU0yy1Sza7ZCw0m4lCIzFMF2ww15+Qp1u43sRk/hJT7YJN5uaLluolPZSTvq1m4vmbgR7veM116OjBGp2K21oMbkRGnvqglnCLVharuAM6gl+toTNYPZs5doyZDXyHbx/RSvZMt6tNtx7RlzkWlcysWQySV2I+Pio008Np8mQvL/j0CEVLLIItloiEIPIFnCBDN7ZpC6n3i/erE0uXICT/t+269rVrjx4de+wrwynfjo1BaN/tXQmzJ3wIF9krghUHqN1eFB4fMvuCROrnvVwdkUeWLff2k70IiO8fs2yOabXpHHdlvX+A5rmK6dx4piXlbHunib+iNeVM+UnXFvWZjR2uleVF/jsbK12wo8OWDpY+TRH0jP8syLs0WIlOAIDhFHOP+gIA1TF3kCOBOcbaj9FjgYCJ97CEFvwt35GfKZ2Yq4j5JiGUsAC+Juu7saSZavDK1Wgs/jeaagB/Q0WUsuYutTOdIKDlmTLhATa03MskN0+G0t1vcjyETCMMArY4CLmQiuaDSSIETSgem7dBu0/G6o2REgGeJiAQSrvAkDsKSukyiaU9Bo+Zd+BTZgwxXdZHSrjFro4ZoqKlgj+VSe4UsdaVX3iDfgeR41KP8UIuNkCBfgHpxBUd8hArGj760FgVcZkjpaLbEAJTbWYHWTeltfaNvz9X9KJNIcfBSrIMhApapMAfKSOxjnJ6V6vM+29AewuEXNFR432BrLCDk0B+AhqQrqquUceljG7woR00qhQ7i5OxiKRiBwSIMlJbPMkBqdoo7RDuNfyZblxT1WZ6TbzLfbBZ53QYQglLeIRPBBB9hPTHH9oLMhQ5r5ipDFwwMRwxRezrfzAAAA==\\\") format(\\\"woff2\\\");\\n}\\n.iconfont[data-v-1badc801] {\\n  font-family: 'iconfont' !important;\\n  font-size: 16px;\\n  font-style: normal;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n.iconrefresh[data-v-1badc801]:before {\\n  content: '\\\\E874';\\n}\\n.iconempty[data-v-1badc801]:before {\\n  content: '\\\\E6A6';\\n}\\n.iconclose[data-v-1badc801]:before {\\n  content: '\\\\E849';\\n}\\n.content[data-v-1badc801] {\\n  padding-bottom: 2.25rem;\\n}\\n.top-space[data-v-1badc801] {\\n  height: 2.25rem;\\n}\\n.box[data-v-1badc801] {\\n  position: relative;\\n  margin-top: 28px;\\n}\\n.banner-contaner[data-v-1badc801] {\\n  width: 100%;\\n  height: 470px;\\n  margin: 0 auto;\\n  position: relative;\\n  z-index: 1;\\n  overflow: hidden;\\n}\\n.banner-pc[data-v-1badc801] {\\n  display: block;\\n  position: absolute;\\n  z-index: 1;\\n  left: 50%;\\n  margin-left: -960px;\\n  top: 0;\\n  width: 1920px;\\n  height: 100%;\\n  overflow: hidden;\\n}\\n.banner-pc .banner-img[data-v-1badc801] {\\n    width: 100%;\\n    height: 100%;\\n    cursor: pointer;\\n}\\n.banner-mobile[data-v-1badc801] {\\n  display: none;\\n}\\n.banner-mobile .banner-img[data-v-1badc801] {\\n    width: 100%;\\n}\\n.recommend[data-v-1badc801] {\\n  display: flex;\\n  text-align: center;\\n  justify-content: space-between;\\n  flex-wrap: wrap;\\n}\\n.recommend-item[data-v-1badc801] {\\n    margin-right: 10px;\\n    position: relative;\\n    width: 24.25rem;\\n    height: 32.75rem;\\n    border-radius: 5px;\\n    background-color: #fbfbfb;\\n}\\n.recommend-item[data-v-1badc801]:last-child {\\n      margin-right: 0;\\n}\\n.recommend-item .img[data-v-1badc801] {\\n      width: 100%;\\n      height: 24.25rem;\\n      background-size: cover;\\n}\\n.recommend-item .img1[data-v-1badc801] {\\n      background: url(\" + escape(__webpack_require__(/*! @/assets/images/index/recommend-1.png */ \"./src/assets/images/index/recommend-1.png\")) + \") no-repeat center;\\n      background-size: cover;\\n}\\n.recommend-item .img2[data-v-1badc801] {\\n      background: url(\" + escape(__webpack_require__(/*! @/assets/images/index/recommend-2.png */ \"./src/assets/images/index/recommend-2.png\")) + \") no-repeat center;\\n      background-size: cover;\\n}\\n.recommend-item .img3[data-v-1badc801] {\\n      background: url(\" + escape(__webpack_require__(/*! @/assets/images/index/recommend-3.png */ \"./src/assets/images/index/recommend-3.png\")) + \") no-repeat center;\\n      background-size: cover;\\n}\\n.recommend-item .img4[data-v-1badc801] {\\n      background: url(\" + escape(__webpack_require__(/*! @/assets/images/index/recommend-4.png */ \"./src/assets/images/index/recommend-4.png\")) + \") no-repeat center;\\n      background-size: cover;\\n}\\n.recommend-item .btn[data-v-1badc801] {\\n      position: absolute;\\n      left: 0;\\n      right: 0;\\n      bottom: 3rem;\\n      margin: 0 auto;\\n      width: 13.5rem;\\n      height: 4rem;\\n      line-height: 4rem;\\n      font-size: 16px;\\n      border-radius: 4rem;\\n      text-align: center;\\n      color: #ffffff;\\n      background-color: #f05a23;\\n      box-shadow: 0px 10px 13px 0 rgba(236, 100, 41, 0.2);\\n      background-blend-mode: soft-light;\\n      background-image: linear-gradient(to bottom, #ec6429, #ec6429), linear-gradient(to top, #000000, #ffffff);\\n}\\n.recommend-item img[data-v-1badc801] {\\n      width: 100%;\\n      border-top-right-radius: 8px;\\n      border-top-left-radius: 8px;\\n}\\n.recommend-item[data-v-1badc801]:first-child {\\n      padding-left: 0;\\n}\\n.recommend-item[data-v-1badc801]:last-child {\\n      padding-right: 0;\\n}\\n.detail[data-v-1badc801] {\\n  display: flex;\\n  max-width: 1200px;\\n}\\n.detail .txt[data-v-1badc801] {\\n    position: relative;\\n    display: -webkit-box;\\n    word-break: break-all;\\n    -webkit-box-orient: vertical;\\n    -webkit-line-clamp: 14;\\n    overflow: hidden;\\n    text-overflow: ellipsis;\\n    padding-left: 2.166667rem;\\n    flex: 1;\\n    line-height: 2.3;\\n    letter-spacing: 1.4px;\\n}\\n.swiper-button-prev[data-v-1badc801] {\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/button-prev.png */ \"./src/assets/images/common/button-prev.png\")) + \");\\n  left: 360px;\\n}\\n.swiper-button-next[data-v-1badc801] {\\n  background-image: url(\" + escape(__webpack_require__(/*! @/assets/images/common/button-next.png */ \"./src/assets/images/common/button-next.png\")) + \");\\n  right: 360px;\\n}\\n.swiper-pagination-fraction[data-v-1badc801],\\n.swiper-pagination-custom[data-v-1badc801],\\n.swiper-container-horizontal > .swiper-pagination-bullets[data-v-1badc801] {\\n  bottom: 48px;\\n}\\n.swiper-pagination-bullet[data-v-1badc801] {\\n  width: 12px;\\n  height: 12px;\\n  background-color: #dcdddd;\\n}\\n.swiper-pagination-bullet-active[data-v-1badc801] {\\n  width: 12px;\\n  height: 12px;\\n  background-color: #f05a23;\\n}\\n.box-shadow[data-v-1badc801], .recommend-item[data-v-1badc801] {\\n  box-shadow: 0 0 1.5rem 0 rgba(255, 87, 0, 0.15);\\n}\\n@media (max-width: 1200px) {\\n.content[data-v-1badc801] {\\n    box-sizing: border-box;\\n    padding: 0 4%;\\n}\\n.recommend[data-v-1badc801] {\\n    justify-content: center;\\n}\\n.recommend-item[data-v-1badc801] {\\n      width: 46% !important;\\n      padding: 0 !important;\\n      margin: 2% !important;\\n}\\n.detail[data-v-1badc801] {\\n    display: block;\\n}\\n.detail .vjs-custom-skin[data-v-1badc801] {\\n      width: 100%;\\n}\\n.detail .txt[data-v-1badc801] {\\n      padding: 0;\\n      margin: 10px 0 28px;\\n}\\n}\\n@media (max-width: 768px) {\\n.banner-contaner[data-v-1badc801] {\\n    height: auto;\\n}\\n.banner-pc[data-v-1badc801] {\\n    display: none;\\n}\\n.banner-mobile[data-v-1badc801] {\\n    display: block;\\n}\\n.recommend-item[data-v-1badc801] {\\n    width: 100% !important;\\n    margin: 10px auto !important;\\n}\\n.box-shadow[data-v-1badc801], .recommend-item[data-v-1badc801] {\\n    box-shadow: none;\\n}\\n.swiper-pagination-fraction[data-v-1badc801],\\n  .swiper-pagination-custom[data-v-1badc801],\\n  .swiper-container-horizontal > .swiper-pagination-bullets[data-v-1badc801] {\\n    bottom: 2px;\\n}\\n}\\n\", \"\"]);\n\n// exports\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/MDQ1ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZXNjYXBlID0gcmVxdWlyZShcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi91cmwvZXNjYXBlLmpzXCIpO1xuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKShmYWxzZSk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi8qKlxcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAqIOaUr+aMgeaWh+S7tlxcbiAqIOmcgOimgeW8leeUqOeahOWcsOaWueWdh+mcgOimgeWKoOS4iui/meS4quaUr+aMgeaWh+S7tlxcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIE1pbnhpbnNcXG4gKlxcbiAqIOWPguiAg+aUtumbhu+8mlxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC1zYXNzL3RyZWUvbWFzdGVyL2Fzc2V0cy9zdHlsZXNoZWV0cy9ib290c3RyYXAvbWl4aW5zXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4vKipcXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gKiBTYXNzIOWPmOmHj1xcbiAqXFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICpcXG4gKi9cXG4uYmlzW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xcbn1cXG4uZmxbZGF0YS12LTFiYWRjODAxXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4uZmxjW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4uZmxiW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuLmZsYVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG4uZmNjW2RhdGEtdi0xYmFkYzgwMV0sIC5kZXRhaWwgLnR4dFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcbi5iYltkYXRhLXYtMWJhZGM4MDFdLCAuYWxlcnRbZGF0YS12LTFiYWRjODAxXSwgLmlwdC13cmFwIC5pcHRbZGF0YS12LTFiYWRjODAxXSwgLnJlY29tbWVuZC1pdGVtW2RhdGEtdi0xYmFkYzgwMV0sIC5kZXRhaWwgLnR4dFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5mdWxscFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4ucG9pbnRlcltkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnRleHQtbFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcbi50ZXh0LXJbZGF0YS12LTFiYWRjODAxXSB7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG59XFxuLnRleHQtY1tkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmJjW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZmxleDFbZGF0YS12LTFiYWRjODAxXSB7XFxuICBmbGV4OiAxO1xcbn1cXG4uZGlzYWJsZWRbZGF0YS12LTFiYWRjODAxXSB7XFxuICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcXG4gIGNvbG9yOiAjNGM0OTQ4ICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkZGRkICFpbXBvcnRhbnQ7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7XFxuICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XFxufVxcbi5jT3JhbmdlW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgY29sb3I6ICNmMDVhMjM7XFxufVxcbi5jR3JlZW5bZGF0YS12LTFiYWRjODAxXSB7XFxuICBjb2xvcjogIzAwNjQ0MTtcXG59XFxuLmNHcmF5W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgY29sb3I6ICNiZmJmYmY7XFxufVxcbi5jRGFya1tkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGNvbG9yOiAjZGNkY2RjO1xcbn1cXG4uYWxlcnRbZGF0YS12LTFiYWRjODAxXSB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gIGJvcmRlcjogc29saWQgMXB4ICNkY2RkZGQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyO1xcbiAgbWFyZ2luOiAwIGF1dG8gMTJweDtcXG4gIHBhZGRpbmc6IDZweCAzNnB4O1xcbn1cXG4uYWxlcnQgLmljb25bZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5hbGVydCAuYnRuW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICBjb2xvcjogI2YwNWEyMztcXG59XFxuLmFsZXJ0IC5jbG9zZVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogMTdweDtcXG59XFxuLmlwdC13cmFwIC5pcHRbZGF0YS12LTFiYWRjODAxXSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogNC41cmVtO1xcbiAgYm9yZGVyLXJhZGl1czogNC41cmVtO1xcbiAgYm9yZGVyOiBzb2xpZCAxcHggI2RjZGRkZCAhaW1wb3J0YW50O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG4gIHBhZGRpbmc6IDAgMnJlbTtcXG4gIGZsZXg6IDE7XFxuICBsZXR0ZXItc3BhY2luZzogMC4xcmVtO1xcbn1cXG4uaXB0LXdyYXAgLmRvd24tYXJyb3dbZGF0YS12LTFiYWRjODAxXSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDIuMnJlbTtcXG4gIHJpZ2h0OiAycmVtO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2Rvd24tYXJyb3cucG5nXCIpKSArIFwiKTtcXG4gIHdpZHRoOiAxcmVtO1xcbiAgaGVpZ2h0OiAuNjY2NjY3cmVtO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5pcHQtd3JhcCAuZXllW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAxLjJyZW07XFxuICByaWdodDogMnJlbTtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb2ZmLnBuZ1wiKSkgKyBcIik7XFxuICB3aWR0aDogMjdweDtcXG4gIGhlaWdodDogMjRweDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4uaXB0LXdyYXAgLmV5ZS1hY3RbZGF0YS12LTFiYWRjODAxXSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9uLnBuZ1wiKSkgKyBcIik7XFxufVxcbi5pcHRbZGF0YS12LTFiYWRjODAxXTpmb2N1cyB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLmlwdC5lcnJbZGF0YS12LTFiYWRjODAxXSB7XFxuICBib3JkZXItY29sb3I6ICNmMDVhMjMgIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHdpZHRoOiAxcmVtICFpbXBvcnRhbnQ7XFxuICBoZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldC1hY3RpdmVbZGF0YS12LTFiYWRjODAxXSB7XFxuICBiYWNrZ3JvdW5kOiAjZjA1YTIzICFpbXBvcnRhbnQ7XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcbi5hbGVydFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgcGFkZGluZzogNHB4IDM2cHggNHB4IDEycHg7XFxufVxcbn1cXG5cXG4vKiDlm77niYflrZfkvZMgKi9cXG5AZm9udC1mYWNlIHtcXG4gIGZvbnQtZmFtaWx5OiAnaWNvbmZvbnQnO1xcbiAgc3JjOiB1cmwoXFxcImRhdGE6YXBwbGljYXRpb24veC1mb250LXdvZmYyO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdNZ0FCQUFBQUFBU0VBQXNBQUFBQUNTQUFBQVEzQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIRUlHVmdDRFNBcUZHSVFuQVRZQ0pBTVlDdzRBQkNBRmhHMEhWQnZaQnhHVm5OdklmaHpZRFYrQkFlOXd0SmlHT05UR1l1SEJaL09oNzdRM094dXBJdE9lRkZUY1FqcFJYd0srQUlibjA4bmU3NjZYcHBzaXdSS1Brc1FUajdBTzR4QU92M2ZPQWRzSmMwS05aTzNJbzg5TGY4SzlCa1krY2UrNGRmNERtcyt5WE1hY05OYkVBT09BQXRyYkYxbUJ4QWxxeS9EcTh1cXdyZ01CaVBHQUQ0ZzZkYmdHUWhTc2VRUkFLc3RLOGlGTW1GQVZCTUhTZHNGV0Zwa05IaFl6aGJrRVlKYjNlZklHUVVRSURDYUZ0WFEwbDFLRWhPZktWK0cwMTlBcnk3R2diemdIQUdFWFVJQVBBQlpJWjZHckdUU0krb0JpYTcvQTRnVkFpb1dCZXE1OHZ2SGxrSmVOcjhJTkJoSXl5MGR3d1Y4ZXNKZzRNQkFnZkdDVmxLVU5qL0hndVpJYXdHcnFqWmdMUEhnNXhBQ0sxWTJZQ3d5OENwZGNsbzQvWUlNSWNCTEFOWmg5WUdrSVBIdGEyTm9yVEt4VVNsVU5WN0tvejJ6c3dvMG1SZk5OUnM5ZmJGcThZSnI1dUVYTFdvN2NFZCs2cGJsOVczdjNyajRnN3R6UnBVKzdIYXVSMFlibUoyK2RhbExFTFp5NnVkZTB1R2grNzVacDVpWEZDeFpNVzJRKzBJUU9Lc2E3U01KSUtIMThoM3k5aFdZK21ONHRFdFcwYllUMm1lbVdwazFkYjdMODF0UTdkZ3MzaXNVYnQxcnJsMGtVMHl5MVN6YTdaQ3cwbTRsQ0l6Rk1GMnd3MTUrUXAxdTQzc1JrL2hKVDdZSk41dWFMbHVvbFBaU1R2cTFtNHZtYmdSN3ZlTTExNk9qQkdwMksyMW9NYmtSR252cWdsbkNMVmhhcnVBTTZnbCt0b1ROWVBaczVkb3laRFh5SGJ4L1JTdlpNdDZ0TnR4N1JsemtXbGN5c1dReVNWMkkrUGlvMDA4TnA4bVF2TC9qMENFVkxMSUl0bG9pRUlQSUZuQ0JETjdacEM2bjNpL2VyRTB1WElDVC90KzI2OXJWcmp4NGRlK3dyd3luZmpvMUJhTi90WFFtekozd0lGOWtyZ2hVSHFOMWVGQjRmTXZ1Q1JPcm52Vndka1VlV0xmZjJrNzBJaU84ZnMyeU9hYlhwSEhkbHZYK0E1cm1LNmR4NHBpWGxiSHVuaWIraU5lVk0rVW5YRnZXWmpSMnVsZVZGL2pzYksxMndvOE9XRHBZK1RSSDBqUDhzeUxzMFdJbE9BSURoRkhPUCtnSUExVEYza0NPQk9jYmFqOUZqZ1lDSjk3Q0VGdnd0MzVHZktaMllxNGo1SmlHVXNBQytKdXU3c2FTWmF2REsxV2dzL2plYWFnQi9RMFdVc3VZdXRUT2RJS0RsbVRMaEFUYTAzTXNrTjArRzB0MXZjanlFVENNTUFyWTRDTG1RaXVhRFNTSUVUU2dlbTdkQnUwL0c2bzJSRWdHZUppQVFTcnZBa0RzS1N1a3lpYVU5Qm8rWmQrQlRaZ3d4WGRaSFNyakZybzRab3FLbGdqK1ZTZTRVc2RhVlgzaURmZ2VSNDFLUDhVSXVOa0NCZmdIcHhCVWQ4aEFyR2o3NjBGZ1ZjWmtqcGFMYkVBSlRiV1lIV1RlbHRmYU52ejlYOUtKTkljZkJTcklNaEFwYXBNQWZLU094am5KNlY2dk0rMjlBZXd1RVhORlI0MzJCckxDRGswQitBaHFRcnFxdVVjZWxqRzd3b1IwMHFoUTdpNU94aUtSaUJ3U0lNbEpiUE1rQnFkb283UkR1TmZ5WmJseFQxV1o2VGJ6TGZiQlo1M1FZUWdsTGVJUlBCQkI5aFBUSEg5b0xNaFE1cjVpcERGd3dNUnd4UmV6cmZ6QUFBQT09XFxcIikgZm9ybWF0KFxcXCJ3b2ZmMlxcXCIpO1xcbn1cXG4uaWNvbmZvbnRbZGF0YS12LTFiYWRjODAxXSB7XFxuICBmb250LWZhbWlseTogJ2ljb25mb250JyAhaW1wb3J0YW50O1xcbiAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbn1cXG4uaWNvbnJlZnJlc2hbZGF0YS12LTFiYWRjODAxXTpiZWZvcmUge1xcbiAgY29udGVudDogJ1xcXFxFODc0JztcXG59XFxuLmljb25lbXB0eVtkYXRhLXYtMWJhZGM4MDFdOmJlZm9yZSB7XFxuICBjb250ZW50OiAnXFxcXEU2QTYnO1xcbn1cXG4uaWNvbmNsb3NlW2RhdGEtdi0xYmFkYzgwMV06YmVmb3JlIHtcXG4gIGNvbnRlbnQ6ICdcXFxcRTg0OSc7XFxufVxcbi5jb250ZW50W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgcGFkZGluZy1ib3R0b206IDIuMjVyZW07XFxufVxcbi50b3Atc3BhY2VbZGF0YS12LTFiYWRjODAxXSB7XFxuICBoZWlnaHQ6IDIuMjVyZW07XFxufVxcbi5ib3hbZGF0YS12LTFiYWRjODAxXSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBtYXJnaW4tdG9wOiAyOHB4O1xcbn1cXG4uYmFubmVyLWNvbnRhbmVyW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDQ3MHB4O1xcbiAgbWFyZ2luOiAwIGF1dG87XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB6LWluZGV4OiAxO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuLmJhbm5lci1wY1tkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgei1pbmRleDogMTtcXG4gIGxlZnQ6IDUwJTtcXG4gIG1hcmdpbi1sZWZ0OiAtOTYwcHg7XFxuICB0b3A6IDA7XFxuICB3aWR0aDogMTkyMHB4O1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuLmJhbm5lci1wYyAuYmFubmVyLWltZ1tkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMTAwJTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uYmFubmVyLW1vYmlsZVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcbi5iYW5uZXItbW9iaWxlIC5iYW5uZXItaW1nW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuLnJlY29tbWVuZFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICBmbGV4LXdyYXA6IHdyYXA7XFxufVxcbi5yZWNvbW1lbmQtaXRlbVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiAyNC4yNXJlbTtcXG4gICAgaGVpZ2h0OiAzMi43NXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmJmYmZiO1xcbn1cXG4ucmVjb21tZW5kLWl0ZW1bZGF0YS12LTFiYWRjODAxXTpsYXN0LWNoaWxkIHtcXG4gICAgICBtYXJnaW4tcmlnaHQ6IDA7XFxufVxcbi5yZWNvbW1lbmQtaXRlbSAuaW1nW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICAgIHdpZHRoOiAxMDAlO1xcbiAgICAgIGhlaWdodDogMjQuMjVyZW07XFxuICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcXG59XFxuLnJlY29tbWVuZC1pdGVtIC5pbWcxW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICAgIGJhY2tncm91bmQ6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2luZGV4L3JlY29tbWVuZC0xLnBuZ1wiKSkgKyBcIikgbm8tcmVwZWF0IGNlbnRlcjtcXG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xcbn1cXG4ucmVjb21tZW5kLWl0ZW0gLmltZzJbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgICAgYmFja2dyb3VuZDogdXJsKFwiICsgZXNjYXBlKHJlcXVpcmUoXCJAL2Fzc2V0cy9pbWFnZXMvaW5kZXgvcmVjb21tZW5kLTIucG5nXCIpKSArIFwiKSBuby1yZXBlYXQgY2VudGVyO1xcbiAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XFxufVxcbi5yZWNvbW1lbmQtaXRlbSAuaW1nM1tkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgICBiYWNrZ3JvdW5kOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMy5wbmdcIikpICsgXCIpIG5vLXJlcGVhdCBjZW50ZXI7XFxuICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcXG59XFxuLnJlY29tbWVuZC1pdGVtIC5pbWc0W2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICAgIGJhY2tncm91bmQ6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2luZGV4L3JlY29tbWVuZC00LnBuZ1wiKSkgKyBcIikgbm8tcmVwZWF0IGNlbnRlcjtcXG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xcbn1cXG4ucmVjb21tZW5kLWl0ZW0gLmJ0bltkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgICAgbGVmdDogMDtcXG4gICAgICByaWdodDogMDtcXG4gICAgICBib3R0b206IDNyZW07XFxuICAgICAgbWFyZ2luOiAwIGF1dG87XFxuICAgICAgd2lkdGg6IDEzLjVyZW07XFxuICAgICAgaGVpZ2h0OiA0cmVtO1xcbiAgICAgIGxpbmUtaGVpZ2h0OiA0cmVtO1xcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgICBib3JkZXItcmFkaXVzOiA0cmVtO1xcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgICBjb2xvcjogI2ZmZmZmZjtcXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjA1YTIzO1xcbiAgICAgIGJveC1zaGFkb3c6IDBweCAxMHB4IDEzcHggMCByZ2JhKDIzNiwgMTAwLCA0MSwgMC4yKTtcXG4gICAgICBiYWNrZ3JvdW5kLWJsZW5kLW1vZGU6IHNvZnQtbGlnaHQ7XFxuICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2VjNjQyOSwgI2VjNjQyOSksIGxpbmVhci1ncmFkaWVudCh0byB0b3AsICMwMDAwMDAsICNmZmZmZmYpO1xcbn1cXG4ucmVjb21tZW5kLWl0ZW0gaW1nW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICAgIHdpZHRoOiAxMDAlO1xcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA4cHg7XFxuICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogOHB4O1xcbn1cXG4ucmVjb21tZW5kLWl0ZW1bZGF0YS12LTFiYWRjODAxXTpmaXJzdC1jaGlsZCB7XFxuICAgICAgcGFkZGluZy1sZWZ0OiAwO1xcbn1cXG4ucmVjb21tZW5kLWl0ZW1bZGF0YS12LTFiYWRjODAxXTpsYXN0LWNoaWxkIHtcXG4gICAgICBwYWRkaW5nLXJpZ2h0OiAwO1xcbn1cXG4uZGV0YWlsW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIG1heC13aWR0aDogMTIwMHB4O1xcbn1cXG4uZGV0YWlsIC50eHRbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcXG4gICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcXG4gICAgLXdlYmtpdC1saW5lLWNsYW1wOiAxNDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICAgIHBhZGRpbmctbGVmdDogMi4xNjY2NjdyZW07XFxuICAgIGZsZXg6IDE7XFxuICAgIGxpbmUtaGVpZ2h0OiAyLjM7XFxuICAgIGxldHRlci1zcGFjaW5nOiAxLjRweDtcXG59XFxuLnN3aXBlci1idXR0b24tcHJldltkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGVzY2FwZShyZXF1aXJlKFwiQC9hc3NldHMvaW1hZ2VzL2NvbW1vbi9idXR0b24tcHJldi5wbmdcIikpICsgXCIpO1xcbiAgbGVmdDogMzYwcHg7XFxufVxcbi5zd2lwZXItYnV0dG9uLW5leHRbZGF0YS12LTFiYWRjODAxXSB7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBlc2NhcGUocmVxdWlyZShcIkAvYXNzZXRzL2ltYWdlcy9jb21tb24vYnV0dG9uLW5leHQucG5nXCIpKSArIFwiKTtcXG4gIHJpZ2h0OiAzNjBweDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWZyYWN0aW9uW2RhdGEtdi0xYmFkYzgwMV0sXFxuLnN3aXBlci1wYWdpbmF0aW9uLWN1c3RvbVtkYXRhLXYtMWJhZGM4MDFdLFxcbi5zd2lwZXItY29udGFpbmVyLWhvcml6b250YWwgPiAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0c1tkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGJvdHRvbTogNDhweDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIHdpZHRoOiAxMnB4O1xcbiAgaGVpZ2h0OiAxMnB4O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGRkZDtcXG59XFxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldC1hY3RpdmVbZGF0YS12LTFiYWRjODAxXSB7XFxuICB3aWR0aDogMTJweDtcXG4gIGhlaWdodDogMTJweDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMDVhMjM7XFxufVxcbi5ib3gtc2hhZG93W2RhdGEtdi0xYmFkYzgwMV0sIC5yZWNvbW1lbmQtaXRlbVtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gIGJveC1zaGFkb3c6IDAgMCAxLjVyZW0gMCByZ2JhKDI1NSwgODcsIDAsIDAuMTUpO1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7XFxuLmNvbnRlbnRbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIHBhZGRpbmc6IDAgNCU7XFxufVxcbi5yZWNvbW1lbmRbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG4ucmVjb21tZW5kLWl0ZW1bZGF0YS12LTFiYWRjODAxXSB7XFxuICAgICAgd2lkdGg6IDQ2JSAhaW1wb3J0YW50O1xcbiAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcXG4gICAgICBtYXJnaW46IDIlICFpbXBvcnRhbnQ7XFxufVxcbi5kZXRhaWxbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG4uZGV0YWlsIC52anMtY3VzdG9tLXNraW5bZGF0YS12LTFiYWRjODAxXSB7XFxuICAgICAgd2lkdGg6IDEwMCU7XFxufVxcbi5kZXRhaWwgLnR4dFtkYXRhLXYtMWJhZGM4MDFdIHtcXG4gICAgICBwYWRkaW5nOiAwO1xcbiAgICAgIG1hcmdpbjogMTBweCAwIDI4cHg7XFxufVxcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXG4uYmFubmVyLWNvbnRhbmVyW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICBoZWlnaHQ6IGF1dG87XFxufVxcbi5iYW5uZXItcGNbZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcbi5iYW5uZXItbW9iaWxlW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuLnJlY29tbWVuZC1pdGVtW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW46IDEwcHggYXV0byAhaW1wb3J0YW50O1xcbn1cXG4uYm94LXNoYWRvd1tkYXRhLXYtMWJhZGM4MDFdLCAucmVjb21tZW5kLWl0ZW1bZGF0YS12LTFiYWRjODAxXSB7XFxuICAgIGJveC1zaGFkb3c6IG5vbmU7XFxufVxcbi5zd2lwZXItcGFnaW5hdGlvbi1mcmFjdGlvbltkYXRhLXYtMWJhZGM4MDFdLFxcbiAgLnN3aXBlci1wYWdpbmF0aW9uLWN1c3RvbVtkYXRhLXYtMWJhZGM4MDFdLFxcbiAgLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzW2RhdGEtdi0xYmFkYzgwMV0ge1xcbiAgICBib3R0b206IDJweDtcXG59XFxufVxcblwiLCBcIlwiXSk7XG5cbi8vIGV4cG9ydHNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js":
/*!*******************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t//  when a module is imported multiple times with different media queries.\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanM/NjkwZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuXHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuXHRBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odXNlU291cmNlTWFwKSB7XG5cdHZhciBsaXN0ID0gW107XG5cblx0Ly8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXHRsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0XHR2YXIgY29udGVudCA9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSwgdXNlU291cmNlTWFwKTtcblx0XHRcdGlmKGl0ZW1bMl0pIHtcblx0XHRcdFx0cmV0dXJuIFwiQG1lZGlhIFwiICsgaXRlbVsyXSArIFwie1wiICsgY29udGVudCArIFwifVwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRlbnQ7XG5cdFx0XHR9XG5cdFx0fSkuam9pbihcIlwiKTtcblx0fTtcblxuXHQvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuXHRsaXN0LmkgPSBmdW5jdGlvbihtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XG5cdFx0aWYodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCBcIlwiXV07XG5cdFx0dmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGlkID0gdGhpc1tpXVswXTtcblx0XHRcdGlmKHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIilcblx0XHRcdFx0YWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuXHRcdH1cblx0XHRmb3IoaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IG1vZHVsZXNbaV07XG5cdFx0XHQvLyBza2lwIGFscmVhZHkgaW1wb3J0ZWQgbW9kdWxlXG5cdFx0XHQvLyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCAxMDAlIHBlcmZlY3QgZm9yIHdlaXJkIG1lZGlhIHF1ZXJ5IGNvbWJpbmF0aW9uc1xuXHRcdFx0Ly8gIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cblx0XHRcdC8vICBJIGhvcGUgdGhpcyB3aWxsIG5ldmVyIG9jY3VyIChIZXkgdGhpcyB3YXkgd2UgaGF2ZSBzbWFsbGVyIGJ1bmRsZXMpXG5cdFx0XHRpZih0eXBlb2YgaXRlbVswXSAhPT0gXCJudW1iZXJcIiB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuXHRcdFx0XHRpZihtZWRpYVF1ZXJ5ICYmICFpdGVtWzJdKSB7XG5cdFx0XHRcdFx0aXRlbVsyXSA9IG1lZGlhUXVlcnk7XG5cdFx0XHRcdH0gZWxzZSBpZihtZWRpYVF1ZXJ5KSB7XG5cdFx0XHRcdFx0aXRlbVsyXSA9IFwiKFwiICsgaXRlbVsyXSArIFwiKSBhbmQgKFwiICsgbWVkaWFRdWVyeSArIFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxpc3QucHVzaChpdGVtKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHJldHVybiBsaXN0O1xufTtcblxuZnVuY3Rpb24gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtLCB1c2VTb3VyY2VNYXApIHtcblx0dmFyIGNvbnRlbnQgPSBpdGVtWzFdIHx8ICcnO1xuXHR2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG5cdGlmICghY3NzTWFwcGluZykge1xuXHRcdHJldHVybiBjb250ZW50O1xuXHR9XG5cblx0aWYgKHVzZVNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHZhciBzb3VyY2VNYXBwaW5nID0gdG9Db21tZW50KGNzc01hcHBpbmcpO1xuXHRcdHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG5cdFx0XHRyZXR1cm4gJy8qIyBzb3VyY2VVUkw9JyArIGNzc01hcHBpbmcuc291cmNlUm9vdCArIHNvdXJjZSArICcgKi8nXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChzb3VyY2VVUkxzKS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKCdcXG4nKTtcblx0fVxuXG5cdHJldHVybiBbY29udGVudF0uam9pbignXFxuJyk7XG59XG5cbi8vIEFkYXB0ZWQgZnJvbSBjb252ZXJ0LXNvdXJjZS1tYXAgKE1JVClcbmZ1bmN0aW9uIHRvQ29tbWVudChzb3VyY2VNYXApIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5cdHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpO1xuXHR2YXIgZGF0YSA9ICdzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwnICsgYmFzZTY0O1xuXG5cdHJldHVybiAnLyojICcgKyBkYXRhICsgJyAqLyc7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/lib/css-base.js\n");

/***/ }),

/***/ "./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js ***!
  \*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = function escape(url) {\n    if (typeof url !== 'string') {\n        return url\n    }\n    // If url is already wrapped in quotes, remove them\n    if (/^['\"].*['\"]$/.test(url)) {\n        url = url.slice(1, -1);\n    }\n    // Should url be wrapped?\n    // See https://drafts.csswg.org/css-values-3/#urls\n    if (/[\"'() \\t\\n]/.test(url)) {\n        return '\"' + url.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n') + '\"'\n    }\n\n    return url\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9saWIvdXJsL2VzY2FwZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2xpYi91cmwvZXNjYXBlLmpzPzU0NTQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlc2NhcGUodXJsKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICB9XG4gICAgLy8gSWYgdXJsIGlzIGFscmVhZHkgd3JhcHBlZCBpbiBxdW90ZXMsIHJlbW92ZSB0aGVtXG4gICAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgICAgIHVybCA9IHVybC5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgICAvLyBTZWUgaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy12YWx1ZXMtMy8jdXJsc1xuICAgIGlmICgvW1wiJygpIFxcdFxcbl0vLnRlc3QodXJsKSkge1xuICAgICAgICByZXR1cm4gJ1wiJyArIHVybC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csICdcXFxcbicpICsgJ1wiJ1xuICAgIH1cblxuICAgIHJldHVybiB1cmxcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_css-loader@1.0.1@css-loader/lib/url/escape.js\n");

/***/ }),

/***/ "./node_modules/_deep-equal@1.1.0@deep-equal/index.js":
/*!************************************************************!*\
  !*** ./node_modules/_deep-equal@1.1.0@deep-equal/index.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var objectKeys = __webpack_require__(/*! object-keys */ \"./node_modules/_object-keys@1.1.1@object-keys/index.js\");\nvar isArguments = __webpack_require__(/*! is-arguments */ \"./node_modules/_is-arguments@1.0.4@is-arguments/index.js\");\nvar is = __webpack_require__(/*! object-is */ \"./node_modules/_object-is@1.0.1@object-is/index.js\");\nvar isRegex = __webpack_require__(/*! is-regex */ \"./node_modules/_is-regex@1.0.4@is-regex/index.js\");\nvar flags = __webpack_require__(/*! regexp.prototype.flags */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/index.js\");\nvar isDate = __webpack_require__(/*! is-date-object */ \"./node_modules/_is-date-object@1.0.1@is-date-object/index.js\");\n\nvar getTime = Date.prototype.getTime;\n\nfunction deepEqual(actual, expected, options) {\n  var opts = options || {};\n\n  // 7.1. All identical values are equivalent, as determined by ===.\n  if (opts.strict ? is(actual, expected) : actual === expected) {\n    return true;\n  }\n\n  // 7.3. Other pairs that do not both pass typeof value == 'object', equivalence is determined by ==.\n  if (!actual || !expected || (typeof actual !== 'object' && typeof expected !== 'object')) {\n    return opts.strict ? is(actual, expected) : actual == expected;\n  }\n\n  /*\n   * 7.4. For all other Object pairs, including Array objects, equivalence is\n   * determined by having the same number of owned properties (as verified\n   * with Object.prototype.hasOwnProperty.call), the same set of keys\n   * (although not necessarily the same order), equivalent values for every\n   * corresponding key, and an identical 'prototype' property. Note: this\n   * accounts for both named and indexed properties on Arrays.\n   */\n  // eslint-disable-next-line no-use-before-define\n  return objEquiv(actual, expected, opts);\n}\n\nfunction isUndefinedOrNull(value) {\n  return value === null || value === undefined;\n}\n\nfunction isBuffer(x) {\n  if (!x || typeof x !== 'object' || typeof x.length !== 'number') {\n    return false;\n  }\n  if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n    return false;\n  }\n  if (x.length > 0 && typeof x[0] !== 'number') {\n    return false;\n  }\n  return true;\n}\n\nfunction objEquiv(a, b, opts) {\n  /* eslint max-statements: [2, 50] */\n  var i, key;\n  if (typeof a !== typeof b) { return false; }\n  if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) { return false; }\n\n  // an identical 'prototype' property.\n  if (a.prototype !== b.prototype) { return false; }\n\n  if (isArguments(a) !== isArguments(b)) { return false; }\n\n  var aIsRegex = isRegex(a);\n  var bIsRegex = isRegex(b);\n  if (aIsRegex !== bIsRegex) { return false; }\n  if (aIsRegex || bIsRegex) {\n    return a.source === b.source && flags(a) === flags(b);\n  }\n\n  if (isDate(a) && isDate(b)) {\n    return getTime.call(a) === getTime.call(b);\n  }\n\n  var aIsBuffer = isBuffer(a);\n  var bIsBuffer = isBuffer(b);\n  if (aIsBuffer !== bIsBuffer) { return false; }\n  if (aIsBuffer || bIsBuffer) { // && would work too, because both are true or both false here\n    if (a.length !== b.length) { return false; }\n    for (i = 0; i < a.length; i++) {\n      if (a[i] !== b[i]) { return false; }\n    }\n    return true;\n  }\n\n  if (typeof a !== typeof b) { return false; }\n\n  try {\n    var ka = objectKeys(a);\n    var kb = objectKeys(b);\n  } catch (e) { // happens when one is a string literal and the other isn't\n    return false;\n  }\n  // having the same number of owned properties (keys incorporates hasOwnProperty)\n  if (ka.length !== kb.length) { return false; }\n\n  // the same set of keys (although not necessarily the same order),\n  ka.sort();\n  kb.sort();\n  // ~~~cheap key test\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] != kb[i]) { return false; }\n  }\n  // equivalent values for every corresponding key, and ~~~possibly expensive deep test\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!deepEqual(a[key], b[key], opts)) { return false; }\n  }\n\n  return true;\n}\n\nmodule.exports = deepEqual;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2RlZXAtZXF1YWxAMS4xLjBAZGVlcC1lcXVhbC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fZGVlcC1lcXVhbEAxLjEuMEBkZWVwLWVxdWFsL2luZGV4LmpzPzUxMzEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xudmFyIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnaXMtYXJndW1lbnRzJyk7XG52YXIgaXMgPSByZXF1aXJlKCdvYmplY3QtaXMnKTtcbnZhciBpc1JlZ2V4ID0gcmVxdWlyZSgnaXMtcmVnZXgnKTtcbnZhciBmbGFncyA9IHJlcXVpcmUoJ3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3MnKTtcbnZhciBpc0RhdGUgPSByZXF1aXJlKCdpcy1kYXRlLW9iamVjdCcpO1xuXG52YXIgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XG5cbmZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyA3LjEuIEFsbCBpZGVudGljYWwgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbiAgaWYgKG9wdHMuc3RyaWN0ID8gaXMoYWN0dWFsLCBleHBlY3RlZCkgOiBhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyA3LjMuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCB8fCAodHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gb3B0cy5zdHJpY3QgPyBpcyhhY3R1YWwsIGV4cGVjdGVkKSA6IGFjdHVhbCA9PSBleHBlY3RlZDtcbiAgfVxuXG4gIC8qXG4gICAqIDcuNC4gRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAgKiBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgICogd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAgKiAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gICAqIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gICAqIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWRPck51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyKHgpIHtcbiAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgeC5sZW5ndGggIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgeC5jb3B5ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB4LnNsaWNlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA+IDAgJiYgdHlwZW9mIHhbMF0gIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBvcHRzKSB7XG4gIC8qIGVzbGludCBtYXgtc3RhdGVtZW50czogWzIsIDUwXSAqL1xuICB2YXIgaSwga2V5O1xuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoaXNVbmRlZmluZWRPck51bGwoYSkgfHwgaXNVbmRlZmluZWRPck51bGwoYikpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LlxuICBpZiAoYS5wcm90b3R5cGUgIT09IGIucHJvdG90eXBlKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIGlmIChpc0FyZ3VtZW50cyhhKSAhPT0gaXNBcmd1bWVudHMoYikpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgdmFyIGFJc1JlZ2V4ID0gaXNSZWdleChhKTtcbiAgdmFyIGJJc1JlZ2V4ID0gaXNSZWdleChiKTtcbiAgaWYgKGFJc1JlZ2V4ICE9PSBiSXNSZWdleCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKGFJc1JlZ2V4IHx8IGJJc1JlZ2V4KSB7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBmbGFncyhhKSA9PT0gZmxhZ3MoYik7XG4gIH1cblxuICBpZiAoaXNEYXRlKGEpICYmIGlzRGF0ZShiKSkge1xuICAgIHJldHVybiBnZXRUaW1lLmNhbGwoYSkgPT09IGdldFRpbWUuY2FsbChiKTtcbiAgfVxuXG4gIHZhciBhSXNCdWZmZXIgPSBpc0J1ZmZlcihhKTtcbiAgdmFyIGJJc0J1ZmZlciA9IGlzQnVmZmVyKGIpO1xuICBpZiAoYUlzQnVmZmVyICE9PSBiSXNCdWZmZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhSXNCdWZmZXIgfHwgYklzQnVmZmVyKSB7IC8vICYmIHdvdWxkIHdvcmsgdG9vLCBiZWNhdXNlIGJvdGggYXJlIHRydWUgb3IgYm90aCBmYWxzZSBoZXJlXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgeyByZXR1cm4gZmFsc2U7IH1cblxuICB0cnkge1xuICAgIHZhciBrYSA9IG9iamVjdEtleXMoYSk7XG4gICAgdmFyIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgfSBjYXRjaCAoZSkgeyAvLyBoYXBwZW5zIHdoZW4gb25lIGlzIGEgc3RyaW5nIGxpdGVyYWwgYW5kIHRoZSBvdGhlciBpc24ndFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gdGhlIHNhbWUgc2V0IG9mIGtleXMgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksXG4gIGthLnNvcnQoKTtcbiAga2Iuc29ydCgpO1xuICAvLyB+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfVxuICAvLyBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZCB+fn5wb3NzaWJseSBleHBlbnNpdmUgZGVlcCB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAga2V5ID0ga2FbaV07XG4gICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIG9wdHMpKSB7IHJldHVybiBmYWxzZTsgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVlcEVxdWFsO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_deep-equal@1.1.0@deep-equal/index.js\n");

/***/ }),

/***/ "./node_modules/_define-properties@1.1.3@define-properties/index.js":
/*!**************************************************************************!*\
  !*** ./node_modules/_define-properties@1.1.3@define-properties/index.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar keys = __webpack_require__(/*! object-keys */ \"./node_modules/_object-keys@1.1.1@object-keys/index.js\");\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';\n\nvar toStr = Object.prototype.toString;\nvar concat = Array.prototype.concat;\nvar origDefineProperty = Object.defineProperty;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar arePropertyDescriptorsSupported = function () {\n\tvar obj = {};\n\ttry {\n\t\torigDefineProperty(obj, 'x', { enumerable: false, value: obj });\n\t\t// eslint-disable-next-line no-unused-vars, no-restricted-syntax\n\t\tfor (var _ in obj) { // jscs:ignore disallowUnusedVariables\n\t\t\treturn false;\n\t\t}\n\t\treturn obj.x === obj;\n\t} catch (e) { /* this is IE 8. */\n\t\treturn false;\n\t}\n};\nvar supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object && (!isFunction(predicate) || !predicate())) {\n\t\treturn;\n\t}\n\tif (supportsDescriptors) {\n\t\torigDefineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: value,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\tobject[name] = value;\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = concat.call(props, Object.getOwnPropertySymbols(map));\n\t}\n\tfor (var i = 0; i < props.length; i += 1) {\n\t\tdefineProperty(object, props[i], map[props[i]], predicates[props[i]]);\n\t}\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2RlZmluZS1wcm9wZXJ0aWVzQDEuMS4zQGRlZmluZS1wcm9wZXJ0aWVzL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19kZWZpbmUtcHJvcGVydGllc0AxLjEuM0BkZWZpbmUtcHJvcGVydGllcy9pbmRleC5qcz9jODkyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xudmFyIGhhc1N5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2woJ2ZvbycpID09PSAnc3ltYm9sJztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyIG9yaWdEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0ci5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBhcmVQcm9wZXJ0eURlc2NyaXB0b3JzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgb2JqID0ge307XG5cdHRyeSB7XG5cdFx0b3JpZ0RlZmluZVByb3BlcnR5KG9iaiwgJ3gnLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogb2JqIH0pO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0XHRmb3IgKHZhciBfIGluIG9iaikgeyAvLyBqc2NzOmlnbm9yZSBkaXNhbGxvd1VudXNlZFZhcmlhYmxlc1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gb2JqLnggPT09IG9iajtcblx0fSBjYXRjaCAoZSkgeyAvKiB0aGlzIGlzIElFIDguICovXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSBvcmlnRGVmaW5lUHJvcGVydHkgJiYgYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCgpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lLCB2YWx1ZSwgcHJlZGljYXRlKSB7XG5cdGlmIChuYW1lIGluIG9iamVjdCAmJiAoIWlzRnVuY3Rpb24ocHJlZGljYXRlKSB8fCAhcHJlZGljYXRlKCkpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG5cdFx0b3JpZ0RlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHR3cml0YWJsZTogdHJ1ZVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG9iamVjdFtuYW1lXSA9IHZhbHVlO1xuXHR9XG59O1xuXG52YXIgZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIChvYmplY3QsIG1hcCkge1xuXHR2YXIgcHJlZGljYXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDoge307XG5cdHZhciBwcm9wcyA9IGtleXMobWFwKTtcblx0aWYgKGhhc1N5bWJvbHMpIHtcblx0XHRwcm9wcyA9IGNvbmNhdC5jYWxsKHByb3BzLCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG1hcCkpO1xuXHR9XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRkZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BzW2ldLCBtYXBbcHJvcHNbaV1dLCBwcmVkaWNhdGVzW3Byb3BzW2ldXSk7XG5cdH1cbn07XG5cbmRlZmluZVByb3BlcnRpZXMuc3VwcG9ydHNEZXNjcmlwdG9ycyA9ICEhc3VwcG9ydHNEZXNjcmlwdG9ycztcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0aWVzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_define-properties@1.1.3@define-properties/index.js\n");

/***/ }),

/***/ "./node_modules/_function-bind@1.1.1@function-bind/implementation.js":
/*!***************************************************************************!*\
  !*** ./node_modules/_function-bind@1.1.1@function-bind/implementation.js ***!
  \***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n    var target = this;\n    if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n        throw new TypeError(ERROR_MESSAGE + target);\n    }\n    var args = slice.call(arguments, 1);\n\n    var bound;\n    var binder = function () {\n        if (this instanceof bound) {\n            var result = target.apply(\n                this,\n                args.concat(slice.call(arguments))\n            );\n            if (Object(result) === result) {\n                return result;\n            }\n            return this;\n        } else {\n            return target.apply(\n                that,\n                args.concat(slice.call(arguments))\n            );\n        }\n    };\n\n    var boundLength = Math.max(0, target.length - args.length);\n    var boundArgs = [];\n    for (var i = 0; i < boundLength; i++) {\n        boundArgs.push('$' + i);\n    }\n\n    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n    if (target.prototype) {\n        var Empty = function Empty() {};\n        Empty.prototype = target.prototype;\n        bound.prototype = new Empty();\n        Empty.prototype = null;\n    }\n\n    return bound;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Z1bmN0aW9uLWJpbmRAMS4xLjFAZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fZnVuY3Rpb24tYmluZEAxLjEuMUBmdW5jdGlvbi1iaW5kL2ltcGxlbWVudGF0aW9uLmpzP2E5NWYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiAxICovXG5cbnZhciBFUlJPUl9NRVNTQUdFID0gJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgJztcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY1R5cGUgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQodGhhdCkge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHRvU3RyLmNhbGwodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgICB2YXIgYm91bmQ7XG4gICAgdmFyIGJpbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBib3VuZExlbmd0aCA9IE1hdGgubWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICBib3VuZEFyZ3MucHVzaCgnJCcgKyBpKTtcbiAgICB9XG5cbiAgICBib3VuZCA9IEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgYm91bmRBcmdzLmpvaW4oJywnKSArICcpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfScpKGJpbmRlcik7XG5cbiAgICBpZiAodGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICB2YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHt9O1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgICAgICBib3VuZC5wcm90b3R5cGUgPSBuZXcgRW1wdHkoKTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_function-bind@1.1.1@function-bind/implementation.js\n");

/***/ }),

/***/ "./node_modules/_function-bind@1.1.1@function-bind/index.js":
/*!******************************************************************!*\
  !*** ./node_modules/_function-bind@1.1.1@function-bind/index.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar implementation = __webpack_require__(/*! ./implementation */ \"./node_modules/_function-bind@1.1.1@function-bind/implementation.js\");\n\nmodule.exports = Function.prototype.bind || implementation;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2Z1bmN0aW9uLWJpbmRAMS4xLjFAZnVuY3Rpb24tYmluZC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fZnVuY3Rpb24tYmluZEAxLjEuMUBmdW5jdGlvbi1iaW5kL2luZGV4LmpzPzNjZWEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb247XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_function-bind@1.1.1@function-bind/index.js\n");

/***/ }),

/***/ "./node_modules/_global@4.3.2@global/document.js":
/*!*******************************************************!*\
  !*** ./node_modules/_global@4.3.2@global/document.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(global) {var topLevel = typeof global !== 'undefined' ? global :\n    typeof window !== 'undefined' ? window : {}\nvar minDoc = __webpack_require__(/*! min-document */ 1);\n\nvar doccy;\n\nif (typeof document !== 'undefined') {\n    doccy = document;\n} else {\n    doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n    if (!doccy) {\n        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n    }\n}\n\nmodule.exports = doccy;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2dsb2JhbEA0LjMuMkBnbG9iYWwvZG9jdW1lbnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2dsb2JhbEA0LjMuMkBnbG9iYWwvZG9jdW1lbnQuanM/MDMzNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG52YXIgZG9jY3k7XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZG9jY3kgPSBkb2N1bWVudDtcbn0gZWxzZSB7XG4gICAgZG9jY3kgPSB0b3BMZXZlbFsnX19HTE9CQUxfRE9DVU1FTlRfQ0FDSEVANCddO1xuXG4gICAgaWYgKCFkb2NjeSkge1xuICAgICAgICBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J10gPSBtaW5Eb2M7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_global@4.3.2@global/document.js\n");

/***/ }),

/***/ "./node_modules/_global@4.3.2@global/window.js":
/*!*****************************************************!*\
  !*** ./node_modules/_global@4.3.2@global/window.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(global) {var win;\n\nif (typeof window !== \"undefined\") {\n    win = window;\n} else if (typeof global !== \"undefined\") {\n    win = global;\n} else if (typeof self !== \"undefined\"){\n    win = self;\n} else {\n    win = {};\n}\n\nmodule.exports = win;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2dsb2JhbEA0LjMuMkBnbG9iYWwvd2luZG93LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19nbG9iYWxANC4zLjJAZ2xvYmFsL3dpbmRvdy5qcz9lY2RjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB3aW47XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgd2luID0gc2VsZjtcbn0gZWxzZSB7XG4gICAgd2luID0ge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2luO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_global@4.3.2@global/window.js\n");

/***/ }),

/***/ "./node_modules/_global@4.4.0@global/window.js":
/*!*****************************************************!*\
  !*** ./node_modules/_global@4.4.0@global/window.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/* WEBPACK VAR INJECTION */(function(global) {var win;\n\nif (typeof window !== \"undefined\") {\n    win = window;\n} else if (typeof global !== \"undefined\") {\n    win = global;\n} else if (typeof self !== \"undefined\"){\n    win = self;\n} else {\n    win = {};\n}\n\nmodule.exports = win;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2dsb2JhbEA0LjQuMEBnbG9iYWwvd2luZG93LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19nbG9iYWxANC40LjBAZ2xvYmFsL3dpbmRvdy5qcz82YTlmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB3aW47XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgd2luID0gc2VsZjtcbn0gZWxzZSB7XG4gICAgd2luID0ge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2luO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_global@4.4.0@global/window.js\n");

/***/ }),

/***/ "./node_modules/_has@1.0.3@has/src/index.js":
/*!**************************************************!*\
  !*** ./node_modules/_has@1.0.3@has/src/index.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar bind = __webpack_require__(/*! function-bind */ \"./node_modules/_function-bind@1.1.1@function-bind/index.js\");\n\nmodule.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2hhc0AxLjAuM0BoYXMvc3JjL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19oYXNAMS4wLjNAaGFzL3NyYy9pbmRleC5qcz9mYjgxIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_has@1.0.3@has/src/index.js\n");

/***/ }),

/***/ "./node_modules/_is-arguments@1.0.4@is-arguments/index.js":
/*!****************************************************************!*\
  !*** ./node_modules/_is-arguments@1.0.4@is-arguments/index.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\nvar toStr = Object.prototype.toString;\n\nvar isStandardArguments = function isArguments(value) {\n\tif (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {\n\t\treturn false;\n\t}\n\treturn toStr.call(value) === '[object Arguments]';\n};\n\nvar isLegacyArguments = function isArguments(value) {\n\tif (isStandardArguments(value)) {\n\t\treturn true;\n\t}\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.length === 'number' &&\n\t\tvalue.length >= 0 &&\n\t\ttoStr.call(value) !== '[object Array]' &&\n\t\ttoStr.call(value.callee) === '[object Function]';\n};\n\nvar supportsStandardArguments = (function () {\n\treturn isStandardArguments(arguments);\n}());\n\nisStandardArguments.isLegacyArguments = isLegacyArguments; // for tests\n\nmodule.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLWFyZ3VtZW50c0AxLjAuNEBpcy1hcmd1bWVudHMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2lzLWFyZ3VtZW50c0AxLjAuNEBpcy1hcmd1bWVudHMvaW5kZXguanM/ZmI0NiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCc7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG52YXIgaXNTdGFuZGFyZEFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdGlmIChoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gdG9TdHIuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufTtcblxudmFyIGlzTGVnYWN5QXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcblx0aWYgKGlzU3RhbmRhcmRBcmd1bWVudHModmFsdWUpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmXG5cdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0dmFsdWUubGVuZ3RoID49IDAgJiZcblx0XHR0b1N0ci5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJlxuXHRcdHRvU3RyLmNhbGwodmFsdWUuY2FsbGVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBzdXBwb3J0c1N0YW5kYXJkQXJndW1lbnRzID0gKGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIGlzU3RhbmRhcmRBcmd1bWVudHMoYXJndW1lbnRzKTtcbn0oKSk7XG5cbmlzU3RhbmRhcmRBcmd1bWVudHMuaXNMZWdhY3lBcmd1bWVudHMgPSBpc0xlZ2FjeUFyZ3VtZW50czsgLy8gZm9yIHRlc3RzXG5cbm1vZHVsZS5leHBvcnRzID0gc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA/IGlzU3RhbmRhcmRBcmd1bWVudHMgOiBpc0xlZ2FjeUFyZ3VtZW50cztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_is-arguments@1.0.4@is-arguments/index.js\n");

/***/ }),

/***/ "./node_modules/_is-buffer@2.0.4@is-buffer/index.js":
/*!**********************************************************!*\
  !*** ./node_modules/_is-buffer@2.0.4@is-buffer/index.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("/*!\n * Determine if an object is a Buffer\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n\nmodule.exports = function isBuffer (obj) {\n  return obj != null && obj.constructor != null &&\n    typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLWJ1ZmZlckAyLjAuNEBpcy1idWZmZXIvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX2lzLWJ1ZmZlckAyLjAuNEBpcy1idWZmZXIvaW5kZXguanM/ZWJlNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXJcbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIgKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiZcbiAgICB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_is-buffer@2.0.4@is-buffer/index.js\n");

/***/ }),

/***/ "./node_modules/_is-date-object@1.0.1@is-date-object/index.js":
/*!********************************************************************!*\
  !*** ./node_modules/_is-date-object@1.0.1@is-date-object/index.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar getDay = Date.prototype.getDay;\nvar tryDateObject = function tryDateObject(value) {\n\ttry {\n\t\tgetDay.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar toStr = Object.prototype.toString;\nvar dateClass = '[object Date]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isDateObject(value) {\n\tif (typeof value !== 'object' || value === null) { return false; }\n\treturn hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLWRhdGUtb2JqZWN0QDEuMC4xQGlzLWRhdGUtb2JqZWN0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19pcy1kYXRlLW9iamVjdEAxLjAuMUBpcy1kYXRlLW9iamVjdC9pbmRleC5qcz9iNTdmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGdldERheSA9IERhdGUucHJvdG90eXBlLmdldERheTtcbnZhciB0cnlEYXRlT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RGF0ZU9iamVjdCh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGdldERheS5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0cmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5RGF0ZU9iamVjdCh2YWx1ZSkgOiB0b1N0ci5jYWxsKHZhbHVlKSA9PT0gZGF0ZUNsYXNzO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_is-date-object@1.0.1@is-date-object/index.js\n");

/***/ }),

/***/ "./node_modules/_is-function@1.0.1@is-function/index.js":
/*!**************************************************************!*\
  !*** ./node_modules/_is-function@1.0.1@is-function/index.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = isFunction\n\nvar toString = Object.prototype.toString\n\nfunction isFunction (fn) {\n  var string = toString.call(fn)\n  return string === '[object Function]' ||\n    (typeof fn === 'function' && string !== '[object RegExp]') ||\n    (typeof window !== 'undefined' &&\n     // IE8 and below\n     (fn === window.setTimeout ||\n      fn === window.alert ||\n      fn === window.confirm ||\n      fn === window.prompt))\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLWZ1bmN0aW9uQDEuMC4xQGlzLWZ1bmN0aW9uL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19pcy1mdW5jdGlvbkAxLjAuMUBpcy1mdW5jdGlvbi9pbmRleC5qcz84MzZkIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvblxuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGZuKSB7XG4gIHZhciBzdHJpbmcgPSB0b1N0cmluZy5jYWxsKGZuKVxuICByZXR1cm4gc3RyaW5nID09PSAnW29iamVjdCBGdW5jdGlvbl0nIHx8XG4gICAgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiBzdHJpbmcgIT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB8fFxuICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAvLyBJRTggYW5kIGJlbG93XG4gICAgIChmbiA9PT0gd2luZG93LnNldFRpbWVvdXQgfHxcbiAgICAgIGZuID09PSB3aW5kb3cuYWxlcnQgfHxcbiAgICAgIGZuID09PSB3aW5kb3cuY29uZmlybSB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5wcm9tcHQpKVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_is-function@1.0.1@is-function/index.js\n");

/***/ }),

/***/ "./node_modules/_is-regex@1.0.4@is-regex/index.js":
/*!********************************************************!*\
  !*** ./node_modules/_is-regex@1.0.4@is-regex/index.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar has = __webpack_require__(/*! has */ \"./node_modules/_has@1.0.3@has/src/index.js\");\nvar regexExec = RegExp.prototype.exec;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar tryRegexExecCall = function tryRegexExec(value) {\n\ttry {\n\t\tvar lastIndex = value.lastIndex;\n\t\tvalue.lastIndex = 0;\n\n\t\tregexExec.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\tvalue.lastIndex = lastIndex;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar regexClass = '[object RegExp]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isRegex(value) {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\tif (!hasToStringTag) {\n\t\treturn toStr.call(value) === regexClass;\n\t}\n\n\tvar descriptor = gOPD(value, 'lastIndex');\n\tvar hasLastIndexDataProperty = descriptor && has(descriptor, 'value');\n\tif (!hasLastIndexDataProperty) {\n\t\treturn false;\n\t}\n\n\treturn tryRegexExecCall(value);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX2lzLXJlZ2V4QDEuMC40QGlzLXJlZ2V4L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19pcy1yZWdleEAxLjAuNEBpcy1yZWdleC9pbmRleC5qcz84ZmVhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyIHJlZ2V4RXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIHRyeVJlZ2V4RXhlY0NhbGwgPSBmdW5jdGlvbiB0cnlSZWdleEV4ZWModmFsdWUpIHtcblx0dHJ5IHtcblx0XHR2YXIgbGFzdEluZGV4ID0gdmFsdWUubGFzdEluZGV4O1xuXHRcdHZhbHVlLmxhc3RJbmRleCA9IDA7XG5cblx0XHRyZWdleEV4ZWMuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cdFx0dmFsdWUubGFzdEluZGV4ID0gbGFzdEluZGV4O1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWdleENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcblx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcpIHtcblx0XHRyZXR1cm4gdG9TdHIuY2FsbCh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7XG5cdH1cblxuXHR2YXIgZGVzY3JpcHRvciA9IGdPUEQodmFsdWUsICdsYXN0SW5kZXgnKTtcblx0dmFyIGhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgaGFzKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXHRpZiAoIWhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0cnlSZWdleEV4ZWNDYWxsKHZhbHVlKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_is-regex@1.0.4@is-regex/index.js\n");

/***/ }),

/***/ "./node_modules/_mockjs@1.1.0@mockjs/dist/mock.js":
/*!********************************************************!*\
  !*** ./node_modules/_mockjs@1.1.0@mockjs/dist/mock.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse {}\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* global require, module, window */\n\tvar Handler = __webpack_require__(1)\n\tvar Util = __webpack_require__(3)\n\tvar Random = __webpack_require__(5)\n\tvar RE = __webpack_require__(20)\n\tvar toJSONSchema = __webpack_require__(23)\n\tvar valid = __webpack_require__(25)\n\n\tvar XHR\n\tif (typeof window !== 'undefined') XHR = __webpack_require__(27)\n\n\t/*!\n\t    Mock - 模拟请求 & 模拟数据\n\t    https://github.com/nuysoft/Mock\n\t    墨智 mozhi.gyy@taobao.com nuysoft@gmail.com\n\t*/\n\tvar Mock = {\n\t    Handler: Handler,\n\t    Random: Random,\n\t    Util: Util,\n\t    XHR: XHR,\n\t    RE: RE,\n\t    toJSONSchema: toJSONSchema,\n\t    valid: valid,\n\t    heredoc: Util.heredoc,\n\t    setup: function(settings) {\n\t        return XHR.setup(settings)\n\t    },\n\t    _mocked: {}\n\t}\n\n\tMock.version = '1.0.1-beta3'\n\n\t// 避免循环依赖\n\tif (XHR) XHR.Mock = Mock\n\n\t/*\n\t    * Mock.mock( template )\n\t    * Mock.mock( function() )\n\t    * Mock.mock( rurl, template )\n\t    * Mock.mock( rurl, function(options) )\n\t    * Mock.mock( rurl, rtype, template )\n\t    * Mock.mock( rurl, rtype, function(options) )\n\n\t    根据数据模板生成模拟数据。\n\t*/\n\tMock.mock = function(rurl, rtype, template) {\n\t    // Mock.mock(template)\n\t    if (arguments.length === 1) {\n\t        return Handler.gen(rurl)\n\t    }\n\t    // Mock.mock(rurl, template)\n\t    if (arguments.length === 2) {\n\t        template = rtype\n\t        rtype = undefined\n\t    }\n\t    // 拦截 XHR\n\t    if (XHR) window.XMLHttpRequest = XHR\n\t    Mock._mocked[rurl + (rtype || '')] = {\n\t        rurl: rurl,\n\t        rtype: rtype,\n\t        template: template\n\t    }\n\t    return Mock\n\t}\n\n\tmodule.exports = Mock\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* \n\t    ## Handler\n\n\t    处理数据模板。\n\t    \n\t    * Handler.gen( template, name?, context? )\n\n\t        入口方法。\n\n\t    * Data Template Definition, DTD\n\t        \n\t        处理数据模板定义。\n\n\t        * Handler.array( options )\n\t        * Handler.object( options )\n\t        * Handler.number( options )\n\t        * Handler.boolean( options )\n\t        * Handler.string( options )\n\t        * Handler.function( options )\n\t        * Handler.regexp( options )\n\t        \n\t        处理路径(相对和绝对)。\n\n\t        * Handler.getValueByKeyPath( key, options )\n\n\t    * Data Placeholder Definition, DPD\n\n\t        处理数据占位符定义\n\n\t        * Handler.placeholder( placeholder, context, templateContext, options )\n\n\t*/\n\n\tvar Constant = __webpack_require__(2)\n\tvar Util = __webpack_require__(3)\n\tvar Parser = __webpack_require__(4)\n\tvar Random = __webpack_require__(5)\n\tvar RE = __webpack_require__(20)\n\n\tvar Handler = {\n\t    extend: Util.extend\n\t}\n\n\t/*\n\t    template        属性值(即数据模板)\n\t    name            属性名\n\t    context         数据上下文,生成后的数据\n\t    templateContext 模板上下文,\n\n\t    Handle.gen(template, name, options)\n\t    context\n\t        currentContext, templateCurrentContext, \n\t        path, templatePath\n\t        root, templateRoot\n\t*/\n\tHandler.gen = function(template, name, context) {\n\t    /* jshint -W041 */\n\t    name = name == undefined ? '' : (name + '')\n\n\t    context = context || {}\n\t    context = {\n\t            // 当前访问路径,只有属性名,不包括生成规则\n\t            path: context.path || [Constant.GUID],\n\t            templatePath: context.templatePath || [Constant.GUID++],\n\t            // 最终属性值的上下文\n\t            currentContext: context.currentContext,\n\t            // 属性值模板的上下文\n\t            templateCurrentContext: context.templateCurrentContext || template,\n\t            // 最终值的根\n\t            root: context.root || context.currentContext,\n\t            // 模板的根\n\t            templateRoot: context.templateRoot || context.templateCurrentContext || template\n\t        }\n\t        // console.log('path:', context.path.join('.'), template)\n\n\t    var rule = Parser.parse(name)\n\t    var type = Util.type(template)\n\t    var data\n\n\t    if (Handler[type]) {\n\t        data = Handler[type]({\n\t            // 属性值类型\n\t            type: type,\n\t            // 属性值模板\n\t            template: template,\n\t            // 属性名 + 生成规则\n\t            name: name,\n\t            // 属性名\n\t            parsedName: name ? name.replace(Constant.RE_KEY, '$1') : name,\n\n\t            // 解析后的生成规则\n\t            rule: rule,\n\t            // 相关上下文\n\t            context: context\n\t        })\n\n\t        if (!context.root) context.root = data\n\t        return data\n\t    }\n\n\t    return template\n\t}\n\n\tHandler.extend({\n\t    array: function(options) {\n\t        var result = [],\n\t            i, ii;\n\n\t        // 'name|1': []\n\t        // 'name|count': []\n\t        // 'name|min-max': []\n\t        if (options.template.length === 0) return result\n\n\t        // 'arr': [{ 'email': '@EMAIL' }, { 'email': '@EMAIL' }]\n\t        if (!options.rule.parameters) {\n\t            for (i = 0; i < options.template.length; i++) {\n\t                options.context.path.push(i)\n\t                options.context.templatePath.push(i)\n\t                result.push(\n\t                    Handler.gen(options.template[i], i, {\n\t                        path: options.context.path,\n\t                        templatePath: options.context.templatePath,\n\t                        currentContext: result,\n\t                        templateCurrentContext: options.template,\n\t                        root: options.context.root || result,\n\t                        templateRoot: options.context.templateRoot || options.template\n\t                    })\n\t                )\n\t                options.context.path.pop()\n\t                options.context.templatePath.pop()\n\t            }\n\t        } else {\n\t            // 'method|1': ['GET', 'POST', 'HEAD', 'DELETE']\n\t            if (options.rule.min === 1 && options.rule.max === undefined) {\n\t                // fix #17\n\t                options.context.path.push(options.name)\n\t                options.context.templatePath.push(options.name)\n\t                result = Random.pick(\n\t                    Handler.gen(options.template, undefined, {\n\t                        path: options.context.path,\n\t                        templatePath: options.context.templatePath,\n\t                        currentContext: result,\n\t                        templateCurrentContext: options.template,\n\t                        root: options.context.root || result,\n\t                        templateRoot: options.context.templateRoot || options.template\n\t                    })\n\t                )\n\t                options.context.path.pop()\n\t                options.context.templatePath.pop()\n\t            } else {\n\t                // 'data|+1': [{}, {}]\n\t                if (options.rule.parameters[2]) {\n\t                    options.template.__order_index = options.template.__order_index || 0\n\n\t                    options.context.path.push(options.name)\n\t                    options.context.templatePath.push(options.name)\n\t                    result = Handler.gen(options.template, undefined, {\n\t                        path: options.context.path,\n\t                        templatePath: options.context.templatePath,\n\t                        currentContext: result,\n\t                        templateCurrentContext: options.template,\n\t                        root: options.context.root || result,\n\t                        templateRoot: options.context.templateRoot || options.template\n\t                    })[\n\t                        options.template.__order_index % options.template.length\n\t                    ]\n\n\t                    options.template.__order_index += +options.rule.parameters[2]\n\n\t                    options.context.path.pop()\n\t                    options.context.templatePath.pop()\n\n\t                } else {\n\t                    // 'data|1-10': [{}]\n\t                    for (i = 0; i < options.rule.count; i++) {\n\t                        // 'data|1-10': [{}, {}]\n\t                        for (ii = 0; ii < options.template.length; ii++) {\n\t                            options.context.path.push(result.length)\n\t                            options.context.templatePath.push(ii)\n\t                            result.push(\n\t                                Handler.gen(options.template[ii], result.length, {\n\t                                    path: options.context.path,\n\t                                    templatePath: options.context.templatePath,\n\t                                    currentContext: result,\n\t                                    templateCurrentContext: options.template,\n\t                                    root: options.context.root || result,\n\t                                    templateRoot: options.context.templateRoot || options.template\n\t                                })\n\t                            )\n\t                            options.context.path.pop()\n\t                            options.context.templatePath.pop()\n\t                        }\n\t                    }\n\t                }\n\t            }\n\t        }\n\t        return result\n\t    },\n\t    object: function(options) {\n\t        var result = {},\n\t            keys, fnKeys, key, parsedKey, inc, i;\n\n\t        // 'obj|min-max': {}\n\t        /* jshint -W041 */\n\t        if (options.rule.min != undefined) {\n\t            keys = Util.keys(options.template)\n\t            keys = Random.shuffle(keys)\n\t            keys = keys.slice(0, options.rule.count)\n\t            for (i = 0; i < keys.length; i++) {\n\t                key = keys[i]\n\t                parsedKey = key.replace(Constant.RE_KEY, '$1')\n\t                options.context.path.push(parsedKey)\n\t                options.context.templatePath.push(key)\n\t                result[parsedKey] = Handler.gen(options.template[key], key, {\n\t                    path: options.context.path,\n\t                    templatePath: options.context.templatePath,\n\t                    currentContext: result,\n\t                    templateCurrentContext: options.template,\n\t                    root: options.context.root || result,\n\t                    templateRoot: options.context.templateRoot || options.template\n\t                })\n\t                options.context.path.pop()\n\t                options.context.templatePath.pop()\n\t            }\n\n\t        } else {\n\t            // 'obj': {}\n\t            keys = []\n\t            fnKeys = [] // #25 改变了非函数属性的顺序,查找起来不方便\n\t            for (key in options.template) {\n\t                (typeof options.template[key] === 'function' ? fnKeys : keys).push(key)\n\t            }\n\t            keys = keys.concat(fnKeys)\n\n\t            /*\n\t                会改变非函数属性的顺序\n\t                keys = Util.keys(options.template)\n\t                keys.sort(function(a, b) {\n\t                    var afn = typeof options.template[a] === 'function'\n\t                    var bfn = typeof options.template[b] === 'function'\n\t                    if (afn === bfn) return 0\n\t                    if (afn && !bfn) return 1\n\t                    if (!afn && bfn) return -1\n\t                })\n\t            */\n\n\t            for (i = 0; i < keys.length; i++) {\n\t                key = keys[i]\n\t                parsedKey = key.replace(Constant.RE_KEY, '$1')\n\t                options.context.path.push(parsedKey)\n\t                options.context.templatePath.push(key)\n\t                result[parsedKey] = Handler.gen(options.template[key], key, {\n\t                    path: options.context.path,\n\t                    templatePath: options.context.templatePath,\n\t                    currentContext: result,\n\t                    templateCurrentContext: options.template,\n\t                    root: options.context.root || result,\n\t                    templateRoot: options.context.templateRoot || options.template\n\t                })\n\t                options.context.path.pop()\n\t                options.context.templatePath.pop()\n\t                    // 'id|+1': 1\n\t                inc = key.match(Constant.RE_KEY)\n\t                if (inc && inc[2] && Util.type(options.template[key]) === 'number') {\n\t                    options.template[key] += parseInt(inc[2], 10)\n\t                }\n\t            }\n\t        }\n\t        return result\n\t    },\n\t    number: function(options) {\n\t        var result, parts;\n\t        if (options.rule.decimal) { // float\n\t            options.template += ''\n\t            parts = options.template.split('.')\n\t                // 'float1|.1-10': 10,\n\t                // 'float2|1-100.1-10': 1,\n\t                // 'float3|999.1-10': 1,\n\t                // 'float4|.3-10': 123.123,\n\t            parts[0] = options.rule.range ? options.rule.count : parts[0]\n\t            parts[1] = (parts[1] || '').slice(0, options.rule.dcount)\n\t            while (parts[1].length < options.rule.dcount) {\n\t                parts[1] += (\n\t                    // 最后一位不能为 0:如果最后一位为 0,会被 JS 引擎忽略掉。\n\t                    (parts[1].length < options.rule.dcount - 1) ? Random.character('number') : Random.character('123456789')\n\t                )\n\t            }\n\t            result = parseFloat(parts.join('.'), 10)\n\t        } else { // integer\n\t            // 'grade1|1-100': 1,\n\t            result = options.rule.range && !options.rule.parameters[2] ? options.rule.count : options.template\n\t        }\n\t        return result\n\t    },\n\t    boolean: function(options) {\n\t        var result;\n\t        // 'prop|multiple': false, 当前值是相反值的概率倍数\n\t        // 'prop|probability-probability': false, 当前值与相反值的概率\n\t        result = options.rule.parameters ? Random.bool(options.rule.min, options.rule.max, options.template) : options.template\n\t        return result\n\t    },\n\t    string: function(options) {\n\t        var result = '',\n\t            i, placeholders, ph, phed;\n\t        if (options.template.length) {\n\n\t            //  'foo': '★',\n\t            /* jshint -W041 */\n\t            if (options.rule.count == undefined) {\n\t                result += options.template\n\t            }\n\n\t            // 'star|1-5': '★',\n\t            for (i = 0; i < options.rule.count; i++) {\n\t                result += options.template\n\t            }\n\t            // 'email|1-10': '@EMAIL, ',\n\t            placeholders = result.match(Constant.RE_PLACEHOLDER) || [] // A-Z_0-9 > \\w_\n\t            for (i = 0; i < placeholders.length; i++) {\n\t                ph = placeholders[i]\n\n\t                // 遇到转义斜杠,不需要解析占位符\n\t                if (/^\\\\/.test(ph)) {\n\t                    placeholders.splice(i--, 1)\n\t                    continue\n\t                }\n\n\t                phed = Handler.placeholder(ph, options.context.currentContext, options.context.templateCurrentContext, options)\n\n\t                // 只有一个占位符,并且没有其他字符\n\t                if (placeholders.length === 1 && ph === result && typeof phed !== typeof result) { // \n\t                    result = phed\n\t                    break\n\n\t                    if (Util.isNumeric(phed)) {\n\t                        result = parseFloat(phed, 10)\n\t                        break\n\t                    }\n\t                    if (/^(true|false)$/.test(phed)) {\n\t                        result = phed === 'true' ? true :\n\t                            phed === 'false' ? false :\n\t                            phed // 已经是布尔值\n\t                        break\n\t                    }\n\t                }\n\t                result = result.replace(ph, phed)\n\t            }\n\n\t        } else {\n\t            // 'ASCII|1-10': '',\n\t            // 'ASCII': '',\n\t            result = options.rule.range ? Random.string(options.rule.count) : options.template\n\t        }\n\t        return result\n\t    },\n\t    'function': function(options) {\n\t        // ( context, options )\n\t        return options.template.call(options.context.currentContext, options)\n\t    },\n\t    'regexp': function(options) {\n\t        var source = ''\n\n\t        // 'name': /regexp/,\n\t        /* jshint -W041 */\n\t        if (options.rule.count == undefined) {\n\t            source += options.template.source // regexp.source\n\t        }\n\n\t        // 'name|1-5': /regexp/,\n\t        for (var i = 0; i < options.rule.count; i++) {\n\t            source += options.template.source\n\t        }\n\n\t        return RE.Handler.gen(\n\t            RE.Parser.parse(\n\t                source\n\t            )\n\t        )\n\t    }\n\t})\n\n\tHandler.extend({\n\t    _all: function() {\n\t        var re = {};\n\t        for (var key in Random) re[key.toLowerCase()] = key\n\t        return re\n\t    },\n\t    // 处理占位符,转换为最终值\n\t    placeholder: function(placeholder, obj, templateContext, options) {\n\t        // console.log(options.context.path)\n\t        // 1 key, 2 params\n\t        Constant.RE_PLACEHOLDER.exec('')\n\t        var parts = Constant.RE_PLACEHOLDER.exec(placeholder),\n\t            key = parts && parts[1],\n\t            lkey = key && key.toLowerCase(),\n\t            okey = this._all()[lkey],\n\t            params = parts && parts[2] || ''\n\t        var pathParts = this.splitPathToArray(key)\n\n\t        // 解析占位符的参数\n\t        try {\n\t            // 1. 尝试保持参数的类型\n\t            /*\n\t                #24 [Window Firefox 30.0 引用 占位符 抛错](https://github.com/nuysoft/Mock/issues/24)\n\t                [BX9056: 各浏览器下 window.eval 方法的执行上下文存在差异](http://www.w3help.org/zh-cn/causes/BX9056)\n\t                应该属于 Window Firefox 30.0 的 BUG\n\t            */\n\t            /* jshint -W061 */\n\t            params = eval('(function(){ return [].splice.call(arguments, 0 ) })(' + params + ')')\n\t        } catch (error) {\n\t            // 2. 如果失败,只能解析为字符串\n\t            // console.error(error)\n\t            // if (error instanceof ReferenceError) params = parts[2].split(/,\\s*/);\n\t            // else throw error\n\t            params = parts[2].split(/,\\s*/)\n\t        }\n\n\t        // 占位符优先引用数据模板中的属性\n\t        if (obj && (key in obj)) return obj[key]\n\n\t        // @index @key\n\t        // if (Constant.RE_INDEX.test(key)) return +options.name\n\t        // if (Constant.RE_KEY.test(key)) return options.name\n\n\t        // 绝对路径 or 相对路径\n\t        if (\n\t            key.charAt(0) === '/' ||\n\t            pathParts.length > 1\n\t        ) return this.getValueByKeyPath(key, options)\n\n\t        // 递归引用数据模板中的属性\n\t        if (templateContext &&\n\t            (typeof templateContext === 'object') &&\n\t            (key in templateContext) &&\n\t            (placeholder !== templateContext[key]) // fix #15 避免自己依赖自己\n\t        ) {\n\t            // 先计算被引用的属性值\n\t            templateContext[key] = Handler.gen(templateContext[key], key, {\n\t                currentContext: obj,\n\t                templateCurrentContext: templateContext\n\t            })\n\t            return templateContext[key]\n\t        }\n\n\t        // 如果未找到,则原样返回\n\t        if (!(key in Random) && !(lkey in Random) && !(okey in Random)) return placeholder\n\n\t        // 递归解析参数中的占位符\n\t        for (var i = 0; i < params.length; i++) {\n\t            Constant.RE_PLACEHOLDER.exec('')\n\t            if (Constant.RE_PLACEHOLDER.test(params[i])) {\n\t                params[i] = Handler.placeholder(params[i], obj, templateContext, options)\n\t            }\n\t        }\n\n\t        var handle = Random[key] || Random[lkey] || Random[okey]\n\t        switch (Util.type(handle)) {\n\t            case 'array':\n\t                // 自动从数组中取一个,例如 @areas\n\t                return Random.pick(handle)\n\t            case 'function':\n\t                // 执行占位符方法(大多数情况)\n\t                handle.options = options\n\t                var re = handle.apply(Random, params)\n\t                if (re === undefined) re = '' // 因为是在字符串中,所以默认为空字符串。\n\t                delete handle.options\n\t                return re\n\t        }\n\t    },\n\t    getValueByKeyPath: function(key, options) {\n\t        var originalKey = key\n\t        var keyPathParts = this.splitPathToArray(key)\n\t        var absolutePathParts = []\n\n\t        // 绝对路径\n\t        if (key.charAt(0) === '/') {\n\t            absolutePathParts = [options.context.path[0]].concat(\n\t                this.normalizePath(keyPathParts)\n\t            )\n\t        } else {\n\t            // 相对路径\n\t            if (keyPathParts.length > 1) {\n\t                absolutePathParts = options.context.path.slice(0)\n\t                absolutePathParts.pop()\n\t                absolutePathParts = this.normalizePath(\n\t                    absolutePathParts.concat(keyPathParts)\n\t                )\n\n\t            }\n\t        }\n\n\t        try {\n\t            key = keyPathParts[keyPathParts.length - 1]\n\t            var currentContext = options.context.root\n\t            var templateCurrentContext = options.context.templateRoot\n\t            for (var i = 1; i < absolutePathParts.length - 1; i++) {\n\t                currentContext = currentContext[absolutePathParts[i]]\n\t                templateCurrentContext = templateCurrentContext[absolutePathParts[i]]\n\t            }\n\t            // 引用的值已经计算好\n\t            if (currentContext && (key in currentContext)) return currentContext[key]\n\t    \n\t            // 尚未计算,递归引用数据模板中的属性\n\t            if (templateCurrentContext &&\n\t                (typeof templateCurrentContext === 'object') &&\n\t                (key in templateCurrentContext) &&\n\t                (originalKey !== templateCurrentContext[key]) // fix #15 避免自己依赖自己\n\t            ) {\n\t                // 先计算被引用的属性值\n\t                templateCurrentContext[key] = Handler.gen(templateCurrentContext[key], key, {\n\t                    currentContext: currentContext,\n\t                    templateCurrentContext: templateCurrentContext\n\t                })\n\t                return templateCurrentContext[key]\n\t            }\n\t        } catch(err) { }\n\n\t        return '@' + keyPathParts.join('/')\n\t    },\n\t    // https://github.com/kissyteam/kissy/blob/master/src/path/src/path.js\n\t    normalizePath: function(pathParts) {\n\t        var newPathParts = []\n\t        for (var i = 0; i < pathParts.length; i++) {\n\t            switch (pathParts[i]) {\n\t                case '..':\n\t                    newPathParts.pop()\n\t                    break\n\t                case '.':\n\t                    break\n\t                default:\n\t                    newPathParts.push(pathParts[i])\n\t            }\n\t        }\n\t        return newPathParts\n\t    },\n\t    splitPathToArray: function(path) {\n\t        var parts = path.split(/\\/+/);\n\t        if (!parts[parts.length - 1]) parts = parts.slice(0, -1)\n\t        if (!parts[0]) parts = parts.slice(1)\n\t        return parts;\n\t    }\n\t})\n\n\tmodule.exports = Handler\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\n\t/*\n\t    ## Constant\n\n\t    常量集合。\n\t */\n\t/*\n\t    RE_KEY\n\t        'name|min-max': value\n\t        'name|count': value\n\t        'name|min-max.dmin-dmax': value\n\t        'name|min-max.dcount': value\n\t        'name|count.dmin-dmax': value\n\t        'name|count.dcount': value\n\t        'name|+step': value\n\n\t        1 name, 2 step, 3 range [ min, max ], 4 drange [ dmin, dmax ]\n\n\t    RE_PLACEHOLDER\n\t        placeholder(*)\n\n\t    [正则查看工具](http://www.regexper.com/)\n\n\t    #26 生成规则 支持 负数,例如 number|-100-100\n\t*/\n\tmodule.exports = {\n\t    GUID: 1,\n\t    RE_KEY: /(.+)\\|(?:\\+(\\d+)|([\\+\\-]?\\d+-?[\\+\\-]?\\d*)?(?:\\.(\\d+-?\\d*))?)/,\n\t    RE_RANGE: /([\\+\\-]?\\d+)-?([\\+\\-]?\\d+)?/,\n\t    RE_PLACEHOLDER: /\\\\*@([^@#%&()\\?\\s]+)(?:\\((.*?)\\))?/g\n\t    // /\\\\*@([^@#%&()\\?\\s\\/\\.]+)(?:\\((.*?)\\))?/g\n\t    // RE_INDEX: /^index$/,\n\t    // RE_KEY: /^key$/\n\t}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/*\n\t    ## Utilities\n\t*/\n\tvar Util = {}\n\n\tUtil.extend = function extend() {\n\t    var target = arguments[0] || {},\n\t        i = 1,\n\t        length = arguments.length,\n\t        options, name, src, copy, clone\n\n\t    if (length === 1) {\n\t        target = this\n\t        i = 0\n\t    }\n\n\t    for (; i < length; i++) {\n\t        options = arguments[i]\n\t        if (!options) continue\n\n\t        for (name in options) {\n\t            src = target[name]\n\t            copy = options[name]\n\n\t            if (target === copy) continue\n\t            if (copy === undefined) continue\n\n\t            if (Util.isArray(copy) || Util.isObject(copy)) {\n\t                if (Util.isArray(copy)) clone = src && Util.isArray(src) ? src : []\n\t                if (Util.isObject(copy)) clone = src && Util.isObject(src) ? src : {}\n\n\t                target[name] = Util.extend(clone, copy)\n\t            } else {\n\t                target[name] = copy\n\t            }\n\t        }\n\t    }\n\n\t    return target\n\t}\n\n\tUtil.each = function each(obj, iterator, context) {\n\t    var i, key\n\t    if (this.type(obj) === 'number') {\n\t        for (i = 0; i < obj; i++) {\n\t            iterator(i, i)\n\t        }\n\t    } else if (obj.length === +obj.length) {\n\t        for (i = 0; i < obj.length; i++) {\n\t            if (iterator.call(context, obj[i], i, obj) === false) break\n\t        }\n\t    } else {\n\t        for (key in obj) {\n\t            if (iterator.call(context, obj[key], key, obj) === false) break\n\t        }\n\t    }\n\t}\n\n\tUtil.type = function type(obj) {\n\t    return (obj === null || obj === undefined) ? String(obj) : Object.prototype.toString.call(obj).match(/\\[object (\\w+)\\]/)[1].toLowerCase()\n\t}\n\n\tUtil.each('String Object Array RegExp Function'.split(' '), function(value) {\n\t    Util['is' + value] = function(obj) {\n\t        return Util.type(obj) === value.toLowerCase()\n\t    }\n\t})\n\n\tUtil.isObjectOrArray = function(value) {\n\t    return Util.isObject(value) || Util.isArray(value)\n\t}\n\n\tUtil.isNumeric = function(value) {\n\t    return !isNaN(parseFloat(value)) && isFinite(value)\n\t}\n\n\tUtil.keys = function(obj) {\n\t    var keys = [];\n\t    for (var key in obj) {\n\t        if (obj.hasOwnProperty(key)) keys.push(key)\n\t    }\n\t    return keys;\n\t}\n\tUtil.values = function(obj) {\n\t    var values = [];\n\t    for (var key in obj) {\n\t        if (obj.hasOwnProperty(key)) values.push(obj[key])\n\t    }\n\t    return values;\n\t}\n\n\t/*\n\t    ### Mock.heredoc(fn)\n\n\t    * Mock.heredoc(fn)\n\n\t    以直观、安全的方式书写(多行)HTML 模板。\n\n\t    **使用示例**如下所示:\n\n\t        var tpl = Mock.heredoc(function() {\n\t            /*!\n\t        {{email}}{{age}}\n\t        <!-- Mock { \n\t            email: '@EMAIL',\n\t            age: '@INT(1,100)'\n\t        } -->\n\t            *\\/\n\t        })\n\t    \n\t    **相关阅读**\n\t    * [Creating multiline strings in JavaScript](http://stackoverflow.com/questions/805107/creating-multiline-strings-in-javascript)、\n\t*/\n\tUtil.heredoc = function heredoc(fn) {\n\t    // 1. 移除起始的 function(){ /*!\n\t    // 2. 移除末尾的 */ }\n\t    // 3. 移除起始和末尾的空格\n\t    return fn.toString()\n\t        .replace(/^[^\\/]+\\/\\*!?/, '')\n\t        .replace(/\\*\\/[^\\/]+$/, '')\n\t        .replace(/^[\\s\\xA0]+/, '').replace(/[\\s\\xA0]+$/, '') // .trim()\n\t}\n\n\tUtil.noop = function() {}\n\n\tmodule.exports = Util\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t\t## Parser\n\n\t\t解析数据模板(属性名部分)。\n\n\t\t* Parser.parse( name )\n\t\t\t\n\t\t\t```json\n\t\t\t{\n\t\t\t\tparameters: [ name, inc, range, decimal ],\n\t\t\t\trnage: [ min , max ],\n\n\t\t\t\tmin: min,\n\t\t\t\tmax: max,\n\t\t\t\tcount : count,\n\n\t\t\t\tdecimal: decimal,\n\t\t\t\tdmin: dmin,\n\t\t\t\tdmax: dmax,\n\t\t\t\tdcount: dcount\n\t\t\t}\n\t\t\t```\n\t */\n\n\tvar Constant = __webpack_require__(2)\n\tvar Random = __webpack_require__(5)\n\n\t/* jshint -W041 */\n\tmodule.exports = {\n\t\tparse: function(name) {\n\t\t\tname = name == undefined ? '' : (name + '')\n\n\t\t\tvar parameters = (name || '').match(Constant.RE_KEY)\n\n\t\t\tvar range = parameters && parameters[3] && parameters[3].match(Constant.RE_RANGE)\n\t\t\tvar min = range && range[1] && parseInt(range[1], 10) // || 1\n\t\t\tvar max = range && range[2] && parseInt(range[2], 10) // || 1\n\t\t\t\t// repeat || min-max || 1\n\t\t\t\t// var count = range ? !range[2] && parseInt(range[1], 10) || Random.integer(min, max) : 1\n\t\t\tvar count = range ? !range[2] ? parseInt(range[1], 10) : Random.integer(min, max) : undefined\n\n\t\t\tvar decimal = parameters && parameters[4] && parameters[4].match(Constant.RE_RANGE)\n\t\t\tvar dmin = decimal && decimal[1] && parseInt(decimal[1], 10) // || 0,\n\t\t\tvar dmax = decimal && decimal[2] && parseInt(decimal[2], 10) // || 0,\n\t\t\t\t// int || dmin-dmax || 0\n\t\t\tvar dcount = decimal ? !decimal[2] && parseInt(decimal[1], 10) || Random.integer(dmin, dmax) : undefined\n\n\t\t\tvar result = {\n\t\t\t\t// 1 name, 2 inc, 3 range, 4 decimal\n\t\t\t\tparameters: parameters,\n\t\t\t\t// 1 min, 2 max\n\t\t\t\trange: range,\n\t\t\t\tmin: min,\n\t\t\t\tmax: max,\n\t\t\t\t// min-max\n\t\t\t\tcount: count,\n\t\t\t\t// 是否有 decimal\n\t\t\t\tdecimal: decimal,\n\t\t\t\tdmin: dmin,\n\t\t\t\tdmax: dmax,\n\t\t\t\t// dmin-dimax\n\t\t\t\tdcount: dcount\n\t\t\t}\n\n\t\t\tfor (var r in result) {\n\t\t\t\tif (result[r] != undefined) return result\n\t\t\t}\n\n\t\t\treturn {}\n\t\t}\n\t}\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t    ## Mock.Random\n\t    \n\t    工具类,用于生成各种随机数据。\n\t*/\n\n\tvar Util = __webpack_require__(3)\n\n\tvar Random = {\n\t    extend: Util.extend\n\t}\n\n\tRandom.extend(__webpack_require__(6))\n\tRandom.extend(__webpack_require__(7))\n\tRandom.extend(__webpack_require__(8))\n\tRandom.extend(__webpack_require__(10))\n\tRandom.extend(__webpack_require__(13))\n\tRandom.extend(__webpack_require__(15))\n\tRandom.extend(__webpack_require__(16))\n\tRandom.extend(__webpack_require__(17))\n\tRandom.extend(__webpack_require__(14))\n\tRandom.extend(__webpack_require__(19))\n\n\tmodule.exports = Random\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\n\t/*\n\t    ## Basics\n\t*/\n\tmodule.exports = {\n\t    // 返回一个随机的布尔值。\n\t    boolean: function(min, max, cur) {\n\t        if (cur !== undefined) {\n\t            min = typeof min !== 'undefined' && !isNaN(min) ? parseInt(min, 10) : 1\n\t            max = typeof max !== 'undefined' && !isNaN(max) ? parseInt(max, 10) : 1\n\t            return Math.random() > 1.0 / (min + max) * min ? !cur : cur\n\t        }\n\n\t        return Math.random() >= 0.5\n\t    },\n\t    bool: function(min, max, cur) {\n\t        return this.boolean(min, max, cur)\n\t    },\n\t    // 返回一个随机的自然数(大于等于 0 的整数)。\n\t    natural: function(min, max) {\n\t        min = typeof min !== 'undefined' ? parseInt(min, 10) : 0\n\t        max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992 // 2^53\n\t        return Math.round(Math.random() * (max - min)) + min\n\t    },\n\t    // 返回一个随机的整数。\n\t    integer: function(min, max) {\n\t        min = typeof min !== 'undefined' ? parseInt(min, 10) : -9007199254740992\n\t        max = typeof max !== 'undefined' ? parseInt(max, 10) : 9007199254740992 // 2^53\n\t        return Math.round(Math.random() * (max - min)) + min\n\t    },\n\t    int: function(min, max) {\n\t        return this.integer(min, max)\n\t    },\n\t    // 返回一个随机的浮点数。\n\t    float: function(min, max, dmin, dmax) {\n\t        dmin = dmin === undefined ? 0 : dmin\n\t        dmin = Math.max(Math.min(dmin, 17), 0)\n\t        dmax = dmax === undefined ? 17 : dmax\n\t        dmax = Math.max(Math.min(dmax, 17), 0)\n\t        var ret = this.integer(min, max) + '.';\n\t        for (var i = 0, dcount = this.natural(dmin, dmax); i < dcount; i++) {\n\t            ret += (\n\t                // 最后一位不能为 0:如果最后一位为 0,会被 JS 引擎忽略掉。\n\t                (i < dcount - 1) ? this.character('number') : this.character('123456789')\n\t            )\n\t        }\n\t        return parseFloat(ret, 10)\n\t    },\n\t    // 返回一个随机字符。\n\t    character: function(pool) {\n\t        var pools = {\n\t            lower: 'abcdefghijklmnopqrstuvwxyz',\n\t            upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t            number: '0123456789',\n\t            symbol: '!@#$%^&*()[]'\n\t        }\n\t        pools.alpha = pools.lower + pools.upper\n\t        pools['undefined'] = pools.lower + pools.upper + pools.number + pools.symbol\n\n\t        pool = pools[('' + pool).toLowerCase()] || pool\n\t        return pool.charAt(this.natural(0, pool.length - 1))\n\t    },\n\t    char: function(pool) {\n\t        return this.character(pool)\n\t    },\n\t    // 返回一个随机字符串。\n\t    string: function(pool, min, max) {\n\t        var len\n\t        switch (arguments.length) {\n\t            case 0: // ()\n\t                len = this.natural(3, 7)\n\t                break\n\t            case 1: // ( length )\n\t                len = pool\n\t                pool = undefined\n\t                break\n\t            case 2:\n\t                // ( pool, length )\n\t                if (typeof arguments[0] === 'string') {\n\t                    len = min\n\t                } else {\n\t                    // ( min, max )\n\t                    len = this.natural(pool, min)\n\t                    pool = undefined\n\t                }\n\t                break\n\t            case 3:\n\t                len = this.natural(min, max)\n\t                break\n\t        }\n\n\t        var text = ''\n\t        for (var i = 0; i < len; i++) {\n\t            text += this.character(pool)\n\t        }\n\n\t        return text\n\t    },\n\t    str: function( /*pool, min, max*/ ) {\n\t        return this.string.apply(this, arguments)\n\t    },\n\t    // 返回一个整型数组。\n\t    range: function(start, stop, step) {\n\t        // range( stop )\n\t        if (arguments.length <= 1) {\n\t            stop = start || 0;\n\t            start = 0;\n\t        }\n\t        // range( start, stop )\n\t        step = arguments[2] || 1;\n\n\t        start = +start\n\t        stop = +stop\n\t        step = +step\n\n\t        var len = Math.max(Math.ceil((stop - start) / step), 0);\n\t        var idx = 0;\n\t        var range = new Array(len);\n\n\t        while (idx < len) {\n\t            range[idx++] = start;\n\t            start += step;\n\t        }\n\n\t        return range;\n\t    }\n\t}\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\n\t/*\n\t    ## Date\n\t*/\n\tvar patternLetters = {\n\t    yyyy: 'getFullYear',\n\t    yy: function(date) {\n\t        return ('' + date.getFullYear()).slice(2)\n\t    },\n\t    y: 'yy',\n\n\t    MM: function(date) {\n\t        var m = date.getMonth() + 1\n\t        return m < 10 ? '0' + m : m\n\t    },\n\t    M: function(date) {\n\t        return date.getMonth() + 1\n\t    },\n\n\t    dd: function(date) {\n\t        var d = date.getDate()\n\t        return d < 10 ? '0' + d : d\n\t    },\n\t    d: 'getDate',\n\n\t    HH: function(date) {\n\t        var h = date.getHours()\n\t        return h < 10 ? '0' + h : h\n\t    },\n\t    H: 'getHours',\n\t    hh: function(date) {\n\t        var h = date.getHours() % 12\n\t        return h < 10 ? '0' + h : h\n\t    },\n\t    h: function(date) {\n\t        return date.getHours() % 12\n\t    },\n\n\t    mm: function(date) {\n\t        var m = date.getMinutes()\n\t        return m < 10 ? '0' + m : m\n\t    },\n\t    m: 'getMinutes',\n\n\t    ss: function(date) {\n\t        var s = date.getSeconds()\n\t        return s < 10 ? '0' + s : s\n\t    },\n\t    s: 'getSeconds',\n\n\t    SS: function(date) {\n\t        var ms = date.getMilliseconds()\n\t        return ms < 10 && '00' + ms || ms < 100 && '0' + ms || ms\n\t    },\n\t    S: 'getMilliseconds',\n\n\t    A: function(date) {\n\t        return date.getHours() < 12 ? 'AM' : 'PM'\n\t    },\n\t    a: function(date) {\n\t        return date.getHours() < 12 ? 'am' : 'pm'\n\t    },\n\t    T: 'getTime'\n\t}\n\tmodule.exports = {\n\t    // 日期占位符集合。\n\t    _patternLetters: patternLetters,\n\t    // 日期占位符正则。\n\t    _rformat: new RegExp((function() {\n\t        var re = []\n\t        for (var i in patternLetters) re.push(i)\n\t        return '(' + re.join('|') + ')'\n\t    })(), 'g'),\n\t    // 格式化日期。\n\t    _formatDate: function(date, format) {\n\t        return format.replace(this._rformat, function creatNewSubString($0, flag) {\n\t            return typeof patternLetters[flag] === 'function' ? patternLetters[flag](date) :\n\t                patternLetters[flag] in patternLetters ? creatNewSubString($0, patternLetters[flag]) :\n\t                date[patternLetters[flag]]()\n\t        })\n\t    },\n\t    // 生成一个随机的 Date 对象。\n\t    _randomDate: function(min, max) { // min, max\n\t        min = min === undefined ? new Date(0) : min\n\t        max = max === undefined ? new Date() : max\n\t        return new Date(Math.random() * (max.getTime() - min.getTime()))\n\t    },\n\t    // 返回一个随机的日期字符串。\n\t    date: function(format) {\n\t        format = format || 'yyyy-MM-dd'\n\t        return this._formatDate(this._randomDate(), format)\n\t    },\n\t    // 返回一个随机的时间字符串。\n\t    time: function(format) {\n\t        format = format || 'HH:mm:ss'\n\t        return this._formatDate(this._randomDate(), format)\n\t    },\n\t    // 返回一个随机的日期和时间字符串。\n\t    datetime: function(format) {\n\t        format = format || 'yyyy-MM-dd HH:mm:ss'\n\t        return this._formatDate(this._randomDate(), format)\n\t    },\n\t    // 返回当前的日期和时间字符串。\n\t    now: function(unit, format) {\n\t        // now(unit) now(format)\n\t        if (arguments.length === 1) {\n\t            // now(format)\n\t            if (!/year|month|day|hour|minute|second|week/.test(unit)) {\n\t                format = unit\n\t                unit = ''\n\t            }\n\t        }\n\t        unit = (unit || '').toLowerCase()\n\t        format = format || 'yyyy-MM-dd HH:mm:ss'\n\n\t        var date = new Date()\n\n\t        /* jshint -W086 */\n\t        // 参考自 http://momentjs.cn/docs/#/manipulating/start-of/\n\t        switch (unit) {\n\t            case 'year':\n\t                date.setMonth(0)\n\t            case 'month':\n\t                date.setDate(1)\n\t            case 'week':\n\t            case 'day':\n\t                date.setHours(0)\n\t            case 'hour':\n\t                date.setMinutes(0)\n\t            case 'minute':\n\t                date.setSeconds(0)\n\t            case 'second':\n\t                date.setMilliseconds(0)\n\t        }\n\t        switch (unit) {\n\t            case 'week':\n\t                date.setDate(date.getDate() - date.getDay())\n\t        }\n\n\t        return this._formatDate(date, format)\n\t    }\n\t}\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(module) {/* global document  */\n\t/*\n\t    ## Image\n\t*/\n\tmodule.exports = {\n\t    // 常见的广告宽高\n\t    _adSize: [\n\t        '300x250', '250x250', '240x400', '336x280', '180x150',\n\t        '720x300', '468x60', '234x60', '88x31', '120x90',\n\t        '120x60', '120x240', '125x125', '728x90', '160x600',\n\t        '120x600', '300x600'\n\t    ],\n\t    // 常见的屏幕宽高\n\t    _screenSize: [\n\t        '320x200', '320x240', '640x480', '800x480', '800x480',\n\t        '1024x600', '1024x768', '1280x800', '1440x900', '1920x1200',\n\t        '2560x1600'\n\t    ],\n\t    // 常见的视频宽高\n\t    _videoSize: ['720x480', '768x576', '1280x720', '1920x1080'],\n\t    /*\n\t        生成一个随机的图片地址。\n\n\t        替代图片源\n\t            http://fpoimg.com/\n\t        参考自 \n\t            http://rensanning.iteye.com/blog/1933310\n\t            http://code.tutsplus.com/articles/the-top-8-placeholders-for-web-designers--net-19485\n\t    */\n\t    image: function(size, background, foreground, format, text) {\n\t        // Random.image( size, background, foreground, text )\n\t        if (arguments.length === 4) {\n\t            text = format\n\t            format = undefined\n\t        }\n\t        // Random.image( size, background, text )\n\t        if (arguments.length === 3) {\n\t            text = foreground\n\t            foreground = undefined\n\t        }\n\t        // Random.image()\n\t        if (!size) size = this.pick(this._adSize)\n\n\t        if (background && ~background.indexOf('#')) background = background.slice(1)\n\t        if (foreground && ~foreground.indexOf('#')) foreground = foreground.slice(1)\n\n\t        // http://dummyimage.com/600x400/cc00cc/470047.png&text=hello\n\t        return 'http://dummyimage.com/' + size +\n\t            (background ? '/' + background : '') +\n\t            (foreground ? '/' + foreground : '') +\n\t            (format ? '.' + format : '') +\n\t            (text ? '&text=' + text : '')\n\t    },\n\t    img: function() {\n\t        return this.image.apply(this, arguments)\n\t    },\n\n\t    /*\n\t        BrandColors\n\t        http://brandcolors.net/\n\t        A collection of major brand color codes curated by Galen Gidman.\n\t        大牌公司的颜色集合\n\n\t        // 获取品牌和颜色\n\t        $('h2').each(function(index, item){\n\t            item = $(item)\n\t            console.log('\\'' + item.text() + '\\'', ':', '\\'' + item.next().text() + '\\'', ',')\n\t        })\n\t    */\n\t    _brandColors: {\n\t        '4ormat': '#fb0a2a',\n\t        '500px': '#02adea',\n\t        'About.me (blue)': '#00405d',\n\t        'About.me (yellow)': '#ffcc33',\n\t        'Addvocate': '#ff6138',\n\t        'Adobe': '#ff0000',\n\t        'Aim': '#fcd20b',\n\t        'Amazon': '#e47911',\n\t        'Android': '#a4c639',\n\t        'Angie\\'s List': '#7fbb00',\n\t        'AOL': '#0060a3',\n\t        'Atlassian': '#003366',\n\t        'Behance': '#053eff',\n\t        'Big Cartel': '#97b538',\n\t        'bitly': '#ee6123',\n\t        'Blogger': '#fc4f08',\n\t        'Boeing': '#0039a6',\n\t        'Booking.com': '#003580',\n\t        'Carbonmade': '#613854',\n\t        'Cheddar': '#ff7243',\n\t        'Code School': '#3d4944',\n\t        'Delicious': '#205cc0',\n\t        'Dell': '#3287c1',\n\t        'Designmoo': '#e54a4f',\n\t        'Deviantart': '#4e6252',\n\t        'Designer News': '#2d72da',\n\t        'Devour': '#fd0001',\n\t        'DEWALT': '#febd17',\n\t        'Disqus (blue)': '#59a3fc',\n\t        'Disqus (orange)': '#db7132',\n\t        'Dribbble': '#ea4c89',\n\t        'Dropbox': '#3d9ae8',\n\t        'Drupal': '#0c76ab',\n\t        'Dunked': '#2a323a',\n\t        'eBay': '#89c507',\n\t        'Ember': '#f05e1b',\n\t        'Engadget': '#00bdf6',\n\t        'Envato': '#528036',\n\t        'Etsy': '#eb6d20',\n\t        'Evernote': '#5ba525',\n\t        'Fab.com': '#dd0017',\n\t        'Facebook': '#3b5998',\n\t        'Firefox': '#e66000',\n\t        'Flickr (blue)': '#0063dc',\n\t        'Flickr (pink)': '#ff0084',\n\t        'Forrst': '#5b9a68',\n\t        'Foursquare': '#25a0ca',\n\t        'Garmin': '#007cc3',\n\t        'GetGlue': '#2d75a2',\n\t        'Gimmebar': '#f70078',\n\t        'GitHub': '#171515',\n\t        'Google Blue': '#0140ca',\n\t        'Google Green': '#16a61e',\n\t        'Google Red': '#dd1812',\n\t        'Google Yellow': '#fcca03',\n\t        'Google+': '#dd4b39',\n\t        'Grooveshark': '#f77f00',\n\t        'Groupon': '#82b548',\n\t        'Hacker News': '#ff6600',\n\t        'HelloWallet': '#0085ca',\n\t        'Heroku (light)': '#c7c5e6',\n\t        'Heroku (dark)': '#6567a5',\n\t        'HootSuite': '#003366',\n\t        'Houzz': '#73ba37',\n\t        'HTML5': '#ec6231',\n\t        'IKEA': '#ffcc33',\n\t        'IMDb': '#f3ce13',\n\t        'Instagram': '#3f729b',\n\t        'Intel': '#0071c5',\n\t        'Intuit': '#365ebf',\n\t        'Kickstarter': '#76cc1e',\n\t        'kippt': '#e03500',\n\t        'Kodery': '#00af81',\n\t        'LastFM': '#c3000d',\n\t        'LinkedIn': '#0e76a8',\n\t        'Livestream': '#cf0005',\n\t        'Lumo': '#576396',\n\t        'Mixpanel': '#a086d3',\n\t        'Meetup': '#e51937',\n\t        'Nokia': '#183693',\n\t        'NVIDIA': '#76b900',\n\t        'Opera': '#cc0f16',\n\t        'Path': '#e41f11',\n\t        'PayPal (dark)': '#1e477a',\n\t        'PayPal (light)': '#3b7bbf',\n\t        'Pinboard': '#0000e6',\n\t        'Pinterest': '#c8232c',\n\t        'PlayStation': '#665cbe',\n\t        'Pocket': '#ee4056',\n\t        'Prezi': '#318bff',\n\t        'Pusha': '#0f71b4',\n\t        'Quora': '#a82400',\n\t        'QUOTE.fm': '#66ceff',\n\t        'Rdio': '#008fd5',\n\t        'Readability': '#9c0000',\n\t        'Red Hat': '#cc0000',\n\t        'Resource': '#7eb400',\n\t        'Rockpack': '#0ba6ab',\n\t        'Roon': '#62b0d9',\n\t        'RSS': '#ee802f',\n\t        'Salesforce': '#1798c1',\n\t        'Samsung': '#0c4da2',\n\t        'Shopify': '#96bf48',\n\t        'Skype': '#00aff0',\n\t        'Snagajob': '#f47a20',\n\t        'Softonic': '#008ace',\n\t        'SoundCloud': '#ff7700',\n\t        'Space Box': '#f86960',\n\t        'Spotify': '#81b71a',\n\t        'Sprint': '#fee100',\n\t        'Squarespace': '#121212',\n\t        'StackOverflow': '#ef8236',\n\t        'Staples': '#cc0000',\n\t        'Status Chart': '#d7584f',\n\t        'Stripe': '#008cdd',\n\t        'StudyBlue': '#00afe1',\n\t        'StumbleUpon': '#f74425',\n\t        'T-Mobile': '#ea0a8e',\n\t        'Technorati': '#40a800',\n\t        'The Next Web': '#ef4423',\n\t        'Treehouse': '#5cb868',\n\t        'Trulia': '#5eab1f',\n\t        'Tumblr': '#34526f',\n\t        'Twitch.tv': '#6441a5',\n\t        'Twitter': '#00acee',\n\t        'TYPO3': '#ff8700',\n\t        'Ubuntu': '#dd4814',\n\t        'Ustream': '#3388ff',\n\t        'Verizon': '#ef1d1d',\n\t        'Vimeo': '#86c9ef',\n\t        'Vine': '#00a478',\n\t        'Virb': '#06afd8',\n\t        'Virgin Media': '#cc0000',\n\t        'Wooga': '#5b009c',\n\t        'WordPress (blue)': '#21759b',\n\t        'WordPress (orange)': '#d54e21',\n\t        'WordPress (grey)': '#464646',\n\t        'Wunderlist': '#2b88d9',\n\t        'XBOX': '#9bc848',\n\t        'XING': '#126567',\n\t        'Yahoo!': '#720e9e',\n\t        'Yandex': '#ffcc00',\n\t        'Yelp': '#c41200',\n\t        'YouTube': '#c4302b',\n\t        'Zalongo': '#5498dc',\n\t        'Zendesk': '#78a300',\n\t        'Zerply': '#9dcc7a',\n\t        'Zootool': '#5e8b1d'\n\t    },\n\t    _brandNames: function() {\n\t        var brands = [];\n\t        for (var b in this._brandColors) {\n\t            brands.push(b)\n\t        }\n\t        return brands\n\t    },\n\t    /*\n\t        生成一段随机的 Base64 图片编码。\n\n\t        https://github.com/imsky/holder\n\t        Holder renders image placeholders entirely on the client side.\n\n\t        dataImageHolder: function(size) {\n\t            return 'holder.js/' + size\n\t        },\n\t    */\n\t    dataImage: function(size, text) {\n\t        var canvas\n\t        if (typeof document !== 'undefined') {\n\t            canvas = document.createElement('canvas')\n\t        } else {\n\t            /*\n\t                https://github.com/Automattic/node-canvas\n\t                    npm install canvas --save\n\t                安装问题:\n\t                * http://stackoverflow.com/questions/22953206/gulp-issues-with-cario-install-command-not-found-when-trying-to-installing-canva\n\t                * https://github.com/Automattic/node-canvas/issues/415\n\t                * https://github.com/Automattic/node-canvas/wiki/_pages\n\n\t                PS:node-canvas 的安装过程实在是太繁琐了,所以不放入 package.json 的 dependencies。\n\t             */\n\t            var Canvas = module.require('canvas')\n\t            canvas = new Canvas()\n\t        }\n\n\t        var ctx = canvas && canvas.getContext && canvas.getContext(\"2d\")\n\t        if (!canvas || !ctx) return ''\n\n\t        if (!size) size = this.pick(this._adSize)\n\t        text = text !== undefined ? text : size\n\n\t        size = size.split('x')\n\n\t        var width = parseInt(size[0], 10),\n\t            height = parseInt(size[1], 10),\n\t            background = this._brandColors[this.pick(this._brandNames())],\n\t            foreground = '#FFF',\n\t            text_height = 14,\n\t            font = 'sans-serif';\n\n\t        canvas.width = width\n\t        canvas.height = height\n\t        ctx.textAlign = 'center'\n\t        ctx.textBaseline = 'middle'\n\t        ctx.fillStyle = background\n\t        ctx.fillRect(0, 0, width, height)\n\t        ctx.fillStyle = foreground\n\t        ctx.font = 'bold ' + text_height + 'px ' + font\n\t        ctx.fillText(text, (width / 2), (height / 2), width)\n\t        return canvas.toDataURL('image/png')\n\t    }\n\t}\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(9)(module)))\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\tmodule.exports = function(module) {\r\n\t\tif(!module.webpackPolyfill) {\r\n\t\t\tmodule.deprecate = function() {};\r\n\t\t\tmodule.paths = [];\r\n\t\t\t// module.parent = undefined by default\r\n\t\t\tmodule.children = [];\r\n\t\t\tmodule.webpackPolyfill = 1;\r\n\t\t}\r\n\t\treturn module;\r\n\t}\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t    ## Color\n\n\t    http://llllll.li/randomColor/\n\t        A color generator for JavaScript.\n\t        randomColor generates attractive colors by default. More specifically, randomColor produces bright colors with a reasonably high saturation. This makes randomColor particularly useful for data visualizations and generative art.\n\n\t    http://randomcolour.com/\n\t        var bg_colour = Math.floor(Math.random() * 16777215).toString(16);\n\t        bg_colour = \"#\" + (\"000000\" + bg_colour).slice(-6);\n\t        document.bgColor = bg_colour;\n\t    \n\t    http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/\n\t        Creating random colors is actually more difficult than it seems. The randomness itself is easy, but aesthetically pleasing randomness is more difficult.\n\t        https://github.com/devongovett/color-generator\n\n\t    http://www.paulirish.com/2009/random-hex-color-code-snippets/\n\t        Random Hex Color Code Generator in JavaScript\n\n\t    http://chancejs.com/#color\n\t        chance.color()\n\t        // => '#79c157'\n\t        chance.color({format: 'hex'})\n\t        // => '#d67118'\n\t        chance.color({format: 'shorthex'})\n\t        // => '#60f'\n\t        chance.color({format: 'rgb'})\n\t        // => 'rgb(110,52,164)'\n\n\t    http://tool.c7sky.com/webcolor\n\t        网页设计常用色彩搭配表\n\t    \n\t    https://github.com/One-com/one-color\n\t        An OO-based JavaScript color parser/computation toolkit with support for RGB, HSV, HSL, CMYK, and alpha channels.\n\t        API 很赞\n\n\t    https://github.com/harthur/color\n\t        JavaScript color conversion and manipulation library\n\n\t    https://github.com/leaverou/css-colors\n\t        Share & convert CSS colors\n\t    http://leaverou.github.io/css-colors/#slategray\n\t        Type a CSS color keyword, #hex, hsl(), rgba(), whatever:\n\n\t    色调 hue\n\t        http://baike.baidu.com/view/23368.htm\n\t        色调指的是一幅画中画面色彩的总体倾向,是大的色彩效果。\n\t    饱和度 saturation\n\t        http://baike.baidu.com/view/189644.htm\n\t        饱和度是指色彩的鲜艳程度,也称色彩的纯度。饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。\n\t    亮度 brightness\n\t        http://baike.baidu.com/view/34773.htm\n\t        亮度是指发光体(反光体)表面发光(反光)强弱的物理量。\n\t    照度 luminosity\n\t        物体被照亮的程度,采用单位面积所接受的光通量来表示,表示单位为勒[克斯](Lux,lx) ,即 1m / m2 。\n\n\t    http://stackoverflow.com/questions/1484506/random-color-generator-in-javascript\n\t        var letters = '0123456789ABCDEF'.split('')\n\t        var color = '#'\n\t        for (var i = 0; i < 6; i++) {\n\t            color += letters[Math.floor(Math.random() * 16)]\n\t        }\n\t        return color\n\t    \n\t        // 随机生成一个无脑的颜色,格式为 '#RRGGBB'。\n\t        // _brainlessColor()\n\t        var color = Math.floor(\n\t            Math.random() *\n\t            (16 * 16 * 16 * 16 * 16 * 16 - 1)\n\t        ).toString(16)\n\t        color = \"#\" + (\"000000\" + color).slice(-6)\n\t        return color.toUpperCase()\n\t*/\n\n\tvar Convert = __webpack_require__(11)\n\tvar DICT = __webpack_require__(12)\n\n\tmodule.exports = {\n\t    // 随机生成一个有吸引力的颜色,格式为 '#RRGGBB'。\n\t    color: function(name) {\n\t        if (name || DICT[name]) return DICT[name].nicer\n\t        return this.hex()\n\t    },\n\t    // #DAC0DE\n\t    hex: function() {\n\t        var hsv = this._goldenRatioColor()\n\t        var rgb = Convert.hsv2rgb(hsv)\n\t        var hex = Convert.rgb2hex(rgb[0], rgb[1], rgb[2])\n\t        return hex\n\t    },\n\t    // rgb(128,255,255)\n\t    rgb: function() {\n\t        var hsv = this._goldenRatioColor()\n\t        var rgb = Convert.hsv2rgb(hsv)\n\t        return 'rgb(' +\n\t            parseInt(rgb[0], 10) + ', ' +\n\t            parseInt(rgb[1], 10) + ', ' +\n\t            parseInt(rgb[2], 10) + ')'\n\t    },\n\t    // rgba(128,255,255,0.3)\n\t    rgba: function() {\n\t        var hsv = this._goldenRatioColor()\n\t        var rgb = Convert.hsv2rgb(hsv)\n\t        return 'rgba(' +\n\t            parseInt(rgb[0], 10) + ', ' +\n\t            parseInt(rgb[1], 10) + ', ' +\n\t            parseInt(rgb[2], 10) + ', ' +\n\t            Math.random().toFixed(2) + ')'\n\t    },\n\t    // hsl(300,80%,90%)\n\t    hsl: function() {\n\t        var hsv = this._goldenRatioColor()\n\t        var hsl = Convert.hsv2hsl(hsv)\n\t        return 'hsl(' +\n\t            parseInt(hsl[0], 10) + ', ' +\n\t            parseInt(hsl[1], 10) + ', ' +\n\t            parseInt(hsl[2], 10) + ')'\n\t    },\n\t    // http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/\n\t    // https://github.com/devongovett/color-generator/blob/master/index.js\n\t    // 随机生成一个有吸引力的颜色。\n\t    _goldenRatioColor: function(saturation, value) {\n\t        this._goldenRatio = 0.618033988749895\n\t        this._hue = this._hue || Math.random()\n\t        this._hue += this._goldenRatio\n\t        this._hue %= 1\n\n\t        if (typeof saturation !== \"number\") saturation = 0.5;\n\t        if (typeof value !== \"number\") value = 0.95;\n\n\t        return [\n\t            this._hue * 360,\n\t            saturation * 100,\n\t            value * 100\n\t        ]\n\t    }\n\t}\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n\t/*\n\t    ## Color Convert\n\n\t    http://blog.csdn.net/idfaya/article/details/6770414\n\t        颜色空间RGB与HSV(HSL)的转换\n\t*/\n\t// https://github.com/harthur/color-convert/blob/master/conversions.js\n\tmodule.exports = {\n\t\trgb2hsl: function rgb2hsl(rgb) {\n\t\t\tvar r = rgb[0] / 255,\n\t\t\t\tg = rgb[1] / 255,\n\t\t\t\tb = rgb[2] / 255,\n\t\t\t\tmin = Math.min(r, g, b),\n\t\t\t\tmax = Math.max(r, g, b),\n\t\t\t\tdelta = max - min,\n\t\t\t\th, s, l;\n\n\t\t\tif (max == min)\n\t\t\t\th = 0;\n\t\t\telse if (r == max)\n\t\t\t\th = (g - b) / delta;\n\t\t\telse if (g == max)\n\t\t\t\th = 2 + (b - r) / delta;\n\t\t\telse if (b == max)\n\t\t\t\th = 4 + (r - g) / delta;\n\n\t\t\th = Math.min(h * 60, 360);\n\n\t\t\tif (h < 0)\n\t\t\t\th += 360;\n\n\t\t\tl = (min + max) / 2;\n\n\t\t\tif (max == min)\n\t\t\t\ts = 0;\n\t\t\telse if (l <= 0.5)\n\t\t\t\ts = delta / (max + min);\n\t\t\telse\n\t\t\t\ts = delta / (2 - max - min);\n\n\t\t\treturn [h, s * 100, l * 100];\n\t\t},\n\t\trgb2hsv: function rgb2hsv(rgb) {\n\t\t\tvar r = rgb[0],\n\t\t\t\tg = rgb[1],\n\t\t\t\tb = rgb[2],\n\t\t\t\tmin = Math.min(r, g, b),\n\t\t\t\tmax = Math.max(r, g, b),\n\t\t\t\tdelta = max - min,\n\t\t\t\th, s, v;\n\n\t\t\tif (max === 0)\n\t\t\t\ts = 0;\n\t\t\telse\n\t\t\t\ts = (delta / max * 1000) / 10;\n\n\t\t\tif (max == min)\n\t\t\t\th = 0;\n\t\t\telse if (r == max)\n\t\t\t\th = (g - b) / delta;\n\t\t\telse if (g == max)\n\t\t\t\th = 2 + (b - r) / delta;\n\t\t\telse if (b == max)\n\t\t\t\th = 4 + (r - g) / delta;\n\n\t\t\th = Math.min(h * 60, 360);\n\n\t\t\tif (h < 0)\n\t\t\t\th += 360;\n\n\t\t\tv = ((max / 255) * 1000) / 10;\n\n\t\t\treturn [h, s, v];\n\t\t},\n\t\thsl2rgb: function hsl2rgb(hsl) {\n\t\t\tvar h = hsl[0] / 360,\n\t\t\t\ts = hsl[1] / 100,\n\t\t\t\tl = hsl[2] / 100,\n\t\t\t\tt1, t2, t3, rgb, val;\n\n\t\t\tif (s === 0) {\n\t\t\t\tval = l * 255;\n\t\t\t\treturn [val, val, val];\n\t\t\t}\n\n\t\t\tif (l < 0.5)\n\t\t\t\tt2 = l * (1 + s);\n\t\t\telse\n\t\t\t\tt2 = l + s - l * s;\n\t\t\tt1 = 2 * l - t2;\n\n\t\t\trgb = [0, 0, 0];\n\t\t\tfor (var i = 0; i < 3; i++) {\n\t\t\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\t\t\tif (t3 < 0) t3++;\n\t\t\t\tif (t3 > 1) t3--;\n\n\t\t\t\tif (6 * t3 < 1)\n\t\t\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t\t\telse if (2 * t3 < 1)\n\t\t\t\t\tval = t2;\n\t\t\t\telse if (3 * t3 < 2)\n\t\t\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t\t\telse\n\t\t\t\t\tval = t1;\n\n\t\t\t\trgb[i] = val * 255;\n\t\t\t}\n\n\t\t\treturn rgb;\n\t\t},\n\t\thsl2hsv: function hsl2hsv(hsl) {\n\t\t\tvar h = hsl[0],\n\t\t\t\ts = hsl[1] / 100,\n\t\t\t\tl = hsl[2] / 100,\n\t\t\t\tsv, v;\n\t\t\tl *= 2;\n\t\t\ts *= (l <= 1) ? l : 2 - l;\n\t\t\tv = (l + s) / 2;\n\t\t\tsv = (2 * s) / (l + s);\n\t\t\treturn [h, sv * 100, v * 100];\n\t\t},\n\t\thsv2rgb: function hsv2rgb(hsv) {\n\t\t\tvar h = hsv[0] / 60\n\t\t\tvar s = hsv[1] / 100\n\t\t\tvar v = hsv[2] / 100\n\t\t\tvar hi = Math.floor(h) % 6\n\n\t\t\tvar f = h - Math.floor(h)\n\t\t\tvar p = 255 * v * (1 - s)\n\t\t\tvar q = 255 * v * (1 - (s * f))\n\t\t\tvar t = 255 * v * (1 - (s * (1 - f)))\n\n\t\t\tv = 255 * v\n\n\t\t\tswitch (hi) {\n\t\t\t\tcase 0:\n\t\t\t\t\treturn [v, t, p]\n\t\t\t\tcase 1:\n\t\t\t\t\treturn [q, v, p]\n\t\t\t\tcase 2:\n\t\t\t\t\treturn [p, v, t]\n\t\t\t\tcase 3:\n\t\t\t\t\treturn [p, q, v]\n\t\t\t\tcase 4:\n\t\t\t\t\treturn [t, p, v]\n\t\t\t\tcase 5:\n\t\t\t\t\treturn [v, p, q]\n\t\t\t}\n\t\t},\n\t\thsv2hsl: function hsv2hsl(hsv) {\n\t\t\tvar h = hsv[0],\n\t\t\t\ts = hsv[1] / 100,\n\t\t\t\tv = hsv[2] / 100,\n\t\t\t\tsl, l;\n\n\t\t\tl = (2 - s) * v;\n\t\t\tsl = s * v;\n\t\t\tsl /= (l <= 1) ? l : 2 - l;\n\t\t\tl /= 2;\n\t\t\treturn [h, sl * 100, l * 100];\n\t\t},\n\t\t// http://www.140byt.es/keywords/color\n\t\trgb2hex: function(\n\t\t\ta, // red, as a number from 0 to 255\n\t\t\tb, // green, as a number from 0 to 255\n\t\t\tc // blue, as a number from 0 to 255\n\t\t) {\n\t\t\treturn \"#\" + ((256 + a << 8 | b) << 8 | c).toString(16).slice(1)\n\t\t},\n\t\thex2rgb: function(\n\t\t\ta // take a \"#xxxxxx\" hex string,\n\t\t) {\n\t\t\ta = '0x' + a.slice(1).replace(a.length > 4 ? a : /./g, '$&$&') | 0;\n\t\t\treturn [a >> 16, a >> 8 & 255, a & 255]\n\t\t}\n\t}\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports) {\n\n\t/*\n\t    ## Color 字典数据\n\n\t    字典数据来源 [A nicer color palette for the web](http://clrs.cc/)\n\t*/\n\tmodule.exports = {\n\t    // name value nicer\n\t    navy: {\n\t        value: '#000080',\n\t        nicer: '#001F3F'\n\t    },\n\t    blue: {\n\t        value: '#0000ff',\n\t        nicer: '#0074D9'\n\t    },\n\t    aqua: {\n\t        value: '#00ffff',\n\t        nicer: '#7FDBFF'\n\t    },\n\t    teal: {\n\t        value: '#008080',\n\t        nicer: '#39CCCC'\n\t    },\n\t    olive: {\n\t        value: '#008000',\n\t        nicer: '#3D9970'\n\t    },\n\t    green: {\n\t        value: '#008000',\n\t        nicer: '#2ECC40'\n\t    },\n\t    lime: {\n\t        value: '#00ff00',\n\t        nicer: '#01FF70'\n\t    },\n\t    yellow: {\n\t        value: '#ffff00',\n\t        nicer: '#FFDC00'\n\t    },\n\t    orange: {\n\t        value: '#ffa500',\n\t        nicer: '#FF851B'\n\t    },\n\t    red: {\n\t        value: '#ff0000',\n\t        nicer: '#FF4136'\n\t    },\n\t    maroon: {\n\t        value: '#800000',\n\t        nicer: '#85144B'\n\t    },\n\t    fuchsia: {\n\t        value: '#ff00ff',\n\t        nicer: '#F012BE'\n\t    },\n\t    purple: {\n\t        value: '#800080',\n\t        nicer: '#B10DC9'\n\t    },\n\t    silver: {\n\t        value: '#c0c0c0',\n\t        nicer: '#DDDDDD'\n\t    },\n\t    gray: {\n\t        value: '#808080',\n\t        nicer: '#AAAAAA'\n\t    },\n\t    black: {\n\t        value: '#000000',\n\t        nicer: '#111111'\n\t    },\n\t    white: {\n\t        value: '#FFFFFF',\n\t        nicer: '#FFFFFF'\n\t    }\n\t}\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t    ## Text\n\n\t    http://www.lipsum.com/\n\t*/\n\tvar Basic = __webpack_require__(6)\n\tvar Helper = __webpack_require__(14)\n\n\tfunction range(defaultMin, defaultMax, min, max) {\n\t    return min === undefined ? Basic.natural(defaultMin, defaultMax) : // ()\n\t        max === undefined ? min : // ( len )\n\t        Basic.natural(parseInt(min, 10), parseInt(max, 10)) // ( min, max )\n\t}\n\n\tmodule.exports = {\n\t    // 随机生成一段文本。\n\t    paragraph: function(min, max) {\n\t        var len = range(3, 7, min, max)\n\t        var result = []\n\t        for (var i = 0; i < len; i++) {\n\t            result.push(this.sentence())\n\t        }\n\t        return result.join(' ')\n\t    },\n\t    // \n\t    cparagraph: function(min, max) {\n\t        var len = range(3, 7, min, max)\n\t        var result = []\n\t        for (var i = 0; i < len; i++) {\n\t            result.push(this.csentence())\n\t        }\n\t        return result.join('')\n\t    },\n\t    // 随机生成一个句子,第一个单词的首字母大写。\n\t    sentence: function(min, max) {\n\t        var len = range(12, 18, min, max)\n\t        var result = []\n\t        for (var i = 0; i < len; i++) {\n\t            result.push(this.word())\n\t        }\n\t        return Helper.capitalize(result.join(' ')) + '.'\n\t    },\n\t    // 随机生成一个中文句子。\n\t    csentence: function(min, max) {\n\t        var len = range(12, 18, min, max)\n\t        var result = []\n\t        for (var i = 0; i < len; i++) {\n\t            result.push(this.cword())\n\t        }\n\n\t        return result.join('') + '。'\n\t    },\n\t    // 随机生成一个单词。\n\t    word: function(min, max) {\n\t        var len = range(3, 10, min, max)\n\t        var result = '';\n\t        for (var i = 0; i < len; i++) {\n\t            result += Basic.character('lower')\n\t        }\n\t        return result\n\t    },\n\t    // 随机生成一个或多个汉字。\n\t    cword: function(pool, min, max) {\n\t        // 最常用的 500 个汉字 http://baike.baidu.com/view/568436.htm\n\t        var DICT_KANZI = '的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞'\n\n\t        var len\n\t        switch (arguments.length) {\n\t            case 0: // ()\n\t                pool = DICT_KANZI\n\t                len = 1\n\t                break\n\t            case 1: // ( pool )\n\t                if (typeof arguments[0] === 'string') {\n\t                    len = 1\n\t                } else {\n\t                    // ( length )\n\t                    len = pool\n\t                    pool = DICT_KANZI\n\t                }\n\t                break\n\t            case 2:\n\t                // ( pool, length )\n\t                if (typeof arguments[0] === 'string') {\n\t                    len = min\n\t                } else {\n\t                    // ( min, max )\n\t                    len = this.natural(pool, min)\n\t                    pool = DICT_KANZI\n\t                }\n\t                break\n\t            case 3:\n\t                len = this.natural(min, max)\n\t                break\n\t        }\n\n\t        var result = ''\n\t        for (var i = 0; i < len; i++) {\n\t            result += pool.charAt(this.natural(0, pool.length - 1))\n\t        }\n\t        return result\n\t    },\n\t    // 随机生成一句标题,其中每个单词的首字母大写。\n\t    title: function(min, max) {\n\t        var len = range(3, 7, min, max)\n\t        var result = []\n\t        for (var i = 0; i < len; i++) {\n\t            result.push(this.capitalize(this.word()))\n\t        }\n\t        return result.join(' ')\n\t    },\n\t    // 随机生成一句中文标题。\n\t    ctitle: function(min, max) {\n\t        var len = range(3, 7, min, max)\n\t        var result = []\n\t        for (var i = 0; i < len; i++) {\n\t            result.push(this.cword())\n\t        }\n\t        return result.join('')\n\t    }\n\t}\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t    ## Helpers\n\t*/\n\n\tvar Util = __webpack_require__(3)\n\n\tmodule.exports = {\n\t\t// 把字符串的第一个字母转换为大写。\n\t\tcapitalize: function(word) {\n\t\t\treturn (word + '').charAt(0).toUpperCase() + (word + '').substr(1)\n\t\t},\n\t\t// 把字符串转换为大写。\n\t\tupper: function(str) {\n\t\t\treturn (str + '').toUpperCase()\n\t\t},\n\t\t// 把字符串转换为小写。\n\t\tlower: function(str) {\n\t\t\treturn (str + '').toLowerCase()\n\t\t},\n\t\t// 从数组中随机选取一个元素,并返回。\n\t\tpick: function pick(arr, min, max) {\n\t\t\t// pick( item1, item2 ... )\n\t\t\tif (!Util.isArray(arr)) {\n\t\t\t\tarr = [].slice.call(arguments)\n\t\t\t\tmin = 1\n\t\t\t\tmax = 1\n\t\t\t} else {\n\t\t\t\t// pick( [ item1, item2 ... ] )\n\t\t\t\tif (min === undefined) min = 1\n\n\t\t\t\t// pick( [ item1, item2 ... ], count )\n\t\t\t\tif (max === undefined) max = min\n\t\t\t}\n\n\t\t\tif (min === 1 && max === 1) return arr[this.natural(0, arr.length - 1)]\n\n\t\t\t// pick( [ item1, item2 ... ], min, max )\n\t\t\treturn this.shuffle(arr, min, max)\n\n\t\t\t// 通过参数个数判断方法签名,扩展性太差!#90\n\t\t\t// switch (arguments.length) {\n\t\t\t// \tcase 1:\n\t\t\t// \t\t// pick( [ item1, item2 ... ] )\n\t\t\t// \t\treturn arr[this.natural(0, arr.length - 1)]\n\t\t\t// \tcase 2:\n\t\t\t// \t\t// pick( [ item1, item2 ... ], count )\n\t\t\t// \t\tmax = min\n\t\t\t// \t\t\t/* falls through */\n\t\t\t// \tcase 3:\n\t\t\t// \t\t// pick( [ item1, item2 ... ], min, max )\n\t\t\t// \t\treturn this.shuffle(arr, min, max)\n\t\t\t// }\n\t\t},\n\t\t/*\n\t\t    打乱数组中元素的顺序,并返回。\n\t\t    Given an array, scramble the order and return it.\n\n\t\t    其他的实现思路:\n\t\t        // https://code.google.com/p/jslibs/wiki/JavascriptTips\n\t\t        result = result.sort(function() {\n\t\t            return Math.random() - 0.5\n\t\t        })\n\t\t*/\n\t\tshuffle: function shuffle(arr, min, max) {\n\t\t\tarr = arr || []\n\t\t\tvar old = arr.slice(0),\n\t\t\t\tresult = [],\n\t\t\t\tindex = 0,\n\t\t\t\tlength = old.length;\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tindex = this.natural(0, old.length - 1)\n\t\t\t\tresult.push(old[index])\n\t\t\t\told.splice(index, 1)\n\t\t\t}\n\t\t\tswitch (arguments.length) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\t\treturn result\n\t\t\t\tcase 2:\n\t\t\t\t\tmax = min\n\t\t\t\t\t\t/* falls through */\n\t\t\t\tcase 3:\n\t\t\t\t\tmin = parseInt(min, 10)\n\t\t\t\t\tmax = parseInt(max, 10)\n\t\t\t\t\treturn result.slice(0, this.natural(min, max))\n\t\t\t}\n\t\t},\n\t\t/*\n\t\t    * Random.order(item, item)\n\t\t    * Random.order([item, item ...])\n\n\t\t    顺序获取数组中的元素\n\n\t\t    [JSON导入数组支持数组数据录入](https://github.com/thx/RAP/issues/22)\n\n\t\t    不支持单独调用!\n\t\t*/\n\t\torder: function order(array) {\n\t\t\torder.cache = order.cache || {}\n\n\t\t\tif (arguments.length > 1) array = [].slice.call(arguments, 0)\n\n\t\t\t// options.context.path/templatePath\n\t\t\tvar options = order.options\n\t\t\tvar templatePath = options.context.templatePath.join('.')\n\n\t\t\tvar cache = (\n\t\t\t\torder.cache[templatePath] = order.cache[templatePath] || {\n\t\t\t\t\tindex: 0,\n\t\t\t\t\tarray: array\n\t\t\t\t}\n\t\t\t)\n\n\t\t\treturn cache.array[cache.index++ % cache.array.length]\n\t\t}\n\t}\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n\t/*\n\t    ## Name\n\n\t    [Beyond the Top 1000 Names](http://www.ssa.gov/oact/babynames/limits.html)\n\t*/\n\tmodule.exports = {\n\t\t// 随机生成一个常见的英文名。\n\t\tfirst: function() {\n\t\t\tvar names = [\n\t\t\t\t// male\n\t\t\t\t\"James\", \"John\", \"Robert\", \"Michael\", \"William\",\n\t\t\t\t\"David\", \"Richard\", \"Charles\", \"Joseph\", \"Thomas\",\n\t\t\t\t\"Christopher\", \"Daniel\", \"Paul\", \"Mark\", \"Donald\",\n\t\t\t\t\"George\", \"Kenneth\", \"Steven\", \"Edward\", \"Brian\",\n\t\t\t\t\"Ronald\", \"Anthony\", \"Kevin\", \"Jason\", \"Matthew\",\n\t\t\t\t\"Gary\", \"Timothy\", \"Jose\", \"Larry\", \"Jeffrey\",\n\t\t\t\t\"Frank\", \"Scott\", \"Eric\"\n\t\t\t].concat([\n\t\t\t\t// female\n\t\t\t\t\"Mary\", \"Patricia\", \"Linda\", \"Barbara\", \"Elizabeth\",\n\t\t\t\t\"Jennifer\", \"Maria\", \"Susan\", \"Margaret\", \"Dorothy\",\n\t\t\t\t\"Lisa\", \"Nancy\", \"Karen\", \"Betty\", \"Helen\",\n\t\t\t\t\"Sandra\", \"Donna\", \"Carol\", \"Ruth\", \"Sharon\",\n\t\t\t\t\"Michelle\", \"Laura\", \"Sarah\", \"Kimberly\", \"Deborah\",\n\t\t\t\t\"Jessica\", \"Shirley\", \"Cynthia\", \"Angela\", \"Melissa\",\n\t\t\t\t\"Brenda\", \"Amy\", \"Anna\"\n\t\t\t])\n\t\t\treturn this.pick(names)\n\t\t\t\t// or this.capitalize(this.word())\n\t\t},\n\t\t// 随机生成一个常见的英文姓。\n\t\tlast: function() {\n\t\t\tvar names = [\n\t\t\t\t\"Smith\", \"Johnson\", \"Williams\", \"Brown\", \"Jones\",\n\t\t\t\t\"Miller\", \"Davis\", \"Garcia\", \"Rodriguez\", \"Wilson\",\n\t\t\t\t\"Martinez\", \"Anderson\", \"Taylor\", \"Thomas\", \"Hernandez\",\n\t\t\t\t\"Moore\", \"Martin\", \"Jackson\", \"Thompson\", \"White\",\n\t\t\t\t\"Lopez\", \"Lee\", \"Gonzalez\", \"Harris\", \"Clark\",\n\t\t\t\t\"Lewis\", \"Robinson\", \"Walker\", \"Perez\", \"Hall\",\n\t\t\t\t\"Young\", \"Allen\"\n\t\t\t]\n\t\t\treturn this.pick(names)\n\t\t\t\t// or this.capitalize(this.word())\n\t\t},\n\t\t// 随机生成一个常见的英文姓名。\n\t\tname: function(middle) {\n\t\t\treturn this.first() + ' ' +\n\t\t\t\t(middle ? this.first() + ' ' : '') +\n\t\t\t\tthis.last()\n\t\t},\n\t\t/*\n\t\t    随机生成一个常见的中文姓。\n\t\t    [世界常用姓氏排行](http://baike.baidu.com/view/1719115.htm)\n\t\t    [玄派网 - 网络小说创作辅助平台](http://xuanpai.sinaapp.com/)\n\t\t */\n\t\tcfirst: function() {\n\t\t\tvar names = (\n\t\t\t\t'王 李 张 刘 陈 杨 赵 黄 周 吴 ' +\n\t\t\t\t'徐 孙 胡 朱 高 林 何 郭 马 罗 ' +\n\t\t\t\t'梁 宋 郑 谢 韩 唐 冯 于 董 萧 ' +\n\t\t\t\t'程 曹 袁 邓 许 傅 沈 曾 彭 吕 ' +\n\t\t\t\t'苏 卢 蒋 蔡 贾 丁 魏 薛 叶 阎 ' +\n\t\t\t\t'余 潘 杜 戴 夏 锺 汪 田 任 姜 ' +\n\t\t\t\t'范 方 石 姚 谭 廖 邹 熊 金 陆 ' +\n\t\t\t\t'郝 孔 白 崔 康 毛 邱 秦 江 史 ' +\n\t\t\t\t'顾 侯 邵 孟 龙 万 段 雷 钱 汤 ' +\n\t\t\t\t'尹 黎 易 常 武 乔 贺 赖 龚 文'\n\t\t\t).split(' ')\n\t\t\treturn this.pick(names)\n\t\t},\n\t\t/*\n\t\t    随机生成一个常见的中文名。\n\t\t    [中国最常见名字前50名_三九算命网](http://www.name999.net/xingming/xingshi/20131004/48.html)\n\t\t */\n\t\tclast: function() {\n\t\t\tvar names = (\n\t\t\t\t'伟 芳 娜 秀英 敏 静 丽 强 磊 军 ' +\n\t\t\t\t'洋 勇 艳 杰 娟 涛 明 超 秀兰 霞 ' +\n\t\t\t\t'平 刚 桂英'\n\t\t\t).split(' ')\n\t\t\treturn this.pick(names)\n\t\t},\n\t\t// 随机生成一个常见的中文姓名。\n\t\tcname: function() {\n\t\t\treturn this.cfirst() + this.clast()\n\t\t}\n\t}\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\n\t/*\n\t    ## Web\n\t*/\n\tmodule.exports = {\n\t    /*\n\t        随机生成一个 URL。\n\n\t        [URL 规范](http://www.w3.org/Addressing/URL/url-spec.txt)\n\t            http                    Hypertext Transfer Protocol \n\t            ftp                     File Transfer protocol \n\t            gopher                  The Gopher protocol \n\t            mailto                  Electronic mail address \n\t            mid                     Message identifiers for electronic mail \n\t            cid                     Content identifiers for MIME body part \n\t            news                    Usenet news \n\t            nntp                    Usenet news for local NNTP access only \n\t            prospero                Access using the prospero protocols \n\t            telnet rlogin tn3270    Reference to interactive sessions\n\t            wais                    Wide Area Information Servers \n\t    */\n\t    url: function(protocol, host) {\n\t        return (protocol || this.protocol()) + '://' + // protocol?\n\t            (host || this.domain()) + // host?\n\t            '/' + this.word()\n\t    },\n\t    // 随机生成一个 URL 协议。\n\t    protocol: function() {\n\t        return this.pick(\n\t            // 协议簇\n\t            'http ftp gopher mailto mid cid news nntp prospero telnet rlogin tn3270 wais'.split(' ')\n\t        )\n\t    },\n\t    // 随机生成一个域名。\n\t    domain: function(tld) {\n\t        return this.word() + '.' + (tld || this.tld())\n\t    },\n\t    /*\n\t        随机生成一个顶级域名。\n\t        国际顶级域名 international top-level domain-names, iTLDs\n\t        国家顶级域名 national top-level domainnames, nTLDs\n\t        [域名后缀大全](http://www.163ns.com/zixun/post/4417.html)\n\t    */\n\t    tld: function() { // Top Level Domain\n\t        return this.pick(\n\t            (\n\t                // 域名后缀\n\t                'com net org edu gov int mil cn ' +\n\t                // 国内域名\n\t                'com.cn net.cn gov.cn org.cn ' +\n\t                // 中文国内域名\n\t                '中国 中国互联.公司 中国互联.网络 ' +\n\t                // 新国际域名\n\t                'tel biz cc tv info name hk mobi asia cd travel pro museum coop aero ' +\n\t                // 世界各国域名后缀\n\t                'ad ae af ag ai al am an ao aq ar as at au aw az ba bb bd be bf bg bh bi bj bm bn bo br bs bt bv bw by bz ca cc cf cg ch ci ck cl cm cn co cq cr cu cv cx cy cz de dj dk dm do dz ec ee eg eh es et ev fi fj fk fm fo fr ga gb gd ge gf gh gi gl gm gn gp gr gt gu gw gy hk hm hn hr ht hu id ie il in io iq ir is it jm jo jp ke kg kh ki km kn kp kr kw ky kz la lb lc li lk lr ls lt lu lv ly ma mc md mg mh ml mm mn mo mp mq mr ms mt mv mw mx my mz na nc ne nf ng ni nl no np nr nt nu nz om qa pa pe pf pg ph pk pl pm pn pr pt pw py re ro ru rw sa sb sc sd se sg sh si sj sk sl sm sn so sr st su sy sz tc td tf tg th tj tk tm tn to tp tr tt tv tw tz ua ug uk us uy va vc ve vg vn vu wf ws ye yu za zm zr zw'\n\t            ).split(' ')\n\t        )\n\t    },\n\t    // 随机生成一个邮件地址。\n\t    email: function(domain) {\n\t        return this.character('lower') + '.' + this.word() + '@' +\n\t            (\n\t                domain ||\n\t                (this.word() + '.' + this.tld())\n\t            )\n\t            // return this.character('lower') + '.' + this.last().toLowerCase() + '@' + this.last().toLowerCase() + '.' + this.tld()\n\t            // return this.word() + '@' + (domain || this.domain())\n\t    },\n\t    // 随机生成一个 IP 地址。\n\t    ip: function() {\n\t        return this.natural(0, 255) + '.' +\n\t            this.natural(0, 255) + '.' +\n\t            this.natural(0, 255) + '.' +\n\t            this.natural(0, 255)\n\t    }\n\t}\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t    ## Address\n\t*/\n\n\tvar DICT = __webpack_require__(18)\n\tvar REGION = ['东北', '华北', '华东', '华中', '华南', '西南', '西北']\n\n\tmodule.exports = {\n\t    // 随机生成一个大区。\n\t    region: function() {\n\t        return this.pick(REGION)\n\t    },\n\t    // 随机生成一个(中国)省(或直辖市、自治区、特别行政区)。\n\t    province: function() {\n\t        return this.pick(DICT).name\n\t    },\n\t    // 随机生成一个(中国)市。\n\t    city: function(prefix) {\n\t        var province = this.pick(DICT)\n\t        var city = this.pick(province.children)\n\t        return prefix ? [province.name, city.name].join(' ') : city.name\n\t    },\n\t    // 随机生成一个(中国)县。\n\t    county: function(prefix) {\n\t        var province = this.pick(DICT)\n\t        var city = this.pick(province.children)\n\t        var county = this.pick(city.children) || {\n\t            name: '-'\n\t        }\n\t        return prefix ? [province.name, city.name, county.name].join(' ') : county.name\n\t    },\n\t    // 随机生成一个邮政编码(六位数字)。\n\t    zip: function(len) {\n\t        var zip = ''\n\t        for (var i = 0; i < (len || 6); i++) zip += this.natural(0, 9)\n\t        return zip\n\t    }\n\n\t    // address: function() {},\n\t    // phone: function() {},\n\t    // areacode: function() {},\n\t    // street: function() {},\n\t    // street_suffixes: function() {},\n\t    // street_suffix: function() {},\n\t    // states: function() {},\n\t    // state: function() {},\n\t}\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\n\t/*\n\t    ## Address 字典数据\n\n\t    字典数据来源 http://www.atatech.org/articles/30028?rnd=254259856\n\n\t    国标 省(市)级行政区划码表\n\n\t    华北   北京市 天津市 河北省 山西省 内蒙古自治区\n\t    东北   辽宁省 吉林省 黑龙江省\n\t    华东   上海市 江苏省 浙江省 安徽省 福建省 江西省 山东省\n\t    华南   广东省 广西壮族自治区 海南省\n\t    华中   河南省 湖北省 湖南省\n\t    西南   重庆市 四川省 贵州省 云南省 西藏自治区\n\t    西北   陕西省 甘肃省 青海省 宁夏回族自治区 新疆维吾尔自治区\n\t    港澳台 香港特别行政区 澳门特别行政区 台湾省\n\t    \n\t    **排序**\n\t    \n\t    ```js\n\t    var map = {}\n\t    _.each(_.keys(REGIONS),function(id){\n\t      map[id] = REGIONS[ID]\n\t    })\n\t    JSON.stringify(map)\n\t    ```\n\t*/\n\tvar DICT = {\n\t    \"110000\": \"北京\",\n\t    \"110100\": \"北京市\",\n\t    \"110101\": \"东城区\",\n\t    \"110102\": \"西城区\",\n\t    \"110105\": \"朝阳区\",\n\t    \"110106\": \"丰台区\",\n\t    \"110107\": \"石景山区\",\n\t    \"110108\": \"海淀区\",\n\t    \"110109\": \"门头沟区\",\n\t    \"110111\": \"房山区\",\n\t    \"110112\": \"通州区\",\n\t    \"110113\": \"顺义区\",\n\t    \"110114\": \"昌平区\",\n\t    \"110115\": \"大兴区\",\n\t    \"110116\": \"怀柔区\",\n\t    \"110117\": \"平谷区\",\n\t    \"110228\": \"密云县\",\n\t    \"110229\": \"延庆县\",\n\t    \"110230\": \"其它区\",\n\t    \"120000\": \"天津\",\n\t    \"120100\": \"天津市\",\n\t    \"120101\": \"和平区\",\n\t    \"120102\": \"河东区\",\n\t    \"120103\": \"河西区\",\n\t    \"120104\": \"南开区\",\n\t    \"120105\": \"河北区\",\n\t    \"120106\": \"红桥区\",\n\t    \"120110\": \"东丽区\",\n\t    \"120111\": \"西青区\",\n\t    \"120112\": \"津南区\",\n\t    \"120113\": \"北辰区\",\n\t    \"120114\": \"武清区\",\n\t    \"120115\": \"宝坻区\",\n\t    \"120116\": \"滨海新区\",\n\t    \"120221\": \"宁河县\",\n\t    \"120223\": \"静海县\",\n\t    \"120225\": \"蓟县\",\n\t    \"120226\": \"其它区\",\n\t    \"130000\": \"河北省\",\n\t    \"130100\": \"石家庄市\",\n\t    \"130102\": \"长安区\",\n\t    \"130103\": \"桥东区\",\n\t    \"130104\": \"桥西区\",\n\t    \"130105\": \"新华区\",\n\t    \"130107\": \"井陉矿区\",\n\t    \"130108\": \"裕华区\",\n\t    \"130121\": \"井陉县\",\n\t    \"130123\": \"正定县\",\n\t    \"130124\": \"栾城县\",\n\t    \"130125\": \"行唐县\",\n\t    \"130126\": \"灵寿县\",\n\t    \"130127\": \"高邑县\",\n\t    \"130128\": \"深泽县\",\n\t    \"130129\": \"赞皇县\",\n\t    \"130130\": \"无极县\",\n\t    \"130131\": \"平山县\",\n\t    \"130132\": \"元氏县\",\n\t    \"130133\": \"赵县\",\n\t    \"130181\": \"辛集市\",\n\t    \"130182\": \"藁城市\",\n\t    \"130183\": \"晋州市\",\n\t    \"130184\": \"新乐市\",\n\t    \"130185\": \"鹿泉市\",\n\t    \"130186\": \"其它区\",\n\t    \"130200\": \"唐山市\",\n\t    \"130202\": \"路南区\",\n\t    \"130203\": \"路北区\",\n\t    \"130204\": \"古冶区\",\n\t    \"130205\": \"开平区\",\n\t    \"130207\": \"丰南区\",\n\t    \"130208\": \"丰润区\",\n\t    \"130223\": \"滦县\",\n\t    \"130224\": \"滦南县\",\n\t    \"130225\": \"乐亭县\",\n\t    \"130227\": \"迁西县\",\n\t    \"130229\": \"玉田县\",\n\t    \"130230\": \"曹妃甸区\",\n\t    \"130281\": \"遵化市\",\n\t    \"130283\": \"迁安市\",\n\t    \"130284\": \"其它区\",\n\t    \"130300\": \"秦皇岛市\",\n\t    \"130302\": \"海港区\",\n\t    \"130303\": \"山海关区\",\n\t    \"130304\": \"北戴河区\",\n\t    \"130321\": \"青龙满族自治县\",\n\t    \"130322\": \"昌黎县\",\n\t    \"130323\": \"抚宁县\",\n\t    \"130324\": \"卢龙县\",\n\t    \"130398\": \"其它区\",\n\t    \"130400\": \"邯郸市\",\n\t    \"130402\": \"邯山区\",\n\t    \"130403\": \"丛台区\",\n\t    \"130404\": \"复兴区\",\n\t    \"130406\": \"峰峰矿区\",\n\t    \"130421\": \"邯郸县\",\n\t    \"130423\": \"临漳县\",\n\t    \"130424\": \"成安县\",\n\t    \"130425\": \"大名县\",\n\t    \"130426\": \"涉县\",\n\t    \"130427\": \"磁县\",\n\t    \"130428\": \"肥乡县\",\n\t    \"130429\": \"永年县\",\n\t    \"130430\": \"邱县\",\n\t    \"130431\": \"鸡泽县\",\n\t    \"130432\": \"广平县\",\n\t    \"130433\": \"馆陶县\",\n\t    \"130434\": \"魏县\",\n\t    \"130435\": \"曲周县\",\n\t    \"130481\": \"武安市\",\n\t    \"130482\": \"其它区\",\n\t    \"130500\": \"邢台市\",\n\t    \"130502\": \"桥东区\",\n\t    \"130503\": \"桥西区\",\n\t    \"130521\": \"邢台县\",\n\t    \"130522\": \"临城县\",\n\t    \"130523\": \"内丘县\",\n\t    \"130524\": \"柏乡县\",\n\t    \"130525\": \"隆尧县\",\n\t    \"130526\": \"任县\",\n\t    \"130527\": \"南和县\",\n\t    \"130528\": \"宁晋县\",\n\t    \"130529\": \"巨鹿县\",\n\t    \"130530\": \"新河县\",\n\t    \"130531\": \"广宗县\",\n\t    \"130532\": \"平乡县\",\n\t    \"130533\": \"威县\",\n\t    \"130534\": \"清河县\",\n\t    \"130535\": \"临西县\",\n\t    \"130581\": \"南宫市\",\n\t    \"130582\": \"沙河市\",\n\t    \"130583\": \"其它区\",\n\t    \"130600\": \"保定市\",\n\t    \"130602\": \"新市区\",\n\t    \"130603\": \"北市区\",\n\t    \"130604\": \"南市区\",\n\t    \"130621\": \"满城县\",\n\t    \"130622\": \"清苑县\",\n\t    \"130623\": \"涞水县\",\n\t    \"130624\": \"阜平县\",\n\t    \"130625\": \"徐水县\",\n\t    \"130626\": \"定兴县\",\n\t    \"130627\": \"唐县\",\n\t    \"130628\": \"高阳县\",\n\t    \"130629\": \"容城县\",\n\t    \"130630\": \"涞源县\",\n\t    \"130631\": \"望都县\",\n\t    \"130632\": \"安新县\",\n\t    \"130633\": \"易县\",\n\t    \"130634\": \"曲阳县\",\n\t    \"130635\": \"蠡县\",\n\t    \"130636\": \"顺平县\",\n\t    \"130637\": \"博野县\",\n\t    \"130638\": \"雄县\",\n\t    \"130681\": \"涿州市\",\n\t    \"130682\": \"定州市\",\n\t    \"130683\": \"安国市\",\n\t    \"130684\": \"高碑店市\",\n\t    \"130699\": \"其它区\",\n\t    \"130700\": \"张家口市\",\n\t    \"130702\": \"桥东区\",\n\t    \"130703\": \"桥西区\",\n\t    \"130705\": \"宣化区\",\n\t    \"130706\": \"下花园区\",\n\t    \"130721\": \"宣化县\",\n\t    \"130722\": \"张北县\",\n\t    \"130723\": \"康保县\",\n\t    \"130724\": \"沽源县\",\n\t    \"130725\": \"尚义县\",\n\t    \"130726\": \"蔚县\",\n\t    \"130727\": \"阳原县\",\n\t    \"130728\": \"怀安县\",\n\t    \"130729\": \"万全县\",\n\t    \"130730\": \"怀来县\",\n\t    \"130731\": \"涿鹿县\",\n\t    \"130732\": \"赤城县\",\n\t    \"130733\": \"崇礼县\",\n\t    \"130734\": \"其它区\",\n\t    \"130800\": \"承德市\",\n\t    \"130802\": \"双桥区\",\n\t    \"130803\": \"双滦区\",\n\t    \"130804\": \"鹰手营子矿区\",\n\t    \"130821\": \"承德县\",\n\t    \"130822\": \"兴隆县\",\n\t    \"130823\": \"平泉县\",\n\t    \"130824\": \"滦平县\",\n\t    \"130825\": \"隆化县\",\n\t    \"130826\": \"丰宁满族自治县\",\n\t    \"130827\": \"宽城满族自治县\",\n\t    \"130828\": \"围场满族蒙古族自治县\",\n\t    \"130829\": \"其它区\",\n\t    \"130900\": \"沧州市\",\n\t    \"130902\": \"新华区\",\n\t    \"130903\": \"运河区\",\n\t    \"130921\": \"沧县\",\n\t    \"130922\": \"青县\",\n\t    \"130923\": \"东光县\",\n\t    \"130924\": \"海兴县\",\n\t    \"130925\": \"盐山县\",\n\t    \"130926\": \"肃宁县\",\n\t    \"130927\": \"南皮县\",\n\t    \"130928\": \"吴桥县\",\n\t    \"130929\": \"献县\",\n\t    \"130930\": \"孟村回族自治县\",\n\t    \"130981\": \"泊头市\",\n\t    \"130982\": \"任丘市\",\n\t    \"130983\": \"黄骅市\",\n\t    \"130984\": \"河间市\",\n\t    \"130985\": \"其它区\",\n\t    \"131000\": \"廊坊市\",\n\t    \"131002\": \"安次区\",\n\t    \"131003\": \"广阳区\",\n\t    \"131022\": \"固安县\",\n\t    \"131023\": \"永清县\",\n\t    \"131024\": \"香河县\",\n\t    \"131025\": \"大城县\",\n\t    \"131026\": \"文安县\",\n\t    \"131028\": \"大厂回族自治县\",\n\t    \"131081\": \"霸州市\",\n\t    \"131082\": \"三河市\",\n\t    \"131083\": \"其它区\",\n\t    \"131100\": \"衡水市\",\n\t    \"131102\": \"桃城区\",\n\t    \"131121\": \"枣强县\",\n\t    \"131122\": \"武邑县\",\n\t    \"131123\": \"武强县\",\n\t    \"131124\": \"饶阳县\",\n\t    \"131125\": \"安平县\",\n\t    \"131126\": \"故城县\",\n\t    \"131127\": \"景县\",\n\t    \"131128\": \"阜城县\",\n\t    \"131181\": \"冀州市\",\n\t    \"131182\": \"深州市\",\n\t    \"131183\": \"其它区\",\n\t    \"140000\": \"山西省\",\n\t    \"140100\": \"太原市\",\n\t    \"140105\": \"小店区\",\n\t    \"140106\": \"迎泽区\",\n\t    \"140107\": \"杏花岭区\",\n\t    \"140108\": \"尖草坪区\",\n\t    \"140109\": \"万柏林区\",\n\t    \"140110\": \"晋源区\",\n\t    \"140121\": \"清徐县\",\n\t    \"140122\": \"阳曲县\",\n\t    \"140123\": \"娄烦县\",\n\t    \"140181\": \"古交市\",\n\t    \"140182\": \"其它区\",\n\t    \"140200\": \"大同市\",\n\t    \"140202\": \"城区\",\n\t    \"140203\": \"矿区\",\n\t    \"140211\": \"南郊区\",\n\t    \"140212\": \"新荣区\",\n\t    \"140221\": \"阳高县\",\n\t    \"140222\": \"天镇县\",\n\t    \"140223\": \"广灵县\",\n\t    \"140224\": \"灵丘县\",\n\t    \"140225\": \"浑源县\",\n\t    \"140226\": \"左云县\",\n\t    \"140227\": \"大同县\",\n\t    \"140228\": \"其它区\",\n\t    \"140300\": \"阳泉市\",\n\t    \"140302\": \"城区\",\n\t    \"140303\": \"矿区\",\n\t    \"140311\": \"郊区\",\n\t    \"140321\": \"平定县\",\n\t    \"140322\": \"盂县\",\n\t    \"140323\": \"其它区\",\n\t    \"140400\": \"长治市\",\n\t    \"140421\": \"长治县\",\n\t    \"140423\": \"襄垣县\",\n\t    \"140424\": \"屯留县\",\n\t    \"140425\": \"平顺县\",\n\t    \"140426\": \"黎城县\",\n\t    \"140427\": \"壶关县\",\n\t    \"140428\": \"长子县\",\n\t    \"140429\": \"武乡县\",\n\t    \"140430\": \"沁县\",\n\t    \"140431\": \"沁源县\",\n\t    \"140481\": \"潞城市\",\n\t    \"140482\": \"城区\",\n\t    \"140483\": \"郊区\",\n\t    \"140485\": \"其它区\",\n\t    \"140500\": \"晋城市\",\n\t    \"140502\": \"城区\",\n\t    \"140521\": \"沁水县\",\n\t    \"140522\": \"阳城县\",\n\t    \"140524\": \"陵川县\",\n\t    \"140525\": \"泽州县\",\n\t    \"140581\": \"高平市\",\n\t    \"140582\": \"其它区\",\n\t    \"140600\": \"朔州市\",\n\t    \"140602\": \"朔城区\",\n\t    \"140603\": \"平鲁区\",\n\t    \"140621\": \"山阴县\",\n\t    \"140622\": \"应县\",\n\t    \"140623\": \"右玉县\",\n\t    \"140624\": \"怀仁县\",\n\t    \"140625\": \"其它区\",\n\t    \"140700\": \"晋中市\",\n\t    \"140702\": \"榆次区\",\n\t    \"140721\": \"榆社县\",\n\t    \"140722\": \"左权县\",\n\t    \"140723\": \"和顺县\",\n\t    \"140724\": \"昔阳县\",\n\t    \"140725\": \"寿阳县\",\n\t    \"140726\": \"太谷县\",\n\t    \"140727\": \"祁县\",\n\t    \"140728\": \"平遥县\",\n\t    \"140729\": \"灵石县\",\n\t    \"140781\": \"介休市\",\n\t    \"140782\": \"其它区\",\n\t    \"140800\": \"运城市\",\n\t    \"140802\": \"盐湖区\",\n\t    \"140821\": \"临猗县\",\n\t    \"140822\": \"万荣县\",\n\t    \"140823\": \"闻喜县\",\n\t    \"140824\": \"稷山县\",\n\t    \"140825\": \"新绛县\",\n\t    \"140826\": \"绛县\",\n\t    \"140827\": \"垣曲县\",\n\t    \"140828\": \"夏县\",\n\t    \"140829\": \"平陆县\",\n\t    \"140830\": \"芮城县\",\n\t    \"140881\": \"永济市\",\n\t    \"140882\": \"河津市\",\n\t    \"140883\": \"其它区\",\n\t    \"140900\": \"忻州市\",\n\t    \"140902\": \"忻府区\",\n\t    \"140921\": \"定襄县\",\n\t    \"140922\": \"五台县\",\n\t    \"140923\": \"代县\",\n\t    \"140924\": \"繁峙县\",\n\t    \"140925\": \"宁武县\",\n\t    \"140926\": \"静乐县\",\n\t    \"140927\": \"神池县\",\n\t    \"140928\": \"五寨县\",\n\t    \"140929\": \"岢岚县\",\n\t    \"140930\": \"河曲县\",\n\t    \"140931\": \"保德县\",\n\t    \"140932\": \"偏关县\",\n\t    \"140981\": \"原平市\",\n\t    \"140982\": \"其它区\",\n\t    \"141000\": \"临汾市\",\n\t    \"141002\": \"尧都区\",\n\t    \"141021\": \"曲沃县\",\n\t    \"141022\": \"翼城县\",\n\t    \"141023\": \"襄汾县\",\n\t    \"141024\": \"洪洞县\",\n\t    \"141025\": \"古县\",\n\t    \"141026\": \"安泽县\",\n\t    \"141027\": \"浮山县\",\n\t    \"141028\": \"吉县\",\n\t    \"141029\": \"乡宁县\",\n\t    \"141030\": \"大宁县\",\n\t    \"141031\": \"隰县\",\n\t    \"141032\": \"永和县\",\n\t    \"141033\": \"蒲县\",\n\t    \"141034\": \"汾西县\",\n\t    \"141081\": \"侯马市\",\n\t    \"141082\": \"霍州市\",\n\t    \"141083\": \"其它区\",\n\t    \"141100\": \"吕梁市\",\n\t    \"141102\": \"离石区\",\n\t    \"141121\": \"文水县\",\n\t    \"141122\": \"交城县\",\n\t    \"141123\": \"兴县\",\n\t    \"141124\": \"临县\",\n\t    \"141125\": \"柳林县\",\n\t    \"141126\": \"石楼县\",\n\t    \"141127\": \"岚县\",\n\t    \"141128\": \"方山县\",\n\t    \"141129\": \"中阳县\",\n\t    \"141130\": \"交口县\",\n\t    \"141181\": \"孝义市\",\n\t    \"141182\": \"汾阳市\",\n\t    \"141183\": \"其它区\",\n\t    \"150000\": \"内蒙古自治区\",\n\t    \"150100\": \"呼和浩特市\",\n\t    \"150102\": \"新城区\",\n\t    \"150103\": \"回民区\",\n\t    \"150104\": \"玉泉区\",\n\t    \"150105\": \"赛罕区\",\n\t    \"150121\": \"土默特左旗\",\n\t    \"150122\": \"托克托县\",\n\t    \"150123\": \"和林格尔县\",\n\t    \"150124\": \"清水河县\",\n\t    \"150125\": \"武川县\",\n\t    \"150126\": \"其它区\",\n\t    \"150200\": \"包头市\",\n\t    \"150202\": \"东河区\",\n\t    \"150203\": \"昆都仑区\",\n\t    \"150204\": \"青山区\",\n\t    \"150205\": \"石拐区\",\n\t    \"150206\": \"白云鄂博矿区\",\n\t    \"150207\": \"九原区\",\n\t    \"150221\": \"土默特右旗\",\n\t    \"150222\": \"固阳县\",\n\t    \"150223\": \"达尔罕茂明安联合旗\",\n\t    \"150224\": \"其它区\",\n\t    \"150300\": \"乌海市\",\n\t    \"150302\": \"海勃湾区\",\n\t    \"150303\": \"海南区\",\n\t    \"150304\": \"乌达区\",\n\t    \"150305\": \"其它区\",\n\t    \"150400\": \"赤峰市\",\n\t    \"150402\": \"红山区\",\n\t    \"150403\": \"元宝山区\",\n\t    \"150404\": \"松山区\",\n\t    \"150421\": \"阿鲁科尔沁旗\",\n\t    \"150422\": \"巴林左旗\",\n\t    \"150423\": \"巴林右旗\",\n\t    \"150424\": \"林西县\",\n\t    \"150425\": \"克什克腾旗\",\n\t    \"150426\": \"翁牛特旗\",\n\t    \"150428\": \"喀喇沁旗\",\n\t    \"150429\": \"宁城县\",\n\t    \"150430\": \"敖汉旗\",\n\t    \"150431\": \"其它区\",\n\t    \"150500\": \"通辽市\",\n\t    \"150502\": \"科尔沁区\",\n\t    \"150521\": \"科尔沁左翼中旗\",\n\t    \"150522\": \"科尔沁左翼后旗\",\n\t    \"150523\": \"开鲁县\",\n\t    \"150524\": \"库伦旗\",\n\t    \"150525\": \"奈曼旗\",\n\t    \"150526\": \"扎鲁特旗\",\n\t    \"150581\": \"霍林郭勒市\",\n\t    \"150582\": \"其它区\",\n\t    \"150600\": \"鄂尔多斯市\",\n\t    \"150602\": \"东胜区\",\n\t    \"150621\": \"达拉特旗\",\n\t    \"150622\": \"准格尔旗\",\n\t    \"150623\": \"鄂托克前旗\",\n\t    \"150624\": \"鄂托克旗\",\n\t    \"150625\": \"杭锦旗\",\n\t    \"150626\": \"乌审旗\",\n\t    \"150627\": \"伊金霍洛旗\",\n\t    \"150628\": \"其它区\",\n\t    \"150700\": \"呼伦贝尔市\",\n\t    \"150702\": \"海拉尔区\",\n\t    \"150703\": \"扎赉诺尔区\",\n\t    \"150721\": \"阿荣旗\",\n\t    \"150722\": \"莫力达瓦达斡尔族自治旗\",\n\t    \"150723\": \"鄂伦春自治旗\",\n\t    \"150724\": \"鄂温克族自治旗\",\n\t    \"150725\": \"陈巴尔虎旗\",\n\t    \"150726\": \"新巴尔虎左旗\",\n\t    \"150727\": \"新巴尔虎右旗\",\n\t    \"150781\": \"满洲里市\",\n\t    \"150782\": \"牙克石市\",\n\t    \"150783\": \"扎兰屯市\",\n\t    \"150784\": \"额尔古纳市\",\n\t    \"150785\": \"根河市\",\n\t    \"150786\": \"其它区\",\n\t    \"150800\": \"巴彦淖尔市\",\n\t    \"150802\": \"临河区\",\n\t    \"150821\": \"五原县\",\n\t    \"150822\": \"磴口县\",\n\t    \"150823\": \"乌拉特前旗\",\n\t    \"150824\": \"乌拉特中旗\",\n\t    \"150825\": \"乌拉特后旗\",\n\t    \"150826\": \"杭锦后旗\",\n\t    \"150827\": \"其它区\",\n\t    \"150900\": \"乌兰察布市\",\n\t    \"150902\": \"集宁区\",\n\t    \"150921\": \"卓资县\",\n\t    \"150922\": \"化德县\",\n\t    \"150923\": \"商都县\",\n\t    \"150924\": \"兴和县\",\n\t    \"150925\": \"凉城县\",\n\t    \"150926\": \"察哈尔右翼前旗\",\n\t    \"150927\": \"察哈尔右翼中旗\",\n\t    \"150928\": \"察哈尔右翼后旗\",\n\t    \"150929\": \"四子王旗\",\n\t    \"150981\": \"丰镇市\",\n\t    \"150982\": \"其它区\",\n\t    \"152200\": \"兴安盟\",\n\t    \"152201\": \"乌兰浩特市\",\n\t    \"152202\": \"阿尔山市\",\n\t    \"152221\": \"科尔沁右翼前旗\",\n\t    \"152222\": \"科尔沁右翼中旗\",\n\t    \"152223\": \"扎赉特旗\",\n\t    \"152224\": \"突泉县\",\n\t    \"152225\": \"其它区\",\n\t    \"152500\": \"锡林郭勒盟\",\n\t    \"152501\": \"二连浩特市\",\n\t    \"152502\": \"锡林浩特市\",\n\t    \"152522\": \"阿巴嘎旗\",\n\t    \"152523\": \"苏尼特左旗\",\n\t    \"152524\": \"苏尼特右旗\",\n\t    \"152525\": \"东乌珠穆沁旗\",\n\t    \"152526\": \"西乌珠穆沁旗\",\n\t    \"152527\": \"太仆寺旗\",\n\t    \"152528\": \"镶黄旗\",\n\t    \"152529\": \"正镶白旗\",\n\t    \"152530\": \"正蓝旗\",\n\t    \"152531\": \"多伦县\",\n\t    \"152532\": \"其它区\",\n\t    \"152900\": \"阿拉善盟\",\n\t    \"152921\": \"阿拉善左旗\",\n\t    \"152922\": \"阿拉善右旗\",\n\t    \"152923\": \"额济纳旗\",\n\t    \"152924\": \"其它区\",\n\t    \"210000\": \"辽宁省\",\n\t    \"210100\": \"沈阳市\",\n\t    \"210102\": \"和平区\",\n\t    \"210103\": \"沈河区\",\n\t    \"210104\": \"大东区\",\n\t    \"210105\": \"皇姑区\",\n\t    \"210106\": \"铁西区\",\n\t    \"210111\": \"苏家屯区\",\n\t    \"210112\": \"东陵区\",\n\t    \"210113\": \"新城子区\",\n\t    \"210114\": \"于洪区\",\n\t    \"210122\": \"辽中县\",\n\t    \"210123\": \"康平县\",\n\t    \"210124\": \"法库县\",\n\t    \"210181\": \"新民市\",\n\t    \"210184\": \"沈北新区\",\n\t    \"210185\": \"其它区\",\n\t    \"210200\": \"大连市\",\n\t    \"210202\": \"中山区\",\n\t    \"210203\": \"西岗区\",\n\t    \"210204\": \"沙河口区\",\n\t    \"210211\": \"甘井子区\",\n\t    \"210212\": \"旅顺口区\",\n\t    \"210213\": \"金州区\",\n\t    \"210224\": \"长海县\",\n\t    \"210281\": \"瓦房店市\",\n\t    \"210282\": \"普兰店市\",\n\t    \"210283\": \"庄河市\",\n\t    \"210298\": \"其它区\",\n\t    \"210300\": \"鞍山市\",\n\t    \"210302\": \"铁东区\",\n\t    \"210303\": \"铁西区\",\n\t    \"210304\": \"立山区\",\n\t    \"210311\": \"千山区\",\n\t    \"210321\": \"台安县\",\n\t    \"210323\": \"岫岩满族自治县\",\n\t    \"210381\": \"海城市\",\n\t    \"210382\": \"其它区\",\n\t    \"210400\": \"抚顺市\",\n\t    \"210402\": \"新抚区\",\n\t    \"210403\": \"东洲区\",\n\t    \"210404\": \"望花区\",\n\t    \"210411\": \"顺城区\",\n\t    \"210421\": \"抚顺县\",\n\t    \"210422\": \"新宾满族自治县\",\n\t    \"210423\": \"清原满族自治县\",\n\t    \"210424\": \"其它区\",\n\t    \"210500\": \"本溪市\",\n\t    \"210502\": \"平山区\",\n\t    \"210503\": \"溪湖区\",\n\t    \"210504\": \"明山区\",\n\t    \"210505\": \"南芬区\",\n\t    \"210521\": \"本溪满族自治县\",\n\t    \"210522\": \"桓仁满族自治县\",\n\t    \"210523\": \"其它区\",\n\t    \"210600\": \"丹东市\",\n\t    \"210602\": \"元宝区\",\n\t    \"210603\": \"振兴区\",\n\t    \"210604\": \"振安区\",\n\t    \"210624\": \"宽甸满族自治县\",\n\t    \"210681\": \"东港市\",\n\t    \"210682\": \"凤城市\",\n\t    \"210683\": \"其它区\",\n\t    \"210700\": \"锦州市\",\n\t    \"210702\": \"古塔区\",\n\t    \"210703\": \"凌河区\",\n\t    \"210711\": \"太和区\",\n\t    \"210726\": \"黑山县\",\n\t    \"210727\": \"义县\",\n\t    \"210781\": \"凌海市\",\n\t    \"210782\": \"北镇市\",\n\t    \"210783\": \"其它区\",\n\t    \"210800\": \"营口市\",\n\t    \"210802\": \"站前区\",\n\t    \"210803\": \"西市区\",\n\t    \"210804\": \"鲅鱼圈区\",\n\t    \"210811\": \"老边区\",\n\t    \"210881\": \"盖州市\",\n\t    \"210882\": \"大石桥市\",\n\t    \"210883\": \"其它区\",\n\t    \"210900\": \"阜新市\",\n\t    \"210902\": \"海州区\",\n\t    \"210903\": \"新邱区\",\n\t    \"210904\": \"太平区\",\n\t    \"210905\": \"清河门区\",\n\t    \"210911\": \"细河区\",\n\t    \"210921\": \"阜新蒙古族自治县\",\n\t    \"210922\": \"彰武县\",\n\t    \"210923\": \"其它区\",\n\t    \"211000\": \"辽阳市\",\n\t    \"211002\": \"白塔区\",\n\t    \"211003\": \"文圣区\",\n\t    \"211004\": \"宏伟区\",\n\t    \"211005\": \"弓长岭区\",\n\t    \"211011\": \"太子河区\",\n\t    \"211021\": \"辽阳县\",\n\t    \"211081\": \"灯塔市\",\n\t    \"211082\": \"其它区\",\n\t    \"211100\": \"盘锦市\",\n\t    \"211102\": \"双台子区\",\n\t    \"211103\": \"兴隆台区\",\n\t    \"211121\": \"大洼县\",\n\t    \"211122\": \"盘山县\",\n\t    \"211123\": \"其它区\",\n\t    \"211200\": \"铁岭市\",\n\t    \"211202\": \"银州区\",\n\t    \"211204\": \"清河区\",\n\t    \"211221\": \"铁岭县\",\n\t    \"211223\": \"西丰县\",\n\t    \"211224\": \"昌图县\",\n\t    \"211281\": \"调兵山市\",\n\t    \"211282\": \"开原市\",\n\t    \"211283\": \"其它区\",\n\t    \"211300\": \"朝阳市\",\n\t    \"211302\": \"双塔区\",\n\t    \"211303\": \"龙城区\",\n\t    \"211321\": \"朝阳县\",\n\t    \"211322\": \"建平县\",\n\t    \"211324\": \"喀喇沁左翼蒙古族自治县\",\n\t    \"211381\": \"北票市\",\n\t    \"211382\": \"凌源市\",\n\t    \"211383\": \"其它区\",\n\t    \"211400\": \"葫芦岛市\",\n\t    \"211402\": \"连山区\",\n\t    \"211403\": \"龙港区\",\n\t    \"211404\": \"南票区\",\n\t    \"211421\": \"绥中县\",\n\t    \"211422\": \"建昌县\",\n\t    \"211481\": \"兴城市\",\n\t    \"211482\": \"其它区\",\n\t    \"220000\": \"吉林省\",\n\t    \"220100\": \"长春市\",\n\t    \"220102\": \"南关区\",\n\t    \"220103\": \"宽城区\",\n\t    \"220104\": \"朝阳区\",\n\t    \"220105\": \"二道区\",\n\t    \"220106\": \"绿园区\",\n\t    \"220112\": \"双阳区\",\n\t    \"220122\": \"农安县\",\n\t    \"220181\": \"九台市\",\n\t    \"220182\": \"榆树市\",\n\t    \"220183\": \"德惠市\",\n\t    \"220188\": \"其它区\",\n\t    \"220200\": \"吉林市\",\n\t    \"220202\": \"昌邑区\",\n\t    \"220203\": \"龙潭区\",\n\t    \"220204\": \"船营区\",\n\t    \"220211\": \"丰满区\",\n\t    \"220221\": \"永吉县\",\n\t    \"220281\": \"蛟河市\",\n\t    \"220282\": \"桦甸市\",\n\t    \"220283\": \"舒兰市\",\n\t    \"220284\": \"磐石市\",\n\t    \"220285\": \"其它区\",\n\t    \"220300\": \"四平市\",\n\t    \"220302\": \"铁西区\",\n\t    \"220303\": \"铁东区\",\n\t    \"220322\": \"梨树县\",\n\t    \"220323\": \"伊通满族自治县\",\n\t    \"220381\": \"公主岭市\",\n\t    \"220382\": \"双辽市\",\n\t    \"220383\": \"其它区\",\n\t    \"220400\": \"辽源市\",\n\t    \"220402\": \"龙山区\",\n\t    \"220403\": \"西安区\",\n\t    \"220421\": \"东丰县\",\n\t    \"220422\": \"东辽县\",\n\t    \"220423\": \"其它区\",\n\t    \"220500\": \"通化市\",\n\t    \"220502\": \"东昌区\",\n\t    \"220503\": \"二道江区\",\n\t    \"220521\": \"通化县\",\n\t    \"220523\": \"辉南县\",\n\t    \"220524\": \"柳河县\",\n\t    \"220581\": \"梅河口市\",\n\t    \"220582\": \"集安市\",\n\t    \"220583\": \"其它区\",\n\t    \"220600\": \"白山市\",\n\t    \"220602\": \"浑江区\",\n\t    \"220621\": \"抚松县\",\n\t    \"220622\": \"靖宇县\",\n\t    \"220623\": \"长白朝鲜族自治县\",\n\t    \"220625\": \"江源区\",\n\t    \"220681\": \"临江市\",\n\t    \"220682\": \"其它区\",\n\t    \"220700\": \"松原市\",\n\t    \"220702\": \"宁江区\",\n\t    \"220721\": \"前郭尔罗斯蒙古族自治县\",\n\t    \"220722\": \"长岭县\",\n\t    \"220723\": \"乾安县\",\n\t    \"220724\": \"扶余市\",\n\t    \"220725\": \"其它区\",\n\t    \"220800\": \"白城市\",\n\t    \"220802\": \"洮北区\",\n\t    \"220821\": \"镇赉县\",\n\t    \"220822\": \"通榆县\",\n\t    \"220881\": \"洮南市\",\n\t    \"220882\": \"大安市\",\n\t    \"220883\": \"其它区\",\n\t    \"222400\": \"延边朝鲜族自治州\",\n\t    \"222401\": \"延吉市\",\n\t    \"222402\": \"图们市\",\n\t    \"222403\": \"敦化市\",\n\t    \"222404\": \"珲春市\",\n\t    \"222405\": \"龙井市\",\n\t    \"222406\": \"和龙市\",\n\t    \"222424\": \"汪清县\",\n\t    \"222426\": \"安图县\",\n\t    \"222427\": \"其它区\",\n\t    \"230000\": \"黑龙江省\",\n\t    \"230100\": \"哈尔滨市\",\n\t    \"230102\": \"道里区\",\n\t    \"230103\": \"南岗区\",\n\t    \"230104\": \"道外区\",\n\t    \"230106\": \"香坊区\",\n\t    \"230108\": \"平房区\",\n\t    \"230109\": \"松北区\",\n\t    \"230111\": \"呼兰区\",\n\t    \"230123\": \"依兰县\",\n\t    \"230124\": \"方正县\",\n\t    \"230125\": \"宾县\",\n\t    \"230126\": \"巴彦县\",\n\t    \"230127\": \"木兰县\",\n\t    \"230128\": \"通河县\",\n\t    \"230129\": \"延寿县\",\n\t    \"230181\": \"阿城区\",\n\t    \"230182\": \"双城市\",\n\t    \"230183\": \"尚志市\",\n\t    \"230184\": \"五常市\",\n\t    \"230186\": \"其它区\",\n\t    \"230200\": \"齐齐哈尔市\",\n\t    \"230202\": \"龙沙区\",\n\t    \"230203\": \"建华区\",\n\t    \"230204\": \"铁锋区\",\n\t    \"230205\": \"昂昂溪区\",\n\t    \"230206\": \"富拉尔基区\",\n\t    \"230207\": \"碾子山区\",\n\t    \"230208\": \"梅里斯达斡尔族区\",\n\t    \"230221\": \"龙江县\",\n\t    \"230223\": \"依安县\",\n\t    \"230224\": \"泰来县\",\n\t    \"230225\": \"甘南县\",\n\t    \"230227\": \"富裕县\",\n\t    \"230229\": \"克山县\",\n\t    \"230230\": \"克东县\",\n\t    \"230231\": \"拜泉县\",\n\t    \"230281\": \"讷河市\",\n\t    \"230282\": \"其它区\",\n\t    \"230300\": \"鸡西市\",\n\t    \"230302\": \"鸡冠区\",\n\t    \"230303\": \"恒山区\",\n\t    \"230304\": \"滴道区\",\n\t    \"230305\": \"梨树区\",\n\t    \"230306\": \"城子河区\",\n\t    \"230307\": \"麻山区\",\n\t    \"230321\": \"鸡东县\",\n\t    \"230381\": \"虎林市\",\n\t    \"230382\": \"密山市\",\n\t    \"230383\": \"其它区\",\n\t    \"230400\": \"鹤岗市\",\n\t    \"230402\": \"向阳区\",\n\t    \"230403\": \"工农区\",\n\t    \"230404\": \"南山区\",\n\t    \"230405\": \"兴安区\",\n\t    \"230406\": \"东山区\",\n\t    \"230407\": \"兴山区\",\n\t    \"230421\": \"萝北县\",\n\t    \"230422\": \"绥滨县\",\n\t    \"230423\": \"其它区\",\n\t    \"230500\": \"双鸭山市\",\n\t    \"230502\": \"尖山区\",\n\t    \"230503\": \"岭东区\",\n\t    \"230505\": \"四方台区\",\n\t    \"230506\": \"宝山区\",\n\t    \"230521\": \"集贤县\",\n\t    \"230522\": \"友谊县\",\n\t    \"230523\": \"宝清县\",\n\t    \"230524\": \"饶河县\",\n\t    \"230525\": \"其它区\",\n\t    \"230600\": \"大庆市\",\n\t    \"230602\": \"萨尔图区\",\n\t    \"230603\": \"龙凤区\",\n\t    \"230604\": \"让胡路区\",\n\t    \"230605\": \"红岗区\",\n\t    \"230606\": \"大同区\",\n\t    \"230621\": \"肇州县\",\n\t    \"230622\": \"肇源县\",\n\t    \"230623\": \"林甸县\",\n\t    \"230624\": \"杜尔伯特蒙古族自治县\",\n\t    \"230625\": \"其它区\",\n\t    \"230700\": \"伊春市\",\n\t    \"230702\": \"伊春区\",\n\t    \"230703\": \"南岔区\",\n\t    \"230704\": \"友好区\",\n\t    \"230705\": \"西林区\",\n\t    \"230706\": \"翠峦区\",\n\t    \"230707\": \"新青区\",\n\t    \"230708\": \"美溪区\",\n\t    \"230709\": \"金山屯区\",\n\t    \"230710\": \"五营区\",\n\t    \"230711\": \"乌马河区\",\n\t    \"230712\": \"汤旺河区\",\n\t    \"230713\": \"带岭区\",\n\t    \"230714\": \"乌伊岭区\",\n\t    \"230715\": \"红星区\",\n\t    \"230716\": \"上甘岭区\",\n\t    \"230722\": \"嘉荫县\",\n\t    \"230781\": \"铁力市\",\n\t    \"230782\": \"其它区\",\n\t    \"230800\": \"佳木斯市\",\n\t    \"230803\": \"向阳区\",\n\t    \"230804\": \"前进区\",\n\t    \"230805\": \"东风区\",\n\t    \"230811\": \"郊区\",\n\t    \"230822\": \"桦南县\",\n\t    \"230826\": \"桦川县\",\n\t    \"230828\": \"汤原县\",\n\t    \"230833\": \"抚远县\",\n\t    \"230881\": \"同江市\",\n\t    \"230882\": \"富锦市\",\n\t    \"230883\": \"其它区\",\n\t    \"230900\": \"七台河市\",\n\t    \"230902\": \"新兴区\",\n\t    \"230903\": \"桃山区\",\n\t    \"230904\": \"茄子河区\",\n\t    \"230921\": \"勃利县\",\n\t    \"230922\": \"其它区\",\n\t    \"231000\": \"牡丹江市\",\n\t    \"231002\": \"东安区\",\n\t    \"231003\": \"阳明区\",\n\t    \"231004\": \"爱民区\",\n\t    \"231005\": \"西安区\",\n\t    \"231024\": \"东宁县\",\n\t    \"231025\": \"林口县\",\n\t    \"231081\": \"绥芬河市\",\n\t    \"231083\": \"海林市\",\n\t    \"231084\": \"宁安市\",\n\t    \"231085\": \"穆棱市\",\n\t    \"231086\": \"其它区\",\n\t    \"231100\": \"黑河市\",\n\t    \"231102\": \"爱辉区\",\n\t    \"231121\": \"嫩江县\",\n\t    \"231123\": \"逊克县\",\n\t    \"231124\": \"孙吴县\",\n\t    \"231181\": \"北安市\",\n\t    \"231182\": \"五大连池市\",\n\t    \"231183\": \"其它区\",\n\t    \"231200\": \"绥化市\",\n\t    \"231202\": \"北林区\",\n\t    \"231221\": \"望奎县\",\n\t    \"231222\": \"兰西县\",\n\t    \"231223\": \"青冈县\",\n\t    \"231224\": \"庆安县\",\n\t    \"231225\": \"明水县\",\n\t    \"231226\": \"绥棱县\",\n\t    \"231281\": \"安达市\",\n\t    \"231282\": \"肇东市\",\n\t    \"231283\": \"海伦市\",\n\t    \"231284\": \"其它区\",\n\t    \"232700\": \"大兴安岭地区\",\n\t    \"232702\": \"松岭区\",\n\t    \"232703\": \"新林区\",\n\t    \"232704\": \"呼中区\",\n\t    \"232721\": \"呼玛县\",\n\t    \"232722\": \"塔河县\",\n\t    \"232723\": \"漠河县\",\n\t    \"232724\": \"加格达奇区\",\n\t    \"232725\": \"其它区\",\n\t    \"310000\": \"上海\",\n\t    \"310100\": \"上海市\",\n\t    \"310101\": \"黄浦区\",\n\t    \"310104\": \"徐汇区\",\n\t    \"310105\": \"长宁区\",\n\t    \"310106\": \"静安区\",\n\t    \"310107\": \"普陀区\",\n\t    \"310108\": \"闸北区\",\n\t    \"310109\": \"虹口区\",\n\t    \"310110\": \"杨浦区\",\n\t    \"310112\": \"闵行区\",\n\t    \"310113\": \"宝山区\",\n\t    \"310114\": \"嘉定区\",\n\t    \"310115\": \"浦东新区\",\n\t    \"310116\": \"金山区\",\n\t    \"310117\": \"松江区\",\n\t    \"310118\": \"青浦区\",\n\t    \"310120\": \"奉贤区\",\n\t    \"310230\": \"崇明县\",\n\t    \"310231\": \"其它区\",\n\t    \"320000\": \"江苏省\",\n\t    \"320100\": \"南京市\",\n\t    \"320102\": \"玄武区\",\n\t    \"320104\": \"秦淮区\",\n\t    \"320105\": \"建邺区\",\n\t    \"320106\": \"鼓楼区\",\n\t    \"320111\": \"浦口区\",\n\t    \"320113\": \"栖霞区\",\n\t    \"320114\": \"雨花台区\",\n\t    \"320115\": \"江宁区\",\n\t    \"320116\": \"六合区\",\n\t    \"320124\": \"溧水区\",\n\t    \"320125\": \"高淳区\",\n\t    \"320126\": \"其它区\",\n\t    \"320200\": \"无锡市\",\n\t    \"320202\": \"崇安区\",\n\t    \"320203\": \"南长区\",\n\t    \"320204\": \"北塘区\",\n\t    \"320205\": \"锡山区\",\n\t    \"320206\": \"惠山区\",\n\t    \"320211\": \"滨湖区\",\n\t    \"320281\": \"江阴市\",\n\t    \"320282\": \"宜兴市\",\n\t    \"320297\": \"其它区\",\n\t    \"320300\": \"徐州市\",\n\t    \"320302\": \"鼓楼区\",\n\t    \"320303\": \"云龙区\",\n\t    \"320305\": \"贾汪区\",\n\t    \"320311\": \"泉山区\",\n\t    \"320321\": \"丰县\",\n\t    \"320322\": \"沛县\",\n\t    \"320323\": \"铜山区\",\n\t    \"320324\": \"睢宁县\",\n\t    \"320381\": \"新沂市\",\n\t    \"320382\": \"邳州市\",\n\t    \"320383\": \"其它区\",\n\t    \"320400\": \"常州市\",\n\t    \"320402\": \"天宁区\",\n\t    \"320404\": \"钟楼区\",\n\t    \"320405\": \"戚墅堰区\",\n\t    \"320411\": \"新北区\",\n\t    \"320412\": \"武进区\",\n\t    \"320481\": \"溧阳市\",\n\t    \"320482\": \"金坛市\",\n\t    \"320483\": \"其它区\",\n\t    \"320500\": \"苏州市\",\n\t    \"320505\": \"虎丘区\",\n\t    \"320506\": \"吴中区\",\n\t    \"320507\": \"相城区\",\n\t    \"320508\": \"姑苏区\",\n\t    \"320581\": \"常熟市\",\n\t    \"320582\": \"张家港市\",\n\t    \"320583\": \"昆山市\",\n\t    \"320584\": \"吴江区\",\n\t    \"320585\": \"太仓市\",\n\t    \"320596\": \"其它区\",\n\t    \"320600\": \"南通市\",\n\t    \"320602\": \"崇川区\",\n\t    \"320611\": \"港闸区\",\n\t    \"320612\": \"通州区\",\n\t    \"320621\": \"海安县\",\n\t    \"320623\": \"如东县\",\n\t    \"320681\": \"启东市\",\n\t    \"320682\": \"如皋市\",\n\t    \"320684\": \"海门市\",\n\t    \"320694\": \"其它区\",\n\t    \"320700\": \"连云港市\",\n\t    \"320703\": \"连云区\",\n\t    \"320705\": \"新浦区\",\n\t    \"320706\": \"海州区\",\n\t    \"320721\": \"赣榆县\",\n\t    \"320722\": \"东海县\",\n\t    \"320723\": \"灌云县\",\n\t    \"320724\": \"灌南县\",\n\t    \"320725\": \"其它区\",\n\t    \"320800\": \"淮安市\",\n\t    \"320802\": \"清河区\",\n\t    \"320803\": \"淮安区\",\n\t    \"320804\": \"淮阴区\",\n\t    \"320811\": \"清浦区\",\n\t    \"320826\": \"涟水县\",\n\t    \"320829\": \"洪泽县\",\n\t    \"320830\": \"盱眙县\",\n\t    \"320831\": \"金湖县\",\n\t    \"320832\": \"其它区\",\n\t    \"320900\": \"盐城市\",\n\t    \"320902\": \"亭湖区\",\n\t    \"320903\": \"盐都区\",\n\t    \"320921\": \"响水县\",\n\t    \"320922\": \"滨海县\",\n\t    \"320923\": \"阜宁县\",\n\t    \"320924\": \"射阳县\",\n\t    \"320925\": \"建湖县\",\n\t    \"320981\": \"东台市\",\n\t    \"320982\": \"大丰市\",\n\t    \"320983\": \"其它区\",\n\t    \"321000\": \"扬州市\",\n\t    \"321002\": \"广陵区\",\n\t    \"321003\": \"邗江区\",\n\t    \"321023\": \"宝应县\",\n\t    \"321081\": \"仪征市\",\n\t    \"321084\": \"高邮市\",\n\t    \"321088\": \"江都区\",\n\t    \"321093\": \"其它区\",\n\t    \"321100\": \"镇江市\",\n\t    \"321102\": \"京口区\",\n\t    \"321111\": \"润州区\",\n\t    \"321112\": \"丹徒区\",\n\t    \"321181\": \"丹阳市\",\n\t    \"321182\": \"扬中市\",\n\t    \"321183\": \"句容市\",\n\t    \"321184\": \"其它区\",\n\t    \"321200\": \"泰州市\",\n\t    \"321202\": \"海陵区\",\n\t    \"321203\": \"高港区\",\n\t    \"321281\": \"兴化市\",\n\t    \"321282\": \"靖江市\",\n\t    \"321283\": \"泰兴市\",\n\t    \"321284\": \"姜堰区\",\n\t    \"321285\": \"其它区\",\n\t    \"321300\": \"宿迁市\",\n\t    \"321302\": \"宿城区\",\n\t    \"321311\": \"宿豫区\",\n\t    \"321322\": \"沭阳县\",\n\t    \"321323\": \"泗阳县\",\n\t    \"321324\": \"泗洪县\",\n\t    \"321325\": \"其它区\",\n\t    \"330000\": \"浙江省\",\n\t    \"330100\": \"杭州市\",\n\t    \"330102\": \"上城区\",\n\t    \"330103\": \"下城区\",\n\t    \"330104\": \"江干区\",\n\t    \"330105\": \"拱墅区\",\n\t    \"330106\": \"西湖区\",\n\t    \"330108\": \"滨江区\",\n\t    \"330109\": \"萧山区\",\n\t    \"330110\": \"余杭区\",\n\t    \"330122\": \"桐庐县\",\n\t    \"330127\": \"淳安县\",\n\t    \"330182\": \"建德市\",\n\t    \"330183\": \"富阳市\",\n\t    \"330185\": \"临安市\",\n\t    \"330186\": \"其它区\",\n\t    \"330200\": \"宁波市\",\n\t    \"330203\": \"海曙区\",\n\t    \"330204\": \"江东区\",\n\t    \"330205\": \"江北区\",\n\t    \"330206\": \"北仑区\",\n\t    \"330211\": \"镇海区\",\n\t    \"330212\": \"鄞州区\",\n\t    \"330225\": \"象山县\",\n\t    \"330226\": \"宁海县\",\n\t    \"330281\": \"余姚市\",\n\t    \"330282\": \"慈溪市\",\n\t    \"330283\": \"奉化市\",\n\t    \"330284\": \"其它区\",\n\t    \"330300\": \"温州市\",\n\t    \"330302\": \"鹿城区\",\n\t    \"330303\": \"龙湾区\",\n\t    \"330304\": \"瓯海区\",\n\t    \"330322\": \"洞头县\",\n\t    \"330324\": \"永嘉县\",\n\t    \"330326\": \"平阳县\",\n\t    \"330327\": \"苍南县\",\n\t    \"330328\": \"文成县\",\n\t    \"330329\": \"泰顺县\",\n\t    \"330381\": \"瑞安市\",\n\t    \"330382\": \"乐清市\",\n\t    \"330383\": \"其它区\",\n\t    \"330400\": \"嘉兴市\",\n\t    \"330402\": \"南湖区\",\n\t    \"330411\": \"秀洲区\",\n\t    \"330421\": \"嘉善县\",\n\t    \"330424\": \"海盐县\",\n\t    \"330481\": \"海宁市\",\n\t    \"330482\": \"平湖市\",\n\t    \"330483\": \"桐乡市\",\n\t    \"330484\": \"其它区\",\n\t    \"330500\": \"湖州市\",\n\t    \"330502\": \"吴兴区\",\n\t    \"330503\": \"南浔区\",\n\t    \"330521\": \"德清县\",\n\t    \"330522\": \"长兴县\",\n\t    \"330523\": \"安吉县\",\n\t    \"330524\": \"其它区\",\n\t    \"330600\": \"绍兴市\",\n\t    \"330602\": \"越城区\",\n\t    \"330621\": \"绍兴县\",\n\t    \"330624\": \"新昌县\",\n\t    \"330681\": \"诸暨市\",\n\t    \"330682\": \"上虞市\",\n\t    \"330683\": \"嵊州市\",\n\t    \"330684\": \"其它区\",\n\t    \"330700\": \"金华市\",\n\t    \"330702\": \"婺城区\",\n\t    \"330703\": \"金东区\",\n\t    \"330723\": \"武义县\",\n\t    \"330726\": \"浦江县\",\n\t    \"330727\": \"磐安县\",\n\t    \"330781\": \"兰溪市\",\n\t    \"330782\": \"义乌市\",\n\t    \"330783\": \"东阳市\",\n\t    \"330784\": \"永康市\",\n\t    \"330785\": \"其它区\",\n\t    \"330800\": \"衢州市\",\n\t    \"330802\": \"柯城区\",\n\t    \"330803\": \"衢江区\",\n\t    \"330822\": \"常山县\",\n\t    \"330824\": \"开化县\",\n\t    \"330825\": \"龙游县\",\n\t    \"330881\": \"江山市\",\n\t    \"330882\": \"其它区\",\n\t    \"330900\": \"舟山市\",\n\t    \"330902\": \"定海区\",\n\t    \"330903\": \"普陀区\",\n\t    \"330921\": \"岱山县\",\n\t    \"330922\": \"嵊泗县\",\n\t    \"330923\": \"其它区\",\n\t    \"331000\": \"台州市\",\n\t    \"331002\": \"椒江区\",\n\t    \"331003\": \"黄岩区\",\n\t    \"331004\": \"路桥区\",\n\t    \"331021\": \"玉环县\",\n\t    \"331022\": \"三门县\",\n\t    \"331023\": \"天台县\",\n\t    \"331024\": \"仙居县\",\n\t    \"331081\": \"温岭市\",\n\t    \"331082\": \"临海市\",\n\t    \"331083\": \"其它区\",\n\t    \"331100\": \"丽水市\",\n\t    \"331102\": \"莲都区\",\n\t    \"331121\": \"青田县\",\n\t    \"331122\": \"缙云县\",\n\t    \"331123\": \"遂昌县\",\n\t    \"331124\": \"松阳县\",\n\t    \"331125\": \"云和县\",\n\t    \"331126\": \"庆元县\",\n\t    \"331127\": \"景宁畲族自治县\",\n\t    \"331181\": \"龙泉市\",\n\t    \"331182\": \"其它区\",\n\t    \"340000\": \"安徽省\",\n\t    \"340100\": \"合肥市\",\n\t    \"340102\": \"瑶海区\",\n\t    \"340103\": \"庐阳区\",\n\t    \"340104\": \"蜀山区\",\n\t    \"340111\": \"包河区\",\n\t    \"340121\": \"长丰县\",\n\t    \"340122\": \"肥东县\",\n\t    \"340123\": \"肥西县\",\n\t    \"340192\": \"其它区\",\n\t    \"340200\": \"芜湖市\",\n\t    \"340202\": \"镜湖区\",\n\t    \"340203\": \"弋江区\",\n\t    \"340207\": \"鸠江区\",\n\t    \"340208\": \"三山区\",\n\t    \"340221\": \"芜湖县\",\n\t    \"340222\": \"繁昌县\",\n\t    \"340223\": \"南陵县\",\n\t    \"340224\": \"其它区\",\n\t    \"340300\": \"蚌埠市\",\n\t    \"340302\": \"龙子湖区\",\n\t    \"340303\": \"蚌山区\",\n\t    \"340304\": \"禹会区\",\n\t    \"340311\": \"淮上区\",\n\t    \"340321\": \"怀远县\",\n\t    \"340322\": \"五河县\",\n\t    \"340323\": \"固镇县\",\n\t    \"340324\": \"其它区\",\n\t    \"340400\": \"淮南市\",\n\t    \"340402\": \"大通区\",\n\t    \"340403\": \"田家庵区\",\n\t    \"340404\": \"谢家集区\",\n\t    \"340405\": \"八公山区\",\n\t    \"340406\": \"潘集区\",\n\t    \"340421\": \"凤台县\",\n\t    \"340422\": \"其它区\",\n\t    \"340500\": \"马鞍山市\",\n\t    \"340503\": \"花山区\",\n\t    \"340504\": \"雨山区\",\n\t    \"340506\": \"博望区\",\n\t    \"340521\": \"当涂县\",\n\t    \"340522\": \"其它区\",\n\t    \"340600\": \"淮北市\",\n\t    \"340602\": \"杜集区\",\n\t    \"340603\": \"相山区\",\n\t    \"340604\": \"烈山区\",\n\t    \"340621\": \"濉溪县\",\n\t    \"340622\": \"其它区\",\n\t    \"340700\": \"铜陵市\",\n\t    \"340702\": \"铜官山区\",\n\t    \"340703\": \"狮子山区\",\n\t    \"340711\": \"郊区\",\n\t    \"340721\": \"铜陵县\",\n\t    \"340722\": \"其它区\",\n\t    \"340800\": \"安庆市\",\n\t    \"340802\": \"迎江区\",\n\t    \"340803\": \"大观区\",\n\t    \"340811\": \"宜秀区\",\n\t    \"340822\": \"怀宁县\",\n\t    \"340823\": \"枞阳县\",\n\t    \"340824\": \"潜山县\",\n\t    \"340825\": \"太湖县\",\n\t    \"340826\": \"宿松县\",\n\t    \"340827\": \"望江县\",\n\t    \"340828\": \"岳西县\",\n\t    \"340881\": \"桐城市\",\n\t    \"340882\": \"其它区\",\n\t    \"341000\": \"黄山市\",\n\t    \"341002\": \"屯溪区\",\n\t    \"341003\": \"黄山区\",\n\t    \"341004\": \"徽州区\",\n\t    \"341021\": \"歙县\",\n\t    \"341022\": \"休宁县\",\n\t    \"341023\": \"黟县\",\n\t    \"341024\": \"祁门县\",\n\t    \"341025\": \"其它区\",\n\t    \"341100\": \"滁州市\",\n\t    \"341102\": \"琅琊区\",\n\t    \"341103\": \"南谯区\",\n\t    \"341122\": \"来安县\",\n\t    \"341124\": \"全椒县\",\n\t    \"341125\": \"定远县\",\n\t    \"341126\": \"凤阳县\",\n\t    \"341181\": \"天长市\",\n\t    \"341182\": \"明光市\",\n\t    \"341183\": \"其它区\",\n\t    \"341200\": \"阜阳市\",\n\t    \"341202\": \"颍州区\",\n\t    \"341203\": \"颍东区\",\n\t    \"341204\": \"颍泉区\",\n\t    \"341221\": \"临泉县\",\n\t    \"341222\": \"太和县\",\n\t    \"341225\": \"阜南县\",\n\t    \"341226\": \"颍上县\",\n\t    \"341282\": \"界首市\",\n\t    \"341283\": \"其它区\",\n\t    \"341300\": \"宿州市\",\n\t    \"341302\": \"埇桥区\",\n\t    \"341321\": \"砀山县\",\n\t    \"341322\": \"萧县\",\n\t    \"341323\": \"灵璧县\",\n\t    \"341324\": \"泗县\",\n\t    \"341325\": \"其它区\",\n\t    \"341400\": \"巢湖市\",\n\t    \"341421\": \"庐江县\",\n\t    \"341422\": \"无为县\",\n\t    \"341423\": \"含山县\",\n\t    \"341424\": \"和县\",\n\t    \"341500\": \"六安市\",\n\t    \"341502\": \"金安区\",\n\t    \"341503\": \"裕安区\",\n\t    \"341521\": \"寿县\",\n\t    \"341522\": \"霍邱县\",\n\t    \"341523\": \"舒城县\",\n\t    \"341524\": \"金寨县\",\n\t    \"341525\": \"霍山县\",\n\t    \"341526\": \"其它区\",\n\t    \"341600\": \"亳州市\",\n\t    \"341602\": \"谯城区\",\n\t    \"341621\": \"涡阳县\",\n\t    \"341622\": \"蒙城县\",\n\t    \"341623\": \"利辛县\",\n\t    \"341624\": \"其它区\",\n\t    \"341700\": \"池州市\",\n\t    \"341702\": \"贵池区\",\n\t    \"341721\": \"东至县\",\n\t    \"341722\": \"石台县\",\n\t    \"341723\": \"青阳县\",\n\t    \"341724\": \"其它区\",\n\t    \"341800\": \"宣城市\",\n\t    \"341802\": \"宣州区\",\n\t    \"341821\": \"郎溪县\",\n\t    \"341822\": \"广德县\",\n\t    \"341823\": \"泾县\",\n\t    \"341824\": \"绩溪县\",\n\t    \"341825\": \"旌德县\",\n\t    \"341881\": \"宁国市\",\n\t    \"341882\": \"其它区\",\n\t    \"350000\": \"福建省\",\n\t    \"350100\": \"福州市\",\n\t    \"350102\": \"鼓楼区\",\n\t    \"350103\": \"台江区\",\n\t    \"350104\": \"仓山区\",\n\t    \"350105\": \"马尾区\",\n\t    \"350111\": \"晋安区\",\n\t    \"350121\": \"闽侯县\",\n\t    \"350122\": \"连江县\",\n\t    \"350123\": \"罗源县\",\n\t    \"350124\": \"闽清县\",\n\t    \"350125\": \"永泰县\",\n\t    \"350128\": \"平潭县\",\n\t    \"350181\": \"福清市\",\n\t    \"350182\": \"长乐市\",\n\t    \"350183\": \"其它区\",\n\t    \"350200\": \"厦门市\",\n\t    \"350203\": \"思明区\",\n\t    \"350205\": \"海沧区\",\n\t    \"350206\": \"湖里区\",\n\t    \"350211\": \"集美区\",\n\t    \"350212\": \"同安区\",\n\t    \"350213\": \"翔安区\",\n\t    \"350214\": \"其它区\",\n\t    \"350300\": \"莆田市\",\n\t    \"350302\": \"城厢区\",\n\t    \"350303\": \"涵江区\",\n\t    \"350304\": \"荔城区\",\n\t    \"350305\": \"秀屿区\",\n\t    \"350322\": \"仙游县\",\n\t    \"350323\": \"其它区\",\n\t    \"350400\": \"三明市\",\n\t    \"350402\": \"梅列区\",\n\t    \"350403\": \"三元区\",\n\t    \"350421\": \"明溪县\",\n\t    \"350423\": \"清流县\",\n\t    \"350424\": \"宁化县\",\n\t    \"350425\": \"大田县\",\n\t    \"350426\": \"尤溪县\",\n\t    \"350427\": \"沙县\",\n\t    \"350428\": \"将乐县\",\n\t    \"350429\": \"泰宁县\",\n\t    \"350430\": \"建宁县\",\n\t    \"350481\": \"永安市\",\n\t    \"350482\": \"其它区\",\n\t    \"350500\": \"泉州市\",\n\t    \"350502\": \"鲤城区\",\n\t    \"350503\": \"丰泽区\",\n\t    \"350504\": \"洛江区\",\n\t    \"350505\": \"泉港区\",\n\t    \"350521\": \"惠安县\",\n\t    \"350524\": \"安溪县\",\n\t    \"350525\": \"永春县\",\n\t    \"350526\": \"德化县\",\n\t    \"350527\": \"金门县\",\n\t    \"350581\": \"石狮市\",\n\t    \"350582\": \"晋江市\",\n\t    \"350583\": \"南安市\",\n\t    \"350584\": \"其它区\",\n\t    \"350600\": \"漳州市\",\n\t    \"350602\": \"芗城区\",\n\t    \"350603\": \"龙文区\",\n\t    \"350622\": \"云霄县\",\n\t    \"350623\": \"漳浦县\",\n\t    \"350624\": \"诏安县\",\n\t    \"350625\": \"长泰县\",\n\t    \"350626\": \"东山县\",\n\t    \"350627\": \"南靖县\",\n\t    \"350628\": \"平和县\",\n\t    \"350629\": \"华安县\",\n\t    \"350681\": \"龙海市\",\n\t    \"350682\": \"其它区\",\n\t    \"350700\": \"南平市\",\n\t    \"350702\": \"延平区\",\n\t    \"350721\": \"顺昌县\",\n\t    \"350722\": \"浦城县\",\n\t    \"350723\": \"光泽县\",\n\t    \"350724\": \"松溪县\",\n\t    \"350725\": \"政和县\",\n\t    \"350781\": \"邵武市\",\n\t    \"350782\": \"武夷山市\",\n\t    \"350783\": \"建瓯市\",\n\t    \"350784\": \"建阳市\",\n\t    \"350785\": \"其它区\",\n\t    \"350800\": \"龙岩市\",\n\t    \"350802\": \"新罗区\",\n\t    \"350821\": \"长汀县\",\n\t    \"350822\": \"永定县\",\n\t    \"350823\": \"上杭县\",\n\t    \"350824\": \"武平县\",\n\t    \"350825\": \"连城县\",\n\t    \"350881\": \"漳平市\",\n\t    \"350882\": \"其它区\",\n\t    \"350900\": \"宁德市\",\n\t    \"350902\": \"蕉城区\",\n\t    \"350921\": \"霞浦县\",\n\t    \"350922\": \"古田县\",\n\t    \"350923\": \"屏南县\",\n\t    \"350924\": \"寿宁县\",\n\t    \"350925\": \"周宁县\",\n\t    \"350926\": \"柘荣县\",\n\t    \"350981\": \"福安市\",\n\t    \"350982\": \"福鼎市\",\n\t    \"350983\": \"其它区\",\n\t    \"360000\": \"江西省\",\n\t    \"360100\": \"南昌市\",\n\t    \"360102\": \"东湖区\",\n\t    \"360103\": \"西湖区\",\n\t    \"360104\": \"青云谱区\",\n\t    \"360105\": \"湾里区\",\n\t    \"360111\": \"青山湖区\",\n\t    \"360121\": \"南昌县\",\n\t    \"360122\": \"新建县\",\n\t    \"360123\": \"安义县\",\n\t    \"360124\": \"进贤县\",\n\t    \"360128\": \"其它区\",\n\t    \"360200\": \"景德镇市\",\n\t    \"360202\": \"昌江区\",\n\t    \"360203\": \"珠山区\",\n\t    \"360222\": \"浮梁县\",\n\t    \"360281\": \"乐平市\",\n\t    \"360282\": \"其它区\",\n\t    \"360300\": \"萍乡市\",\n\t    \"360302\": \"安源区\",\n\t    \"360313\": \"湘东区\",\n\t    \"360321\": \"莲花县\",\n\t    \"360322\": \"上栗县\",\n\t    \"360323\": \"芦溪县\",\n\t    \"360324\": \"其它区\",\n\t    \"360400\": \"九江市\",\n\t    \"360402\": \"庐山区\",\n\t    \"360403\": \"浔阳区\",\n\t    \"360421\": \"九江县\",\n\t    \"360423\": \"武宁县\",\n\t    \"360424\": \"修水县\",\n\t    \"360425\": \"永修县\",\n\t    \"360426\": \"德安县\",\n\t    \"360427\": \"星子县\",\n\t    \"360428\": \"都昌县\",\n\t    \"360429\": \"湖口县\",\n\t    \"360430\": \"彭泽县\",\n\t    \"360481\": \"瑞昌市\",\n\t    \"360482\": \"其它区\",\n\t    \"360483\": \"共青城市\",\n\t    \"360500\": \"新余市\",\n\t    \"360502\": \"渝水区\",\n\t    \"360521\": \"分宜县\",\n\t    \"360522\": \"其它区\",\n\t    \"360600\": \"鹰潭市\",\n\t    \"360602\": \"月湖区\",\n\t    \"360622\": \"余江县\",\n\t    \"360681\": \"贵溪市\",\n\t    \"360682\": \"其它区\",\n\t    \"360700\": \"赣州市\",\n\t    \"360702\": \"章贡区\",\n\t    \"360721\": \"赣县\",\n\t    \"360722\": \"信丰县\",\n\t    \"360723\": \"大余县\",\n\t    \"360724\": \"上犹县\",\n\t    \"360725\": \"崇义县\",\n\t    \"360726\": \"安远县\",\n\t    \"360727\": \"龙南县\",\n\t    \"360728\": \"定南县\",\n\t    \"360729\": \"全南县\",\n\t    \"360730\": \"宁都县\",\n\t    \"360731\": \"于都县\",\n\t    \"360732\": \"兴国县\",\n\t    \"360733\": \"会昌县\",\n\t    \"360734\": \"寻乌县\",\n\t    \"360735\": \"石城县\",\n\t    \"360781\": \"瑞金市\",\n\t    \"360782\": \"南康市\",\n\t    \"360783\": \"其它区\",\n\t    \"360800\": \"吉安市\",\n\t    \"360802\": \"吉州区\",\n\t    \"360803\": \"青原区\",\n\t    \"360821\": \"吉安县\",\n\t    \"360822\": \"吉水县\",\n\t    \"360823\": \"峡江县\",\n\t    \"360824\": \"新干县\",\n\t    \"360825\": \"永丰县\",\n\t    \"360826\": \"泰和县\",\n\t    \"360827\": \"遂川县\",\n\t    \"360828\": \"万安县\",\n\t    \"360829\": \"安福县\",\n\t    \"360830\": \"永新县\",\n\t    \"360881\": \"井冈山市\",\n\t    \"360882\": \"其它区\",\n\t    \"360900\": \"宜春市\",\n\t    \"360902\": \"袁州区\",\n\t    \"360921\": \"奉新县\",\n\t    \"360922\": \"万载县\",\n\t    \"360923\": \"上高县\",\n\t    \"360924\": \"宜丰县\",\n\t    \"360925\": \"靖安县\",\n\t    \"360926\": \"铜鼓县\",\n\t    \"360981\": \"丰城市\",\n\t    \"360982\": \"樟树市\",\n\t    \"360983\": \"高安市\",\n\t    \"360984\": \"其它区\",\n\t    \"361000\": \"抚州市\",\n\t    \"361002\": \"临川区\",\n\t    \"361021\": \"南城县\",\n\t    \"361022\": \"黎川县\",\n\t    \"361023\": \"南丰县\",\n\t    \"361024\": \"崇仁县\",\n\t    \"361025\": \"乐安县\",\n\t    \"361026\": \"宜黄县\",\n\t    \"361027\": \"金溪县\",\n\t    \"361028\": \"资溪县\",\n\t    \"361029\": \"东乡县\",\n\t    \"361030\": \"广昌县\",\n\t    \"361031\": \"其它区\",\n\t    \"361100\": \"上饶市\",\n\t    \"361102\": \"信州区\",\n\t    \"361121\": \"上饶县\",\n\t    \"361122\": \"广丰县\",\n\t    \"361123\": \"玉山县\",\n\t    \"361124\": \"铅山县\",\n\t    \"361125\": \"横峰县\",\n\t    \"361126\": \"弋阳县\",\n\t    \"361127\": \"余干县\",\n\t    \"361128\": \"鄱阳县\",\n\t    \"361129\": \"万年县\",\n\t    \"361130\": \"婺源县\",\n\t    \"361181\": \"德兴市\",\n\t    \"361182\": \"其它区\",\n\t    \"370000\": \"山东省\",\n\t    \"370100\": \"济南市\",\n\t    \"370102\": \"历下区\",\n\t    \"370103\": \"市中区\",\n\t    \"370104\": \"槐荫区\",\n\t    \"370105\": \"天桥区\",\n\t    \"370112\": \"历城区\",\n\t    \"370113\": \"长清区\",\n\t    \"370124\": \"平阴县\",\n\t    \"370125\": \"济阳县\",\n\t    \"370126\": \"商河县\",\n\t    \"370181\": \"章丘市\",\n\t    \"370182\": \"其它区\",\n\t    \"370200\": \"青岛市\",\n\t    \"370202\": \"市南区\",\n\t    \"370203\": \"市北区\",\n\t    \"370211\": \"黄岛区\",\n\t    \"370212\": \"崂山区\",\n\t    \"370213\": \"李沧区\",\n\t    \"370214\": \"城阳区\",\n\t    \"370281\": \"胶州市\",\n\t    \"370282\": \"即墨市\",\n\t    \"370283\": \"平度市\",\n\t    \"370285\": \"莱西市\",\n\t    \"370286\": \"其它区\",\n\t    \"370300\": \"淄博市\",\n\t    \"370302\": \"淄川区\",\n\t    \"370303\": \"张店区\",\n\t    \"370304\": \"博山区\",\n\t    \"370305\": \"临淄区\",\n\t    \"370306\": \"周村区\",\n\t    \"370321\": \"桓台县\",\n\t    \"370322\": \"高青县\",\n\t    \"370323\": \"沂源县\",\n\t    \"370324\": \"其它区\",\n\t    \"370400\": \"枣庄市\",\n\t    \"370402\": \"市中区\",\n\t    \"370403\": \"薛城区\",\n\t    \"370404\": \"峄城区\",\n\t    \"370405\": \"台儿庄区\",\n\t    \"370406\": \"山亭区\",\n\t    \"370481\": \"滕州市\",\n\t    \"370482\": \"其它区\",\n\t    \"370500\": \"东营市\",\n\t    \"370502\": \"东营区\",\n\t    \"370503\": \"河口区\",\n\t    \"370521\": \"垦利县\",\n\t    \"370522\": \"利津县\",\n\t    \"370523\": \"广饶县\",\n\t    \"370591\": \"其它区\",\n\t    \"370600\": \"烟台市\",\n\t    \"370602\": \"芝罘区\",\n\t    \"370611\": \"福山区\",\n\t    \"370612\": \"牟平区\",\n\t    \"370613\": \"莱山区\",\n\t    \"370634\": \"长岛县\",\n\t    \"370681\": \"龙口市\",\n\t    \"370682\": \"莱阳市\",\n\t    \"370683\": \"莱州市\",\n\t    \"370684\": \"蓬莱市\",\n\t    \"370685\": \"招远市\",\n\t    \"370686\": \"栖霞市\",\n\t    \"370687\": \"海阳市\",\n\t    \"370688\": \"其它区\",\n\t    \"370700\": \"潍坊市\",\n\t    \"370702\": \"潍城区\",\n\t    \"370703\": \"寒亭区\",\n\t    \"370704\": \"坊子区\",\n\t    \"370705\": \"奎文区\",\n\t    \"370724\": \"临朐县\",\n\t    \"370725\": \"昌乐县\",\n\t    \"370781\": \"青州市\",\n\t    \"370782\": \"诸城市\",\n\t    \"370783\": \"寿光市\",\n\t    \"370784\": \"安丘市\",\n\t    \"370785\": \"高密市\",\n\t    \"370786\": \"昌邑市\",\n\t    \"370787\": \"其它区\",\n\t    \"370800\": \"济宁市\",\n\t    \"370802\": \"市中区\",\n\t    \"370811\": \"任城区\",\n\t    \"370826\": \"微山县\",\n\t    \"370827\": \"鱼台县\",\n\t    \"370828\": \"金乡县\",\n\t    \"370829\": \"嘉祥县\",\n\t    \"370830\": \"汶上县\",\n\t    \"370831\": \"泗水县\",\n\t    \"370832\": \"梁山县\",\n\t    \"370881\": \"曲阜市\",\n\t    \"370882\": \"兖州市\",\n\t    \"370883\": \"邹城市\",\n\t    \"370884\": \"其它区\",\n\t    \"370900\": \"泰安市\",\n\t    \"370902\": \"泰山区\",\n\t    \"370903\": \"岱岳区\",\n\t    \"370921\": \"宁阳县\",\n\t    \"370923\": \"东平县\",\n\t    \"370982\": \"新泰市\",\n\t    \"370983\": \"肥城市\",\n\t    \"370984\": \"其它区\",\n\t    \"371000\": \"威海市\",\n\t    \"371002\": \"环翠区\",\n\t    \"371081\": \"文登市\",\n\t    \"371082\": \"荣成市\",\n\t    \"371083\": \"乳山市\",\n\t    \"371084\": \"其它区\",\n\t    \"371100\": \"日照市\",\n\t    \"371102\": \"东港区\",\n\t    \"371103\": \"岚山区\",\n\t    \"371121\": \"五莲县\",\n\t    \"371122\": \"莒县\",\n\t    \"371123\": \"其它区\",\n\t    \"371200\": \"莱芜市\",\n\t    \"371202\": \"莱城区\",\n\t    \"371203\": \"钢城区\",\n\t    \"371204\": \"其它区\",\n\t    \"371300\": \"临沂市\",\n\t    \"371302\": \"兰山区\",\n\t    \"371311\": \"罗庄区\",\n\t    \"371312\": \"河东区\",\n\t    \"371321\": \"沂南县\",\n\t    \"371322\": \"郯城县\",\n\t    \"371323\": \"沂水县\",\n\t    \"371324\": \"苍山县\",\n\t    \"371325\": \"费县\",\n\t    \"371326\": \"平邑县\",\n\t    \"371327\": \"莒南县\",\n\t    \"371328\": \"蒙阴县\",\n\t    \"371329\": \"临沭县\",\n\t    \"371330\": \"其它区\",\n\t    \"371400\": \"德州市\",\n\t    \"371402\": \"德城区\",\n\t    \"371421\": \"陵县\",\n\t    \"371422\": \"宁津县\",\n\t    \"371423\": \"庆云县\",\n\t    \"371424\": \"临邑县\",\n\t    \"371425\": \"齐河县\",\n\t    \"371426\": \"平原县\",\n\t    \"371427\": \"夏津县\",\n\t    \"371428\": \"武城县\",\n\t    \"371481\": \"乐陵市\",\n\t    \"371482\": \"禹城市\",\n\t    \"371483\": \"其它区\",\n\t    \"371500\": \"聊城市\",\n\t    \"371502\": \"东昌府区\",\n\t    \"371521\": \"阳谷县\",\n\t    \"371522\": \"莘县\",\n\t    \"371523\": \"茌平县\",\n\t    \"371524\": \"东阿县\",\n\t    \"371525\": \"冠县\",\n\t    \"371526\": \"高唐县\",\n\t    \"371581\": \"临清市\",\n\t    \"371582\": \"其它区\",\n\t    \"371600\": \"滨州市\",\n\t    \"371602\": \"滨城区\",\n\t    \"371621\": \"惠民县\",\n\t    \"371622\": \"阳信县\",\n\t    \"371623\": \"无棣县\",\n\t    \"371624\": \"沾化县\",\n\t    \"371625\": \"博兴县\",\n\t    \"371626\": \"邹平县\",\n\t    \"371627\": \"其它区\",\n\t    \"371700\": \"菏泽市\",\n\t    \"371702\": \"牡丹区\",\n\t    \"371721\": \"曹县\",\n\t    \"371722\": \"单县\",\n\t    \"371723\": \"成武县\",\n\t    \"371724\": \"巨野县\",\n\t    \"371725\": \"郓城县\",\n\t    \"371726\": \"鄄城县\",\n\t    \"371727\": \"定陶县\",\n\t    \"371728\": \"东明县\",\n\t    \"371729\": \"其它区\",\n\t    \"410000\": \"河南省\",\n\t    \"410100\": \"郑州市\",\n\t    \"410102\": \"中原区\",\n\t    \"410103\": \"二七区\",\n\t    \"410104\": \"管城回族区\",\n\t    \"410105\": \"金水区\",\n\t    \"410106\": \"上街区\",\n\t    \"410108\": \"惠济区\",\n\t    \"410122\": \"中牟县\",\n\t    \"410181\": \"巩义市\",\n\t    \"410182\": \"荥阳市\",\n\t    \"410183\": \"新密市\",\n\t    \"410184\": \"新郑市\",\n\t    \"410185\": \"登封市\",\n\t    \"410188\": \"其它区\",\n\t    \"410200\": \"开封市\",\n\t    \"410202\": \"龙亭区\",\n\t    \"410203\": \"顺河回族区\",\n\t    \"410204\": \"鼓楼区\",\n\t    \"410205\": \"禹王台区\",\n\t    \"410211\": \"金明区\",\n\t    \"410221\": \"杞县\",\n\t    \"410222\": \"通许县\",\n\t    \"410223\": \"尉氏县\",\n\t    \"410224\": \"开封县\",\n\t    \"410225\": \"兰考县\",\n\t    \"410226\": \"其它区\",\n\t    \"410300\": \"洛阳市\",\n\t    \"410302\": \"老城区\",\n\t    \"410303\": \"西工区\",\n\t    \"410304\": \"瀍河回族区\",\n\t    \"410305\": \"涧西区\",\n\t    \"410306\": \"吉利区\",\n\t    \"410307\": \"洛龙区\",\n\t    \"410322\": \"孟津县\",\n\t    \"410323\": \"新安县\",\n\t    \"410324\": \"栾川县\",\n\t    \"410325\": \"嵩县\",\n\t    \"410326\": \"汝阳县\",\n\t    \"410327\": \"宜阳县\",\n\t    \"410328\": \"洛宁县\",\n\t    \"410329\": \"伊川县\",\n\t    \"410381\": \"偃师市\",\n\t    \"410400\": \"平顶山市\",\n\t    \"410402\": \"新华区\",\n\t    \"410403\": \"卫东区\",\n\t    \"410404\": \"石龙区\",\n\t    \"410411\": \"湛河区\",\n\t    \"410421\": \"宝丰县\",\n\t    \"410422\": \"叶县\",\n\t    \"410423\": \"鲁山县\",\n\t    \"410425\": \"郏县\",\n\t    \"410481\": \"舞钢市\",\n\t    \"410482\": \"汝州市\",\n\t    \"410483\": \"其它区\",\n\t    \"410500\": \"安阳市\",\n\t    \"410502\": \"文峰区\",\n\t    \"410503\": \"北关区\",\n\t    \"410505\": \"殷都区\",\n\t    \"410506\": \"龙安区\",\n\t    \"410522\": \"安阳县\",\n\t    \"410523\": \"汤阴县\",\n\t    \"410526\": \"滑县\",\n\t    \"410527\": \"内黄县\",\n\t    \"410581\": \"林州市\",\n\t    \"410582\": \"其它区\",\n\t    \"410600\": \"鹤壁市\",\n\t    \"410602\": \"鹤山区\",\n\t    \"410603\": \"山城区\",\n\t    \"410611\": \"淇滨区\",\n\t    \"410621\": \"浚县\",\n\t    \"410622\": \"淇县\",\n\t    \"410623\": \"其它区\",\n\t    \"410700\": \"新乡市\",\n\t    \"410702\": \"红旗区\",\n\t    \"410703\": \"卫滨区\",\n\t    \"410704\": \"凤泉区\",\n\t    \"410711\": \"牧野区\",\n\t    \"410721\": \"新乡县\",\n\t    \"410724\": \"获嘉县\",\n\t    \"410725\": \"原阳县\",\n\t    \"410726\": \"延津县\",\n\t    \"410727\": \"封丘县\",\n\t    \"410728\": \"长垣县\",\n\t    \"410781\": \"卫辉市\",\n\t    \"410782\": \"辉县市\",\n\t    \"410783\": \"其它区\",\n\t    \"410800\": \"焦作市\",\n\t    \"410802\": \"解放区\",\n\t    \"410803\": \"中站区\",\n\t    \"410804\": \"马村区\",\n\t    \"410811\": \"山阳区\",\n\t    \"410821\": \"修武县\",\n\t    \"410822\": \"博爱县\",\n\t    \"410823\": \"武陟县\",\n\t    \"410825\": \"温县\",\n\t    \"410881\": \"济源市\",\n\t    \"410882\": \"沁阳市\",\n\t    \"410883\": \"孟州市\",\n\t    \"410884\": \"其它区\",\n\t    \"410900\": \"濮阳市\",\n\t    \"410902\": \"华龙区\",\n\t    \"410922\": \"清丰县\",\n\t    \"410923\": \"南乐县\",\n\t    \"410926\": \"范县\",\n\t    \"410927\": \"台前县\",\n\t    \"410928\": \"濮阳县\",\n\t    \"410929\": \"其它区\",\n\t    \"411000\": \"许昌市\",\n\t    \"411002\": \"魏都区\",\n\t    \"411023\": \"许昌县\",\n\t    \"411024\": \"鄢陵县\",\n\t    \"411025\": \"襄城县\",\n\t    \"411081\": \"禹州市\",\n\t    \"411082\": \"长葛市\",\n\t    \"411083\": \"其它区\",\n\t    \"411100\": \"漯河市\",\n\t    \"411102\": \"源汇区\",\n\t    \"411103\": \"郾城区\",\n\t    \"411104\": \"召陵区\",\n\t    \"411121\": \"舞阳县\",\n\t    \"411122\": \"临颍县\",\n\t    \"411123\": \"其它区\",\n\t    \"411200\": \"三门峡市\",\n\t    \"411202\": \"湖滨区\",\n\t    \"411221\": \"渑池县\",\n\t    \"411222\": \"陕县\",\n\t    \"411224\": \"卢氏县\",\n\t    \"411281\": \"义马市\",\n\t    \"411282\": \"灵宝市\",\n\t    \"411283\": \"其它区\",\n\t    \"411300\": \"南阳市\",\n\t    \"411302\": \"宛城区\",\n\t    \"411303\": \"卧龙区\",\n\t    \"411321\": \"南召县\",\n\t    \"411322\": \"方城县\",\n\t    \"411323\": \"西峡县\",\n\t    \"411324\": \"镇平县\",\n\t    \"411325\": \"内乡县\",\n\t    \"411326\": \"淅川县\",\n\t    \"411327\": \"社旗县\",\n\t    \"411328\": \"唐河县\",\n\t    \"411329\": \"新野县\",\n\t    \"411330\": \"桐柏县\",\n\t    \"411381\": \"邓州市\",\n\t    \"411382\": \"其它区\",\n\t    \"411400\": \"商丘市\",\n\t    \"411402\": \"梁园区\",\n\t    \"411403\": \"睢阳区\",\n\t    \"411421\": \"民权县\",\n\t    \"411422\": \"睢县\",\n\t    \"411423\": \"宁陵县\",\n\t    \"411424\": \"柘城县\",\n\t    \"411425\": \"虞城县\",\n\t    \"411426\": \"夏邑县\",\n\t    \"411481\": \"永城市\",\n\t    \"411482\": \"其它区\",\n\t    \"411500\": \"信阳市\",\n\t    \"411502\": \"浉河区\",\n\t    \"411503\": \"平桥区\",\n\t    \"411521\": \"罗山县\",\n\t    \"411522\": \"光山县\",\n\t    \"411523\": \"新县\",\n\t    \"411524\": \"商城县\",\n\t    \"411525\": \"固始县\",\n\t    \"411526\": \"潢川县\",\n\t    \"411527\": \"淮滨县\",\n\t    \"411528\": \"息县\",\n\t    \"411529\": \"其它区\",\n\t    \"411600\": \"周口市\",\n\t    \"411602\": \"川汇区\",\n\t    \"411621\": \"扶沟县\",\n\t    \"411622\": \"西华县\",\n\t    \"411623\": \"商水县\",\n\t    \"411624\": \"沈丘县\",\n\t    \"411625\": \"郸城县\",\n\t    \"411626\": \"淮阳县\",\n\t    \"411627\": \"太康县\",\n\t    \"411628\": \"鹿邑县\",\n\t    \"411681\": \"项城市\",\n\t    \"411682\": \"其它区\",\n\t    \"411700\": \"驻马店市\",\n\t    \"411702\": \"驿城区\",\n\t    \"411721\": \"西平县\",\n\t    \"411722\": \"上蔡县\",\n\t    \"411723\": \"平舆县\",\n\t    \"411724\": \"正阳县\",\n\t    \"411725\": \"确山县\",\n\t    \"411726\": \"泌阳县\",\n\t    \"411727\": \"汝南县\",\n\t    \"411728\": \"遂平县\",\n\t    \"411729\": \"新蔡县\",\n\t    \"411730\": \"其它区\",\n\t    \"420000\": \"湖北省\",\n\t    \"420100\": \"武汉市\",\n\t    \"420102\": \"江岸区\",\n\t    \"420103\": \"江汉区\",\n\t    \"420104\": \"硚口区\",\n\t    \"420105\": \"汉阳区\",\n\t    \"420106\": \"武昌区\",\n\t    \"420107\": \"青山区\",\n\t    \"420111\": \"洪山区\",\n\t    \"420112\": \"东西湖区\",\n\t    \"420113\": \"汉南区\",\n\t    \"420114\": \"蔡甸区\",\n\t    \"420115\": \"江夏区\",\n\t    \"420116\": \"黄陂区\",\n\t    \"420117\": \"新洲区\",\n\t    \"420118\": \"其它区\",\n\t    \"420200\": \"黄石市\",\n\t    \"420202\": \"黄石港区\",\n\t    \"420203\": \"西塞山区\",\n\t    \"420204\": \"下陆区\",\n\t    \"420205\": \"铁山区\",\n\t    \"420222\": \"阳新县\",\n\t    \"420281\": \"大冶市\",\n\t    \"420282\": \"其它区\",\n\t    \"420300\": \"十堰市\",\n\t    \"420302\": \"茅箭区\",\n\t    \"420303\": \"张湾区\",\n\t    \"420321\": \"郧县\",\n\t    \"420322\": \"郧西县\",\n\t    \"420323\": \"竹山县\",\n\t    \"420324\": \"竹溪县\",\n\t    \"420325\": \"房县\",\n\t    \"420381\": \"丹江口市\",\n\t    \"420383\": \"其它区\",\n\t    \"420500\": \"宜昌市\",\n\t    \"420502\": \"西陵区\",\n\t    \"420503\": \"伍家岗区\",\n\t    \"420504\": \"点军区\",\n\t    \"420505\": \"猇亭区\",\n\t    \"420506\": \"夷陵区\",\n\t    \"420525\": \"远安县\",\n\t    \"420526\": \"兴山县\",\n\t    \"420527\": \"秭归县\",\n\t    \"420528\": \"长阳土家族自治县\",\n\t    \"420529\": \"五峰土家族自治县\",\n\t    \"420581\": \"宜都市\",\n\t    \"420582\": \"当阳市\",\n\t    \"420583\": \"枝江市\",\n\t    \"420584\": \"其它区\",\n\t    \"420600\": \"襄阳市\",\n\t    \"420602\": \"襄城区\",\n\t    \"420606\": \"樊城区\",\n\t    \"420607\": \"襄州区\",\n\t    \"420624\": \"南漳县\",\n\t    \"420625\": \"谷城县\",\n\t    \"420626\": \"保康县\",\n\t    \"420682\": \"老河口市\",\n\t    \"420683\": \"枣阳市\",\n\t    \"420684\": \"宜城市\",\n\t    \"420685\": \"其它区\",\n\t    \"420700\": \"鄂州市\",\n\t    \"420702\": \"梁子湖区\",\n\t    \"420703\": \"华容区\",\n\t    \"420704\": \"鄂城区\",\n\t    \"420705\": \"其它区\",\n\t    \"420800\": \"荆门市\",\n\t    \"420802\": \"东宝区\",\n\t    \"420804\": \"掇刀区\",\n\t    \"420821\": \"京山县\",\n\t    \"420822\": \"沙洋县\",\n\t    \"420881\": \"钟祥市\",\n\t    \"420882\": \"其它区\",\n\t    \"420900\": \"孝感市\",\n\t    \"420902\": \"孝南区\",\n\t    \"420921\": \"孝昌县\",\n\t    \"420922\": \"大悟县\",\n\t    \"420923\": \"云梦县\",\n\t    \"420981\": \"应城市\",\n\t    \"420982\": \"安陆市\",\n\t    \"420984\": \"汉川市\",\n\t    \"420985\": \"其它区\",\n\t    \"421000\": \"荆州市\",\n\t    \"421002\": \"沙市区\",\n\t    \"421003\": \"荆州区\",\n\t    \"421022\": \"公安县\",\n\t    \"421023\": \"监利县\",\n\t    \"421024\": \"江陵县\",\n\t    \"421081\": \"石首市\",\n\t    \"421083\": \"洪湖市\",\n\t    \"421087\": \"松滋市\",\n\t    \"421088\": \"其它区\",\n\t    \"421100\": \"黄冈市\",\n\t    \"421102\": \"黄州区\",\n\t    \"421121\": \"团风县\",\n\t    \"421122\": \"红安县\",\n\t    \"421123\": \"罗田县\",\n\t    \"421124\": \"英山县\",\n\t    \"421125\": \"浠水县\",\n\t    \"421126\": \"蕲春县\",\n\t    \"421127\": \"黄梅县\",\n\t    \"421181\": \"麻城市\",\n\t    \"421182\": \"武穴市\",\n\t    \"421183\": \"其它区\",\n\t    \"421200\": \"咸宁市\",\n\t    \"421202\": \"咸安区\",\n\t    \"421221\": \"嘉鱼县\",\n\t    \"421222\": \"通城县\",\n\t    \"421223\": \"崇阳县\",\n\t    \"421224\": \"通山县\",\n\t    \"421281\": \"赤壁市\",\n\t    \"421283\": \"其它区\",\n\t    \"421300\": \"随州市\",\n\t    \"421302\": \"曾都区\",\n\t    \"421321\": \"随县\",\n\t    \"421381\": \"广水市\",\n\t    \"421382\": \"其它区\",\n\t    \"422800\": \"恩施土家族苗族自治州\",\n\t    \"422801\": \"恩施市\",\n\t    \"422802\": \"利川市\",\n\t    \"422822\": \"建始县\",\n\t    \"422823\": \"巴东县\",\n\t    \"422825\": \"宣恩县\",\n\t    \"422826\": \"咸丰县\",\n\t    \"422827\": \"来凤县\",\n\t    \"422828\": \"鹤峰县\",\n\t    \"422829\": \"其它区\",\n\t    \"429004\": \"仙桃市\",\n\t    \"429005\": \"潜江市\",\n\t    \"429006\": \"天门市\",\n\t    \"429021\": \"神农架林区\",\n\t    \"430000\": \"湖南省\",\n\t    \"430100\": \"长沙市\",\n\t    \"430102\": \"芙蓉区\",\n\t    \"430103\": \"天心区\",\n\t    \"430104\": \"岳麓区\",\n\t    \"430105\": \"开福区\",\n\t    \"430111\": \"雨花区\",\n\t    \"430121\": \"长沙县\",\n\t    \"430122\": \"望城区\",\n\t    \"430124\": \"宁乡县\",\n\t    \"430181\": \"浏阳市\",\n\t    \"430182\": \"其它区\",\n\t    \"430200\": \"株洲市\",\n\t    \"430202\": \"荷塘区\",\n\t    \"430203\": \"芦淞区\",\n\t    \"430204\": \"石峰区\",\n\t    \"430211\": \"天元区\",\n\t    \"430221\": \"株洲县\",\n\t    \"430223\": \"攸县\",\n\t    \"430224\": \"茶陵县\",\n\t    \"430225\": \"炎陵县\",\n\t    \"430281\": \"醴陵市\",\n\t    \"430282\": \"其它区\",\n\t    \"430300\": \"湘潭市\",\n\t    \"430302\": \"雨湖区\",\n\t    \"430304\": \"岳塘区\",\n\t    \"430321\": \"湘潭县\",\n\t    \"430381\": \"湘乡市\",\n\t    \"430382\": \"韶山市\",\n\t    \"430383\": \"其它区\",\n\t    \"430400\": \"衡阳市\",\n\t    \"430405\": \"珠晖区\",\n\t    \"430406\": \"雁峰区\",\n\t    \"430407\": \"石鼓区\",\n\t    \"430408\": \"蒸湘区\",\n\t    \"430412\": \"南岳区\",\n\t    \"430421\": \"衡阳县\",\n\t    \"430422\": \"衡南县\",\n\t    \"430423\": \"衡山县\",\n\t    \"430424\": \"衡东县\",\n\t    \"430426\": \"祁东县\",\n\t    \"430481\": \"耒阳市\",\n\t    \"430482\": \"常宁市\",\n\t    \"430483\": \"其它区\",\n\t    \"430500\": \"邵阳市\",\n\t    \"430502\": \"双清区\",\n\t    \"430503\": \"大祥区\",\n\t    \"430511\": \"北塔区\",\n\t    \"430521\": \"邵东县\",\n\t    \"430522\": \"新邵县\",\n\t    \"430523\": \"邵阳县\",\n\t    \"430524\": \"隆回县\",\n\t    \"430525\": \"洞口县\",\n\t    \"430527\": \"绥宁县\",\n\t    \"430528\": \"新宁县\",\n\t    \"430529\": \"城步苗族自治县\",\n\t    \"430581\": \"武冈市\",\n\t    \"430582\": \"其它区\",\n\t    \"430600\": \"岳阳市\",\n\t    \"430602\": \"岳阳楼区\",\n\t    \"430603\": \"云溪区\",\n\t    \"430611\": \"君山区\",\n\t    \"430621\": \"岳阳县\",\n\t    \"430623\": \"华容县\",\n\t    \"430624\": \"湘阴县\",\n\t    \"430626\": \"平江县\",\n\t    \"430681\": \"汨罗市\",\n\t    \"430682\": \"临湘市\",\n\t    \"430683\": \"其它区\",\n\t    \"430700\": \"常德市\",\n\t    \"430702\": \"武陵区\",\n\t    \"430703\": \"鼎城区\",\n\t    \"430721\": \"安乡县\",\n\t    \"430722\": \"汉寿县\",\n\t    \"430723\": \"澧县\",\n\t    \"430724\": \"临澧县\",\n\t    \"430725\": \"桃源县\",\n\t    \"430726\": \"石门县\",\n\t    \"430781\": \"津市市\",\n\t    \"430782\": \"其它区\",\n\t    \"430800\": \"张家界市\",\n\t    \"430802\": \"永定区\",\n\t    \"430811\": \"武陵源区\",\n\t    \"430821\": \"慈利县\",\n\t    \"430822\": \"桑植县\",\n\t    \"430823\": \"其它区\",\n\t    \"430900\": \"益阳市\",\n\t    \"430902\": \"资阳区\",\n\t    \"430903\": \"赫山区\",\n\t    \"430921\": \"南县\",\n\t    \"430922\": \"桃江县\",\n\t    \"430923\": \"安化县\",\n\t    \"430981\": \"沅江市\",\n\t    \"430982\": \"其它区\",\n\t    \"431000\": \"郴州市\",\n\t    \"431002\": \"北湖区\",\n\t    \"431003\": \"苏仙区\",\n\t    \"431021\": \"桂阳县\",\n\t    \"431022\": \"宜章县\",\n\t    \"431023\": \"永兴县\",\n\t    \"431024\": \"嘉禾县\",\n\t    \"431025\": \"临武县\",\n\t    \"431026\": \"汝城县\",\n\t    \"431027\": \"桂东县\",\n\t    \"431028\": \"安仁县\",\n\t    \"431081\": \"资兴市\",\n\t    \"431082\": \"其它区\",\n\t    \"431100\": \"永州市\",\n\t    \"431102\": \"零陵区\",\n\t    \"431103\": \"冷水滩区\",\n\t    \"431121\": \"祁阳县\",\n\t    \"431122\": \"东安县\",\n\t    \"431123\": \"双牌县\",\n\t    \"431124\": \"道县\",\n\t    \"431125\": \"江永县\",\n\t    \"431126\": \"宁远县\",\n\t    \"431127\": \"蓝山县\",\n\t    \"431128\": \"新田县\",\n\t    \"431129\": \"江华瑶族自治县\",\n\t    \"431130\": \"其它区\",\n\t    \"431200\": \"怀化市\",\n\t    \"431202\": \"鹤城区\",\n\t    \"431221\": \"中方县\",\n\t    \"431222\": \"沅陵县\",\n\t    \"431223\": \"辰溪县\",\n\t    \"431224\": \"溆浦县\",\n\t    \"431225\": \"会同县\",\n\t    \"431226\": \"麻阳苗族自治县\",\n\t    \"431227\": \"新晃侗族自治县\",\n\t    \"431228\": \"芷江侗族自治县\",\n\t    \"431229\": \"靖州苗族侗族自治县\",\n\t    \"431230\": \"通道侗族自治县\",\n\t    \"431281\": \"洪江市\",\n\t    \"431282\": \"其它区\",\n\t    \"431300\": \"娄底市\",\n\t    \"431302\": \"娄星区\",\n\t    \"431321\": \"双峰县\",\n\t    \"431322\": \"新化县\",\n\t    \"431381\": \"冷水江市\",\n\t    \"431382\": \"涟源市\",\n\t    \"431383\": \"其它区\",\n\t    \"433100\": \"湘西土家族苗族自治州\",\n\t    \"433101\": \"吉首市\",\n\t    \"433122\": \"泸溪县\",\n\t    \"433123\": \"凤凰县\",\n\t    \"433124\": \"花垣县\",\n\t    \"433125\": \"保靖县\",\n\t    \"433126\": \"古丈县\",\n\t    \"433127\": \"永顺县\",\n\t    \"433130\": \"龙山县\",\n\t    \"433131\": \"其它区\",\n\t    \"440000\": \"广东省\",\n\t    \"440100\": \"广州市\",\n\t    \"440103\": \"荔湾区\",\n\t    \"440104\": \"越秀区\",\n\t    \"440105\": \"海珠区\",\n\t    \"440106\": \"天河区\",\n\t    \"440111\": \"白云区\",\n\t    \"440112\": \"黄埔区\",\n\t    \"440113\": \"番禺区\",\n\t    \"440114\": \"花都区\",\n\t    \"440115\": \"南沙区\",\n\t    \"440116\": \"萝岗区\",\n\t    \"440183\": \"增城市\",\n\t    \"440184\": \"从化市\",\n\t    \"440189\": \"其它区\",\n\t    \"440200\": \"韶关市\",\n\t    \"440203\": \"武江区\",\n\t    \"440204\": \"浈江区\",\n\t    \"440205\": \"曲江区\",\n\t    \"440222\": \"始兴县\",\n\t    \"440224\": \"仁化县\",\n\t    \"440229\": \"翁源县\",\n\t    \"440232\": \"乳源瑶族自治县\",\n\t    \"440233\": \"新丰县\",\n\t    \"440281\": \"乐昌市\",\n\t    \"440282\": \"南雄市\",\n\t    \"440283\": \"其它区\",\n\t    \"440300\": \"深圳市\",\n\t    \"440303\": \"罗湖区\",\n\t    \"440304\": \"福田区\",\n\t    \"440305\": \"南山区\",\n\t    \"440306\": \"宝安区\",\n\t    \"440307\": \"龙岗区\",\n\t    \"440308\": \"盐田区\",\n\t    \"440309\": \"其它区\",\n\t    \"440320\": \"光明新区\",\n\t    \"440321\": \"坪山新区\",\n\t    \"440322\": \"大鹏新区\",\n\t    \"440323\": \"龙华新区\",\n\t    \"440400\": \"珠海市\",\n\t    \"440402\": \"香洲区\",\n\t    \"440403\": \"斗门区\",\n\t    \"440404\": \"金湾区\",\n\t    \"440488\": \"其它区\",\n\t    \"440500\": \"汕头市\",\n\t    \"440507\": \"龙湖区\",\n\t    \"440511\": \"金平区\",\n\t    \"440512\": \"濠江区\",\n\t    \"440513\": \"潮阳区\",\n\t    \"440514\": \"潮南区\",\n\t    \"440515\": \"澄海区\",\n\t    \"440523\": \"南澳县\",\n\t    \"440524\": \"其它区\",\n\t    \"440600\": \"佛山市\",\n\t    \"440604\": \"禅城区\",\n\t    \"440605\": \"南海区\",\n\t    \"440606\": \"顺德区\",\n\t    \"440607\": \"三水区\",\n\t    \"440608\": \"高明区\",\n\t    \"440609\": \"其它区\",\n\t    \"440700\": \"江门市\",\n\t    \"440703\": \"蓬江区\",\n\t    \"440704\": \"江海区\",\n\t    \"440705\": \"新会区\",\n\t    \"440781\": \"台山市\",\n\t    \"440783\": \"开平市\",\n\t    \"440784\": \"鹤山市\",\n\t    \"440785\": \"恩平市\",\n\t    \"440786\": \"其它区\",\n\t    \"440800\": \"湛江市\",\n\t    \"440802\": \"赤坎区\",\n\t    \"440803\": \"霞山区\",\n\t    \"440804\": \"坡头区\",\n\t    \"440811\": \"麻章区\",\n\t    \"440823\": \"遂溪县\",\n\t    \"440825\": \"徐闻县\",\n\t    \"440881\": \"廉江市\",\n\t    \"440882\": \"雷州市\",\n\t    \"440883\": \"吴川市\",\n\t    \"440884\": \"其它区\",\n\t    \"440900\": \"茂名市\",\n\t    \"440902\": \"茂南区\",\n\t    \"440903\": \"茂港区\",\n\t    \"440923\": \"电白县\",\n\t    \"440981\": \"高州市\",\n\t    \"440982\": \"化州市\",\n\t    \"440983\": \"信宜市\",\n\t    \"440984\": \"其它区\",\n\t    \"441200\": \"肇庆市\",\n\t    \"441202\": \"端州区\",\n\t    \"441203\": \"鼎湖区\",\n\t    \"441223\": \"广宁县\",\n\t    \"441224\": \"怀集县\",\n\t    \"441225\": \"封开县\",\n\t    \"441226\": \"德庆县\",\n\t    \"441283\": \"高要市\",\n\t    \"441284\": \"四会市\",\n\t    \"441285\": \"其它区\",\n\t    \"441300\": \"惠州市\",\n\t    \"441302\": \"惠城区\",\n\t    \"441303\": \"惠阳区\",\n\t    \"441322\": \"博罗县\",\n\t    \"441323\": \"惠东县\",\n\t    \"441324\": \"龙门县\",\n\t    \"441325\": \"其它区\",\n\t    \"441400\": \"梅州市\",\n\t    \"441402\": \"梅江区\",\n\t    \"441421\": \"梅县\",\n\t    \"441422\": \"大埔县\",\n\t    \"441423\": \"丰顺县\",\n\t    \"441424\": \"五华县\",\n\t    \"441426\": \"平远县\",\n\t    \"441427\": \"蕉岭县\",\n\t    \"441481\": \"兴宁市\",\n\t    \"441482\": \"其它区\",\n\t    \"441500\": \"汕尾市\",\n\t    \"441502\": \"城区\",\n\t    \"441521\": \"海丰县\",\n\t    \"441523\": \"陆河县\",\n\t    \"441581\": \"陆丰市\",\n\t    \"441582\": \"其它区\",\n\t    \"441600\": \"河源市\",\n\t    \"441602\": \"源城区\",\n\t    \"441621\": \"紫金县\",\n\t    \"441622\": \"龙川县\",\n\t    \"441623\": \"连平县\",\n\t    \"441624\": \"和平县\",\n\t    \"441625\": \"东源县\",\n\t    \"441626\": \"其它区\",\n\t    \"441700\": \"阳江市\",\n\t    \"441702\": \"江城区\",\n\t    \"441721\": \"阳西县\",\n\t    \"441723\": \"阳东县\",\n\t    \"441781\": \"阳春市\",\n\t    \"441782\": \"其它区\",\n\t    \"441800\": \"清远市\",\n\t    \"441802\": \"清城区\",\n\t    \"441821\": \"佛冈县\",\n\t    \"441823\": \"阳山县\",\n\t    \"441825\": \"连山壮族瑶族自治县\",\n\t    \"441826\": \"连南瑶族自治县\",\n\t    \"441827\": \"清新区\",\n\t    \"441881\": \"英德市\",\n\t    \"441882\": \"连州市\",\n\t    \"441883\": \"其它区\",\n\t    \"441900\": \"东莞市\",\n\t    \"442000\": \"中山市\",\n\t    \"442101\": \"东沙群岛\",\n\t    \"445100\": \"潮州市\",\n\t    \"445102\": \"湘桥区\",\n\t    \"445121\": \"潮安区\",\n\t    \"445122\": \"饶平县\",\n\t    \"445186\": \"其它区\",\n\t    \"445200\": \"揭阳市\",\n\t    \"445202\": \"榕城区\",\n\t    \"445221\": \"揭东区\",\n\t    \"445222\": \"揭西县\",\n\t    \"445224\": \"惠来县\",\n\t    \"445281\": \"普宁市\",\n\t    \"445285\": \"其它区\",\n\t    \"445300\": \"云浮市\",\n\t    \"445302\": \"云城区\",\n\t    \"445321\": \"新兴县\",\n\t    \"445322\": \"郁南县\",\n\t    \"445323\": \"云安县\",\n\t    \"445381\": \"罗定市\",\n\t    \"445382\": \"其它区\",\n\t    \"450000\": \"广西壮族自治区\",\n\t    \"450100\": \"南宁市\",\n\t    \"450102\": \"兴宁区\",\n\t    \"450103\": \"青秀区\",\n\t    \"450105\": \"江南区\",\n\t    \"450107\": \"西乡塘区\",\n\t    \"450108\": \"良庆区\",\n\t    \"450109\": \"邕宁区\",\n\t    \"450122\": \"武鸣县\",\n\t    \"450123\": \"隆安县\",\n\t    \"450124\": \"马山县\",\n\t    \"450125\": \"上林县\",\n\t    \"450126\": \"宾阳县\",\n\t    \"450127\": \"横县\",\n\t    \"450128\": \"其它区\",\n\t    \"450200\": \"柳州市\",\n\t    \"450202\": \"城中区\",\n\t    \"450203\": \"鱼峰区\",\n\t    \"450204\": \"柳南区\",\n\t    \"450205\": \"柳北区\",\n\t    \"450221\": \"柳江县\",\n\t    \"450222\": \"柳城县\",\n\t    \"450223\": \"鹿寨县\",\n\t    \"450224\": \"融安县\",\n\t    \"450225\": \"融水苗族自治县\",\n\t    \"450226\": \"三江侗族自治县\",\n\t    \"450227\": \"其它区\",\n\t    \"450300\": \"桂林市\",\n\t    \"450302\": \"秀峰区\",\n\t    \"450303\": \"叠彩区\",\n\t    \"450304\": \"象山区\",\n\t    \"450305\": \"七星区\",\n\t    \"450311\": \"雁山区\",\n\t    \"450321\": \"阳朔县\",\n\t    \"450322\": \"临桂区\",\n\t    \"450323\": \"灵川县\",\n\t    \"450324\": \"全州县\",\n\t    \"450325\": \"兴安县\",\n\t    \"450326\": \"永福县\",\n\t    \"450327\": \"灌阳县\",\n\t    \"450328\": \"龙胜各族自治县\",\n\t    \"450329\": \"资源县\",\n\t    \"450330\": \"平乐县\",\n\t    \"450331\": \"荔浦县\",\n\t    \"450332\": \"恭城瑶族自治县\",\n\t    \"450333\": \"其它区\",\n\t    \"450400\": \"梧州市\",\n\t    \"450403\": \"万秀区\",\n\t    \"450405\": \"长洲区\",\n\t    \"450406\": \"龙圩区\",\n\t    \"450421\": \"苍梧县\",\n\t    \"450422\": \"藤县\",\n\t    \"450423\": \"蒙山县\",\n\t    \"450481\": \"岑溪市\",\n\t    \"450482\": \"其它区\",\n\t    \"450500\": \"北海市\",\n\t    \"450502\": \"海城区\",\n\t    \"450503\": \"银海区\",\n\t    \"450512\": \"铁山港区\",\n\t    \"450521\": \"合浦县\",\n\t    \"450522\": \"其它区\",\n\t    \"450600\": \"防城港市\",\n\t    \"450602\": \"港口区\",\n\t    \"450603\": \"防城区\",\n\t    \"450621\": \"上思县\",\n\t    \"450681\": \"东兴市\",\n\t    \"450682\": \"其它区\",\n\t    \"450700\": \"钦州市\",\n\t    \"450702\": \"钦南区\",\n\t    \"450703\": \"钦北区\",\n\t    \"450721\": \"灵山县\",\n\t    \"450722\": \"浦北县\",\n\t    \"450723\": \"其它区\",\n\t    \"450800\": \"贵港市\",\n\t    \"450802\": \"港北区\",\n\t    \"450803\": \"港南区\",\n\t    \"450804\": \"覃塘区\",\n\t    \"450821\": \"平南县\",\n\t    \"450881\": \"桂平市\",\n\t    \"450882\": \"其它区\",\n\t    \"450900\": \"玉林市\",\n\t    \"450902\": \"玉州区\",\n\t    \"450903\": \"福绵区\",\n\t    \"450921\": \"容县\",\n\t    \"450922\": \"陆川县\",\n\t    \"450923\": \"博白县\",\n\t    \"450924\": \"兴业县\",\n\t    \"450981\": \"北流市\",\n\t    \"450982\": \"其它区\",\n\t    \"451000\": \"百色市\",\n\t    \"451002\": \"右江区\",\n\t    \"451021\": \"田阳县\",\n\t    \"451022\": \"田东县\",\n\t    \"451023\": \"平果县\",\n\t    \"451024\": \"德保县\",\n\t    \"451025\": \"靖西县\",\n\t    \"451026\": \"那坡县\",\n\t    \"451027\": \"凌云县\",\n\t    \"451028\": \"乐业县\",\n\t    \"451029\": \"田林县\",\n\t    \"451030\": \"西林县\",\n\t    \"451031\": \"隆林各族自治县\",\n\t    \"451032\": \"其它区\",\n\t    \"451100\": \"贺州市\",\n\t    \"451102\": \"八步区\",\n\t    \"451119\": \"平桂管理区\",\n\t    \"451121\": \"昭平县\",\n\t    \"451122\": \"钟山县\",\n\t    \"451123\": \"富川瑶族自治县\",\n\t    \"451124\": \"其它区\",\n\t    \"451200\": \"河池市\",\n\t    \"451202\": \"金城江区\",\n\t    \"451221\": \"南丹县\",\n\t    \"451222\": \"天峨县\",\n\t    \"451223\": \"凤山县\",\n\t    \"451224\": \"东兰县\",\n\t    \"451225\": \"罗城仫佬族自治县\",\n\t    \"451226\": \"环江毛南族自治县\",\n\t    \"451227\": \"巴马瑶族自治县\",\n\t    \"451228\": \"都安瑶族自治县\",\n\t    \"451229\": \"大化瑶族自治县\",\n\t    \"451281\": \"宜州市\",\n\t    \"451282\": \"其它区\",\n\t    \"451300\": \"来宾市\",\n\t    \"451302\": \"兴宾区\",\n\t    \"451321\": \"忻城县\",\n\t    \"451322\": \"象州县\",\n\t    \"451323\": \"武宣县\",\n\t    \"451324\": \"金秀瑶族自治县\",\n\t    \"451381\": \"合山市\",\n\t    \"451382\": \"其它区\",\n\t    \"451400\": \"崇左市\",\n\t    \"451402\": \"江州区\",\n\t    \"451421\": \"扶绥县\",\n\t    \"451422\": \"宁明县\",\n\t    \"451423\": \"龙州县\",\n\t    \"451424\": \"大新县\",\n\t    \"451425\": \"天等县\",\n\t    \"451481\": \"凭祥市\",\n\t    \"451482\": \"其它区\",\n\t    \"460000\": \"海南省\",\n\t    \"460100\": \"海口市\",\n\t    \"460105\": \"秀英区\",\n\t    \"460106\": \"龙华区\",\n\t    \"460107\": \"琼山区\",\n\t    \"460108\": \"美兰区\",\n\t    \"460109\": \"其它区\",\n\t    \"460200\": \"三亚市\",\n\t    \"460300\": \"三沙市\",\n\t    \"460321\": \"西沙群岛\",\n\t    \"460322\": \"南沙群岛\",\n\t    \"460323\": \"中沙群岛的岛礁及其海域\",\n\t    \"469001\": \"五指山市\",\n\t    \"469002\": \"琼海市\",\n\t    \"469003\": \"儋州市\",\n\t    \"469005\": \"文昌市\",\n\t    \"469006\": \"万宁市\",\n\t    \"469007\": \"东方市\",\n\t    \"469025\": \"定安县\",\n\t    \"469026\": \"屯昌县\",\n\t    \"469027\": \"澄迈县\",\n\t    \"469028\": \"临高县\",\n\t    \"469030\": \"白沙黎族自治县\",\n\t    \"469031\": \"昌江黎族自治县\",\n\t    \"469033\": \"乐东黎族自治县\",\n\t    \"469034\": \"陵水黎族自治县\",\n\t    \"469035\": \"保亭黎族苗族自治县\",\n\t    \"469036\": \"琼中黎族苗族自治县\",\n\t    \"471005\": \"其它区\",\n\t    \"500000\": \"重庆\",\n\t    \"500100\": \"重庆市\",\n\t    \"500101\": \"万州区\",\n\t    \"500102\": \"涪陵区\",\n\t    \"500103\": \"渝中区\",\n\t    \"500104\": \"大渡口区\",\n\t    \"500105\": \"江北区\",\n\t    \"500106\": \"沙坪坝区\",\n\t    \"500107\": \"九龙坡区\",\n\t    \"500108\": \"南岸区\",\n\t    \"500109\": \"北碚区\",\n\t    \"500110\": \"万盛区\",\n\t    \"500111\": \"双桥区\",\n\t    \"500112\": \"渝北区\",\n\t    \"500113\": \"巴南区\",\n\t    \"500114\": \"黔江区\",\n\t    \"500115\": \"长寿区\",\n\t    \"500222\": \"綦江区\",\n\t    \"500223\": \"潼南县\",\n\t    \"500224\": \"铜梁县\",\n\t    \"500225\": \"大足区\",\n\t    \"500226\": \"荣昌县\",\n\t    \"500227\": \"璧山县\",\n\t    \"500228\": \"梁平县\",\n\t    \"500229\": \"城口县\",\n\t    \"500230\": \"丰都县\",\n\t    \"500231\": \"垫江县\",\n\t    \"500232\": \"武隆县\",\n\t    \"500233\": \"忠县\",\n\t    \"500234\": \"开县\",\n\t    \"500235\": \"云阳县\",\n\t    \"500236\": \"奉节县\",\n\t    \"500237\": \"巫山县\",\n\t    \"500238\": \"巫溪县\",\n\t    \"500240\": \"石柱土家族自治县\",\n\t    \"500241\": \"秀山土家族苗族自治县\",\n\t    \"500242\": \"酉阳土家族苗族自治县\",\n\t    \"500243\": \"彭水苗族土家族自治县\",\n\t    \"500381\": \"江津区\",\n\t    \"500382\": \"合川区\",\n\t    \"500383\": \"永川区\",\n\t    \"500384\": \"南川区\",\n\t    \"500385\": \"其它区\",\n\t    \"510000\": \"四川省\",\n\t    \"510100\": \"成都市\",\n\t    \"510104\": \"锦江区\",\n\t    \"510105\": \"青羊区\",\n\t    \"510106\": \"金牛区\",\n\t    \"510107\": \"武侯区\",\n\t    \"510108\": \"成华区\",\n\t    \"510112\": \"龙泉驿区\",\n\t    \"510113\": \"青白江区\",\n\t    \"510114\": \"新都区\",\n\t    \"510115\": \"温江区\",\n\t    \"510121\": \"金堂县\",\n\t    \"510122\": \"双流县\",\n\t    \"510124\": \"郫县\",\n\t    \"510129\": \"大邑县\",\n\t    \"510131\": \"蒲江县\",\n\t    \"510132\": \"新津县\",\n\t    \"510181\": \"都江堰市\",\n\t    \"510182\": \"彭州市\",\n\t    \"510183\": \"邛崃市\",\n\t    \"510184\": \"崇州市\",\n\t    \"510185\": \"其它区\",\n\t    \"510300\": \"自贡市\",\n\t    \"510302\": \"自流井区\",\n\t    \"510303\": \"贡井区\",\n\t    \"510304\": \"大安区\",\n\t    \"510311\": \"沿滩区\",\n\t    \"510321\": \"荣县\",\n\t    \"510322\": \"富顺县\",\n\t    \"510323\": \"其它区\",\n\t    \"510400\": \"攀枝花市\",\n\t    \"510402\": \"东区\",\n\t    \"510403\": \"西区\",\n\t    \"510411\": \"仁和区\",\n\t    \"510421\": \"米易县\",\n\t    \"510422\": \"盐边县\",\n\t    \"510423\": \"其它区\",\n\t    \"510500\": \"泸州市\",\n\t    \"510502\": \"江阳区\",\n\t    \"510503\": \"纳溪区\",\n\t    \"510504\": \"龙马潭区\",\n\t    \"510521\": \"泸县\",\n\t    \"510522\": \"合江县\",\n\t    \"510524\": \"叙永县\",\n\t    \"510525\": \"古蔺县\",\n\t    \"510526\": \"其它区\",\n\t    \"510600\": \"德阳市\",\n\t    \"510603\": \"旌阳区\",\n\t    \"510623\": \"中江县\",\n\t    \"510626\": \"罗江县\",\n\t    \"510681\": \"广汉市\",\n\t    \"510682\": \"什邡市\",\n\t    \"510683\": \"绵竹市\",\n\t    \"510684\": \"其它区\",\n\t    \"510700\": \"绵阳市\",\n\t    \"510703\": \"涪城区\",\n\t    \"510704\": \"游仙区\",\n\t    \"510722\": \"三台县\",\n\t    \"510723\": \"盐亭县\",\n\t    \"510724\": \"安县\",\n\t    \"510725\": \"梓潼县\",\n\t    \"510726\": \"北川羌族自治县\",\n\t    \"510727\": \"平武县\",\n\t    \"510781\": \"江油市\",\n\t    \"510782\": \"其它区\",\n\t    \"510800\": \"广元市\",\n\t    \"510802\": \"利州区\",\n\t    \"510811\": \"昭化区\",\n\t    \"510812\": \"朝天区\",\n\t    \"510821\": \"旺苍县\",\n\t    \"510822\": \"青川县\",\n\t    \"510823\": \"剑阁县\",\n\t    \"510824\": \"苍溪县\",\n\t    \"510825\": \"其它区\",\n\t    \"510900\": \"遂宁市\",\n\t    \"510903\": \"船山区\",\n\t    \"510904\": \"安居区\",\n\t    \"510921\": \"蓬溪县\",\n\t    \"510922\": \"射洪县\",\n\t    \"510923\": \"大英县\",\n\t    \"510924\": \"其它区\",\n\t    \"511000\": \"内江市\",\n\t    \"511002\": \"市中区\",\n\t    \"511011\": \"东兴区\",\n\t    \"511024\": \"威远县\",\n\t    \"511025\": \"资中县\",\n\t    \"511028\": \"隆昌县\",\n\t    \"511029\": \"其它区\",\n\t    \"511100\": \"乐山市\",\n\t    \"511102\": \"市中区\",\n\t    \"511111\": \"沙湾区\",\n\t    \"511112\": \"五通桥区\",\n\t    \"511113\": \"金口河区\",\n\t    \"511123\": \"犍为县\",\n\t    \"511124\": \"井研县\",\n\t    \"511126\": \"夹江县\",\n\t    \"511129\": \"沐川县\",\n\t    \"511132\": \"峨边彝族自治县\",\n\t    \"511133\": \"马边彝族自治县\",\n\t    \"511181\": \"峨眉山市\",\n\t    \"511182\": \"其它区\",\n\t    \"511300\": \"南充市\",\n\t    \"511302\": \"顺庆区\",\n\t    \"511303\": \"高坪区\",\n\t    \"511304\": \"嘉陵区\",\n\t    \"511321\": \"南部县\",\n\t    \"511322\": \"营山县\",\n\t    \"511323\": \"蓬安县\",\n\t    \"511324\": \"仪陇县\",\n\t    \"511325\": \"西充县\",\n\t    \"511381\": \"阆中市\",\n\t    \"511382\": \"其它区\",\n\t    \"511400\": \"眉山市\",\n\t    \"511402\": \"东坡区\",\n\t    \"511421\": \"仁寿县\",\n\t    \"511422\": \"彭山县\",\n\t    \"511423\": \"洪雅县\",\n\t    \"511424\": \"丹棱县\",\n\t    \"511425\": \"青神县\",\n\t    \"511426\": \"其它区\",\n\t    \"511500\": \"宜宾市\",\n\t    \"511502\": \"翠屏区\",\n\t    \"511521\": \"宜宾县\",\n\t    \"511522\": \"南溪区\",\n\t    \"511523\": \"江安县\",\n\t    \"511524\": \"长宁县\",\n\t    \"511525\": \"高县\",\n\t    \"511526\": \"珙县\",\n\t    \"511527\": \"筠连县\",\n\t    \"511528\": \"兴文县\",\n\t    \"511529\": \"屏山县\",\n\t    \"511530\": \"其它区\",\n\t    \"511600\": \"广安市\",\n\t    \"511602\": \"广安区\",\n\t    \"511603\": \"前锋区\",\n\t    \"511621\": \"岳池县\",\n\t    \"511622\": \"武胜县\",\n\t    \"511623\": \"邻水县\",\n\t    \"511681\": \"华蓥市\",\n\t    \"511683\": \"其它区\",\n\t    \"511700\": \"达州市\",\n\t    \"511702\": \"通川区\",\n\t    \"511721\": \"达川区\",\n\t    \"511722\": \"宣汉县\",\n\t    \"511723\": \"开江县\",\n\t    \"511724\": \"大竹县\",\n\t    \"511725\": \"渠县\",\n\t    \"511781\": \"万源市\",\n\t    \"511782\": \"其它区\",\n\t    \"511800\": \"雅安市\",\n\t    \"511802\": \"雨城区\",\n\t    \"511821\": \"名山区\",\n\t    \"511822\": \"荥经县\",\n\t    \"511823\": \"汉源县\",\n\t    \"511824\": \"石棉县\",\n\t    \"511825\": \"天全县\",\n\t    \"511826\": \"芦山县\",\n\t    \"511827\": \"宝兴县\",\n\t    \"511828\": \"其它区\",\n\t    \"511900\": \"巴中市\",\n\t    \"511902\": \"巴州区\",\n\t    \"511903\": \"恩阳区\",\n\t    \"511921\": \"通江县\",\n\t    \"511922\": \"南江县\",\n\t    \"511923\": \"平昌县\",\n\t    \"511924\": \"其它区\",\n\t    \"512000\": \"资阳市\",\n\t    \"512002\": \"雁江区\",\n\t    \"512021\": \"安岳县\",\n\t    \"512022\": \"乐至县\",\n\t    \"512081\": \"简阳市\",\n\t    \"512082\": \"其它区\",\n\t    \"513200\": \"阿坝藏族羌族自治州\",\n\t    \"513221\": \"汶川县\",\n\t    \"513222\": \"理县\",\n\t    \"513223\": \"茂县\",\n\t    \"513224\": \"松潘县\",\n\t    \"513225\": \"九寨沟县\",\n\t    \"513226\": \"金川县\",\n\t    \"513227\": \"小金县\",\n\t    \"513228\": \"黑水县\",\n\t    \"513229\": \"马尔康县\",\n\t    \"513230\": \"壤塘县\",\n\t    \"513231\": \"阿坝县\",\n\t    \"513232\": \"若尔盖县\",\n\t    \"513233\": \"红原县\",\n\t    \"513234\": \"其它区\",\n\t    \"513300\": \"甘孜藏族自治州\",\n\t    \"513321\": \"康定县\",\n\t    \"513322\": \"泸定县\",\n\t    \"513323\": \"丹巴县\",\n\t    \"513324\": \"九龙县\",\n\t    \"513325\": \"雅江县\",\n\t    \"513326\": \"道孚县\",\n\t    \"513327\": \"炉霍县\",\n\t    \"513328\": \"甘孜县\",\n\t    \"513329\": \"新龙县\",\n\t    \"513330\": \"德格县\",\n\t    \"513331\": \"白玉县\",\n\t    \"513332\": \"石渠县\",\n\t    \"513333\": \"色达县\",\n\t    \"513334\": \"理塘县\",\n\t    \"513335\": \"巴塘县\",\n\t    \"513336\": \"乡城县\",\n\t    \"513337\": \"稻城县\",\n\t    \"513338\": \"得荣县\",\n\t    \"513339\": \"其它区\",\n\t    \"513400\": \"凉山彝族自治州\",\n\t    \"513401\": \"西昌市\",\n\t    \"513422\": \"木里藏族自治县\",\n\t    \"513423\": \"盐源县\",\n\t    \"513424\": \"德昌县\",\n\t    \"513425\": \"会理县\",\n\t    \"513426\": \"会东县\",\n\t    \"513427\": \"宁南县\",\n\t    \"513428\": \"普格县\",\n\t    \"513429\": \"布拖县\",\n\t    \"513430\": \"金阳县\",\n\t    \"513431\": \"昭觉县\",\n\t    \"513432\": \"喜德县\",\n\t    \"513433\": \"冕宁县\",\n\t    \"513434\": \"越西县\",\n\t    \"513435\": \"甘洛县\",\n\t    \"513436\": \"美姑县\",\n\t    \"513437\": \"雷波县\",\n\t    \"513438\": \"其它区\",\n\t    \"520000\": \"贵州省\",\n\t    \"520100\": \"贵阳市\",\n\t    \"520102\": \"南明区\",\n\t    \"520103\": \"云岩区\",\n\t    \"520111\": \"花溪区\",\n\t    \"520112\": \"乌当区\",\n\t    \"520113\": \"白云区\",\n\t    \"520121\": \"开阳县\",\n\t    \"520122\": \"息烽县\",\n\t    \"520123\": \"修文县\",\n\t    \"520151\": \"观山湖区\",\n\t    \"520181\": \"清镇市\",\n\t    \"520182\": \"其它区\",\n\t    \"520200\": \"六盘水市\",\n\t    \"520201\": \"钟山区\",\n\t    \"520203\": \"六枝特区\",\n\t    \"520221\": \"水城县\",\n\t    \"520222\": \"盘县\",\n\t    \"520223\": \"其它区\",\n\t    \"520300\": \"遵义市\",\n\t    \"520302\": \"红花岗区\",\n\t    \"520303\": \"汇川区\",\n\t    \"520321\": \"遵义县\",\n\t    \"520322\": \"桐梓县\",\n\t    \"520323\": \"绥阳县\",\n\t    \"520324\": \"正安县\",\n\t    \"520325\": \"道真仡佬族苗族自治县\",\n\t    \"520326\": \"务川仡佬族苗族自治县\",\n\t    \"520327\": \"凤冈县\",\n\t    \"520328\": \"湄潭县\",\n\t    \"520329\": \"余庆县\",\n\t    \"520330\": \"习水县\",\n\t    \"520381\": \"赤水市\",\n\t    \"520382\": \"仁怀市\",\n\t    \"520383\": \"其它区\",\n\t    \"520400\": \"安顺市\",\n\t    \"520402\": \"西秀区\",\n\t    \"520421\": \"平坝县\",\n\t    \"520422\": \"普定县\",\n\t    \"520423\": \"镇宁布依族苗族自治县\",\n\t    \"520424\": \"关岭布依族苗族自治县\",\n\t    \"520425\": \"紫云苗族布依族自治县\",\n\t    \"520426\": \"其它区\",\n\t    \"522200\": \"铜仁市\",\n\t    \"522201\": \"碧江区\",\n\t    \"522222\": \"江口县\",\n\t    \"522223\": \"玉屏侗族自治县\",\n\t    \"522224\": \"石阡县\",\n\t    \"522225\": \"思南县\",\n\t    \"522226\": \"印江土家族苗族自治县\",\n\t    \"522227\": \"德江县\",\n\t    \"522228\": \"沿河土家族自治县\",\n\t    \"522229\": \"松桃苗族自治县\",\n\t    \"522230\": \"万山区\",\n\t    \"522231\": \"其它区\",\n\t    \"522300\": \"黔西南布依族苗族自治州\",\n\t    \"522301\": \"兴义市\",\n\t    \"522322\": \"兴仁县\",\n\t    \"522323\": \"普安县\",\n\t    \"522324\": \"晴隆县\",\n\t    \"522325\": \"贞丰县\",\n\t    \"522326\": \"望谟县\",\n\t    \"522327\": \"册亨县\",\n\t    \"522328\": \"安龙县\",\n\t    \"522329\": \"其它区\",\n\t    \"522400\": \"毕节市\",\n\t    \"522401\": \"七星关区\",\n\t    \"522422\": \"大方县\",\n\t    \"522423\": \"黔西县\",\n\t    \"522424\": \"金沙县\",\n\t    \"522425\": \"织金县\",\n\t    \"522426\": \"纳雍县\",\n\t    \"522427\": \"威宁彝族回族苗族自治县\",\n\t    \"522428\": \"赫章县\",\n\t    \"522429\": \"其它区\",\n\t    \"522600\": \"黔东南苗族侗族自治州\",\n\t    \"522601\": \"凯里市\",\n\t    \"522622\": \"黄平县\",\n\t    \"522623\": \"施秉县\",\n\t    \"522624\": \"三穗县\",\n\t    \"522625\": \"镇远县\",\n\t    \"522626\": \"岑巩县\",\n\t    \"522627\": \"天柱县\",\n\t    \"522628\": \"锦屏县\",\n\t    \"522629\": \"剑河县\",\n\t    \"522630\": \"台江县\",\n\t    \"522631\": \"黎平县\",\n\t    \"522632\": \"榕江县\",\n\t    \"522633\": \"从江县\",\n\t    \"522634\": \"雷山县\",\n\t    \"522635\": \"麻江县\",\n\t    \"522636\": \"丹寨县\",\n\t    \"522637\": \"其它区\",\n\t    \"522700\": \"黔南布依族苗族自治州\",\n\t    \"522701\": \"都匀市\",\n\t    \"522702\": \"福泉市\",\n\t    \"522722\": \"荔波县\",\n\t    \"522723\": \"贵定县\",\n\t    \"522725\": \"瓮安县\",\n\t    \"522726\": \"独山县\",\n\t    \"522727\": \"平塘县\",\n\t    \"522728\": \"罗甸县\",\n\t    \"522729\": \"长顺县\",\n\t    \"522730\": \"龙里县\",\n\t    \"522731\": \"惠水县\",\n\t    \"522732\": \"三都水族自治县\",\n\t    \"522733\": \"其它区\",\n\t    \"530000\": \"云南省\",\n\t    \"530100\": \"昆明市\",\n\t    \"530102\": \"五华区\",\n\t    \"530103\": \"盘龙区\",\n\t    \"530111\": \"官渡区\",\n\t    \"530112\": \"西山区\",\n\t    \"530113\": \"东川区\",\n\t    \"530121\": \"呈贡区\",\n\t    \"530122\": \"晋宁县\",\n\t    \"530124\": \"富民县\",\n\t    \"530125\": \"宜良县\",\n\t    \"530126\": \"石林彝族自治县\",\n\t    \"530127\": \"嵩明县\",\n\t    \"530128\": \"禄劝彝族苗族自治县\",\n\t    \"530129\": \"寻甸回族彝族自治县\",\n\t    \"530181\": \"安宁市\",\n\t    \"530182\": \"其它区\",\n\t    \"530300\": \"曲靖市\",\n\t    \"530302\": \"麒麟区\",\n\t    \"530321\": \"马龙县\",\n\t    \"530322\": \"陆良县\",\n\t    \"530323\": \"师宗县\",\n\t    \"530324\": \"罗平县\",\n\t    \"530325\": \"富源县\",\n\t    \"530326\": \"会泽县\",\n\t    \"530328\": \"沾益县\",\n\t    \"530381\": \"宣威市\",\n\t    \"530382\": \"其它区\",\n\t    \"530400\": \"玉溪市\",\n\t    \"530402\": \"红塔区\",\n\t    \"530421\": \"江川县\",\n\t    \"530422\": \"澄江县\",\n\t    \"530423\": \"通海县\",\n\t    \"530424\": \"华宁县\",\n\t    \"530425\": \"易门县\",\n\t    \"530426\": \"峨山彝族自治县\",\n\t    \"530427\": \"新平彝族傣族自治县\",\n\t    \"530428\": \"元江哈尼族彝族傣族自治县\",\n\t    \"530429\": \"其它区\",\n\t    \"530500\": \"保山市\",\n\t    \"530502\": \"隆阳区\",\n\t    \"530521\": \"施甸县\",\n\t    \"530522\": \"腾冲县\",\n\t    \"530523\": \"龙陵县\",\n\t    \"530524\": \"昌宁县\",\n\t    \"530525\": \"其它区\",\n\t    \"530600\": \"昭通市\",\n\t    \"530602\": \"昭阳区\",\n\t    \"530621\": \"鲁甸县\",\n\t    \"530622\": \"巧家县\",\n\t    \"530623\": \"盐津县\",\n\t    \"530624\": \"大关县\",\n\t    \"530625\": \"永善县\",\n\t    \"530626\": \"绥江县\",\n\t    \"530627\": \"镇雄县\",\n\t    \"530628\": \"彝良县\",\n\t    \"530629\": \"威信县\",\n\t    \"530630\": \"水富县\",\n\t    \"530631\": \"其它区\",\n\t    \"530700\": \"丽江市\",\n\t    \"530702\": \"古城区\",\n\t    \"530721\": \"玉龙纳西族自治县\",\n\t    \"530722\": \"永胜县\",\n\t    \"530723\": \"华坪县\",\n\t    \"530724\": \"宁蒗彝族自治县\",\n\t    \"530725\": \"其它区\",\n\t    \"530800\": \"普洱市\",\n\t    \"530802\": \"思茅区\",\n\t    \"530821\": \"宁洱哈尼族彝族自治县\",\n\t    \"530822\": \"墨江哈尼族自治县\",\n\t    \"530823\": \"景东彝族自治县\",\n\t    \"530824\": \"景谷傣族彝族自治县\",\n\t    \"530825\": \"镇沅彝族哈尼族拉祜族自治县\",\n\t    \"530826\": \"江城哈尼族彝族自治县\",\n\t    \"530827\": \"孟连傣族拉祜族佤族自治县\",\n\t    \"530828\": \"澜沧拉祜族自治县\",\n\t    \"530829\": \"西盟佤族自治县\",\n\t    \"530830\": \"其它区\",\n\t    \"530900\": \"临沧市\",\n\t    \"530902\": \"临翔区\",\n\t    \"530921\": \"凤庆县\",\n\t    \"530922\": \"云县\",\n\t    \"530923\": \"永德县\",\n\t    \"530924\": \"镇康县\",\n\t    \"530925\": \"双江拉祜族佤族布朗族傣族自治县\",\n\t    \"530926\": \"耿马傣族佤族自治县\",\n\t    \"530927\": \"沧源佤族自治县\",\n\t    \"530928\": \"其它区\",\n\t    \"532300\": \"楚雄彝族自治州\",\n\t    \"532301\": \"楚雄市\",\n\t    \"532322\": \"双柏县\",\n\t    \"532323\": \"牟定县\",\n\t    \"532324\": \"南华县\",\n\t    \"532325\": \"姚安县\",\n\t    \"532326\": \"大姚县\",\n\t    \"532327\": \"永仁县\",\n\t    \"532328\": \"元谋县\",\n\t    \"532329\": \"武定县\",\n\t    \"532331\": \"禄丰县\",\n\t    \"532332\": \"其它区\",\n\t    \"532500\": \"红河哈尼族彝族自治州\",\n\t    \"532501\": \"个旧市\",\n\t    \"532502\": \"开远市\",\n\t    \"532522\": \"蒙自市\",\n\t    \"532523\": \"屏边苗族自治县\",\n\t    \"532524\": \"建水县\",\n\t    \"532525\": \"石屏县\",\n\t    \"532526\": \"弥勒市\",\n\t    \"532527\": \"泸西县\",\n\t    \"532528\": \"元阳县\",\n\t    \"532529\": \"红河县\",\n\t    \"532530\": \"金平苗族瑶族傣族自治县\",\n\t    \"532531\": \"绿春县\",\n\t    \"532532\": \"河口瑶族自治县\",\n\t    \"532533\": \"其它区\",\n\t    \"532600\": \"文山壮族苗族自治州\",\n\t    \"532621\": \"文山市\",\n\t    \"532622\": \"砚山县\",\n\t    \"532623\": \"西畴县\",\n\t    \"532624\": \"麻栗坡县\",\n\t    \"532625\": \"马关县\",\n\t    \"532626\": \"丘北县\",\n\t    \"532627\": \"广南县\",\n\t    \"532628\": \"富宁县\",\n\t    \"532629\": \"其它区\",\n\t    \"532800\": \"西双版纳傣族自治州\",\n\t    \"532801\": \"景洪市\",\n\t    \"532822\": \"勐海县\",\n\t    \"532823\": \"勐腊县\",\n\t    \"532824\": \"其它区\",\n\t    \"532900\": \"大理白族自治州\",\n\t    \"532901\": \"大理市\",\n\t    \"532922\": \"漾濞彝族自治县\",\n\t    \"532923\": \"祥云县\",\n\t    \"532924\": \"宾川县\",\n\t    \"532925\": \"弥渡县\",\n\t    \"532926\": \"南涧彝族自治县\",\n\t    \"532927\": \"巍山彝族回族自治县\",\n\t    \"532928\": \"永平县\",\n\t    \"532929\": \"云龙县\",\n\t    \"532930\": \"洱源县\",\n\t    \"532931\": \"剑川县\",\n\t    \"532932\": \"鹤庆县\",\n\t    \"532933\": \"其它区\",\n\t    \"533100\": \"德宏傣族景颇族自治州\",\n\t    \"533102\": \"瑞丽市\",\n\t    \"533103\": \"芒市\",\n\t    \"533122\": \"梁河县\",\n\t    \"533123\": \"盈江县\",\n\t    \"533124\": \"陇川县\",\n\t    \"533125\": \"其它区\",\n\t    \"533300\": \"怒江傈僳族自治州\",\n\t    \"533321\": \"泸水县\",\n\t    \"533323\": \"福贡县\",\n\t    \"533324\": \"贡山独龙族怒族自治县\",\n\t    \"533325\": \"兰坪白族普米族自治县\",\n\t    \"533326\": \"其它区\",\n\t    \"533400\": \"迪庆藏族自治州\",\n\t    \"533421\": \"香格里拉县\",\n\t    \"533422\": \"德钦县\",\n\t    \"533423\": \"维西傈僳族自治县\",\n\t    \"533424\": \"其它区\",\n\t    \"540000\": \"西藏自治区\",\n\t    \"540100\": \"拉萨市\",\n\t    \"540102\": \"城关区\",\n\t    \"540121\": \"林周县\",\n\t    \"540122\": \"当雄县\",\n\t    \"540123\": \"尼木县\",\n\t    \"540124\": \"曲水县\",\n\t    \"540125\": \"堆龙德庆县\",\n\t    \"540126\": \"达孜县\",\n\t    \"540127\": \"墨竹工卡县\",\n\t    \"540128\": \"其它区\",\n\t    \"542100\": \"昌都地区\",\n\t    \"542121\": \"昌都县\",\n\t    \"542122\": \"江达县\",\n\t    \"542123\": \"贡觉县\",\n\t    \"542124\": \"类乌齐县\",\n\t    \"542125\": \"丁青县\",\n\t    \"542126\": \"察雅县\",\n\t    \"542127\": \"八宿县\",\n\t    \"542128\": \"左贡县\",\n\t    \"542129\": \"芒康县\",\n\t    \"542132\": \"洛隆县\",\n\t    \"542133\": \"边坝县\",\n\t    \"542134\": \"其它区\",\n\t    \"542200\": \"山南地区\",\n\t    \"542221\": \"乃东县\",\n\t    \"542222\": \"扎囊县\",\n\t    \"542223\": \"贡嘎县\",\n\t    \"542224\": \"桑日县\",\n\t    \"542225\": \"琼结县\",\n\t    \"542226\": \"曲松县\",\n\t    \"542227\": \"措美县\",\n\t    \"542228\": \"洛扎县\",\n\t    \"542229\": \"加查县\",\n\t    \"542231\": \"隆子县\",\n\t    \"542232\": \"错那县\",\n\t    \"542233\": \"浪卡子县\",\n\t    \"542234\": \"其它区\",\n\t    \"542300\": \"日喀则地区\",\n\t    \"542301\": \"日喀则市\",\n\t    \"542322\": \"南木林县\",\n\t    \"542323\": \"江孜县\",\n\t    \"542324\": \"定日县\",\n\t    \"542325\": \"萨迦县\",\n\t    \"542326\": \"拉孜县\",\n\t    \"542327\": \"昂仁县\",\n\t    \"542328\": \"谢通门县\",\n\t    \"542329\": \"白朗县\",\n\t    \"542330\": \"仁布县\",\n\t    \"542331\": \"康马县\",\n\t    \"542332\": \"定结县\",\n\t    \"542333\": \"仲巴县\",\n\t    \"542334\": \"亚东县\",\n\t    \"542335\": \"吉隆县\",\n\t    \"542336\": \"聂拉木县\",\n\t    \"542337\": \"萨嘎县\",\n\t    \"542338\": \"岗巴县\",\n\t    \"542339\": \"其它区\",\n\t    \"542400\": \"那曲地区\",\n\t    \"542421\": \"那曲县\",\n\t    \"542422\": \"嘉黎县\",\n\t    \"542423\": \"比如县\",\n\t    \"542424\": \"聂荣县\",\n\t    \"542425\": \"安多县\",\n\t    \"542426\": \"申扎县\",\n\t    \"542427\": \"索县\",\n\t    \"542428\": \"班戈县\",\n\t    \"542429\": \"巴青县\",\n\t    \"542430\": \"尼玛县\",\n\t    \"542431\": \"其它区\",\n\t    \"542432\": \"双湖县\",\n\t    \"542500\": \"阿里地区\",\n\t    \"542521\": \"普兰县\",\n\t    \"542522\": \"札达县\",\n\t    \"542523\": \"噶尔县\",\n\t    \"542524\": \"日土县\",\n\t    \"542525\": \"革吉县\",\n\t    \"542526\": \"改则县\",\n\t    \"542527\": \"措勤县\",\n\t    \"542528\": \"其它区\",\n\t    \"542600\": \"林芝地区\",\n\t    \"542621\": \"林芝县\",\n\t    \"542622\": \"工布江达县\",\n\t    \"542623\": \"米林县\",\n\t    \"542624\": \"墨脱县\",\n\t    \"542625\": \"波密县\",\n\t    \"542626\": \"察隅县\",\n\t    \"542627\": \"朗县\",\n\t    \"542628\": \"其它区\",\n\t    \"610000\": \"陕西省\",\n\t    \"610100\": \"西安市\",\n\t    \"610102\": \"新城区\",\n\t    \"610103\": \"碑林区\",\n\t    \"610104\": \"莲湖区\",\n\t    \"610111\": \"灞桥区\",\n\t    \"610112\": \"未央区\",\n\t    \"610113\": \"雁塔区\",\n\t    \"610114\": \"阎良区\",\n\t    \"610115\": \"临潼区\",\n\t    \"610116\": \"长安区\",\n\t    \"610122\": \"蓝田县\",\n\t    \"610124\": \"周至县\",\n\t    \"610125\": \"户县\",\n\t    \"610126\": \"高陵县\",\n\t    \"610127\": \"其它区\",\n\t    \"610200\": \"铜川市\",\n\t    \"610202\": \"王益区\",\n\t    \"610203\": \"印台区\",\n\t    \"610204\": \"耀州区\",\n\t    \"610222\": \"宜君县\",\n\t    \"610223\": \"其它区\",\n\t    \"610300\": \"宝鸡市\",\n\t    \"610302\": \"渭滨区\",\n\t    \"610303\": \"金台区\",\n\t    \"610304\": \"陈仓区\",\n\t    \"610322\": \"凤翔县\",\n\t    \"610323\": \"岐山县\",\n\t    \"610324\": \"扶风县\",\n\t    \"610326\": \"眉县\",\n\t    \"610327\": \"陇县\",\n\t    \"610328\": \"千阳县\",\n\t    \"610329\": \"麟游县\",\n\t    \"610330\": \"凤县\",\n\t    \"610331\": \"太白县\",\n\t    \"610332\": \"其它区\",\n\t    \"610400\": \"咸阳市\",\n\t    \"610402\": \"秦都区\",\n\t    \"610403\": \"杨陵区\",\n\t    \"610404\": \"渭城区\",\n\t    \"610422\": \"三原县\",\n\t    \"610423\": \"泾阳县\",\n\t    \"610424\": \"乾县\",\n\t    \"610425\": \"礼泉县\",\n\t    \"610426\": \"永寿县\",\n\t    \"610427\": \"彬县\",\n\t    \"610428\": \"长武县\",\n\t    \"610429\": \"旬邑县\",\n\t    \"610430\": \"淳化县\",\n\t    \"610431\": \"武功县\",\n\t    \"610481\": \"兴平市\",\n\t    \"610482\": \"其它区\",\n\t    \"610500\": \"渭南市\",\n\t    \"610502\": \"临渭区\",\n\t    \"610521\": \"华县\",\n\t    \"610522\": \"潼关县\",\n\t    \"610523\": \"大荔县\",\n\t    \"610524\": \"合阳县\",\n\t    \"610525\": \"澄城县\",\n\t    \"610526\": \"蒲城县\",\n\t    \"610527\": \"白水县\",\n\t    \"610528\": \"富平县\",\n\t    \"610581\": \"韩城市\",\n\t    \"610582\": \"华阴市\",\n\t    \"610583\": \"其它区\",\n\t    \"610600\": \"延安市\",\n\t    \"610602\": \"宝塔区\",\n\t    \"610621\": \"延长县\",\n\t    \"610622\": \"延川县\",\n\t    \"610623\": \"子长县\",\n\t    \"610624\": \"安塞县\",\n\t    \"610625\": \"志丹县\",\n\t    \"610626\": \"吴起县\",\n\t    \"610627\": \"甘泉县\",\n\t    \"610628\": \"富县\",\n\t    \"610629\": \"洛川县\",\n\t    \"610630\": \"宜川县\",\n\t    \"610631\": \"黄龙县\",\n\t    \"610632\": \"黄陵县\",\n\t    \"610633\": \"其它区\",\n\t    \"610700\": \"汉中市\",\n\t    \"610702\": \"汉台区\",\n\t    \"610721\": \"南郑县\",\n\t    \"610722\": \"城固县\",\n\t    \"610723\": \"洋县\",\n\t    \"610724\": \"西乡县\",\n\t    \"610725\": \"勉县\",\n\t    \"610726\": \"宁强县\",\n\t    \"610727\": \"略阳县\",\n\t    \"610728\": \"镇巴县\",\n\t    \"610729\": \"留坝县\",\n\t    \"610730\": \"佛坪县\",\n\t    \"610731\": \"其它区\",\n\t    \"610800\": \"榆林市\",\n\t    \"610802\": \"榆阳区\",\n\t    \"610821\": \"神木县\",\n\t    \"610822\": \"府谷县\",\n\t    \"610823\": \"横山县\",\n\t    \"610824\": \"靖边县\",\n\t    \"610825\": \"定边县\",\n\t    \"610826\": \"绥德县\",\n\t    \"610827\": \"米脂县\",\n\t    \"610828\": \"佳县\",\n\t    \"610829\": \"吴堡县\",\n\t    \"610830\": \"清涧县\",\n\t    \"610831\": \"子洲县\",\n\t    \"610832\": \"其它区\",\n\t    \"610900\": \"安康市\",\n\t    \"610902\": \"汉滨区\",\n\t    \"610921\": \"汉阴县\",\n\t    \"610922\": \"石泉县\",\n\t    \"610923\": \"宁陕县\",\n\t    \"610924\": \"紫阳县\",\n\t    \"610925\": \"岚皋县\",\n\t    \"610926\": \"平利县\",\n\t    \"610927\": \"镇坪县\",\n\t    \"610928\": \"旬阳县\",\n\t    \"610929\": \"白河县\",\n\t    \"610930\": \"其它区\",\n\t    \"611000\": \"商洛市\",\n\t    \"611002\": \"商州区\",\n\t    \"611021\": \"洛南县\",\n\t    \"611022\": \"丹凤县\",\n\t    \"611023\": \"商南县\",\n\t    \"611024\": \"山阳县\",\n\t    \"611025\": \"镇安县\",\n\t    \"611026\": \"柞水县\",\n\t    \"611027\": \"其它区\",\n\t    \"620000\": \"甘肃省\",\n\t    \"620100\": \"兰州市\",\n\t    \"620102\": \"城关区\",\n\t    \"620103\": \"七里河区\",\n\t    \"620104\": \"西固区\",\n\t    \"620105\": \"安宁区\",\n\t    \"620111\": \"红古区\",\n\t    \"620121\": \"永登县\",\n\t    \"620122\": \"皋兰县\",\n\t    \"620123\": \"榆中县\",\n\t    \"620124\": \"其它区\",\n\t    \"620200\": \"嘉峪关市\",\n\t    \"620300\": \"金昌市\",\n\t    \"620302\": \"金川区\",\n\t    \"620321\": \"永昌县\",\n\t    \"620322\": \"其它区\",\n\t    \"620400\": \"白银市\",\n\t    \"620402\": \"白银区\",\n\t    \"620403\": \"平川区\",\n\t    \"620421\": \"靖远县\",\n\t    \"620422\": \"会宁县\",\n\t    \"620423\": \"景泰县\",\n\t    \"620424\": \"其它区\",\n\t    \"620500\": \"天水市\",\n\t    \"620502\": \"秦州区\",\n\t    \"620503\": \"麦积区\",\n\t    \"620521\": \"清水县\",\n\t    \"620522\": \"秦安县\",\n\t    \"620523\": \"甘谷县\",\n\t    \"620524\": \"武山县\",\n\t    \"620525\": \"张家川回族自治县\",\n\t    \"620526\": \"其它区\",\n\t    \"620600\": \"武威市\",\n\t    \"620602\": \"凉州区\",\n\t    \"620621\": \"民勤县\",\n\t    \"620622\": \"古浪县\",\n\t    \"620623\": \"天祝藏族自治县\",\n\t    \"620624\": \"其它区\",\n\t    \"620700\": \"张掖市\",\n\t    \"620702\": \"甘州区\",\n\t    \"620721\": \"肃南裕固族自治县\",\n\t    \"620722\": \"民乐县\",\n\t    \"620723\": \"临泽县\",\n\t    \"620724\": \"高台县\",\n\t    \"620725\": \"山丹县\",\n\t    \"620726\": \"其它区\",\n\t    \"620800\": \"平凉市\",\n\t    \"620802\": \"崆峒区\",\n\t    \"620821\": \"泾川县\",\n\t    \"620822\": \"灵台县\",\n\t    \"620823\": \"崇信县\",\n\t    \"620824\": \"华亭县\",\n\t    \"620825\": \"庄浪县\",\n\t    \"620826\": \"静宁县\",\n\t    \"620827\": \"其它区\",\n\t    \"620900\": \"酒泉市\",\n\t    \"620902\": \"肃州区\",\n\t    \"620921\": \"金塔县\",\n\t    \"620922\": \"瓜州县\",\n\t    \"620923\": \"肃北蒙古族自治县\",\n\t    \"620924\": \"阿克塞哈萨克族自治县\",\n\t    \"620981\": \"玉门市\",\n\t    \"620982\": \"敦煌市\",\n\t    \"620983\": \"其它区\",\n\t    \"621000\": \"庆阳市\",\n\t    \"621002\": \"西峰区\",\n\t    \"621021\": \"庆城县\",\n\t    \"621022\": \"环县\",\n\t    \"621023\": \"华池县\",\n\t    \"621024\": \"合水县\",\n\t    \"621025\": \"正宁县\",\n\t    \"621026\": \"宁县\",\n\t    \"621027\": \"镇原县\",\n\t    \"621028\": \"其它区\",\n\t    \"621100\": \"定西市\",\n\t    \"621102\": \"安定区\",\n\t    \"621121\": \"通渭县\",\n\t    \"621122\": \"陇西县\",\n\t    \"621123\": \"渭源县\",\n\t    \"621124\": \"临洮县\",\n\t    \"621125\": \"漳县\",\n\t    \"621126\": \"岷县\",\n\t    \"621127\": \"其它区\",\n\t    \"621200\": \"陇南市\",\n\t    \"621202\": \"武都区\",\n\t    \"621221\": \"成县\",\n\t    \"621222\": \"文县\",\n\t    \"621223\": \"宕昌县\",\n\t    \"621224\": \"康县\",\n\t    \"621225\": \"西和县\",\n\t    \"621226\": \"礼县\",\n\t    \"621227\": \"徽县\",\n\t    \"621228\": \"两当县\",\n\t    \"621229\": \"其它区\",\n\t    \"622900\": \"临夏回族自治州\",\n\t    \"622901\": \"临夏市\",\n\t    \"622921\": \"临夏县\",\n\t    \"622922\": \"康乐县\",\n\t    \"622923\": \"永靖县\",\n\t    \"622924\": \"广河县\",\n\t    \"622925\": \"和政县\",\n\t    \"622926\": \"东乡族自治县\",\n\t    \"622927\": \"积石山保安族东乡族撒拉族自治县\",\n\t    \"622928\": \"其它区\",\n\t    \"623000\": \"甘南藏族自治州\",\n\t    \"623001\": \"合作市\",\n\t    \"623021\": \"临潭县\",\n\t    \"623022\": \"卓尼县\",\n\t    \"623023\": \"舟曲县\",\n\t    \"623024\": \"迭部县\",\n\t    \"623025\": \"玛曲县\",\n\t    \"623026\": \"碌曲县\",\n\t    \"623027\": \"夏河县\",\n\t    \"623028\": \"其它区\",\n\t    \"630000\": \"青海省\",\n\t    \"630100\": \"西宁市\",\n\t    \"630102\": \"城东区\",\n\t    \"630103\": \"城中区\",\n\t    \"630104\": \"城西区\",\n\t    \"630105\": \"城北区\",\n\t    \"630121\": \"大通回族土族自治县\",\n\t    \"630122\": \"湟中县\",\n\t    \"630123\": \"湟源县\",\n\t    \"630124\": \"其它区\",\n\t    \"632100\": \"海东市\",\n\t    \"632121\": \"平安县\",\n\t    \"632122\": \"民和回族土族自治县\",\n\t    \"632123\": \"乐都区\",\n\t    \"632126\": \"互助土族自治县\",\n\t    \"632127\": \"化隆回族自治县\",\n\t    \"632128\": \"循化撒拉族自治县\",\n\t    \"632129\": \"其它区\",\n\t    \"632200\": \"海北藏族自治州\",\n\t    \"632221\": \"门源回族自治县\",\n\t    \"632222\": \"祁连县\",\n\t    \"632223\": \"海晏县\",\n\t    \"632224\": \"刚察县\",\n\t    \"632225\": \"其它区\",\n\t    \"632300\": \"黄南藏族自治州\",\n\t    \"632321\": \"同仁县\",\n\t    \"632322\": \"尖扎县\",\n\t    \"632323\": \"泽库县\",\n\t    \"632324\": \"河南蒙古族自治县\",\n\t    \"632325\": \"其它区\",\n\t    \"632500\": \"海南藏族自治州\",\n\t    \"632521\": \"共和县\",\n\t    \"632522\": \"同德县\",\n\t    \"632523\": \"贵德县\",\n\t    \"632524\": \"兴海县\",\n\t    \"632525\": \"贵南县\",\n\t    \"632526\": \"其它区\",\n\t    \"632600\": \"果洛藏族自治州\",\n\t    \"632621\": \"玛沁县\",\n\t    \"632622\": \"班玛县\",\n\t    \"632623\": \"甘德县\",\n\t    \"632624\": \"达日县\",\n\t    \"632625\": \"久治县\",\n\t    \"632626\": \"玛多县\",\n\t    \"632627\": \"其它区\",\n\t    \"632700\": \"玉树藏族自治州\",\n\t    \"632721\": \"玉树市\",\n\t    \"632722\": \"杂多县\",\n\t    \"632723\": \"称多县\",\n\t    \"632724\": \"治多县\",\n\t    \"632725\": \"囊谦县\",\n\t    \"632726\": \"曲麻莱县\",\n\t    \"632727\": \"其它区\",\n\t    \"632800\": \"海西蒙古族藏族自治州\",\n\t    \"632801\": \"格尔木市\",\n\t    \"632802\": \"德令哈市\",\n\t    \"632821\": \"乌兰县\",\n\t    \"632822\": \"都兰县\",\n\t    \"632823\": \"天峻县\",\n\t    \"632824\": \"其它区\",\n\t    \"640000\": \"宁夏回族自治区\",\n\t    \"640100\": \"银川市\",\n\t    \"640104\": \"兴庆区\",\n\t    \"640105\": \"西夏区\",\n\t    \"640106\": \"金凤区\",\n\t    \"640121\": \"永宁县\",\n\t    \"640122\": \"贺兰县\",\n\t    \"640181\": \"灵武市\",\n\t    \"640182\": \"其它区\",\n\t    \"640200\": \"石嘴山市\",\n\t    \"640202\": \"大武口区\",\n\t    \"640205\": \"惠农区\",\n\t    \"640221\": \"平罗县\",\n\t    \"640222\": \"其它区\",\n\t    \"640300\": \"吴忠市\",\n\t    \"640302\": \"利通区\",\n\t    \"640303\": \"红寺堡区\",\n\t    \"640323\": \"盐池县\",\n\t    \"640324\": \"同心县\",\n\t    \"640381\": \"青铜峡市\",\n\t    \"640382\": \"其它区\",\n\t    \"640400\": \"固原市\",\n\t    \"640402\": \"原州区\",\n\t    \"640422\": \"西吉县\",\n\t    \"640423\": \"隆德县\",\n\t    \"640424\": \"泾源县\",\n\t    \"640425\": \"彭阳县\",\n\t    \"640426\": \"其它区\",\n\t    \"640500\": \"中卫市\",\n\t    \"640502\": \"沙坡头区\",\n\t    \"640521\": \"中宁县\",\n\t    \"640522\": \"海原县\",\n\t    \"640523\": \"其它区\",\n\t    \"650000\": \"新疆维吾尔自治区\",\n\t    \"650100\": \"乌鲁木齐市\",\n\t    \"650102\": \"天山区\",\n\t    \"650103\": \"沙依巴克区\",\n\t    \"650104\": \"新市区\",\n\t    \"650105\": \"水磨沟区\",\n\t    \"650106\": \"头屯河区\",\n\t    \"650107\": \"达坂城区\",\n\t    \"650109\": \"米东区\",\n\t    \"650121\": \"乌鲁木齐县\",\n\t    \"650122\": \"其它区\",\n\t    \"650200\": \"克拉玛依市\",\n\t    \"650202\": \"独山子区\",\n\t    \"650203\": \"克拉玛依区\",\n\t    \"650204\": \"白碱滩区\",\n\t    \"650205\": \"乌尔禾区\",\n\t    \"650206\": \"其它区\",\n\t    \"652100\": \"吐鲁番地区\",\n\t    \"652101\": \"吐鲁番市\",\n\t    \"652122\": \"鄯善县\",\n\t    \"652123\": \"托克逊县\",\n\t    \"652124\": \"其它区\",\n\t    \"652200\": \"哈密地区\",\n\t    \"652201\": \"哈密市\",\n\t    \"652222\": \"巴里坤哈萨克自治县\",\n\t    \"652223\": \"伊吾县\",\n\t    \"652224\": \"其它区\",\n\t    \"652300\": \"昌吉回族自治州\",\n\t    \"652301\": \"昌吉市\",\n\t    \"652302\": \"阜康市\",\n\t    \"652323\": \"呼图壁县\",\n\t    \"652324\": \"玛纳斯县\",\n\t    \"652325\": \"奇台县\",\n\t    \"652327\": \"吉木萨尔县\",\n\t    \"652328\": \"木垒哈萨克自治县\",\n\t    \"652329\": \"其它区\",\n\t    \"652700\": \"博尔塔拉蒙古自治州\",\n\t    \"652701\": \"博乐市\",\n\t    \"652702\": \"阿拉山口市\",\n\t    \"652722\": \"精河县\",\n\t    \"652723\": \"温泉县\",\n\t    \"652724\": \"其它区\",\n\t    \"652800\": \"巴音郭楞蒙古自治州\",\n\t    \"652801\": \"库尔勒市\",\n\t    \"652822\": \"轮台县\",\n\t    \"652823\": \"尉犁县\",\n\t    \"652824\": \"若羌县\",\n\t    \"652825\": \"且末县\",\n\t    \"652826\": \"焉耆回族自治县\",\n\t    \"652827\": \"和静县\",\n\t    \"652828\": \"和硕县\",\n\t    \"652829\": \"博湖县\",\n\t    \"652830\": \"其它区\",\n\t    \"652900\": \"阿克苏地区\",\n\t    \"652901\": \"阿克苏市\",\n\t    \"652922\": \"温宿县\",\n\t    \"652923\": \"库车县\",\n\t    \"652924\": \"沙雅县\",\n\t    \"652925\": \"新和县\",\n\t    \"652926\": \"拜城县\",\n\t    \"652927\": \"乌什县\",\n\t    \"652928\": \"阿瓦提县\",\n\t    \"652929\": \"柯坪县\",\n\t    \"652930\": \"其它区\",\n\t    \"653000\": \"克孜勒苏柯尔克孜自治州\",\n\t    \"653001\": \"阿图什市\",\n\t    \"653022\": \"阿克陶县\",\n\t    \"653023\": \"阿合奇县\",\n\t    \"653024\": \"乌恰县\",\n\t    \"653025\": \"其它区\",\n\t    \"653100\": \"喀什地区\",\n\t    \"653101\": \"喀什市\",\n\t    \"653121\": \"疏附县\",\n\t    \"653122\": \"疏勒县\",\n\t    \"653123\": \"英吉沙县\",\n\t    \"653124\": \"泽普县\",\n\t    \"653125\": \"莎车县\",\n\t    \"653126\": \"叶城县\",\n\t    \"653127\": \"麦盖提县\",\n\t    \"653128\": \"岳普湖县\",\n\t    \"653129\": \"伽师县\",\n\t    \"653130\": \"巴楚县\",\n\t    \"653131\": \"塔什库尔干塔吉克自治县\",\n\t    \"653132\": \"其它区\",\n\t    \"653200\": \"和田地区\",\n\t    \"653201\": \"和田市\",\n\t    \"653221\": \"和田县\",\n\t    \"653222\": \"墨玉县\",\n\t    \"653223\": \"皮山县\",\n\t    \"653224\": \"洛浦县\",\n\t    \"653225\": \"策勒县\",\n\t    \"653226\": \"于田县\",\n\t    \"653227\": \"民丰县\",\n\t    \"653228\": \"其它区\",\n\t    \"654000\": \"伊犁哈萨克自治州\",\n\t    \"654002\": \"伊宁市\",\n\t    \"654003\": \"奎屯市\",\n\t    \"654021\": \"伊宁县\",\n\t    \"654022\": \"察布查尔锡伯自治县\",\n\t    \"654023\": \"霍城县\",\n\t    \"654024\": \"巩留县\",\n\t    \"654025\": \"新源县\",\n\t    \"654026\": \"昭苏县\",\n\t    \"654027\": \"特克斯县\",\n\t    \"654028\": \"尼勒克县\",\n\t    \"654029\": \"其它区\",\n\t    \"654200\": \"塔城地区\",\n\t    \"654201\": \"塔城市\",\n\t    \"654202\": \"乌苏市\",\n\t    \"654221\": \"额敏县\",\n\t    \"654223\": \"沙湾县\",\n\t    \"654224\": \"托里县\",\n\t    \"654225\": \"裕民县\",\n\t    \"654226\": \"和布克赛尔蒙古自治县\",\n\t    \"654227\": \"其它区\",\n\t    \"654300\": \"阿勒泰地区\",\n\t    \"654301\": \"阿勒泰市\",\n\t    \"654321\": \"布尔津县\",\n\t    \"654322\": \"富蕴县\",\n\t    \"654323\": \"福海县\",\n\t    \"654324\": \"哈巴河县\",\n\t    \"654325\": \"青河县\",\n\t    \"654326\": \"吉木乃县\",\n\t    \"654327\": \"其它区\",\n\t    \"659001\": \"石河子市\",\n\t    \"659002\": \"阿拉尔市\",\n\t    \"659003\": \"图木舒克市\",\n\t    \"659004\": \"五家渠市\",\n\t    \"710000\": \"台湾\",\n\t    \"710100\": \"台北市\",\n\t    \"710101\": \"中正区\",\n\t    \"710102\": \"大同区\",\n\t    \"710103\": \"中山区\",\n\t    \"710104\": \"松山区\",\n\t    \"710105\": \"大安区\",\n\t    \"710106\": \"万华区\",\n\t    \"710107\": \"信义区\",\n\t    \"710108\": \"士林区\",\n\t    \"710109\": \"北投区\",\n\t    \"710110\": \"内湖区\",\n\t    \"710111\": \"南港区\",\n\t    \"710112\": \"文山区\",\n\t    \"710113\": \"其它区\",\n\t    \"710200\": \"高雄市\",\n\t    \"710201\": \"新兴区\",\n\t    \"710202\": \"前金区\",\n\t    \"710203\": \"芩雅区\",\n\t    \"710204\": \"盐埕区\",\n\t    \"710205\": \"鼓山区\",\n\t    \"710206\": \"旗津区\",\n\t    \"710207\": \"前镇区\",\n\t    \"710208\": \"三民区\",\n\t    \"710209\": \"左营区\",\n\t    \"710210\": \"楠梓区\",\n\t    \"710211\": \"小港区\",\n\t    \"710212\": \"其它区\",\n\t    \"710241\": \"苓雅区\",\n\t    \"710242\": \"仁武区\",\n\t    \"710243\": \"大社区\",\n\t    \"710244\": \"冈山区\",\n\t    \"710245\": \"路竹区\",\n\t    \"710246\": \"阿莲区\",\n\t    \"710247\": \"田寮区\",\n\t    \"710248\": \"燕巢区\",\n\t    \"710249\": \"桥头区\",\n\t    \"710250\": \"梓官区\",\n\t    \"710251\": \"弥陀区\",\n\t    \"710252\": \"永安区\",\n\t    \"710253\": \"湖内区\",\n\t    \"710254\": \"凤山区\",\n\t    \"710255\": \"大寮区\",\n\t    \"710256\": \"林园区\",\n\t    \"710257\": \"鸟松区\",\n\t    \"710258\": \"大树区\",\n\t    \"710259\": \"旗山区\",\n\t    \"710260\": \"美浓区\",\n\t    \"710261\": \"六龟区\",\n\t    \"710262\": \"内门区\",\n\t    \"710263\": \"杉林区\",\n\t    \"710264\": \"甲仙区\",\n\t    \"710265\": \"桃源区\",\n\t    \"710266\": \"那玛夏区\",\n\t    \"710267\": \"茂林区\",\n\t    \"710268\": \"茄萣区\",\n\t    \"710300\": \"台南市\",\n\t    \"710301\": \"中西区\",\n\t    \"710302\": \"东区\",\n\t    \"710303\": \"南区\",\n\t    \"710304\": \"北区\",\n\t    \"710305\": \"安平区\",\n\t    \"710306\": \"安南区\",\n\t    \"710307\": \"其它区\",\n\t    \"710339\": \"永康区\",\n\t    \"710340\": \"归仁区\",\n\t    \"710341\": \"新化区\",\n\t    \"710342\": \"左镇区\",\n\t    \"710343\": \"玉井区\",\n\t    \"710344\": \"楠西区\",\n\t    \"710345\": \"南化区\",\n\t    \"710346\": \"仁德区\",\n\t    \"710347\": \"关庙区\",\n\t    \"710348\": \"龙崎区\",\n\t    \"710349\": \"官田区\",\n\t    \"710350\": \"麻豆区\",\n\t    \"710351\": \"佳里区\",\n\t    \"710352\": \"西港区\",\n\t    \"710353\": \"七股区\",\n\t    \"710354\": \"将军区\",\n\t    \"710355\": \"学甲区\",\n\t    \"710356\": \"北门区\",\n\t    \"710357\": \"新营区\",\n\t    \"710358\": \"后壁区\",\n\t    \"710359\": \"白河区\",\n\t    \"710360\": \"东山区\",\n\t    \"710361\": \"六甲区\",\n\t    \"710362\": \"下营区\",\n\t    \"710363\": \"柳营区\",\n\t    \"710364\": \"盐水区\",\n\t    \"710365\": \"善化区\",\n\t    \"710366\": \"大内区\",\n\t    \"710367\": \"山上区\",\n\t    \"710368\": \"新市区\",\n\t    \"710369\": \"安定区\",\n\t    \"710400\": \"台中市\",\n\t    \"710401\": \"中区\",\n\t    \"710402\": \"东区\",\n\t    \"710403\": \"南区\",\n\t    \"710404\": \"西区\",\n\t    \"710405\": \"北区\",\n\t    \"710406\": \"北屯区\",\n\t    \"710407\": \"西屯区\",\n\t    \"710408\": \"南屯区\",\n\t    \"710409\": \"其它区\",\n\t    \"710431\": \"太平区\",\n\t    \"710432\": \"大里区\",\n\t    \"710433\": \"雾峰区\",\n\t    \"710434\": \"乌日区\",\n\t    \"710435\": \"丰原区\",\n\t    \"710436\": \"后里区\",\n\t    \"710437\": \"石冈区\",\n\t    \"710438\": \"东势区\",\n\t    \"710439\": \"和平区\",\n\t    \"710440\": \"新社区\",\n\t    \"710441\": \"潭子区\",\n\t    \"710442\": \"大雅区\",\n\t    \"710443\": \"神冈区\",\n\t    \"710444\": \"大肚区\",\n\t    \"710445\": \"沙鹿区\",\n\t    \"710446\": \"龙井区\",\n\t    \"710447\": \"梧栖区\",\n\t    \"710448\": \"清水区\",\n\t    \"710449\": \"大甲区\",\n\t    \"710450\": \"外埔区\",\n\t    \"710451\": \"大安区\",\n\t    \"710500\": \"金门县\",\n\t    \"710507\": \"金沙镇\",\n\t    \"710508\": \"金湖镇\",\n\t    \"710509\": \"金宁乡\",\n\t    \"710510\": \"金城镇\",\n\t    \"710511\": \"烈屿乡\",\n\t    \"710512\": \"乌坵乡\",\n\t    \"710600\": \"南投县\",\n\t    \"710614\": \"南投市\",\n\t    \"710615\": \"中寮乡\",\n\t    \"710616\": \"草屯镇\",\n\t    \"710617\": \"国姓乡\",\n\t    \"710618\": \"埔里镇\",\n\t    \"710619\": \"仁爱乡\",\n\t    \"710620\": \"名间乡\",\n\t    \"710621\": \"集集镇\",\n\t    \"710622\": \"水里乡\",\n\t    \"710623\": \"鱼池乡\",\n\t    \"710624\": \"信义乡\",\n\t    \"710625\": \"竹山镇\",\n\t    \"710626\": \"鹿谷乡\",\n\t    \"710700\": \"基隆市\",\n\t    \"710701\": \"仁爱区\",\n\t    \"710702\": \"信义区\",\n\t    \"710703\": \"中正区\",\n\t    \"710704\": \"中山区\",\n\t    \"710705\": \"安乐区\",\n\t    \"710706\": \"暖暖区\",\n\t    \"710707\": \"七堵区\",\n\t    \"710708\": \"其它区\",\n\t    \"710800\": \"新竹市\",\n\t    \"710801\": \"东区\",\n\t    \"710802\": \"北区\",\n\t    \"710803\": \"香山区\",\n\t    \"710804\": \"其它区\",\n\t    \"710900\": \"嘉义市\",\n\t    \"710901\": \"东区\",\n\t    \"710902\": \"西区\",\n\t    \"710903\": \"其它区\",\n\t    \"711100\": \"新北市\",\n\t    \"711130\": \"万里区\",\n\t    \"711131\": \"金山区\",\n\t    \"711132\": \"板桥区\",\n\t    \"711133\": \"汐止区\",\n\t    \"711134\": \"深坑区\",\n\t    \"711135\": \"石碇区\",\n\t    \"711136\": \"瑞芳区\",\n\t    \"711137\": \"平溪区\",\n\t    \"711138\": \"双溪区\",\n\t    \"711139\": \"贡寮区\",\n\t    \"711140\": \"新店区\",\n\t    \"711141\": \"坪林区\",\n\t    \"711142\": \"乌来区\",\n\t    \"711143\": \"永和区\",\n\t    \"711144\": \"中和区\",\n\t    \"711145\": \"土城区\",\n\t    \"711146\": \"三峡区\",\n\t    \"711147\": \"树林区\",\n\t    \"711148\": \"莺歌区\",\n\t    \"711149\": \"三重区\",\n\t    \"711150\": \"新庄区\",\n\t    \"711151\": \"泰山区\",\n\t    \"711152\": \"林口区\",\n\t    \"711153\": \"芦洲区\",\n\t    \"711154\": \"五股区\",\n\t    \"711155\": \"八里区\",\n\t    \"711156\": \"淡水区\",\n\t    \"711157\": \"三芝区\",\n\t    \"711158\": \"石门区\",\n\t    \"711200\": \"宜兰县\",\n\t    \"711214\": \"宜兰市\",\n\t    \"711215\": \"头城镇\",\n\t    \"711216\": \"礁溪乡\",\n\t    \"711217\": \"壮围乡\",\n\t    \"711218\": \"员山乡\",\n\t    \"711219\": \"罗东镇\",\n\t    \"711220\": \"三星乡\",\n\t    \"711221\": \"大同乡\",\n\t    \"711222\": \"五结乡\",\n\t    \"711223\": \"冬山乡\",\n\t    \"711224\": \"苏澳镇\",\n\t    \"711225\": \"南澳乡\",\n\t    \"711226\": \"钓鱼台\",\n\t    \"711300\": \"新竹县\",\n\t    \"711314\": \"竹北市\",\n\t    \"711315\": \"湖口乡\",\n\t    \"711316\": \"新丰乡\",\n\t    \"711317\": \"新埔镇\",\n\t    \"711318\": \"关西镇\",\n\t    \"711319\": \"芎林乡\",\n\t    \"711320\": \"宝山乡\",\n\t    \"711321\": \"竹东镇\",\n\t    \"711322\": \"五峰乡\",\n\t    \"711323\": \"横山乡\",\n\t    \"711324\": \"尖石乡\",\n\t    \"711325\": \"北埔乡\",\n\t    \"711326\": \"峨眉乡\",\n\t    \"711400\": \"桃园县\",\n\t    \"711414\": \"中坜市\",\n\t    \"711415\": \"平镇市\",\n\t    \"711416\": \"龙潭乡\",\n\t    \"711417\": \"杨梅市\",\n\t    \"711418\": \"新屋乡\",\n\t    \"711419\": \"观音乡\",\n\t    \"711420\": \"桃园市\",\n\t    \"711421\": \"龟山乡\",\n\t    \"711422\": \"八德市\",\n\t    \"711423\": \"大溪镇\",\n\t    \"711424\": \"复兴乡\",\n\t    \"711425\": \"大园乡\",\n\t    \"711426\": \"芦竹乡\",\n\t    \"711500\": \"苗栗县\",\n\t    \"711519\": \"竹南镇\",\n\t    \"711520\": \"头份镇\",\n\t    \"711521\": \"三湾乡\",\n\t    \"711522\": \"南庄乡\",\n\t    \"711523\": \"狮潭乡\",\n\t    \"711524\": \"后龙镇\",\n\t    \"711525\": \"通霄镇\",\n\t    \"711526\": \"苑里镇\",\n\t    \"711527\": \"苗栗市\",\n\t    \"711528\": \"造桥乡\",\n\t    \"711529\": \"头屋乡\",\n\t    \"711530\": \"公馆乡\",\n\t    \"711531\": \"大湖乡\",\n\t    \"711532\": \"泰安乡\",\n\t    \"711533\": \"铜锣乡\",\n\t    \"711534\": \"三义乡\",\n\t    \"711535\": \"西湖乡\",\n\t    \"711536\": \"卓兰镇\",\n\t    \"711700\": \"彰化县\",\n\t    \"711727\": \"彰化市\",\n\t    \"711728\": \"芬园乡\",\n\t    \"711729\": \"花坛乡\",\n\t    \"711730\": \"秀水乡\",\n\t    \"711731\": \"鹿港镇\",\n\t    \"711732\": \"福兴乡\",\n\t    \"711733\": \"线西乡\",\n\t    \"711734\": \"和美镇\",\n\t    \"711735\": \"伸港乡\",\n\t    \"711736\": \"员林镇\",\n\t    \"711737\": \"社头乡\",\n\t    \"711738\": \"永靖乡\",\n\t    \"711739\": \"埔心乡\",\n\t    \"711740\": \"溪湖镇\",\n\t    \"711741\": \"大村乡\",\n\t    \"711742\": \"埔盐乡\",\n\t    \"711743\": \"田中镇\",\n\t    \"711744\": \"北斗镇\",\n\t    \"711745\": \"田尾乡\",\n\t    \"711746\": \"埤头乡\",\n\t    \"711747\": \"溪州乡\",\n\t    \"711748\": \"竹塘乡\",\n\t    \"711749\": \"二林镇\",\n\t    \"711750\": \"大城乡\",\n\t    \"711751\": \"芳苑乡\",\n\t    \"711752\": \"二水乡\",\n\t    \"711900\": \"嘉义县\",\n\t    \"711919\": \"番路乡\",\n\t    \"711920\": \"梅山乡\",\n\t    \"711921\": \"竹崎乡\",\n\t    \"711922\": \"阿里山乡\",\n\t    \"711923\": \"中埔乡\",\n\t    \"711924\": \"大埔乡\",\n\t    \"711925\": \"水上乡\",\n\t    \"711926\": \"鹿草乡\",\n\t    \"711927\": \"太保市\",\n\t    \"711928\": \"朴子市\",\n\t    \"711929\": \"东石乡\",\n\t    \"711930\": \"六脚乡\",\n\t    \"711931\": \"新港乡\",\n\t    \"711932\": \"民雄乡\",\n\t    \"711933\": \"大林镇\",\n\t    \"711934\": \"溪口乡\",\n\t    \"711935\": \"义竹乡\",\n\t    \"711936\": \"布袋镇\",\n\t    \"712100\": \"云林县\",\n\t    \"712121\": \"斗南镇\",\n\t    \"712122\": \"大埤乡\",\n\t    \"712123\": \"虎尾镇\",\n\t    \"712124\": \"土库镇\",\n\t    \"712125\": \"褒忠乡\",\n\t    \"712126\": \"东势乡\",\n\t    \"712127\": \"台西乡\",\n\t    \"712128\": \"仑背乡\",\n\t    \"712129\": \"麦寮乡\",\n\t    \"712130\": \"斗六市\",\n\t    \"712131\": \"林内乡\",\n\t    \"712132\": \"古坑乡\",\n\t    \"712133\": \"莿桐乡\",\n\t    \"712134\": \"西螺镇\",\n\t    \"712135\": \"二仑乡\",\n\t    \"712136\": \"北港镇\",\n\t    \"712137\": \"水林乡\",\n\t    \"712138\": \"口湖乡\",\n\t    \"712139\": \"四湖乡\",\n\t    \"712140\": \"元长乡\",\n\t    \"712400\": \"屏东县\",\n\t    \"712434\": \"屏东市\",\n\t    \"712435\": \"三地门乡\",\n\t    \"712436\": \"雾台乡\",\n\t    \"712437\": \"玛家乡\",\n\t    \"712438\": \"九如乡\",\n\t    \"712439\": \"里港乡\",\n\t    \"712440\": \"高树乡\",\n\t    \"712441\": \"盐埔乡\",\n\t    \"712442\": \"长治乡\",\n\t    \"712443\": \"麟洛乡\",\n\t    \"712444\": \"竹田乡\",\n\t    \"712445\": \"内埔乡\",\n\t    \"712446\": \"万丹乡\",\n\t    \"712447\": \"潮州镇\",\n\t    \"712448\": \"泰武乡\",\n\t    \"712449\": \"来义乡\",\n\t    \"712450\": \"万峦乡\",\n\t    \"712451\": \"崁顶乡\",\n\t    \"712452\": \"新埤乡\",\n\t    \"712453\": \"南州乡\",\n\t    \"712454\": \"林边乡\",\n\t    \"712455\": \"东港镇\",\n\t    \"712456\": \"琉球乡\",\n\t    \"712457\": \"佳冬乡\",\n\t    \"712458\": \"新园乡\",\n\t    \"712459\": \"枋寮乡\",\n\t    \"712460\": \"枋山乡\",\n\t    \"712461\": \"春日乡\",\n\t    \"712462\": \"狮子乡\",\n\t    \"712463\": \"车城乡\",\n\t    \"712464\": \"牡丹乡\",\n\t    \"712465\": \"恒春镇\",\n\t    \"712466\": \"满州乡\",\n\t    \"712500\": \"台东县\",\n\t    \"712517\": \"台东市\",\n\t    \"712518\": \"绿岛乡\",\n\t    \"712519\": \"兰屿乡\",\n\t    \"712520\": \"延平乡\",\n\t    \"712521\": \"卑南乡\",\n\t    \"712522\": \"鹿野乡\",\n\t    \"712523\": \"关山镇\",\n\t    \"712524\": \"海端乡\",\n\t    \"712525\": \"池上乡\",\n\t    \"712526\": \"东河乡\",\n\t    \"712527\": \"成功镇\",\n\t    \"712528\": \"长滨乡\",\n\t    \"712529\": \"金峰乡\",\n\t    \"712530\": \"大武乡\",\n\t    \"712531\": \"达仁乡\",\n\t    \"712532\": \"太麻里乡\",\n\t    \"712600\": \"花莲县\",\n\t    \"712615\": \"花莲市\",\n\t    \"712616\": \"新城乡\",\n\t    \"712617\": \"太鲁阁\",\n\t    \"712618\": \"秀林乡\",\n\t    \"712619\": \"吉安乡\",\n\t    \"712620\": \"寿丰乡\",\n\t    \"712621\": \"凤林镇\",\n\t    \"712622\": \"光复乡\",\n\t    \"712623\": \"丰滨乡\",\n\t    \"712624\": \"瑞穗乡\",\n\t    \"712625\": \"万荣乡\",\n\t    \"712626\": \"玉里镇\",\n\t    \"712627\": \"卓溪乡\",\n\t    \"712628\": \"富里乡\",\n\t    \"712700\": \"澎湖县\",\n\t    \"712707\": \"马公市\",\n\t    \"712708\": \"西屿乡\",\n\t    \"712709\": \"望安乡\",\n\t    \"712710\": \"七美乡\",\n\t    \"712711\": \"白沙乡\",\n\t    \"712712\": \"湖西乡\",\n\t    \"712800\": \"连江县\",\n\t    \"712805\": \"南竿乡\",\n\t    \"712806\": \"北竿乡\",\n\t    \"712807\": \"莒光乡\",\n\t    \"712808\": \"东引乡\",\n\t    \"810000\": \"香港特别行政区\",\n\t    \"810100\": \"香港岛\",\n\t    \"810101\": \"中西区\",\n\t    \"810102\": \"湾仔\",\n\t    \"810103\": \"东区\",\n\t    \"810104\": \"南区\",\n\t    \"810200\": \"九龙\",\n\t    \"810201\": \"九龙城区\",\n\t    \"810202\": \"油尖旺区\",\n\t    \"810203\": \"深水埗区\",\n\t    \"810204\": \"黄大仙区\",\n\t    \"810205\": \"观塘区\",\n\t    \"810300\": \"新界\",\n\t    \"810301\": \"北区\",\n\t    \"810302\": \"大埔区\",\n\t    \"810303\": \"沙田区\",\n\t    \"810304\": \"西贡区\",\n\t    \"810305\": \"元朗区\",\n\t    \"810306\": \"屯门区\",\n\t    \"810307\": \"荃湾区\",\n\t    \"810308\": \"葵青区\",\n\t    \"810309\": \"离岛区\",\n\t    \"820000\": \"澳门特别行政区\",\n\t    \"820100\": \"澳门半岛\",\n\t    \"820200\": \"离岛\",\n\t    \"990000\": \"海外\",\n\t    \"990100\": \"海外\"\n\t}\n\n\t// id pid/parentId name children\n\tfunction tree(list) {\n\t    var mapped = {}\n\t    for (var i = 0, item; i < list.length; i++) {\n\t        item = list[i]\n\t        if (!item || !item.id) continue\n\t        mapped[item.id] = item\n\t    }\n\n\t    var result = []\n\t    for (var ii = 0; ii < list.length; ii++) {\n\t        item = list[ii]\n\n\t        if (!item) continue\n\t            /* jshint -W041 */\n\t        if (item.pid == undefined && item.parentId == undefined) {\n\t            result.push(item)\n\t            continue\n\t        }\n\t        var parent = mapped[item.pid] || mapped[item.parentId]\n\t        if (!parent) continue\n\t        if (!parent.children) parent.children = []\n\t        parent.children.push(item)\n\t    }\n\t    return result\n\t}\n\n\tvar DICT_FIXED = function() {\n\t    var fixed = []\n\t    for (var id in DICT) {\n\t        var pid = id.slice(2, 6) === '0000' ? undefined :\n\t            id.slice(4, 6) == '00' ? (id.slice(0, 2) + '0000') :\n\t            id.slice(0, 4) + '00'\n\t        fixed.push({\n\t            id: id,\n\t            pid: pid,\n\t            name: DICT[id]\n\t        })\n\t    }\n\t    return tree(fixed)\n\t}()\n\n\tmodule.exports = DICT_FIXED\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t    ## Miscellaneous\n\t*/\n\tvar DICT = __webpack_require__(18)\n\tmodule.exports = {\n\t\t// Dice\n\t\td4: function() {\n\t\t\treturn this.natural(1, 4)\n\t\t},\n\t\td6: function() {\n\t\t\treturn this.natural(1, 6)\n\t\t},\n\t\td8: function() {\n\t\t\treturn this.natural(1, 8)\n\t\t},\n\t\td12: function() {\n\t\t\treturn this.natural(1, 12)\n\t\t},\n\t\td20: function() {\n\t\t\treturn this.natural(1, 20)\n\t\t},\n\t\td100: function() {\n\t\t\treturn this.natural(1, 100)\n\t\t},\n\t\t/*\n\t\t    随机生成一个 GUID。\n\n\t\t    http://www.broofa.com/2008/09/javascript-uuid-function/\n\t\t    [UUID 规范](http://www.ietf.org/rfc/rfc4122.txt)\n\t\t        UUIDs (Universally Unique IDentifier)\n\t\t        GUIDs (Globally Unique IDentifier)\n\t\t        The formal definition of the UUID string representation is provided by the following ABNF [7]:\n\t\t            UUID                   = time-low \"-\" time-mid \"-\"\n\t\t                                   time-high-and-version \"-\"\n\t\t                                   clock-seq-and-reserved\n\t\t                                   clock-seq-low \"-\" node\n\t\t            time-low               = 4hexOctet\n\t\t            time-mid               = 2hexOctet\n\t\t            time-high-and-version  = 2hexOctet\n\t\t            clock-seq-and-reserved = hexOctet\n\t\t            clock-seq-low          = hexOctet\n\t\t            node                   = 6hexOctet\n\t\t            hexOctet               = hexDigit hexDigit\n\t\t            hexDigit =\n\t\t                \"0\" / \"1\" / \"2\" / \"3\" / \"4\" / \"5\" / \"6\" / \"7\" / \"8\" / \"9\" /\n\t\t                \"a\" / \"b\" / \"c\" / \"d\" / \"e\" / \"f\" /\n\t\t                \"A\" / \"B\" / \"C\" / \"D\" / \"E\" / \"F\"\n\t\t    \n\t\t    https://github.com/victorquinn/chancejs/blob/develop/chance.js#L1349\n\t\t*/\n\t\tguid: function() {\n\t\t\tvar pool = \"abcdefABCDEF1234567890\",\n\t\t\t\tguid = this.string(pool, 8) + '-' +\n\t\t\t\tthis.string(pool, 4) + '-' +\n\t\t\t\tthis.string(pool, 4) + '-' +\n\t\t\t\tthis.string(pool, 4) + '-' +\n\t\t\t\tthis.string(pool, 12);\n\t\t\treturn guid\n\t\t},\n\t\tuuid: function() {\n\t\t\treturn this.guid()\n\t\t},\n\t\t/*\n\t\t    随机生成一个 18 位身份证。\n\n\t\t    [身份证](http://baike.baidu.com/view/1697.htm#4)\n\t\t        地址码 6 + 出生日期码 8 + 顺序码 3 + 校验码 1\n\t\t    [《中华人民共和国行政区划代码》国家标准(GB/T2260)](http://zhidao.baidu.com/question/1954561.html)\n\t\t*/\n\t\tid: function() {\n\t\t\tvar id,\n\t\t\t\tsum = 0,\n\t\t\t\trank = [\n\t\t\t\t\t\"7\", \"9\", \"10\", \"5\", \"8\", \"4\", \"2\", \"1\", \"6\", \"3\", \"7\", \"9\", \"10\", \"5\", \"8\", \"4\", \"2\"\n\t\t\t\t],\n\t\t\t\tlast = [\n\t\t\t\t\t\"1\", \"0\", \"X\", \"9\", \"8\", \"7\", \"6\", \"5\", \"4\", \"3\", \"2\"\n\t\t\t\t]\n\n\t\t\tid = this.pick(DICT).id +\n\t\t\t\tthis.date('yyyyMMdd') +\n\t\t\t\tthis.string('number', 3)\n\n\t\t\tfor (var i = 0; i < id.length; i++) {\n\t\t\t\tsum += id[i] * rank[i];\n\t\t\t}\n\t\t\tid += last[sum % 11];\n\n\t\t\treturn id\n\t\t},\n\n\t\t/*\n\t\t    生成一个全局的自增整数。\n\t\t    类似自增主键(auto increment primary key)。\n\t\t*/\n\t\tincrement: function() {\n\t\t\tvar key = 0\n\t\t\treturn function(step) {\n\t\t\t\treturn key += (+step || 1) // step?\n\t\t\t}\n\t\t}(),\n\t\tinc: function(step) {\n\t\t\treturn this.increment(step)\n\t\t}\n\t}\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Parser = __webpack_require__(21)\n\tvar Handler = __webpack_require__(22)\n\tmodule.exports = {\n\t\tParser: Parser,\n\t\tHandler: Handler\n\t}\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\n\t// https://github.com/nuysoft/regexp\n\t// forked from https://github.com/ForbesLindesay/regexp\n\n\tfunction parse(n) {\n\t    if (\"string\" != typeof n) {\n\t        var l = new TypeError(\"The regexp to parse must be represented as a string.\");\n\t        throw l;\n\t    }\n\t    return index = 1, cgs = {}, parser.parse(n);\n\t}\n\n\tfunction Token(n) {\n\t    this.type = n, this.offset = Token.offset(), this.text = Token.text();\n\t}\n\n\tfunction Alternate(n, l) {\n\t    Token.call(this, \"alternate\"), this.left = n, this.right = l;\n\t}\n\n\tfunction Match(n) {\n\t    Token.call(this, \"match\"), this.body = n.filter(Boolean);\n\t}\n\n\tfunction Group(n, l) {\n\t    Token.call(this, n), this.body = l;\n\t}\n\n\tfunction CaptureGroup(n) {\n\t    Group.call(this, \"capture-group\"), this.index = cgs[this.offset] || (cgs[this.offset] = index++), \n\t    this.body = n;\n\t}\n\n\tfunction Quantified(n, l) {\n\t    Token.call(this, \"quantified\"), this.body = n, this.quantifier = l;\n\t}\n\n\tfunction Quantifier(n, l) {\n\t    Token.call(this, \"quantifier\"), this.min = n, this.max = l, this.greedy = !0;\n\t}\n\n\tfunction CharSet(n, l) {\n\t    Token.call(this, \"charset\"), this.invert = n, this.body = l;\n\t}\n\n\tfunction CharacterRange(n, l) {\n\t    Token.call(this, \"range\"), this.start = n, this.end = l;\n\t}\n\n\tfunction Literal(n) {\n\t    Token.call(this, \"literal\"), this.body = n, this.escaped = this.body != this.text;\n\t}\n\n\tfunction Unicode(n) {\n\t    Token.call(this, \"unicode\"), this.code = n.toUpperCase();\n\t}\n\n\tfunction Hex(n) {\n\t    Token.call(this, \"hex\"), this.code = n.toUpperCase();\n\t}\n\n\tfunction Octal(n) {\n\t    Token.call(this, \"octal\"), this.code = n.toUpperCase();\n\t}\n\n\tfunction BackReference(n) {\n\t    Token.call(this, \"back-reference\"), this.code = n.toUpperCase();\n\t}\n\n\tfunction ControlCharacter(n) {\n\t    Token.call(this, \"control-character\"), this.code = n.toUpperCase();\n\t}\n\n\tvar parser = function() {\n\t    function n(n, l) {\n\t        function u() {\n\t            this.constructor = n;\n\t        }\n\t        u.prototype = l.prototype, n.prototype = new u();\n\t    }\n\t    function l(n, l, u, t, r) {\n\t        function e(n, l) {\n\t            function u(n) {\n\t                function l(n) {\n\t                    return n.charCodeAt(0).toString(16).toUpperCase();\n\t                }\n\t                return n.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\x08/g, \"\\\\b\").replace(/\\t/g, \"\\\\t\").replace(/\\n/g, \"\\\\n\").replace(/\\f/g, \"\\\\f\").replace(/\\r/g, \"\\\\r\").replace(/[\\x00-\\x07\\x0B\\x0E\\x0F]/g, function(n) {\n\t                    return \"\\\\x0\" + l(n);\n\t                }).replace(/[\\x10-\\x1F\\x80-\\xFF]/g, function(n) {\n\t                    return \"\\\\x\" + l(n);\n\t                }).replace(/[\\u0180-\\u0FFF]/g, function(n) {\n\t                    return \"\\\\u0\" + l(n);\n\t                }).replace(/[\\u1080-\\uFFFF]/g, function(n) {\n\t                    return \"\\\\u\" + l(n);\n\t                });\n\t            }\n\t            var t, r;\n\t            switch (n.length) {\n\t              case 0:\n\t                t = \"end of input\";\n\t                break;\n\n\t              case 1:\n\t                t = n[0];\n\t                break;\n\n\t              default:\n\t                t = n.slice(0, -1).join(\", \") + \" or \" + n[n.length - 1];\n\t            }\n\t            return r = l ? '\"' + u(l) + '\"' : \"end of input\", \"Expected \" + t + \" but \" + r + \" found.\";\n\t        }\n\t        this.expected = n, this.found = l, this.offset = u, this.line = t, this.column = r, \n\t        this.name = \"SyntaxError\", this.message = e(n, l);\n\t    }\n\t    function u(n) {\n\t        function u() {\n\t            return n.substring(Lt, qt);\n\t        }\n\t        function t() {\n\t            return Lt;\n\t        }\n\t        function r(l) {\n\t            function u(l, u, t) {\n\t                var r, e;\n\t                for (r = u; t > r; r++) e = n.charAt(r), \"\\n\" === e ? (l.seenCR || l.line++, l.column = 1, \n\t                l.seenCR = !1) : \"\\r\" === e || \"\\u2028\" === e || \"\\u2029\" === e ? (l.line++, l.column = 1, \n\t                l.seenCR = !0) : (l.column++, l.seenCR = !1);\n\t            }\n\t            return Mt !== l && (Mt > l && (Mt = 0, Dt = {\n\t                line: 1,\n\t                column: 1,\n\t                seenCR: !1\n\t            }), u(Dt, Mt, l), Mt = l), Dt;\n\t        }\n\t        function e(n) {\n\t            Ht > qt || (qt > Ht && (Ht = qt, Ot = []), Ot.push(n));\n\t        }\n\t        function o(n) {\n\t            var l = 0;\n\t            for (n.sort(); l < n.length; ) n[l - 1] === n[l] ? n.splice(l, 1) : l++;\n\t        }\n\t        function c() {\n\t            var l, u, t, r, o;\n\t            return l = qt, u = i(), null !== u ? (t = qt, 124 === n.charCodeAt(qt) ? (r = fl, \n\t            qt++) : (r = null, 0 === Wt && e(sl)), null !== r ? (o = c(), null !== o ? (r = [ r, o ], \n\t            t = r) : (qt = t, t = il)) : (qt = t, t = il), null === t && (t = al), null !== t ? (Lt = l, \n\t            u = hl(u, t), null === u ? (qt = l, l = u) : l = u) : (qt = l, l = il)) : (qt = l, \n\t            l = il), l;\n\t        }\n\t        function i() {\n\t            var n, l, u, t, r;\n\t            if (n = qt, l = f(), null === l && (l = al), null !== l) if (u = qt, Wt++, t = d(), \n\t            Wt--, null === t ? u = al : (qt = u, u = il), null !== u) {\n\t                for (t = [], r = h(), null === r && (r = a()); null !== r; ) t.push(r), r = h(), \n\t                null === r && (r = a());\n\t                null !== t ? (r = s(), null === r && (r = al), null !== r ? (Lt = n, l = dl(l, t, r), \n\t                null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, n = il);\n\t            } else qt = n, n = il; else qt = n, n = il;\n\t            return n;\n\t        }\n\t        function a() {\n\t            var n;\n\t            return n = x(), null === n && (n = Q(), null === n && (n = B())), n;\n\t        }\n\t        function f() {\n\t            var l, u;\n\t            return l = qt, 94 === n.charCodeAt(qt) ? (u = pl, qt++) : (u = null, 0 === Wt && e(vl)), \n\t            null !== u && (Lt = l, u = wl()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function s() {\n\t            var l, u;\n\t            return l = qt, 36 === n.charCodeAt(qt) ? (u = Al, qt++) : (u = null, 0 === Wt && e(Cl)), \n\t            null !== u && (Lt = l, u = gl()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function h() {\n\t            var n, l, u;\n\t            return n = qt, l = a(), null !== l ? (u = d(), null !== u ? (Lt = n, l = bl(l, u), \n\t            null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, n = il), n;\n\t        }\n\t        function d() {\n\t            var n, l, u;\n\t            return Wt++, n = qt, l = p(), null !== l ? (u = k(), null === u && (u = al), null !== u ? (Lt = n, \n\t            l = Tl(l, u), null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, \n\t            n = il), Wt--, null === n && (l = null, 0 === Wt && e(kl)), n;\n\t        }\n\t        function p() {\n\t            var n;\n\t            return n = v(), null === n && (n = w(), null === n && (n = A(), null === n && (n = C(), \n\t            null === n && (n = g(), null === n && (n = b()))))), n;\n\t        }\n\t        function v() {\n\t            var l, u, t, r, o, c;\n\t            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), \n\t            null !== u ? (t = T(), null !== t ? (44 === n.charCodeAt(qt) ? (r = ml, qt++) : (r = null, \n\t            0 === Wt && e(Rl)), null !== r ? (o = T(), null !== o ? (125 === n.charCodeAt(qt) ? (c = Fl, \n\t            qt++) : (c = null, 0 === Wt && e(Ql)), null !== c ? (Lt = l, u = Sl(t, o), null === u ? (qt = l, \n\t            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, \n\t            l = il)) : (qt = l, l = il), l;\n\t        }\n\t        function w() {\n\t            var l, u, t, r;\n\t            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), \n\t            null !== u ? (t = T(), null !== t ? (n.substr(qt, 2) === Ul ? (r = Ul, qt += 2) : (r = null, \n\t            0 === Wt && e(El)), null !== r ? (Lt = l, u = Gl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t            l = il)) : (qt = l, l = il)) : (qt = l, l = il), l;\n\t        }\n\t        function A() {\n\t            var l, u, t, r;\n\t            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), \n\t            null !== u ? (t = T(), null !== t ? (125 === n.charCodeAt(qt) ? (r = Fl, qt++) : (r = null, \n\t            0 === Wt && e(Ql)), null !== r ? (Lt = l, u = Bl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t            l = il)) : (qt = l, l = il)) : (qt = l, l = il), l;\n\t        }\n\t        function C() {\n\t            var l, u;\n\t            return l = qt, 43 === n.charCodeAt(qt) ? (u = jl, qt++) : (u = null, 0 === Wt && e($l)), \n\t            null !== u && (Lt = l, u = ql()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function g() {\n\t            var l, u;\n\t            return l = qt, 42 === n.charCodeAt(qt) ? (u = Ll, qt++) : (u = null, 0 === Wt && e(Ml)), \n\t            null !== u && (Lt = l, u = Dl()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function b() {\n\t            var l, u;\n\t            return l = qt, 63 === n.charCodeAt(qt) ? (u = Hl, qt++) : (u = null, 0 === Wt && e(Ol)), \n\t            null !== u && (Lt = l, u = Wl()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function k() {\n\t            var l;\n\t            return 63 === n.charCodeAt(qt) ? (l = Hl, qt++) : (l = null, 0 === Wt && e(Ol)), \n\t            l;\n\t        }\n\t        function T() {\n\t            var l, u, t;\n\t            if (l = qt, u = [], zl.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, \n\t            0 === Wt && e(Il)), null !== t) for (;null !== t; ) u.push(t), zl.test(n.charAt(qt)) ? (t = n.charAt(qt), \n\t            qt++) : (t = null, 0 === Wt && e(Il)); else u = il;\n\t            return null !== u && (Lt = l, u = Jl(u)), null === u ? (qt = l, l = u) : l = u, \n\t            l;\n\t        }\n\t        function x() {\n\t            var l, u, t, r;\n\t            return l = qt, 40 === n.charCodeAt(qt) ? (u = Kl, qt++) : (u = null, 0 === Wt && e(Nl)), \n\t            null !== u ? (t = R(), null === t && (t = F(), null === t && (t = m(), null === t && (t = y()))), \n\t            null !== t ? (41 === n.charCodeAt(qt) ? (r = Pl, qt++) : (r = null, 0 === Wt && e(Vl)), \n\t            null !== r ? (Lt = l, u = Xl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t            l = il)) : (qt = l, l = il)) : (qt = l, l = il), l;\n\t        }\n\t        function y() {\n\t            var n, l;\n\t            return n = qt, l = c(), null !== l && (Lt = n, l = Yl(l)), null === l ? (qt = n, \n\t            n = l) : n = l, n;\n\t        }\n\t        function m() {\n\t            var l, u, t;\n\t            return l = qt, n.substr(qt, 2) === Zl ? (u = Zl, qt += 2) : (u = null, 0 === Wt && e(_l)), \n\t            null !== u ? (t = c(), null !== t ? (Lt = l, u = nu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t            l = il)) : (qt = l, l = il), l;\n\t        }\n\t        function R() {\n\t            var l, u, t;\n\t            return l = qt, n.substr(qt, 2) === lu ? (u = lu, qt += 2) : (u = null, 0 === Wt && e(uu)), \n\t            null !== u ? (t = c(), null !== t ? (Lt = l, u = tu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t            l = il)) : (qt = l, l = il), l;\n\t        }\n\t        function F() {\n\t            var l, u, t;\n\t            return l = qt, n.substr(qt, 2) === ru ? (u = ru, qt += 2) : (u = null, 0 === Wt && e(eu)), \n\t            null !== u ? (t = c(), null !== t ? (Lt = l, u = ou(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t            l = il)) : (qt = l, l = il), l;\n\t        }\n\t        function Q() {\n\t            var l, u, t, r, o;\n\t            if (Wt++, l = qt, 91 === n.charCodeAt(qt) ? (u = iu, qt++) : (u = null, 0 === Wt && e(au)), \n\t            null !== u) if (94 === n.charCodeAt(qt) ? (t = pl, qt++) : (t = null, 0 === Wt && e(vl)), \n\t            null === t && (t = al), null !== t) {\n\t                for (r = [], o = S(), null === o && (o = U()); null !== o; ) r.push(o), o = S(), \n\t                null === o && (o = U());\n\t                null !== r ? (93 === n.charCodeAt(qt) ? (o = fu, qt++) : (o = null, 0 === Wt && e(su)), \n\t                null !== o ? (Lt = l, u = hu(t, r), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t                l = il)) : (qt = l, l = il);\n\t            } else qt = l, l = il; else qt = l, l = il;\n\t            return Wt--, null === l && (u = null, 0 === Wt && e(cu)), l;\n\t        }\n\t        function S() {\n\t            var l, u, t, r;\n\t            return Wt++, l = qt, u = U(), null !== u ? (45 === n.charCodeAt(qt) ? (t = pu, qt++) : (t = null, \n\t            0 === Wt && e(vu)), null !== t ? (r = U(), null !== r ? (Lt = l, u = wu(u, r), null === u ? (qt = l, \n\t            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il), Wt--, \n\t            null === l && (u = null, 0 === Wt && e(du)), l;\n\t        }\n\t        function U() {\n\t            var n, l;\n\t            return Wt++, n = G(), null === n && (n = E()), Wt--, null === n && (l = null, 0 === Wt && e(Au)), \n\t            n;\n\t        }\n\t        function E() {\n\t            var l, u;\n\t            return l = qt, Cu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, 0 === Wt && e(gu)), \n\t            null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function G() {\n\t            var n;\n\t            return n = L(), null === n && (n = Y(), null === n && (n = H(), null === n && (n = O(), \n\t            null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), null === n && (n = J(), \n\t            null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), null === n && (n = V(), \n\t            null === n && (n = X(), null === n && (n = _(), null === n && (n = nl(), null === n && (n = ll(), \n\t            null === n && (n = ul(), null === n && (n = tl()))))))))))))))))), n;\n\t        }\n\t        function B() {\n\t            var n;\n\t            return n = j(), null === n && (n = q(), null === n && (n = $())), n;\n\t        }\n\t        function j() {\n\t            var l, u;\n\t            return l = qt, 46 === n.charCodeAt(qt) ? (u = ku, qt++) : (u = null, 0 === Wt && e(Tu)), \n\t            null !== u && (Lt = l, u = xu()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function $() {\n\t            var l, u;\n\t            return Wt++, l = qt, mu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, \n\t            0 === Wt && e(Ru)), null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u, \n\t            Wt--, null === l && (u = null, 0 === Wt && e(yu)), l;\n\t        }\n\t        function q() {\n\t            var n;\n\t            return n = M(), null === n && (n = D(), null === n && (n = Y(), null === n && (n = H(), \n\t            null === n && (n = O(), null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), \n\t            null === n && (n = J(), null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), \n\t            null === n && (n = V(), null === n && (n = X(), null === n && (n = Z(), null === n && (n = _(), \n\t            null === n && (n = nl(), null === n && (n = ll(), null === n && (n = ul(), null === n && (n = tl()))))))))))))))))))), \n\t            n;\n\t        }\n\t        function L() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)), \n\t            null !== u && (Lt = l, u = Su()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function M() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)), \n\t            null !== u && (Lt = l, u = Uu()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function D() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === Eu ? (u = Eu, qt += 2) : (u = null, 0 === Wt && e(Gu)), \n\t            null !== u && (Lt = l, u = Bu()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function H() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === ju ? (u = ju, qt += 2) : (u = null, 0 === Wt && e($u)), \n\t            null !== u && (Lt = l, u = qu()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function O() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === Lu ? (u = Lu, qt += 2) : (u = null, 0 === Wt && e(Mu)), \n\t            null !== u && (Lt = l, u = Du()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function W() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === Hu ? (u = Hu, qt += 2) : (u = null, 0 === Wt && e(Ou)), \n\t            null !== u && (Lt = l, u = Wu()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function z() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === zu ? (u = zu, qt += 2) : (u = null, 0 === Wt && e(Iu)), \n\t            null !== u && (Lt = l, u = Ju()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function I() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === Ku ? (u = Ku, qt += 2) : (u = null, 0 === Wt && e(Nu)), \n\t            null !== u && (Lt = l, u = Pu()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function J() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === Vu ? (u = Vu, qt += 2) : (u = null, 0 === Wt && e(Xu)), \n\t            null !== u && (Lt = l, u = Yu()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function K() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === Zu ? (u = Zu, qt += 2) : (u = null, 0 === Wt && e(_u)), \n\t            null !== u && (Lt = l, u = nt()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function N() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === lt ? (u = lt, qt += 2) : (u = null, 0 === Wt && e(ut)), \n\t            null !== u && (Lt = l, u = tt()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function P() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === rt ? (u = rt, qt += 2) : (u = null, 0 === Wt && e(et)), \n\t            null !== u && (Lt = l, u = ot()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function V() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === ct ? (u = ct, qt += 2) : (u = null, 0 === Wt && e(it)), \n\t            null !== u && (Lt = l, u = at()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function X() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === ft ? (u = ft, qt += 2) : (u = null, 0 === Wt && e(st)), \n\t            null !== u && (Lt = l, u = ht()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function Y() {\n\t            var l, u, t;\n\t            return l = qt, n.substr(qt, 2) === dt ? (u = dt, qt += 2) : (u = null, 0 === Wt && e(pt)), \n\t            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)), \n\t            null !== t ? (Lt = l, u = wt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t            l = il)) : (qt = l, l = il), l;\n\t        }\n\t        function Z() {\n\t            var l, u, t;\n\t            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)), \n\t            null !== u ? (gt.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(bt)), \n\t            null !== t ? (Lt = l, u = kt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t            l = il)) : (qt = l, l = il), l;\n\t        }\n\t        function _() {\n\t            var l, u, t, r;\n\t            if (l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)), \n\t            null !== u) {\n\t                if (t = [], yt.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(mt)), \n\t                null !== r) for (;null !== r; ) t.push(r), yt.test(n.charAt(qt)) ? (r = n.charAt(qt), \n\t                qt++) : (r = null, 0 === Wt && e(mt)); else t = il;\n\t                null !== t ? (Lt = l, u = Rt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t                l = il);\n\t            } else qt = l, l = il;\n\t            return l;\n\t        }\n\t        function nl() {\n\t            var l, u, t, r;\n\t            if (l = qt, n.substr(qt, 2) === Ft ? (u = Ft, qt += 2) : (u = null, 0 === Wt && e(Qt)), \n\t            null !== u) {\n\t                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)), \n\t                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt), \n\t                qt++) : (r = null, 0 === Wt && e(Ut)); else t = il;\n\t                null !== t ? (Lt = l, u = Et(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t                l = il);\n\t            } else qt = l, l = il;\n\t            return l;\n\t        }\n\t        function ll() {\n\t            var l, u, t, r;\n\t            if (l = qt, n.substr(qt, 2) === Gt ? (u = Gt, qt += 2) : (u = null, 0 === Wt && e(Bt)), \n\t            null !== u) {\n\t                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)), \n\t                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt), \n\t                qt++) : (r = null, 0 === Wt && e(Ut)); else t = il;\n\t                null !== t ? (Lt = l, u = jt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t                l = il);\n\t            } else qt = l, l = il;\n\t            return l;\n\t        }\n\t        function ul() {\n\t            var l, u;\n\t            return l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)), \n\t            null !== u && (Lt = l, u = $t()), null === u ? (qt = l, l = u) : l = u, l;\n\t        }\n\t        function tl() {\n\t            var l, u, t;\n\t            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)), \n\t            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)), \n\t            null !== t ? (Lt = l, u = bu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, \n\t            l = il)) : (qt = l, l = il), l;\n\t        }\n\t        var rl, el = arguments.length > 1 ? arguments[1] : {}, ol = {\n\t            regexp: c\n\t        }, cl = c, il = null, al = \"\", fl = \"|\", sl = '\"|\"', hl = function(n, l) {\n\t            return l ? new Alternate(n, l[1]) : n;\n\t        }, dl = function(n, l, u) {\n\t            return new Match([ n ].concat(l).concat([ u ]));\n\t        }, pl = \"^\", vl = '\"^\"', wl = function() {\n\t            return new Token(\"start\");\n\t        }, Al = \"$\", Cl = '\"$\"', gl = function() {\n\t            return new Token(\"end\");\n\t        }, bl = function(n, l) {\n\t            return new Quantified(n, l);\n\t        }, kl = \"Quantifier\", Tl = function(n, l) {\n\t            return l && (n.greedy = !1), n;\n\t        }, xl = \"{\", yl = '\"{\"', ml = \",\", Rl = '\",\"', Fl = \"}\", Ql = '\"}\"', Sl = function(n, l) {\n\t            return new Quantifier(n, l);\n\t        }, Ul = \",}\", El = '\",}\"', Gl = function(n) {\n\t            return new Quantifier(n, 1/0);\n\t        }, Bl = function(n) {\n\t            return new Quantifier(n, n);\n\t        }, jl = \"+\", $l = '\"+\"', ql = function() {\n\t            return new Quantifier(1, 1/0);\n\t        }, Ll = \"*\", Ml = '\"*\"', Dl = function() {\n\t            return new Quantifier(0, 1/0);\n\t        }, Hl = \"?\", Ol = '\"?\"', Wl = function() {\n\t            return new Quantifier(0, 1);\n\t        }, zl = /^[0-9]/, Il = \"[0-9]\", Jl = function(n) {\n\t            return +n.join(\"\");\n\t        }, Kl = \"(\", Nl = '\"(\"', Pl = \")\", Vl = '\")\"', Xl = function(n) {\n\t            return n;\n\t        }, Yl = function(n) {\n\t            return new CaptureGroup(n);\n\t        }, Zl = \"?:\", _l = '\"?:\"', nu = function(n) {\n\t            return new Group(\"non-capture-group\", n);\n\t        }, lu = \"?=\", uu = '\"?=\"', tu = function(n) {\n\t            return new Group(\"positive-lookahead\", n);\n\t        }, ru = \"?!\", eu = '\"?!\"', ou = function(n) {\n\t            return new Group(\"negative-lookahead\", n);\n\t        }, cu = \"CharacterSet\", iu = \"[\", au = '\"[\"', fu = \"]\", su = '\"]\"', hu = function(n, l) {\n\t            return new CharSet(!!n, l);\n\t        }, du = \"CharacterRange\", pu = \"-\", vu = '\"-\"', wu = function(n, l) {\n\t            return new CharacterRange(n, l);\n\t        }, Au = \"Character\", Cu = /^[^\\\\\\]]/, gu = \"[^\\\\\\\\\\\\]]\", bu = function(n) {\n\t            return new Literal(n);\n\t        }, ku = \".\", Tu = '\".\"', xu = function() {\n\t            return new Token(\"any-character\");\n\t        }, yu = \"Literal\", mu = /^[^|\\\\\\/.[()?+*$\\^]/, Ru = \"[^|\\\\\\\\\\\\/.[()?+*$\\\\^]\", Fu = \"\\\\b\", Qu = '\"\\\\\\\\b\"', Su = function() {\n\t            return new Token(\"backspace\");\n\t        }, Uu = function() {\n\t            return new Token(\"word-boundary\");\n\t        }, Eu = \"\\\\B\", Gu = '\"\\\\\\\\B\"', Bu = function() {\n\t            return new Token(\"non-word-boundary\");\n\t        }, ju = \"\\\\d\", $u = '\"\\\\\\\\d\"', qu = function() {\n\t            return new Token(\"digit\");\n\t        }, Lu = \"\\\\D\", Mu = '\"\\\\\\\\D\"', Du = function() {\n\t            return new Token(\"non-digit\");\n\t        }, Hu = \"\\\\f\", Ou = '\"\\\\\\\\f\"', Wu = function() {\n\t            return new Token(\"form-feed\");\n\t        }, zu = \"\\\\n\", Iu = '\"\\\\\\\\n\"', Ju = function() {\n\t            return new Token(\"line-feed\");\n\t        }, Ku = \"\\\\r\", Nu = '\"\\\\\\\\r\"', Pu = function() {\n\t            return new Token(\"carriage-return\");\n\t        }, Vu = \"\\\\s\", Xu = '\"\\\\\\\\s\"', Yu = function() {\n\t            return new Token(\"white-space\");\n\t        }, Zu = \"\\\\S\", _u = '\"\\\\\\\\S\"', nt = function() {\n\t            return new Token(\"non-white-space\");\n\t        }, lt = \"\\\\t\", ut = '\"\\\\\\\\t\"', tt = function() {\n\t            return new Token(\"tab\");\n\t        }, rt = \"\\\\v\", et = '\"\\\\\\\\v\"', ot = function() {\n\t            return new Token(\"vertical-tab\");\n\t        }, ct = \"\\\\w\", it = '\"\\\\\\\\w\"', at = function() {\n\t            return new Token(\"word\");\n\t        }, ft = \"\\\\W\", st = '\"\\\\\\\\W\"', ht = function() {\n\t            return new Token(\"non-word\");\n\t        }, dt = \"\\\\c\", pt = '\"\\\\\\\\c\"', vt = \"any character\", wt = function(n) {\n\t            return new ControlCharacter(n);\n\t        }, At = \"\\\\\", Ct = '\"\\\\\\\\\"', gt = /^[1-9]/, bt = \"[1-9]\", kt = function(n) {\n\t            return new BackReference(n);\n\t        }, Tt = \"\\\\0\", xt = '\"\\\\\\\\0\"', yt = /^[0-7]/, mt = \"[0-7]\", Rt = function(n) {\n\t            return new Octal(n.join(\"\"));\n\t        }, Ft = \"\\\\x\", Qt = '\"\\\\\\\\x\"', St = /^[0-9a-fA-F]/, Ut = \"[0-9a-fA-F]\", Et = function(n) {\n\t            return new Hex(n.join(\"\"));\n\t        }, Gt = \"\\\\u\", Bt = '\"\\\\\\\\u\"', jt = function(n) {\n\t            return new Unicode(n.join(\"\"));\n\t        }, $t = function() {\n\t            return new Token(\"null-character\");\n\t        }, qt = 0, Lt = 0, Mt = 0, Dt = {\n\t            line: 1,\n\t            column: 1,\n\t            seenCR: !1\n\t        }, Ht = 0, Ot = [], Wt = 0;\n\t        if (\"startRule\" in el) {\n\t            if (!(el.startRule in ol)) throw new Error(\"Can't start parsing from rule \\\"\" + el.startRule + '\".');\n\t            cl = ol[el.startRule];\n\t        }\n\t        if (Token.offset = t, Token.text = u, rl = cl(), null !== rl && qt === n.length) return rl;\n\t        throw o(Ot), Lt = Math.max(qt, Ht), new l(Ot, Lt < n.length ? n.charAt(Lt) : null, Lt, r(Lt).line, r(Lt).column);\n\t    }\n\t    return n(l, Error), {\n\t        SyntaxError: l,\n\t        parse: u\n\t    };\n\t}(), index = 1, cgs = {};\n\n\tmodule.exports = parser\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t    ## RegExp Handler\n\n\t    https://github.com/ForbesLindesay/regexp\n\t    https://github.com/dmajda/pegjs\n\t    http://www.regexper.com/\n\n\t    每个节点的结构\n\t        {\n\t            type: '',\n\t            offset: number,\n\t            text: '',\n\t            body: {},\n\t            escaped: true/false\n\t        }\n\n\t    type 可选值\n\t        alternate             |         选择\n\t        match                 匹配\n\t        capture-group         ()        捕获组\n\t        non-capture-group     (?:...)   非捕获组\n\t        positive-lookahead    (?=p)     零宽正向先行断言\n\t        negative-lookahead    (?!p)     零宽负向先行断言\n\t        quantified            a*        重复节点\n\t        quantifier            *         量词\n\t        charset               []        字符集\n\t        range                 {m, n}    范围\n\t        literal               a         直接量字符\n\t        unicode               \\uxxxx    Unicode\n\t        hex                   \\x        十六进制\n\t        octal                 八进制\n\t        back-reference        \\n        反向引用\n\t        control-character     \\cX       控制字符\n\n\t        // Token\n\t        start               ^       开头\n\t        end                 $       结尾\n\t        any-character       .       任意字符\n\t        backspace           [\\b]    退格直接量\n\t        word-boundary       \\b      单词边界\n\t        non-word-boundary   \\B      非单词边界\n\t        digit               \\d      ASCII 数字,[0-9]\n\t        non-digit           \\D      非 ASCII 数字,[^0-9]\n\t        form-feed           \\f      换页符\n\t        line-feed           \\n      换行符\n\t        carriage-return     \\r      回车符\n\t        white-space         \\s      空白符\n\t        non-white-space     \\S      非空白符\n\t        tab                 \\t      制表符\n\t        vertical-tab        \\v      垂直制表符\n\t        word                \\w      ASCII 字符,[a-zA-Z0-9]\n\t        non-word            \\W      非 ASCII 字符,[^a-zA-Z0-9]\n\t        null-character      \\o      NUL 字符\n\t */\n\n\tvar Util = __webpack_require__(3)\n\tvar Random = __webpack_require__(5)\n\t    /*\n\t        \n\t    */\n\tvar Handler = {\n\t    extend: Util.extend\n\t}\n\n\t// http://en.wikipedia.org/wiki/ASCII#ASCII_printable_code_chart\n\t/*var ASCII_CONTROL_CODE_CHART = {\n\t    '@': ['\\u0000'],\n\t    A: ['\\u0001'],\n\t    B: ['\\u0002'],\n\t    C: ['\\u0003'],\n\t    D: ['\\u0004'],\n\t    E: ['\\u0005'],\n\t    F: ['\\u0006'],\n\t    G: ['\\u0007', '\\a'],\n\t    H: ['\\u0008', '\\b'],\n\t    I: ['\\u0009', '\\t'],\n\t    J: ['\\u000A', '\\n'],\n\t    K: ['\\u000B', '\\v'],\n\t    L: ['\\u000C', '\\f'],\n\t    M: ['\\u000D', '\\r'],\n\t    N: ['\\u000E'],\n\t    O: ['\\u000F'],\n\t    P: ['\\u0010'],\n\t    Q: ['\\u0011'],\n\t    R: ['\\u0012'],\n\t    S: ['\\u0013'],\n\t    T: ['\\u0014'],\n\t    U: ['\\u0015'],\n\t    V: ['\\u0016'],\n\t    W: ['\\u0017'],\n\t    X: ['\\u0018'],\n\t    Y: ['\\u0019'],\n\t    Z: ['\\u001A'],\n\t    '[': ['\\u001B', '\\e'],\n\t    '\\\\': ['\\u001C'],\n\t    ']': ['\\u001D'],\n\t    '^': ['\\u001E'],\n\t    '_': ['\\u001F']\n\t}*/\n\n\t// ASCII printable code chart\n\t// var LOWER = 'abcdefghijklmnopqrstuvwxyz'\n\t// var UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\t// var NUMBER = '0123456789'\n\t// var SYMBOL = ' !\"#$%&\\'()*+,-./' + ':;<=>?@' + '[\\\\]^_`' + '{|}~'\n\tvar LOWER = ascii(97, 122)\n\tvar UPPER = ascii(65, 90)\n\tvar NUMBER = ascii(48, 57)\n\tvar OTHER = ascii(32, 47) + ascii(58, 64) + ascii(91, 96) + ascii(123, 126) // 排除 95 _ ascii(91, 94) + ascii(96, 96)\n\tvar PRINTABLE = ascii(32, 126)\n\tvar SPACE = ' \\f\\n\\r\\t\\v\\u00A0\\u2028\\u2029'\n\tvar CHARACTER_CLASSES = {\n\t    '\\\\w': LOWER + UPPER + NUMBER + '_', // ascii(95, 95)\n\t    '\\\\W': OTHER.replace('_', ''),\n\t    '\\\\s': SPACE,\n\t    '\\\\S': function() {\n\t        var result = PRINTABLE\n\t        for (var i = 0; i < SPACE.length; i++) {\n\t            result = result.replace(SPACE[i], '')\n\t        }\n\t        return result\n\t    }(),\n\t    '\\\\d': NUMBER,\n\t    '\\\\D': LOWER + UPPER + OTHER\n\t}\n\n\tfunction ascii(from, to) {\n\t    var result = ''\n\t    for (var i = from; i <= to; i++) {\n\t        result += String.fromCharCode(i)\n\t    }\n\t    return result\n\t}\n\n\t// var ast = RegExpParser.parse(regexp.source)\n\tHandler.gen = function(node, result, cache) {\n\t    cache = cache || {\n\t        guid: 1\n\t    }\n\t    return Handler[node.type] ? Handler[node.type](node, result, cache) :\n\t        Handler.token(node, result, cache)\n\t}\n\n\tHandler.extend({\n\t    /* jshint unused:false */\n\t    token: function(node, result, cache) {\n\t        switch (node.type) {\n\t            case 'start':\n\t            case 'end':\n\t                return ''\n\t            case 'any-character':\n\t                return Random.character()\n\t            case 'backspace':\n\t                return ''\n\t            case 'word-boundary': // TODO\n\t                return ''\n\t            case 'non-word-boundary': // TODO\n\t                break\n\t            case 'digit':\n\t                return Random.pick(\n\t                    NUMBER.split('')\n\t                )\n\t            case 'non-digit':\n\t                return Random.pick(\n\t                    (LOWER + UPPER + OTHER).split('')\n\t                )\n\t            case 'form-feed':\n\t                break\n\t            case 'line-feed':\n\t                return node.body || node.text\n\t            case 'carriage-return':\n\t                break\n\t            case 'white-space':\n\t                return Random.pick(\n\t                    SPACE.split('')\n\t                )\n\t            case 'non-white-space':\n\t                return Random.pick(\n\t                    (LOWER + UPPER + NUMBER).split('')\n\t                )\n\t            case 'tab':\n\t                break\n\t            case 'vertical-tab':\n\t                break\n\t            case 'word': // \\w [a-zA-Z0-9]\n\t                return Random.pick(\n\t                    (LOWER + UPPER + NUMBER).split('')\n\t                )\n\t            case 'non-word': // \\W [^a-zA-Z0-9]\n\t                return Random.pick(\n\t                    OTHER.replace('_', '').split('')\n\t                )\n\t            case 'null-character':\n\t                break\n\t        }\n\t        return node.body || node.text\n\t    },\n\t    /*\n\t        {\n\t            type: 'alternate',\n\t            offset: 0,\n\t            text: '',\n\t            left: {\n\t                boyd: []\n\t            },\n\t            right: {\n\t                boyd: []\n\t            }\n\t        }\n\t    */\n\t    alternate: function(node, result, cache) {\n\t        // node.left/right {}\n\t        return this.gen(\n\t            Random.boolean() ? node.left : node.right,\n\t            result,\n\t            cache\n\t        )\n\t    },\n\t    /*\n\t        {\n\t            type: 'match',\n\t            offset: 0,\n\t            text: '',\n\t            body: []\n\t        }\n\t    */\n\t    match: function(node, result, cache) {\n\t        result = ''\n\t            // node.body []\n\t        for (var i = 0; i < node.body.length; i++) {\n\t            result += this.gen(node.body[i], result, cache)\n\t        }\n\t        return result\n\t    },\n\t    // ()\n\t    'capture-group': function(node, result, cache) {\n\t        // node.body {}\n\t        result = this.gen(node.body, result, cache)\n\t        cache[cache.guid++] = result\n\t        return result\n\t    },\n\t    // (?:...)\n\t    'non-capture-group': function(node, result, cache) {\n\t        // node.body {}\n\t        return this.gen(node.body, result, cache)\n\t    },\n\t    // (?=p)\n\t    'positive-lookahead': function(node, result, cache) {\n\t        // node.body\n\t        return this.gen(node.body, result, cache)\n\t    },\n\t    // (?!p)\n\t    'negative-lookahead': function(node, result, cache) {\n\t        // node.body\n\t        return ''\n\t    },\n\t    /*\n\t        {\n\t            type: 'quantified',\n\t            offset: 3,\n\t            text: 'c*',\n\t            body: {\n\t                type: 'literal',\n\t                offset: 3,\n\t                text: 'c',\n\t                body: 'c',\n\t                escaped: false\n\t            },\n\t            quantifier: {\n\t                type: 'quantifier',\n\t                offset: 4,\n\t                text: '*',\n\t                min: 0,\n\t                max: Infinity,\n\t                greedy: true\n\t            }\n\t        }\n\t    */\n\t    quantified: function(node, result, cache) {\n\t        result = ''\n\t            // node.quantifier {}\n\t        var count = this.quantifier(node.quantifier);\n\t        // node.body {}\n\t        for (var i = 0; i < count; i++) {\n\t            result += this.gen(node.body, result, cache)\n\t        }\n\t        return result\n\t    },\n\t    /*\n\t        quantifier: {\n\t            type: 'quantifier',\n\t            offset: 4,\n\t            text: '*',\n\t            min: 0,\n\t            max: Infinity,\n\t            greedy: true\n\t        }\n\t    */\n\t    quantifier: function(node, result, cache) {\n\t        var min = Math.max(node.min, 0)\n\t        var max = isFinite(node.max) ? node.max :\n\t            min + Random.integer(3, 7)\n\t        return Random.integer(min, max)\n\t    },\n\t    /*\n\t        \n\t    */\n\t    charset: function(node, result, cache) {\n\t        // node.invert\n\t        if (node.invert) return this['invert-charset'](node, result, cache)\n\n\t        // node.body []\n\t        var literal = Random.pick(node.body)\n\t        return this.gen(literal, result, cache)\n\t    },\n\t    'invert-charset': function(node, result, cache) {\n\t        var pool = PRINTABLE\n\t        for (var i = 0, item; i < node.body.length; i++) {\n\t            item = node.body[i]\n\t            switch (item.type) {\n\t                case 'literal':\n\t                    pool = pool.replace(item.body, '')\n\t                    break\n\t                case 'range':\n\t                    var min = this.gen(item.start, result, cache).charCodeAt()\n\t                    var max = this.gen(item.end, result, cache).charCodeAt()\n\t                    for (var ii = min; ii <= max; ii++) {\n\t                        pool = pool.replace(String.fromCharCode(ii), '')\n\t                    }\n\t                    /* falls through */\n\t                default:\n\t                    var characters = CHARACTER_CLASSES[item.text]\n\t                    if (characters) {\n\t                        for (var iii = 0; iii <= characters.length; iii++) {\n\t                            pool = pool.replace(characters[iii], '')\n\t                        }\n\t                    }\n\t            }\n\t        }\n\t        return Random.pick(pool.split(''))\n\t    },\n\t    range: function(node, result, cache) {\n\t        // node.start, node.end\n\t        var min = this.gen(node.start, result, cache).charCodeAt()\n\t        var max = this.gen(node.end, result, cache).charCodeAt()\n\t        return String.fromCharCode(\n\t            Random.integer(min, max)\n\t        )\n\t    },\n\t    literal: function(node, result, cache) {\n\t        return node.escaped ? node.body : node.text\n\t    },\n\t    // Unicode \\u\n\t    unicode: function(node, result, cache) {\n\t        return String.fromCharCode(\n\t            parseInt(node.code, 16)\n\t        )\n\t    },\n\t    // 十六进制 \\xFF\n\t    hex: function(node, result, cache) {\n\t        return String.fromCharCode(\n\t            parseInt(node.code, 16)\n\t        )\n\t    },\n\t    // 八进制 \\0\n\t    octal: function(node, result, cache) {\n\t        return String.fromCharCode(\n\t            parseInt(node.code, 8)\n\t        )\n\t    },\n\t    // 反向引用\n\t    'back-reference': function(node, result, cache) {\n\t        return cache[node.code] || ''\n\t    },\n\t    /*\n\t        http://en.wikipedia.org/wiki/C0_and_C1_control_codes\n\t    */\n\t    CONTROL_CHARACTER_MAP: function() {\n\t        var CONTROL_CHARACTER = '@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\\\ ] ^ _'.split(' ')\n\t        var CONTROL_CHARACTER_UNICODE = '\\u0000 \\u0001 \\u0002 \\u0003 \\u0004 \\u0005 \\u0006 \\u0007 \\u0008 \\u0009 \\u000A \\u000B \\u000C \\u000D \\u000E \\u000F \\u0010 \\u0011 \\u0012 \\u0013 \\u0014 \\u0015 \\u0016 \\u0017 \\u0018 \\u0019 \\u001A \\u001B \\u001C \\u001D \\u001E \\u001F'.split(' ')\n\t        var map = {}\n\t        for (var i = 0; i < CONTROL_CHARACTER.length; i++) {\n\t            map[CONTROL_CHARACTER[i]] = CONTROL_CHARACTER_UNICODE[i]\n\t        }\n\t        return map\n\t    }(),\n\t    'control-character': function(node, result, cache) {\n\t        return this.CONTROL_CHARACTER_MAP[node.code]\n\t    }\n\t})\n\n\tmodule.exports = Handler\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(24)\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t    ## toJSONSchema\n\n\t    把 Mock.js 风格的数据模板转换成 JSON Schema。\n\n\t    > [JSON Schema](http://json-schema.org/)\n\t */\n\tvar Constant = __webpack_require__(2)\n\tvar Util = __webpack_require__(3)\n\tvar Parser = __webpack_require__(4)\n\n\tfunction toJSONSchema(template, name, path /* Internal Use Only */ ) {\n\t    // type rule properties items\n\t    path = path || []\n\t    var result = {\n\t        name: typeof name === 'string' ? name.replace(Constant.RE_KEY, '$1') : name,\n\t        template: template,\n\t        type: Util.type(template), // 可能不准确,例如 { 'name|1': [{}, {} ...] }\n\t        rule: Parser.parse(name)\n\t    }\n\t    result.path = path.slice(0)\n\t    result.path.push(name === undefined ? 'ROOT' : result.name)\n\n\t    switch (result.type) {\n\t        case 'array':\n\t            result.items = []\n\t            Util.each(template, function(value, index) {\n\t                result.items.push(\n\t                    toJSONSchema(value, index, result.path)\n\t                )\n\t            })\n\t            break\n\t        case 'object':\n\t            result.properties = []\n\t            Util.each(template, function(value, name) {\n\t                result.properties.push(\n\t                    toJSONSchema(value, name, result.path)\n\t                )\n\t            })\n\t            break\n\t    }\n\n\t    return result\n\n\t}\n\n\tmodule.exports = toJSONSchema\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(26)\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t    ## valid(template, data)\n\n\t    校验真实数据 data 是否与数据模板 template 匹配。\n\t    \n\t    实现思路:\n\t    1. 解析规则。\n\t        先把数据模板 template 解析为更方便机器解析的 JSON-Schame\n\t        name               属性名 \n\t        type               属性值类型\n\t        template           属性值模板\n\t        properties         对象属性数组\n\t        items              数组元素数组\n\t        rule               属性值生成规则\n\t    2. 递归验证规则。\n\t        然后用 JSON-Schema 校验真实数据,校验项包括属性名、值类型、值、值生成规则。\n\n\t    提示信息 \n\t    https://github.com/fge/json-schema-validator/blob/master/src/main/resources/com/github/fge/jsonschema/validator/validation.properties\n\t    [JSON-Schama validator](http://json-schema-validator.herokuapp.com/)\n\t    [Regexp Demo](http://demos.forbeslindesay.co.uk/regexp/)\n\t*/\n\tvar Constant = __webpack_require__(2)\n\tvar Util = __webpack_require__(3)\n\tvar toJSONSchema = __webpack_require__(23)\n\n\tfunction valid(template, data) {\n\t    var schema = toJSONSchema(template)\n\t    var result = Diff.diff(schema, data)\n\t    for (var i = 0; i < result.length; i++) {\n\t        // console.log(template, data)\n\t        // console.warn(Assert.message(result[i]))\n\t    }\n\t    return result\n\t}\n\n\t/*\n\t    ## name\n\t        有生成规则:比较解析后的 name\n\t        无生成规则:直接比较\n\t    ## type\n\t        无类型转换:直接比较\n\t        有类型转换:先试着解析 template,然后再检查?\n\t    ## value vs. template\n\t        基本类型\n\t            无生成规则:直接比较\n\t            有生成规则:\n\t                number\n\t                    min-max.dmin-dmax\n\t                    min-max.dcount\n\t                    count.dmin-dmax\n\t                    count.dcount\n\t                    +step\n\t                    整数部分\n\t                    小数部分\n\t                boolean \n\t                string  \n\t                    min-max\n\t                    count\n\t    ## properties\n\t        对象\n\t            有生成规则:检测期望的属性个数,继续递归\n\t            无生成规则:检测全部的属性个数,继续递归\n\t    ## items\n\t        数组\n\t            有生成规则:\n\t                `'name|1': [{}, {} ...]`            其中之一,继续递归\n\t                `'name|+1': [{}, {} ...]`           顺序检测,继续递归\n\t                `'name|min-max': [{}, {} ...]`      检测个数,继续递归\n\t                `'name|count': [{}, {} ...]`        检测个数,继续递归\n\t            无生成规则:检测全部的元素个数,继续递归\n\t*/\n\tvar Diff = {\n\t    diff: function diff(schema, data, name /* Internal Use Only */ ) {\n\t        var result = []\n\n\t        // 先检测名称 name 和类型 type,如果匹配,才有必要继续检测\n\t        if (\n\t            this.name(schema, data, name, result) &&\n\t            this.type(schema, data, name, result)\n\t        ) {\n\t            this.value(schema, data, name, result)\n\t            this.properties(schema, data, name, result)\n\t            this.items(schema, data, name, result)\n\t        }\n\n\t        return result\n\t    },\n\t    /* jshint unused:false */\n\t    name: function(schema, data, name, result) {\n\t        var length = result.length\n\n\t        Assert.equal('name', schema.path, name + '', schema.name + '', result)\n\n\t        return result.length === length\n\t    },\n\t    type: function(schema, data, name, result) {\n\t        var length = result.length\n\n\t        switch (schema.type) {\n\t            case 'string':\n\t                // 跳过含有『占位符』的属性值,因为『占位符』返回值的类型可能和模板不一致,例如 '@int' 会返回一个整形值\n\t                if (schema.template.match(Constant.RE_PLACEHOLDER)) return true\n\t                break\n\t            case 'array':\n\t                if (schema.rule.parameters) {\n\t                    // name|count: array\n\t                    if (schema.rule.min !== undefined && schema.rule.max === undefined) {\n\t                        // 跳过 name|1: array,因为最终值的类型(很可能)不是数组,也不一定与 `array` 中的类型一致\n\t                        if (schema.rule.count === 1) return true\n\t                    }\n\t                    // 跳过 name|+inc: array\n\t                    if (schema.rule.parameters[2]) return true\n\t                }\n\t                break\n\t            case 'function':\n\t                // 跳过 `'name': function`,因为函数可以返回任何类型的值。\n\t                return true\n\t        }\n\n\t        Assert.equal('type', schema.path, Util.type(data), schema.type, result)\n\n\t        return result.length === length\n\t    },\n\t    value: function(schema, data, name, result) {\n\t        var length = result.length\n\n\t        var rule = schema.rule\n\t        var templateType = schema.type\n\t        if (templateType === 'object' || templateType === 'array' || templateType === 'function') return true\n\n\t        // 无生成规则\n\t        if (!rule.parameters) {\n\t            switch (templateType) {\n\t                case 'regexp':\n\t                    Assert.match('value', schema.path, data, schema.template, result)\n\t                    return result.length === length\n\t                case 'string':\n\t                    // 同样跳过含有『占位符』的属性值,因为『占位符』的返回值会通常会与模板不一致\n\t                    if (schema.template.match(Constant.RE_PLACEHOLDER)) return result.length === length\n\t                    break\n\t            }\n\t            Assert.equal('value', schema.path, data, schema.template, result)\n\t            return result.length === length\n\t        }\n\n\t        // 有生成规则\n\t        var actualRepeatCount\n\t        switch (templateType) {\n\t            case 'number':\n\t                var parts = (data + '').split('.')\n\t                parts[0] = +parts[0]\n\n\t                // 整数部分\n\t                // |min-max\n\t                if (rule.min !== undefined && rule.max !== undefined) {\n\t                    Assert.greaterThanOrEqualTo('value', schema.path, parts[0], Math.min(rule.min, rule.max), result)\n\t                        // , 'numeric instance is lower than the required minimum (minimum: {expected}, found: {actual})')\n\t                    Assert.lessThanOrEqualTo('value', schema.path, parts[0], Math.max(rule.min, rule.max), result)\n\t                }\n\t                // |count\n\t                if (rule.min !== undefined && rule.max === undefined) {\n\t                    Assert.equal('value', schema.path, parts[0], rule.min, result, '[value] ' + name)\n\t                }\n\n\t                // 小数部分\n\t                if (rule.decimal) {\n\t                    // |dmin-dmax\n\t                    if (rule.dmin !== undefined && rule.dmax !== undefined) {\n\t                        Assert.greaterThanOrEqualTo('value', schema.path, parts[1].length, rule.dmin, result)\n\t                        Assert.lessThanOrEqualTo('value', schema.path, parts[1].length, rule.dmax, result)\n\t                    }\n\t                    // |dcount\n\t                    if (rule.dmin !== undefined && rule.dmax === undefined) {\n\t                        Assert.equal('value', schema.path, parts[1].length, rule.dmin, result)\n\t                    }\n\t                }\n\n\t                break\n\n\t            case 'boolean':\n\t                break\n\n\t            case 'string':\n\t                // 'aaa'.match(/a/g)\n\t                actualRepeatCount = data.match(new RegExp(schema.template, 'g'))\n\t                actualRepeatCount = actualRepeatCount ? actualRepeatCount.length : 0\n\n\t                // |min-max\n\t                if (rule.min !== undefined && rule.max !== undefined) {\n\t                    Assert.greaterThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.min, result)\n\t                    Assert.lessThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.max, result)\n\t                }\n\t                // |count\n\t                if (rule.min !== undefined && rule.max === undefined) {\n\t                    Assert.equal('repeat count', schema.path, actualRepeatCount, rule.min, result)\n\t                }\n\n\t                break\n\n\t            case 'regexp':\n\t                actualRepeatCount = data.match(new RegExp(schema.template.source.replace(/^\\^|\\$$/g, ''), 'g'))\n\t                actualRepeatCount = actualRepeatCount ? actualRepeatCount.length : 0\n\n\t                // |min-max\n\t                if (rule.min !== undefined && rule.max !== undefined) {\n\t                    Assert.greaterThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.min, result)\n\t                    Assert.lessThanOrEqualTo('repeat count', schema.path, actualRepeatCount, rule.max, result)\n\t                }\n\t                // |count\n\t                if (rule.min !== undefined && rule.max === undefined) {\n\t                    Assert.equal('repeat count', schema.path, actualRepeatCount, rule.min, result)\n\t                }\n\t                break\n\t        }\n\n\t        return result.length === length\n\t    },\n\t    properties: function(schema, data, name, result) {\n\t        var length = result.length\n\n\t        var rule = schema.rule\n\t        var keys = Util.keys(data)\n\t        if (!schema.properties) return\n\n\t        // 无生成规则\n\t        if (!schema.rule.parameters) {\n\t            Assert.equal('properties length', schema.path, keys.length, schema.properties.length, result)\n\t        } else {\n\t            // 有生成规则\n\t            // |min-max\n\t            if (rule.min !== undefined && rule.max !== undefined) {\n\t                Assert.greaterThanOrEqualTo('properties length', schema.path, keys.length, Math.min(rule.min, rule.max), result)\n\t                Assert.lessThanOrEqualTo('properties length', schema.path, keys.length, Math.max(rule.min, rule.max), result)\n\t            }\n\t            // |count\n\t            if (rule.min !== undefined && rule.max === undefined) {\n\t                // |1, |>1\n\t                if (rule.count !== 1) Assert.equal('properties length', schema.path, keys.length, rule.min, result)\n\t            }\n\t        }\n\n\t        if (result.length !== length) return false\n\n\t        for (var i = 0; i < keys.length; i++) {\n\t            result.push.apply(\n\t                result,\n\t                this.diff(\n\t                    function() {\n\t                        var property\n\t                        Util.each(schema.properties, function(item /*, index*/ ) {\n\t                            if (item.name === keys[i]) property = item\n\t                        })\n\t                        return property || schema.properties[i]\n\t                    }(),\n\t                    data[keys[i]],\n\t                    keys[i]\n\t                )\n\t            )\n\t        }\n\n\t        return result.length === length\n\t    },\n\t    items: function(schema, data, name, result) {\n\t        var length = result.length\n\n\t        if (!schema.items) return\n\n\t        var rule = schema.rule\n\n\t        // 无生成规则\n\t        if (!schema.rule.parameters) {\n\t            Assert.equal('items length', schema.path, data.length, schema.items.length, result)\n\t        } else {\n\t            // 有生成规则\n\t            // |min-max\n\t            if (rule.min !== undefined && rule.max !== undefined) {\n\t                Assert.greaterThanOrEqualTo('items', schema.path, data.length, (Math.min(rule.min, rule.max) * schema.items.length), result,\n\t                    '[{utype}] array is too short: {path} must have at least {expected} elements but instance has {actual} elements')\n\t                Assert.lessThanOrEqualTo('items', schema.path, data.length, (Math.max(rule.min, rule.max) * schema.items.length), result,\n\t                    '[{utype}] array is too long: {path} must have at most {expected} elements but instance has {actual} elements')\n\t            }\n\t            // |count\n\t            if (rule.min !== undefined && rule.max === undefined) {\n\t                // |1, |>1\n\t                if (rule.count === 1) return result.length === length\n\t                else Assert.equal('items length', schema.path, data.length, (rule.min * schema.items.length), result)\n\t            }\n\t            // |+inc\n\t            if (rule.parameters[2]) return result.length === length\n\t        }\n\n\t        if (result.length !== length) return false\n\n\t        for (var i = 0; i < data.length; i++) {\n\t            result.push.apply(\n\t                result,\n\t                this.diff(\n\t                    schema.items[i % schema.items.length],\n\t                    data[i],\n\t                    i % schema.items.length\n\t                )\n\t            )\n\t        }\n\n\t        return result.length === length\n\t    }\n\t}\n\n\t/*\n\t    完善、友好的提示信息\n\t    \n\t    Equal, not equal to, greater than, less than, greater than or equal to, less than or equal to\n\t    路径 验证类型 描述 \n\n\t    Expect path.name is less than or equal to expected, but path.name is actual.\n\n\t    Expect path.name is less than or equal to expected, but path.name is actual.\n\t    Expect path.name is greater than or equal to expected, but path.name is actual.\n\n\t*/\n\tvar Assert = {\n\t    message: function(item) {\n\t        return (item.message ||\n\t                '[{utype}] Expect {path}\\'{ltype} {action} {expected}, but is {actual}')\n\t            .replace('{utype}', item.type.toUpperCase())\n\t            .replace('{ltype}', item.type.toLowerCase())\n\t            .replace('{path}', Util.isArray(item.path) && item.path.join('.') || item.path)\n\t            .replace('{action}', item.action)\n\t            .replace('{expected}', item.expected)\n\t            .replace('{actual}', item.actual)\n\t    },\n\t    equal: function(type, path, actual, expected, result, message) {\n\t        if (actual === expected) return true\n\t        switch (type) {\n\t            case 'type':\n\t                // 正则模板 === 字符串最终值\n\t                if (expected === 'regexp' && actual === 'string') return true\n\t                break\n\t        }\n\n\t        var item = {\n\t            path: path,\n\t            type: type,\n\t            actual: actual,\n\t            expected: expected,\n\t            action: 'is equal to',\n\t            message: message\n\t        }\n\t        item.message = Assert.message(item)\n\t        result.push(item)\n\t        return false\n\t    },\n\t    // actual matches expected\n\t    match: function(type, path, actual, expected, result, message) {\n\t        if (expected.test(actual)) return true\n\n\t        var item = {\n\t            path: path,\n\t            type: type,\n\t            actual: actual,\n\t            expected: expected,\n\t            action: 'matches',\n\t            message: message\n\t        }\n\t        item.message = Assert.message(item)\n\t        result.push(item)\n\t        return false\n\t    },\n\t    notEqual: function(type, path, actual, expected, result, message) {\n\t        if (actual !== expected) return true\n\t        var item = {\n\t            path: path,\n\t            type: type,\n\t            actual: actual,\n\t            expected: expected,\n\t            action: 'is not equal to',\n\t            message: message\n\t        }\n\t        item.message = Assert.message(item)\n\t        result.push(item)\n\t        return false\n\t    },\n\t    greaterThan: function(type, path, actual, expected, result, message) {\n\t        if (actual > expected) return true\n\t        var item = {\n\t            path: path,\n\t            type: type,\n\t            actual: actual,\n\t            expected: expected,\n\t            action: 'is greater than',\n\t            message: message\n\t        }\n\t        item.message = Assert.message(item)\n\t        result.push(item)\n\t        return false\n\t    },\n\t    lessThan: function(type, path, actual, expected, result, message) {\n\t        if (actual < expected) return true\n\t        var item = {\n\t            path: path,\n\t            type: type,\n\t            actual: actual,\n\t            expected: expected,\n\t            action: 'is less to',\n\t            message: message\n\t        }\n\t        item.message = Assert.message(item)\n\t        result.push(item)\n\t        return false\n\t    },\n\t    greaterThanOrEqualTo: function(type, path, actual, expected, result, message) {\n\t        if (actual >= expected) return true\n\t        var item = {\n\t            path: path,\n\t            type: type,\n\t            actual: actual,\n\t            expected: expected,\n\t            action: 'is greater than or equal to',\n\t            message: message\n\t        }\n\t        item.message = Assert.message(item)\n\t        result.push(item)\n\t        return false\n\t    },\n\t    lessThanOrEqualTo: function(type, path, actual, expected, result, message) {\n\t        if (actual <= expected) return true\n\t        var item = {\n\t            path: path,\n\t            type: type,\n\t            actual: actual,\n\t            expected: expected,\n\t            action: 'is less than or equal to',\n\t            message: message\n\t        }\n\t        item.message = Assert.message(item)\n\t        result.push(item)\n\t        return false\n\t    }\n\t}\n\n\tvalid.Diff = Diff\n\tvalid.Assert = Assert\n\n\tmodule.exports = valid\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(28)\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* global window, document, location, Event, setTimeout */\n\t/*\n\t    ## MockXMLHttpRequest\n\n\t    期望的功能:\n\t    1. 完整地覆盖原生 XHR 的行为\n\t    2. 完整地模拟原生 XHR 的行为\n\t    3. 在发起请求时,自动检测是否需要拦截\n\t    4. 如果不必拦截,则执行原生 XHR 的行为\n\t    5. 如果需要拦截,则执行虚拟 XHR 的行为\n\t    6. 兼容 XMLHttpRequest 和 ActiveXObject\n\t        new window.XMLHttpRequest()\n\t        new window.ActiveXObject(\"Microsoft.XMLHTTP\")\n\n\t    关键方法的逻辑:\n\t    * new   此时尚无法确定是否需要拦截,所以创建原生 XHR 对象是必须的。\n\t    * open  此时可以取到 URL,可以决定是否进行拦截。\n\t    * send  此时已经确定了请求方式。\n\n\t    规范:\n\t    http://xhr.spec.whatwg.org/\n\t    http://www.w3.org/TR/XMLHttpRequest2/\n\n\t    参考实现:\n\t    https://github.com/philikon/MockHttpRequest/blob/master/lib/mock.js\n\t    https://github.com/trek/FakeXMLHttpRequest/blob/master/fake_xml_http_request.js\n\t    https://github.com/ilinsky/xmlhttprequest/blob/master/XMLHttpRequest.js\n\t    https://github.com/firebug/firebug-lite/blob/master/content/lite/xhr.js\n\t    https://github.com/thx/RAP/blob/master/lab/rap.plugin.xinglie.js\n\n\t    **需不需要全面重写 XMLHttpRequest?**\n\t        http://xhr.spec.whatwg.org/#interface-xmlhttprequest\n\t        关键属性 readyState、status、statusText、response、responseText、responseXML 是 readonly,所以,试图通过修改这些状态,来模拟响应是不可行的。\n\t        因此,唯一的办法是模拟整个 XMLHttpRequest,就像 jQuery 对事件模型的封装。\n\n\t    // Event handlers\n\t    onloadstart         loadstart\n\t    onprogress          progress\n\t    onabort             abort\n\t    onerror             error\n\t    onload              load\n\t    ontimeout           timeout\n\t    onloadend           loadend\n\t    onreadystatechange  readystatechange\n\t */\n\n\tvar Util = __webpack_require__(3)\n\n\t// 备份原生 XMLHttpRequest\n\twindow._XMLHttpRequest = window.XMLHttpRequest\n\twindow._ActiveXObject = window.ActiveXObject\n\n\t/*\n\t    PhantomJS\n\t    TypeError: '[object EventConstructor]' is not a constructor (evaluating 'new Event(\"readystatechange\")')\n\n\t    https://github.com/bluerail/twitter-bootstrap-rails-confirm/issues/18\n\t    https://github.com/ariya/phantomjs/issues/11289\n\t*/\n\ttry {\n\t    new window.Event('custom')\n\t} catch (exception) {\n\t    window.Event = function(type, bubbles, cancelable, detail) {\n\t        var event = document.createEvent('CustomEvent') // MUST be 'CustomEvent'\n\t        event.initCustomEvent(type, bubbles, cancelable, detail)\n\t        return event\n\t    }\n\t}\n\n\tvar XHR_STATES = {\n\t    // The object has been constructed.\n\t    UNSENT: 0,\n\t    // The open() method has been successfully invoked.\n\t    OPENED: 1,\n\t    // All redirects (if any) have been followed and all HTTP headers of the response have been received.\n\t    HEADERS_RECEIVED: 2,\n\t    // The response's body is being received.\n\t    LOADING: 3,\n\t    // The data transfer has been completed or something went wrong during the transfer (e.g. infinite redirects).\n\t    DONE: 4\n\t}\n\n\tvar XHR_EVENTS = 'readystatechange loadstart progress abort error load timeout loadend'.split(' ')\n\tvar XHR_REQUEST_PROPERTIES = 'timeout withCredentials'.split(' ')\n\tvar XHR_RESPONSE_PROPERTIES = 'readyState responseURL status statusText responseType response responseText responseXML'.split(' ')\n\n\t// https://github.com/trek/FakeXMLHttpRequest/blob/master/fake_xml_http_request.js#L32\n\tvar HTTP_STATUS_CODES = {\n\t    100: \"Continue\",\n\t    101: \"Switching Protocols\",\n\t    200: \"OK\",\n\t    201: \"Created\",\n\t    202: \"Accepted\",\n\t    203: \"Non-Authoritative Information\",\n\t    204: \"No Content\",\n\t    205: \"Reset Content\",\n\t    206: \"Partial Content\",\n\t    300: \"Multiple Choice\",\n\t    301: \"Moved Permanently\",\n\t    302: \"Found\",\n\t    303: \"See Other\",\n\t    304: \"Not Modified\",\n\t    305: \"Use Proxy\",\n\t    307: \"Temporary Redirect\",\n\t    400: \"Bad Request\",\n\t    401: \"Unauthorized\",\n\t    402: \"Payment Required\",\n\t    403: \"Forbidden\",\n\t    404: \"Not Found\",\n\t    405: \"Method Not Allowed\",\n\t    406: \"Not Acceptable\",\n\t    407: \"Proxy Authentication Required\",\n\t    408: \"Request Timeout\",\n\t    409: \"Conflict\",\n\t    410: \"Gone\",\n\t    411: \"Length Required\",\n\t    412: \"Precondition Failed\",\n\t    413: \"Request Entity Too Large\",\n\t    414: \"Request-URI Too Long\",\n\t    415: \"Unsupported Media Type\",\n\t    416: \"Requested Range Not Satisfiable\",\n\t    417: \"Expectation Failed\",\n\t    422: \"Unprocessable Entity\",\n\t    500: \"Internal Server Error\",\n\t    501: \"Not Implemented\",\n\t    502: \"Bad Gateway\",\n\t    503: \"Service Unavailable\",\n\t    504: \"Gateway Timeout\",\n\t    505: \"HTTP Version Not Supported\"\n\t}\n\n\t/*\n\t    MockXMLHttpRequest\n\t*/\n\n\tfunction MockXMLHttpRequest() {\n\t    // 初始化 custom 对象,用于存储自定义属性\n\t    this.custom = {\n\t        events: {},\n\t        requestHeaders: {},\n\t        responseHeaders: {}\n\t    }\n\t}\n\n\tMockXMLHttpRequest._settings = {\n\t    timeout: '10-100',\n\t    /*\n\t        timeout: 50,\n\t        timeout: '10-100',\n\t     */\n\t}\n\n\tMockXMLHttpRequest.setup = function(settings) {\n\t    Util.extend(MockXMLHttpRequest._settings, settings)\n\t    return MockXMLHttpRequest._settings\n\t}\n\n\tUtil.extend(MockXMLHttpRequest, XHR_STATES)\n\tUtil.extend(MockXMLHttpRequest.prototype, XHR_STATES)\n\n\t// 标记当前对象为 MockXMLHttpRequest\n\tMockXMLHttpRequest.prototype.mock = true\n\n\t// 是否拦截 Ajax 请求\n\tMockXMLHttpRequest.prototype.match = false\n\n\t// 初始化 Request 相关的属性和方法\n\tUtil.extend(MockXMLHttpRequest.prototype, {\n\t    // https://xhr.spec.whatwg.org/#the-open()-method\n\t    // Sets the request method, request URL, and synchronous flag.\n\t    open: function(method, url, async, username, password) {\n\t        var that = this\n\n\t        Util.extend(this.custom, {\n\t            method: method,\n\t            url: url,\n\t            async: typeof async === 'boolean' ? async : true,\n\t            username: username,\n\t            password: password,\n\t            options: {\n\t                url: url,\n\t                type: method\n\t            }\n\t        })\n\n\t        this.custom.timeout = function(timeout) {\n\t            if (typeof timeout === 'number') return timeout\n\t            if (typeof timeout === 'string' && !~timeout.indexOf('-')) return parseInt(timeout, 10)\n\t            if (typeof timeout === 'string' && ~timeout.indexOf('-')) {\n\t                var tmp = timeout.split('-')\n\t                var min = parseInt(tmp[0], 10)\n\t                var max = parseInt(tmp[1], 10)\n\t                return Math.round(Math.random() * (max - min)) + min\n\t            }\n\t        }(MockXMLHttpRequest._settings.timeout)\n\n\t        // 查找与请求参数匹配的数据模板\n\t        var item = find(this.custom.options)\n\n\t        function handle(event) {\n\t            // 同步属性 NativeXMLHttpRequest => MockXMLHttpRequest\n\t            for (var i = 0; i < XHR_RESPONSE_PROPERTIES.length; i++) {\n\t                try {\n\t                    that[XHR_RESPONSE_PROPERTIES[i]] = xhr[XHR_RESPONSE_PROPERTIES[i]]\n\t                } catch (e) {}\n\t            }\n\t            // 触发 MockXMLHttpRequest 上的同名事件\n\t            that.dispatchEvent(new Event(event.type /*, false, false, that*/ ))\n\t        }\n\n\t        // 如果未找到匹配的数据模板,则采用原生 XHR 发送请求。\n\t        if (!item) {\n\t            // 创建原生 XHR 对象,调用原生 open(),监听所有原生事件\n\t            var xhr = createNativeXMLHttpRequest()\n\t            this.custom.xhr = xhr\n\n\t            // 初始化所有事件,用于监听原生 XHR 对象的事件\n\t            for (var i = 0; i < XHR_EVENTS.length; i++) {\n\t                xhr.addEventListener(XHR_EVENTS[i], handle)\n\t            }\n\n\t            // xhr.open()\n\t            if (username) xhr.open(method, url, async, username, password)\n\t            else xhr.open(method, url, async)\n\n\t            // 同步属性 MockXMLHttpRequest => NativeXMLHttpRequest\n\t            for (var j = 0; j < XHR_REQUEST_PROPERTIES.length; j++) {\n\t                try {\n\t                    xhr[XHR_REQUEST_PROPERTIES[j]] = that[XHR_REQUEST_PROPERTIES[j]]\n\t                } catch (e) {}\n\t            }\n\n\t            return\n\t        }\n\n\t        // 找到了匹配的数据模板,开始拦截 XHR 请求\n\t        this.match = true\n\t        this.custom.template = item\n\t        this.readyState = MockXMLHttpRequest.OPENED\n\t        this.dispatchEvent(new Event('readystatechange' /*, false, false, this*/ ))\n\t    },\n\t    // https://xhr.spec.whatwg.org/#the-setrequestheader()-method\n\t    // Combines a header in author request headers.\n\t    setRequestHeader: function(name, value) {\n\t        // 原生 XHR\n\t        if (!this.match) {\n\t            this.custom.xhr.setRequestHeader(name, value)\n\t            return\n\t        }\n\n\t        // 拦截 XHR\n\t        var requestHeaders = this.custom.requestHeaders\n\t        if (requestHeaders[name]) requestHeaders[name] += ',' + value\n\t        else requestHeaders[name] = value\n\t    },\n\t    timeout: 0,\n\t    withCredentials: false,\n\t    upload: {},\n\t    // https://xhr.spec.whatwg.org/#the-send()-method\n\t    // Initiates the request.\n\t    send: function send(data) {\n\t        var that = this\n\t        this.custom.options.body = data\n\n\t        // 原生 XHR\n\t        if (!this.match) {\n\t            this.custom.xhr.send(data)\n\t            return\n\t        }\n\n\t        // 拦截 XHR\n\n\t        // X-Requested-With header\n\t        this.setRequestHeader('X-Requested-With', 'MockXMLHttpRequest')\n\n\t        // loadstart The fetch initiates.\n\t        this.dispatchEvent(new Event('loadstart' /*, false, false, this*/ ))\n\n\t        if (this.custom.async) setTimeout(done, this.custom.timeout) // 异步\n\t        else done() // 同步\n\n\t        function done() {\n\t            that.readyState = MockXMLHttpRequest.HEADERS_RECEIVED\n\t            that.dispatchEvent(new Event('readystatechange' /*, false, false, that*/ ))\n\t            that.readyState = MockXMLHttpRequest.LOADING\n\t            that.dispatchEvent(new Event('readystatechange' /*, false, false, that*/ ))\n\n\t            that.status = 200\n\t            that.statusText = HTTP_STATUS_CODES[200]\n\n\t            // fix #92 #93 by @qddegtya\n\t            that.response = that.responseText = JSON.stringify(\n\t                convert(that.custom.template, that.custom.options),\n\t                null, 4\n\t            )\n\n\t            that.readyState = MockXMLHttpRequest.DONE\n\t            that.dispatchEvent(new Event('readystatechange' /*, false, false, that*/ ))\n\t            that.dispatchEvent(new Event('load' /*, false, false, that*/ ));\n\t            that.dispatchEvent(new Event('loadend' /*, false, false, that*/ ));\n\t        }\n\t    },\n\t    // https://xhr.spec.whatwg.org/#the-abort()-method\n\t    // Cancels any network activity.\n\t    abort: function abort() {\n\t        // 原生 XHR\n\t        if (!this.match) {\n\t            this.custom.xhr.abort()\n\t            return\n\t        }\n\n\t        // 拦截 XHR\n\t        this.readyState = MockXMLHttpRequest.UNSENT\n\t        this.dispatchEvent(new Event('abort', false, false, this))\n\t        this.dispatchEvent(new Event('error', false, false, this))\n\t    }\n\t})\n\n\t// 初始化 Response 相关的属性和方法\n\tUtil.extend(MockXMLHttpRequest.prototype, {\n\t    responseURL: '',\n\t    status: MockXMLHttpRequest.UNSENT,\n\t    statusText: '',\n\t    // https://xhr.spec.whatwg.org/#the-getresponseheader()-method\n\t    getResponseHeader: function(name) {\n\t        // 原生 XHR\n\t        if (!this.match) {\n\t            return this.custom.xhr.getResponseHeader(name)\n\t        }\n\n\t        // 拦截 XHR\n\t        return this.custom.responseHeaders[name.toLowerCase()]\n\t    },\n\t    // https://xhr.spec.whatwg.org/#the-getallresponseheaders()-method\n\t    // http://www.utf8-chartable.de/\n\t    getAllResponseHeaders: function() {\n\t        // 原生 XHR\n\t        if (!this.match) {\n\t            return this.custom.xhr.getAllResponseHeaders()\n\t        }\n\n\t        // 拦截 XHR\n\t        var responseHeaders = this.custom.responseHeaders\n\t        var headers = ''\n\t        for (var h in responseHeaders) {\n\t            if (!responseHeaders.hasOwnProperty(h)) continue\n\t            headers += h + ': ' + responseHeaders[h] + '\\r\\n'\n\t        }\n\t        return headers\n\t    },\n\t    overrideMimeType: function( /*mime*/ ) {},\n\t    responseType: '', // '', 'text', 'arraybuffer', 'blob', 'document', 'json'\n\t    response: null,\n\t    responseText: '',\n\t    responseXML: null\n\t})\n\n\t// EventTarget\n\tUtil.extend(MockXMLHttpRequest.prototype, {\n\t    addEventListener: function addEventListener(type, handle) {\n\t        var events = this.custom.events\n\t        if (!events[type]) events[type] = []\n\t        events[type].push(handle)\n\t    },\n\t    removeEventListener: function removeEventListener(type, handle) {\n\t        var handles = this.custom.events[type] || []\n\t        for (var i = 0; i < handles.length; i++) {\n\t            if (handles[i] === handle) {\n\t                handles.splice(i--, 1)\n\t            }\n\t        }\n\t    },\n\t    dispatchEvent: function dispatchEvent(event) {\n\t        var handles = this.custom.events[event.type] || []\n\t        for (var i = 0; i < handles.length; i++) {\n\t            handles[i].call(this, event)\n\t        }\n\n\t        var ontype = 'on' + event.type\n\t        if (this[ontype]) this[ontype](event)\n\t    }\n\t})\n\n\t// Inspired by jQuery\n\tfunction createNativeXMLHttpRequest() {\n\t    var isLocal = function() {\n\t        var rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/\n\t        var rurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/\n\t        var ajaxLocation = location.href\n\t        var ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || []\n\t        return rlocalProtocol.test(ajaxLocParts[1])\n\t    }()\n\n\t    return window.ActiveXObject ?\n\t        (!isLocal && createStandardXHR() || createActiveXHR()) : createStandardXHR()\n\n\t    function createStandardXHR() {\n\t        try {\n\t            return new window._XMLHttpRequest();\n\t        } catch (e) {}\n\t    }\n\n\t    function createActiveXHR() {\n\t        try {\n\t            return new window._ActiveXObject(\"Microsoft.XMLHTTP\");\n\t        } catch (e) {}\n\t    }\n\t}\n\n\n\t// 查找与请求参数匹配的数据模板:URL,Type\n\tfunction find(options) {\n\n\t    for (var sUrlType in MockXMLHttpRequest.Mock._mocked) {\n\t        var item = MockXMLHttpRequest.Mock._mocked[sUrlType]\n\t        if (\n\t            (!item.rurl || match(item.rurl, options.url)) &&\n\t            (!item.rtype || match(item.rtype, options.type.toLowerCase()))\n\t        ) {\n\t            // console.log('[mock]', options.url, '>', item.rurl)\n\t            return item\n\t        }\n\t    }\n\n\t    function match(expected, actual) {\n\t        if (Util.type(expected) === 'string') {\n\t            return expected === actual\n\t        }\n\t        if (Util.type(expected) === 'regexp') {\n\t            return expected.test(actual)\n\t        }\n\t    }\n\n\t}\n\n\t// 数据模板 => 响应数据\n\tfunction convert(item, options) {\n\t    return Util.isFunction(item.template) ?\n\t        item.template(options) : MockXMLHttpRequest.Mock.mock(item.template)\n\t}\n\n\tmodule.exports = MockXMLHttpRequest\n\n/***/ })\n/******/ ])\n});\n;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX21vY2tqc0AxLjEuMEBtb2NranMvZGlzdC9tb2NrLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19tb2NranNAMS4xLjBAbW9ja2pzL2Rpc3QvbW9jay5qcz8wM2ExIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIk1vY2tcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiTW9ja1wiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9LFxuLyoqKioqKi8gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bG9hZGVkOiBmYWxzZVxuLyoqKioqKi8gXHRcdH07XG5cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG5cblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogZ2xvYmFsIHJlcXVpcmUsIG1vZHVsZSwgd2luZG93ICovXG5cdHZhciBIYW5kbGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKVxuXHR2YXIgVXRpbCA9IF9fd2VicGFja19yZXF1aXJlX18oMylcblx0dmFyIFJhbmRvbSA9IF9fd2VicGFja19yZXF1aXJlX18oNSlcblx0dmFyIFJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMClcblx0dmFyIHRvSlNPTlNjaGVtYSA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpXG5cdHZhciB2YWxpZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpXG5cblx0dmFyIFhIUlxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIFhIUiA9IF9fd2VicGFja19yZXF1aXJlX18oMjcpXG5cblx0LyohXG5cdCAgICBNb2NrIC0g5qih5ouf6K+35rGCICYg5qih5ouf5pWw5o2uXG5cdCAgICBodHRwczovL2dpdGh1Yi5jb20vbnV5c29mdC9Nb2NrXG5cdCAgICDloqjmmbogbW96aGkuZ3l5QHRhb2Jhby5jb20gbnV5c29mdEBnbWFpbC5jb21cblx0Ki9cblx0dmFyIE1vY2sgPSB7XG5cdCAgICBIYW5kbGVyOiBIYW5kbGVyLFxuXHQgICAgUmFuZG9tOiBSYW5kb20sXG5cdCAgICBVdGlsOiBVdGlsLFxuXHQgICAgWEhSOiBYSFIsXG5cdCAgICBSRTogUkUsXG5cdCAgICB0b0pTT05TY2hlbWE6IHRvSlNPTlNjaGVtYSxcblx0ICAgIHZhbGlkOiB2YWxpZCxcblx0ICAgIGhlcmVkb2M6IFV0aWwuaGVyZWRvYyxcblx0ICAgIHNldHVwOiBmdW5jdGlvbihzZXR0aW5ncykge1xuXHQgICAgICAgIHJldHVybiBYSFIuc2V0dXAoc2V0dGluZ3MpXG5cdCAgICB9LFxuXHQgICAgX21vY2tlZDoge31cblx0fVxuXG5cdE1vY2sudmVyc2lvbiA9ICcxLjAuMS1iZXRhMydcblxuXHQvLyDpgb/lhY3lvqrnjq/kvp3otZZcblx0aWYgKFhIUikgWEhSLk1vY2sgPSBNb2NrXG5cblx0Lypcblx0ICAgICogTW9jay5tb2NrKCB0ZW1wbGF0ZSApXG5cdCAgICAqIE1vY2subW9jayggZnVuY3Rpb24oKSApXG5cdCAgICAqIE1vY2subW9jayggcnVybCwgdGVtcGxhdGUgKVxuXHQgICAgKiBNb2NrLm1vY2soIHJ1cmwsIGZ1bmN0aW9uKG9wdGlvbnMpIClcblx0ICAgICogTW9jay5tb2NrKCBydXJsLCBydHlwZSwgdGVtcGxhdGUgKVxuXHQgICAgKiBNb2NrLm1vY2soIHJ1cmwsIHJ0eXBlLCBmdW5jdGlvbihvcHRpb25zKSApXG5cblx0ICAgIOagueaNruaVsOaNruaooeadv+eUn+aIkOaooeaLn+aVsOaNruOAglxuXHQqL1xuXHRNb2NrLm1vY2sgPSBmdW5jdGlvbihydXJsLCBydHlwZSwgdGVtcGxhdGUpIHtcblx0ICAgIC8vIE1vY2subW9jayh0ZW1wbGF0ZSlcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgICAgcmV0dXJuIEhhbmRsZXIuZ2VuKHJ1cmwpXG5cdCAgICB9XG5cdCAgICAvLyBNb2NrLm1vY2socnVybCwgdGVtcGxhdGUpXG5cdCAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuXHQgICAgICAgIHRlbXBsYXRlID0gcnR5cGVcblx0ICAgICAgICBydHlwZSA9IHVuZGVmaW5lZFxuXHQgICAgfVxuXHQgICAgLy8g5oum5oiqIFhIUlxuXHQgICAgaWYgKFhIUikgd2luZG93LlhNTEh0dHBSZXF1ZXN0ID0gWEhSXG5cdCAgICBNb2NrLl9tb2NrZWRbcnVybCArIChydHlwZSB8fCAnJyldID0ge1xuXHQgICAgICAgIHJ1cmw6IHJ1cmwsXG5cdCAgICAgICAgcnR5cGU6IHJ0eXBlLFxuXHQgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIE1vY2tcblx0fVxuXG5cdG1vZHVsZS5leHBvcnRzID0gTW9ja1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBcblx0ICAgICMjIEhhbmRsZXJcblxuXHQgICAg5aSE55CG5pWw5o2u5qih5p2/44CCXG5cdCAgICBcblx0ICAgICogSGFuZGxlci5nZW4oIHRlbXBsYXRlLCBuYW1lPywgY29udGV4dD8gKVxuXG5cdCAgICAgICAg5YWl5Y+j5pa55rOV44CCXG5cblx0ICAgICogRGF0YSBUZW1wbGF0ZSBEZWZpbml0aW9uLCBEVERcblx0ICAgICAgICBcblx0ICAgICAgICDlpITnkIbmlbDmja7mqKHmnb/lrprkuYnjgIJcblxuXHQgICAgICAgICogSGFuZGxlci5hcnJheSggb3B0aW9ucyApXG5cdCAgICAgICAgKiBIYW5kbGVyLm9iamVjdCggb3B0aW9ucyApXG5cdCAgICAgICAgKiBIYW5kbGVyLm51bWJlciggb3B0aW9ucyApXG5cdCAgICAgICAgKiBIYW5kbGVyLmJvb2xlYW4oIG9wdGlvbnMgKVxuXHQgICAgICAgICogSGFuZGxlci5zdHJpbmcoIG9wdGlvbnMgKVxuXHQgICAgICAgICogSGFuZGxlci5mdW5jdGlvbiggb3B0aW9ucyApXG5cdCAgICAgICAgKiBIYW5kbGVyLnJlZ2V4cCggb3B0aW9ucyApXG5cdCAgICAgICAgXG5cdCAgICAgICAg5aSE55CG6Lev5b6E77yI55u45a+55ZKM57ud5a+577yJ44CCXG5cblx0ICAgICAgICAqIEhhbmRsZXIuZ2V0VmFsdWVCeUtleVBhdGgoIGtleSwgb3B0aW9ucyApXG5cblx0ICAgICogRGF0YSBQbGFjZWhvbGRlciBEZWZpbml0aW9uLCBEUERcblxuXHQgICAgICAgIOWkhOeQhuaVsOaNruWNoOS9jeespuWumuS5iVxuXG5cdCAgICAgICAgKiBIYW5kbGVyLnBsYWNlaG9sZGVyKCBwbGFjZWhvbGRlciwgY29udGV4dCwgdGVtcGxhdGVDb250ZXh0LCBvcHRpb25zIClcblxuXHQqL1xuXG5cdHZhciBDb25zdGFudCA9IF9fd2VicGFja19yZXF1aXJlX18oMilcblx0dmFyIFV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG5cdHZhciBQYXJzZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpXG5cdHZhciBSYW5kb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdHZhciBSRSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApXG5cblx0dmFyIEhhbmRsZXIgPSB7XG5cdCAgICBleHRlbmQ6IFV0aWwuZXh0ZW5kXG5cdH1cblxuXHQvKlxuXHQgICAgdGVtcGxhdGUgICAgICAgIOWxnuaAp+WAvO+8iOWNs+aVsOaNruaooeadv++8iVxuXHQgICAgbmFtZSAgICAgICAgICAgIOWxnuaAp+WQjVxuXHQgICAgY29udGV4dCAgICAgICAgIOaVsOaNruS4iuS4i+aWh++8jOeUn+aIkOWQjueahOaVsOaNrlxuXHQgICAgdGVtcGxhdGVDb250ZXh0IOaooeadv+S4iuS4i+aWh++8jFxuXG5cdCAgICBIYW5kbGUuZ2VuKHRlbXBsYXRlLCBuYW1lLCBvcHRpb25zKVxuXHQgICAgY29udGV4dFxuXHQgICAgICAgIGN1cnJlbnRDb250ZXh0LCB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0LCBcblx0ICAgICAgICBwYXRoLCB0ZW1wbGF0ZVBhdGhcblx0ICAgICAgICByb290LCB0ZW1wbGF0ZVJvb3Rcblx0Ki9cblx0SGFuZGxlci5nZW4gPSBmdW5jdGlvbih0ZW1wbGF0ZSwgbmFtZSwgY29udGV4dCkge1xuXHQgICAgLyoganNoaW50IC1XMDQxICovXG5cdCAgICBuYW1lID0gbmFtZSA9PSB1bmRlZmluZWQgPyAnJyA6IChuYW1lICsgJycpXG5cblx0ICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHt9XG5cdCAgICBjb250ZXh0ID0ge1xuXHQgICAgICAgICAgICAvLyDlvZPliY3orr/pl67ot6/lvoTvvIzlj6rmnInlsZ7mgKflkI3vvIzkuI3ljIXmi6znlJ/miJDop4TliJlcblx0ICAgICAgICAgICAgcGF0aDogY29udGV4dC5wYXRoIHx8IFtDb25zdGFudC5HVUlEXSxcblx0ICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBjb250ZXh0LnRlbXBsYXRlUGF0aCB8fCBbQ29uc3RhbnQuR1VJRCsrXSxcblx0ICAgICAgICAgICAgLy8g5pyA57uI5bGe5oCn5YC855qE5LiK5LiL5paHXG5cdCAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0OiBjb250ZXh0LmN1cnJlbnRDb250ZXh0LFxuXHQgICAgICAgICAgICAvLyDlsZ7mgKflgLzmqKHmnb/nmoTkuIrkuIvmlodcblx0ICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogY29udGV4dC50ZW1wbGF0ZUN1cnJlbnRDb250ZXh0IHx8IHRlbXBsYXRlLFxuXHQgICAgICAgICAgICAvLyDmnIDnu4jlgLznmoTmoLlcblx0ICAgICAgICAgICAgcm9vdDogY29udGV4dC5yb290IHx8IGNvbnRleHQuY3VycmVudENvbnRleHQsXG5cdCAgICAgICAgICAgIC8vIOaooeadv+eahOaguVxuXHQgICAgICAgICAgICB0ZW1wbGF0ZVJvb3Q6IGNvbnRleHQudGVtcGxhdGVSb290IHx8IGNvbnRleHQudGVtcGxhdGVDdXJyZW50Q29udGV4dCB8fCB0ZW1wbGF0ZVxuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBjb25zb2xlLmxvZygncGF0aDonLCBjb250ZXh0LnBhdGguam9pbignLicpLCB0ZW1wbGF0ZSlcblxuXHQgICAgdmFyIHJ1bGUgPSBQYXJzZXIucGFyc2UobmFtZSlcblx0ICAgIHZhciB0eXBlID0gVXRpbC50eXBlKHRlbXBsYXRlKVxuXHQgICAgdmFyIGRhdGFcblxuXHQgICAgaWYgKEhhbmRsZXJbdHlwZV0pIHtcblx0ICAgICAgICBkYXRhID0gSGFuZGxlclt0eXBlXSh7XG5cdCAgICAgICAgICAgIC8vIOWxnuaAp+WAvOexu+Wei1xuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICAvLyDlsZ7mgKflgLzmqKHmnb9cblx0ICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuXHQgICAgICAgICAgICAvLyDlsZ7mgKflkI0gKyDnlJ/miJDop4TliJlcblx0ICAgICAgICAgICAgbmFtZTogbmFtZSxcblx0ICAgICAgICAgICAgLy8g5bGe5oCn5ZCNXG5cdCAgICAgICAgICAgIHBhcnNlZE5hbWU6IG5hbWUgPyBuYW1lLnJlcGxhY2UoQ29uc3RhbnQuUkVfS0VZLCAnJDEnKSA6IG5hbWUsXG5cblx0ICAgICAgICAgICAgLy8g6Kej5p6Q5ZCO55qE55Sf5oiQ6KeE5YiZXG5cdCAgICAgICAgICAgIHJ1bGU6IHJ1bGUsXG5cdCAgICAgICAgICAgIC8vIOebuOWFs+S4iuS4i+aWh1xuXHQgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0XG5cdCAgICAgICAgfSlcblxuXHQgICAgICAgIGlmICghY29udGV4dC5yb290KSBjb250ZXh0LnJvb3QgPSBkYXRhXG5cdCAgICAgICAgcmV0dXJuIGRhdGFcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIHRlbXBsYXRlXG5cdH1cblxuXHRIYW5kbGVyLmV4dGVuZCh7XG5cdCAgICBhcnJheTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHQgICAgICAgIHZhciByZXN1bHQgPSBbXSxcblx0ICAgICAgICAgICAgaSwgaWk7XG5cblx0ICAgICAgICAvLyAnbmFtZXwxJzogW11cblx0ICAgICAgICAvLyAnbmFtZXxjb3VudCc6IFtdXG5cdCAgICAgICAgLy8gJ25hbWV8bWluLW1heCc6IFtdXG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGVtcGxhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0XG5cblx0ICAgICAgICAvLyAnYXJyJzogW3sgJ2VtYWlsJzogJ0BFTUFJTCcgfSwgeyAnZW1haWwnOiAnQEVNQUlMJyB9XVxuXHQgICAgICAgIGlmICghb3B0aW9ucy5ydWxlLnBhcmFtZXRlcnMpIHtcblx0ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMudGVtcGxhdGUubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC5wYXRoLnB1c2goaSlcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChpKVxuXHQgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goXG5cdCAgICAgICAgICAgICAgICAgICAgSGFuZGxlci5nZW4ob3B0aW9ucy50ZW1wbGF0ZVtpXSwgaSwge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLmNvbnRleHQucGF0aCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dDogcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0OiBvcHRpb25zLnRlbXBsYXRlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICByb290OiBvcHRpb25zLmNvbnRleHQucm9vdCB8fCByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUm9vdDogb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUm9vdCB8fCBvcHRpb25zLnRlbXBsYXRlXG5cdCAgICAgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIClcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC5wYXRoLnBvcCgpXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLnBvcCgpXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvLyAnbWV0aG9kfDEnOiBbJ0dFVCcsICdQT1NUJywgJ0hFQUQnLCAnREVMRVRFJ11cblx0ICAgICAgICAgICAgaWYgKG9wdGlvbnMucnVsZS5taW4gPT09IDEgJiYgb3B0aW9ucy5ydWxlLm1heCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBmaXggIzE3XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wdXNoKG9wdGlvbnMubmFtZSlcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChvcHRpb25zLm5hbWUpXG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSBSYW5kb20ucGljayhcblx0ICAgICAgICAgICAgICAgICAgICBIYW5kbGVyLmdlbihvcHRpb25zLnRlbXBsYXRlLCB1bmRlZmluZWQsIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogb3B0aW9ucy5jb250ZXh0LnBhdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGF0aDogb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUGF0aCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRleHQ6IHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogb3B0aW9ucy50ZW1wbGF0ZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDogb3B0aW9ucy5jb250ZXh0LnJvb3QgfHwgcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJvb3Q6IG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVJvb3QgfHwgb3B0aW9ucy50ZW1wbGF0ZVxuXHQgICAgICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wb3AoKVxuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUGF0aC5wb3AoKVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gJ2RhdGF8KzEnOiBbe30sIHt9XVxuXHQgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucnVsZS5wYXJhbWV0ZXJzWzJdKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZS5fX29yZGVyX2luZGV4ID0gb3B0aW9ucy50ZW1wbGF0ZS5fX29yZGVyX2luZGV4IHx8IDBcblxuXHQgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC5wYXRoLnB1c2gob3B0aW9ucy5uYW1lKVxuXHQgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChvcHRpb25zLm5hbWUpXG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gSGFuZGxlci5nZW4ob3B0aW9ucy50ZW1wbGF0ZSwgdW5kZWZpbmVkLCB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMuY29udGV4dC5wYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0OiByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ3VycmVudENvbnRleHQ6IG9wdGlvbnMudGVtcGxhdGUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IG9wdGlvbnMuY29udGV4dC5yb290IHx8IHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSb290OiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVSb290IHx8IG9wdGlvbnMudGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgICAgICB9KVtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZS5fX29yZGVyX2luZGV4ICUgb3B0aW9ucy50ZW1wbGF0ZS5sZW5ndGhcblx0ICAgICAgICAgICAgICAgICAgICBdXG5cblx0ICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRlbXBsYXRlLl9fb3JkZXJfaW5kZXggKz0gK29wdGlvbnMucnVsZS5wYXJhbWV0ZXJzWzJdXG5cblx0ICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wb3AoKVxuXHQgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucG9wKClcblxuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyAnZGF0YXwxLTEwJzogW3t9XVxuXHQgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb25zLnJ1bGUuY291bnQ7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyAnZGF0YXwxLTEwJzogW3t9LCB7fV1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgb3B0aW9ucy50ZW1wbGF0ZS5sZW5ndGg7IGlpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC5wYXRoLnB1c2gocmVzdWx0Lmxlbmd0aClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChpaSlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXIuZ2VuKG9wdGlvbnMudGVtcGxhdGVbaWldLCByZXN1bHQubGVuZ3RoLCB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMuY29udGV4dC5wYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0OiByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ3VycmVudENvbnRleHQ6IG9wdGlvbnMudGVtcGxhdGUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IG9wdGlvbnMuY29udGV4dC5yb290IHx8IHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSb290OiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVSb290IHx8IG9wdGlvbnMudGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnBhdGgucG9wKClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucG9wKClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0XG5cdCAgICB9LFxuXHQgICAgb2JqZWN0OiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IHt9LFxuXHQgICAgICAgICAgICBrZXlzLCBmbktleXMsIGtleSwgcGFyc2VkS2V5LCBpbmMsIGk7XG5cblx0ICAgICAgICAvLyAnb2JqfG1pbi1tYXgnOiB7fVxuXHQgICAgICAgIC8qIGpzaGludCAtVzA0MSAqL1xuXHQgICAgICAgIGlmIChvcHRpb25zLnJ1bGUubWluICE9IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICBrZXlzID0gVXRpbC5rZXlzKG9wdGlvbnMudGVtcGxhdGUpXG5cdCAgICAgICAgICAgIGtleXMgPSBSYW5kb20uc2h1ZmZsZShrZXlzKVxuXHQgICAgICAgICAgICBrZXlzID0ga2V5cy5zbGljZSgwLCBvcHRpb25zLnJ1bGUuY291bnQpXG5cdCAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldXG5cdCAgICAgICAgICAgICAgICBwYXJzZWRLZXkgPSBrZXkucmVwbGFjZShDb25zdGFudC5SRV9LRVksICckMScpXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wdXNoKHBhcnNlZEtleSlcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucHVzaChrZXkpXG5cdCAgICAgICAgICAgICAgICByZXN1bHRbcGFyc2VkS2V5XSA9IEhhbmRsZXIuZ2VuKG9wdGlvbnMudGVtcGxhdGVba2V5XSwga2V5LCB7XG5cdCAgICAgICAgICAgICAgICAgICAgcGF0aDogb3B0aW9ucy5jb250ZXh0LnBhdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0OiByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogb3B0aW9ucy50ZW1wbGF0ZSxcblx0ICAgICAgICAgICAgICAgICAgICByb290OiBvcHRpb25zLmNvbnRleHQucm9vdCB8fCByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSb290OiBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVSb290IHx8IG9wdGlvbnMudGVtcGxhdGVcblx0ICAgICAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQucGF0aC5wb3AoKVxuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUGF0aC5wb3AoKVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvLyAnb2JqJzoge31cblx0ICAgICAgICAgICAga2V5cyA9IFtdXG5cdCAgICAgICAgICAgIGZuS2V5cyA9IFtdIC8vICMyNSDmlLnlj5jkuobpnZ7lh73mlbDlsZ7mgKfnmoTpobrluo/vvIzmn6Xmib7otbfmnaXkuI3mlrnkvr9cblx0ICAgICAgICAgICAgZm9yIChrZXkgaW4gb3B0aW9ucy50ZW1wbGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLnRlbXBsYXRlW2tleV0gPT09ICdmdW5jdGlvbicgPyBmbktleXMgOiBrZXlzKS5wdXNoKGtleSlcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoZm5LZXlzKVxuXG5cdCAgICAgICAgICAgIC8qXG5cdCAgICAgICAgICAgICAgICDkvJrmlLnlj5jpnZ7lh73mlbDlsZ7mgKfnmoTpobrluo9cblx0ICAgICAgICAgICAgICAgIGtleXMgPSBVdGlsLmtleXMob3B0aW9ucy50ZW1wbGF0ZSlcblx0ICAgICAgICAgICAgICAgIGtleXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGFmbiA9IHR5cGVvZiBvcHRpb25zLnRlbXBsYXRlW2FdID09PSAnZnVuY3Rpb24nXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGJmbiA9IHR5cGVvZiBvcHRpb25zLnRlbXBsYXRlW2JdID09PSAnZnVuY3Rpb24nXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGFmbiA9PT0gYmZuKSByZXR1cm4gMFxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChhZm4gJiYgIWJmbikgcmV0dXJuIDFcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWFmbiAmJiBiZm4pIHJldHVybiAtMVxuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgKi9cblxuXHQgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAga2V5ID0ga2V5c1tpXVxuXHQgICAgICAgICAgICAgICAgcGFyc2VkS2V5ID0ga2V5LnJlcGxhY2UoQ29uc3RhbnQuUkVfS0VZLCAnJDEnKVxuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnBhdGgucHVzaChwYXJzZWRLZXkpXG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLnB1c2goa2V5KVxuXHQgICAgICAgICAgICAgICAgcmVzdWx0W3BhcnNlZEtleV0gPSBIYW5kbGVyLmdlbihvcHRpb25zLnRlbXBsYXRlW2tleV0sIGtleSwge1xuXHQgICAgICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMuY29udGV4dC5wYXRoLFxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGF0aDogb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUGF0aCxcblx0ICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dDogcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ3VycmVudENvbnRleHQ6IG9wdGlvbnMudGVtcGxhdGUsXG5cdCAgICAgICAgICAgICAgICAgICAgcm9vdDogb3B0aW9ucy5jb250ZXh0LnJvb3QgfHwgcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUm9vdDogb3B0aW9ucy5jb250ZXh0LnRlbXBsYXRlUm9vdCB8fCBvcHRpb25zLnRlbXBsYXRlXG5cdCAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LnBhdGgucG9wKClcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVBhdGgucG9wKClcblx0ICAgICAgICAgICAgICAgICAgICAvLyAnaWR8KzEnOiAxXG5cdCAgICAgICAgICAgICAgICBpbmMgPSBrZXkubWF0Y2goQ29uc3RhbnQuUkVfS0VZKVxuXHQgICAgICAgICAgICAgICAgaWYgKGluYyAmJiBpbmNbMl0gJiYgVXRpbC50eXBlKG9wdGlvbnMudGVtcGxhdGVba2V5XSkgPT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZVtrZXldICs9IHBhcnNlSW50KGluY1syXSwgMTApXG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIG51bWJlcjogZnVuY3Rpb24ob3B0aW9ucykge1xuXHQgICAgICAgIHZhciByZXN1bHQsIHBhcnRzO1xuXHQgICAgICAgIGlmIChvcHRpb25zLnJ1bGUuZGVjaW1hbCkgeyAvLyBmbG9hdFxuXHQgICAgICAgICAgICBvcHRpb25zLnRlbXBsYXRlICs9ICcnXG5cdCAgICAgICAgICAgIHBhcnRzID0gb3B0aW9ucy50ZW1wbGF0ZS5zcGxpdCgnLicpXG5cdCAgICAgICAgICAgICAgICAvLyAnZmxvYXQxfC4xLTEwJzogMTAsXG5cdCAgICAgICAgICAgICAgICAvLyAnZmxvYXQyfDEtMTAwLjEtMTAnOiAxLFxuXHQgICAgICAgICAgICAgICAgLy8gJ2Zsb2F0M3w5OTkuMS0xMCc6IDEsXG5cdCAgICAgICAgICAgICAgICAvLyAnZmxvYXQ0fC4zLTEwJzogMTIzLjEyMyxcblx0ICAgICAgICAgICAgcGFydHNbMF0gPSBvcHRpb25zLnJ1bGUucmFuZ2UgPyBvcHRpb25zLnJ1bGUuY291bnQgOiBwYXJ0c1swXVxuXHQgICAgICAgICAgICBwYXJ0c1sxXSA9IChwYXJ0c1sxXSB8fCAnJykuc2xpY2UoMCwgb3B0aW9ucy5ydWxlLmRjb3VudClcblx0ICAgICAgICAgICAgd2hpbGUgKHBhcnRzWzFdLmxlbmd0aCA8IG9wdGlvbnMucnVsZS5kY291bnQpIHtcblx0ICAgICAgICAgICAgICAgIHBhcnRzWzFdICs9IChcblx0ICAgICAgICAgICAgICAgICAgICAvLyDmnIDlkI7kuIDkvY3kuI3og73kuLogMO+8muWmguaenOacgOWQjuS4gOS9jeS4uiAw77yM5Lya6KKrIEpTIOW8leaTjuW/veeVpeaOieOAglxuXHQgICAgICAgICAgICAgICAgICAgIChwYXJ0c1sxXS5sZW5ndGggPCBvcHRpb25zLnJ1bGUuZGNvdW50IC0gMSkgPyBSYW5kb20uY2hhcmFjdGVyKCdudW1iZXInKSA6IFJhbmRvbS5jaGFyYWN0ZXIoJzEyMzQ1Njc4OScpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VGbG9hdChwYXJ0cy5qb2luKCcuJyksIDEwKVxuXHQgICAgICAgIH0gZWxzZSB7IC8vIGludGVnZXJcblx0ICAgICAgICAgICAgLy8gJ2dyYWRlMXwxLTEwMCc6IDEsXG5cdCAgICAgICAgICAgIHJlc3VsdCA9IG9wdGlvbnMucnVsZS5yYW5nZSAmJiAhb3B0aW9ucy5ydWxlLnBhcmFtZXRlcnNbMl0gPyBvcHRpb25zLnJ1bGUuY291bnQgOiBvcHRpb25zLnRlbXBsYXRlXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0sXG5cdCAgICBib29sZWFuOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdDtcblx0ICAgICAgICAvLyAncHJvcHxtdWx0aXBsZSc6IGZhbHNlLCDlvZPliY3lgLzmmK/nm7jlj43lgLznmoTmpoLnjoflgI3mlbBcblx0ICAgICAgICAvLyAncHJvcHxwcm9iYWJpbGl0eS1wcm9iYWJpbGl0eSc6IGZhbHNlLCDlvZPliY3lgLzkuI7nm7jlj43lgLznmoTmpoLnjodcblx0ICAgICAgICByZXN1bHQgPSBvcHRpb25zLnJ1bGUucGFyYW1ldGVycyA/IFJhbmRvbS5ib29sKG9wdGlvbnMucnVsZS5taW4sIG9wdGlvbnMucnVsZS5tYXgsIG9wdGlvbnMudGVtcGxhdGUpIDogb3B0aW9ucy50ZW1wbGF0ZVxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0sXG5cdCAgICBzdHJpbmc6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gJycsXG5cdCAgICAgICAgICAgIGksIHBsYWNlaG9sZGVycywgcGgsIHBoZWQ7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGVtcGxhdGUubGVuZ3RoKSB7XG5cblx0ICAgICAgICAgICAgLy8gICdmb28nOiAn4piFJyxcblx0ICAgICAgICAgICAgLyoganNoaW50IC1XMDQxICovXG5cdCAgICAgICAgICAgIGlmIChvcHRpb25zLnJ1bGUuY291bnQgPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgKz0gb3B0aW9ucy50ZW1wbGF0ZVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gJ3N0YXJ8MS01JzogJ+KYhScsXG5cdCAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb25zLnJ1bGUuY291bnQ7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgcmVzdWx0ICs9IG9wdGlvbnMudGVtcGxhdGVcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyAnZW1haWx8MS0xMCc6ICdARU1BSUwsICcsXG5cdCAgICAgICAgICAgIHBsYWNlaG9sZGVycyA9IHJlc3VsdC5tYXRjaChDb25zdGFudC5SRV9QTEFDRUhPTERFUikgfHwgW10gLy8gQS1aXzAtOSA+IFxcd19cblx0ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgcGggPSBwbGFjZWhvbGRlcnNbaV1cblxuXHQgICAgICAgICAgICAgICAgLy8g6YGH5Yiw6L2s5LmJ5pac5p2g77yM5LiN6ZyA6KaB6Kej5p6Q5Y2g5L2N56ymXG5cdCAgICAgICAgICAgICAgICBpZiAoL15cXFxcLy50ZXN0KHBoKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5zcGxpY2UoaS0tLCAxKVxuXHQgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHBoZWQgPSBIYW5kbGVyLnBsYWNlaG9sZGVyKHBoLCBvcHRpb25zLmNvbnRleHQuY3VycmVudENvbnRleHQsIG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZUN1cnJlbnRDb250ZXh0LCBvcHRpb25zKVxuXG5cdCAgICAgICAgICAgICAgICAvLyDlj6rmnInkuIDkuKrljaDkvY3nrKbvvIzlubbkuJTmsqHmnInlhbbku5blrZfnrKZcblx0ICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlcnMubGVuZ3RoID09PSAxICYmIHBoID09PSByZXN1bHQgJiYgdHlwZW9mIHBoZWQgIT09IHR5cGVvZiByZXN1bHQpIHsgLy8gXG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGhlZFxuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrXG5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbC5pc051bWVyaWMocGhlZCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VGbG9hdChwaGVkLCAxMClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKC9eKHRydWV8ZmFsc2UpJC8udGVzdChwaGVkKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwaGVkID09PSAndHJ1ZScgPyB0cnVlIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoZWQgPT09ICdmYWxzZScgPyBmYWxzZSA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGVkIC8vIOW3sue7j+aYr+W4g+WwlOWAvFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHBoLCBwaGVkKVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvLyAnQVNDSUl8MS0xMCc6ICcnLFxuXHQgICAgICAgICAgICAvLyAnQVNDSUknOiAnJyxcblx0ICAgICAgICAgICAgcmVzdWx0ID0gb3B0aW9ucy5ydWxlLnJhbmdlID8gUmFuZG9tLnN0cmluZyhvcHRpb25zLnJ1bGUuY291bnQpIDogb3B0aW9ucy50ZW1wbGF0ZVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0XG5cdCAgICB9LFxuXHQgICAgJ2Z1bmN0aW9uJzogZnVuY3Rpb24ob3B0aW9ucykge1xuXHQgICAgICAgIC8vICggY29udGV4dCwgb3B0aW9ucyApXG5cdCAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVtcGxhdGUuY2FsbChvcHRpb25zLmNvbnRleHQuY3VycmVudENvbnRleHQsIG9wdGlvbnMpXG5cdCAgICB9LFxuXHQgICAgJ3JlZ2V4cCc6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgc291cmNlID0gJydcblxuXHQgICAgICAgIC8vICduYW1lJzogL3JlZ2V4cC8sXG5cdCAgICAgICAgLyoganNoaW50IC1XMDQxICovXG5cdCAgICAgICAgaWYgKG9wdGlvbnMucnVsZS5jb3VudCA9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgc291cmNlICs9IG9wdGlvbnMudGVtcGxhdGUuc291cmNlIC8vIHJlZ2V4cC5zb3VyY2Vcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyAnbmFtZXwxLTUnOiAvcmVnZXhwLyxcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMucnVsZS5jb3VudDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHNvdXJjZSArPSBvcHRpb25zLnRlbXBsYXRlLnNvdXJjZVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiBSRS5IYW5kbGVyLmdlbihcblx0ICAgICAgICAgICAgUkUuUGFyc2VyLnBhcnNlKFxuXHQgICAgICAgICAgICAgICAgc291cmNlXG5cdCAgICAgICAgICAgIClcblx0ICAgICAgICApXG5cdCAgICB9XG5cdH0pXG5cblx0SGFuZGxlci5leHRlbmQoe1xuXHQgICAgX2FsbDogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdmFyIHJlID0ge307XG5cdCAgICAgICAgZm9yICh2YXIga2V5IGluIFJhbmRvbSkgcmVba2V5LnRvTG93ZXJDYXNlKCldID0ga2V5XG5cdCAgICAgICAgcmV0dXJuIHJlXG5cdCAgICB9LFxuXHQgICAgLy8g5aSE55CG5Y2g5L2N56ym77yM6L2s5o2i5Li65pyA57uI5YC8XG5cdCAgICBwbGFjZWhvbGRlcjogZnVuY3Rpb24ocGxhY2Vob2xkZXIsIG9iaiwgdGVtcGxhdGVDb250ZXh0LCBvcHRpb25zKSB7XG5cdCAgICAgICAgLy8gY29uc29sZS5sb2cob3B0aW9ucy5jb250ZXh0LnBhdGgpXG5cdCAgICAgICAgLy8gMSBrZXksIDIgcGFyYW1zXG5cdCAgICAgICAgQ29uc3RhbnQuUkVfUExBQ0VIT0xERVIuZXhlYygnJylcblx0ICAgICAgICB2YXIgcGFydHMgPSBDb25zdGFudC5SRV9QTEFDRUhPTERFUi5leGVjKHBsYWNlaG9sZGVyKSxcblx0ICAgICAgICAgICAga2V5ID0gcGFydHMgJiYgcGFydHNbMV0sXG5cdCAgICAgICAgICAgIGxrZXkgPSBrZXkgJiYga2V5LnRvTG93ZXJDYXNlKCksXG5cdCAgICAgICAgICAgIG9rZXkgPSB0aGlzLl9hbGwoKVtsa2V5XSxcblx0ICAgICAgICAgICAgcGFyYW1zID0gcGFydHMgJiYgcGFydHNbMl0gfHwgJydcblx0ICAgICAgICB2YXIgcGF0aFBhcnRzID0gdGhpcy5zcGxpdFBhdGhUb0FycmF5KGtleSlcblxuXHQgICAgICAgIC8vIOino+aekOWNoOS9jeespueahOWPguaVsFxuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIDEuIOWwneivleS/neaMgeWPguaVsOeahOexu+Wei1xuXHQgICAgICAgICAgICAvKlxuXHQgICAgICAgICAgICAgICAgIzI0IFtXaW5kb3cgRmlyZWZveCAzMC4wIOW8leeUqCDljaDkvY3nrKYg5oqb6ZSZXShodHRwczovL2dpdGh1Yi5jb20vbnV5c29mdC9Nb2NrL2lzc3Vlcy8yNClcblx0ICAgICAgICAgICAgICAgIFtCWDkwNTY6IOWQhOa1j+iniOWZqOS4iyB3aW5kb3cuZXZhbCDmlrnms5XnmoTmiafooYzkuIrkuIvmloflrZjlnKjlt67lvIJdKGh0dHA6Ly93d3cudzNoZWxwLm9yZy96aC1jbi9jYXVzZXMvQlg5MDU2KVxuXHQgICAgICAgICAgICAgICAg5bqU6K+l5bGe5LqOIFdpbmRvdyBGaXJlZm94IDMwLjAg55qEIEJVR1xuXHQgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICAvKiBqc2hpbnQgLVcwNjEgKi9cblx0ICAgICAgICAgICAgcGFyYW1zID0gZXZhbCgnKGZ1bmN0aW9uKCl7IHJldHVybiBbXS5zcGxpY2UuY2FsbChhcmd1bWVudHMsIDAgKSB9KSgnICsgcGFyYW1zICsgJyknKVxuXHQgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgIC8vIDIuIOWmguaenOWksei0pe+8jOWPquiDveino+aekOS4uuWtl+espuS4slxuXHQgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKGVycm9yKVxuXHQgICAgICAgICAgICAvLyBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcikgcGFyYW1zID0gcGFydHNbMl0uc3BsaXQoLyxcXHMqLyk7XG5cdCAgICAgICAgICAgIC8vIGVsc2UgdGhyb3cgZXJyb3Jcblx0ICAgICAgICAgICAgcGFyYW1zID0gcGFydHNbMl0uc3BsaXQoLyxcXHMqLylcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDljaDkvY3nrKbkvJjlhYjlvJXnlKjmlbDmja7mqKHmnb/kuK3nmoTlsZ7mgKdcblx0ICAgICAgICBpZiAob2JqICYmIChrZXkgaW4gb2JqKSkgcmV0dXJuIG9ialtrZXldXG5cblx0ICAgICAgICAvLyBAaW5kZXggQGtleVxuXHQgICAgICAgIC8vIGlmIChDb25zdGFudC5SRV9JTkRFWC50ZXN0KGtleSkpIHJldHVybiArb3B0aW9ucy5uYW1lXG5cdCAgICAgICAgLy8gaWYgKENvbnN0YW50LlJFX0tFWS50ZXN0KGtleSkpIHJldHVybiBvcHRpb25zLm5hbWVcblxuXHQgICAgICAgIC8vIOe7neWvuei3r+W+hCBvciDnm7jlr7not6/lvoRcblx0ICAgICAgICBpZiAoXG5cdCAgICAgICAgICAgIGtleS5jaGFyQXQoMCkgPT09ICcvJyB8fFxuXHQgICAgICAgICAgICBwYXRoUGFydHMubGVuZ3RoID4gMVxuXHQgICAgICAgICkgcmV0dXJuIHRoaXMuZ2V0VmFsdWVCeUtleVBhdGgoa2V5LCBvcHRpb25zKVxuXG5cdCAgICAgICAgLy8g6YCS5b2S5byV55So5pWw5o2u5qih5p2/5Lit55qE5bGe5oCnXG5cdCAgICAgICAgaWYgKHRlbXBsYXRlQ29udGV4dCAmJlxuXHQgICAgICAgICAgICAodHlwZW9mIHRlbXBsYXRlQ29udGV4dCA9PT0gJ29iamVjdCcpICYmXG5cdCAgICAgICAgICAgIChrZXkgaW4gdGVtcGxhdGVDb250ZXh0KSAmJlxuXHQgICAgICAgICAgICAocGxhY2Vob2xkZXIgIT09IHRlbXBsYXRlQ29udGV4dFtrZXldKSAvLyBmaXggIzE1IOmBv+WFjeiHquW3seS+nei1luiHquW3sVxuXHQgICAgICAgICkge1xuXHQgICAgICAgICAgICAvLyDlhYjorqHnrpfooqvlvJXnlKjnmoTlsZ7mgKflgLxcblx0ICAgICAgICAgICAgdGVtcGxhdGVDb250ZXh0W2tleV0gPSBIYW5kbGVyLmdlbih0ZW1wbGF0ZUNvbnRleHRba2V5XSwga2V5LCB7XG5cdCAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dDogb2JqLFxuXHQgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogdGVtcGxhdGVDb250ZXh0XG5cdCAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUNvbnRleHRba2V5XVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIOWmguaenOacquaJvuWIsO+8jOWImeWOn+agt+i/lOWbnlxuXHQgICAgICAgIGlmICghKGtleSBpbiBSYW5kb20pICYmICEobGtleSBpbiBSYW5kb20pICYmICEob2tleSBpbiBSYW5kb20pKSByZXR1cm4gcGxhY2Vob2xkZXJcblxuXHQgICAgICAgIC8vIOmAkuW9kuino+aekOWPguaVsOS4reeahOWNoOS9jeesplxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIENvbnN0YW50LlJFX1BMQUNFSE9MREVSLmV4ZWMoJycpXG5cdCAgICAgICAgICAgIGlmIChDb25zdGFudC5SRV9QTEFDRUhPTERFUi50ZXN0KHBhcmFtc1tpXSkpIHtcblx0ICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IEhhbmRsZXIucGxhY2Vob2xkZXIocGFyYW1zW2ldLCBvYmosIHRlbXBsYXRlQ29udGV4dCwgb3B0aW9ucylcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBoYW5kbGUgPSBSYW5kb21ba2V5XSB8fCBSYW5kb21bbGtleV0gfHwgUmFuZG9tW29rZXldXG5cdCAgICAgICAgc3dpdGNoIChVdGlsLnR5cGUoaGFuZGxlKSkge1xuXHQgICAgICAgICAgICBjYXNlICdhcnJheSc6XG5cdCAgICAgICAgICAgICAgICAvLyDoh6rliqjku47mlbDnu4TkuK3lj5bkuIDkuKrvvIzkvovlpoIgQGFyZWFzXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUmFuZG9tLnBpY2soaGFuZGxlKVxuXHQgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG5cdCAgICAgICAgICAgICAgICAvLyDmiafooYzljaDkvY3nrKbmlrnms5XvvIjlpKflpJrmlbDmg4XlhrXvvIlcblx0ICAgICAgICAgICAgICAgIGhhbmRsZS5vcHRpb25zID0gb3B0aW9uc1xuXHQgICAgICAgICAgICAgICAgdmFyIHJlID0gaGFuZGxlLmFwcGx5KFJhbmRvbSwgcGFyYW1zKVxuXHQgICAgICAgICAgICAgICAgaWYgKHJlID09PSB1bmRlZmluZWQpIHJlID0gJycgLy8g5Zug5Li65piv5Zyo5a2X56ym5Liy5Lit77yM5omA5Lul6buY6K6k5Li656m65a2X56ym5Liy44CCXG5cdCAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlLm9wdGlvbnNcblx0ICAgICAgICAgICAgICAgIHJldHVybiByZVxuXHQgICAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBnZXRWYWx1ZUJ5S2V5UGF0aDogZnVuY3Rpb24oa2V5LCBvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIG9yaWdpbmFsS2V5ID0ga2V5XG5cdCAgICAgICAgdmFyIGtleVBhdGhQYXJ0cyA9IHRoaXMuc3BsaXRQYXRoVG9BcnJheShrZXkpXG5cdCAgICAgICAgdmFyIGFic29sdXRlUGF0aFBhcnRzID0gW11cblxuXHQgICAgICAgIC8vIOe7neWvuei3r+W+hFxuXHQgICAgICAgIGlmIChrZXkuY2hhckF0KDApID09PSAnLycpIHtcblx0ICAgICAgICAgICAgYWJzb2x1dGVQYXRoUGFydHMgPSBbb3B0aW9ucy5jb250ZXh0LnBhdGhbMF1dLmNvbmNhdChcblx0ICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplUGF0aChrZXlQYXRoUGFydHMpXG5cdCAgICAgICAgICAgIClcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvLyDnm7jlr7not6/lvoRcblx0ICAgICAgICAgICAgaWYgKGtleVBhdGhQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgICAgICAgICBhYnNvbHV0ZVBhdGhQYXJ0cyA9IG9wdGlvbnMuY29udGV4dC5wYXRoLnNsaWNlKDApXG5cdCAgICAgICAgICAgICAgICBhYnNvbHV0ZVBhdGhQYXJ0cy5wb3AoKVxuXHQgICAgICAgICAgICAgICAgYWJzb2x1dGVQYXRoUGFydHMgPSB0aGlzLm5vcm1hbGl6ZVBhdGgoXG5cdCAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVQYXRoUGFydHMuY29uY2F0KGtleVBhdGhQYXJ0cylcblx0ICAgICAgICAgICAgICAgIClcblxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAga2V5ID0ga2V5UGF0aFBhcnRzW2tleVBhdGhQYXJ0cy5sZW5ndGggLSAxXVxuXHQgICAgICAgICAgICB2YXIgY3VycmVudENvbnRleHQgPSBvcHRpb25zLmNvbnRleHQucm9vdFxuXHQgICAgICAgICAgICB2YXIgdGVtcGxhdGVDdXJyZW50Q29udGV4dCA9IG9wdGlvbnMuY29udGV4dC50ZW1wbGF0ZVJvb3Rcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhYnNvbHV0ZVBhdGhQYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHRbYWJzb2x1dGVQYXRoUGFydHNbaV1dXG5cdCAgICAgICAgICAgICAgICB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0ID0gdGVtcGxhdGVDdXJyZW50Q29udGV4dFthYnNvbHV0ZVBhdGhQYXJ0c1tpXV1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyDlvJXnlKjnmoTlgLzlt7Lnu4/orqHnrpflpb1cblx0ICAgICAgICAgICAgaWYgKGN1cnJlbnRDb250ZXh0ICYmIChrZXkgaW4gY3VycmVudENvbnRleHQpKSByZXR1cm4gY3VycmVudENvbnRleHRba2V5XVxuXHQgICAgXG5cdCAgICAgICAgICAgIC8vIOWwmuacquiuoeeul++8jOmAkuW9kuW8leeUqOaVsOaNruaooeadv+S4reeahOWxnuaAp1xuXHQgICAgICAgICAgICBpZiAodGVtcGxhdGVDdXJyZW50Q29udGV4dCAmJlxuXHQgICAgICAgICAgICAgICAgKHR5cGVvZiB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0ID09PSAnb2JqZWN0JykgJiZcblx0ICAgICAgICAgICAgICAgIChrZXkgaW4gdGVtcGxhdGVDdXJyZW50Q29udGV4dCkgJiZcblx0ICAgICAgICAgICAgICAgIChvcmlnaW5hbEtleSAhPT0gdGVtcGxhdGVDdXJyZW50Q29udGV4dFtrZXldKSAvLyBmaXggIzE1IOmBv+WFjeiHquW3seS+nei1luiHquW3sVxuXHQgICAgICAgICAgICApIHtcblx0ICAgICAgICAgICAgICAgIC8vIOWFiOiuoeeul+iiq+W8leeUqOeahOWxnuaAp+WAvFxuXHQgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dFtrZXldID0gSGFuZGxlci5nZW4odGVtcGxhdGVDdXJyZW50Q29udGV4dFtrZXldLCBrZXksIHtcblx0ICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dDogY3VycmVudENvbnRleHQsXG5cdCAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDdXJyZW50Q29udGV4dDogdGVtcGxhdGVDdXJyZW50Q29udGV4dFxuXHQgICAgICAgICAgICAgICAgfSlcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUN1cnJlbnRDb250ZXh0W2tleV1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gY2F0Y2goZXJyKSB7IH1cblxuXHQgICAgICAgIHJldHVybiAnQCcgKyBrZXlQYXRoUGFydHMuam9pbignLycpXG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2tpc3N5dGVhbS9raXNzeS9ibG9iL21hc3Rlci9zcmMvcGF0aC9zcmMvcGF0aC5qc1xuXHQgICAgbm9ybWFsaXplUGF0aDogZnVuY3Rpb24ocGF0aFBhcnRzKSB7XG5cdCAgICAgICAgdmFyIG5ld1BhdGhQYXJ0cyA9IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoUGFydHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgc3dpdGNoIChwYXRoUGFydHNbaV0pIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgJy4uJzpcblx0ICAgICAgICAgICAgICAgICAgICBuZXdQYXRoUGFydHMucG9wKClcblx0ICAgICAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnLic6XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgbmV3UGF0aFBhcnRzLnB1c2gocGF0aFBhcnRzW2ldKVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBuZXdQYXRoUGFydHNcblx0ICAgIH0sXG5cdCAgICBzcGxpdFBhdGhUb0FycmF5OiBmdW5jdGlvbihwYXRoKSB7XG5cdCAgICAgICAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgvXFwvKy8pO1xuXHQgICAgICAgIGlmICghcGFydHNbcGFydHMubGVuZ3RoIC0gMV0pIHBhcnRzID0gcGFydHMuc2xpY2UoMCwgLTEpXG5cdCAgICAgICAgaWYgKCFwYXJ0c1swXSkgcGFydHMgPSBwYXJ0cy5zbGljZSgxKVxuXHQgICAgICAgIHJldHVybiBwYXJ0cztcblx0ICAgIH1cblx0fSlcblxuXHRtb2R1bGUuZXhwb3J0cyA9IEhhbmRsZXJcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lypcblx0ICAgICMjIENvbnN0YW50XG5cblx0ICAgIOW4uOmHj+mbhuWQiOOAglxuXHQgKi9cblx0Lypcblx0ICAgIFJFX0tFWVxuXHQgICAgICAgICduYW1lfG1pbi1tYXgnOiB2YWx1ZVxuXHQgICAgICAgICduYW1lfGNvdW50JzogdmFsdWVcblx0ICAgICAgICAnbmFtZXxtaW4tbWF4LmRtaW4tZG1heCc6IHZhbHVlXG5cdCAgICAgICAgJ25hbWV8bWluLW1heC5kY291bnQnOiB2YWx1ZVxuXHQgICAgICAgICduYW1lfGNvdW50LmRtaW4tZG1heCc6IHZhbHVlXG5cdCAgICAgICAgJ25hbWV8Y291bnQuZGNvdW50JzogdmFsdWVcblx0ICAgICAgICAnbmFtZXwrc3RlcCc6IHZhbHVlXG5cblx0ICAgICAgICAxIG5hbWUsIDIgc3RlcCwgMyByYW5nZSBbIG1pbiwgbWF4IF0sIDQgZHJhbmdlIFsgZG1pbiwgZG1heCBdXG5cblx0ICAgIFJFX1BMQUNFSE9MREVSXG5cdCAgICAgICAgcGxhY2Vob2xkZXIoKilcblxuXHQgICAgW+ato+WImeafpeeci+W3peWFt10oaHR0cDovL3d3dy5yZWdleHBlci5jb20vKVxuXG5cdCAgICAjMjYg55Sf5oiQ6KeE5YiZIOaUr+aMgSDotJ/mlbDvvIzkvovlpoIgbnVtYmVyfC0xMDAtMTAwXG5cdCovXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgICAgR1VJRDogMSxcblx0ICAgIFJFX0tFWTogLyguKylcXHwoPzpcXCsoXFxkKyl8KFtcXCtcXC1dP1xcZCstP1tcXCtcXC1dP1xcZCopPyg/OlxcLihcXGQrLT9cXGQqKSk/KS8sXG5cdCAgICBSRV9SQU5HRTogLyhbXFwrXFwtXT9cXGQrKS0/KFtcXCtcXC1dP1xcZCspPy8sXG5cdCAgICBSRV9QTEFDRUhPTERFUjogL1xcXFwqQChbXkAjJSYoKVxcP1xcc10rKSg/OlxcKCguKj8pXFwpKT8vZ1xuXHQgICAgLy8gL1xcXFwqQChbXkAjJSYoKVxcP1xcc1xcL1xcLl0rKSg/OlxcKCguKj8pXFwpKT8vZ1xuXHQgICAgLy8gUkVfSU5ERVg6IC9eaW5kZXgkLyxcblx0ICAgIC8vIFJFX0tFWTogL15rZXkkL1xuXHR9XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXG5cdCAgICAjIyBVdGlsaXRpZXNcblx0Ki9cblx0dmFyIFV0aWwgPSB7fVxuXG5cdFV0aWwuZXh0ZW5kID0gZnVuY3Rpb24gZXh0ZW5kKCkge1xuXHQgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSxcblx0ICAgICAgICBpID0gMSxcblx0ICAgICAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuXHQgICAgICAgIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY2xvbmVcblxuXHQgICAgaWYgKGxlbmd0aCA9PT0gMSkge1xuXHQgICAgICAgIHRhcmdldCA9IHRoaXNcblx0ICAgICAgICBpID0gMFxuXHQgICAgfVxuXG5cdCAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1tpXVxuXHQgICAgICAgIGlmICghb3B0aW9ucykgY29udGludWVcblxuXHQgICAgICAgIGZvciAobmFtZSBpbiBvcHRpb25zKSB7XG5cdCAgICAgICAgICAgIHNyYyA9IHRhcmdldFtuYW1lXVxuXHQgICAgICAgICAgICBjb3B5ID0gb3B0aW9uc1tuYW1lXVxuXG5cdCAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGNvcHkpIGNvbnRpbnVlXG5cdCAgICAgICAgICAgIGlmIChjb3B5ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cblx0ICAgICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShjb3B5KSB8fCBVdGlsLmlzT2JqZWN0KGNvcHkpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoVXRpbC5pc0FycmF5KGNvcHkpKSBjbG9uZSA9IHNyYyAmJiBVdGlsLmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdXG5cdCAgICAgICAgICAgICAgICBpZiAoVXRpbC5pc09iamVjdChjb3B5KSkgY2xvbmUgPSBzcmMgJiYgVXRpbC5pc09iamVjdChzcmMpID8gc3JjIDoge31cblxuXHQgICAgICAgICAgICAgICAgdGFyZ2V0W25hbWVdID0gVXRpbC5leHRlbmQoY2xvbmUsIGNvcHkpXG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBjb3B5XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiB0YXJnZXRcblx0fVxuXG5cdFV0aWwuZWFjaCA9IGZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuXHQgICAgdmFyIGksIGtleVxuXHQgICAgaWYgKHRoaXMudHlwZShvYmopID09PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmo7IGkrKykge1xuXHQgICAgICAgICAgICBpdGVyYXRvcihpLCBpKVxuXHQgICAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCA9PT0gK29iai5sZW5ndGgpIHtcblx0ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gZmFsc2UpIGJyZWFrXG5cdCAgICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcblx0ICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2tleV0sIGtleSwgb2JqKSA9PT0gZmFsc2UpIGJyZWFrXG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cblx0VXRpbC50eXBlID0gZnVuY3Rpb24gdHlwZShvYmopIHtcblx0ICAgIHJldHVybiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSA/IFN0cmluZyhvYmopIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikubWF0Y2goL1xcW29iamVjdCAoXFx3KylcXF0vKVsxXS50b0xvd2VyQ2FzZSgpXG5cdH1cblxuXHRVdGlsLmVhY2goJ1N0cmluZyBPYmplY3QgQXJyYXkgUmVnRXhwIEZ1bmN0aW9uJy5zcGxpdCgnICcpLCBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgVXRpbFsnaXMnICsgdmFsdWVdID0gZnVuY3Rpb24ob2JqKSB7XG5cdCAgICAgICAgcmV0dXJuIFV0aWwudHlwZShvYmopID09PSB2YWx1ZS50b0xvd2VyQ2FzZSgpXG5cdCAgICB9XG5cdH0pXG5cblx0VXRpbC5pc09iamVjdE9yQXJyYXkgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHQgICAgcmV0dXJuIFV0aWwuaXNPYmplY3QodmFsdWUpIHx8IFV0aWwuaXNBcnJheSh2YWx1ZSlcblx0fVxuXG5cdFV0aWwuaXNOdW1lcmljID0gZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpICYmIGlzRmluaXRlKHZhbHVlKVxuXHR9XG5cblx0VXRpbC5rZXlzID0gZnVuY3Rpb24ob2JqKSB7XG5cdCAgICB2YXIga2V5cyA9IFtdO1xuXHQgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuXHQgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkga2V5cy5wdXNoKGtleSlcblx0ICAgIH1cblx0ICAgIHJldHVybiBrZXlzO1xuXHR9XG5cdFV0aWwudmFsdWVzID0gZnVuY3Rpb24ob2JqKSB7XG5cdCAgICB2YXIgdmFsdWVzID0gW107XG5cdCAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdCAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB2YWx1ZXMucHVzaChvYmpba2V5XSlcblx0ICAgIH1cblx0ICAgIHJldHVybiB2YWx1ZXM7XG5cdH1cblxuXHQvKlxuXHQgICAgIyMjIE1vY2suaGVyZWRvYyhmbilcblxuXHQgICAgKiBNb2NrLmhlcmVkb2MoZm4pXG5cblx0ICAgIOS7peebtOinguOAgeWuieWFqOeahOaWueW8j+S5puWGme+8iOWkmuihjO+8iUhUTUwg5qih5p2/44CCXG5cblx0ICAgICoq5L2/55So56S65L6LKirlpoLkuIvmiYDnpLrvvJpcblxuXHQgICAgICAgIHZhciB0cGwgPSBNb2NrLmhlcmVkb2MoZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIC8qIVxuXHQgICAgICAgIHt7ZW1haWx9fXt7YWdlfX1cblx0ICAgICAgICA8IS0tIE1vY2sgeyBcblx0ICAgICAgICAgICAgZW1haWw6ICdARU1BSUwnLFxuXHQgICAgICAgICAgICBhZ2U6ICdASU5UKDEsMTAwKSdcblx0ICAgICAgICB9IC0tPlxuXHQgICAgICAgICAgICAqXFwvXG5cdCAgICAgICAgfSlcblx0ICAgIFxuXHQgICAgKirnm7jlhbPpmIXor7sqKlxuXHQgICAgKiBbQ3JlYXRpbmcgbXVsdGlsaW5lIHN0cmluZ3MgaW4gSmF2YVNjcmlwdF0oaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84MDUxMDcvY3JlYXRpbmctbXVsdGlsaW5lLXN0cmluZ3MtaW4tamF2YXNjcmlwdCnjgIFcblx0Ki9cblx0VXRpbC5oZXJlZG9jID0gZnVuY3Rpb24gaGVyZWRvYyhmbikge1xuXHQgICAgLy8gMS4g56e76Zmk6LW35aeL55qEIGZ1bmN0aW9uKCl7IC8qIVxuXHQgICAgLy8gMi4g56e76Zmk5pyr5bC+55qEICovIH1cblx0ICAgIC8vIDMuIOenu+mZpOi1t+Wni+WSjOacq+WwvueahOepuuagvFxuXHQgICAgcmV0dXJuIGZuLnRvU3RyaW5nKClcblx0ICAgICAgICAucmVwbGFjZSgvXlteXFwvXStcXC9cXCohPy8sICcnKVxuXHQgICAgICAgIC5yZXBsYWNlKC9cXCpcXC9bXlxcL10rJC8sICcnKVxuXHQgICAgICAgIC5yZXBsYWNlKC9eW1xcc1xceEEwXSsvLCAnJykucmVwbGFjZSgvW1xcc1xceEEwXSskLywgJycpIC8vIC50cmltKClcblx0fVxuXG5cdFV0aWwubm9vcCA9IGZ1bmN0aW9uKCkge31cblxuXHRtb2R1bGUuZXhwb3J0cyA9IFV0aWxcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0XHQjIyBQYXJzZXJcblxuXHRcdOino+aekOaVsOaNruaooeadv++8iOWxnuaAp+WQjemDqOWIhu+8ieOAglxuXG5cdFx0KiBQYXJzZXIucGFyc2UoIG5hbWUgKVxuXHRcdFx0XG5cdFx0XHRgYGBqc29uXG5cdFx0XHR7XG5cdFx0XHRcdHBhcmFtZXRlcnM6IFsgbmFtZSwgaW5jLCByYW5nZSwgZGVjaW1hbCBdLFxuXHRcdFx0XHRybmFnZTogWyBtaW4gLCBtYXggXSxcblxuXHRcdFx0XHRtaW46IG1pbixcblx0XHRcdFx0bWF4OiBtYXgsXG5cdFx0XHRcdGNvdW50IDogY291bnQsXG5cblx0XHRcdFx0ZGVjaW1hbDogZGVjaW1hbCxcblx0XHRcdFx0ZG1pbjogZG1pbixcblx0XHRcdFx0ZG1heDogZG1heCxcblx0XHRcdFx0ZGNvdW50OiBkY291bnRcblx0XHRcdH1cblx0XHRcdGBgYFxuXHQgKi9cblxuXHR2YXIgQ29uc3RhbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG5cdHZhciBSYW5kb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cblx0LyoganNoaW50IC1XMDQxICovXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHRcdHBhcnNlOiBmdW5jdGlvbihuYW1lKSB7XG5cdFx0XHRuYW1lID0gbmFtZSA9PSB1bmRlZmluZWQgPyAnJyA6IChuYW1lICsgJycpXG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gKG5hbWUgfHwgJycpLm1hdGNoKENvbnN0YW50LlJFX0tFWSlcblxuXHRcdFx0dmFyIHJhbmdlID0gcGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzWzNdICYmIHBhcmFtZXRlcnNbM10ubWF0Y2goQ29uc3RhbnQuUkVfUkFOR0UpXG5cdFx0XHR2YXIgbWluID0gcmFuZ2UgJiYgcmFuZ2VbMV0gJiYgcGFyc2VJbnQocmFuZ2VbMV0sIDEwKSAvLyB8fCAxXG5cdFx0XHR2YXIgbWF4ID0gcmFuZ2UgJiYgcmFuZ2VbMl0gJiYgcGFyc2VJbnQocmFuZ2VbMl0sIDEwKSAvLyB8fCAxXG5cdFx0XHRcdC8vIHJlcGVhdCB8fCBtaW4tbWF4IHx8IDFcblx0XHRcdFx0Ly8gdmFyIGNvdW50ID0gcmFuZ2UgPyAhcmFuZ2VbMl0gJiYgcGFyc2VJbnQocmFuZ2VbMV0sIDEwKSB8fCBSYW5kb20uaW50ZWdlcihtaW4sIG1heCkgOiAxXG5cdFx0XHR2YXIgY291bnQgPSByYW5nZSA/ICFyYW5nZVsyXSA/IHBhcnNlSW50KHJhbmdlWzFdLCAxMCkgOiBSYW5kb20uaW50ZWdlcihtaW4sIG1heCkgOiB1bmRlZmluZWRcblxuXHRcdFx0dmFyIGRlY2ltYWwgPSBwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnNbNF0gJiYgcGFyYW1ldGVyc1s0XS5tYXRjaChDb25zdGFudC5SRV9SQU5HRSlcblx0XHRcdHZhciBkbWluID0gZGVjaW1hbCAmJiBkZWNpbWFsWzFdICYmIHBhcnNlSW50KGRlY2ltYWxbMV0sIDEwKSAvLyB8fCAwLFxuXHRcdFx0dmFyIGRtYXggPSBkZWNpbWFsICYmIGRlY2ltYWxbMl0gJiYgcGFyc2VJbnQoZGVjaW1hbFsyXSwgMTApIC8vIHx8IDAsXG5cdFx0XHRcdC8vIGludCB8fCBkbWluLWRtYXggfHwgMFxuXHRcdFx0dmFyIGRjb3VudCA9IGRlY2ltYWwgPyAhZGVjaW1hbFsyXSAmJiBwYXJzZUludChkZWNpbWFsWzFdLCAxMCkgfHwgUmFuZG9tLmludGVnZXIoZG1pbiwgZG1heCkgOiB1bmRlZmluZWRcblxuXHRcdFx0dmFyIHJlc3VsdCA9IHtcblx0XHRcdFx0Ly8gMSBuYW1lLCAyIGluYywgMyByYW5nZSwgNCBkZWNpbWFsXG5cdFx0XHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG5cdFx0XHRcdC8vIDEgbWluLCAyIG1heFxuXHRcdFx0XHRyYW5nZTogcmFuZ2UsXG5cdFx0XHRcdG1pbjogbWluLFxuXHRcdFx0XHRtYXg6IG1heCxcblx0XHRcdFx0Ly8gbWluLW1heFxuXHRcdFx0XHRjb3VudDogY291bnQsXG5cdFx0XHRcdC8vIOaYr+WQpuaciSBkZWNpbWFsXG5cdFx0XHRcdGRlY2ltYWw6IGRlY2ltYWwsXG5cdFx0XHRcdGRtaW46IGRtaW4sXG5cdFx0XHRcdGRtYXg6IGRtYXgsXG5cdFx0XHRcdC8vIGRtaW4tZGltYXhcblx0XHRcdFx0ZGNvdW50OiBkY291bnRcblx0XHRcdH1cblxuXHRcdFx0Zm9yICh2YXIgciBpbiByZXN1bHQpIHtcblx0XHRcdFx0aWYgKHJlc3VsdFtyXSAhPSB1bmRlZmluZWQpIHJldHVybiByZXN1bHRcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHt9XG5cdFx0fVxuXHR9XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qXG5cdCAgICAjIyBNb2NrLlJhbmRvbVxuXHQgICAgXG5cdCAgICDlt6XlhbfnsbvvvIznlKjkuo7nlJ/miJDlkITnp43pmo/mnLrmlbDmja7jgIJcblx0Ki9cblxuXHR2YXIgVXRpbCA9IF9fd2VicGFja19yZXF1aXJlX18oMylcblxuXHR2YXIgUmFuZG9tID0ge1xuXHQgICAgZXh0ZW5kOiBVdGlsLmV4dGVuZFxuXHR9XG5cblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDYpKVxuXHRSYW5kb20uZXh0ZW5kKF9fd2VicGFja19yZXF1aXJlX18oNykpXG5cdFJhbmRvbS5leHRlbmQoX193ZWJwYWNrX3JlcXVpcmVfXyg4KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSlcblx0UmFuZG9tLmV4dGVuZChfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KSlcblxuXHRtb2R1bGUuZXhwb3J0cyA9IFJhbmRvbVxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKlxuXHQgICAgIyMgQmFzaWNzXG5cdCovXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgICAgLy8g6L+U5Zue5LiA5Liq6ZqP5py655qE5biD5bCU5YC844CCXG5cdCAgICBib29sZWFuOiBmdW5jdGlvbihtaW4sIG1heCwgY3VyKSB7XG5cdCAgICAgICAgaWYgKGN1ciAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIG1pbiA9IHR5cGVvZiBtaW4gIT09ICd1bmRlZmluZWQnICYmICFpc05hTihtaW4pID8gcGFyc2VJbnQobWluLCAxMCkgOiAxXG5cdCAgICAgICAgICAgIG1heCA9IHR5cGVvZiBtYXggIT09ICd1bmRlZmluZWQnICYmICFpc05hTihtYXgpID8gcGFyc2VJbnQobWF4LCAxMCkgOiAxXG5cdCAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpID4gMS4wIC8gKG1pbiArIG1heCkgKiBtaW4gPyAhY3VyIDogY3VyXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgPj0gMC41XG5cdCAgICB9LFxuXHQgICAgYm9vbDogZnVuY3Rpb24obWluLCBtYXgsIGN1cikge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmJvb2xlYW4obWluLCBtYXgsIGN1cilcblx0ICAgIH0sXG5cdCAgICAvLyDov5Tlm57kuIDkuKrpmo/mnLrnmoToh6rnhLbmlbDvvIjlpKfkuo7nrYnkuo4gMCDnmoTmlbTmlbDvvInjgIJcblx0ICAgIG5hdHVyYWw6IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG5cdCAgICAgICAgbWluID0gdHlwZW9mIG1pbiAhPT0gJ3VuZGVmaW5lZCcgPyBwYXJzZUludChtaW4sIDEwKSA6IDBcblx0ICAgICAgICBtYXggPSB0eXBlb2YgbWF4ICE9PSAndW5kZWZpbmVkJyA/IHBhcnNlSW50KG1heCwgMTApIDogOTAwNzE5OTI1NDc0MDk5MiAvLyAyXjUzXG5cdCAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pblxuXHQgICAgfSxcblx0ICAgIC8vIOi/lOWbnuS4gOS4qumaj+acuueahOaVtOaVsOOAglxuXHQgICAgaW50ZWdlcjogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICBtaW4gPSB0eXBlb2YgbWluICE9PSAndW5kZWZpbmVkJyA/IHBhcnNlSW50KG1pbiwgMTApIDogLTkwMDcxOTkyNTQ3NDA5OTJcblx0ICAgICAgICBtYXggPSB0eXBlb2YgbWF4ICE9PSAndW5kZWZpbmVkJyA/IHBhcnNlSW50KG1heCwgMTApIDogOTAwNzE5OTI1NDc0MDk5MiAvLyAyXjUzXG5cdCAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pblxuXHQgICAgfSxcblx0ICAgIGludDogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5pbnRlZ2VyKG1pbiwgbWF4KVxuXHQgICAgfSxcblx0ICAgIC8vIOi/lOWbnuS4gOS4qumaj+acuueahOa1rueCueaVsOOAglxuXHQgICAgZmxvYXQ6IGZ1bmN0aW9uKG1pbiwgbWF4LCBkbWluLCBkbWF4KSB7XG5cdCAgICAgICAgZG1pbiA9IGRtaW4gPT09IHVuZGVmaW5lZCA/IDAgOiBkbWluXG5cdCAgICAgICAgZG1pbiA9IE1hdGgubWF4KE1hdGgubWluKGRtaW4sIDE3KSwgMClcblx0ICAgICAgICBkbWF4ID0gZG1heCA9PT0gdW5kZWZpbmVkID8gMTcgOiBkbWF4XG5cdCAgICAgICAgZG1heCA9IE1hdGgubWF4KE1hdGgubWluKGRtYXgsIDE3KSwgMClcblx0ICAgICAgICB2YXIgcmV0ID0gdGhpcy5pbnRlZ2VyKG1pbiwgbWF4KSArICcuJztcblx0ICAgICAgICBmb3IgKHZhciBpID0gMCwgZGNvdW50ID0gdGhpcy5uYXR1cmFsKGRtaW4sIGRtYXgpOyBpIDwgZGNvdW50OyBpKyspIHtcblx0ICAgICAgICAgICAgcmV0ICs9IChcblx0ICAgICAgICAgICAgICAgIC8vIOacgOWQjuS4gOS9jeS4jeiDveS4uiAw77ya5aaC5p6c5pyA5ZCO5LiA5L2N5Li6IDDvvIzkvJrooqsgSlMg5byV5pOO5b+955Wl5o6J44CCXG5cdCAgICAgICAgICAgICAgICAoaSA8IGRjb3VudCAtIDEpID8gdGhpcy5jaGFyYWN0ZXIoJ251bWJlcicpIDogdGhpcy5jaGFyYWN0ZXIoJzEyMzQ1Njc4OScpXG5cdCAgICAgICAgICAgIClcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmV0LCAxMClcblx0ICAgIH0sXG5cdCAgICAvLyDov5Tlm57kuIDkuKrpmo/mnLrlrZfnrKbjgIJcblx0ICAgIGNoYXJhY3RlcjogZnVuY3Rpb24ocG9vbCkge1xuXHQgICAgICAgIHZhciBwb29scyA9IHtcblx0ICAgICAgICAgICAgbG93ZXI6ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicsXG5cdCAgICAgICAgICAgIHVwcGVyOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonLFxuXHQgICAgICAgICAgICBudW1iZXI6ICcwMTIzNDU2Nzg5Jyxcblx0ICAgICAgICAgICAgc3ltYm9sOiAnIUAjJCVeJiooKVtdJ1xuXHQgICAgICAgIH1cblx0ICAgICAgICBwb29scy5hbHBoYSA9IHBvb2xzLmxvd2VyICsgcG9vbHMudXBwZXJcblx0ICAgICAgICBwb29sc1sndW5kZWZpbmVkJ10gPSBwb29scy5sb3dlciArIHBvb2xzLnVwcGVyICsgcG9vbHMubnVtYmVyICsgcG9vbHMuc3ltYm9sXG5cblx0ICAgICAgICBwb29sID0gcG9vbHNbKCcnICsgcG9vbCkudG9Mb3dlckNhc2UoKV0gfHwgcG9vbFxuXHQgICAgICAgIHJldHVybiBwb29sLmNoYXJBdCh0aGlzLm5hdHVyYWwoMCwgcG9vbC5sZW5ndGggLSAxKSlcblx0ICAgIH0sXG5cdCAgICBjaGFyOiBmdW5jdGlvbihwb29sKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuY2hhcmFjdGVyKHBvb2wpXG5cdCAgICB9LFxuXHQgICAgLy8g6L+U5Zue5LiA5Liq6ZqP5py65a2X56ym5Liy44CCXG5cdCAgICBzdHJpbmc6IGZ1bmN0aW9uKHBvb2wsIG1pbiwgbWF4KSB7XG5cdCAgICAgICAgdmFyIGxlblxuXHQgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgICBjYXNlIDA6IC8vICgpXG5cdCAgICAgICAgICAgICAgICBsZW4gPSB0aGlzLm5hdHVyYWwoMywgNylcblx0ICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgIGNhc2UgMTogLy8gKCBsZW5ndGggKVxuXHQgICAgICAgICAgICAgICAgbGVuID0gcG9vbFxuXHQgICAgICAgICAgICAgICAgcG9vbCA9IHVuZGVmaW5lZFxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAyOlxuXHQgICAgICAgICAgICAgICAgLy8gKCBwb29sLCBsZW5ndGggKVxuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVuID0gbWluXG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vICggbWluLCBtYXggKVxuXHQgICAgICAgICAgICAgICAgICAgIGxlbiA9IHRoaXMubmF0dXJhbChwb29sLCBtaW4pXG5cdCAgICAgICAgICAgICAgICAgICAgcG9vbCA9IHVuZGVmaW5lZFxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAzOlxuXHQgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5uYXR1cmFsKG1pbiwgbWF4KVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgdGV4dCA9ICcnXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICB0ZXh0ICs9IHRoaXMuY2hhcmFjdGVyKHBvb2wpXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHRleHRcblx0ICAgIH0sXG5cdCAgICBzdHI6IGZ1bmN0aW9uKCAvKnBvb2wsIG1pbiwgbWF4Ki8gKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0ICAgIH0sXG5cdCAgICAvLyDov5Tlm57kuIDkuKrmlbTlnovmlbDnu4TjgIJcblx0ICAgIHJhbmdlOiBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkge1xuXHQgICAgICAgIC8vIHJhbmdlKCBzdG9wIClcblx0ICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAxKSB7XG5cdCAgICAgICAgICAgIHN0b3AgPSBzdGFydCB8fCAwO1xuXHQgICAgICAgICAgICBzdGFydCA9IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIHJhbmdlKCBzdGFydCwgc3RvcCApXG5cdCAgICAgICAgc3RlcCA9IGFyZ3VtZW50c1syXSB8fCAxO1xuXG5cdCAgICAgICAgc3RhcnQgPSArc3RhcnRcblx0ICAgICAgICBzdG9wID0gK3N0b3Bcblx0ICAgICAgICBzdGVwID0gK3N0ZXBcblxuXHQgICAgICAgIHZhciBsZW4gPSBNYXRoLm1heChNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSwgMCk7XG5cdCAgICAgICAgdmFyIGlkeCA9IDA7XG5cdCAgICAgICAgdmFyIHJhbmdlID0gbmV3IEFycmF5KGxlbik7XG5cblx0ICAgICAgICB3aGlsZSAoaWR4IDwgbGVuKSB7XG5cdCAgICAgICAgICAgIHJhbmdlW2lkeCsrXSA9IHN0YXJ0O1xuXHQgICAgICAgICAgICBzdGFydCArPSBzdGVwO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiByYW5nZTtcblx0ICAgIH1cblx0fVxuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKlxuXHQgICAgIyMgRGF0ZVxuXHQqL1xuXHR2YXIgcGF0dGVybkxldHRlcnMgPSB7XG5cdCAgICB5eXl5OiAnZ2V0RnVsbFllYXInLFxuXHQgICAgeXk6IGZ1bmN0aW9uKGRhdGUpIHtcblx0ICAgICAgICByZXR1cm4gKCcnICsgZGF0ZS5nZXRGdWxsWWVhcigpKS5zbGljZSgyKVxuXHQgICAgfSxcblx0ICAgIHk6ICd5eScsXG5cblx0ICAgIE1NOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgdmFyIG0gPSBkYXRlLmdldE1vbnRoKCkgKyAxXG5cdCAgICAgICAgcmV0dXJuIG0gPCAxMCA/ICcwJyArIG0gOiBtXG5cdCAgICB9LFxuXHQgICAgTTogZnVuY3Rpb24oZGF0ZSkge1xuXHQgICAgICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCkgKyAxXG5cdCAgICB9LFxuXG5cdCAgICBkZDogZnVuY3Rpb24oZGF0ZSkge1xuXHQgICAgICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKClcblx0ICAgICAgICByZXR1cm4gZCA8IDEwID8gJzAnICsgZCA6IGRcblx0ICAgIH0sXG5cdCAgICBkOiAnZ2V0RGF0ZScsXG5cblx0ICAgIEhIOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgdmFyIGggPSBkYXRlLmdldEhvdXJzKClcblx0ICAgICAgICByZXR1cm4gaCA8IDEwID8gJzAnICsgaCA6IGhcblx0ICAgIH0sXG5cdCAgICBIOiAnZ2V0SG91cnMnLFxuXHQgICAgaGg6IGZ1bmN0aW9uKGRhdGUpIHtcblx0ICAgICAgICB2YXIgaCA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyXG5cdCAgICAgICAgcmV0dXJuIGggPCAxMCA/ICcwJyArIGggOiBoXG5cdCAgICB9LFxuXHQgICAgaDogZnVuY3Rpb24oZGF0ZSkge1xuXHQgICAgICAgIHJldHVybiBkYXRlLmdldEhvdXJzKCkgJSAxMlxuXHQgICAgfSxcblxuXHQgICAgbW06IGZ1bmN0aW9uKGRhdGUpIHtcblx0ICAgICAgICB2YXIgbSA9IGRhdGUuZ2V0TWludXRlcygpXG5cdCAgICAgICAgcmV0dXJuIG0gPCAxMCA/ICcwJyArIG0gOiBtXG5cdCAgICB9LFxuXHQgICAgbTogJ2dldE1pbnV0ZXMnLFxuXG5cdCAgICBzczogZnVuY3Rpb24oZGF0ZSkge1xuXHQgICAgICAgIHZhciBzID0gZGF0ZS5nZXRTZWNvbmRzKClcblx0ICAgICAgICByZXR1cm4gcyA8IDEwID8gJzAnICsgcyA6IHNcblx0ICAgIH0sXG5cdCAgICBzOiAnZ2V0U2Vjb25kcycsXG5cblx0ICAgIFNTOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgdmFyIG1zID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKVxuXHQgICAgICAgIHJldHVybiBtcyA8IDEwICYmICcwMCcgKyBtcyB8fCBtcyA8IDEwMCAmJiAnMCcgKyBtcyB8fCBtc1xuXHQgICAgfSxcblx0ICAgIFM6ICdnZXRNaWxsaXNlY29uZHMnLFxuXG5cdCAgICBBOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKSA8IDEyID8gJ0FNJyA6ICdQTSdcblx0ICAgIH0sXG5cdCAgICBhOiBmdW5jdGlvbihkYXRlKSB7XG5cdCAgICAgICAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKSA8IDEyID8gJ2FtJyA6ICdwbSdcblx0ICAgIH0sXG5cdCAgICBUOiAnZ2V0VGltZSdcblx0fVxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICAgIC8vIOaXpeacn+WNoOS9jeespumbhuWQiOOAglxuXHQgICAgX3BhdHRlcm5MZXR0ZXJzOiBwYXR0ZXJuTGV0dGVycyxcblx0ICAgIC8vIOaXpeacn+WNoOS9jeespuato+WImeOAglxuXHQgICAgX3Jmb3JtYXQ6IG5ldyBSZWdFeHAoKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHZhciByZSA9IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSBpbiBwYXR0ZXJuTGV0dGVycykgcmUucHVzaChpKVxuXHQgICAgICAgIHJldHVybiAnKCcgKyByZS5qb2luKCd8JykgKyAnKSdcblx0ICAgIH0pKCksICdnJyksXG5cdCAgICAvLyDmoLzlvI/ljJbml6XmnJ/jgIJcblx0ICAgIF9mb3JtYXREYXRlOiBmdW5jdGlvbihkYXRlLCBmb3JtYXQpIHtcblx0ICAgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UodGhpcy5fcmZvcm1hdCwgZnVuY3Rpb24gY3JlYXROZXdTdWJTdHJpbmcoJDAsIGZsYWcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXR0ZXJuTGV0dGVyc1tmbGFnXSA9PT0gJ2Z1bmN0aW9uJyA/IHBhdHRlcm5MZXR0ZXJzW2ZsYWddKGRhdGUpIDpcblx0ICAgICAgICAgICAgICAgIHBhdHRlcm5MZXR0ZXJzW2ZsYWddIGluIHBhdHRlcm5MZXR0ZXJzID8gY3JlYXROZXdTdWJTdHJpbmcoJDAsIHBhdHRlcm5MZXR0ZXJzW2ZsYWddKSA6XG5cdCAgICAgICAgICAgICAgICBkYXRlW3BhdHRlcm5MZXR0ZXJzW2ZsYWddXSgpXG5cdCAgICAgICAgfSlcblx0ICAgIH0sXG5cdCAgICAvLyDnlJ/miJDkuIDkuKrpmo/mnLrnmoQgRGF0ZSDlr7nosaHjgIJcblx0ICAgIF9yYW5kb21EYXRlOiBmdW5jdGlvbihtaW4sIG1heCkgeyAvLyBtaW4sIG1heFxuXHQgICAgICAgIG1pbiA9IG1pbiA9PT0gdW5kZWZpbmVkID8gbmV3IERhdGUoMCkgOiBtaW5cblx0ICAgICAgICBtYXggPSBtYXggPT09IHVuZGVmaW5lZCA/IG5ldyBEYXRlKCkgOiBtYXhcblx0ICAgICAgICByZXR1cm4gbmV3IERhdGUoTWF0aC5yYW5kb20oKSAqIChtYXguZ2V0VGltZSgpIC0gbWluLmdldFRpbWUoKSkpXG5cdCAgICB9LFxuXHQgICAgLy8g6L+U5Zue5LiA5Liq6ZqP5py655qE5pel5pyf5a2X56ym5Liy44CCXG5cdCAgICBkYXRlOiBmdW5jdGlvbihmb3JtYXQpIHtcblx0ICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJ3l5eXktTU0tZGQnXG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdERhdGUodGhpcy5fcmFuZG9tRGF0ZSgpLCBmb3JtYXQpXG5cdCAgICB9LFxuXHQgICAgLy8g6L+U5Zue5LiA5Liq6ZqP5py655qE5pe26Ze05a2X56ym5Liy44CCXG5cdCAgICB0aW1lOiBmdW5jdGlvbihmb3JtYXQpIHtcblx0ICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJ0hIOm1tOnNzJ1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXREYXRlKHRoaXMuX3JhbmRvbURhdGUoKSwgZm9ybWF0KVxuXHQgICAgfSxcblx0ICAgIC8vIOi/lOWbnuS4gOS4qumaj+acuueahOaXpeacn+WSjOaXtumXtOWtl+espuS4suOAglxuXHQgICAgZGF0ZXRpbWU6IGZ1bmN0aW9uKGZvcm1hdCkge1xuXHQgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAneXl5eS1NTS1kZCBISDptbTpzcydcblx0ICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0RGF0ZSh0aGlzLl9yYW5kb21EYXRlKCksIGZvcm1hdClcblx0ICAgIH0sXG5cdCAgICAvLyDov5Tlm57lvZPliY3nmoTml6XmnJ/lkozml7bpl7TlrZfnrKbkuLLjgIJcblx0ICAgIG5vdzogZnVuY3Rpb24odW5pdCwgZm9ybWF0KSB7XG5cdCAgICAgICAgLy8gbm93KHVuaXQpIG5vdyhmb3JtYXQpXG5cdCAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcblx0ICAgICAgICAgICAgLy8gbm93KGZvcm1hdClcblx0ICAgICAgICAgICAgaWYgKCEveWVhcnxtb250aHxkYXl8aG91cnxtaW51dGV8c2Vjb25kfHdlZWsvLnRlc3QodW5pdCkpIHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuaXRcblx0ICAgICAgICAgICAgICAgIHVuaXQgPSAnJ1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHVuaXQgPSAodW5pdCB8fCAnJykudG9Mb3dlckNhc2UoKVxuXHQgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAneXl5eS1NTS1kZCBISDptbTpzcydcblxuXHQgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoKVxuXG5cdCAgICAgICAgLyoganNoaW50IC1XMDg2ICovXG5cdCAgICAgICAgLy8g5Y+C6ICD6IeqIGh0dHA6Ly9tb21lbnRqcy5jbi9kb2NzLyMvbWFuaXB1bGF0aW5nL3N0YXJ0LW9mL1xuXHQgICAgICAgIHN3aXRjaCAodW5pdCkge1xuXHQgICAgICAgICAgICBjYXNlICd5ZWFyJzpcblx0ICAgICAgICAgICAgICAgIGRhdGUuc2V0TW9udGgoMClcblx0ICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuXHQgICAgICAgICAgICAgICAgZGF0ZS5zZXREYXRlKDEpXG5cdCAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuXHQgICAgICAgICAgICBjYXNlICdkYXknOlxuXHQgICAgICAgICAgICAgICAgZGF0ZS5zZXRIb3VycygwKVxuXHQgICAgICAgICAgICBjYXNlICdob3VyJzpcblx0ICAgICAgICAgICAgICAgIGRhdGUuc2V0TWludXRlcygwKVxuXHQgICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuXHQgICAgICAgICAgICAgICAgZGF0ZS5zZXRTZWNvbmRzKDApXG5cdCAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG5cdCAgICAgICAgICAgICAgICBkYXRlLnNldE1pbGxpc2Vjb25kcygwKVxuXHQgICAgICAgIH1cblx0ICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcblx0ICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG5cdCAgICAgICAgICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSBkYXRlLmdldERheSgpKVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXREYXRlKGRhdGUsIGZvcm1hdClcblx0ICAgIH1cblx0fVxuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24obW9kdWxlKSB7LyogZ2xvYmFsIGRvY3VtZW50ICAqL1xuXHQvKlxuXHQgICAgIyMgSW1hZ2Vcblx0Ki9cblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdCAgICAvLyDluLjop4HnmoTlub/lkYrlrr3pq5hcblx0ICAgIF9hZFNpemU6IFtcblx0ICAgICAgICAnMzAweDI1MCcsICcyNTB4MjUwJywgJzI0MHg0MDAnLCAnMzM2eDI4MCcsICcxODB4MTUwJyxcblx0ICAgICAgICAnNzIweDMwMCcsICc0Njh4NjAnLCAnMjM0eDYwJywgJzg4eDMxJywgJzEyMHg5MCcsXG5cdCAgICAgICAgJzEyMHg2MCcsICcxMjB4MjQwJywgJzEyNXgxMjUnLCAnNzI4eDkwJywgJzE2MHg2MDAnLFxuXHQgICAgICAgICcxMjB4NjAwJywgJzMwMHg2MDAnXG5cdCAgICBdLFxuXHQgICAgLy8g5bi46KeB55qE5bGP5bmV5a696auYXG5cdCAgICBfc2NyZWVuU2l6ZTogW1xuXHQgICAgICAgICczMjB4MjAwJywgJzMyMHgyNDAnLCAnNjQweDQ4MCcsICc4MDB4NDgwJywgJzgwMHg0ODAnLFxuXHQgICAgICAgICcxMDI0eDYwMCcsICcxMDI0eDc2OCcsICcxMjgweDgwMCcsICcxNDQweDkwMCcsICcxOTIweDEyMDAnLFxuXHQgICAgICAgICcyNTYweDE2MDAnXG5cdCAgICBdLFxuXHQgICAgLy8g5bi46KeB55qE6KeG6aKR5a696auYXG5cdCAgICBfdmlkZW9TaXplOiBbJzcyMHg0ODAnLCAnNzY4eDU3NicsICcxMjgweDcyMCcsICcxOTIweDEwODAnXSxcblx0ICAgIC8qXG5cdCAgICAgICAg55Sf5oiQ5LiA5Liq6ZqP5py655qE5Zu+54mH5Zyw5Z2A44CCXG5cblx0ICAgICAgICDmm7/ku6Plm77niYfmupBcblx0ICAgICAgICAgICAgaHR0cDovL2Zwb2ltZy5jb20vXG5cdCAgICAgICAg5Y+C6ICD6IeqIFxuXHQgICAgICAgICAgICBodHRwOi8vcmVuc2FubmluZy5pdGV5ZS5jb20vYmxvZy8xOTMzMzEwXG5cdCAgICAgICAgICAgIGh0dHA6Ly9jb2RlLnR1dHNwbHVzLmNvbS9hcnRpY2xlcy90aGUtdG9wLTgtcGxhY2Vob2xkZXJzLWZvci13ZWItZGVzaWduZXJzLS1uZXQtMTk0ODVcblx0ICAgICovXG5cdCAgICBpbWFnZTogZnVuY3Rpb24oc2l6ZSwgYmFja2dyb3VuZCwgZm9yZWdyb3VuZCwgZm9ybWF0LCB0ZXh0KSB7XG5cdCAgICAgICAgLy8gUmFuZG9tLmltYWdlKCBzaXplLCBiYWNrZ3JvdW5kLCBmb3JlZ3JvdW5kLCB0ZXh0IClcblx0ICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkge1xuXHQgICAgICAgICAgICB0ZXh0ID0gZm9ybWF0XG5cdCAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZFxuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBSYW5kb20uaW1hZ2UoIHNpemUsIGJhY2tncm91bmQsIHRleHQgKVxuXHQgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG5cdCAgICAgICAgICAgIHRleHQgPSBmb3JlZ3JvdW5kXG5cdCAgICAgICAgICAgIGZvcmVncm91bmQgPSB1bmRlZmluZWRcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gUmFuZG9tLmltYWdlKClcblx0ICAgICAgICBpZiAoIXNpemUpIHNpemUgPSB0aGlzLnBpY2sodGhpcy5fYWRTaXplKVxuXG5cdCAgICAgICAgaWYgKGJhY2tncm91bmQgJiYgfmJhY2tncm91bmQuaW5kZXhPZignIycpKSBiYWNrZ3JvdW5kID0gYmFja2dyb3VuZC5zbGljZSgxKVxuXHQgICAgICAgIGlmIChmb3JlZ3JvdW5kICYmIH5mb3JlZ3JvdW5kLmluZGV4T2YoJyMnKSkgZm9yZWdyb3VuZCA9IGZvcmVncm91bmQuc2xpY2UoMSlcblxuXHQgICAgICAgIC8vIGh0dHA6Ly9kdW1teWltYWdlLmNvbS82MDB4NDAwL2NjMDBjYy80NzAwNDcucG5nJnRleHQ9aGVsbG9cblx0ICAgICAgICByZXR1cm4gJ2h0dHA6Ly9kdW1teWltYWdlLmNvbS8nICsgc2l6ZSArXG5cdCAgICAgICAgICAgIChiYWNrZ3JvdW5kID8gJy8nICsgYmFja2dyb3VuZCA6ICcnKSArXG5cdCAgICAgICAgICAgIChmb3JlZ3JvdW5kID8gJy8nICsgZm9yZWdyb3VuZCA6ICcnKSArXG5cdCAgICAgICAgICAgIChmb3JtYXQgPyAnLicgKyBmb3JtYXQgOiAnJykgK1xuXHQgICAgICAgICAgICAodGV4dCA/ICcmdGV4dD0nICsgdGV4dCA6ICcnKVxuXHQgICAgfSxcblx0ICAgIGltZzogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHQgICAgfSxcblxuXHQgICAgLypcblx0ICAgICAgICBCcmFuZENvbG9yc1xuXHQgICAgICAgIGh0dHA6Ly9icmFuZGNvbG9ycy5uZXQvXG5cdCAgICAgICAgQSBjb2xsZWN0aW9uIG9mIG1ham9yIGJyYW5kIGNvbG9yIGNvZGVzIGN1cmF0ZWQgYnkgR2FsZW4gR2lkbWFuLlxuXHQgICAgICAgIOWkp+eJjOWFrOWPuOeahOminOiJsumbhuWQiFxuXG5cdCAgICAgICAgLy8g6I635Y+W5ZOB54mM5ZKM6aKc6ImyXG5cdCAgICAgICAgJCgnaDInKS5lYWNoKGZ1bmN0aW9uKGluZGV4LCBpdGVtKXtcblx0ICAgICAgICAgICAgaXRlbSA9ICQoaXRlbSlcblx0ICAgICAgICAgICAgY29uc29sZS5sb2coJ1xcJycgKyBpdGVtLnRleHQoKSArICdcXCcnLCAnOicsICdcXCcnICsgaXRlbS5uZXh0KCkudGV4dCgpICsgJ1xcJycsICcsJylcblx0ICAgICAgICB9KVxuXHQgICAgKi9cblx0ICAgIF9icmFuZENvbG9yczoge1xuXHQgICAgICAgICc0b3JtYXQnOiAnI2ZiMGEyYScsXG5cdCAgICAgICAgJzUwMHB4JzogJyMwMmFkZWEnLFxuXHQgICAgICAgICdBYm91dC5tZSAoYmx1ZSknOiAnIzAwNDA1ZCcsXG5cdCAgICAgICAgJ0Fib3V0Lm1lICh5ZWxsb3cpJzogJyNmZmNjMzMnLFxuXHQgICAgICAgICdBZGR2b2NhdGUnOiAnI2ZmNjEzOCcsXG5cdCAgICAgICAgJ0Fkb2JlJzogJyNmZjAwMDAnLFxuXHQgICAgICAgICdBaW0nOiAnI2ZjZDIwYicsXG5cdCAgICAgICAgJ0FtYXpvbic6ICcjZTQ3OTExJyxcblx0ICAgICAgICAnQW5kcm9pZCc6ICcjYTRjNjM5Jyxcblx0ICAgICAgICAnQW5naWVcXCdzIExpc3QnOiAnIzdmYmIwMCcsXG5cdCAgICAgICAgJ0FPTCc6ICcjMDA2MGEzJyxcblx0ICAgICAgICAnQXRsYXNzaWFuJzogJyMwMDMzNjYnLFxuXHQgICAgICAgICdCZWhhbmNlJzogJyMwNTNlZmYnLFxuXHQgICAgICAgICdCaWcgQ2FydGVsJzogJyM5N2I1MzgnLFxuXHQgICAgICAgICdiaXRseSc6ICcjZWU2MTIzJyxcblx0ICAgICAgICAnQmxvZ2dlcic6ICcjZmM0ZjA4Jyxcblx0ICAgICAgICAnQm9laW5nJzogJyMwMDM5YTYnLFxuXHQgICAgICAgICdCb29raW5nLmNvbSc6ICcjMDAzNTgwJyxcblx0ICAgICAgICAnQ2FyYm9ubWFkZSc6ICcjNjEzODU0Jyxcblx0ICAgICAgICAnQ2hlZGRhcic6ICcjZmY3MjQzJyxcblx0ICAgICAgICAnQ29kZSBTY2hvb2wnOiAnIzNkNDk0NCcsXG5cdCAgICAgICAgJ0RlbGljaW91cyc6ICcjMjA1Y2MwJyxcblx0ICAgICAgICAnRGVsbCc6ICcjMzI4N2MxJyxcblx0ICAgICAgICAnRGVzaWdubW9vJzogJyNlNTRhNGYnLFxuXHQgICAgICAgICdEZXZpYW50YXJ0JzogJyM0ZTYyNTInLFxuXHQgICAgICAgICdEZXNpZ25lciBOZXdzJzogJyMyZDcyZGEnLFxuXHQgICAgICAgICdEZXZvdXInOiAnI2ZkMDAwMScsXG5cdCAgICAgICAgJ0RFV0FMVCc6ICcjZmViZDE3Jyxcblx0ICAgICAgICAnRGlzcXVzIChibHVlKSc6ICcjNTlhM2ZjJyxcblx0ICAgICAgICAnRGlzcXVzIChvcmFuZ2UpJzogJyNkYjcxMzInLFxuXHQgICAgICAgICdEcmliYmJsZSc6ICcjZWE0Yzg5Jyxcblx0ICAgICAgICAnRHJvcGJveCc6ICcjM2Q5YWU4Jyxcblx0ICAgICAgICAnRHJ1cGFsJzogJyMwYzc2YWInLFxuXHQgICAgICAgICdEdW5rZWQnOiAnIzJhMzIzYScsXG5cdCAgICAgICAgJ2VCYXknOiAnIzg5YzUwNycsXG5cdCAgICAgICAgJ0VtYmVyJzogJyNmMDVlMWInLFxuXHQgICAgICAgICdFbmdhZGdldCc6ICcjMDBiZGY2Jyxcblx0ICAgICAgICAnRW52YXRvJzogJyM1MjgwMzYnLFxuXHQgICAgICAgICdFdHN5JzogJyNlYjZkMjAnLFxuXHQgICAgICAgICdFdmVybm90ZSc6ICcjNWJhNTI1Jyxcblx0ICAgICAgICAnRmFiLmNvbSc6ICcjZGQwMDE3Jyxcblx0ICAgICAgICAnRmFjZWJvb2snOiAnIzNiNTk5OCcsXG5cdCAgICAgICAgJ0ZpcmVmb3gnOiAnI2U2NjAwMCcsXG5cdCAgICAgICAgJ0ZsaWNrciAoYmx1ZSknOiAnIzAwNjNkYycsXG5cdCAgICAgICAgJ0ZsaWNrciAocGluayknOiAnI2ZmMDA4NCcsXG5cdCAgICAgICAgJ0ZvcnJzdCc6ICcjNWI5YTY4Jyxcblx0ICAgICAgICAnRm91cnNxdWFyZSc6ICcjMjVhMGNhJyxcblx0ICAgICAgICAnR2FybWluJzogJyMwMDdjYzMnLFxuXHQgICAgICAgICdHZXRHbHVlJzogJyMyZDc1YTInLFxuXHQgICAgICAgICdHaW1tZWJhcic6ICcjZjcwMDc4Jyxcblx0ICAgICAgICAnR2l0SHViJzogJyMxNzE1MTUnLFxuXHQgICAgICAgICdHb29nbGUgQmx1ZSc6ICcjMDE0MGNhJyxcblx0ICAgICAgICAnR29vZ2xlIEdyZWVuJzogJyMxNmE2MWUnLFxuXHQgICAgICAgICdHb29nbGUgUmVkJzogJyNkZDE4MTInLFxuXHQgICAgICAgICdHb29nbGUgWWVsbG93JzogJyNmY2NhMDMnLFxuXHQgICAgICAgICdHb29nbGUrJzogJyNkZDRiMzknLFxuXHQgICAgICAgICdHcm9vdmVzaGFyayc6ICcjZjc3ZjAwJyxcblx0ICAgICAgICAnR3JvdXBvbic6ICcjODJiNTQ4Jyxcblx0ICAgICAgICAnSGFja2VyIE5ld3MnOiAnI2ZmNjYwMCcsXG5cdCAgICAgICAgJ0hlbGxvV2FsbGV0JzogJyMwMDg1Y2EnLFxuXHQgICAgICAgICdIZXJva3UgKGxpZ2h0KSc6ICcjYzdjNWU2Jyxcblx0ICAgICAgICAnSGVyb2t1IChkYXJrKSc6ICcjNjU2N2E1Jyxcblx0ICAgICAgICAnSG9vdFN1aXRlJzogJyMwMDMzNjYnLFxuXHQgICAgICAgICdIb3V6eic6ICcjNzNiYTM3Jyxcblx0ICAgICAgICAnSFRNTDUnOiAnI2VjNjIzMScsXG5cdCAgICAgICAgJ0lLRUEnOiAnI2ZmY2MzMycsXG5cdCAgICAgICAgJ0lNRGInOiAnI2YzY2UxMycsXG5cdCAgICAgICAgJ0luc3RhZ3JhbSc6ICcjM2Y3MjliJyxcblx0ICAgICAgICAnSW50ZWwnOiAnIzAwNzFjNScsXG5cdCAgICAgICAgJ0ludHVpdCc6ICcjMzY1ZWJmJyxcblx0ICAgICAgICAnS2lja3N0YXJ0ZXInOiAnIzc2Y2MxZScsXG5cdCAgICAgICAgJ2tpcHB0JzogJyNlMDM1MDAnLFxuXHQgICAgICAgICdLb2RlcnknOiAnIzAwYWY4MScsXG5cdCAgICAgICAgJ0xhc3RGTSc6ICcjYzMwMDBkJyxcblx0ICAgICAgICAnTGlua2VkSW4nOiAnIzBlNzZhOCcsXG5cdCAgICAgICAgJ0xpdmVzdHJlYW0nOiAnI2NmMDAwNScsXG5cdCAgICAgICAgJ0x1bW8nOiAnIzU3NjM5NicsXG5cdCAgICAgICAgJ01peHBhbmVsJzogJyNhMDg2ZDMnLFxuXHQgICAgICAgICdNZWV0dXAnOiAnI2U1MTkzNycsXG5cdCAgICAgICAgJ05va2lhJzogJyMxODM2OTMnLFxuXHQgICAgICAgICdOVklESUEnOiAnIzc2YjkwMCcsXG5cdCAgICAgICAgJ09wZXJhJzogJyNjYzBmMTYnLFxuXHQgICAgICAgICdQYXRoJzogJyNlNDFmMTEnLFxuXHQgICAgICAgICdQYXlQYWwgKGRhcmspJzogJyMxZTQ3N2EnLFxuXHQgICAgICAgICdQYXlQYWwgKGxpZ2h0KSc6ICcjM2I3YmJmJyxcblx0ICAgICAgICAnUGluYm9hcmQnOiAnIzAwMDBlNicsXG5cdCAgICAgICAgJ1BpbnRlcmVzdCc6ICcjYzgyMzJjJyxcblx0ICAgICAgICAnUGxheVN0YXRpb24nOiAnIzY2NWNiZScsXG5cdCAgICAgICAgJ1BvY2tldCc6ICcjZWU0MDU2Jyxcblx0ICAgICAgICAnUHJlemknOiAnIzMxOGJmZicsXG5cdCAgICAgICAgJ1B1c2hhJzogJyMwZjcxYjQnLFxuXHQgICAgICAgICdRdW9yYSc6ICcjYTgyNDAwJyxcblx0ICAgICAgICAnUVVPVEUuZm0nOiAnIzY2Y2VmZicsXG5cdCAgICAgICAgJ1JkaW8nOiAnIzAwOGZkNScsXG5cdCAgICAgICAgJ1JlYWRhYmlsaXR5JzogJyM5YzAwMDAnLFxuXHQgICAgICAgICdSZWQgSGF0JzogJyNjYzAwMDAnLFxuXHQgICAgICAgICdSZXNvdXJjZSc6ICcjN2ViNDAwJyxcblx0ICAgICAgICAnUm9ja3BhY2snOiAnIzBiYTZhYicsXG5cdCAgICAgICAgJ1Jvb24nOiAnIzYyYjBkOScsXG5cdCAgICAgICAgJ1JTUyc6ICcjZWU4MDJmJyxcblx0ICAgICAgICAnU2FsZXNmb3JjZSc6ICcjMTc5OGMxJyxcblx0ICAgICAgICAnU2Ftc3VuZyc6ICcjMGM0ZGEyJyxcblx0ICAgICAgICAnU2hvcGlmeSc6ICcjOTZiZjQ4Jyxcblx0ICAgICAgICAnU2t5cGUnOiAnIzAwYWZmMCcsXG5cdCAgICAgICAgJ1NuYWdham9iJzogJyNmNDdhMjAnLFxuXHQgICAgICAgICdTb2Z0b25pYyc6ICcjMDA4YWNlJyxcblx0ICAgICAgICAnU291bmRDbG91ZCc6ICcjZmY3NzAwJyxcblx0ICAgICAgICAnU3BhY2UgQm94JzogJyNmODY5NjAnLFxuXHQgICAgICAgICdTcG90aWZ5JzogJyM4MWI3MWEnLFxuXHQgICAgICAgICdTcHJpbnQnOiAnI2ZlZTEwMCcsXG5cdCAgICAgICAgJ1NxdWFyZXNwYWNlJzogJyMxMjEyMTInLFxuXHQgICAgICAgICdTdGFja092ZXJmbG93JzogJyNlZjgyMzYnLFxuXHQgICAgICAgICdTdGFwbGVzJzogJyNjYzAwMDAnLFxuXHQgICAgICAgICdTdGF0dXMgQ2hhcnQnOiAnI2Q3NTg0ZicsXG5cdCAgICAgICAgJ1N0cmlwZSc6ICcjMDA4Y2RkJyxcblx0ICAgICAgICAnU3R1ZHlCbHVlJzogJyMwMGFmZTEnLFxuXHQgICAgICAgICdTdHVtYmxlVXBvbic6ICcjZjc0NDI1Jyxcblx0ICAgICAgICAnVC1Nb2JpbGUnOiAnI2VhMGE4ZScsXG5cdCAgICAgICAgJ1RlY2hub3JhdGknOiAnIzQwYTgwMCcsXG5cdCAgICAgICAgJ1RoZSBOZXh0IFdlYic6ICcjZWY0NDIzJyxcblx0ICAgICAgICAnVHJlZWhvdXNlJzogJyM1Y2I4NjgnLFxuXHQgICAgICAgICdUcnVsaWEnOiAnIzVlYWIxZicsXG5cdCAgICAgICAgJ1R1bWJscic6ICcjMzQ1MjZmJyxcblx0ICAgICAgICAnVHdpdGNoLnR2JzogJyM2NDQxYTUnLFxuXHQgICAgICAgICdUd2l0dGVyJzogJyMwMGFjZWUnLFxuXHQgICAgICAgICdUWVBPMyc6ICcjZmY4NzAwJyxcblx0ICAgICAgICAnVWJ1bnR1JzogJyNkZDQ4MTQnLFxuXHQgICAgICAgICdVc3RyZWFtJzogJyMzMzg4ZmYnLFxuXHQgICAgICAgICdWZXJpem9uJzogJyNlZjFkMWQnLFxuXHQgICAgICAgICdWaW1lbyc6ICcjODZjOWVmJyxcblx0ICAgICAgICAnVmluZSc6ICcjMDBhNDc4Jyxcblx0ICAgICAgICAnVmlyYic6ICcjMDZhZmQ4Jyxcblx0ICAgICAgICAnVmlyZ2luIE1lZGlhJzogJyNjYzAwMDAnLFxuXHQgICAgICAgICdXb29nYSc6ICcjNWIwMDljJyxcblx0ICAgICAgICAnV29yZFByZXNzIChibHVlKSc6ICcjMjE3NTliJyxcblx0ICAgICAgICAnV29yZFByZXNzIChvcmFuZ2UpJzogJyNkNTRlMjEnLFxuXHQgICAgICAgICdXb3JkUHJlc3MgKGdyZXkpJzogJyM0NjQ2NDYnLFxuXHQgICAgICAgICdXdW5kZXJsaXN0JzogJyMyYjg4ZDknLFxuXHQgICAgICAgICdYQk9YJzogJyM5YmM4NDgnLFxuXHQgICAgICAgICdYSU5HJzogJyMxMjY1NjcnLFxuXHQgICAgICAgICdZYWhvbyEnOiAnIzcyMGU5ZScsXG5cdCAgICAgICAgJ1lhbmRleCc6ICcjZmZjYzAwJyxcblx0ICAgICAgICAnWWVscCc6ICcjYzQxMjAwJyxcblx0ICAgICAgICAnWW91VHViZSc6ICcjYzQzMDJiJyxcblx0ICAgICAgICAnWmFsb25nbyc6ICcjNTQ5OGRjJyxcblx0ICAgICAgICAnWmVuZGVzayc6ICcjNzhhMzAwJyxcblx0ICAgICAgICAnWmVycGx5JzogJyM5ZGNjN2EnLFxuXHQgICAgICAgICdab290b29sJzogJyM1ZThiMWQnXG5cdCAgICB9LFxuXHQgICAgX2JyYW5kTmFtZXM6IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHZhciBicmFuZHMgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBiIGluIHRoaXMuX2JyYW5kQ29sb3JzKSB7XG5cdCAgICAgICAgICAgIGJyYW5kcy5wdXNoKGIpXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBicmFuZHNcblx0ICAgIH0sXG5cdCAgICAvKlxuXHQgICAgICAgIOeUn+aIkOS4gOautemaj+acuueahCBCYXNlNjQg5Zu+54mH57yW56CB44CCXG5cblx0ICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vaW1za3kvaG9sZGVyXG5cdCAgICAgICAgSG9sZGVyIHJlbmRlcnMgaW1hZ2UgcGxhY2Vob2xkZXJzIGVudGlyZWx5IG9uIHRoZSBjbGllbnQgc2lkZS5cblxuXHQgICAgICAgIGRhdGFJbWFnZUhvbGRlcjogZnVuY3Rpb24oc2l6ZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gJ2hvbGRlci5qcy8nICsgc2l6ZVxuXHQgICAgICAgIH0sXG5cdCAgICAqL1xuXHQgICAgZGF0YUltYWdlOiBmdW5jdGlvbihzaXplLCB0ZXh0KSB7XG5cdCAgICAgICAgdmFyIGNhbnZhc1xuXHQgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgLypcblx0ICAgICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BdXRvbWF0dGljL25vZGUtY2FudmFzXG5cdCAgICAgICAgICAgICAgICAgICAgbnBtIGluc3RhbGwgY2FudmFzIC0tc2F2ZVxuXHQgICAgICAgICAgICAgICAg5a6J6KOF6Zeu6aKY77yaXG5cdCAgICAgICAgICAgICAgICAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjI5NTMyMDYvZ3VscC1pc3N1ZXMtd2l0aC1jYXJpby1pbnN0YWxsLWNvbW1hbmQtbm90LWZvdW5kLXdoZW4tdHJ5aW5nLXRvLWluc3RhbGxpbmctY2FudmFcblx0ICAgICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvbm9kZS1jYW52YXMvaXNzdWVzLzQxNVxuXHQgICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vQXV0b21hdHRpYy9ub2RlLWNhbnZhcy93aWtpL19wYWdlc1xuXG5cdCAgICAgICAgICAgICAgICBQU++8mm5vZGUtY2FudmFzIOeahOWuieijhei/h+eoi+WunuWcqOaYr+Wkque5geeQkOS6hu+8jOaJgOS7peS4jeaUvuWFpSBwYWNrYWdlLmpzb24g55qEIGRlcGVuZGVuY2llc+OAglxuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgdmFyIENhbnZhcyA9IG1vZHVsZS5yZXF1aXJlKCdjYW52YXMnKVxuXHQgICAgICAgICAgICBjYW52YXMgPSBuZXcgQ2FudmFzKClcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgY3R4ID0gY2FudmFzICYmIGNhbnZhcy5nZXRDb250ZXh0ICYmIGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIilcblx0ICAgICAgICBpZiAoIWNhbnZhcyB8fCAhY3R4KSByZXR1cm4gJydcblxuXHQgICAgICAgIGlmICghc2l6ZSkgc2l6ZSA9IHRoaXMucGljayh0aGlzLl9hZFNpemUpXG5cdCAgICAgICAgdGV4dCA9IHRleHQgIT09IHVuZGVmaW5lZCA/IHRleHQgOiBzaXplXG5cblx0ICAgICAgICBzaXplID0gc2l6ZS5zcGxpdCgneCcpXG5cblx0ICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludChzaXplWzBdLCAxMCksXG5cdCAgICAgICAgICAgIGhlaWdodCA9IHBhcnNlSW50KHNpemVbMV0sIDEwKSxcblx0ICAgICAgICAgICAgYmFja2dyb3VuZCA9IHRoaXMuX2JyYW5kQ29sb3JzW3RoaXMucGljayh0aGlzLl9icmFuZE5hbWVzKCkpXSxcblx0ICAgICAgICAgICAgZm9yZWdyb3VuZCA9ICcjRkZGJyxcblx0ICAgICAgICAgICAgdGV4dF9oZWlnaHQgPSAxNCxcblx0ICAgICAgICAgICAgZm9udCA9ICdzYW5zLXNlcmlmJztcblxuXHQgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoXG5cdCAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodFxuXHQgICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJ1xuXHQgICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJ1xuXHQgICAgICAgIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kXG5cdCAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXG5cdCAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGZvcmVncm91bmRcblx0ICAgICAgICBjdHguZm9udCA9ICdib2xkICcgKyB0ZXh0X2hlaWdodCArICdweCAnICsgZm9udFxuXHQgICAgICAgIGN0eC5maWxsVGV4dCh0ZXh0LCAod2lkdGggLyAyKSwgKGhlaWdodCAvIDIpLCB3aWR0aClcblx0ICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJylcblx0ICAgIH1cblx0fVxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg5KShtb2R1bGUpKSlcblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRcdGlmKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XHJcblx0XHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xyXG5cdFx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XHJcblx0XHRcdG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtb2R1bGU7XHJcblx0fVxyXG5cblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qXG5cdCAgICAjIyBDb2xvclxuXG5cdCAgICBodHRwOi8vbGxsbGxsLmxpL3JhbmRvbUNvbG9yL1xuXHQgICAgICAgIEEgY29sb3IgZ2VuZXJhdG9yIGZvciBKYXZhU2NyaXB0LlxuXHQgICAgICAgIHJhbmRvbUNvbG9yIGdlbmVyYXRlcyBhdHRyYWN0aXZlIGNvbG9ycyBieSBkZWZhdWx0LiBNb3JlIHNwZWNpZmljYWxseSwgcmFuZG9tQ29sb3IgcHJvZHVjZXMgYnJpZ2h0IGNvbG9ycyB3aXRoIGEgcmVhc29uYWJseSBoaWdoIHNhdHVyYXRpb24uIFRoaXMgbWFrZXMgcmFuZG9tQ29sb3IgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZGF0YSB2aXN1YWxpemF0aW9ucyBhbmQgZ2VuZXJhdGl2ZSBhcnQuXG5cblx0ICAgIGh0dHA6Ly9yYW5kb21jb2xvdXIuY29tL1xuXHQgICAgICAgIHZhciBiZ19jb2xvdXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxNjc3NzIxNSkudG9TdHJpbmcoMTYpO1xuXHQgICAgICAgIGJnX2NvbG91ciA9IFwiI1wiICsgKFwiMDAwMDAwXCIgKyBiZ19jb2xvdXIpLnNsaWNlKC02KTtcblx0ICAgICAgICBkb2N1bWVudC5iZ0NvbG9yID0gYmdfY29sb3VyO1xuXHQgICAgXG5cdCAgICBodHRwOi8vbWFydGluLmFua2VybC5jb20vMjAwOS8xMi8wOS9ob3ctdG8tY3JlYXRlLXJhbmRvbS1jb2xvcnMtcHJvZ3JhbW1hdGljYWxseS9cblx0ICAgICAgICBDcmVhdGluZyByYW5kb20gY29sb3JzIGlzIGFjdHVhbGx5IG1vcmUgZGlmZmljdWx0IHRoYW4gaXQgc2VlbXMuIFRoZSByYW5kb21uZXNzIGl0c2VsZiBpcyBlYXN5LCBidXQgYWVzdGhldGljYWxseSBwbGVhc2luZyByYW5kb21uZXNzIGlzIG1vcmUgZGlmZmljdWx0LlxuXHQgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZvbmdvdmV0dC9jb2xvci1nZW5lcmF0b3JcblxuXHQgICAgaHR0cDovL3d3dy5wYXVsaXJpc2guY29tLzIwMDkvcmFuZG9tLWhleC1jb2xvci1jb2RlLXNuaXBwZXRzL1xuXHQgICAgICAgIFJhbmRvbSBIZXggQ29sb3IgQ29kZSBHZW5lcmF0b3IgaW4gSmF2YVNjcmlwdFxuXG5cdCAgICBodHRwOi8vY2hhbmNlanMuY29tLyNjb2xvclxuXHQgICAgICAgIGNoYW5jZS5jb2xvcigpXG5cdCAgICAgICAgLy8gPT4gJyM3OWMxNTcnXG5cdCAgICAgICAgY2hhbmNlLmNvbG9yKHtmb3JtYXQ6ICdoZXgnfSlcblx0ICAgICAgICAvLyA9PiAnI2Q2NzExOCdcblx0ICAgICAgICBjaGFuY2UuY29sb3Ioe2Zvcm1hdDogJ3Nob3J0aGV4J30pXG5cdCAgICAgICAgLy8gPT4gJyM2MGYnXG5cdCAgICAgICAgY2hhbmNlLmNvbG9yKHtmb3JtYXQ6ICdyZ2InfSlcblx0ICAgICAgICAvLyA9PiAncmdiKDExMCw1MiwxNjQpJ1xuXG5cdCAgICBodHRwOi8vdG9vbC5jN3NreS5jb20vd2ViY29sb3Jcblx0ICAgICAgICDnvZHpobXorr7orqHluLjnlKjoibLlvanmkK3phY3ooahcblx0ICAgIFxuXHQgICAgaHR0cHM6Ly9naXRodWIuY29tL09uZS1jb20vb25lLWNvbG9yXG5cdCAgICAgICAgQW4gT08tYmFzZWQgSmF2YVNjcmlwdCBjb2xvciBwYXJzZXIvY29tcHV0YXRpb24gdG9vbGtpdCB3aXRoIHN1cHBvcnQgZm9yIFJHQiwgSFNWLCBIU0wsIENNWUssIGFuZCBhbHBoYSBjaGFubmVscy5cblx0ICAgICAgICBBUEkg5b6I6LWeXG5cblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJ0aHVyL2NvbG9yXG5cdCAgICAgICAgSmF2YVNjcmlwdCBjb2xvciBjb252ZXJzaW9uIGFuZCBtYW5pcHVsYXRpb24gbGlicmFyeVxuXG5cdCAgICBodHRwczovL2dpdGh1Yi5jb20vbGVhdmVyb3UvY3NzLWNvbG9yc1xuXHQgICAgICAgIFNoYXJlICYgY29udmVydCBDU1MgY29sb3JzXG5cdCAgICBodHRwOi8vbGVhdmVyb3UuZ2l0aHViLmlvL2Nzcy1jb2xvcnMvI3NsYXRlZ3JheVxuXHQgICAgICAgIFR5cGUgYSBDU1MgY29sb3Iga2V5d29yZCwgI2hleCwgaHNsKCksIHJnYmEoKSwgd2hhdGV2ZXI6XG5cblx0ICAgIOiJsuiwgyBodWVcblx0ICAgICAgICBodHRwOi8vYmFpa2UuYmFpZHUuY29tL3ZpZXcvMjMzNjguaHRtXG5cdCAgICAgICAg6Imy6LCD5oyH55qE5piv5LiA5bmF55S75Lit55S76Z2i6Imy5b2p55qE5oC75L2T5YC+5ZCR77yM5piv5aSn55qE6Imy5b2p5pWI5p6c44CCXG5cdCAgICDppbHlkozluqYgc2F0dXJhdGlvblxuXHQgICAgICAgIGh0dHA6Ly9iYWlrZS5iYWlkdS5jb20vdmlldy8xODk2NDQuaHRtXG5cdCAgICAgICAg6aWx5ZKM5bqm5piv5oyH6Imy5b2p55qE6bKc6Imz56iL5bqm77yM5Lmf56ew6Imy5b2p55qE57qv5bqm44CC6aWx5ZKM5bqm5Y+W5Yaz5LqO6K+l6Imy5Lit5ZCr6Imy5oiQ5YiG5ZKM5raI6Imy5oiQ5YiG77yI54Gw6Imy77yJ55qE5q+U5L6L44CC5ZCr6Imy5oiQ5YiG6LaK5aSn77yM6aWx5ZKM5bqm6LaK5aSn77yb5raI6Imy5oiQ5YiG6LaK5aSn77yM6aWx5ZKM5bqm6LaK5bCP44CCXG5cdCAgICDkuq7luqYgYnJpZ2h0bmVzc1xuXHQgICAgICAgIGh0dHA6Ly9iYWlrZS5iYWlkdS5jb20vdmlldy8zNDc3My5odG1cblx0ICAgICAgICDkuq7luqbmmK/mjIflj5HlhYnkvZPvvIjlj43lhYnkvZPvvInooajpnaLlj5HlhYnvvIjlj43lhYnvvInlvLrlvLHnmoTniannkIbph4/jgIJcblx0ICAgIOeFp+W6piBsdW1pbm9zaXR5XG5cdCAgICAgICAg54mp5L2T6KKr54Wn5Lqu55qE56iL5bqmLOmHh+eUqOWNleS9jemdouenr+aJgOaOpeWPl+eahOWFiemAmumHj+adpeihqOekuizooajnpLrljZXkvY3kuLrli5Jb5YWL5pavXShMdXgsbHgpICzljbMgMW0gLyBtMiDjgIJcblxuXHQgICAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDg0NTA2L3JhbmRvbS1jb2xvci1nZW5lcmF0b3ItaW4tamF2YXNjcmlwdFxuXHQgICAgICAgIHZhciBsZXR0ZXJzID0gJzAxMjM0NTY3ODlBQkNERUYnLnNwbGl0KCcnKVxuXHQgICAgICAgIHZhciBjb2xvciA9ICcjJ1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7XG5cdCAgICAgICAgICAgIGNvbG9yICs9IGxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTYpXVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY29sb3Jcblx0ICAgIFxuXHQgICAgICAgIC8vIOmaj+acuueUn+aIkOS4gOS4quaXoOiEkeeahOminOiJsu+8jOagvOW8j+S4uiAnI1JSR0dCQifjgIJcblx0ICAgICAgICAvLyBfYnJhaW5sZXNzQ29sb3IoKVxuXHQgICAgICAgIHZhciBjb2xvciA9IE1hdGguZmxvb3IoXG5cdCAgICAgICAgICAgIE1hdGgucmFuZG9tKCkgKlxuXHQgICAgICAgICAgICAoMTYgKiAxNiAqIDE2ICogMTYgKiAxNiAqIDE2IC0gMSlcblx0ICAgICAgICApLnRvU3RyaW5nKDE2KVxuXHQgICAgICAgIGNvbG9yID0gXCIjXCIgKyAoXCIwMDAwMDBcIiArIGNvbG9yKS5zbGljZSgtNilcblx0ICAgICAgICByZXR1cm4gY29sb3IudG9VcHBlckNhc2UoKVxuXHQqL1xuXG5cdHZhciBDb252ZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSlcblx0dmFyIERJQ1QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq5pyJ5ZC45byV5Yqb55qE6aKc6Imy77yM5qC85byP5Li6ICcjUlJHR0JCJ+OAglxuXHQgICAgY29sb3I6IGZ1bmN0aW9uKG5hbWUpIHtcblx0ICAgICAgICBpZiAobmFtZSB8fCBESUNUW25hbWVdKSByZXR1cm4gRElDVFtuYW1lXS5uaWNlclxuXHQgICAgICAgIHJldHVybiB0aGlzLmhleCgpXG5cdCAgICB9LFxuXHQgICAgLy8gI0RBQzBERVxuXHQgICAgaGV4OiBmdW5jdGlvbigpIHtcblx0ICAgICAgICB2YXIgaHN2ID0gdGhpcy5fZ29sZGVuUmF0aW9Db2xvcigpXG5cdCAgICAgICAgdmFyIHJnYiA9IENvbnZlcnQuaHN2MnJnYihoc3YpXG5cdCAgICAgICAgdmFyIGhleCA9IENvbnZlcnQucmdiMmhleChyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKVxuXHQgICAgICAgIHJldHVybiBoZXhcblx0ICAgIH0sXG5cdCAgICAvLyByZ2IoMTI4LDI1NSwyNTUpXG5cdCAgICByZ2I6IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHZhciBoc3YgPSB0aGlzLl9nb2xkZW5SYXRpb0NvbG9yKClcblx0ICAgICAgICB2YXIgcmdiID0gQ29udmVydC5oc3YycmdiKGhzdilcblx0ICAgICAgICByZXR1cm4gJ3JnYignICtcblx0ICAgICAgICAgICAgcGFyc2VJbnQocmdiWzBdLCAxMCkgKyAnLCAnICtcblx0ICAgICAgICAgICAgcGFyc2VJbnQocmdiWzFdLCAxMCkgKyAnLCAnICtcblx0ICAgICAgICAgICAgcGFyc2VJbnQocmdiWzJdLCAxMCkgKyAnKSdcblx0ICAgIH0sXG5cdCAgICAvLyByZ2JhKDEyOCwyNTUsMjU1LDAuMylcblx0ICAgIHJnYmE6IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHZhciBoc3YgPSB0aGlzLl9nb2xkZW5SYXRpb0NvbG9yKClcblx0ICAgICAgICB2YXIgcmdiID0gQ29udmVydC5oc3YycmdiKGhzdilcblx0ICAgICAgICByZXR1cm4gJ3JnYmEoJyArXG5cdCAgICAgICAgICAgIHBhcnNlSW50KHJnYlswXSwgMTApICsgJywgJyArXG5cdCAgICAgICAgICAgIHBhcnNlSW50KHJnYlsxXSwgMTApICsgJywgJyArXG5cdCAgICAgICAgICAgIHBhcnNlSW50KHJnYlsyXSwgMTApICsgJywgJyArXG5cdCAgICAgICAgICAgIE1hdGgucmFuZG9tKCkudG9GaXhlZCgyKSArICcpJ1xuXHQgICAgfSxcblx0ICAgIC8vIGhzbCgzMDAsODAlLDkwJSlcblx0ICAgIGhzbDogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdmFyIGhzdiA9IHRoaXMuX2dvbGRlblJhdGlvQ29sb3IoKVxuXHQgICAgICAgIHZhciBoc2wgPSBDb252ZXJ0LmhzdjJoc2woaHN2KVxuXHQgICAgICAgIHJldHVybiAnaHNsKCcgK1xuXHQgICAgICAgICAgICBwYXJzZUludChoc2xbMF0sIDEwKSArICcsICcgK1xuXHQgICAgICAgICAgICBwYXJzZUludChoc2xbMV0sIDEwKSArICcsICcgK1xuXHQgICAgICAgICAgICBwYXJzZUludChoc2xbMl0sIDEwKSArICcpJ1xuXHQgICAgfSxcblx0ICAgIC8vIGh0dHA6Ly9tYXJ0aW4uYW5rZXJsLmNvbS8yMDA5LzEyLzA5L2hvdy10by1jcmVhdGUtcmFuZG9tLWNvbG9ycy1wcm9ncmFtbWF0aWNhbGx5L1xuXHQgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rldm9uZ292ZXR0L2NvbG9yLWdlbmVyYXRvci9ibG9iL21hc3Rlci9pbmRleC5qc1xuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq5pyJ5ZC45byV5Yqb55qE6aKc6Imy44CCXG5cdCAgICBfZ29sZGVuUmF0aW9Db2xvcjogZnVuY3Rpb24oc2F0dXJhdGlvbiwgdmFsdWUpIHtcblx0ICAgICAgICB0aGlzLl9nb2xkZW5SYXRpbyA9IDAuNjE4MDMzOTg4NzQ5ODk1XG5cdCAgICAgICAgdGhpcy5faHVlID0gdGhpcy5faHVlIHx8IE1hdGgucmFuZG9tKClcblx0ICAgICAgICB0aGlzLl9odWUgKz0gdGhpcy5fZ29sZGVuUmF0aW9cblx0ICAgICAgICB0aGlzLl9odWUgJT0gMVxuXG5cdCAgICAgICAgaWYgKHR5cGVvZiBzYXR1cmF0aW9uICE9PSBcIm51bWJlclwiKSBzYXR1cmF0aW9uID0gMC41O1xuXHQgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHZhbHVlID0gMC45NTtcblxuXHQgICAgICAgIHJldHVybiBbXG5cdCAgICAgICAgICAgIHRoaXMuX2h1ZSAqIDM2MCxcblx0ICAgICAgICAgICAgc2F0dXJhdGlvbiAqIDEwMCxcblx0ICAgICAgICAgICAgdmFsdWUgKiAxMDBcblx0ICAgICAgICBdXG5cdCAgICB9XG5cdH1cblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXG5cdCAgICAjIyBDb2xvciBDb252ZXJ0XG5cblx0ICAgIGh0dHA6Ly9ibG9nLmNzZG4ubmV0L2lkZmF5YS9hcnRpY2xlL2RldGFpbHMvNjc3MDQxNFxuXHQgICAgICAgIOminOiJsuepuumXtFJHQuS4jkhTVihIU0wp55qE6L2s5o2iXG5cdCovXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJ0aHVyL2NvbG9yLWNvbnZlcnQvYmxvYi9tYXN0ZXIvY29udmVyc2lvbnMuanNcblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdFx0cmdiMmhzbDogZnVuY3Rpb24gcmdiMmhzbChyZ2IpIHtcblx0XHRcdHZhciByID0gcmdiWzBdIC8gMjU1LFxuXHRcdFx0XHRnID0gcmdiWzFdIC8gMjU1LFxuXHRcdFx0XHRiID0gcmdiWzJdIC8gMjU1LFxuXHRcdFx0XHRtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcblx0XHRcdFx0bWF4ID0gTWF0aC5tYXgociwgZywgYiksXG5cdFx0XHRcdGRlbHRhID0gbWF4IC0gbWluLFxuXHRcdFx0XHRoLCBzLCBsO1xuXG5cdFx0XHRpZiAobWF4ID09IG1pbilcblx0XHRcdFx0aCA9IDA7XG5cdFx0XHRlbHNlIGlmIChyID09IG1heClcblx0XHRcdFx0aCA9IChnIC0gYikgLyBkZWx0YTtcblx0XHRcdGVsc2UgaWYgKGcgPT0gbWF4KVxuXHRcdFx0XHRoID0gMiArIChiIC0gcikgLyBkZWx0YTtcblx0XHRcdGVsc2UgaWYgKGIgPT0gbWF4KVxuXHRcdFx0XHRoID0gNCArIChyIC0gZykgLyBkZWx0YTtcblxuXHRcdFx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRcdFx0aWYgKGggPCAwKVxuXHRcdFx0XHRoICs9IDM2MDtcblxuXHRcdFx0bCA9IChtaW4gKyBtYXgpIC8gMjtcblxuXHRcdFx0aWYgKG1heCA9PSBtaW4pXG5cdFx0XHRcdHMgPSAwO1xuXHRcdFx0ZWxzZSBpZiAobCA8PSAwLjUpXG5cdFx0XHRcdHMgPSBkZWx0YSAvIChtYXggKyBtaW4pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cblx0XHRcdHJldHVybiBbaCwgcyAqIDEwMCwgbCAqIDEwMF07XG5cdFx0fSxcblx0XHRyZ2IyaHN2OiBmdW5jdGlvbiByZ2IyaHN2KHJnYikge1xuXHRcdFx0dmFyIHIgPSByZ2JbMF0sXG5cdFx0XHRcdGcgPSByZ2JbMV0sXG5cdFx0XHRcdGIgPSByZ2JbMl0sXG5cdFx0XHRcdG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuXHRcdFx0XHRtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcblx0XHRcdFx0ZGVsdGEgPSBtYXggLSBtaW4sXG5cdFx0XHRcdGgsIHMsIHY7XG5cblx0XHRcdGlmIChtYXggPT09IDApXG5cdFx0XHRcdHMgPSAwO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzID0gKGRlbHRhIC8gbWF4ICogMTAwMCkgLyAxMDtcblxuXHRcdFx0aWYgKG1heCA9PSBtaW4pXG5cdFx0XHRcdGggPSAwO1xuXHRcdFx0ZWxzZSBpZiAociA9PSBtYXgpXG5cdFx0XHRcdGggPSAoZyAtIGIpIC8gZGVsdGE7XG5cdFx0XHRlbHNlIGlmIChnID09IG1heClcblx0XHRcdFx0aCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG5cdFx0XHRlbHNlIGlmIChiID09IG1heClcblx0XHRcdFx0aCA9IDQgKyAociAtIGcpIC8gZGVsdGE7XG5cblx0XHRcdGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cblx0XHRcdGlmIChoIDwgMClcblx0XHRcdFx0aCArPSAzNjA7XG5cblx0XHRcdHYgPSAoKG1heCAvIDI1NSkgKiAxMDAwKSAvIDEwO1xuXG5cdFx0XHRyZXR1cm4gW2gsIHMsIHZdO1xuXHRcdH0sXG5cdFx0aHNsMnJnYjogZnVuY3Rpb24gaHNsMnJnYihoc2wpIHtcblx0XHRcdHZhciBoID0gaHNsWzBdIC8gMzYwLFxuXHRcdFx0XHRzID0gaHNsWzFdIC8gMTAwLFxuXHRcdFx0XHRsID0gaHNsWzJdIC8gMTAwLFxuXHRcdFx0XHR0MSwgdDIsIHQzLCByZ2IsIHZhbDtcblxuXHRcdFx0aWYgKHMgPT09IDApIHtcblx0XHRcdFx0dmFsID0gbCAqIDI1NTtcblx0XHRcdFx0cmV0dXJuIFt2YWwsIHZhbCwgdmFsXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGwgPCAwLjUpXG5cdFx0XHRcdHQyID0gbCAqICgxICsgcyk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHQyID0gbCArIHMgLSBsICogcztcblx0XHRcdHQxID0gMiAqIGwgLSB0MjtcblxuXHRcdFx0cmdiID0gWzAsIDAsIDBdO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRcdFx0aWYgKHQzIDwgMCkgdDMrKztcblx0XHRcdFx0aWYgKHQzID4gMSkgdDMtLTtcblxuXHRcdFx0XHRpZiAoNiAqIHQzIDwgMSlcblx0XHRcdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0Mztcblx0XHRcdFx0ZWxzZSBpZiAoMiAqIHQzIDwgMSlcblx0XHRcdFx0XHR2YWwgPSB0Mjtcblx0XHRcdFx0ZWxzZSBpZiAoMyAqIHQzIDwgMilcblx0XHRcdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR2YWwgPSB0MTtcblxuXHRcdFx0XHRyZ2JbaV0gPSB2YWwgKiAyNTU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZ2I7XG5cdFx0fSxcblx0XHRoc2wyaHN2OiBmdW5jdGlvbiBoc2wyaHN2KGhzbCkge1xuXHRcdFx0dmFyIGggPSBoc2xbMF0sXG5cdFx0XHRcdHMgPSBoc2xbMV0gLyAxMDAsXG5cdFx0XHRcdGwgPSBoc2xbMl0gLyAxMDAsXG5cdFx0XHRcdHN2LCB2O1xuXHRcdFx0bCAqPSAyO1xuXHRcdFx0cyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcblx0XHRcdHYgPSAobCArIHMpIC8gMjtcblx0XHRcdHN2ID0gKDIgKiBzKSAvIChsICsgcyk7XG5cdFx0XHRyZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcblx0XHR9LFxuXHRcdGhzdjJyZ2I6IGZ1bmN0aW9uIGhzdjJyZ2IoaHN2KSB7XG5cdFx0XHR2YXIgaCA9IGhzdlswXSAvIDYwXG5cdFx0XHR2YXIgcyA9IGhzdlsxXSAvIDEwMFxuXHRcdFx0dmFyIHYgPSBoc3ZbMl0gLyAxMDBcblx0XHRcdHZhciBoaSA9IE1hdGguZmxvb3IoaCkgJSA2XG5cblx0XHRcdHZhciBmID0gaCAtIE1hdGguZmxvb3IoaClcblx0XHRcdHZhciBwID0gMjU1ICogdiAqICgxIC0gcylcblx0XHRcdHZhciBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSlcblx0XHRcdHZhciB0ID0gMjU1ICogdiAqICgxIC0gKHMgKiAoMSAtIGYpKSlcblxuXHRcdFx0diA9IDI1NSAqIHZcblxuXHRcdFx0c3dpdGNoIChoaSkge1xuXHRcdFx0XHRjYXNlIDA6XG5cdFx0XHRcdFx0cmV0dXJuIFt2LCB0LCBwXVxuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0cmV0dXJuIFtxLCB2LCBwXVxuXHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0cmV0dXJuIFtwLCB2LCB0XVxuXHRcdFx0XHRjYXNlIDM6XG5cdFx0XHRcdFx0cmV0dXJuIFtwLCBxLCB2XVxuXHRcdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdFx0cmV0dXJuIFt0LCBwLCB2XVxuXHRcdFx0XHRjYXNlIDU6XG5cdFx0XHRcdFx0cmV0dXJuIFt2LCBwLCBxXVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aHN2MmhzbDogZnVuY3Rpb24gaHN2MmhzbChoc3YpIHtcblx0XHRcdHZhciBoID0gaHN2WzBdLFxuXHRcdFx0XHRzID0gaHN2WzFdIC8gMTAwLFxuXHRcdFx0XHR2ID0gaHN2WzJdIC8gMTAwLFxuXHRcdFx0XHRzbCwgbDtcblxuXHRcdFx0bCA9ICgyIC0gcykgKiB2O1xuXHRcdFx0c2wgPSBzICogdjtcblx0XHRcdHNsIC89IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRcdFx0bCAvPSAyO1xuXHRcdFx0cmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XG5cdFx0fSxcblx0XHQvLyBodHRwOi8vd3d3LjE0MGJ5dC5lcy9rZXl3b3Jkcy9jb2xvclxuXHRcdHJnYjJoZXg6IGZ1bmN0aW9uKFxuXHRcdFx0YSwgLy8gcmVkLCBhcyBhIG51bWJlciBmcm9tIDAgdG8gMjU1XG5cdFx0XHRiLCAvLyBncmVlbiwgYXMgYSBudW1iZXIgZnJvbSAwIHRvIDI1NVxuXHRcdFx0YyAvLyBibHVlLCBhcyBhIG51bWJlciBmcm9tIDAgdG8gMjU1XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gXCIjXCIgKyAoKDI1NiArIGEgPDwgOCB8IGIpIDw8IDggfCBjKS50b1N0cmluZygxNikuc2xpY2UoMSlcblx0XHR9LFxuXHRcdGhleDJyZ2I6IGZ1bmN0aW9uKFxuXHRcdFx0YSAvLyB0YWtlIGEgXCIjeHh4eHh4XCIgaGV4IHN0cmluZyxcblx0XHQpIHtcblx0XHRcdGEgPSAnMHgnICsgYS5zbGljZSgxKS5yZXBsYWNlKGEubGVuZ3RoID4gNCA/IGEgOiAvLi9nLCAnJCYkJicpIHwgMDtcblx0XHRcdHJldHVybiBbYSA+PiAxNiwgYSA+PiA4ICYgMjU1LCBhICYgMjU1XVxuXHRcdH1cblx0fVxuXG4vKioqLyB9KSxcbi8qIDEyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lypcblx0ICAgICMjIENvbG9yIOWtl+WFuOaVsOaNrlxuXG5cdCAgICDlrZflhbjmlbDmja7mnaXmupAgW0EgbmljZXIgY29sb3IgcGFsZXR0ZSBmb3IgdGhlIHdlYl0oaHR0cDovL2NscnMuY2MvKVxuXHQqL1xuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICAgIC8vIG5hbWUgdmFsdWUgbmljZXJcblx0ICAgIG5hdnk6IHtcblx0ICAgICAgICB2YWx1ZTogJyMwMDAwODAnLFxuXHQgICAgICAgIG5pY2VyOiAnIzAwMUYzRidcblx0ICAgIH0sXG5cdCAgICBibHVlOiB7XG5cdCAgICAgICAgdmFsdWU6ICcjMDAwMGZmJyxcblx0ICAgICAgICBuaWNlcjogJyMwMDc0RDknXG5cdCAgICB9LFxuXHQgICAgYXF1YToge1xuXHQgICAgICAgIHZhbHVlOiAnIzAwZmZmZicsXG5cdCAgICAgICAgbmljZXI6ICcjN0ZEQkZGJ1xuXHQgICAgfSxcblx0ICAgIHRlYWw6IHtcblx0ICAgICAgICB2YWx1ZTogJyMwMDgwODAnLFxuXHQgICAgICAgIG5pY2VyOiAnIzM5Q0NDQydcblx0ICAgIH0sXG5cdCAgICBvbGl2ZToge1xuXHQgICAgICAgIHZhbHVlOiAnIzAwODAwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjM0Q5OTcwJ1xuXHQgICAgfSxcblx0ICAgIGdyZWVuOiB7XG5cdCAgICAgICAgdmFsdWU6ICcjMDA4MDAwJyxcblx0ICAgICAgICBuaWNlcjogJyMyRUNDNDAnXG5cdCAgICB9LFxuXHQgICAgbGltZToge1xuXHQgICAgICAgIHZhbHVlOiAnIzAwZmYwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjMDFGRjcwJ1xuXHQgICAgfSxcblx0ICAgIHllbGxvdzoge1xuXHQgICAgICAgIHZhbHVlOiAnI2ZmZmYwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjRkZEQzAwJ1xuXHQgICAgfSxcblx0ICAgIG9yYW5nZToge1xuXHQgICAgICAgIHZhbHVlOiAnI2ZmYTUwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjRkY4NTFCJ1xuXHQgICAgfSxcblx0ICAgIHJlZDoge1xuXHQgICAgICAgIHZhbHVlOiAnI2ZmMDAwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjRkY0MTM2J1xuXHQgICAgfSxcblx0ICAgIG1hcm9vbjoge1xuXHQgICAgICAgIHZhbHVlOiAnIzgwMDAwMCcsXG5cdCAgICAgICAgbmljZXI6ICcjODUxNDRCJ1xuXHQgICAgfSxcblx0ICAgIGZ1Y2hzaWE6IHtcblx0ICAgICAgICB2YWx1ZTogJyNmZjAwZmYnLFxuXHQgICAgICAgIG5pY2VyOiAnI0YwMTJCRSdcblx0ICAgIH0sXG5cdCAgICBwdXJwbGU6IHtcblx0ICAgICAgICB2YWx1ZTogJyM4MDAwODAnLFxuXHQgICAgICAgIG5pY2VyOiAnI0IxMERDOSdcblx0ICAgIH0sXG5cdCAgICBzaWx2ZXI6IHtcblx0ICAgICAgICB2YWx1ZTogJyNjMGMwYzAnLFxuXHQgICAgICAgIG5pY2VyOiAnI0RERERERCdcblx0ICAgIH0sXG5cdCAgICBncmF5OiB7XG5cdCAgICAgICAgdmFsdWU6ICcjODA4MDgwJyxcblx0ICAgICAgICBuaWNlcjogJyNBQUFBQUEnXG5cdCAgICB9LFxuXHQgICAgYmxhY2s6IHtcblx0ICAgICAgICB2YWx1ZTogJyMwMDAwMDAnLFxuXHQgICAgICAgIG5pY2VyOiAnIzExMTExMSdcblx0ICAgIH0sXG5cdCAgICB3aGl0ZToge1xuXHQgICAgICAgIHZhbHVlOiAnI0ZGRkZGRicsXG5cdCAgICAgICAgbmljZXI6ICcjRkZGRkZGJ1xuXHQgICAgfVxuXHR9XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHQgICAgIyMgVGV4dFxuXG5cdCAgICBodHRwOi8vd3d3LmxpcHN1bS5jb20vXG5cdCovXG5cdHZhciBCYXNpYyA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0dmFyIEhlbHBlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpXG5cblx0ZnVuY3Rpb24gcmFuZ2UoZGVmYXVsdE1pbiwgZGVmYXVsdE1heCwgbWluLCBtYXgpIHtcblx0ICAgIHJldHVybiBtaW4gPT09IHVuZGVmaW5lZCA/IEJhc2ljLm5hdHVyYWwoZGVmYXVsdE1pbiwgZGVmYXVsdE1heCkgOiAvLyAoKVxuXHQgICAgICAgIG1heCA9PT0gdW5kZWZpbmVkID8gbWluIDogLy8gKCBsZW4gKVxuXHQgICAgICAgIEJhc2ljLm5hdHVyYWwocGFyc2VJbnQobWluLCAxMCksIHBhcnNlSW50KG1heCwgMTApKSAvLyAoIG1pbiwgbWF4IClcblx0fVxuXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5q615paH5pys44CCXG5cdCAgICBwYXJhZ3JhcGg6IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG5cdCAgICAgICAgdmFyIGxlbiA9IHJhbmdlKDMsIDcsIG1pbiwgbWF4KVxuXHQgICAgICAgIHZhciByZXN1bHQgPSBbXVxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZW50ZW5jZSgpKVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJyAnKVxuXHQgICAgfSxcblx0ICAgIC8vIFxuXHQgICAgY3BhcmFncmFwaDogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICB2YXIgbGVuID0gcmFuZ2UoMywgNywgbWluLCBtYXgpXG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNzZW50ZW5jZSgpKVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpXG5cdCAgICB9LFxuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq5Y+l5a2Q77yM56ys5LiA5Liq5Y2V6K+N55qE6aaW5a2X5q+N5aSn5YaZ44CCXG5cdCAgICBzZW50ZW5jZTogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICB2YXIgbGVuID0gcmFuZ2UoMTIsIDE4LCBtaW4sIG1heClcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gW11cblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMud29yZCgpKVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gSGVscGVyLmNhcGl0YWxpemUocmVzdWx0LmpvaW4oJyAnKSkgKyAnLidcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrkuK3mloflj6XlrZDjgIJcblx0ICAgIGNzZW50ZW5jZTogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICB2YXIgbGVuID0gcmFuZ2UoMTIsIDE4LCBtaW4sIG1heClcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gW11cblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3dvcmQoKSlcblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpICsgJ+OAgidcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrljZXor43jgIJcblx0ICAgIHdvcmQ6IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG5cdCAgICAgICAgdmFyIGxlbiA9IHJhbmdlKDMsIDEwLCBtaW4sIG1heClcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQgKz0gQmFzaWMuY2hhcmFjdGVyKCdsb3dlcicpXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrmiJblpJrkuKrmsYnlrZfjgIJcblx0ICAgIGN3b3JkOiBmdW5jdGlvbihwb29sLCBtaW4sIG1heCkge1xuXHQgICAgICAgIC8vIOacgOW4uOeUqOeahCA1MDAg5Liq5rGJ5a2XIGh0dHA6Ly9iYWlrZS5iYWlkdS5jb20vdmlldy81Njg0MzYuaHRtXG5cdCAgICAgICAgdmFyIERJQ1RfS0FOWkkgPSAn55qE5LiA5piv5Zyo5LiN5LqG5pyJ5ZKM5Lq66L+Z5Lit5aSn5Li65LiK5Liq5Zu95oiR5Lul6KaB5LuW5pe25p2l55So5Lus55Sf5Yiw5L2c5Zyw5LqO5Ye65bCx5YiG5a+55oiQ5Lya5Y+v5Li75Y+R5bm05Yqo5ZCM5bel5Lmf6IO95LiL6L+H5a2Q6K+05Lqn56eN6Z2i6ICM5pa55ZCO5aSa5a6a6KGM5a2m5rOV5omA5rCR5b6X57uP5Y2B5LiJ5LmL6L+b552A562J6YOo5bqm5a6255S15Yqb6YeM5aaC5rC05YyW6auY6Ieq5LqM55CG6LW35bCP54mp546w5a6e5Yqg6YeP6YO95Lik5L2T5Yi25py65b2T5L2/54K55LuO5Lia5pys5Y675oqK5oCn5aW95bqU5byA5a6D5ZCI6L+Y5Zug55Sx5YW25Lqb54S25YmN5aSW5aSp5pS/5Zub5pel6YKj56S+5LmJ5LqL5bmz5b2i55u45YWo6KGo6Ze05qC35LiO5YWz5ZCE6YeN5paw57q/5YaF5pWw5q2j5b+D5Y+N5L2g5piO55yL5Y6f5Y+I5LmI5Yip5q+U5oiW5L2G6LSo5rCU56ys5ZCR6YGT5ZG95q2k5Y+Y5p2h5Y+q5rKh57uT6Kej6Zeu5oSP5bu65pyI5YWs5peg57O75Yab5b6I5oOF6ICF5pyA56uL5Luj5oOz5bey6YCa5bm25o+Q55u06aKY5YWa56iL5bGV5LqU5p6c5paZ6LGh5ZGY6Z2p5L2N5YWl5bi45paH5oC75qyh5ZOB5byP5rS76K6+5Y+K566h54m55Lu26ZW/5rGC6ICB5aS05Z+66LWE6L655rWB6Lev57qn5bCR5Zu+5bGx57uf5o6l55+l6L6D5bCG57uE6KeB6K6h5Yir5aW55omL6KeS5pyf5qC56K666L+Q5Yac5oyH5Yeg5Lmd5Yy65by65pS+5Yaz6KW/6KKr5bmy5YGa5b+F5oiY5YWI5Zue5YiZ5Lu75Y+W5o2u5aSE6Zif5Y2X57uZ6Imy5YWJ6Zeo5Y2z5L+d5rK75YyX6YCg55m+6KeE54Ot6aKG5LiD5rW35Y+j5Lic5a+85Zmo5Y6L5b+X5LiW6YeR5aKe5LqJ5rWO6Zi25rK55oCd5pyv5p6B5Lqk5Y+X6IGU5LuA6K6k5YWt5YWx5p2D5pS26K+B5pS55riF5bex576O5YaN6YeH6L2s5pu05Y2V6aOO5YiH5omT55m95pWZ6YCf6Iqx5bim5a6J5Zy66Lqr6L2m5L6L55yf5Yqh5YW35LiH5q+P55uu6Iez6L6+6LWw56ev56S66K6u5aOw5oql5paX5a6M57G75YWr56a75Y2O5ZCN56Gu5omN56eR5byg5L+h6ams6IqC6K+d57Gz5pW056m65YWD5Ya15LuK6ZuG5rip5Lyg5Zyf6K645q2l576k5bm/55+z6K6w6ZyA5q6156CU55WM5ouJ5p6X5b6L5Y+r5LiU56m26KeC6LaK57uH6KOF5b2x566X5L2O5oyB6Z+z5LyX5Lmm5biD5aSN5a655YS/6aG76ZmF5ZWG6Z2e6aqM6L+e5pat5rex6Zq+6L+R55+/5Y2D5ZGo5aeU57Sg5oqA5aSH5Y2K5Yqe6Z2S55yB5YiX5Lmg5ZON57qm5pSv6Iis5Y+y5oSf5Yqz5L6/5Zui5b6A6YW45Y6G5biC5YWL5L2V6Zmk5raI5p6E5bqc56ew5aSq5YeG57K+5YC85Y+3546H5peP57u05YiS6YCJ5qCH5YaZ5a2Y5YCZ5q+b5Lqy5b+r5pWI5pav6Zmi5p+l5rGf5Z6L55y8546L5oyJ5qC85YW75piT572u5rS+5bGC54mH5aeL5Y205LiT54q26IKy5Y6C5Lqs6K+G6YCC5bGe5ZyG5YyF54Gr5L2P6LCD5ruh5Y6/5bGA54Wn5Y+C57qi57uG5byV5ZCs6K+l6ZOB5Lu35Lil6b6Z6aOeJ1xuXG5cdCAgICAgICAgdmFyIGxlblxuXHQgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgICBjYXNlIDA6IC8vICgpXG5cdCAgICAgICAgICAgICAgICBwb29sID0gRElDVF9LQU5aSVxuXHQgICAgICAgICAgICAgICAgbGVuID0gMVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAxOiAvLyAoIHBvb2wgKVxuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVuID0gMVxuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyAoIGxlbmd0aCApXG5cdCAgICAgICAgICAgICAgICAgICAgbGVuID0gcG9vbFxuXHQgICAgICAgICAgICAgICAgICAgIHBvb2wgPSBESUNUX0tBTlpJXG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICBjYXNlIDI6XG5cdCAgICAgICAgICAgICAgICAvLyAoIHBvb2wsIGxlbmd0aCApXG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICBsZW4gPSBtaW5cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gKCBtaW4sIG1heCApXG5cdCAgICAgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5uYXR1cmFsKHBvb2wsIG1pbilcblx0ICAgICAgICAgICAgICAgICAgICBwb29sID0gRElDVF9LQU5aSVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAzOlxuXHQgICAgICAgICAgICAgICAgbGVuID0gdGhpcy5uYXR1cmFsKG1pbiwgbWF4KVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgcmVzdWx0ID0gJydcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICAgIHJlc3VsdCArPSBwb29sLmNoYXJBdCh0aGlzLm5hdHVyYWwoMCwgcG9vbC5sZW5ndGggLSAxKSlcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIC8vIOmaj+acuueUn+aIkOS4gOWPpeagh+mimO+8jOWFtuS4reavj+S4quWNleivjeeahOmmluWtl+avjeWkp+WGmeOAglxuXHQgICAgdGl0bGU6IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG5cdCAgICAgICAgdmFyIGxlbiA9IHJhbmdlKDMsIDcsIG1pbiwgbWF4KVxuXHQgICAgICAgIHZhciByZXN1bHQgPSBbXVxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jYXBpdGFsaXplKHRoaXMud29yZCgpKSlcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcgJylcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDlj6XkuK3mlofmoIfpopjjgIJcblx0ICAgIGN0aXRsZTogZnVuY3Rpb24obWluLCBtYXgpIHtcblx0ICAgICAgICB2YXIgbGVuID0gcmFuZ2UoMywgNywgbWluLCBtYXgpXG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmN3b3JkKCkpXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHQuam9pbignJylcblx0ICAgIH1cblx0fVxuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0ICAgICMjIEhlbHBlcnNcblx0Ki9cblxuXHR2YXIgVXRpbCA9IF9fd2VicGFja19yZXF1aXJlX18oMylcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0XHQvLyDmiorlrZfnrKbkuLLnmoTnrKzkuIDkuKrlrZfmr43ovazmjaLkuLrlpKflhpnjgIJcblx0XHRjYXBpdGFsaXplOiBmdW5jdGlvbih3b3JkKSB7XG5cdFx0XHRyZXR1cm4gKHdvcmQgKyAnJykuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyAod29yZCArICcnKS5zdWJzdHIoMSlcblx0XHR9LFxuXHRcdC8vIOaKiuWtl+espuS4sui9rOaNouS4uuWkp+WGmeOAglxuXHRcdHVwcGVyOiBmdW5jdGlvbihzdHIpIHtcblx0XHRcdHJldHVybiAoc3RyICsgJycpLnRvVXBwZXJDYXNlKClcblx0XHR9LFxuXHRcdC8vIOaKiuWtl+espuS4sui9rOaNouS4uuWwj+WGmeOAglxuXHRcdGxvd2VyOiBmdW5jdGlvbihzdHIpIHtcblx0XHRcdHJldHVybiAoc3RyICsgJycpLnRvTG93ZXJDYXNlKClcblx0XHR9LFxuXHRcdC8vIOS7juaVsOe7hOS4remaj+acuumAieWPluS4gOS4quWFg+e0oO+8jOW5tui/lOWbnuOAglxuXHRcdHBpY2s6IGZ1bmN0aW9uIHBpY2soYXJyLCBtaW4sIG1heCkge1xuXHRcdFx0Ly8gcGljayggaXRlbTEsIGl0ZW0yIC4uLiApXG5cdFx0XHRpZiAoIVV0aWwuaXNBcnJheShhcnIpKSB7XG5cdFx0XHRcdGFyciA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuXHRcdFx0XHRtaW4gPSAxXG5cdFx0XHRcdG1heCA9IDFcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHBpY2soIFsgaXRlbTEsIGl0ZW0yIC4uLiBdIClcblx0XHRcdFx0aWYgKG1pbiA9PT0gdW5kZWZpbmVkKSBtaW4gPSAxXG5cblx0XHRcdFx0Ly8gcGljayggWyBpdGVtMSwgaXRlbTIgLi4uIF0sIGNvdW50IClcblx0XHRcdFx0aWYgKG1heCA9PT0gdW5kZWZpbmVkKSBtYXggPSBtaW5cblx0XHRcdH1cblxuXHRcdFx0aWYgKG1pbiA9PT0gMSAmJiBtYXggPT09IDEpIHJldHVybiBhcnJbdGhpcy5uYXR1cmFsKDAsIGFyci5sZW5ndGggLSAxKV1cblxuXHRcdFx0Ly8gcGljayggWyBpdGVtMSwgaXRlbTIgLi4uIF0sIG1pbiwgbWF4IClcblx0XHRcdHJldHVybiB0aGlzLnNodWZmbGUoYXJyLCBtaW4sIG1heClcblxuXHRcdFx0Ly8g6YCa6L+H5Y+C5pWw5Liq5pWw5Yik5pat5pa55rOV562+5ZCN77yM5omp5bGV5oCn5aSq5beu77yBIzkwXG5cdFx0XHQvLyBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdC8vIFx0Y2FzZSAxOlxuXHRcdFx0Ly8gXHRcdC8vIHBpY2soIFsgaXRlbTEsIGl0ZW0yIC4uLiBdIClcblx0XHRcdC8vIFx0XHRyZXR1cm4gYXJyW3RoaXMubmF0dXJhbCgwLCBhcnIubGVuZ3RoIC0gMSldXG5cdFx0XHQvLyBcdGNhc2UgMjpcblx0XHRcdC8vIFx0XHQvLyBwaWNrKCBbIGl0ZW0xLCBpdGVtMiAuLi4gXSwgY291bnQgKVxuXHRcdFx0Ly8gXHRcdG1heCA9IG1pblxuXHRcdFx0Ly8gXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Ly8gXHRjYXNlIDM6XG5cdFx0XHQvLyBcdFx0Ly8gcGljayggWyBpdGVtMSwgaXRlbTIgLi4uIF0sIG1pbiwgbWF4IClcblx0XHRcdC8vIFx0XHRyZXR1cm4gdGhpcy5zaHVmZmxlKGFyciwgbWluLCBtYXgpXG5cdFx0XHQvLyB9XG5cdFx0fSxcblx0XHQvKlxuXHRcdCAgICDmiZPkubHmlbDnu4TkuK3lhYPntKDnmoTpobrluo/vvIzlubbov5Tlm57jgIJcblx0XHQgICAgR2l2ZW4gYW4gYXJyYXksIHNjcmFtYmxlIHRoZSBvcmRlciBhbmQgcmV0dXJuIGl0LlxuXG5cdFx0ICAgIOWFtuS7lueahOWunueOsOaAnei3r++8mlxuXHRcdCAgICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc2xpYnMvd2lraS9KYXZhc2NyaXB0VGlwc1xuXHRcdCAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNvcnQoZnVuY3Rpb24oKSB7XG5cdFx0ICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgLSAwLjVcblx0XHQgICAgICAgIH0pXG5cdFx0Ki9cblx0XHRzaHVmZmxlOiBmdW5jdGlvbiBzaHVmZmxlKGFyciwgbWluLCBtYXgpIHtcblx0XHRcdGFyciA9IGFyciB8fCBbXVxuXHRcdFx0dmFyIG9sZCA9IGFyci5zbGljZSgwKSxcblx0XHRcdFx0cmVzdWx0ID0gW10sXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gb2xkLmxlbmd0aDtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aW5kZXggPSB0aGlzLm5hdHVyYWwoMCwgb2xkLmxlbmd0aCAtIDEpXG5cdFx0XHRcdHJlc3VsdC5wdXNoKG9sZFtpbmRleF0pXG5cdFx0XHRcdG9sZC5zcGxpY2UoaW5kZXgsIDEpXG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdFxuXHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0bWF4ID0gbWluXG5cdFx0XHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRtaW4gPSBwYXJzZUludChtaW4sIDEwKVxuXHRcdFx0XHRcdG1heCA9IHBhcnNlSW50KG1heCwgMTApXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdC5zbGljZSgwLCB0aGlzLm5hdHVyYWwobWluLCBtYXgpKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Lypcblx0XHQgICAgKiBSYW5kb20ub3JkZXIoaXRlbSwgaXRlbSlcblx0XHQgICAgKiBSYW5kb20ub3JkZXIoW2l0ZW0sIGl0ZW0gLi4uXSlcblxuXHRcdCAgICDpobrluo/ojrflj5bmlbDnu4TkuK3nmoTlhYPntKBcblxuXHRcdCAgICBbSlNPTuWvvOWFpeaVsOe7hOaUr+aMgeaVsOe7hOaVsOaNruW9leWFpV0oaHR0cHM6Ly9naXRodWIuY29tL3RoeC9SQVAvaXNzdWVzLzIyKVxuXG5cdFx0ICAgIOS4jeaUr+aMgeWNleeLrOiwg+eUqO+8gVxuXHRcdCovXG5cdFx0b3JkZXI6IGZ1bmN0aW9uIG9yZGVyKGFycmF5KSB7XG5cdFx0XHRvcmRlci5jYWNoZSA9IG9yZGVyLmNhY2hlIHx8IHt9XG5cblx0XHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgYXJyYXkgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMClcblxuXHRcdFx0Ly8gb3B0aW9ucy5jb250ZXh0LnBhdGgvdGVtcGxhdGVQYXRoXG5cdFx0XHR2YXIgb3B0aW9ucyA9IG9yZGVyLm9wdGlvbnNcblx0XHRcdHZhciB0ZW1wbGF0ZVBhdGggPSBvcHRpb25zLmNvbnRleHQudGVtcGxhdGVQYXRoLmpvaW4oJy4nKVxuXG5cdFx0XHR2YXIgY2FjaGUgPSAoXG5cdFx0XHRcdG9yZGVyLmNhY2hlW3RlbXBsYXRlUGF0aF0gPSBvcmRlci5jYWNoZVt0ZW1wbGF0ZVBhdGhdIHx8IHtcblx0XHRcdFx0XHRpbmRleDogMCxcblx0XHRcdFx0XHRhcnJheTogYXJyYXlcblx0XHRcdFx0fVxuXHRcdFx0KVxuXG5cdFx0XHRyZXR1cm4gY2FjaGUuYXJyYXlbY2FjaGUuaW5kZXgrKyAlIGNhY2hlLmFycmF5Lmxlbmd0aF1cblx0XHR9XG5cdH1cblxuLyoqKi8gfSksXG4vKiAxNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXG5cdCAgICAjIyBOYW1lXG5cblx0ICAgIFtCZXlvbmQgdGhlIFRvcCAxMDAwIE5hbWVzXShodHRwOi8vd3d3LnNzYS5nb3Yvb2FjdC9iYWJ5bmFtZXMvbGltaXRzLmh0bWwpXG5cdCovXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHRcdC8vIOmaj+acuueUn+aIkOS4gOS4quW4uOingeeahOiLseaWh+WQjeOAglxuXHRcdGZpcnN0OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBuYW1lcyA9IFtcblx0XHRcdFx0Ly8gbWFsZVxuXHRcdFx0XHRcIkphbWVzXCIsIFwiSm9oblwiLCBcIlJvYmVydFwiLCBcIk1pY2hhZWxcIiwgXCJXaWxsaWFtXCIsXG5cdFx0XHRcdFwiRGF2aWRcIiwgXCJSaWNoYXJkXCIsIFwiQ2hhcmxlc1wiLCBcIkpvc2VwaFwiLCBcIlRob21hc1wiLFxuXHRcdFx0XHRcIkNocmlzdG9waGVyXCIsIFwiRGFuaWVsXCIsIFwiUGF1bFwiLCBcIk1hcmtcIiwgXCJEb25hbGRcIixcblx0XHRcdFx0XCJHZW9yZ2VcIiwgXCJLZW5uZXRoXCIsIFwiU3RldmVuXCIsIFwiRWR3YXJkXCIsIFwiQnJpYW5cIixcblx0XHRcdFx0XCJSb25hbGRcIiwgXCJBbnRob255XCIsIFwiS2V2aW5cIiwgXCJKYXNvblwiLCBcIk1hdHRoZXdcIixcblx0XHRcdFx0XCJHYXJ5XCIsIFwiVGltb3RoeVwiLCBcIkpvc2VcIiwgXCJMYXJyeVwiLCBcIkplZmZyZXlcIixcblx0XHRcdFx0XCJGcmFua1wiLCBcIlNjb3R0XCIsIFwiRXJpY1wiXG5cdFx0XHRdLmNvbmNhdChbXG5cdFx0XHRcdC8vIGZlbWFsZVxuXHRcdFx0XHRcIk1hcnlcIiwgXCJQYXRyaWNpYVwiLCBcIkxpbmRhXCIsIFwiQmFyYmFyYVwiLCBcIkVsaXphYmV0aFwiLFxuXHRcdFx0XHRcIkplbm5pZmVyXCIsIFwiTWFyaWFcIiwgXCJTdXNhblwiLCBcIk1hcmdhcmV0XCIsIFwiRG9yb3RoeVwiLFxuXHRcdFx0XHRcIkxpc2FcIiwgXCJOYW5jeVwiLCBcIkthcmVuXCIsIFwiQmV0dHlcIiwgXCJIZWxlblwiLFxuXHRcdFx0XHRcIlNhbmRyYVwiLCBcIkRvbm5hXCIsIFwiQ2Fyb2xcIiwgXCJSdXRoXCIsIFwiU2hhcm9uXCIsXG5cdFx0XHRcdFwiTWljaGVsbGVcIiwgXCJMYXVyYVwiLCBcIlNhcmFoXCIsIFwiS2ltYmVybHlcIiwgXCJEZWJvcmFoXCIsXG5cdFx0XHRcdFwiSmVzc2ljYVwiLCBcIlNoaXJsZXlcIiwgXCJDeW50aGlhXCIsIFwiQW5nZWxhXCIsIFwiTWVsaXNzYVwiLFxuXHRcdFx0XHRcIkJyZW5kYVwiLCBcIkFteVwiLCBcIkFubmFcIlxuXHRcdFx0XSlcblx0XHRcdHJldHVybiB0aGlzLnBpY2sobmFtZXMpXG5cdFx0XHRcdC8vIG9yIHRoaXMuY2FwaXRhbGl6ZSh0aGlzLndvcmQoKSlcblx0XHR9LFxuXHRcdC8vIOmaj+acuueUn+aIkOS4gOS4quW4uOingeeahOiLseaWh+Wnk+OAglxuXHRcdGxhc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG5hbWVzID0gW1xuXHRcdFx0XHRcIlNtaXRoXCIsIFwiSm9obnNvblwiLCBcIldpbGxpYW1zXCIsIFwiQnJvd25cIiwgXCJKb25lc1wiLFxuXHRcdFx0XHRcIk1pbGxlclwiLCBcIkRhdmlzXCIsIFwiR2FyY2lhXCIsIFwiUm9kcmlndWV6XCIsIFwiV2lsc29uXCIsXG5cdFx0XHRcdFwiTWFydGluZXpcIiwgXCJBbmRlcnNvblwiLCBcIlRheWxvclwiLCBcIlRob21hc1wiLCBcIkhlcm5hbmRlelwiLFxuXHRcdFx0XHRcIk1vb3JlXCIsIFwiTWFydGluXCIsIFwiSmFja3NvblwiLCBcIlRob21wc29uXCIsIFwiV2hpdGVcIixcblx0XHRcdFx0XCJMb3BlelwiLCBcIkxlZVwiLCBcIkdvbnphbGV6XCIsIFwiSGFycmlzXCIsIFwiQ2xhcmtcIixcblx0XHRcdFx0XCJMZXdpc1wiLCBcIlJvYmluc29uXCIsIFwiV2Fsa2VyXCIsIFwiUGVyZXpcIiwgXCJIYWxsXCIsXG5cdFx0XHRcdFwiWW91bmdcIiwgXCJBbGxlblwiXG5cdFx0XHRdXG5cdFx0XHRyZXR1cm4gdGhpcy5waWNrKG5hbWVzKVxuXHRcdFx0XHQvLyBvciB0aGlzLmNhcGl0YWxpemUodGhpcy53b3JkKCkpXG5cdFx0fSxcblx0XHQvLyDpmo/mnLrnlJ/miJDkuIDkuKrluLjop4HnmoToi7Hmloflp5PlkI3jgIJcblx0XHRuYW1lOiBmdW5jdGlvbihtaWRkbGUpIHtcblx0XHRcdHJldHVybiB0aGlzLmZpcnN0KCkgKyAnICcgK1xuXHRcdFx0XHQobWlkZGxlID8gdGhpcy5maXJzdCgpICsgJyAnIDogJycpICtcblx0XHRcdFx0dGhpcy5sYXN0KClcblx0XHR9LFxuXHRcdC8qXG5cdFx0ICAgIOmaj+acuueUn+aIkOS4gOS4quW4uOingeeahOS4reaWh+Wnk+OAglxuXHRcdCAgICBb5LiW55WM5bi455So5aeT5rCP5o6S6KGMXShodHRwOi8vYmFpa2UuYmFpZHUuY29tL3ZpZXcvMTcxOTExNS5odG0pXG5cdFx0ICAgIFvnjoTmtL7nvZEgLSDnvZHnu5zlsI/or7TliJvkvZzovoXliqnlubPlj7BdKGh0dHA6Ly94dWFucGFpLnNpbmFhcHAuY29tLylcblx0XHQgKi9cblx0XHRjZmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG5hbWVzID0gKFxuXHRcdFx0XHQn546LIOadjiDlvKAg5YiYIOmZiCDmnagg6LW1IOm7hCDlkagg5ZC0ICcgK1xuXHRcdFx0XHQn5b6QIOWtmSDog6Eg5pyxIOmrmCDmnpcg5L2VIOmDrSDpqawg572XICcgK1xuXHRcdFx0XHQn5qKBIOWuiyDpg5Eg6LCiIOmfqSDllJAg5YavIOS6jiDokaMg6JCnICcgK1xuXHRcdFx0XHQn56iLIOabuSDoooEg6YKTIOiuuCDlgoUg5rKIIOabviDlva0g5ZCVICcgK1xuXHRcdFx0XHQn6IuPIOWNoiDokosg6JShIOi0viDkuIEg6a2PIOiWmyDlj7Yg6ZiOICcgK1xuXHRcdFx0XHQn5L2ZIOa9mCDmnZwg5oi0IOWkjyDplLog5rGqIOeUsCDku7sg5aecICcgK1xuXHRcdFx0XHQn6IyDIOaWuSDnn7Mg5aeaIOiwrSDlu5Yg6YK5IOeGiiDph5Eg6ZmGICcgK1xuXHRcdFx0XHQn6YOdIOWtlCDnmb0g5bSUIOW6tyDmr5sg6YKxIOenpiDmsZ8g5Y+yICcgK1xuXHRcdFx0XHQn6aG+IOS+ryDpgrUg5a2fIOm+mSDkuIcg5q61IOmbtyDpkrEg5rGkICcgK1xuXHRcdFx0XHQn5bC5IOm7jiDmmJMg5bi4IOatpiDkuZQg6LS6IOi1liDpvpog5paHJ1xuXHRcdFx0KS5zcGxpdCgnICcpXG5cdFx0XHRyZXR1cm4gdGhpcy5waWNrKG5hbWVzKVxuXHRcdH0sXG5cdFx0Lypcblx0XHQgICAg6ZqP5py655Sf5oiQ5LiA5Liq5bi46KeB55qE5Lit5paH5ZCN44CCXG5cdFx0ICAgIFvkuK3lm73mnIDluLjop4HlkI3lrZfliY01MOWQjV/kuInkuZ3nrpflkb3nvZFdKGh0dHA6Ly93d3cubmFtZTk5OS5uZXQveGluZ21pbmcveGluZ3NoaS8yMDEzMTAwNC80OC5odG1sKVxuXHRcdCAqL1xuXHRcdGNsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBuYW1lcyA9IChcblx0XHRcdFx0J+S8nyDoirMg5aicIOengOiLsSDmlY8g6Z2ZIOS4vSDlvLog56OKIOWGmyAnICtcblx0XHRcdFx0J+a0iyDli4cg6ImzIOadsCDlqJ8g5rabIOaYjiDotoUg56eA5YWwIOmcniAnICtcblx0XHRcdFx0J+W5syDliJog5qGC6IuxJ1xuXHRcdFx0KS5zcGxpdCgnICcpXG5cdFx0XHRyZXR1cm4gdGhpcy5waWNrKG5hbWVzKVxuXHRcdH0sXG5cdFx0Ly8g6ZqP5py655Sf5oiQ5LiA5Liq5bi46KeB55qE5Lit5paH5aeT5ZCN44CCXG5cdFx0Y25hbWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY2ZpcnN0KCkgKyB0aGlzLmNsYXN0KClcblx0XHR9XG5cdH1cblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8qXG5cdCAgICAjIyBXZWJcblx0Ki9cblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdCAgICAvKlxuXHQgICAgICAgIOmaj+acuueUn+aIkOS4gOS4qiBVUkzjgIJcblxuXHQgICAgICAgIFtVUkwg6KeE6IyDXShodHRwOi8vd3d3LnczLm9yZy9BZGRyZXNzaW5nL1VSTC91cmwtc3BlYy50eHQpXG5cdCAgICAgICAgICAgIGh0dHAgICAgICAgICAgICAgICAgICAgIEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCBcblx0ICAgICAgICAgICAgZnRwICAgICAgICAgICAgICAgICAgICAgRmlsZSBUcmFuc2ZlciBwcm90b2NvbCBcblx0ICAgICAgICAgICAgZ29waGVyICAgICAgICAgICAgICAgICAgVGhlIEdvcGhlciBwcm90b2NvbCBcblx0ICAgICAgICAgICAgbWFpbHRvICAgICAgICAgICAgICAgICAgRWxlY3Ryb25pYyBtYWlsIGFkZHJlc3MgXG5cdCAgICAgICAgICAgIG1pZCAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgaWRlbnRpZmllcnMgZm9yIGVsZWN0cm9uaWMgbWFpbCBcblx0ICAgICAgICAgICAgY2lkICAgICAgICAgICAgICAgICAgICAgQ29udGVudCBpZGVudGlmaWVycyBmb3IgTUlNRSBib2R5IHBhcnQgXG5cdCAgICAgICAgICAgIG5ld3MgICAgICAgICAgICAgICAgICAgIFVzZW5ldCBuZXdzIFxuXHQgICAgICAgICAgICBubnRwICAgICAgICAgICAgICAgICAgICBVc2VuZXQgbmV3cyBmb3IgbG9jYWwgTk5UUCBhY2Nlc3Mgb25seSBcblx0ICAgICAgICAgICAgcHJvc3Blcm8gICAgICAgICAgICAgICAgQWNjZXNzIHVzaW5nIHRoZSBwcm9zcGVybyBwcm90b2NvbHMgXG5cdCAgICAgICAgICAgIHRlbG5ldCBybG9naW4gdG4zMjcwICAgIFJlZmVyZW5jZSB0byBpbnRlcmFjdGl2ZSBzZXNzaW9uc1xuXHQgICAgICAgICAgICB3YWlzICAgICAgICAgICAgICAgICAgICBXaWRlIEFyZWEgSW5mb3JtYXRpb24gU2VydmVycyBcblx0ICAgICovXG5cdCAgICB1cmw6IGZ1bmN0aW9uKHByb3RvY29sLCBob3N0KSB7XG5cdCAgICAgICAgcmV0dXJuIChwcm90b2NvbCB8fCB0aGlzLnByb3RvY29sKCkpICsgJzovLycgKyAvLyBwcm90b2NvbD9cblx0ICAgICAgICAgICAgKGhvc3QgfHwgdGhpcy5kb21haW4oKSkgKyAvLyBob3N0P1xuXHQgICAgICAgICAgICAnLycgKyB0aGlzLndvcmQoKVxuXHQgICAgfSxcblx0ICAgIC8vIOmaj+acuueUn+aIkOS4gOS4qiBVUkwg5Y2P6K6u44CCXG5cdCAgICBwcm90b2NvbDogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucGljayhcblx0ICAgICAgICAgICAgLy8g5Y2P6K6u57CHXG5cdCAgICAgICAgICAgICdodHRwIGZ0cCBnb3BoZXIgbWFpbHRvIG1pZCBjaWQgbmV3cyBubnRwIHByb3NwZXJvIHRlbG5ldCBybG9naW4gdG4zMjcwIHdhaXMnLnNwbGl0KCcgJylcblx0ICAgICAgICApXG5cdCAgICB9LFxuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq5Z+f5ZCN44CCXG5cdCAgICBkb21haW46IGZ1bmN0aW9uKHRsZCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLndvcmQoKSArICcuJyArICh0bGQgfHwgdGhpcy50bGQoKSlcblx0ICAgIH0sXG5cdCAgICAvKlxuXHQgICAgICAgIOmaj+acuueUn+aIkOS4gOS4qumhtue6p+Wfn+WQjeOAglxuXHQgICAgICAgIOWbvemZhemhtue6p+Wfn+WQjSBpbnRlcm5hdGlvbmFsIHRvcC1sZXZlbCBkb21haW4tbmFtZXMsIGlUTERzXG5cdCAgICAgICAg5Zu95a626aG257qn5Z+f5ZCNIG5hdGlvbmFsIHRvcC1sZXZlbCBkb21haW5uYW1lcywgblRMRHNcblx0ICAgICAgICBb5Z+f5ZCN5ZCO57yA5aSn5YWoXShodHRwOi8vd3d3LjE2M25zLmNvbS96aXh1bi9wb3N0LzQ0MTcuaHRtbClcblx0ICAgICovXG5cdCAgICB0bGQ6IGZ1bmN0aW9uKCkgeyAvLyBUb3AgTGV2ZWwgRG9tYWluXG5cdCAgICAgICAgcmV0dXJuIHRoaXMucGljayhcblx0ICAgICAgICAgICAgKFxuXHQgICAgICAgICAgICAgICAgLy8g5Z+f5ZCN5ZCO57yAXG5cdCAgICAgICAgICAgICAgICAnY29tIG5ldCBvcmcgZWR1IGdvdiBpbnQgbWlsIGNuICcgK1xuXHQgICAgICAgICAgICAgICAgLy8g5Zu95YaF5Z+f5ZCNXG5cdCAgICAgICAgICAgICAgICAnY29tLmNuIG5ldC5jbiBnb3YuY24gb3JnLmNuICcgK1xuXHQgICAgICAgICAgICAgICAgLy8g5Lit5paH5Zu95YaF5Z+f5ZCNXG5cdCAgICAgICAgICAgICAgICAn5Lit5Zu9IOS4reWbveS6kuiBlC7lhazlj7gg5Lit5Zu95LqS6IGULue9kee7nCAnICtcblx0ICAgICAgICAgICAgICAgIC8vIOaWsOWbvemZheWfn+WQjVxuXHQgICAgICAgICAgICAgICAgJ3RlbCBiaXogY2MgdHYgaW5mbyBuYW1lIGhrIG1vYmkgYXNpYSBjZCB0cmF2ZWwgcHJvIG11c2V1bSBjb29wIGFlcm8gJyArXG5cdCAgICAgICAgICAgICAgICAvLyDkuJbnlYzlkITlm73ln5/lkI3lkI7nvIBcblx0ICAgICAgICAgICAgICAgICdhZCBhZSBhZiBhZyBhaSBhbCBhbSBhbiBhbyBhcSBhciBhcyBhdCBhdSBhdyBheiBiYSBiYiBiZCBiZSBiZiBiZyBiaCBiaSBiaiBibSBibiBibyBiciBicyBidCBidiBidyBieSBieiBjYSBjYyBjZiBjZyBjaCBjaSBjayBjbCBjbSBjbiBjbyBjcSBjciBjdSBjdiBjeCBjeSBjeiBkZSBkaiBkayBkbSBkbyBkeiBlYyBlZSBlZyBlaCBlcyBldCBldiBmaSBmaiBmayBmbSBmbyBmciBnYSBnYiBnZCBnZSBnZiBnaCBnaSBnbCBnbSBnbiBncCBnciBndCBndSBndyBneSBoayBobSBobiBociBodCBodSBpZCBpZSBpbCBpbiBpbyBpcSBpciBpcyBpdCBqbSBqbyBqcCBrZSBrZyBraCBraSBrbSBrbiBrcCBrciBrdyBreSBreiBsYSBsYiBsYyBsaSBsayBsciBscyBsdCBsdSBsdiBseSBtYSBtYyBtZCBtZyBtaCBtbCBtbSBtbiBtbyBtcCBtcSBtciBtcyBtdCBtdiBtdyBteCBteSBteiBuYSBuYyBuZSBuZiBuZyBuaSBubCBubyBucCBuciBudCBudSBueiBvbSBxYSBwYSBwZSBwZiBwZyBwaCBwayBwbCBwbSBwbiBwciBwdCBwdyBweSByZSBybyBydSBydyBzYSBzYiBzYyBzZCBzZSBzZyBzaCBzaSBzaiBzayBzbCBzbSBzbiBzbyBzciBzdCBzdSBzeSBzeiB0YyB0ZCB0ZiB0ZyB0aCB0aiB0ayB0bSB0biB0byB0cCB0ciB0dCB0diB0dyB0eiB1YSB1ZyB1ayB1cyB1eSB2YSB2YyB2ZSB2ZyB2biB2dSB3ZiB3cyB5ZSB5dSB6YSB6bSB6ciB6dydcblx0ICAgICAgICAgICAgKS5zcGxpdCgnICcpXG5cdCAgICAgICAgKVxuXHQgICAgfSxcblx0ICAgIC8vIOmaj+acuueUn+aIkOS4gOS4qumCruS7tuWcsOWdgOOAglxuXHQgICAgZW1haWw6IGZ1bmN0aW9uKGRvbWFpbikge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlcignbG93ZXInKSArICcuJyArIHRoaXMud29yZCgpICsgJ0AnICtcblx0ICAgICAgICAgICAgKFxuXHQgICAgICAgICAgICAgICAgZG9tYWluIHx8XG5cdCAgICAgICAgICAgICAgICAodGhpcy53b3JkKCkgKyAnLicgKyB0aGlzLnRsZCgpKVxuXHQgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLmNoYXJhY3RlcignbG93ZXInKSArICcuJyArIHRoaXMubGFzdCgpLnRvTG93ZXJDYXNlKCkgKyAnQCcgKyB0aGlzLmxhc3QoKS50b0xvd2VyQ2FzZSgpICsgJy4nICsgdGhpcy50bGQoKVxuXHQgICAgICAgICAgICAvLyByZXR1cm4gdGhpcy53b3JkKCkgKyAnQCcgKyAoZG9tYWluIHx8IHRoaXMuZG9tYWluKCkpXG5cdCAgICB9LFxuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5LiqIElQIOWcsOWdgOOAglxuXHQgICAgaXA6IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLm5hdHVyYWwoMCwgMjU1KSArICcuJyArXG5cdCAgICAgICAgICAgIHRoaXMubmF0dXJhbCgwLCAyNTUpICsgJy4nICtcblx0ICAgICAgICAgICAgdGhpcy5uYXR1cmFsKDAsIDI1NSkgKyAnLicgK1xuXHQgICAgICAgICAgICB0aGlzLm5hdHVyYWwoMCwgMjU1KVxuXHQgICAgfVxuXHR9XG5cbi8qKiovIH0pLFxuLyogMTcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHQgICAgIyMgQWRkcmVzc1xuXHQqL1xuXG5cdHZhciBESUNUID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0dmFyIFJFR0lPTiA9IFsn5Lic5YyXJywgJ+WNjuWMlycsICfljY7kuJwnLCAn5Y2O5LitJywgJ+WNjuWNlycsICfopb/ljZcnLCAn6KW/5YyXJ11cblxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICAgIC8vIOmaj+acuueUn+aIkOS4gOS4quWkp+WMuuOAglxuXHQgICAgcmVnaW9uOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5waWNrKFJFR0lPTilcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrvvIjkuK3lm73vvInnnIHvvIjmiJbnm7TovpbluILjgIHoh6rmsrvljLrjgIHnibnliKvooYzmlL/ljLrvvInjgIJcblx0ICAgIHByb3ZpbmNlOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5waWNrKERJQ1QpLm5hbWVcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrvvIjkuK3lm73vvInluILjgIJcblx0ICAgIGNpdHk6IGZ1bmN0aW9uKHByZWZpeCkge1xuXHQgICAgICAgIHZhciBwcm92aW5jZSA9IHRoaXMucGljayhESUNUKVxuXHQgICAgICAgIHZhciBjaXR5ID0gdGhpcy5waWNrKHByb3ZpbmNlLmNoaWxkcmVuKVxuXHQgICAgICAgIHJldHVybiBwcmVmaXggPyBbcHJvdmluY2UubmFtZSwgY2l0eS5uYW1lXS5qb2luKCcgJykgOiBjaXR5Lm5hbWVcblx0ICAgIH0sXG5cdCAgICAvLyDpmo/mnLrnlJ/miJDkuIDkuKrvvIjkuK3lm73vvInljr/jgIJcblx0ICAgIGNvdW50eTogZnVuY3Rpb24ocHJlZml4KSB7XG5cdCAgICAgICAgdmFyIHByb3ZpbmNlID0gdGhpcy5waWNrKERJQ1QpXG5cdCAgICAgICAgdmFyIGNpdHkgPSB0aGlzLnBpY2socHJvdmluY2UuY2hpbGRyZW4pXG5cdCAgICAgICAgdmFyIGNvdW50eSA9IHRoaXMucGljayhjaXR5LmNoaWxkcmVuKSB8fCB7XG5cdCAgICAgICAgICAgIG5hbWU6ICctJ1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcHJlZml4ID8gW3Byb3ZpbmNlLm5hbWUsIGNpdHkubmFtZSwgY291bnR5Lm5hbWVdLmpvaW4oJyAnKSA6IGNvdW50eS5uYW1lXG5cdCAgICB9LFxuXHQgICAgLy8g6ZqP5py655Sf5oiQ5LiA5Liq6YKu5pS/57yW56CB77yI5YWt5L2N5pWw5a2X77yJ44CCXG5cdCAgICB6aXA6IGZ1bmN0aW9uKGxlbikge1xuXHQgICAgICAgIHZhciB6aXAgPSAnJ1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgKGxlbiB8fCA2KTsgaSsrKSB6aXAgKz0gdGhpcy5uYXR1cmFsKDAsIDkpXG5cdCAgICAgICAgcmV0dXJuIHppcFxuXHQgICAgfVxuXG5cdCAgICAvLyBhZGRyZXNzOiBmdW5jdGlvbigpIHt9LFxuXHQgICAgLy8gcGhvbmU6IGZ1bmN0aW9uKCkge30sXG5cdCAgICAvLyBhcmVhY29kZTogZnVuY3Rpb24oKSB7fSxcblx0ICAgIC8vIHN0cmVldDogZnVuY3Rpb24oKSB7fSxcblx0ICAgIC8vIHN0cmVldF9zdWZmaXhlczogZnVuY3Rpb24oKSB7fSxcblx0ICAgIC8vIHN0cmVldF9zdWZmaXg6IGZ1bmN0aW9uKCkge30sXG5cdCAgICAvLyBzdGF0ZXM6IGZ1bmN0aW9uKCkge30sXG5cdCAgICAvLyBzdGF0ZTogZnVuY3Rpb24oKSB7fSxcblx0fVxuXG4vKioqLyB9KSxcbi8qIDE4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Lypcblx0ICAgICMjIEFkZHJlc3Mg5a2X5YW45pWw5o2uXG5cblx0ICAgIOWtl+WFuOaVsOaNruadpea6kCBodHRwOi8vd3d3LmF0YXRlY2gub3JnL2FydGljbGVzLzMwMDI4P3JuZD0yNTQyNTk4NTZcblxuXHQgICAg5Zu95qCHIOecge+8iOW4gu+8iee6p+ihjOaUv+WMuuWIkueggeihqFxuXG5cdCAgICDljY7ljJcgICDljJfkuqzluIIg5aSp5rSl5biCIOays+WMl+ecgSDlsbHopb/nnIEg5YaF6JKZ5Y+k6Ieq5rK75Yy6XG5cdCAgICDkuJzljJcgICDovr3lroHnnIEg5ZCJ5p6X55yBIOm7kem+meaxn+ecgVxuXHQgICAg5Y2O5LicICAg5LiK5rW35biCIOaxn+iLj+ecgSDmtZnmsZ/nnIEg5a6J5b6955yBIOemj+W7uuecgSDmsZ/opb/nnIEg5bGx5Lic55yBXG5cdCAgICDljY7ljZcgICDlub/kuJznnIEg5bm/6KW/5aOu5peP6Ieq5rK75Yy6IOa1t+WNl+ecgVxuXHQgICAg5Y2O5LitICAg5rKz5Y2X55yBIOa5luWMl+ecgSDmuZbljZfnnIFcblx0ICAgIOilv+WNlyAgIOmHjeW6huW4giDlm5vlt53nnIEg6LS15bee55yBIOS6keWNl+ecgSDopb/ol4/oh6rmsrvljLpcblx0ICAgIOilv+WMlyAgIOmZleilv+ecgSDnlJjogoPnnIEg6Z2S5rW355yBIOWugeWkj+WbnuaXj+iHquayu+WMuiDmlrDnlobnu7TlkL7lsJToh6rmsrvljLpcblx0ICAgIOa4r+a+s+WPsCDpppnmuK/nibnliKvooYzmlL/ljLog5r6z6Zeo54m55Yir6KGM5pS/5Yy6IOWPsOa5vuecgVxuXHQgICAgXG5cdCAgICAqKuaOkuW6jyoqXG5cdCAgICBcblx0ICAgIGBgYGpzXG5cdCAgICB2YXIgbWFwID0ge31cblx0ICAgIF8uZWFjaChfLmtleXMoUkVHSU9OUyksZnVuY3Rpb24oaWQpe1xuXHQgICAgICBtYXBbaWRdID0gUkVHSU9OU1tJRF1cblx0ICAgIH0pXG5cdCAgICBKU09OLnN0cmluZ2lmeShtYXApXG5cdCAgICBgYGBcblx0Ki9cblx0dmFyIERJQ1QgPSB7XG5cdCAgICBcIjExMDAwMFwiOiBcIuWMl+S6rFwiLFxuXHQgICAgXCIxMTAxMDBcIjogXCLljJfkuqzluIJcIixcblx0ICAgIFwiMTEwMTAxXCI6IFwi5Lic5Z+O5Yy6XCIsXG5cdCAgICBcIjExMDEwMlwiOiBcIuilv+WfjuWMulwiLFxuXHQgICAgXCIxMTAxMDVcIjogXCLmnJ3pmLPljLpcIixcblx0ICAgIFwiMTEwMTA2XCI6IFwi5Liw5Y+w5Yy6XCIsXG5cdCAgICBcIjExMDEwN1wiOiBcIuefs+aZr+WxseWMulwiLFxuXHQgICAgXCIxMTAxMDhcIjogXCLmtbfmt4DljLpcIixcblx0ICAgIFwiMTEwMTA5XCI6IFwi6Zeo5aS05rKf5Yy6XCIsXG5cdCAgICBcIjExMDExMVwiOiBcIuaIv+WxseWMulwiLFxuXHQgICAgXCIxMTAxMTJcIjogXCLpgJrlt57ljLpcIixcblx0ICAgIFwiMTEwMTEzXCI6IFwi6aG65LmJ5Yy6XCIsXG5cdCAgICBcIjExMDExNFwiOiBcIuaYjOW5s+WMulwiLFxuXHQgICAgXCIxMTAxMTVcIjogXCLlpKflhbTljLpcIixcblx0ICAgIFwiMTEwMTE2XCI6IFwi5oCA5p+U5Yy6XCIsXG5cdCAgICBcIjExMDExN1wiOiBcIuW5s+iwt+WMulwiLFxuXHQgICAgXCIxMTAyMjhcIjogXCLlr4bkupHljr9cIixcblx0ICAgIFwiMTEwMjI5XCI6IFwi5bu25bqG5Y6/XCIsXG5cdCAgICBcIjExMDIzMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMjAwMDBcIjogXCLlpKnmtKVcIixcblx0ICAgIFwiMTIwMTAwXCI6IFwi5aSp5rSl5biCXCIsXG5cdCAgICBcIjEyMDEwMVwiOiBcIuWSjOW5s+WMulwiLFxuXHQgICAgXCIxMjAxMDJcIjogXCLmsrPkuJzljLpcIixcblx0ICAgIFwiMTIwMTAzXCI6IFwi5rKz6KW/5Yy6XCIsXG5cdCAgICBcIjEyMDEwNFwiOiBcIuWNl+W8gOWMulwiLFxuXHQgICAgXCIxMjAxMDVcIjogXCLmsrPljJfljLpcIixcblx0ICAgIFwiMTIwMTA2XCI6IFwi57qi5qGl5Yy6XCIsXG5cdCAgICBcIjEyMDExMFwiOiBcIuS4nOS4veWMulwiLFxuXHQgICAgXCIxMjAxMTFcIjogXCLopb/pnZLljLpcIixcblx0ICAgIFwiMTIwMTEyXCI6IFwi5rSl5Y2X5Yy6XCIsXG5cdCAgICBcIjEyMDExM1wiOiBcIuWMl+i+sOWMulwiLFxuXHQgICAgXCIxMjAxMTRcIjogXCLmrabmuIXljLpcIixcblx0ICAgIFwiMTIwMTE1XCI6IFwi5a6d5Z275Yy6XCIsXG5cdCAgICBcIjEyMDExNlwiOiBcIua7qOa1t+aWsOWMulwiLFxuXHQgICAgXCIxMjAyMjFcIjogXCLlroHmsrPljr9cIixcblx0ICAgIFwiMTIwMjIzXCI6IFwi6Z2Z5rW35Y6/XCIsXG5cdCAgICBcIjEyMDIyNVwiOiBcIuiTn+WOv1wiLFxuXHQgICAgXCIxMjAyMjZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwMDAwXCI6IFwi5rKz5YyX55yBXCIsXG5cdCAgICBcIjEzMDEwMFwiOiBcIuefs+WutuW6hOW4glwiLFxuXHQgICAgXCIxMzAxMDJcIjogXCLplb/lronljLpcIixcblx0ICAgIFwiMTMwMTAzXCI6IFwi5qGl5Lic5Yy6XCIsXG5cdCAgICBcIjEzMDEwNFwiOiBcIuahpeilv+WMulwiLFxuXHQgICAgXCIxMzAxMDVcIjogXCLmlrDljY7ljLpcIixcblx0ICAgIFwiMTMwMTA3XCI6IFwi5LqV6ZmJ55+/5Yy6XCIsXG5cdCAgICBcIjEzMDEwOFwiOiBcIuijleWNjuWMulwiLFxuXHQgICAgXCIxMzAxMjFcIjogXCLkupXpmYnljr9cIixcblx0ICAgIFwiMTMwMTIzXCI6IFwi5q2j5a6a5Y6/XCIsXG5cdCAgICBcIjEzMDEyNFwiOiBcIuagvuWfjuWOv1wiLFxuXHQgICAgXCIxMzAxMjVcIjogXCLooYzllJDljr9cIixcblx0ICAgIFwiMTMwMTI2XCI6IFwi54G15a+/5Y6/XCIsXG5cdCAgICBcIjEzMDEyN1wiOiBcIumrmOmCkeWOv1wiLFxuXHQgICAgXCIxMzAxMjhcIjogXCLmt7Hms73ljr9cIixcblx0ICAgIFwiMTMwMTI5XCI6IFwi6LWe55qH5Y6/XCIsXG5cdCAgICBcIjEzMDEzMFwiOiBcIuaXoOaegeWOv1wiLFxuXHQgICAgXCIxMzAxMzFcIjogXCLlubPlsbHljr9cIixcblx0ICAgIFwiMTMwMTMyXCI6IFwi5YWD5rCP5Y6/XCIsXG5cdCAgICBcIjEzMDEzM1wiOiBcIui1teWOv1wiLFxuXHQgICAgXCIxMzAxODFcIjogXCLovpvpm4bluIJcIixcblx0ICAgIFwiMTMwMTgyXCI6IFwi6JeB5Z+O5biCXCIsXG5cdCAgICBcIjEzMDE4M1wiOiBcIuaZi+W3nuW4glwiLFxuXHQgICAgXCIxMzAxODRcIjogXCLmlrDkuZDluIJcIixcblx0ICAgIFwiMTMwMTg1XCI6IFwi6bm/5rOJ5biCXCIsXG5cdCAgICBcIjEzMDE4NlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMzAyMDBcIjogXCLllJDlsbHluIJcIixcblx0ICAgIFwiMTMwMjAyXCI6IFwi6Lev5Y2X5Yy6XCIsXG5cdCAgICBcIjEzMDIwM1wiOiBcIui3r+WMl+WMulwiLFxuXHQgICAgXCIxMzAyMDRcIjogXCLlj6TlhrbljLpcIixcblx0ICAgIFwiMTMwMjA1XCI6IFwi5byA5bmz5Yy6XCIsXG5cdCAgICBcIjEzMDIwN1wiOiBcIuS4sOWNl+WMulwiLFxuXHQgICAgXCIxMzAyMDhcIjogXCLkuLDmtqbljLpcIixcblx0ICAgIFwiMTMwMjIzXCI6IFwi5rum5Y6/XCIsXG5cdCAgICBcIjEzMDIyNFwiOiBcIua7puWNl+WOv1wiLFxuXHQgICAgXCIxMzAyMjVcIjogXCLkuZDkuq3ljr9cIixcblx0ICAgIFwiMTMwMjI3XCI6IFwi6L+B6KW/5Y6/XCIsXG5cdCAgICBcIjEzMDIyOVwiOiBcIueOieeUsOWOv1wiLFxuXHQgICAgXCIxMzAyMzBcIjogXCLmm7nlpoPnlLjljLpcIixcblx0ICAgIFwiMTMwMjgxXCI6IFwi6YG15YyW5biCXCIsXG5cdCAgICBcIjEzMDI4M1wiOiBcIui/geWuieW4glwiLFxuXHQgICAgXCIxMzAyODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwMzAwXCI6IFwi56em55qH5bKb5biCXCIsXG5cdCAgICBcIjEzMDMwMlwiOiBcIua1t+a4r+WMulwiLFxuXHQgICAgXCIxMzAzMDNcIjogXCLlsbHmtbflhbPljLpcIixcblx0ICAgIFwiMTMwMzA0XCI6IFwi5YyX5oi05rKz5Yy6XCIsXG5cdCAgICBcIjEzMDMyMVwiOiBcIumdkum+mea7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIxMzAzMjJcIjogXCLmmIzpu47ljr9cIixcblx0ICAgIFwiMTMwMzIzXCI6IFwi5oqa5a6B5Y6/XCIsXG5cdCAgICBcIjEzMDMyNFwiOiBcIuWNoum+meWOv1wiLFxuXHQgICAgXCIxMzAzOThcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwNDAwXCI6IFwi6YKv6YO45biCXCIsXG5cdCAgICBcIjEzMDQwMlwiOiBcIumCr+WxseWMulwiLFxuXHQgICAgXCIxMzA0MDNcIjogXCLkuJvlj7DljLpcIixcblx0ICAgIFwiMTMwNDA0XCI6IFwi5aSN5YW05Yy6XCIsXG5cdCAgICBcIjEzMDQwNlwiOiBcIuWzsOWzsOefv+WMulwiLFxuXHQgICAgXCIxMzA0MjFcIjogXCLpgq/pg7jljr9cIixcblx0ICAgIFwiMTMwNDIzXCI6IFwi5Li05ryz5Y6/XCIsXG5cdCAgICBcIjEzMDQyNFwiOiBcIuaIkOWuieWOv1wiLFxuXHQgICAgXCIxMzA0MjVcIjogXCLlpKflkI3ljr9cIixcblx0ICAgIFwiMTMwNDI2XCI6IFwi5raJ5Y6/XCIsXG5cdCAgICBcIjEzMDQyN1wiOiBcIuejgeWOv1wiLFxuXHQgICAgXCIxMzA0MjhcIjogXCLogqXkuaHljr9cIixcblx0ICAgIFwiMTMwNDI5XCI6IFwi5rC45bm05Y6/XCIsXG5cdCAgICBcIjEzMDQzMFwiOiBcIumCseWOv1wiLFxuXHQgICAgXCIxMzA0MzFcIjogXCLpuKHms73ljr9cIixcblx0ICAgIFwiMTMwNDMyXCI6IFwi5bm/5bmz5Y6/XCIsXG5cdCAgICBcIjEzMDQzM1wiOiBcIummhumZtuWOv1wiLFxuXHQgICAgXCIxMzA0MzRcIjogXCLprY/ljr9cIixcblx0ICAgIFwiMTMwNDM1XCI6IFwi5puy5ZGo5Y6/XCIsXG5cdCAgICBcIjEzMDQ4MVwiOiBcIuatpuWuieW4glwiLFxuXHQgICAgXCIxMzA0ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwNTAwXCI6IFwi6YKi5Y+w5biCXCIsXG5cdCAgICBcIjEzMDUwMlwiOiBcIuahpeS4nOWMulwiLFxuXHQgICAgXCIxMzA1MDNcIjogXCLmoaXopb/ljLpcIixcblx0ICAgIFwiMTMwNTIxXCI6IFwi6YKi5Y+w5Y6/XCIsXG5cdCAgICBcIjEzMDUyMlwiOiBcIuS4tOWfjuWOv1wiLFxuXHQgICAgXCIxMzA1MjNcIjogXCLlhoXkuJjljr9cIixcblx0ICAgIFwiMTMwNTI0XCI6IFwi5p+P5Lmh5Y6/XCIsXG5cdCAgICBcIjEzMDUyNVwiOiBcIumahuWwp+WOv1wiLFxuXHQgICAgXCIxMzA1MjZcIjogXCLku7vljr9cIixcblx0ICAgIFwiMTMwNTI3XCI6IFwi5Y2X5ZKM5Y6/XCIsXG5cdCAgICBcIjEzMDUyOFwiOiBcIuWugeaZi+WOv1wiLFxuXHQgICAgXCIxMzA1MjlcIjogXCLlt6jpub/ljr9cIixcblx0ICAgIFwiMTMwNTMwXCI6IFwi5paw5rKz5Y6/XCIsXG5cdCAgICBcIjEzMDUzMVwiOiBcIuW5v+Wul+WOv1wiLFxuXHQgICAgXCIxMzA1MzJcIjogXCLlubPkuaHljr9cIixcblx0ICAgIFwiMTMwNTMzXCI6IFwi5aiB5Y6/XCIsXG5cdCAgICBcIjEzMDUzNFwiOiBcIua4heays+WOv1wiLFxuXHQgICAgXCIxMzA1MzVcIjogXCLkuLTopb/ljr9cIixcblx0ICAgIFwiMTMwNTgxXCI6IFwi5Y2X5a6r5biCXCIsXG5cdCAgICBcIjEzMDU4MlwiOiBcIuaymeays+W4glwiLFxuXHQgICAgXCIxMzA1ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwNjAwXCI6IFwi5L+d5a6a5biCXCIsXG5cdCAgICBcIjEzMDYwMlwiOiBcIuaWsOW4guWMulwiLFxuXHQgICAgXCIxMzA2MDNcIjogXCLljJfluILljLpcIixcblx0ICAgIFwiMTMwNjA0XCI6IFwi5Y2X5biC5Yy6XCIsXG5cdCAgICBcIjEzMDYyMVwiOiBcIua7oeWfjuWOv1wiLFxuXHQgICAgXCIxMzA2MjJcIjogXCLmuIXoi5Hljr9cIixcblx0ICAgIFwiMTMwNjIzXCI6IFwi5rae5rC05Y6/XCIsXG5cdCAgICBcIjEzMDYyNFwiOiBcIumYnOW5s+WOv1wiLFxuXHQgICAgXCIxMzA2MjVcIjogXCLlvpDmsLTljr9cIixcblx0ICAgIFwiMTMwNjI2XCI6IFwi5a6a5YW05Y6/XCIsXG5cdCAgICBcIjEzMDYyN1wiOiBcIuWUkOWOv1wiLFxuXHQgICAgXCIxMzA2MjhcIjogXCLpq5jpmLPljr9cIixcblx0ICAgIFwiMTMwNjI5XCI6IFwi5a655Z+O5Y6/XCIsXG5cdCAgICBcIjEzMDYzMFwiOiBcIua2nua6kOWOv1wiLFxuXHQgICAgXCIxMzA2MzFcIjogXCLmnJvpg73ljr9cIixcblx0ICAgIFwiMTMwNjMyXCI6IFwi5a6J5paw5Y6/XCIsXG5cdCAgICBcIjEzMDYzM1wiOiBcIuaYk+WOv1wiLFxuXHQgICAgXCIxMzA2MzRcIjogXCLmm7LpmLPljr9cIixcblx0ICAgIFwiMTMwNjM1XCI6IFwi6KCh5Y6/XCIsXG5cdCAgICBcIjEzMDYzNlwiOiBcIumhuuW5s+WOv1wiLFxuXHQgICAgXCIxMzA2MzdcIjogXCLljZrph47ljr9cIixcblx0ICAgIFwiMTMwNjM4XCI6IFwi6ZuE5Y6/XCIsXG5cdCAgICBcIjEzMDY4MVwiOiBcIua2v+W3nuW4glwiLFxuXHQgICAgXCIxMzA2ODJcIjogXCLlrprlt57luIJcIixcblx0ICAgIFwiMTMwNjgzXCI6IFwi5a6J5Zu95biCXCIsXG5cdCAgICBcIjEzMDY4NFwiOiBcIumrmOeikeW6l+W4glwiLFxuXHQgICAgXCIxMzA2OTlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTMwNzAwXCI6IFwi5byg5a625Y+j5biCXCIsXG5cdCAgICBcIjEzMDcwMlwiOiBcIuahpeS4nOWMulwiLFxuXHQgICAgXCIxMzA3MDNcIjogXCLmoaXopb/ljLpcIixcblx0ICAgIFwiMTMwNzA1XCI6IFwi5a6j5YyW5Yy6XCIsXG5cdCAgICBcIjEzMDcwNlwiOiBcIuS4i+iKseWbreWMulwiLFxuXHQgICAgXCIxMzA3MjFcIjogXCLlrqPljJbljr9cIixcblx0ICAgIFwiMTMwNzIyXCI6IFwi5byg5YyX5Y6/XCIsXG5cdCAgICBcIjEzMDcyM1wiOiBcIuW6t+S/neWOv1wiLFxuXHQgICAgXCIxMzA3MjRcIjogXCLmsr3mupDljr9cIixcblx0ICAgIFwiMTMwNzI1XCI6IFwi5bCa5LmJ5Y6/XCIsXG5cdCAgICBcIjEzMDcyNlwiOiBcIuiUmuWOv1wiLFxuXHQgICAgXCIxMzA3MjdcIjogXCLpmLPljp/ljr9cIixcblx0ICAgIFwiMTMwNzI4XCI6IFwi5oCA5a6J5Y6/XCIsXG5cdCAgICBcIjEzMDcyOVwiOiBcIuS4h+WFqOWOv1wiLFxuXHQgICAgXCIxMzA3MzBcIjogXCLmgIDmnaXljr9cIixcblx0ICAgIFwiMTMwNzMxXCI6IFwi5ra/6bm/5Y6/XCIsXG5cdCAgICBcIjEzMDczMlwiOiBcIui1pOWfjuWOv1wiLFxuXHQgICAgXCIxMzA3MzNcIjogXCLltIfnpLzljr9cIixcblx0ICAgIFwiMTMwNzM0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjEzMDgwMFwiOiBcIuaJv+W+t+W4glwiLFxuXHQgICAgXCIxMzA4MDJcIjogXCLlj4zmoaXljLpcIixcblx0ICAgIFwiMTMwODAzXCI6IFwi5Y+M5rum5Yy6XCIsXG5cdCAgICBcIjEzMDgwNFwiOiBcIum5sOaJi+iQpeWtkOefv+WMulwiLFxuXHQgICAgXCIxMzA4MjFcIjogXCLmib/lvrfljr9cIixcblx0ICAgIFwiMTMwODIyXCI6IFwi5YW06ZqG5Y6/XCIsXG5cdCAgICBcIjEzMDgyM1wiOiBcIuW5s+azieWOv1wiLFxuXHQgICAgXCIxMzA4MjRcIjogXCLmu6blubPljr9cIixcblx0ICAgIFwiMTMwODI1XCI6IFwi6ZqG5YyW5Y6/XCIsXG5cdCAgICBcIjEzMDgyNlwiOiBcIuS4sOWugea7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIxMzA4MjdcIjogXCLlrr3ln47mu6Hml4/oh6rmsrvljr9cIixcblx0ICAgIFwiMTMwODI4XCI6IFwi5Zu05Zy65ruh5peP6JKZ5Y+k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjEzMDgyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMzA5MDBcIjogXCLmsqflt57luIJcIixcblx0ICAgIFwiMTMwOTAyXCI6IFwi5paw5Y2O5Yy6XCIsXG5cdCAgICBcIjEzMDkwM1wiOiBcIui/kOays+WMulwiLFxuXHQgICAgXCIxMzA5MjFcIjogXCLmsqfljr9cIixcblx0ICAgIFwiMTMwOTIyXCI6IFwi6Z2S5Y6/XCIsXG5cdCAgICBcIjEzMDkyM1wiOiBcIuS4nOWFieWOv1wiLFxuXHQgICAgXCIxMzA5MjRcIjogXCLmtbflhbTljr9cIixcblx0ICAgIFwiMTMwOTI1XCI6IFwi55uQ5bGx5Y6/XCIsXG5cdCAgICBcIjEzMDkyNlwiOiBcIuiCg+WugeWOv1wiLFxuXHQgICAgXCIxMzA5MjdcIjogXCLljZfnmq7ljr9cIixcblx0ICAgIFwiMTMwOTI4XCI6IFwi5ZC05qGl5Y6/XCIsXG5cdCAgICBcIjEzMDkyOVwiOiBcIueMruWOv1wiLFxuXHQgICAgXCIxMzA5MzBcIjogXCLlrZ/mnZHlm57ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiMTMwOTgxXCI6IFwi5rOK5aS05biCXCIsXG5cdCAgICBcIjEzMDk4MlwiOiBcIuS7u+S4mOW4glwiLFxuXHQgICAgXCIxMzA5ODNcIjogXCLpu4TpqoXluIJcIixcblx0ICAgIFwiMTMwOTg0XCI6IFwi5rKz6Ze05biCXCIsXG5cdCAgICBcIjEzMDk4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMzEwMDBcIjogXCLlu4rlnYrluIJcIixcblx0ICAgIFwiMTMxMDAyXCI6IFwi5a6J5qyh5Yy6XCIsXG5cdCAgICBcIjEzMTAwM1wiOiBcIuW5v+mYs+WMulwiLFxuXHQgICAgXCIxMzEwMjJcIjogXCLlm7rlronljr9cIixcblx0ICAgIFwiMTMxMDIzXCI6IFwi5rC45riF5Y6/XCIsXG5cdCAgICBcIjEzMTAyNFwiOiBcIummmeays+WOv1wiLFxuXHQgICAgXCIxMzEwMjVcIjogXCLlpKfln47ljr9cIixcblx0ICAgIFwiMTMxMDI2XCI6IFwi5paH5a6J5Y6/XCIsXG5cdCAgICBcIjEzMTAyOFwiOiBcIuWkp+WOguWbnuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIxMzEwODFcIjogXCLpnLjlt57luIJcIixcblx0ICAgIFwiMTMxMDgyXCI6IFwi5LiJ5rKz5biCXCIsXG5cdCAgICBcIjEzMTA4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxMzExMDBcIjogXCLooaHmsLTluIJcIixcblx0ICAgIFwiMTMxMTAyXCI6IFwi5qGD5Z+O5Yy6XCIsXG5cdCAgICBcIjEzMTEyMVwiOiBcIuaeo+W8uuWOv1wiLFxuXHQgICAgXCIxMzExMjJcIjogXCLmrabpgpHljr9cIixcblx0ICAgIFwiMTMxMTIzXCI6IFwi5q2m5by65Y6/XCIsXG5cdCAgICBcIjEzMTEyNFwiOiBcIumltumYs+WOv1wiLFxuXHQgICAgXCIxMzExMjVcIjogXCLlronlubPljr9cIixcblx0ICAgIFwiMTMxMTI2XCI6IFwi5pWF5Z+O5Y6/XCIsXG5cdCAgICBcIjEzMTEyN1wiOiBcIuaZr+WOv1wiLFxuXHQgICAgXCIxMzExMjhcIjogXCLpmJzln47ljr9cIixcblx0ICAgIFwiMTMxMTgxXCI6IFwi5YaA5bee5biCXCIsXG5cdCAgICBcIjEzMTE4MlwiOiBcIua3seW3nuW4glwiLFxuXHQgICAgXCIxMzExODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTQwMDAwXCI6IFwi5bGx6KW/55yBXCIsXG5cdCAgICBcIjE0MDEwMFwiOiBcIuWkquWOn+W4glwiLFxuXHQgICAgXCIxNDAxMDVcIjogXCLlsI/lupfljLpcIixcblx0ICAgIFwiMTQwMTA2XCI6IFwi6L+O5rO95Yy6XCIsXG5cdCAgICBcIjE0MDEwN1wiOiBcIuadj+iKseWyreWMulwiLFxuXHQgICAgXCIxNDAxMDhcIjogXCLlsJbojYnlnarljLpcIixcblx0ICAgIFwiMTQwMTA5XCI6IFwi5LiH5p+P5p6X5Yy6XCIsXG5cdCAgICBcIjE0MDExMFwiOiBcIuaZi+a6kOWMulwiLFxuXHQgICAgXCIxNDAxMjFcIjogXCLmuIXlvpDljr9cIixcblx0ICAgIFwiMTQwMTIyXCI6IFwi6Ziz5puy5Y6/XCIsXG5cdCAgICBcIjE0MDEyM1wiOiBcIuWohOeDpuWOv1wiLFxuXHQgICAgXCIxNDAxODFcIjogXCLlj6TkuqTluIJcIixcblx0ICAgIFwiMTQwMTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE0MDIwMFwiOiBcIuWkp+WQjOW4glwiLFxuXHQgICAgXCIxNDAyMDJcIjogXCLln47ljLpcIixcblx0ICAgIFwiMTQwMjAzXCI6IFwi55+/5Yy6XCIsXG5cdCAgICBcIjE0MDIxMVwiOiBcIuWNl+mDiuWMulwiLFxuXHQgICAgXCIxNDAyMTJcIjogXCLmlrDojaPljLpcIixcblx0ICAgIFwiMTQwMjIxXCI6IFwi6Ziz6auY5Y6/XCIsXG5cdCAgICBcIjE0MDIyMlwiOiBcIuWkqemVh+WOv1wiLFxuXHQgICAgXCIxNDAyMjNcIjogXCLlub/ngbXljr9cIixcblx0ICAgIFwiMTQwMjI0XCI6IFwi54G15LiY5Y6/XCIsXG5cdCAgICBcIjE0MDIyNVwiOiBcIua1kea6kOWOv1wiLFxuXHQgICAgXCIxNDAyMjZcIjogXCLlt6bkupHljr9cIixcblx0ICAgIFwiMTQwMjI3XCI6IFwi5aSn5ZCM5Y6/XCIsXG5cdCAgICBcIjE0MDIyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNDAzMDBcIjogXCLpmLPms4nluIJcIixcblx0ICAgIFwiMTQwMzAyXCI6IFwi5Z+O5Yy6XCIsXG5cdCAgICBcIjE0MDMwM1wiOiBcIuefv+WMulwiLFxuXHQgICAgXCIxNDAzMTFcIjogXCLpg4rljLpcIixcblx0ICAgIFwiMTQwMzIxXCI6IFwi5bmz5a6a5Y6/XCIsXG5cdCAgICBcIjE0MDMyMlwiOiBcIuebguWOv1wiLFxuXHQgICAgXCIxNDAzMjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTQwNDAwXCI6IFwi6ZW/5rK75biCXCIsXG5cdCAgICBcIjE0MDQyMVwiOiBcIumVv+ayu+WOv1wiLFxuXHQgICAgXCIxNDA0MjNcIjogXCLopYTlnqPljr9cIixcblx0ICAgIFwiMTQwNDI0XCI6IFwi5bGv55WZ5Y6/XCIsXG5cdCAgICBcIjE0MDQyNVwiOiBcIuW5s+mhuuWOv1wiLFxuXHQgICAgXCIxNDA0MjZcIjogXCLpu47ln47ljr9cIixcblx0ICAgIFwiMTQwNDI3XCI6IFwi5aO25YWz5Y6/XCIsXG5cdCAgICBcIjE0MDQyOFwiOiBcIumVv+WtkOWOv1wiLFxuXHQgICAgXCIxNDA0MjlcIjogXCLmrabkuaHljr9cIixcblx0ICAgIFwiMTQwNDMwXCI6IFwi5rKB5Y6/XCIsXG5cdCAgICBcIjE0MDQzMVwiOiBcIuaygea6kOWOv1wiLFxuXHQgICAgXCIxNDA0ODFcIjogXCLmvZ7ln47luIJcIixcblx0ICAgIFwiMTQwNDgyXCI6IFwi5Z+O5Yy6XCIsXG5cdCAgICBcIjE0MDQ4M1wiOiBcIumDiuWMulwiLFxuXHQgICAgXCIxNDA0ODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTQwNTAwXCI6IFwi5pmL5Z+O5biCXCIsXG5cdCAgICBcIjE0MDUwMlwiOiBcIuWfjuWMulwiLFxuXHQgICAgXCIxNDA1MjFcIjogXCLmsoHmsLTljr9cIixcblx0ICAgIFwiMTQwNTIyXCI6IFwi6Ziz5Z+O5Y6/XCIsXG5cdCAgICBcIjE0MDUyNFwiOiBcIumZteW3neWOv1wiLFxuXHQgICAgXCIxNDA1MjVcIjogXCLms73lt57ljr9cIixcblx0ICAgIFwiMTQwNTgxXCI6IFwi6auY5bmz5biCXCIsXG5cdCAgICBcIjE0MDU4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNDA2MDBcIjogXCLmnJTlt57luIJcIixcblx0ICAgIFwiMTQwNjAyXCI6IFwi5pyU5Z+O5Yy6XCIsXG5cdCAgICBcIjE0MDYwM1wiOiBcIuW5s+mygeWMulwiLFxuXHQgICAgXCIxNDA2MjFcIjogXCLlsbHpmLTljr9cIixcblx0ICAgIFwiMTQwNjIyXCI6IFwi5bqU5Y6/XCIsXG5cdCAgICBcIjE0MDYyM1wiOiBcIuWPs+eOieWOv1wiLFxuXHQgICAgXCIxNDA2MjRcIjogXCLmgIDku4Hljr9cIixcblx0ICAgIFwiMTQwNjI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE0MDcwMFwiOiBcIuaZi+S4reW4glwiLFxuXHQgICAgXCIxNDA3MDJcIjogXCLmpobmrKHljLpcIixcblx0ICAgIFwiMTQwNzIxXCI6IFwi5qaG56S+5Y6/XCIsXG5cdCAgICBcIjE0MDcyMlwiOiBcIuW3puadg+WOv1wiLFxuXHQgICAgXCIxNDA3MjNcIjogXCLlkozpobrljr9cIixcblx0ICAgIFwiMTQwNzI0XCI6IFwi5piU6Ziz5Y6/XCIsXG5cdCAgICBcIjE0MDcyNVwiOiBcIuWvv+mYs+WOv1wiLFxuXHQgICAgXCIxNDA3MjZcIjogXCLlpKrosLfljr9cIixcblx0ICAgIFwiMTQwNzI3XCI6IFwi56WB5Y6/XCIsXG5cdCAgICBcIjE0MDcyOFwiOiBcIuW5s+mBpeWOv1wiLFxuXHQgICAgXCIxNDA3MjlcIjogXCLngbXnn7Pljr9cIixcblx0ICAgIFwiMTQwNzgxXCI6IFwi5LuL5LyR5biCXCIsXG5cdCAgICBcIjE0MDc4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNDA4MDBcIjogXCLov5Dln47luIJcIixcblx0ICAgIFwiMTQwODAyXCI6IFwi55uQ5rmW5Yy6XCIsXG5cdCAgICBcIjE0MDgyMVwiOiBcIuS4tOeMl+WOv1wiLFxuXHQgICAgXCIxNDA4MjJcIjogXCLkuIfojaPljr9cIixcblx0ICAgIFwiMTQwODIzXCI6IFwi6Ze75Zac5Y6/XCIsXG5cdCAgICBcIjE0MDgyNFwiOiBcIueot+WxseWOv1wiLFxuXHQgICAgXCIxNDA4MjVcIjogXCLmlrDnu5vljr9cIixcblx0ICAgIFwiMTQwODI2XCI6IFwi57ub5Y6/XCIsXG5cdCAgICBcIjE0MDgyN1wiOiBcIuWeo+absuWOv1wiLFxuXHQgICAgXCIxNDA4MjhcIjogXCLlpI/ljr9cIixcblx0ICAgIFwiMTQwODI5XCI6IFwi5bmz6ZmG5Y6/XCIsXG5cdCAgICBcIjE0MDgzMFwiOiBcIuiKruWfjuWOv1wiLFxuXHQgICAgXCIxNDA4ODFcIjogXCLmsLjmtY7luIJcIixcblx0ICAgIFwiMTQwODgyXCI6IFwi5rKz5rSl5biCXCIsXG5cdCAgICBcIjE0MDg4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNDA5MDBcIjogXCLlv7vlt57luIJcIixcblx0ICAgIFwiMTQwOTAyXCI6IFwi5b+75bqc5Yy6XCIsXG5cdCAgICBcIjE0MDkyMVwiOiBcIuWumuilhOWOv1wiLFxuXHQgICAgXCIxNDA5MjJcIjogXCLkupTlj7Dljr9cIixcblx0ICAgIFwiMTQwOTIzXCI6IFwi5Luj5Y6/XCIsXG5cdCAgICBcIjE0MDkyNFwiOiBcIue5geWzmeWOv1wiLFxuXHQgICAgXCIxNDA5MjVcIjogXCLlroHmrabljr9cIixcblx0ICAgIFwiMTQwOTI2XCI6IFwi6Z2Z5LmQ5Y6/XCIsXG5cdCAgICBcIjE0MDkyN1wiOiBcIuelnuaxoOWOv1wiLFxuXHQgICAgXCIxNDA5MjhcIjogXCLkupTlr6jljr9cIixcblx0ICAgIFwiMTQwOTI5XCI6IFwi5bKi5bKa5Y6/XCIsXG5cdCAgICBcIjE0MDkzMFwiOiBcIuays+absuWOv1wiLFxuXHQgICAgXCIxNDA5MzFcIjogXCLkv53lvrfljr9cIixcblx0ICAgIFwiMTQwOTMyXCI6IFwi5YGP5YWz5Y6/XCIsXG5cdCAgICBcIjE0MDk4MVwiOiBcIuWOn+W5s+W4glwiLFxuXHQgICAgXCIxNDA5ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTQxMDAwXCI6IFwi5Li05rG+5biCXCIsXG5cdCAgICBcIjE0MTAwMlwiOiBcIuWwp+mDveWMulwiLFxuXHQgICAgXCIxNDEwMjFcIjogXCLmm7LmsoPljr9cIixcblx0ICAgIFwiMTQxMDIyXCI6IFwi57+85Z+O5Y6/XCIsXG5cdCAgICBcIjE0MTAyM1wiOiBcIuilhOaxvuWOv1wiLFxuXHQgICAgXCIxNDEwMjRcIjogXCLmtKrmtJ7ljr9cIixcblx0ICAgIFwiMTQxMDI1XCI6IFwi5Y+k5Y6/XCIsXG5cdCAgICBcIjE0MTAyNlwiOiBcIuWuieazveWOv1wiLFxuXHQgICAgXCIxNDEwMjdcIjogXCLmta7lsbHljr9cIixcblx0ICAgIFwiMTQxMDI4XCI6IFwi5ZCJ5Y6/XCIsXG5cdCAgICBcIjE0MTAyOVwiOiBcIuS5oeWugeWOv1wiLFxuXHQgICAgXCIxNDEwMzBcIjogXCLlpKflroHljr9cIixcblx0ICAgIFwiMTQxMDMxXCI6IFwi6Zqw5Y6/XCIsXG5cdCAgICBcIjE0MTAzMlwiOiBcIuawuOWSjOWOv1wiLFxuXHQgICAgXCIxNDEwMzNcIjogXCLokrLljr9cIixcblx0ICAgIFwiMTQxMDM0XCI6IFwi5rG+6KW/5Y6/XCIsXG5cdCAgICBcIjE0MTA4MVwiOiBcIuS+r+mprOW4glwiLFxuXHQgICAgXCIxNDEwODJcIjogXCLpnI3lt57luIJcIixcblx0ICAgIFwiMTQxMDgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE0MTEwMFwiOiBcIuWQleaigeW4glwiLFxuXHQgICAgXCIxNDExMDJcIjogXCLnprvnn7PljLpcIixcblx0ICAgIFwiMTQxMTIxXCI6IFwi5paH5rC05Y6/XCIsXG5cdCAgICBcIjE0MTEyMlwiOiBcIuS6pOWfjuWOv1wiLFxuXHQgICAgXCIxNDExMjNcIjogXCLlhbTljr9cIixcblx0ICAgIFwiMTQxMTI0XCI6IFwi5Li05Y6/XCIsXG5cdCAgICBcIjE0MTEyNVwiOiBcIuafs+ael+WOv1wiLFxuXHQgICAgXCIxNDExMjZcIjogXCLnn7Pmpbzljr9cIixcblx0ICAgIFwiMTQxMTI3XCI6IFwi5bKa5Y6/XCIsXG5cdCAgICBcIjE0MTEyOFwiOiBcIuaWueWxseWOv1wiLFxuXHQgICAgXCIxNDExMjlcIjogXCLkuK3pmLPljr9cIixcblx0ICAgIFwiMTQxMTMwXCI6IFwi5Lqk5Y+j5Y6/XCIsXG5cdCAgICBcIjE0MTE4MVwiOiBcIuWtneS5ieW4glwiLFxuXHQgICAgXCIxNDExODJcIjogXCLmsb7pmLPluIJcIixcblx0ICAgIFwiMTQxMTgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDAwMFwiOiBcIuWGheiSmeWPpOiHquayu+WMulwiLFxuXHQgICAgXCIxNTAxMDBcIjogXCLlkbzlkozmtannibnluIJcIixcblx0ICAgIFwiMTUwMTAyXCI6IFwi5paw5Z+O5Yy6XCIsXG5cdCAgICBcIjE1MDEwM1wiOiBcIuWbnuawkeWMulwiLFxuXHQgICAgXCIxNTAxMDRcIjogXCLnjonms4nljLpcIixcblx0ICAgIFwiMTUwMTA1XCI6IFwi6LWb572V5Yy6XCIsXG5cdCAgICBcIjE1MDEyMVwiOiBcIuWcn+m7mOeJueW3puaXl1wiLFxuXHQgICAgXCIxNTAxMjJcIjogXCLmiZjlhYvmiZjljr9cIixcblx0ICAgIFwiMTUwMTIzXCI6IFwi5ZKM5p6X5qC85bCU5Y6/XCIsXG5cdCAgICBcIjE1MDEyNFwiOiBcIua4heawtOays+WOv1wiLFxuXHQgICAgXCIxNTAxMjVcIjogXCLmrablt53ljr9cIixcblx0ICAgIFwiMTUwMTI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDIwMFwiOiBcIuWMheWktOW4glwiLFxuXHQgICAgXCIxNTAyMDJcIjogXCLkuJzmsrPljLpcIixcblx0ICAgIFwiMTUwMjAzXCI6IFwi5piG6YO95LuR5Yy6XCIsXG5cdCAgICBcIjE1MDIwNFwiOiBcIumdkuWxseWMulwiLFxuXHQgICAgXCIxNTAyMDVcIjogXCLnn7Pmi5DljLpcIixcblx0ICAgIFwiMTUwMjA2XCI6IFwi55m95LqR6YSC5Y2a55+/5Yy6XCIsXG5cdCAgICBcIjE1MDIwN1wiOiBcIuS5neWOn+WMulwiLFxuXHQgICAgXCIxNTAyMjFcIjogXCLlnJ/pu5jnibnlj7Pml5dcIixcblx0ICAgIFwiMTUwMjIyXCI6IFwi5Zu66Ziz5Y6/XCIsXG5cdCAgICBcIjE1MDIyM1wiOiBcIui+vuWwlOe9leiMguaYjuWuieiBlOWQiOaXl1wiLFxuXHQgICAgXCIxNTAyMjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTUwMzAwXCI6IFwi5LmM5rW35biCXCIsXG5cdCAgICBcIjE1MDMwMlwiOiBcIua1t+WLg+a5vuWMulwiLFxuXHQgICAgXCIxNTAzMDNcIjogXCLmtbfljZfljLpcIixcblx0ICAgIFwiMTUwMzA0XCI6IFwi5LmM6L6+5Yy6XCIsXG5cdCAgICBcIjE1MDMwNVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNTA0MDBcIjogXCLotaTls7DluIJcIixcblx0ICAgIFwiMTUwNDAyXCI6IFwi57qi5bGx5Yy6XCIsXG5cdCAgICBcIjE1MDQwM1wiOiBcIuWFg+WuneWxseWMulwiLFxuXHQgICAgXCIxNTA0MDRcIjogXCLmnb7lsbHljLpcIixcblx0ICAgIFwiMTUwNDIxXCI6IFwi6Zi/6bKB56eR5bCU5rKB5peXXCIsXG5cdCAgICBcIjE1MDQyMlwiOiBcIuW3tOael+W3puaXl1wiLFxuXHQgICAgXCIxNTA0MjNcIjogXCLlt7Tmnpflj7Pml5dcIixcblx0ICAgIFwiMTUwNDI0XCI6IFwi5p6X6KW/5Y6/XCIsXG5cdCAgICBcIjE1MDQyNVwiOiBcIuWFi+S7gOWFi+iFvuaXl1wiLFxuXHQgICAgXCIxNTA0MjZcIjogXCLnv4HniZvnibnml5dcIixcblx0ICAgIFwiMTUwNDI4XCI6IFwi5ZaA5ZaH5rKB5peXXCIsXG5cdCAgICBcIjE1MDQyOVwiOiBcIuWugeWfjuWOv1wiLFxuXHQgICAgXCIxNTA0MzBcIjogXCLmlZbmsYnml5dcIixcblx0ICAgIFwiMTUwNDMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDUwMFwiOiBcIumAmui+veW4glwiLFxuXHQgICAgXCIxNTA1MDJcIjogXCLnp5HlsJTmsoHljLpcIixcblx0ICAgIFwiMTUwNTIxXCI6IFwi56eR5bCU5rKB5bem57+85Lit5peXXCIsXG5cdCAgICBcIjE1MDUyMlwiOiBcIuenkeWwlOaygeW3pue/vOWQjuaXl1wiLFxuXHQgICAgXCIxNTA1MjNcIjogXCLlvIDpsoHljr9cIixcblx0ICAgIFwiMTUwNTI0XCI6IFwi5bqT5Lym5peXXCIsXG5cdCAgICBcIjE1MDUyNVwiOiBcIuWliOabvOaXl1wiLFxuXHQgICAgXCIxNTA1MjZcIjogXCLmiY7psoHnibnml5dcIixcblx0ICAgIFwiMTUwNTgxXCI6IFwi6ZyN5p6X6YOt5YuS5biCXCIsXG5cdCAgICBcIjE1MDU4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNTA2MDBcIjogXCLphILlsJTlpJrmlq/luIJcIixcblx0ICAgIFwiMTUwNjAyXCI6IFwi5Lic6IOc5Yy6XCIsXG5cdCAgICBcIjE1MDYyMVwiOiBcIui+vuaLieeJueaXl1wiLFxuXHQgICAgXCIxNTA2MjJcIjogXCLlh4bmoLzlsJTml5dcIixcblx0ICAgIFwiMTUwNjIzXCI6IFwi6YSC5omY5YWL5YmN5peXXCIsXG5cdCAgICBcIjE1MDYyNFwiOiBcIumEguaJmOWFi+aXl1wiLFxuXHQgICAgXCIxNTA2MjVcIjogXCLmna3plKbml5dcIixcblx0ICAgIFwiMTUwNjI2XCI6IFwi5LmM5a6h5peXXCIsXG5cdCAgICBcIjE1MDYyN1wiOiBcIuS8iumHkemcjea0m+aXl1wiLFxuXHQgICAgXCIxNTA2MjhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTUwNzAwXCI6IFwi5ZG85Lym6LSd5bCU5biCXCIsXG5cdCAgICBcIjE1MDcwMlwiOiBcIua1t+aLieWwlOWMulwiLFxuXHQgICAgXCIxNTA3MDNcIjogXCLmiY7otYnor7rlsJTljLpcIixcblx0ICAgIFwiMTUwNzIxXCI6IFwi6Zi/6I2j5peXXCIsXG5cdCAgICBcIjE1MDcyMlwiOiBcIuiOq+WKm+i+vueTpui+vuaWoeWwlOaXj+iHquayu+aXl1wiLFxuXHQgICAgXCIxNTA3MjNcIjogXCLphILkvKbmmKXoh6rmsrvml5dcIixcblx0ICAgIFwiMTUwNzI0XCI6IFwi6YSC5rip5YWL5peP6Ieq5rK75peXXCIsXG5cdCAgICBcIjE1MDcyNVwiOiBcIumZiOW3tOWwlOiZjuaXl1wiLFxuXHQgICAgXCIxNTA3MjZcIjogXCLmlrDlt7TlsJTomY7lt6bml5dcIixcblx0ICAgIFwiMTUwNzI3XCI6IFwi5paw5be05bCU6JmO5Y+z5peXXCIsXG5cdCAgICBcIjE1MDc4MVwiOiBcIua7oea0sumHjOW4glwiLFxuXHQgICAgXCIxNTA3ODJcIjogXCLniZnlhYvnn7PluIJcIixcblx0ICAgIFwiMTUwNzgzXCI6IFwi5omO5YWw5bGv5biCXCIsXG5cdCAgICBcIjE1MDc4NFwiOiBcIumineWwlOWPpOe6s+W4glwiLFxuXHQgICAgXCIxNTA3ODVcIjogXCLmoLnmsrPluIJcIixcblx0ICAgIFwiMTUwNzg2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDgwMFwiOiBcIuW3tOW9pua3luWwlOW4glwiLFxuXHQgICAgXCIxNTA4MDJcIjogXCLkuLTmsrPljLpcIixcblx0ICAgIFwiMTUwODIxXCI6IFwi5LqU5Y6f5Y6/XCIsXG5cdCAgICBcIjE1MDgyMlwiOiBcIuejtOWPo+WOv1wiLFxuXHQgICAgXCIxNTA4MjNcIjogXCLkuYzmi4nnibnliY3ml5dcIixcblx0ICAgIFwiMTUwODI0XCI6IFwi5LmM5ouJ54m55Lit5peXXCIsXG5cdCAgICBcIjE1MDgyNVwiOiBcIuS5jOaLieeJueWQjuaXl1wiLFxuXHQgICAgXCIxNTA4MjZcIjogXCLmna3plKblkI7ml5dcIixcblx0ICAgIFwiMTUwODI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MDkwMFwiOiBcIuS5jOWFsOWvn+W4g+W4glwiLFxuXHQgICAgXCIxNTA5MDJcIjogXCLpm4blroHljLpcIixcblx0ICAgIFwiMTUwOTIxXCI6IFwi5Y2T6LWE5Y6/XCIsXG5cdCAgICBcIjE1MDkyMlwiOiBcIuWMluW+t+WOv1wiLFxuXHQgICAgXCIxNTA5MjNcIjogXCLllYbpg73ljr9cIixcblx0ICAgIFwiMTUwOTI0XCI6IFwi5YW05ZKM5Y6/XCIsXG5cdCAgICBcIjE1MDkyNVwiOiBcIuWHieWfjuWOv1wiLFxuXHQgICAgXCIxNTA5MjZcIjogXCLlr5/lk4jlsJTlj7Pnv7zliY3ml5dcIixcblx0ICAgIFwiMTUwOTI3XCI6IFwi5a+f5ZOI5bCU5Y+z57+85Lit5peXXCIsXG5cdCAgICBcIjE1MDkyOFwiOiBcIuWvn+WTiOWwlOWPs+e/vOWQjuaXl1wiLFxuXHQgICAgXCIxNTA5MjlcIjogXCLlm5vlrZDnjovml5dcIixcblx0ICAgIFwiMTUwOTgxXCI6IFwi5Liw6ZWH5biCXCIsXG5cdCAgICBcIjE1MDk4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIxNTIyMDBcIjogXCLlhbTlronnm59cIixcblx0ICAgIFwiMTUyMjAxXCI6IFwi5LmM5YWw5rWp54m55biCXCIsXG5cdCAgICBcIjE1MjIwMlwiOiBcIumYv+WwlOWxseW4glwiLFxuXHQgICAgXCIxNTIyMjFcIjogXCLnp5HlsJTmsoHlj7Pnv7zliY3ml5dcIixcblx0ICAgIFwiMTUyMjIyXCI6IFwi56eR5bCU5rKB5Y+z57+85Lit5peXXCIsXG5cdCAgICBcIjE1MjIyM1wiOiBcIuaJjui1ieeJueaXl1wiLFxuXHQgICAgXCIxNTIyMjRcIjogXCLnqoHms4nljr9cIixcblx0ICAgIFwiMTUyMjI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjE1MjUwMFwiOiBcIumUoeael+mDreWLkuebn1wiLFxuXHQgICAgXCIxNTI1MDFcIjogXCLkuozov57mtannibnluIJcIixcblx0ICAgIFwiMTUyNTAyXCI6IFwi6ZSh5p6X5rWp54m55biCXCIsXG5cdCAgICBcIjE1MjUyMlwiOiBcIumYv+W3tOWYjuaXl1wiLFxuXHQgICAgXCIxNTI1MjNcIjogXCLoi4/lsLznibnlt6bml5dcIixcblx0ICAgIFwiMTUyNTI0XCI6IFwi6IuP5bC854m55Y+z5peXXCIsXG5cdCAgICBcIjE1MjUyNVwiOiBcIuS4nOS5jOePoOephuaygeaXl1wiLFxuXHQgICAgXCIxNTI1MjZcIjogXCLopb/kuYznj6DnqYbmsoHml5dcIixcblx0ICAgIFwiMTUyNTI3XCI6IFwi5aSq5LuG5a+65peXXCIsXG5cdCAgICBcIjE1MjUyOFwiOiBcIumVtum7hOaXl1wiLFxuXHQgICAgXCIxNTI1MjlcIjogXCLmraPplbbnmb3ml5dcIixcblx0ICAgIFwiMTUyNTMwXCI6IFwi5q2j6JOd5peXXCIsXG5cdCAgICBcIjE1MjUzMVwiOiBcIuWkmuS8puWOv1wiLFxuXHQgICAgXCIxNTI1MzJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMTUyOTAwXCI6IFwi6Zi/5ouJ5ZaE55ufXCIsXG5cdCAgICBcIjE1MjkyMVwiOiBcIumYv+aLieWWhOW3puaXl1wiLFxuXHQgICAgXCIxNTI5MjJcIjogXCLpmL/mi4nlloTlj7Pml5dcIixcblx0ICAgIFwiMTUyOTIzXCI6IFwi6aKd5rWO57qz5peXXCIsXG5cdCAgICBcIjE1MjkyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMTAwMDBcIjogXCLovr3lroHnnIFcIixcblx0ICAgIFwiMjEwMTAwXCI6IFwi5rKI6Ziz5biCXCIsXG5cdCAgICBcIjIxMDEwMlwiOiBcIuWSjOW5s+WMulwiLFxuXHQgICAgXCIyMTAxMDNcIjogXCLmsojmsrPljLpcIixcblx0ICAgIFwiMjEwMTA0XCI6IFwi5aSn5Lic5Yy6XCIsXG5cdCAgICBcIjIxMDEwNVwiOiBcIueah+WnkeWMulwiLFxuXHQgICAgXCIyMTAxMDZcIjogXCLpk4Hopb/ljLpcIixcblx0ICAgIFwiMjEwMTExXCI6IFwi6IuP5a625bGv5Yy6XCIsXG5cdCAgICBcIjIxMDExMlwiOiBcIuS4nOmZteWMulwiLFxuXHQgICAgXCIyMTAxMTNcIjogXCLmlrDln47lrZDljLpcIixcblx0ICAgIFwiMjEwMTE0XCI6IFwi5LqO5rSq5Yy6XCIsXG5cdCAgICBcIjIxMDEyMlwiOiBcIui+veS4reWOv1wiLFxuXHQgICAgXCIyMTAxMjNcIjogXCLlurflubPljr9cIixcblx0ICAgIFwiMjEwMTI0XCI6IFwi5rOV5bqT5Y6/XCIsXG5cdCAgICBcIjIxMDE4MVwiOiBcIuaWsOawkeW4glwiLFxuXHQgICAgXCIyMTAxODRcIjogXCLmsojljJfmlrDljLpcIixcblx0ICAgIFwiMjEwMTg1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDIwMFwiOiBcIuWkp+i/nuW4glwiLFxuXHQgICAgXCIyMTAyMDJcIjogXCLkuK3lsbHljLpcIixcblx0ICAgIFwiMjEwMjAzXCI6IFwi6KW/5bKX5Yy6XCIsXG5cdCAgICBcIjIxMDIwNFwiOiBcIuaymeays+WPo+WMulwiLFxuXHQgICAgXCIyMTAyMTFcIjogXCLnlJjkupXlrZDljLpcIixcblx0ICAgIFwiMjEwMjEyXCI6IFwi5peF6aG65Y+j5Yy6XCIsXG5cdCAgICBcIjIxMDIxM1wiOiBcIumHkeW3nuWMulwiLFxuXHQgICAgXCIyMTAyMjRcIjogXCLplb/mtbfljr9cIixcblx0ICAgIFwiMjEwMjgxXCI6IFwi55Om5oi/5bqX5biCXCIsXG5cdCAgICBcIjIxMDI4MlwiOiBcIuaZruWFsOW6l+W4glwiLFxuXHQgICAgXCIyMTAyODNcIjogXCLluoTmsrPluIJcIixcblx0ICAgIFwiMjEwMjk4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDMwMFwiOiBcIumejeWxseW4glwiLFxuXHQgICAgXCIyMTAzMDJcIjogXCLpk4HkuJzljLpcIixcblx0ICAgIFwiMjEwMzAzXCI6IFwi6ZOB6KW/5Yy6XCIsXG5cdCAgICBcIjIxMDMwNFwiOiBcIueri+WxseWMulwiLFxuXHQgICAgXCIyMTAzMTFcIjogXCLljYPlsbHljLpcIixcblx0ICAgIFwiMjEwMzIxXCI6IFwi5Y+w5a6J5Y6/XCIsXG5cdCAgICBcIjIxMDMyM1wiOiBcIuWyq+Wyqea7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTAzODFcIjogXCLmtbfln47luIJcIixcblx0ICAgIFwiMjEwMzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDQwMFwiOiBcIuaKmumhuuW4glwiLFxuXHQgICAgXCIyMTA0MDJcIjogXCLmlrDmiprljLpcIixcblx0ICAgIFwiMjEwNDAzXCI6IFwi5Lic5rSy5Yy6XCIsXG5cdCAgICBcIjIxMDQwNFwiOiBcIuacm+iKseWMulwiLFxuXHQgICAgXCIyMTA0MTFcIjogXCLpobrln47ljLpcIixcblx0ICAgIFwiMjEwNDIxXCI6IFwi5oqa6aG65Y6/XCIsXG5cdCAgICBcIjIxMDQyMlwiOiBcIuaWsOWuvua7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTA0MjNcIjogXCLmuIXljp/mu6Hml4/oh6rmsrvljr9cIixcblx0ICAgIFwiMjEwNDI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDUwMFwiOiBcIuacrOa6quW4glwiLFxuXHQgICAgXCIyMTA1MDJcIjogXCLlubPlsbHljLpcIixcblx0ICAgIFwiMjEwNTAzXCI6IFwi5rqq5rmW5Yy6XCIsXG5cdCAgICBcIjIxMDUwNFwiOiBcIuaYjuWxseWMulwiLFxuXHQgICAgXCIyMTA1MDVcIjogXCLljZfoiqzljLpcIixcblx0ICAgIFwiMjEwNTIxXCI6IFwi5pys5rqq5ruh5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjIxMDUyMlwiOiBcIuahk+S7gea7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTA1MjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjEwNjAwXCI6IFwi5Li55Lic5biCXCIsXG5cdCAgICBcIjIxMDYwMlwiOiBcIuWFg+WuneWMulwiLFxuXHQgICAgXCIyMTA2MDNcIjogXCLmjK/lhbTljLpcIixcblx0ICAgIFwiMjEwNjA0XCI6IFwi5oyv5a6J5Yy6XCIsXG5cdCAgICBcIjIxMDYyNFwiOiBcIuWuveeUuOa7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTA2ODFcIjogXCLkuJzmuK/luIJcIixcblx0ICAgIFwiMjEwNjgyXCI6IFwi5Yek5Z+O5biCXCIsXG5cdCAgICBcIjIxMDY4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMTA3MDBcIjogXCLplKblt57luIJcIixcblx0ICAgIFwiMjEwNzAyXCI6IFwi5Y+k5aGU5Yy6XCIsXG5cdCAgICBcIjIxMDcwM1wiOiBcIuWHjOays+WMulwiLFxuXHQgICAgXCIyMTA3MTFcIjogXCLlpKrlkozljLpcIixcblx0ICAgIFwiMjEwNzI2XCI6IFwi6buR5bGx5Y6/XCIsXG5cdCAgICBcIjIxMDcyN1wiOiBcIuS5ieWOv1wiLFxuXHQgICAgXCIyMTA3ODFcIjogXCLlh4zmtbfluIJcIixcblx0ICAgIFwiMjEwNzgyXCI6IFwi5YyX6ZWH5biCXCIsXG5cdCAgICBcIjIxMDc4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMTA4MDBcIjogXCLokKXlj6PluIJcIixcblx0ICAgIFwiMjEwODAyXCI6IFwi56uZ5YmN5Yy6XCIsXG5cdCAgICBcIjIxMDgwM1wiOiBcIuilv+W4guWMulwiLFxuXHQgICAgXCIyMTA4MDRcIjogXCLpsoXpsbzlnIjljLpcIixcblx0ICAgIFwiMjEwODExXCI6IFwi6ICB6L655Yy6XCIsXG5cdCAgICBcIjIxMDg4MVwiOiBcIuebluW3nuW4glwiLFxuXHQgICAgXCIyMTA4ODJcIjogXCLlpKfnn7PmoaXluIJcIixcblx0ICAgIFwiMjEwODgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMDkwMFwiOiBcIumYnOaWsOW4glwiLFxuXHQgICAgXCIyMTA5MDJcIjogXCLmtbflt57ljLpcIixcblx0ICAgIFwiMjEwOTAzXCI6IFwi5paw6YKx5Yy6XCIsXG5cdCAgICBcIjIxMDkwNFwiOiBcIuWkquW5s+WMulwiLFxuXHQgICAgXCIyMTA5MDVcIjogXCLmuIXmsrPpl6jljLpcIixcblx0ICAgIFwiMjEwOTExXCI6IFwi57uG5rKz5Yy6XCIsXG5cdCAgICBcIjIxMDkyMVwiOiBcIumYnOaWsOiSmeWPpOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMTA5MjJcIjogXCLlvbDmrabljr9cIixcblx0ICAgIFwiMjEwOTIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTAwMFwiOiBcIui+vemYs+W4glwiLFxuXHQgICAgXCIyMTEwMDJcIjogXCLnmb3loZTljLpcIixcblx0ICAgIFwiMjExMDAzXCI6IFwi5paH5Zyj5Yy6XCIsXG5cdCAgICBcIjIxMTAwNFwiOiBcIuWuj+S8n+WMulwiLFxuXHQgICAgXCIyMTEwMDVcIjogXCLlvJPplb/lsq3ljLpcIixcblx0ICAgIFwiMjExMDExXCI6IFwi5aSq5a2Q5rKz5Yy6XCIsXG5cdCAgICBcIjIxMTAyMVwiOiBcIui+vemYs+WOv1wiLFxuXHQgICAgXCIyMTEwODFcIjogXCLnga/loZTluIJcIixcblx0ICAgIFwiMjExMDgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTEwMFwiOiBcIuebmOmUpuW4glwiLFxuXHQgICAgXCIyMTExMDJcIjogXCLlj4zlj7DlrZDljLpcIixcblx0ICAgIFwiMjExMTAzXCI6IFwi5YW06ZqG5Y+w5Yy6XCIsXG5cdCAgICBcIjIxMTEyMVwiOiBcIuWkp+a0vOWOv1wiLFxuXHQgICAgXCIyMTExMjJcIjogXCLnm5jlsbHljr9cIixcblx0ICAgIFwiMjExMTIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTIwMFwiOiBcIumTgeWyreW4glwiLFxuXHQgICAgXCIyMTEyMDJcIjogXCLpk7blt57ljLpcIixcblx0ICAgIFwiMjExMjA0XCI6IFwi5riF5rKz5Yy6XCIsXG5cdCAgICBcIjIxMTIyMVwiOiBcIumTgeWyreWOv1wiLFxuXHQgICAgXCIyMTEyMjNcIjogXCLopb/kuLDljr9cIixcblx0ICAgIFwiMjExMjI0XCI6IFwi5piM5Zu+5Y6/XCIsXG5cdCAgICBcIjIxMTI4MVwiOiBcIuiwg+WFteWxseW4glwiLFxuXHQgICAgXCIyMTEyODJcIjogXCLlvIDljp/luIJcIixcblx0ICAgIFwiMjExMjgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTMwMFwiOiBcIuacnemYs+W4glwiLFxuXHQgICAgXCIyMTEzMDJcIjogXCLlj4zloZTljLpcIixcblx0ICAgIFwiMjExMzAzXCI6IFwi6b6Z5Z+O5Yy6XCIsXG5cdCAgICBcIjIxMTMyMVwiOiBcIuacnemYs+WOv1wiLFxuXHQgICAgXCIyMTEzMjJcIjogXCLlu7rlubPljr9cIixcblx0ICAgIFwiMjExMzI0XCI6IFwi5ZaA5ZaH5rKB5bem57+86JKZ5Y+k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjIxMTM4MVwiOiBcIuWMl+elqOW4glwiLFxuXHQgICAgXCIyMTEzODJcIjogXCLlh4zmupDluIJcIixcblx0ICAgIFwiMjExMzgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIxMTQwMFwiOiBcIuiRq+iKpuWym+W4glwiLFxuXHQgICAgXCIyMTE0MDJcIjogXCLov57lsbHljLpcIixcblx0ICAgIFwiMjExNDAzXCI6IFwi6b6Z5riv5Yy6XCIsXG5cdCAgICBcIjIxMTQwNFwiOiBcIuWNl+elqOWMulwiLFxuXHQgICAgXCIyMTE0MjFcIjogXCLnu6XkuK3ljr9cIixcblx0ICAgIFwiMjExNDIyXCI6IFwi5bu65piM5Y6/XCIsXG5cdCAgICBcIjIxMTQ4MVwiOiBcIuWFtOWfjuW4glwiLFxuXHQgICAgXCIyMTE0ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjIwMDAwXCI6IFwi5ZCJ5p6X55yBXCIsXG5cdCAgICBcIjIyMDEwMFwiOiBcIumVv+aYpeW4glwiLFxuXHQgICAgXCIyMjAxMDJcIjogXCLljZflhbPljLpcIixcblx0ICAgIFwiMjIwMTAzXCI6IFwi5a695Z+O5Yy6XCIsXG5cdCAgICBcIjIyMDEwNFwiOiBcIuacnemYs+WMulwiLFxuXHQgICAgXCIyMjAxMDVcIjogXCLkuozpgZPljLpcIixcblx0ICAgIFwiMjIwMTA2XCI6IFwi57u/5Zut5Yy6XCIsXG5cdCAgICBcIjIyMDExMlwiOiBcIuWPjOmYs+WMulwiLFxuXHQgICAgXCIyMjAxMjJcIjogXCLlhpzlronljr9cIixcblx0ICAgIFwiMjIwMTgxXCI6IFwi5Lmd5Y+w5biCXCIsXG5cdCAgICBcIjIyMDE4MlwiOiBcIuamhuagkeW4glwiLFxuXHQgICAgXCIyMjAxODNcIjogXCLlvrfmg6DluIJcIixcblx0ICAgIFwiMjIwMTg4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIyMDIwMFwiOiBcIuWQieael+W4glwiLFxuXHQgICAgXCIyMjAyMDJcIjogXCLmmIzpgpHljLpcIixcblx0ICAgIFwiMjIwMjAzXCI6IFwi6b6Z5r2t5Yy6XCIsXG5cdCAgICBcIjIyMDIwNFwiOiBcIuiIueiQpeWMulwiLFxuXHQgICAgXCIyMjAyMTFcIjogXCLkuLDmu6HljLpcIixcblx0ICAgIFwiMjIwMjIxXCI6IFwi5rC45ZCJ5Y6/XCIsXG5cdCAgICBcIjIyMDI4MVwiOiBcIuibn+ays+W4glwiLFxuXHQgICAgXCIyMjAyODJcIjogXCLmoabnlLjluIJcIixcblx0ICAgIFwiMjIwMjgzXCI6IFwi6IiS5YWw5biCXCIsXG5cdCAgICBcIjIyMDI4NFwiOiBcIuejkOefs+W4glwiLFxuXHQgICAgXCIyMjAyODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjIwMzAwXCI6IFwi5Zub5bmz5biCXCIsXG5cdCAgICBcIjIyMDMwMlwiOiBcIumTgeilv+WMulwiLFxuXHQgICAgXCIyMjAzMDNcIjogXCLpk4HkuJzljLpcIixcblx0ICAgIFwiMjIwMzIyXCI6IFwi5qKo5qCR5Y6/XCIsXG5cdCAgICBcIjIyMDMyM1wiOiBcIuS8iumAmua7oeaXj+iHquayu+WOv1wiLFxuXHQgICAgXCIyMjAzODFcIjogXCLlhazkuLvlsq3luIJcIixcblx0ICAgIFwiMjIwMzgyXCI6IFwi5Y+M6L695biCXCIsXG5cdCAgICBcIjIyMDM4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMjA0MDBcIjogXCLovr3mupDluIJcIixcblx0ICAgIFwiMjIwNDAyXCI6IFwi6b6Z5bGx5Yy6XCIsXG5cdCAgICBcIjIyMDQwM1wiOiBcIuilv+WuieWMulwiLFxuXHQgICAgXCIyMjA0MjFcIjogXCLkuJzkuLDljr9cIixcblx0ICAgIFwiMjIwNDIyXCI6IFwi5Lic6L695Y6/XCIsXG5cdCAgICBcIjIyMDQyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMjA1MDBcIjogXCLpgJrljJbluIJcIixcblx0ICAgIFwiMjIwNTAyXCI6IFwi5Lic5piM5Yy6XCIsXG5cdCAgICBcIjIyMDUwM1wiOiBcIuS6jOmBk+axn+WMulwiLFxuXHQgICAgXCIyMjA1MjFcIjogXCLpgJrljJbljr9cIixcblx0ICAgIFwiMjIwNTIzXCI6IFwi6L6J5Y2X5Y6/XCIsXG5cdCAgICBcIjIyMDUyNFwiOiBcIuafs+ays+WOv1wiLFxuXHQgICAgXCIyMjA1ODFcIjogXCLmooXmsrPlj6PluIJcIixcblx0ICAgIFwiMjIwNTgyXCI6IFwi6ZuG5a6J5biCXCIsXG5cdCAgICBcIjIyMDU4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMjA2MDBcIjogXCLnmb3lsbHluIJcIixcblx0ICAgIFwiMjIwNjAyXCI6IFwi5rWR5rGf5Yy6XCIsXG5cdCAgICBcIjIyMDYyMVwiOiBcIuaKmuadvuWOv1wiLFxuXHQgICAgXCIyMjA2MjJcIjogXCLpnZblrofljr9cIixcblx0ICAgIFwiMjIwNjIzXCI6IFwi6ZW/55m95pyd6bKc5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjIyMDYyNVwiOiBcIuaxn+a6kOWMulwiLFxuXHQgICAgXCIyMjA2ODFcIjogXCLkuLTmsZ/luIJcIixcblx0ICAgIFwiMjIwNjgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIyMDcwMFwiOiBcIuadvuWOn+W4glwiLFxuXHQgICAgXCIyMjA3MDJcIjogXCLlroHmsZ/ljLpcIixcblx0ICAgIFwiMjIwNzIxXCI6IFwi5YmN6YOt5bCU572X5pav6JKZ5Y+k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjIyMDcyMlwiOiBcIumVv+WyreWOv1wiLFxuXHQgICAgXCIyMjA3MjNcIjogXCLkub7lronljr9cIixcblx0ICAgIFwiMjIwNzI0XCI6IFwi5om25L2Z5biCXCIsXG5cdCAgICBcIjIyMDcyNVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMjA4MDBcIjogXCLnmb3ln47luIJcIixcblx0ICAgIFwiMjIwODAyXCI6IFwi5rSu5YyX5Yy6XCIsXG5cdCAgICBcIjIyMDgyMVwiOiBcIumVh+i1ieWOv1wiLFxuXHQgICAgXCIyMjA4MjJcIjogXCLpgJrmpobljr9cIixcblx0ICAgIFwiMjIwODgxXCI6IFwi5rSu5Y2X5biCXCIsXG5cdCAgICBcIjIyMDg4MlwiOiBcIuWkp+WuieW4glwiLFxuXHQgICAgXCIyMjA4ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjIyNDAwXCI6IFwi5bu26L655pyd6bKc5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjIyMjQwMVwiOiBcIuW7tuWQieW4glwiLFxuXHQgICAgXCIyMjI0MDJcIjogXCLlm77ku6zluIJcIixcblx0ICAgIFwiMjIyNDAzXCI6IFwi5pWm5YyW5biCXCIsXG5cdCAgICBcIjIyMjQwNFwiOiBcIuePsuaYpeW4glwiLFxuXHQgICAgXCIyMjI0MDVcIjogXCLpvpnkupXluIJcIixcblx0ICAgIFwiMjIyNDA2XCI6IFwi5ZKM6b6Z5biCXCIsXG5cdCAgICBcIjIyMjQyNFwiOiBcIuaxqua4heWOv1wiLFxuXHQgICAgXCIyMjI0MjZcIjogXCLlronlm77ljr9cIixcblx0ICAgIFwiMjIyNDI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDAwMFwiOiBcIum7kem+meaxn+ecgVwiLFxuXHQgICAgXCIyMzAxMDBcIjogXCLlk4jlsJTmu6jluIJcIixcblx0ICAgIFwiMjMwMTAyXCI6IFwi6YGT6YeM5Yy6XCIsXG5cdCAgICBcIjIzMDEwM1wiOiBcIuWNl+Wyl+WMulwiLFxuXHQgICAgXCIyMzAxMDRcIjogXCLpgZPlpJbljLpcIixcblx0ICAgIFwiMjMwMTA2XCI6IFwi6aaZ5Z2K5Yy6XCIsXG5cdCAgICBcIjIzMDEwOFwiOiBcIuW5s+aIv+WMulwiLFxuXHQgICAgXCIyMzAxMDlcIjogXCLmnb7ljJfljLpcIixcblx0ICAgIFwiMjMwMTExXCI6IFwi5ZG85YWw5Yy6XCIsXG5cdCAgICBcIjIzMDEyM1wiOiBcIuS+neWFsOWOv1wiLFxuXHQgICAgXCIyMzAxMjRcIjogXCLmlrnmraPljr9cIixcblx0ICAgIFwiMjMwMTI1XCI6IFwi5a6+5Y6/XCIsXG5cdCAgICBcIjIzMDEyNlwiOiBcIuW3tOW9puWOv1wiLFxuXHQgICAgXCIyMzAxMjdcIjogXCLmnKjlhbDljr9cIixcblx0ICAgIFwiMjMwMTI4XCI6IFwi6YCa5rKz5Y6/XCIsXG5cdCAgICBcIjIzMDEyOVwiOiBcIuW7tuWvv+WOv1wiLFxuXHQgICAgXCIyMzAxODFcIjogXCLpmL/ln47ljLpcIixcblx0ICAgIFwiMjMwMTgyXCI6IFwi5Y+M5Z+O5biCXCIsXG5cdCAgICBcIjIzMDE4M1wiOiBcIuWwmuW/l+W4glwiLFxuXHQgICAgXCIyMzAxODRcIjogXCLkupTluLjluIJcIixcblx0ICAgIFwiMjMwMTg2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDIwMFwiOiBcIum9kOm9kOWTiOWwlOW4glwiLFxuXHQgICAgXCIyMzAyMDJcIjogXCLpvpnmspnljLpcIixcblx0ICAgIFwiMjMwMjAzXCI6IFwi5bu65Y2O5Yy6XCIsXG5cdCAgICBcIjIzMDIwNFwiOiBcIumTgemUi+WMulwiLFxuXHQgICAgXCIyMzAyMDVcIjogXCLmmILmmILmuqrljLpcIixcblx0ICAgIFwiMjMwMjA2XCI6IFwi5a+M5ouJ5bCU5Z+65Yy6XCIsXG5cdCAgICBcIjIzMDIwN1wiOiBcIueivuWtkOWxseWMulwiLFxuXHQgICAgXCIyMzAyMDhcIjogXCLmooXph4zmlq/ovr7mlqHlsJTml4/ljLpcIixcblx0ICAgIFwiMjMwMjIxXCI6IFwi6b6Z5rGf5Y6/XCIsXG5cdCAgICBcIjIzMDIyM1wiOiBcIuS+neWuieWOv1wiLFxuXHQgICAgXCIyMzAyMjRcIjogXCLms7DmnaXljr9cIixcblx0ICAgIFwiMjMwMjI1XCI6IFwi55SY5Y2X5Y6/XCIsXG5cdCAgICBcIjIzMDIyN1wiOiBcIuWvjOijleWOv1wiLFxuXHQgICAgXCIyMzAyMjlcIjogXCLlhYvlsbHljr9cIixcblx0ICAgIFwiMjMwMjMwXCI6IFwi5YWL5Lic5Y6/XCIsXG5cdCAgICBcIjIzMDIzMVwiOiBcIuaLnOazieWOv1wiLFxuXHQgICAgXCIyMzAyODFcIjogXCLorrfmsrPluIJcIixcblx0ICAgIFwiMjMwMjgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDMwMFwiOiBcIum4oeilv+W4glwiLFxuXHQgICAgXCIyMzAzMDJcIjogXCLpuKHlhqDljLpcIixcblx0ICAgIFwiMjMwMzAzXCI6IFwi5oGS5bGx5Yy6XCIsXG5cdCAgICBcIjIzMDMwNFwiOiBcIua7tOmBk+WMulwiLFxuXHQgICAgXCIyMzAzMDVcIjogXCLmoqjmoJHljLpcIixcblx0ICAgIFwiMjMwMzA2XCI6IFwi5Z+O5a2Q5rKz5Yy6XCIsXG5cdCAgICBcIjIzMDMwN1wiOiBcIum6u+WxseWMulwiLFxuXHQgICAgXCIyMzAzMjFcIjogXCLpuKHkuJzljr9cIixcblx0ICAgIFwiMjMwMzgxXCI6IFwi6JmO5p6X5biCXCIsXG5cdCAgICBcIjIzMDM4MlwiOiBcIuWvhuWxseW4glwiLFxuXHQgICAgXCIyMzAzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMjMwNDAwXCI6IFwi6bmk5bKX5biCXCIsXG5cdCAgICBcIjIzMDQwMlwiOiBcIuWQkemYs+WMulwiLFxuXHQgICAgXCIyMzA0MDNcIjogXCLlt6XlhpzljLpcIixcblx0ICAgIFwiMjMwNDA0XCI6IFwi5Y2X5bGx5Yy6XCIsXG5cdCAgICBcIjIzMDQwNVwiOiBcIuWFtOWuieWMulwiLFxuXHQgICAgXCIyMzA0MDZcIjogXCLkuJzlsbHljLpcIixcblx0ICAgIFwiMjMwNDA3XCI6IFwi5YW05bGx5Yy6XCIsXG5cdCAgICBcIjIzMDQyMVwiOiBcIuiQneWMl+WOv1wiLFxuXHQgICAgXCIyMzA0MjJcIjogXCLnu6Xmu6jljr9cIixcblx0ICAgIFwiMjMwNDIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDUwMFwiOiBcIuWPjOm4reWxseW4glwiLFxuXHQgICAgXCIyMzA1MDJcIjogXCLlsJblsbHljLpcIixcblx0ICAgIFwiMjMwNTAzXCI6IFwi5bKt5Lic5Yy6XCIsXG5cdCAgICBcIjIzMDUwNVwiOiBcIuWbm+aWueWPsOWMulwiLFxuXHQgICAgXCIyMzA1MDZcIjogXCLlrp3lsbHljLpcIixcblx0ICAgIFwiMjMwNTIxXCI6IFwi6ZuG6LSk5Y6/XCIsXG5cdCAgICBcIjIzMDUyMlwiOiBcIuWPi+iwiuWOv1wiLFxuXHQgICAgXCIyMzA1MjNcIjogXCLlrp3muIXljr9cIixcblx0ICAgIFwiMjMwNTI0XCI6IFwi6aW25rKz5Y6/XCIsXG5cdCAgICBcIjIzMDUyNVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzA2MDBcIjogXCLlpKfluobluIJcIixcblx0ICAgIFwiMjMwNjAyXCI6IFwi6JCo5bCU5Zu+5Yy6XCIsXG5cdCAgICBcIjIzMDYwM1wiOiBcIum+meWHpOWMulwiLFxuXHQgICAgXCIyMzA2MDRcIjogXCLorqnog6Hot6/ljLpcIixcblx0ICAgIFwiMjMwNjA1XCI6IFwi57qi5bKX5Yy6XCIsXG5cdCAgICBcIjIzMDYwNlwiOiBcIuWkp+WQjOWMulwiLFxuXHQgICAgXCIyMzA2MjFcIjogXCLogoflt57ljr9cIixcblx0ICAgIFwiMjMwNjIyXCI6IFwi6IKH5rqQ5Y6/XCIsXG5cdCAgICBcIjIzMDYyM1wiOiBcIuael+eUuOWOv1wiLFxuXHQgICAgXCIyMzA2MjRcIjogXCLmnZzlsJTkvK/nibnokpnlj6Tml4/oh6rmsrvljr9cIixcblx0ICAgIFwiMjMwNjI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMDcwMFwiOiBcIuS8iuaYpeW4glwiLFxuXHQgICAgXCIyMzA3MDJcIjogXCLkvIrmmKXljLpcIixcblx0ICAgIFwiMjMwNzAzXCI6IFwi5Y2X5bKU5Yy6XCIsXG5cdCAgICBcIjIzMDcwNFwiOiBcIuWPi+WlveWMulwiLFxuXHQgICAgXCIyMzA3MDVcIjogXCLopb/mnpfljLpcIixcblx0ICAgIFwiMjMwNzA2XCI6IFwi57+g5bOm5Yy6XCIsXG5cdCAgICBcIjIzMDcwN1wiOiBcIuaWsOmdkuWMulwiLFxuXHQgICAgXCIyMzA3MDhcIjogXCLnvo7muqrljLpcIixcblx0ICAgIFwiMjMwNzA5XCI6IFwi6YeR5bGx5bGv5Yy6XCIsXG5cdCAgICBcIjIzMDcxMFwiOiBcIuS6lOiQpeWMulwiLFxuXHQgICAgXCIyMzA3MTFcIjogXCLkuYzpqazmsrPljLpcIixcblx0ICAgIFwiMjMwNzEyXCI6IFwi5rGk5pe65rKz5Yy6XCIsXG5cdCAgICBcIjIzMDcxM1wiOiBcIuW4puWyreWMulwiLFxuXHQgICAgXCIyMzA3MTRcIjogXCLkuYzkvIrlsq3ljLpcIixcblx0ICAgIFwiMjMwNzE1XCI6IFwi57qi5pif5Yy6XCIsXG5cdCAgICBcIjIzMDcxNlwiOiBcIuS4iueUmOWyreWMulwiLFxuXHQgICAgXCIyMzA3MjJcIjogXCLlmInojavljr9cIixcblx0ICAgIFwiMjMwNzgxXCI6IFwi6ZOB5Yqb5biCXCIsXG5cdCAgICBcIjIzMDc4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzA4MDBcIjogXCLkvbPmnKjmlq/luIJcIixcblx0ICAgIFwiMjMwODAzXCI6IFwi5ZCR6Ziz5Yy6XCIsXG5cdCAgICBcIjIzMDgwNFwiOiBcIuWJjei/m+WMulwiLFxuXHQgICAgXCIyMzA4MDVcIjogXCLkuJzpo47ljLpcIixcblx0ICAgIFwiMjMwODExXCI6IFwi6YOK5Yy6XCIsXG5cdCAgICBcIjIzMDgyMlwiOiBcIuahpuWNl+WOv1wiLFxuXHQgICAgXCIyMzA4MjZcIjogXCLmoablt53ljr9cIixcblx0ICAgIFwiMjMwODI4XCI6IFwi5rGk5Y6f5Y6/XCIsXG5cdCAgICBcIjIzMDgzM1wiOiBcIuaKmui/nOWOv1wiLFxuXHQgICAgXCIyMzA4ODFcIjogXCLlkIzmsZ/luIJcIixcblx0ICAgIFwiMjMwODgyXCI6IFwi5a+M6ZSm5biCXCIsXG5cdCAgICBcIjIzMDg4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzA5MDBcIjogXCLkuIPlj7DmsrPluIJcIixcblx0ICAgIFwiMjMwOTAyXCI6IFwi5paw5YW05Yy6XCIsXG5cdCAgICBcIjIzMDkwM1wiOiBcIuahg+WxseWMulwiLFxuXHQgICAgXCIyMzA5MDRcIjogXCLojITlrZDmsrPljLpcIixcblx0ICAgIFwiMjMwOTIxXCI6IFwi5YuD5Yip5Y6/XCIsXG5cdCAgICBcIjIzMDkyMlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzEwMDBcIjogXCLniaHkuLnmsZ/luIJcIixcblx0ICAgIFwiMjMxMDAyXCI6IFwi5Lic5a6J5Yy6XCIsXG5cdCAgICBcIjIzMTAwM1wiOiBcIumYs+aYjuWMulwiLFxuXHQgICAgXCIyMzEwMDRcIjogXCLniLHmsJHljLpcIixcblx0ICAgIFwiMjMxMDA1XCI6IFwi6KW/5a6J5Yy6XCIsXG5cdCAgICBcIjIzMTAyNFwiOiBcIuS4nOWugeWOv1wiLFxuXHQgICAgXCIyMzEwMjVcIjogXCLmnpflj6Pljr9cIixcblx0ICAgIFwiMjMxMDgxXCI6IFwi57ul6Iqs5rKz5biCXCIsXG5cdCAgICBcIjIzMTA4M1wiOiBcIua1t+ael+W4glwiLFxuXHQgICAgXCIyMzEwODRcIjogXCLlroHlronluIJcIixcblx0ICAgIFwiMjMxMDg1XCI6IFwi56mG5qOx5biCXCIsXG5cdCAgICBcIjIzMTA4NlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIyMzExMDBcIjogXCLpu5HmsrPluIJcIixcblx0ICAgIFwiMjMxMTAyXCI6IFwi54ix6L6J5Yy6XCIsXG5cdCAgICBcIjIzMTEyMVwiOiBcIuWrqeaxn+WOv1wiLFxuXHQgICAgXCIyMzExMjNcIjogXCLpgIrlhYvljr9cIixcblx0ICAgIFwiMjMxMTI0XCI6IFwi5a2Z5ZC05Y6/XCIsXG5cdCAgICBcIjIzMTE4MVwiOiBcIuWMl+WuieW4glwiLFxuXHQgICAgXCIyMzExODJcIjogXCLkupTlpKfov57msaDluIJcIixcblx0ICAgIFwiMjMxMTgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMTIwMFwiOiBcIue7peWMluW4glwiLFxuXHQgICAgXCIyMzEyMDJcIjogXCLljJfmnpfljLpcIixcblx0ICAgIFwiMjMxMjIxXCI6IFwi5pyb5aWO5Y6/XCIsXG5cdCAgICBcIjIzMTIyMlwiOiBcIuWFsOilv+WOv1wiLFxuXHQgICAgXCIyMzEyMjNcIjogXCLpnZLlhojljr9cIixcblx0ICAgIFwiMjMxMjI0XCI6IFwi5bqG5a6J5Y6/XCIsXG5cdCAgICBcIjIzMTIyNVwiOiBcIuaYjuawtOWOv1wiLFxuXHQgICAgXCIyMzEyMjZcIjogXCLnu6Xmo7Hljr9cIixcblx0ICAgIFwiMjMxMjgxXCI6IFwi5a6J6L6+5biCXCIsXG5cdCAgICBcIjIzMTI4MlwiOiBcIuiCh+S4nOW4glwiLFxuXHQgICAgXCIyMzEyODNcIjogXCLmtbfkvKbluIJcIixcblx0ICAgIFwiMjMxMjg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjIzMjcwMFwiOiBcIuWkp+WFtOWuieWyreWcsOWMulwiLFxuXHQgICAgXCIyMzI3MDJcIjogXCLmnb7lsq3ljLpcIixcblx0ICAgIFwiMjMyNzAzXCI6IFwi5paw5p6X5Yy6XCIsXG5cdCAgICBcIjIzMjcwNFwiOiBcIuWRvOS4reWMulwiLFxuXHQgICAgXCIyMzI3MjFcIjogXCLlkbznjpvljr9cIixcblx0ICAgIFwiMjMyNzIyXCI6IFwi5aGU5rKz5Y6/XCIsXG5cdCAgICBcIjIzMjcyM1wiOiBcIua8oOays+WOv1wiLFxuXHQgICAgXCIyMzI3MjRcIjogXCLliqDmoLzovr7lpYfljLpcIixcblx0ICAgIFwiMjMyNzI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMxMDAwMFwiOiBcIuS4iua1t1wiLFxuXHQgICAgXCIzMTAxMDBcIjogXCLkuIrmtbfluIJcIixcblx0ICAgIFwiMzEwMTAxXCI6IFwi6buE5rWm5Yy6XCIsXG5cdCAgICBcIjMxMDEwNFwiOiBcIuW+kOaxh+WMulwiLFxuXHQgICAgXCIzMTAxMDVcIjogXCLplb/lroHljLpcIixcblx0ICAgIFwiMzEwMTA2XCI6IFwi6Z2Z5a6J5Yy6XCIsXG5cdCAgICBcIjMxMDEwN1wiOiBcIuaZrumZgOWMulwiLFxuXHQgICAgXCIzMTAxMDhcIjogXCLpl7jljJfljLpcIixcblx0ICAgIFwiMzEwMTA5XCI6IFwi6Jm55Y+j5Yy6XCIsXG5cdCAgICBcIjMxMDExMFwiOiBcIuadqOa1puWMulwiLFxuXHQgICAgXCIzMTAxMTJcIjogXCLpl7XooYzljLpcIixcblx0ICAgIFwiMzEwMTEzXCI6IFwi5a6d5bGx5Yy6XCIsXG5cdCAgICBcIjMxMDExNFwiOiBcIuWYieWumuWMulwiLFxuXHQgICAgXCIzMTAxMTVcIjogXCLmtabkuJzmlrDljLpcIixcblx0ICAgIFwiMzEwMTE2XCI6IFwi6YeR5bGx5Yy6XCIsXG5cdCAgICBcIjMxMDExN1wiOiBcIuadvuaxn+WMulwiLFxuXHQgICAgXCIzMTAxMThcIjogXCLpnZLmtabljLpcIixcblx0ICAgIFwiMzEwMTIwXCI6IFwi5aWJ6LSk5Yy6XCIsXG5cdCAgICBcIjMxMDIzMFwiOiBcIuW0h+aYjuWOv1wiLFxuXHQgICAgXCIzMTAyMzFcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwMDAwXCI6IFwi5rGf6IuP55yBXCIsXG5cdCAgICBcIjMyMDEwMFwiOiBcIuWNl+S6rOW4glwiLFxuXHQgICAgXCIzMjAxMDJcIjogXCLnjoTmrabljLpcIixcblx0ICAgIFwiMzIwMTA0XCI6IFwi56em5reu5Yy6XCIsXG5cdCAgICBcIjMyMDEwNVwiOiBcIuW7uumCuuWMulwiLFxuXHQgICAgXCIzMjAxMDZcIjogXCLpvJPmpbzljLpcIixcblx0ICAgIFwiMzIwMTExXCI6IFwi5rWm5Y+j5Yy6XCIsXG5cdCAgICBcIjMyMDExM1wiOiBcIuaglumcnuWMulwiLFxuXHQgICAgXCIzMjAxMTRcIjogXCLpm6joirHlj7DljLpcIixcblx0ICAgIFwiMzIwMTE1XCI6IFwi5rGf5a6B5Yy6XCIsXG5cdCAgICBcIjMyMDExNlwiOiBcIuWFreWQiOWMulwiLFxuXHQgICAgXCIzMjAxMjRcIjogXCLmuqfmsLTljLpcIixcblx0ICAgIFwiMzIwMTI1XCI6IFwi6auY5rez5Yy6XCIsXG5cdCAgICBcIjMyMDEyNlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMjAyMDBcIjogXCLml6DplKHluIJcIixcblx0ICAgIFwiMzIwMjAyXCI6IFwi5bSH5a6J5Yy6XCIsXG5cdCAgICBcIjMyMDIwM1wiOiBcIuWNl+mVv+WMulwiLFxuXHQgICAgXCIzMjAyMDRcIjogXCLljJfloZjljLpcIixcblx0ICAgIFwiMzIwMjA1XCI6IFwi6ZSh5bGx5Yy6XCIsXG5cdCAgICBcIjMyMDIwNlwiOiBcIuaDoOWxseWMulwiLFxuXHQgICAgXCIzMjAyMTFcIjogXCLmu6jmuZbljLpcIixcblx0ICAgIFwiMzIwMjgxXCI6IFwi5rGf6Zi05biCXCIsXG5cdCAgICBcIjMyMDI4MlwiOiBcIuWunOWFtOW4glwiLFxuXHQgICAgXCIzMjAyOTdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwMzAwXCI6IFwi5b6Q5bee5biCXCIsXG5cdCAgICBcIjMyMDMwMlwiOiBcIum8k+alvOWMulwiLFxuXHQgICAgXCIzMjAzMDNcIjogXCLkupHpvpnljLpcIixcblx0ICAgIFwiMzIwMzA1XCI6IFwi6LS+5rGq5Yy6XCIsXG5cdCAgICBcIjMyMDMxMVwiOiBcIuazieWxseWMulwiLFxuXHQgICAgXCIzMjAzMjFcIjogXCLkuLDljr9cIixcblx0ICAgIFwiMzIwMzIyXCI6IFwi5rKb5Y6/XCIsXG5cdCAgICBcIjMyMDMyM1wiOiBcIumTnOWxseWMulwiLFxuXHQgICAgXCIzMjAzMjRcIjogXCLnnaLlroHljr9cIixcblx0ICAgIFwiMzIwMzgxXCI6IFwi5paw5rKC5biCXCIsXG5cdCAgICBcIjMyMDM4MlwiOiBcIumCs+W3nuW4glwiLFxuXHQgICAgXCIzMjAzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwNDAwXCI6IFwi5bi45bee5biCXCIsXG5cdCAgICBcIjMyMDQwMlwiOiBcIuWkqeWugeWMulwiLFxuXHQgICAgXCIzMjA0MDRcIjogXCLpkp/mpbzljLpcIixcblx0ICAgIFwiMzIwNDA1XCI6IFwi5oia5aKF5aCw5Yy6XCIsXG5cdCAgICBcIjMyMDQxMVwiOiBcIuaWsOWMl+WMulwiLFxuXHQgICAgXCIzMjA0MTJcIjogXCLmrabov5vljLpcIixcblx0ICAgIFwiMzIwNDgxXCI6IFwi5rqn6Ziz5biCXCIsXG5cdCAgICBcIjMyMDQ4MlwiOiBcIumHkeWdm+W4glwiLFxuXHQgICAgXCIzMjA0ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwNTAwXCI6IFwi6IuP5bee5biCXCIsXG5cdCAgICBcIjMyMDUwNVwiOiBcIuiZjuS4mOWMulwiLFxuXHQgICAgXCIzMjA1MDZcIjogXCLlkLTkuK3ljLpcIixcblx0ICAgIFwiMzIwNTA3XCI6IFwi55u45Z+O5Yy6XCIsXG5cdCAgICBcIjMyMDUwOFwiOiBcIuWnkeiLj+WMulwiLFxuXHQgICAgXCIzMjA1ODFcIjogXCLluLjnhp/luIJcIixcblx0ICAgIFwiMzIwNTgyXCI6IFwi5byg5a625riv5biCXCIsXG5cdCAgICBcIjMyMDU4M1wiOiBcIuaYhuWxseW4glwiLFxuXHQgICAgXCIzMjA1ODRcIjogXCLlkLTmsZ/ljLpcIixcblx0ICAgIFwiMzIwNTg1XCI6IFwi5aSq5LuT5biCXCIsXG5cdCAgICBcIjMyMDU5NlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMjA2MDBcIjogXCLljZfpgJrluIJcIixcblx0ICAgIFwiMzIwNjAyXCI6IFwi5bSH5bed5Yy6XCIsXG5cdCAgICBcIjMyMDYxMVwiOiBcIua4r+mXuOWMulwiLFxuXHQgICAgXCIzMjA2MTJcIjogXCLpgJrlt57ljLpcIixcblx0ICAgIFwiMzIwNjIxXCI6IFwi5rW35a6J5Y6/XCIsXG5cdCAgICBcIjMyMDYyM1wiOiBcIuWmguS4nOWOv1wiLFxuXHQgICAgXCIzMjA2ODFcIjogXCLlkK/kuJzluIJcIixcblx0ICAgIFwiMzIwNjgyXCI6IFwi5aaC55qL5biCXCIsXG5cdCAgICBcIjMyMDY4NFwiOiBcIua1t+mXqOW4glwiLFxuXHQgICAgXCIzMjA2OTRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwNzAwXCI6IFwi6L+e5LqR5riv5biCXCIsXG5cdCAgICBcIjMyMDcwM1wiOiBcIui/nuS6keWMulwiLFxuXHQgICAgXCIzMjA3MDVcIjogXCLmlrDmtabljLpcIixcblx0ICAgIFwiMzIwNzA2XCI6IFwi5rW35bee5Yy6XCIsXG5cdCAgICBcIjMyMDcyMVwiOiBcIui1o+amhuWOv1wiLFxuXHQgICAgXCIzMjA3MjJcIjogXCLkuJzmtbfljr9cIixcblx0ICAgIFwiMzIwNzIzXCI6IFwi54GM5LqR5Y6/XCIsXG5cdCAgICBcIjMyMDcyNFwiOiBcIueBjOWNl+WOv1wiLFxuXHQgICAgXCIzMjA3MjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIwODAwXCI6IFwi5reu5a6J5biCXCIsXG5cdCAgICBcIjMyMDgwMlwiOiBcIua4heays+WMulwiLFxuXHQgICAgXCIzMjA4MDNcIjogXCLmt67lronljLpcIixcblx0ICAgIFwiMzIwODA0XCI6IFwi5reu6Zi05Yy6XCIsXG5cdCAgICBcIjMyMDgxMVwiOiBcIua4hea1puWMulwiLFxuXHQgICAgXCIzMjA4MjZcIjogXCLmtp/msLTljr9cIixcblx0ICAgIFwiMzIwODI5XCI6IFwi5rSq5rO95Y6/XCIsXG5cdCAgICBcIjMyMDgzMFwiOiBcIuebseecmeWOv1wiLFxuXHQgICAgXCIzMjA4MzFcIjogXCLph5HmuZbljr9cIixcblx0ICAgIFwiMzIwODMyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMyMDkwMFwiOiBcIuebkOWfjuW4glwiLFxuXHQgICAgXCIzMjA5MDJcIjogXCLkuq3muZbljLpcIixcblx0ICAgIFwiMzIwOTAzXCI6IFwi55uQ6YO95Yy6XCIsXG5cdCAgICBcIjMyMDkyMVwiOiBcIuWTjeawtOWOv1wiLFxuXHQgICAgXCIzMjA5MjJcIjogXCLmu6jmtbfljr9cIixcblx0ICAgIFwiMzIwOTIzXCI6IFwi6Zic5a6B5Y6/XCIsXG5cdCAgICBcIjMyMDkyNFwiOiBcIuWwhOmYs+WOv1wiLFxuXHQgICAgXCIzMjA5MjVcIjogXCLlu7rmuZbljr9cIixcblx0ICAgIFwiMzIwOTgxXCI6IFwi5Lic5Y+w5biCXCIsXG5cdCAgICBcIjMyMDk4MlwiOiBcIuWkp+S4sOW4glwiLFxuXHQgICAgXCIzMjA5ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIxMDAwXCI6IFwi5oms5bee5biCXCIsXG5cdCAgICBcIjMyMTAwMlwiOiBcIuW5v+mZteWMulwiLFxuXHQgICAgXCIzMjEwMDNcIjogXCLpgpfmsZ/ljLpcIixcblx0ICAgIFwiMzIxMDIzXCI6IFwi5a6d5bqU5Y6/XCIsXG5cdCAgICBcIjMyMTA4MVwiOiBcIuS7quW+geW4glwiLFxuXHQgICAgXCIzMjEwODRcIjogXCLpq5jpgq7luIJcIixcblx0ICAgIFwiMzIxMDg4XCI6IFwi5rGf6YO95Yy6XCIsXG5cdCAgICBcIjMyMTA5M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMjExMDBcIjogXCLplYfmsZ/luIJcIixcblx0ICAgIFwiMzIxMTAyXCI6IFwi5Lqs5Y+j5Yy6XCIsXG5cdCAgICBcIjMyMTExMVwiOiBcIua2puW3nuWMulwiLFxuXHQgICAgXCIzMjExMTJcIjogXCLkuLnlvpLljLpcIixcblx0ICAgIFwiMzIxMTgxXCI6IFwi5Li56Ziz5biCXCIsXG5cdCAgICBcIjMyMTE4MlwiOiBcIuaJrOS4reW4glwiLFxuXHQgICAgXCIzMjExODNcIjogXCLlj6XlrrnluIJcIixcblx0ICAgIFwiMzIxMTg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMyMTIwMFwiOiBcIuazsOW3nuW4glwiLFxuXHQgICAgXCIzMjEyMDJcIjogXCLmtbfpmbXljLpcIixcblx0ICAgIFwiMzIxMjAzXCI6IFwi6auY5riv5Yy6XCIsXG5cdCAgICBcIjMyMTI4MVwiOiBcIuWFtOWMluW4glwiLFxuXHQgICAgXCIzMjEyODJcIjogXCLpnZbmsZ/luIJcIixcblx0ICAgIFwiMzIxMjgzXCI6IFwi5rOw5YW05biCXCIsXG5cdCAgICBcIjMyMTI4NFwiOiBcIuWnnOWgsOWMulwiLFxuXHQgICAgXCIzMjEyODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzIxMzAwXCI6IFwi5a6/6L+B5biCXCIsXG5cdCAgICBcIjMyMTMwMlwiOiBcIuWuv+WfjuWMulwiLFxuXHQgICAgXCIzMjEzMTFcIjogXCLlrr/osavljLpcIixcblx0ICAgIFwiMzIxMzIyXCI6IFwi5rKt6Ziz5Y6/XCIsXG5cdCAgICBcIjMyMTMyM1wiOiBcIuazl+mYs+WOv1wiLFxuXHQgICAgXCIzMjEzMjRcIjogXCLms5fmtKrljr9cIixcblx0ICAgIFwiMzIxMzI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMDAwMFwiOiBcIua1meaxn+ecgVwiLFxuXHQgICAgXCIzMzAxMDBcIjogXCLmna3lt57luIJcIixcblx0ICAgIFwiMzMwMTAyXCI6IFwi5LiK5Z+O5Yy6XCIsXG5cdCAgICBcIjMzMDEwM1wiOiBcIuS4i+WfjuWMulwiLFxuXHQgICAgXCIzMzAxMDRcIjogXCLmsZ/lubLljLpcIixcblx0ICAgIFwiMzMwMTA1XCI6IFwi5oux5aKF5Yy6XCIsXG5cdCAgICBcIjMzMDEwNlwiOiBcIuilv+a5luWMulwiLFxuXHQgICAgXCIzMzAxMDhcIjogXCLmu6jmsZ/ljLpcIixcblx0ICAgIFwiMzMwMTA5XCI6IFwi6JCn5bGx5Yy6XCIsXG5cdCAgICBcIjMzMDExMFwiOiBcIuS9meadreWMulwiLFxuXHQgICAgXCIzMzAxMjJcIjogXCLmoZDlupDljr9cIixcblx0ICAgIFwiMzMwMTI3XCI6IFwi5rez5a6J5Y6/XCIsXG5cdCAgICBcIjMzMDE4MlwiOiBcIuW7uuW+t+W4glwiLFxuXHQgICAgXCIzMzAxODNcIjogXCLlr4zpmLPluIJcIixcblx0ICAgIFwiMzMwMTg1XCI6IFwi5Li05a6J5biCXCIsXG5cdCAgICBcIjMzMDE4NlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMzAyMDBcIjogXCLlroHms6LluIJcIixcblx0ICAgIFwiMzMwMjAzXCI6IFwi5rW35puZ5Yy6XCIsXG5cdCAgICBcIjMzMDIwNFwiOiBcIuaxn+S4nOWMulwiLFxuXHQgICAgXCIzMzAyMDVcIjogXCLmsZ/ljJfljLpcIixcblx0ICAgIFwiMzMwMjA2XCI6IFwi5YyX5LuR5Yy6XCIsXG5cdCAgICBcIjMzMDIxMVwiOiBcIumVh+a1t+WMulwiLFxuXHQgICAgXCIzMzAyMTJcIjogXCLphJ7lt57ljLpcIixcblx0ICAgIFwiMzMwMjI1XCI6IFwi6LGh5bGx5Y6/XCIsXG5cdCAgICBcIjMzMDIyNlwiOiBcIuWugea1t+WOv1wiLFxuXHQgICAgXCIzMzAyODFcIjogXCLkvZnlp5rluIJcIixcblx0ICAgIFwiMzMwMjgyXCI6IFwi5oWI5rqq5biCXCIsXG5cdCAgICBcIjMzMDI4M1wiOiBcIuWlieWMluW4glwiLFxuXHQgICAgXCIzMzAyODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzMwMzAwXCI6IFwi5rip5bee5biCXCIsXG5cdCAgICBcIjMzMDMwMlwiOiBcIum5v+WfjuWMulwiLFxuXHQgICAgXCIzMzAzMDNcIjogXCLpvpnmub7ljLpcIixcblx0ICAgIFwiMzMwMzA0XCI6IFwi55Ov5rW35Yy6XCIsXG5cdCAgICBcIjMzMDMyMlwiOiBcIua0nuWktOWOv1wiLFxuXHQgICAgXCIzMzAzMjRcIjogXCLmsLjlmInljr9cIixcblx0ICAgIFwiMzMwMzI2XCI6IFwi5bmz6Ziz5Y6/XCIsXG5cdCAgICBcIjMzMDMyN1wiOiBcIuiLjeWNl+WOv1wiLFxuXHQgICAgXCIzMzAzMjhcIjogXCLmlofmiJDljr9cIixcblx0ICAgIFwiMzMwMzI5XCI6IFwi5rOw6aG65Y6/XCIsXG5cdCAgICBcIjMzMDM4MVwiOiBcIueRnuWuieW4glwiLFxuXHQgICAgXCIzMzAzODJcIjogXCLkuZDmuIXluIJcIixcblx0ICAgIFwiMzMwMzgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMDQwMFwiOiBcIuWYieWFtOW4glwiLFxuXHQgICAgXCIzMzA0MDJcIjogXCLljZfmuZbljLpcIixcblx0ICAgIFwiMzMwNDExXCI6IFwi56eA5rSy5Yy6XCIsXG5cdCAgICBcIjMzMDQyMVwiOiBcIuWYieWWhOWOv1wiLFxuXHQgICAgXCIzMzA0MjRcIjogXCLmtbfnm5Dljr9cIixcblx0ICAgIFwiMzMwNDgxXCI6IFwi5rW35a6B5biCXCIsXG5cdCAgICBcIjMzMDQ4MlwiOiBcIuW5s+a5luW4glwiLFxuXHQgICAgXCIzMzA0ODNcIjogXCLmoZDkuaHluIJcIixcblx0ICAgIFwiMzMwNDg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMDUwMFwiOiBcIua5luW3nuW4glwiLFxuXHQgICAgXCIzMzA1MDJcIjogXCLlkLTlhbTljLpcIixcblx0ICAgIFwiMzMwNTAzXCI6IFwi5Y2X5rWU5Yy6XCIsXG5cdCAgICBcIjMzMDUyMVwiOiBcIuW+t+a4heWOv1wiLFxuXHQgICAgXCIzMzA1MjJcIjogXCLplb/lhbTljr9cIixcblx0ICAgIFwiMzMwNTIzXCI6IFwi5a6J5ZCJ5Y6/XCIsXG5cdCAgICBcIjMzMDUyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMzA2MDBcIjogXCLnu43lhbTluIJcIixcblx0ICAgIFwiMzMwNjAyXCI6IFwi6LaK5Z+O5Yy6XCIsXG5cdCAgICBcIjMzMDYyMVwiOiBcIue7jeWFtOWOv1wiLFxuXHQgICAgXCIzMzA2MjRcIjogXCLmlrDmmIzljr9cIixcblx0ICAgIFwiMzMwNjgxXCI6IFwi6K+45pqo5biCXCIsXG5cdCAgICBcIjMzMDY4MlwiOiBcIuS4iuiZnuW4glwiLFxuXHQgICAgXCIzMzA2ODNcIjogXCLltYrlt57luIJcIixcblx0ICAgIFwiMzMwNjg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMDcwMFwiOiBcIumHkeWNjuW4glwiLFxuXHQgICAgXCIzMzA3MDJcIjogXCLlqbrln47ljLpcIixcblx0ICAgIFwiMzMwNzAzXCI6IFwi6YeR5Lic5Yy6XCIsXG5cdCAgICBcIjMzMDcyM1wiOiBcIuatpuS5ieWOv1wiLFxuXHQgICAgXCIzMzA3MjZcIjogXCLmtabmsZ/ljr9cIixcblx0ICAgIFwiMzMwNzI3XCI6IFwi56OQ5a6J5Y6/XCIsXG5cdCAgICBcIjMzMDc4MVwiOiBcIuWFsOa6quW4glwiLFxuXHQgICAgXCIzMzA3ODJcIjogXCLkuYnkuYzluIJcIixcblx0ICAgIFwiMzMwNzgzXCI6IFwi5Lic6Ziz5biCXCIsXG5cdCAgICBcIjMzMDc4NFwiOiBcIuawuOW6t+W4glwiLFxuXHQgICAgXCIzMzA3ODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzMwODAwXCI6IFwi6KGi5bee5biCXCIsXG5cdCAgICBcIjMzMDgwMlwiOiBcIuafr+WfjuWMulwiLFxuXHQgICAgXCIzMzA4MDNcIjogXCLooaLmsZ/ljLpcIixcblx0ICAgIFwiMzMwODIyXCI6IFwi5bi45bGx5Y6/XCIsXG5cdCAgICBcIjMzMDgyNFwiOiBcIuW8gOWMluWOv1wiLFxuXHQgICAgXCIzMzA4MjVcIjogXCLpvpnmuLjljr9cIixcblx0ICAgIFwiMzMwODgxXCI6IFwi5rGf5bGx5biCXCIsXG5cdCAgICBcIjMzMDg4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMzA5MDBcIjogXCLoiJ/lsbHluIJcIixcblx0ICAgIFwiMzMwOTAyXCI6IFwi5a6a5rW35Yy6XCIsXG5cdCAgICBcIjMzMDkwM1wiOiBcIuaZrumZgOWMulwiLFxuXHQgICAgXCIzMzA5MjFcIjogXCLlsrHlsbHljr9cIixcblx0ICAgIFwiMzMwOTIyXCI6IFwi5bWK5rOX5Y6/XCIsXG5cdCAgICBcIjMzMDkyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzMzEwMDBcIjogXCLlj7Dlt57luIJcIixcblx0ICAgIFwiMzMxMDAyXCI6IFwi5qSS5rGf5Yy6XCIsXG5cdCAgICBcIjMzMTAwM1wiOiBcIum7hOWyqeWMulwiLFxuXHQgICAgXCIzMzEwMDRcIjogXCLot6/moaXljLpcIixcblx0ICAgIFwiMzMxMDIxXCI6IFwi546J546v5Y6/XCIsXG5cdCAgICBcIjMzMTAyMlwiOiBcIuS4iemXqOWOv1wiLFxuXHQgICAgXCIzMzEwMjNcIjogXCLlpKnlj7Dljr9cIixcblx0ICAgIFwiMzMxMDI0XCI6IFwi5LuZ5bGF5Y6/XCIsXG5cdCAgICBcIjMzMTA4MVwiOiBcIua4qeWyreW4glwiLFxuXHQgICAgXCIzMzEwODJcIjogXCLkuLTmtbfluIJcIixcblx0ICAgIFwiMzMxMDgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjMzMTEwMFwiOiBcIuS4veawtOW4glwiLFxuXHQgICAgXCIzMzExMDJcIjogXCLojrLpg73ljLpcIixcblx0ICAgIFwiMzMxMTIxXCI6IFwi6Z2S55Sw5Y6/XCIsXG5cdCAgICBcIjMzMTEyMlwiOiBcIue8meS6keWOv1wiLFxuXHQgICAgXCIzMzExMjNcIjogXCLpgYLmmIzljr9cIixcblx0ICAgIFwiMzMxMTI0XCI6IFwi5p2+6Ziz5Y6/XCIsXG5cdCAgICBcIjMzMTEyNVwiOiBcIuS6keWSjOWOv1wiLFxuXHQgICAgXCIzMzExMjZcIjogXCLluoblhYPljr9cIixcblx0ICAgIFwiMzMxMTI3XCI6IFwi5pmv5a6B55Wy5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjMzMTE4MVwiOiBcIum+meazieW4glwiLFxuXHQgICAgXCIzMzExODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwMDAwXCI6IFwi5a6J5b6955yBXCIsXG5cdCAgICBcIjM0MDEwMFwiOiBcIuWQiOiCpeW4glwiLFxuXHQgICAgXCIzNDAxMDJcIjogXCLnkbbmtbfljLpcIixcblx0ICAgIFwiMzQwMTAzXCI6IFwi5bqQ6Ziz5Yy6XCIsXG5cdCAgICBcIjM0MDEwNFwiOiBcIuicgOWxseWMulwiLFxuXHQgICAgXCIzNDAxMTFcIjogXCLljIXmsrPljLpcIixcblx0ICAgIFwiMzQwMTIxXCI6IFwi6ZW/5Liw5Y6/XCIsXG5cdCAgICBcIjM0MDEyMlwiOiBcIuiCpeS4nOWOv1wiLFxuXHQgICAgXCIzNDAxMjNcIjogXCLogqXopb/ljr9cIixcblx0ICAgIFwiMzQwMTkyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MDIwMFwiOiBcIuiKnOa5luW4glwiLFxuXHQgICAgXCIzNDAyMDJcIjogXCLplZzmuZbljLpcIixcblx0ICAgIFwiMzQwMjAzXCI6IFwi5byL5rGf5Yy6XCIsXG5cdCAgICBcIjM0MDIwN1wiOiBcIum4oOaxn+WMulwiLFxuXHQgICAgXCIzNDAyMDhcIjogXCLkuInlsbHljLpcIixcblx0ICAgIFwiMzQwMjIxXCI6IFwi6Iqc5rmW5Y6/XCIsXG5cdCAgICBcIjM0MDIyMlwiOiBcIue5geaYjOWOv1wiLFxuXHQgICAgXCIzNDAyMjNcIjogXCLljZfpmbXljr9cIixcblx0ICAgIFwiMzQwMjI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MDMwMFwiOiBcIuiajOWfoOW4glwiLFxuXHQgICAgXCIzNDAzMDJcIjogXCLpvpnlrZDmuZbljLpcIixcblx0ICAgIFwiMzQwMzAzXCI6IFwi6JqM5bGx5Yy6XCIsXG5cdCAgICBcIjM0MDMwNFwiOiBcIuemueS8muWMulwiLFxuXHQgICAgXCIzNDAzMTFcIjogXCLmt67kuIrljLpcIixcblx0ICAgIFwiMzQwMzIxXCI6IFwi5oCA6L+c5Y6/XCIsXG5cdCAgICBcIjM0MDMyMlwiOiBcIuS6lOays+WOv1wiLFxuXHQgICAgXCIzNDAzMjNcIjogXCLlm7rplYfljr9cIixcblx0ICAgIFwiMzQwMzI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MDQwMFwiOiBcIua3ruWNl+W4glwiLFxuXHQgICAgXCIzNDA0MDJcIjogXCLlpKfpgJrljLpcIixcblx0ICAgIFwiMzQwNDAzXCI6IFwi55Sw5a625bq15Yy6XCIsXG5cdCAgICBcIjM0MDQwNFwiOiBcIuiwouWutumbhuWMulwiLFxuXHQgICAgXCIzNDA0MDVcIjogXCLlhavlhazlsbHljLpcIixcblx0ICAgIFwiMzQwNDA2XCI6IFwi5r2Y6ZuG5Yy6XCIsXG5cdCAgICBcIjM0MDQyMVwiOiBcIuWHpOWPsOWOv1wiLFxuXHQgICAgXCIzNDA0MjJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwNTAwXCI6IFwi6ams6Z6N5bGx5biCXCIsXG5cdCAgICBcIjM0MDUwM1wiOiBcIuiKseWxseWMulwiLFxuXHQgICAgXCIzNDA1MDRcIjogXCLpm6jlsbHljLpcIixcblx0ICAgIFwiMzQwNTA2XCI6IFwi5Y2a5pyb5Yy6XCIsXG5cdCAgICBcIjM0MDUyMVwiOiBcIuW9k+a2guWOv1wiLFxuXHQgICAgXCIzNDA1MjJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwNjAwXCI6IFwi5reu5YyX5biCXCIsXG5cdCAgICBcIjM0MDYwMlwiOiBcIuadnOmbhuWMulwiLFxuXHQgICAgXCIzNDA2MDNcIjogXCLnm7jlsbHljLpcIixcblx0ICAgIFwiMzQwNjA0XCI6IFwi54OI5bGx5Yy6XCIsXG5cdCAgICBcIjM0MDYyMVwiOiBcIua/iea6quWOv1wiLFxuXHQgICAgXCIzNDA2MjJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwNzAwXCI6IFwi6ZOc6Zm15biCXCIsXG5cdCAgICBcIjM0MDcwMlwiOiBcIumTnOWumOWxseWMulwiLFxuXHQgICAgXCIzNDA3MDNcIjogXCLni67lrZDlsbHljLpcIixcblx0ICAgIFwiMzQwNzExXCI6IFwi6YOK5Yy6XCIsXG5cdCAgICBcIjM0MDcyMVwiOiBcIumTnOmZteWOv1wiLFxuXHQgICAgXCIzNDA3MjJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQwODAwXCI6IFwi5a6J5bqG5biCXCIsXG5cdCAgICBcIjM0MDgwMlwiOiBcIui/juaxn+WMulwiLFxuXHQgICAgXCIzNDA4MDNcIjogXCLlpKfop4LljLpcIixcblx0ICAgIFwiMzQwODExXCI6IFwi5a6c56eA5Yy6XCIsXG5cdCAgICBcIjM0MDgyMlwiOiBcIuaAgOWugeWOv1wiLFxuXHQgICAgXCIzNDA4MjNcIjogXCLmnp7pmLPljr9cIixcblx0ICAgIFwiMzQwODI0XCI6IFwi5r2c5bGx5Y6/XCIsXG5cdCAgICBcIjM0MDgyNVwiOiBcIuWkqua5luWOv1wiLFxuXHQgICAgXCIzNDA4MjZcIjogXCLlrr/mnb7ljr9cIixcblx0ICAgIFwiMzQwODI3XCI6IFwi5pyb5rGf5Y6/XCIsXG5cdCAgICBcIjM0MDgyOFwiOiBcIuWys+ilv+WOv1wiLFxuXHQgICAgXCIzNDA4ODFcIjogXCLmoZDln47luIJcIixcblx0ICAgIFwiMzQwODgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MTAwMFwiOiBcIum7hOWxseW4glwiLFxuXHQgICAgXCIzNDEwMDJcIjogXCLlsa/muqrljLpcIixcblx0ICAgIFwiMzQxMDAzXCI6IFwi6buE5bGx5Yy6XCIsXG5cdCAgICBcIjM0MTAwNFwiOiBcIuW+veW3nuWMulwiLFxuXHQgICAgXCIzNDEwMjFcIjogXCLmrZnljr9cIixcblx0ICAgIFwiMzQxMDIyXCI6IFwi5LyR5a6B5Y6/XCIsXG5cdCAgICBcIjM0MTAyM1wiOiBcIum7n+WOv1wiLFxuXHQgICAgXCIzNDEwMjRcIjogXCLnpYHpl6jljr9cIixcblx0ICAgIFwiMzQxMDI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MTEwMFwiOiBcIua7geW3nuW4glwiLFxuXHQgICAgXCIzNDExMDJcIjogXCLnkIXnkIrljLpcIixcblx0ICAgIFwiMzQxMTAzXCI6IFwi5Y2X6LCv5Yy6XCIsXG5cdCAgICBcIjM0MTEyMlwiOiBcIuadpeWuieWOv1wiLFxuXHQgICAgXCIzNDExMjRcIjogXCLlhajmpJLljr9cIixcblx0ICAgIFwiMzQxMTI1XCI6IFwi5a6a6L+c5Y6/XCIsXG5cdCAgICBcIjM0MTEyNlwiOiBcIuWHpOmYs+WOv1wiLFxuXHQgICAgXCIzNDExODFcIjogXCLlpKnplb/luIJcIixcblx0ICAgIFwiMzQxMTgyXCI6IFwi5piO5YWJ5biCXCIsXG5cdCAgICBcIjM0MTE4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNDEyMDBcIjogXCLpmJzpmLPluIJcIixcblx0ICAgIFwiMzQxMjAyXCI6IFwi6aKN5bee5Yy6XCIsXG5cdCAgICBcIjM0MTIwM1wiOiBcIumijeS4nOWMulwiLFxuXHQgICAgXCIzNDEyMDRcIjogXCLpoo3ms4nljLpcIixcblx0ICAgIFwiMzQxMjIxXCI6IFwi5Li05rOJ5Y6/XCIsXG5cdCAgICBcIjM0MTIyMlwiOiBcIuWkquWSjOWOv1wiLFxuXHQgICAgXCIzNDEyMjVcIjogXCLpmJzljZfljr9cIixcblx0ICAgIFwiMzQxMjI2XCI6IFwi6aKN5LiK5Y6/XCIsXG5cdCAgICBcIjM0MTI4MlwiOiBcIueVjOmmluW4glwiLFxuXHQgICAgXCIzNDEyODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQxMzAwXCI6IFwi5a6/5bee5biCXCIsXG5cdCAgICBcIjM0MTMwMlwiOiBcIuWfh+ahpeWMulwiLFxuXHQgICAgXCIzNDEzMjFcIjogXCLnoIDlsbHljr9cIixcblx0ICAgIFwiMzQxMzIyXCI6IFwi6JCn5Y6/XCIsXG5cdCAgICBcIjM0MTMyM1wiOiBcIueBteeSp+WOv1wiLFxuXHQgICAgXCIzNDEzMjRcIjogXCLms5fljr9cIixcblx0ICAgIFwiMzQxMzI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM0MTQwMFwiOiBcIuW3oua5luW4glwiLFxuXHQgICAgXCIzNDE0MjFcIjogXCLlupDmsZ/ljr9cIixcblx0ICAgIFwiMzQxNDIyXCI6IFwi5peg5Li65Y6/XCIsXG5cdCAgICBcIjM0MTQyM1wiOiBcIuWQq+WxseWOv1wiLFxuXHQgICAgXCIzNDE0MjRcIjogXCLlkozljr9cIixcblx0ICAgIFwiMzQxNTAwXCI6IFwi5YWt5a6J5biCXCIsXG5cdCAgICBcIjM0MTUwMlwiOiBcIumHkeWuieWMulwiLFxuXHQgICAgXCIzNDE1MDNcIjogXCLoo5XlronljLpcIixcblx0ICAgIFwiMzQxNTIxXCI6IFwi5a+/5Y6/XCIsXG5cdCAgICBcIjM0MTUyMlwiOiBcIumcjemCseWOv1wiLFxuXHQgICAgXCIzNDE1MjNcIjogXCLoiJLln47ljr9cIixcblx0ICAgIFwiMzQxNTI0XCI6IFwi6YeR5a+o5Y6/XCIsXG5cdCAgICBcIjM0MTUyNVwiOiBcIumcjeWxseWOv1wiLFxuXHQgICAgXCIzNDE1MjZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQxNjAwXCI6IFwi5Lqz5bee5biCXCIsXG5cdCAgICBcIjM0MTYwMlwiOiBcIuiwr+WfjuWMulwiLFxuXHQgICAgXCIzNDE2MjFcIjogXCLmtqHpmLPljr9cIixcblx0ICAgIFwiMzQxNjIyXCI6IFwi6JKZ5Z+O5Y6/XCIsXG5cdCAgICBcIjM0MTYyM1wiOiBcIuWIqei+m+WOv1wiLFxuXHQgICAgXCIzNDE2MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQxNzAwXCI6IFwi5rGg5bee5biCXCIsXG5cdCAgICBcIjM0MTcwMlwiOiBcIui0teaxoOWMulwiLFxuXHQgICAgXCIzNDE3MjFcIjogXCLkuJzoh7Pljr9cIixcblx0ICAgIFwiMzQxNzIyXCI6IFwi55+z5Y+w5Y6/XCIsXG5cdCAgICBcIjM0MTcyM1wiOiBcIumdkumYs+WOv1wiLFxuXHQgICAgXCIzNDE3MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzQxODAwXCI6IFwi5a6j5Z+O5biCXCIsXG5cdCAgICBcIjM0MTgwMlwiOiBcIuWuo+W3nuWMulwiLFxuXHQgICAgXCIzNDE4MjFcIjogXCLpg47muqrljr9cIixcblx0ICAgIFwiMzQxODIyXCI6IFwi5bm/5b635Y6/XCIsXG5cdCAgICBcIjM0MTgyM1wiOiBcIuazvuWOv1wiLFxuXHQgICAgXCIzNDE4MjRcIjogXCLnu6nmuqrljr9cIixcblx0ICAgIFwiMzQxODI1XCI6IFwi5peM5b635Y6/XCIsXG5cdCAgICBcIjM0MTg4MVwiOiBcIuWugeWbveW4glwiLFxuXHQgICAgXCIzNDE4ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwMDAwXCI6IFwi56aP5bu655yBXCIsXG5cdCAgICBcIjM1MDEwMFwiOiBcIuemj+W3nuW4glwiLFxuXHQgICAgXCIzNTAxMDJcIjogXCLpvJPmpbzljLpcIixcblx0ICAgIFwiMzUwMTAzXCI6IFwi5Y+w5rGf5Yy6XCIsXG5cdCAgICBcIjM1MDEwNFwiOiBcIuS7k+WxseWMulwiLFxuXHQgICAgXCIzNTAxMDVcIjogXCLpqazlsL7ljLpcIixcblx0ICAgIFwiMzUwMTExXCI6IFwi5pmL5a6J5Yy6XCIsXG5cdCAgICBcIjM1MDEyMVwiOiBcIumXveS+r+WOv1wiLFxuXHQgICAgXCIzNTAxMjJcIjogXCLov57msZ/ljr9cIixcblx0ICAgIFwiMzUwMTIzXCI6IFwi572X5rqQ5Y6/XCIsXG5cdCAgICBcIjM1MDEyNFwiOiBcIumXvea4heWOv1wiLFxuXHQgICAgXCIzNTAxMjVcIjogXCLmsLjms7Dljr9cIixcblx0ICAgIFwiMzUwMTI4XCI6IFwi5bmz5r2t5Y6/XCIsXG5cdCAgICBcIjM1MDE4MVwiOiBcIuemj+a4heW4glwiLFxuXHQgICAgXCIzNTAxODJcIjogXCLplb/kuZDluIJcIixcblx0ICAgIFwiMzUwMTgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM1MDIwMFwiOiBcIuWOpumXqOW4glwiLFxuXHQgICAgXCIzNTAyMDNcIjogXCLmgJ3mmI7ljLpcIixcblx0ICAgIFwiMzUwMjA1XCI6IFwi5rW35rKn5Yy6XCIsXG5cdCAgICBcIjM1MDIwNlwiOiBcIua5lumHjOWMulwiLFxuXHQgICAgXCIzNTAyMTFcIjogXCLpm4bnvo7ljLpcIixcblx0ICAgIFwiMzUwMjEyXCI6IFwi5ZCM5a6J5Yy6XCIsXG5cdCAgICBcIjM1MDIxM1wiOiBcIue/lOWuieWMulwiLFxuXHQgICAgXCIzNTAyMTRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwMzAwXCI6IFwi6I6G55Sw5biCXCIsXG5cdCAgICBcIjM1MDMwMlwiOiBcIuWfjuWOouWMulwiLFxuXHQgICAgXCIzNTAzMDNcIjogXCLmtrXmsZ/ljLpcIixcblx0ICAgIFwiMzUwMzA0XCI6IFwi6I2U5Z+O5Yy6XCIsXG5cdCAgICBcIjM1MDMwNVwiOiBcIuengOWxv+WMulwiLFxuXHQgICAgXCIzNTAzMjJcIjogXCLku5nmuLjljr9cIixcblx0ICAgIFwiMzUwMzIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM1MDQwMFwiOiBcIuS4ieaYjuW4glwiLFxuXHQgICAgXCIzNTA0MDJcIjogXCLmooXliJfljLpcIixcblx0ICAgIFwiMzUwNDAzXCI6IFwi5LiJ5YWD5Yy6XCIsXG5cdCAgICBcIjM1MDQyMVwiOiBcIuaYjua6quWOv1wiLFxuXHQgICAgXCIzNTA0MjNcIjogXCLmuIXmtYHljr9cIixcblx0ICAgIFwiMzUwNDI0XCI6IFwi5a6B5YyW5Y6/XCIsXG5cdCAgICBcIjM1MDQyNVwiOiBcIuWkp+eUsOWOv1wiLFxuXHQgICAgXCIzNTA0MjZcIjogXCLlsKTmuqrljr9cIixcblx0ICAgIFwiMzUwNDI3XCI6IFwi5rKZ5Y6/XCIsXG5cdCAgICBcIjM1MDQyOFwiOiBcIuWwhuS5kOWOv1wiLFxuXHQgICAgXCIzNTA0MjlcIjogXCLms7DlroHljr9cIixcblx0ICAgIFwiMzUwNDMwXCI6IFwi5bu65a6B5Y6/XCIsXG5cdCAgICBcIjM1MDQ4MVwiOiBcIuawuOWuieW4glwiLFxuXHQgICAgXCIzNTA0ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwNTAwXCI6IFwi5rOJ5bee5biCXCIsXG5cdCAgICBcIjM1MDUwMlwiOiBcIumypOWfjuWMulwiLFxuXHQgICAgXCIzNTA1MDNcIjogXCLkuLDms73ljLpcIixcblx0ICAgIFwiMzUwNTA0XCI6IFwi5rSb5rGf5Yy6XCIsXG5cdCAgICBcIjM1MDUwNVwiOiBcIuaziea4r+WMulwiLFxuXHQgICAgXCIzNTA1MjFcIjogXCLmg6Dlronljr9cIixcblx0ICAgIFwiMzUwNTI0XCI6IFwi5a6J5rqq5Y6/XCIsXG5cdCAgICBcIjM1MDUyNVwiOiBcIuawuOaYpeWOv1wiLFxuXHQgICAgXCIzNTA1MjZcIjogXCLlvrfljJbljr9cIixcblx0ICAgIFwiMzUwNTI3XCI6IFwi6YeR6Zeo5Y6/XCIsXG5cdCAgICBcIjM1MDU4MVwiOiBcIuefs+eLruW4glwiLFxuXHQgICAgXCIzNTA1ODJcIjogXCLmmYvmsZ/luIJcIixcblx0ICAgIFwiMzUwNTgzXCI6IFwi5Y2X5a6J5biCXCIsXG5cdCAgICBcIjM1MDU4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNTA2MDBcIjogXCLmvLPlt57luIJcIixcblx0ICAgIFwiMzUwNjAyXCI6IFwi6IqX5Z+O5Yy6XCIsXG5cdCAgICBcIjM1MDYwM1wiOiBcIum+meaWh+WMulwiLFxuXHQgICAgXCIzNTA2MjJcIjogXCLkupHpnITljr9cIixcblx0ICAgIFwiMzUwNjIzXCI6IFwi5ryz5rWm5Y6/XCIsXG5cdCAgICBcIjM1MDYyNFwiOiBcIuivj+WuieWOv1wiLFxuXHQgICAgXCIzNTA2MjVcIjogXCLplb/ms7Dljr9cIixcblx0ICAgIFwiMzUwNjI2XCI6IFwi5Lic5bGx5Y6/XCIsXG5cdCAgICBcIjM1MDYyN1wiOiBcIuWNl+mdluWOv1wiLFxuXHQgICAgXCIzNTA2MjhcIjogXCLlubPlkozljr9cIixcblx0ICAgIFwiMzUwNjI5XCI6IFwi5Y2O5a6J5Y6/XCIsXG5cdCAgICBcIjM1MDY4MVwiOiBcIum+mea1t+W4glwiLFxuXHQgICAgXCIzNTA2ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwNzAwXCI6IFwi5Y2X5bmz5biCXCIsXG5cdCAgICBcIjM1MDcwMlwiOiBcIuW7tuW5s+WMulwiLFxuXHQgICAgXCIzNTA3MjFcIjogXCLpobrmmIzljr9cIixcblx0ICAgIFwiMzUwNzIyXCI6IFwi5rWm5Z+O5Y6/XCIsXG5cdCAgICBcIjM1MDcyM1wiOiBcIuWFieazveWOv1wiLFxuXHQgICAgXCIzNTA3MjRcIjogXCLmnb7muqrljr9cIixcblx0ICAgIFwiMzUwNzI1XCI6IFwi5pS/5ZKM5Y6/XCIsXG5cdCAgICBcIjM1MDc4MVwiOiBcIumCteatpuW4glwiLFxuXHQgICAgXCIzNTA3ODJcIjogXCLmrablpLflsbHluIJcIixcblx0ICAgIFwiMzUwNzgzXCI6IFwi5bu655Ov5biCXCIsXG5cdCAgICBcIjM1MDc4NFwiOiBcIuW7uumYs+W4glwiLFxuXHQgICAgXCIzNTA3ODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwODAwXCI6IFwi6b6Z5bKp5biCXCIsXG5cdCAgICBcIjM1MDgwMlwiOiBcIuaWsOe9l+WMulwiLFxuXHQgICAgXCIzNTA4MjFcIjogXCLplb/msYDljr9cIixcblx0ICAgIFwiMzUwODIyXCI6IFwi5rC45a6a5Y6/XCIsXG5cdCAgICBcIjM1MDgyM1wiOiBcIuS4iuadreWOv1wiLFxuXHQgICAgXCIzNTA4MjRcIjogXCLmrablubPljr9cIixcblx0ICAgIFwiMzUwODI1XCI6IFwi6L+e5Z+O5Y6/XCIsXG5cdCAgICBcIjM1MDg4MVwiOiBcIua8s+W5s+W4glwiLFxuXHQgICAgXCIzNTA4ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzUwOTAwXCI6IFwi5a6B5b635biCXCIsXG5cdCAgICBcIjM1MDkwMlwiOiBcIuiVieWfjuWMulwiLFxuXHQgICAgXCIzNTA5MjFcIjogXCLpnJ7mtabljr9cIixcblx0ICAgIFwiMzUwOTIyXCI6IFwi5Y+k55Sw5Y6/XCIsXG5cdCAgICBcIjM1MDkyM1wiOiBcIuWxj+WNl+WOv1wiLFxuXHQgICAgXCIzNTA5MjRcIjogXCLlr7/lroHljr9cIixcblx0ICAgIFwiMzUwOTI1XCI6IFwi5ZGo5a6B5Y6/XCIsXG5cdCAgICBcIjM1MDkyNlwiOiBcIuafmOiNo+WOv1wiLFxuXHQgICAgXCIzNTA5ODFcIjogXCLnpo/lronluIJcIixcblx0ICAgIFwiMzUwOTgyXCI6IFwi56aP6byO5biCXCIsXG5cdCAgICBcIjM1MDk4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjAwMDBcIjogXCLmsZ/opb/nnIFcIixcblx0ICAgIFwiMzYwMTAwXCI6IFwi5Y2X5piM5biCXCIsXG5cdCAgICBcIjM2MDEwMlwiOiBcIuS4nOa5luWMulwiLFxuXHQgICAgXCIzNjAxMDNcIjogXCLopb/muZbljLpcIixcblx0ICAgIFwiMzYwMTA0XCI6IFwi6Z2S5LqR6LCx5Yy6XCIsXG5cdCAgICBcIjM2MDEwNVwiOiBcIua5vumHjOWMulwiLFxuXHQgICAgXCIzNjAxMTFcIjogXCLpnZLlsbHmuZbljLpcIixcblx0ICAgIFwiMzYwMTIxXCI6IFwi5Y2X5piM5Y6/XCIsXG5cdCAgICBcIjM2MDEyMlwiOiBcIuaWsOW7uuWOv1wiLFxuXHQgICAgXCIzNjAxMjNcIjogXCLlronkuYnljr9cIixcblx0ICAgIFwiMzYwMTI0XCI6IFwi6L+b6LSk5Y6/XCIsXG5cdCAgICBcIjM2MDEyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjAyMDBcIjogXCLmma/lvrfplYfluIJcIixcblx0ICAgIFwiMzYwMjAyXCI6IFwi5piM5rGf5Yy6XCIsXG5cdCAgICBcIjM2MDIwM1wiOiBcIuePoOWxseWMulwiLFxuXHQgICAgXCIzNjAyMjJcIjogXCLmta7mooHljr9cIixcblx0ICAgIFwiMzYwMjgxXCI6IFwi5LmQ5bmz5biCXCIsXG5cdCAgICBcIjM2MDI4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjAzMDBcIjogXCLokI3kuaHluIJcIixcblx0ICAgIFwiMzYwMzAyXCI6IFwi5a6J5rqQ5Yy6XCIsXG5cdCAgICBcIjM2MDMxM1wiOiBcIua5mOS4nOWMulwiLFxuXHQgICAgXCIzNjAzMjFcIjogXCLojrLoirHljr9cIixcblx0ICAgIFwiMzYwMzIyXCI6IFwi5LiK5qCX5Y6/XCIsXG5cdCAgICBcIjM2MDMyM1wiOiBcIuiKpua6quWOv1wiLFxuXHQgICAgXCIzNjAzMjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzYwNDAwXCI6IFwi5Lmd5rGf5biCXCIsXG5cdCAgICBcIjM2MDQwMlwiOiBcIuW6kOWxseWMulwiLFxuXHQgICAgXCIzNjA0MDNcIjogXCLmtZTpmLPljLpcIixcblx0ICAgIFwiMzYwNDIxXCI6IFwi5Lmd5rGf5Y6/XCIsXG5cdCAgICBcIjM2MDQyM1wiOiBcIuatpuWugeWOv1wiLFxuXHQgICAgXCIzNjA0MjRcIjogXCLkv67msLTljr9cIixcblx0ICAgIFwiMzYwNDI1XCI6IFwi5rC45L+u5Y6/XCIsXG5cdCAgICBcIjM2MDQyNlwiOiBcIuW+t+WuieWOv1wiLFxuXHQgICAgXCIzNjA0MjdcIjogXCLmmJ/lrZDljr9cIixcblx0ICAgIFwiMzYwNDI4XCI6IFwi6YO95piM5Y6/XCIsXG5cdCAgICBcIjM2MDQyOVwiOiBcIua5luWPo+WOv1wiLFxuXHQgICAgXCIzNjA0MzBcIjogXCLlva3ms73ljr9cIixcblx0ICAgIFwiMzYwNDgxXCI6IFwi55Ge5piM5biCXCIsXG5cdCAgICBcIjM2MDQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjA0ODNcIjogXCLlhbHpnZLln47luIJcIixcblx0ICAgIFwiMzYwNTAwXCI6IFwi5paw5L2Z5biCXCIsXG5cdCAgICBcIjM2MDUwMlwiOiBcIua4neawtOWMulwiLFxuXHQgICAgXCIzNjA1MjFcIjogXCLliIblrpzljr9cIixcblx0ICAgIFwiMzYwNTIyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM2MDYwMFwiOiBcIum5sOa9reW4glwiLFxuXHQgICAgXCIzNjA2MDJcIjogXCLmnIjmuZbljLpcIixcblx0ICAgIFwiMzYwNjIyXCI6IFwi5L2Z5rGf5Y6/XCIsXG5cdCAgICBcIjM2MDY4MVwiOiBcIui0tea6quW4glwiLFxuXHQgICAgXCIzNjA2ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzYwNzAwXCI6IFwi6LWj5bee5biCXCIsXG5cdCAgICBcIjM2MDcwMlwiOiBcIueroOi0oeWMulwiLFxuXHQgICAgXCIzNjA3MjFcIjogXCLotaPljr9cIixcblx0ICAgIFwiMzYwNzIyXCI6IFwi5L+h5Liw5Y6/XCIsXG5cdCAgICBcIjM2MDcyM1wiOiBcIuWkp+S9meWOv1wiLFxuXHQgICAgXCIzNjA3MjRcIjogXCLkuIrnirnljr9cIixcblx0ICAgIFwiMzYwNzI1XCI6IFwi5bSH5LmJ5Y6/XCIsXG5cdCAgICBcIjM2MDcyNlwiOiBcIuWuiei/nOWOv1wiLFxuXHQgICAgXCIzNjA3MjdcIjogXCLpvpnljZfljr9cIixcblx0ICAgIFwiMzYwNzI4XCI6IFwi5a6a5Y2X5Y6/XCIsXG5cdCAgICBcIjM2MDcyOVwiOiBcIuWFqOWNl+WOv1wiLFxuXHQgICAgXCIzNjA3MzBcIjogXCLlroHpg73ljr9cIixcblx0ICAgIFwiMzYwNzMxXCI6IFwi5LqO6YO95Y6/XCIsXG5cdCAgICBcIjM2MDczMlwiOiBcIuWFtOWbveWOv1wiLFxuXHQgICAgXCIzNjA3MzNcIjogXCLkvJrmmIzljr9cIixcblx0ICAgIFwiMzYwNzM0XCI6IFwi5a+75LmM5Y6/XCIsXG5cdCAgICBcIjM2MDczNVwiOiBcIuefs+WfjuWOv1wiLFxuXHQgICAgXCIzNjA3ODFcIjogXCLnkZ7ph5HluIJcIixcblx0ICAgIFwiMzYwNzgyXCI6IFwi5Y2X5bq35biCXCIsXG5cdCAgICBcIjM2MDc4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjA4MDBcIjogXCLlkInlronluIJcIixcblx0ICAgIFwiMzYwODAyXCI6IFwi5ZCJ5bee5Yy6XCIsXG5cdCAgICBcIjM2MDgwM1wiOiBcIumdkuWOn+WMulwiLFxuXHQgICAgXCIzNjA4MjFcIjogXCLlkInlronljr9cIixcblx0ICAgIFwiMzYwODIyXCI6IFwi5ZCJ5rC05Y6/XCIsXG5cdCAgICBcIjM2MDgyM1wiOiBcIuWzoeaxn+WOv1wiLFxuXHQgICAgXCIzNjA4MjRcIjogXCLmlrDlubLljr9cIixcblx0ICAgIFwiMzYwODI1XCI6IFwi5rC45Liw5Y6/XCIsXG5cdCAgICBcIjM2MDgyNlwiOiBcIuazsOWSjOWOv1wiLFxuXHQgICAgXCIzNjA4MjdcIjogXCLpgYLlt53ljr9cIixcblx0ICAgIFwiMzYwODI4XCI6IFwi5LiH5a6J5Y6/XCIsXG5cdCAgICBcIjM2MDgyOVwiOiBcIuWuieemj+WOv1wiLFxuXHQgICAgXCIzNjA4MzBcIjogXCLmsLjmlrDljr9cIixcblx0ICAgIFwiMzYwODgxXCI6IFwi5LqV5YaI5bGx5biCXCIsXG5cdCAgICBcIjM2MDg4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjA5MDBcIjogXCLlrpzmmKXluIJcIixcblx0ICAgIFwiMzYwOTAyXCI6IFwi6KKB5bee5Yy6XCIsXG5cdCAgICBcIjM2MDkyMVwiOiBcIuWlieaWsOWOv1wiLFxuXHQgICAgXCIzNjA5MjJcIjogXCLkuIfovb3ljr9cIixcblx0ICAgIFwiMzYwOTIzXCI6IFwi5LiK6auY5Y6/XCIsXG5cdCAgICBcIjM2MDkyNFwiOiBcIuWunOS4sOWOv1wiLFxuXHQgICAgXCIzNjA5MjVcIjogXCLpnZblronljr9cIixcblx0ICAgIFwiMzYwOTI2XCI6IFwi6ZOc6byT5Y6/XCIsXG5cdCAgICBcIjM2MDk4MVwiOiBcIuS4sOWfjuW4glwiLFxuXHQgICAgXCIzNjA5ODJcIjogXCLmqJ/moJHluIJcIixcblx0ICAgIFwiMzYwOTgzXCI6IFwi6auY5a6J5biCXCIsXG5cdCAgICBcIjM2MDk4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNjEwMDBcIjogXCLmiprlt57luIJcIixcblx0ICAgIFwiMzYxMDAyXCI6IFwi5Li05bed5Yy6XCIsXG5cdCAgICBcIjM2MTAyMVwiOiBcIuWNl+WfjuWOv1wiLFxuXHQgICAgXCIzNjEwMjJcIjogXCLpu47lt53ljr9cIixcblx0ICAgIFwiMzYxMDIzXCI6IFwi5Y2X5Liw5Y6/XCIsXG5cdCAgICBcIjM2MTAyNFwiOiBcIuW0h+S7geWOv1wiLFxuXHQgICAgXCIzNjEwMjVcIjogXCLkuZDlronljr9cIixcblx0ICAgIFwiMzYxMDI2XCI6IFwi5a6c6buE5Y6/XCIsXG5cdCAgICBcIjM2MTAyN1wiOiBcIumHkea6quWOv1wiLFxuXHQgICAgXCIzNjEwMjhcIjogXCLotYTmuqrljr9cIixcblx0ICAgIFwiMzYxMDI5XCI6IFwi5Lic5Lmh5Y6/XCIsXG5cdCAgICBcIjM2MTAzMFwiOiBcIuW5v+aYjOWOv1wiLFxuXHQgICAgXCIzNjEwMzFcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzYxMTAwXCI6IFwi5LiK6aW25biCXCIsXG5cdCAgICBcIjM2MTEwMlwiOiBcIuS/oeW3nuWMulwiLFxuXHQgICAgXCIzNjExMjFcIjogXCLkuIrppbbljr9cIixcblx0ICAgIFwiMzYxMTIyXCI6IFwi5bm/5Liw5Y6/XCIsXG5cdCAgICBcIjM2MTEyM1wiOiBcIueOieWxseWOv1wiLFxuXHQgICAgXCIzNjExMjRcIjogXCLpk4XlsbHljr9cIixcblx0ICAgIFwiMzYxMTI1XCI6IFwi5qiq5bOw5Y6/XCIsXG5cdCAgICBcIjM2MTEyNlwiOiBcIuW8i+mYs+WOv1wiLFxuXHQgICAgXCIzNjExMjdcIjogXCLkvZnlubLljr9cIixcblx0ICAgIFwiMzYxMTI4XCI6IFwi6YSx6Ziz5Y6/XCIsXG5cdCAgICBcIjM2MTEyOVwiOiBcIuS4h+W5tOWOv1wiLFxuXHQgICAgXCIzNjExMzBcIjogXCLlqbrmupDljr9cIixcblx0ICAgIFwiMzYxMTgxXCI6IFwi5b635YW05biCXCIsXG5cdCAgICBcIjM2MTE4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNzAwMDBcIjogXCLlsbHkuJznnIFcIixcblx0ICAgIFwiMzcwMTAwXCI6IFwi5rWO5Y2X5biCXCIsXG5cdCAgICBcIjM3MDEwMlwiOiBcIuWOhuS4i+WMulwiLFxuXHQgICAgXCIzNzAxMDNcIjogXCLluILkuK3ljLpcIixcblx0ICAgIFwiMzcwMTA0XCI6IFwi5qeQ6I2r5Yy6XCIsXG5cdCAgICBcIjM3MDEwNVwiOiBcIuWkqeahpeWMulwiLFxuXHQgICAgXCIzNzAxMTJcIjogXCLljobln47ljLpcIixcblx0ICAgIFwiMzcwMTEzXCI6IFwi6ZW/5riF5Yy6XCIsXG5cdCAgICBcIjM3MDEyNFwiOiBcIuW5s+mYtOWOv1wiLFxuXHQgICAgXCIzNzAxMjVcIjogXCLmtY7pmLPljr9cIixcblx0ICAgIFwiMzcwMTI2XCI6IFwi5ZWG5rKz5Y6/XCIsXG5cdCAgICBcIjM3MDE4MVwiOiBcIueroOS4mOW4glwiLFxuXHQgICAgXCIzNzAxODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcwMjAwXCI6IFwi6Z2S5bKb5biCXCIsXG5cdCAgICBcIjM3MDIwMlwiOiBcIuW4guWNl+WMulwiLFxuXHQgICAgXCIzNzAyMDNcIjogXCLluILljJfljLpcIixcblx0ICAgIFwiMzcwMjExXCI6IFwi6buE5bKb5Yy6XCIsXG5cdCAgICBcIjM3MDIxMlwiOiBcIuW0guWxseWMulwiLFxuXHQgICAgXCIzNzAyMTNcIjogXCLmnY7msqfljLpcIixcblx0ICAgIFwiMzcwMjE0XCI6IFwi5Z+O6Ziz5Yy6XCIsXG5cdCAgICBcIjM3MDI4MVwiOiBcIuiDtuW3nuW4glwiLFxuXHQgICAgXCIzNzAyODJcIjogXCLljbPloqjluIJcIixcblx0ICAgIFwiMzcwMjgzXCI6IFwi5bmz5bqm5biCXCIsXG5cdCAgICBcIjM3MDI4NVwiOiBcIuiOseilv+W4glwiLFxuXHQgICAgXCIzNzAyODZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcwMzAwXCI6IFwi5reE5Y2a5biCXCIsXG5cdCAgICBcIjM3MDMwMlwiOiBcIua3hOW3neWMulwiLFxuXHQgICAgXCIzNzAzMDNcIjogXCLlvKDlupfljLpcIixcblx0ICAgIFwiMzcwMzA0XCI6IFwi5Y2a5bGx5Yy6XCIsXG5cdCAgICBcIjM3MDMwNVwiOiBcIuS4tOa3hOWMulwiLFxuXHQgICAgXCIzNzAzMDZcIjogXCLlkajmnZHljLpcIixcblx0ICAgIFwiMzcwMzIxXCI6IFwi5qGT5Y+w5Y6/XCIsXG5cdCAgICBcIjM3MDMyMlwiOiBcIumrmOmdkuWOv1wiLFxuXHQgICAgXCIzNzAzMjNcIjogXCLmsoLmupDljr9cIixcblx0ICAgIFwiMzcwMzI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MDQwMFwiOiBcIuaeo+W6hOW4glwiLFxuXHQgICAgXCIzNzA0MDJcIjogXCLluILkuK3ljLpcIixcblx0ICAgIFwiMzcwNDAzXCI6IFwi6Jab5Z+O5Yy6XCIsXG5cdCAgICBcIjM3MDQwNFwiOiBcIuWzhOWfjuWMulwiLFxuXHQgICAgXCIzNzA0MDVcIjogXCLlj7DlhL/luoTljLpcIixcblx0ICAgIFwiMzcwNDA2XCI6IFwi5bGx5Lqt5Yy6XCIsXG5cdCAgICBcIjM3MDQ4MVwiOiBcIua7leW3nuW4glwiLFxuXHQgICAgXCIzNzA0ODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcwNTAwXCI6IFwi5Lic6JCl5biCXCIsXG5cdCAgICBcIjM3MDUwMlwiOiBcIuS4nOiQpeWMulwiLFxuXHQgICAgXCIzNzA1MDNcIjogXCLmsrPlj6PljLpcIixcblx0ICAgIFwiMzcwNTIxXCI6IFwi5Z6m5Yip5Y6/XCIsXG5cdCAgICBcIjM3MDUyMlwiOiBcIuWIqea0peWOv1wiLFxuXHQgICAgXCIzNzA1MjNcIjogXCLlub/ppbbljr9cIixcblx0ICAgIFwiMzcwNTkxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MDYwMFwiOiBcIueDn+WPsOW4glwiLFxuXHQgICAgXCIzNzA2MDJcIjogXCLoip3nvZjljLpcIixcblx0ICAgIFwiMzcwNjExXCI6IFwi56aP5bGx5Yy6XCIsXG5cdCAgICBcIjM3MDYxMlwiOiBcIueJn+W5s+WMulwiLFxuXHQgICAgXCIzNzA2MTNcIjogXCLojrHlsbHljLpcIixcblx0ICAgIFwiMzcwNjM0XCI6IFwi6ZW/5bKb5Y6/XCIsXG5cdCAgICBcIjM3MDY4MVwiOiBcIum+meWPo+W4glwiLFxuXHQgICAgXCIzNzA2ODJcIjogXCLojrHpmLPluIJcIixcblx0ICAgIFwiMzcwNjgzXCI6IFwi6I6x5bee5biCXCIsXG5cdCAgICBcIjM3MDY4NFwiOiBcIuiTrOiOseW4glwiLFxuXHQgICAgXCIzNzA2ODVcIjogXCLmi5vov5zluIJcIixcblx0ICAgIFwiMzcwNjg2XCI6IFwi5qCW6Zye5biCXCIsXG5cdCAgICBcIjM3MDY4N1wiOiBcIua1t+mYs+W4glwiLFxuXHQgICAgXCIzNzA2ODhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcwNzAwXCI6IFwi5r2N5Z2K5biCXCIsXG5cdCAgICBcIjM3MDcwMlwiOiBcIua9jeWfjuWMulwiLFxuXHQgICAgXCIzNzA3MDNcIjogXCLlr5Lkuq3ljLpcIixcblx0ICAgIFwiMzcwNzA0XCI6IFwi5Z2K5a2Q5Yy6XCIsXG5cdCAgICBcIjM3MDcwNVwiOiBcIuWljuaWh+WMulwiLFxuXHQgICAgXCIzNzA3MjRcIjogXCLkuLTmnJDljr9cIixcblx0ICAgIFwiMzcwNzI1XCI6IFwi5piM5LmQ5Y6/XCIsXG5cdCAgICBcIjM3MDc4MVwiOiBcIumdkuW3nuW4glwiLFxuXHQgICAgXCIzNzA3ODJcIjogXCLor7jln47luIJcIixcblx0ICAgIFwiMzcwNzgzXCI6IFwi5a+/5YWJ5biCXCIsXG5cdCAgICBcIjM3MDc4NFwiOiBcIuWuieS4mOW4glwiLFxuXHQgICAgXCIzNzA3ODVcIjogXCLpq5jlr4bluIJcIixcblx0ICAgIFwiMzcwNzg2XCI6IFwi5piM6YKR5biCXCIsXG5cdCAgICBcIjM3MDc4N1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNzA4MDBcIjogXCLmtY7lroHluIJcIixcblx0ICAgIFwiMzcwODAyXCI6IFwi5biC5Lit5Yy6XCIsXG5cdCAgICBcIjM3MDgxMVwiOiBcIuS7u+WfjuWMulwiLFxuXHQgICAgXCIzNzA4MjZcIjogXCLlvq7lsbHljr9cIixcblx0ICAgIFwiMzcwODI3XCI6IFwi6bG85Y+w5Y6/XCIsXG5cdCAgICBcIjM3MDgyOFwiOiBcIumHkeS5oeWOv1wiLFxuXHQgICAgXCIzNzA4MjlcIjogXCLlmInnpaXljr9cIixcblx0ICAgIFwiMzcwODMwXCI6IFwi5rG25LiK5Y6/XCIsXG5cdCAgICBcIjM3MDgzMVwiOiBcIuazl+awtOWOv1wiLFxuXHQgICAgXCIzNzA4MzJcIjogXCLmooHlsbHljr9cIixcblx0ICAgIFwiMzcwODgxXCI6IFwi5puy6Zic5biCXCIsXG5cdCAgICBcIjM3MDg4MlwiOiBcIuWFluW3nuW4glwiLFxuXHQgICAgXCIzNzA4ODNcIjogXCLpgrnln47luIJcIixcblx0ICAgIFwiMzcwODg0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MDkwMFwiOiBcIuazsOWuieW4glwiLFxuXHQgICAgXCIzNzA5MDJcIjogXCLms7DlsbHljLpcIixcblx0ICAgIFwiMzcwOTAzXCI6IFwi5bKx5bKz5Yy6XCIsXG5cdCAgICBcIjM3MDkyMVwiOiBcIuWugemYs+WOv1wiLFxuXHQgICAgXCIzNzA5MjNcIjogXCLkuJzlubPljr9cIixcblx0ICAgIFwiMzcwOTgyXCI6IFwi5paw5rOw5biCXCIsXG5cdCAgICBcIjM3MDk4M1wiOiBcIuiCpeWfjuW4glwiLFxuXHQgICAgXCIzNzA5ODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcxMDAwXCI6IFwi5aiB5rW35biCXCIsXG5cdCAgICBcIjM3MTAwMlwiOiBcIueOr+e/oOWMulwiLFxuXHQgICAgXCIzNzEwODFcIjogXCLmlofnmbvluIJcIixcblx0ICAgIFwiMzcxMDgyXCI6IFwi6I2j5oiQ5biCXCIsXG5cdCAgICBcIjM3MTA4M1wiOiBcIuS5s+WxseW4glwiLFxuXHQgICAgXCIzNzEwODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcxMTAwXCI6IFwi5pel54Wn5biCXCIsXG5cdCAgICBcIjM3MTEwMlwiOiBcIuS4nOa4r+WMulwiLFxuXHQgICAgXCIzNzExMDNcIjogXCLlsprlsbHljLpcIixcblx0ICAgIFwiMzcxMTIxXCI6IFwi5LqU6I6y5Y6/XCIsXG5cdCAgICBcIjM3MTEyMlwiOiBcIuiOkuWOv1wiLFxuXHQgICAgXCIzNzExMjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcxMjAwXCI6IFwi6I6x6Iqc5biCXCIsXG5cdCAgICBcIjM3MTIwMlwiOiBcIuiOseWfjuWMulwiLFxuXHQgICAgXCIzNzEyMDNcIjogXCLpkqLln47ljLpcIixcblx0ICAgIFwiMzcxMjA0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MTMwMFwiOiBcIuS4tOayguW4glwiLFxuXHQgICAgXCIzNzEzMDJcIjogXCLlhbDlsbHljLpcIixcblx0ICAgIFwiMzcxMzExXCI6IFwi572X5bqE5Yy6XCIsXG5cdCAgICBcIjM3MTMxMlwiOiBcIuays+S4nOWMulwiLFxuXHQgICAgXCIzNzEzMjFcIjogXCLmsoLljZfljr9cIixcblx0ICAgIFwiMzcxMzIyXCI6IFwi6YOv5Z+O5Y6/XCIsXG5cdCAgICBcIjM3MTMyM1wiOiBcIuayguawtOWOv1wiLFxuXHQgICAgXCIzNzEzMjRcIjogXCLoi43lsbHljr9cIixcblx0ICAgIFwiMzcxMzI1XCI6IFwi6LS55Y6/XCIsXG5cdCAgICBcIjM3MTMyNlwiOiBcIuW5s+mCkeWOv1wiLFxuXHQgICAgXCIzNzEzMjdcIjogXCLojpLljZfljr9cIixcblx0ICAgIFwiMzcxMzI4XCI6IFwi6JKZ6Zi05Y6/XCIsXG5cdCAgICBcIjM3MTMyOVwiOiBcIuS4tOayreWOv1wiLFxuXHQgICAgXCIzNzEzMzBcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiMzcxNDAwXCI6IFwi5b635bee5biCXCIsXG5cdCAgICBcIjM3MTQwMlwiOiBcIuW+t+WfjuWMulwiLFxuXHQgICAgXCIzNzE0MjFcIjogXCLpmbXljr9cIixcblx0ICAgIFwiMzcxNDIyXCI6IFwi5a6B5rSl5Y6/XCIsXG5cdCAgICBcIjM3MTQyM1wiOiBcIuW6huS6keWOv1wiLFxuXHQgICAgXCIzNzE0MjRcIjogXCLkuLTpgpHljr9cIixcblx0ICAgIFwiMzcxNDI1XCI6IFwi6b2Q5rKz5Y6/XCIsXG5cdCAgICBcIjM3MTQyNlwiOiBcIuW5s+WOn+WOv1wiLFxuXHQgICAgXCIzNzE0MjdcIjogXCLlpI/mtKXljr9cIixcblx0ICAgIFwiMzcxNDI4XCI6IFwi5q2m5Z+O5Y6/XCIsXG5cdCAgICBcIjM3MTQ4MVwiOiBcIuS5kOmZteW4glwiLFxuXHQgICAgXCIzNzE0ODJcIjogXCLnprnln47luIJcIixcblx0ICAgIFwiMzcxNDgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjM3MTUwMFwiOiBcIuiBiuWfjuW4glwiLFxuXHQgICAgXCIzNzE1MDJcIjogXCLkuJzmmIzlupzljLpcIixcblx0ICAgIFwiMzcxNTIxXCI6IFwi6Ziz6LC35Y6/XCIsXG5cdCAgICBcIjM3MTUyMlwiOiBcIuiOmOWOv1wiLFxuXHQgICAgXCIzNzE1MjNcIjogXCLojIzlubPljr9cIixcblx0ICAgIFwiMzcxNTI0XCI6IFwi5Lic6Zi/5Y6/XCIsXG5cdCAgICBcIjM3MTUyNVwiOiBcIuWGoOWOv1wiLFxuXHQgICAgXCIzNzE1MjZcIjogXCLpq5jllJDljr9cIixcblx0ICAgIFwiMzcxNTgxXCI6IFwi5Li05riF5biCXCIsXG5cdCAgICBcIjM3MTU4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNzE2MDBcIjogXCLmu6jlt57luIJcIixcblx0ICAgIFwiMzcxNjAyXCI6IFwi5ruo5Z+O5Yy6XCIsXG5cdCAgICBcIjM3MTYyMVwiOiBcIuaDoOawkeWOv1wiLFxuXHQgICAgXCIzNzE2MjJcIjogXCLpmLPkv6Hljr9cIixcblx0ICAgIFwiMzcxNjIzXCI6IFwi5peg5qOj5Y6/XCIsXG5cdCAgICBcIjM3MTYyNFwiOiBcIuayvuWMluWOv1wiLFxuXHQgICAgXCIzNzE2MjVcIjogXCLljZrlhbTljr9cIixcblx0ICAgIFwiMzcxNjI2XCI6IFwi6YK55bmz5Y6/XCIsXG5cdCAgICBcIjM3MTYyN1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCIzNzE3MDBcIjogXCLoj4/ms73luIJcIixcblx0ICAgIFwiMzcxNzAyXCI6IFwi54mh5Li55Yy6XCIsXG5cdCAgICBcIjM3MTcyMVwiOiBcIuabueWOv1wiLFxuXHQgICAgXCIzNzE3MjJcIjogXCLljZXljr9cIixcblx0ICAgIFwiMzcxNzIzXCI6IFwi5oiQ5q2m5Y6/XCIsXG5cdCAgICBcIjM3MTcyNFwiOiBcIuW3qOmHjuWOv1wiLFxuXHQgICAgXCIzNzE3MjVcIjogXCLpg5Pln47ljr9cIixcblx0ICAgIFwiMzcxNzI2XCI6IFwi6YSE5Z+O5Y6/XCIsXG5cdCAgICBcIjM3MTcyN1wiOiBcIuWumumZtuWOv1wiLFxuXHQgICAgXCIzNzE3MjhcIjogXCLkuJzmmI7ljr9cIixcblx0ICAgIFwiMzcxNzI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDAwMFwiOiBcIuays+WNl+ecgVwiLFxuXHQgICAgXCI0MTAxMDBcIjogXCLpg5Hlt57luIJcIixcblx0ICAgIFwiNDEwMTAyXCI6IFwi5Lit5Y6f5Yy6XCIsXG5cdCAgICBcIjQxMDEwM1wiOiBcIuS6jOS4g+WMulwiLFxuXHQgICAgXCI0MTAxMDRcIjogXCLnrqHln47lm57ml4/ljLpcIixcblx0ICAgIFwiNDEwMTA1XCI6IFwi6YeR5rC05Yy6XCIsXG5cdCAgICBcIjQxMDEwNlwiOiBcIuS4iuihl+WMulwiLFxuXHQgICAgXCI0MTAxMDhcIjogXCLmg6DmtY7ljLpcIixcblx0ICAgIFwiNDEwMTIyXCI6IFwi5Lit54mf5Y6/XCIsXG5cdCAgICBcIjQxMDE4MVwiOiBcIuW3qeS5ieW4glwiLFxuXHQgICAgXCI0MTAxODJcIjogXCLojaXpmLPluIJcIixcblx0ICAgIFwiNDEwMTgzXCI6IFwi5paw5a+G5biCXCIsXG5cdCAgICBcIjQxMDE4NFwiOiBcIuaWsOmDkeW4glwiLFxuXHQgICAgXCI0MTAxODVcIjogXCLnmbvlsIHluIJcIixcblx0ICAgIFwiNDEwMTg4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDIwMFwiOiBcIuW8gOWwgeW4glwiLFxuXHQgICAgXCI0MTAyMDJcIjogXCLpvpnkuq3ljLpcIixcblx0ICAgIFwiNDEwMjAzXCI6IFwi6aG65rKz5Zue5peP5Yy6XCIsXG5cdCAgICBcIjQxMDIwNFwiOiBcIum8k+alvOWMulwiLFxuXHQgICAgXCI0MTAyMDVcIjogXCLnprnnjovlj7DljLpcIixcblx0ICAgIFwiNDEwMjExXCI6IFwi6YeR5piO5Yy6XCIsXG5cdCAgICBcIjQxMDIyMVwiOiBcIuadnuWOv1wiLFxuXHQgICAgXCI0MTAyMjJcIjogXCLpgJrorrjljr9cIixcblx0ICAgIFwiNDEwMjIzXCI6IFwi5bCJ5rCP5Y6/XCIsXG5cdCAgICBcIjQxMDIyNFwiOiBcIuW8gOWwgeWOv1wiLFxuXHQgICAgXCI0MTAyMjVcIjogXCLlhbDogIPljr9cIixcblx0ICAgIFwiNDEwMjI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDMwMFwiOiBcIua0m+mYs+W4glwiLFxuXHQgICAgXCI0MTAzMDJcIjogXCLogIHln47ljLpcIixcblx0ICAgIFwiNDEwMzAzXCI6IFwi6KW/5bel5Yy6XCIsXG5cdCAgICBcIjQxMDMwNFwiOiBcIueAjeays+WbnuaXj+WMulwiLFxuXHQgICAgXCI0MTAzMDVcIjogXCLmtqfopb/ljLpcIixcblx0ICAgIFwiNDEwMzA2XCI6IFwi5ZCJ5Yip5Yy6XCIsXG5cdCAgICBcIjQxMDMwN1wiOiBcIua0m+m+meWMulwiLFxuXHQgICAgXCI0MTAzMjJcIjogXCLlrZ/mtKXljr9cIixcblx0ICAgIFwiNDEwMzIzXCI6IFwi5paw5a6J5Y6/XCIsXG5cdCAgICBcIjQxMDMyNFwiOiBcIuagvuW3neWOv1wiLFxuXHQgICAgXCI0MTAzMjVcIjogXCLltanljr9cIixcblx0ICAgIFwiNDEwMzI2XCI6IFwi5rGd6Ziz5Y6/XCIsXG5cdCAgICBcIjQxMDMyN1wiOiBcIuWunOmYs+WOv1wiLFxuXHQgICAgXCI0MTAzMjhcIjogXCLmtJvlroHljr9cIixcblx0ICAgIFwiNDEwMzI5XCI6IFwi5LyK5bed5Y6/XCIsXG5cdCAgICBcIjQxMDM4MVwiOiBcIuWBg+W4iOW4glwiLFxuXHQgICAgXCI0MTA0MDBcIjogXCLlubPpobblsbHluIJcIixcblx0ICAgIFwiNDEwNDAyXCI6IFwi5paw5Y2O5Yy6XCIsXG5cdCAgICBcIjQxMDQwM1wiOiBcIuWNq+S4nOWMulwiLFxuXHQgICAgXCI0MTA0MDRcIjogXCLnn7PpvpnljLpcIixcblx0ICAgIFwiNDEwNDExXCI6IFwi5rmb5rKz5Yy6XCIsXG5cdCAgICBcIjQxMDQyMVwiOiBcIuWuneS4sOWOv1wiLFxuXHQgICAgXCI0MTA0MjJcIjogXCLlj7bljr9cIixcblx0ICAgIFwiNDEwNDIzXCI6IFwi6bKB5bGx5Y6/XCIsXG5cdCAgICBcIjQxMDQyNVwiOiBcIumDj+WOv1wiLFxuXHQgICAgXCI0MTA0ODFcIjogXCLoiJ7pkqLluIJcIixcblx0ICAgIFwiNDEwNDgyXCI6IFwi5rGd5bee5biCXCIsXG5cdCAgICBcIjQxMDQ4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTA1MDBcIjogXCLlronpmLPluIJcIixcblx0ICAgIFwiNDEwNTAyXCI6IFwi5paH5bOw5Yy6XCIsXG5cdCAgICBcIjQxMDUwM1wiOiBcIuWMl+WFs+WMulwiLFxuXHQgICAgXCI0MTA1MDVcIjogXCLmrrfpg73ljLpcIixcblx0ICAgIFwiNDEwNTA2XCI6IFwi6b6Z5a6J5Yy6XCIsXG5cdCAgICBcIjQxMDUyMlwiOiBcIuWuiemYs+WOv1wiLFxuXHQgICAgXCI0MTA1MjNcIjogXCLmsaTpmLTljr9cIixcblx0ICAgIFwiNDEwNTI2XCI6IFwi5ruR5Y6/XCIsXG5cdCAgICBcIjQxMDUyN1wiOiBcIuWGhem7hOWOv1wiLFxuXHQgICAgXCI0MTA1ODFcIjogXCLmnpflt57luIJcIixcblx0ICAgIFwiNDEwNTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDYwMFwiOiBcIum5pOWjgeW4glwiLFxuXHQgICAgXCI0MTA2MDJcIjogXCLpuaTlsbHljLpcIixcblx0ICAgIFwiNDEwNjAzXCI6IFwi5bGx5Z+O5Yy6XCIsXG5cdCAgICBcIjQxMDYxMVwiOiBcIua3h+a7qOWMulwiLFxuXHQgICAgXCI0MTA2MjFcIjogXCLmtZrljr9cIixcblx0ICAgIFwiNDEwNjIyXCI6IFwi5reH5Y6/XCIsXG5cdCAgICBcIjQxMDYyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTA3MDBcIjogXCLmlrDkuaHluIJcIixcblx0ICAgIFwiNDEwNzAyXCI6IFwi57qi5peX5Yy6XCIsXG5cdCAgICBcIjQxMDcwM1wiOiBcIuWNq+a7qOWMulwiLFxuXHQgICAgXCI0MTA3MDRcIjogXCLlh6Tms4nljLpcIixcblx0ICAgIFwiNDEwNzExXCI6IFwi54mn6YeO5Yy6XCIsXG5cdCAgICBcIjQxMDcyMVwiOiBcIuaWsOS5oeWOv1wiLFxuXHQgICAgXCI0MTA3MjRcIjogXCLojrflmInljr9cIixcblx0ICAgIFwiNDEwNzI1XCI6IFwi5Y6f6Ziz5Y6/XCIsXG5cdCAgICBcIjQxMDcyNlwiOiBcIuW7tua0peWOv1wiLFxuXHQgICAgXCI0MTA3MjdcIjogXCLlsIHkuJjljr9cIixcblx0ICAgIFwiNDEwNzI4XCI6IFwi6ZW/5Z6j5Y6/XCIsXG5cdCAgICBcIjQxMDc4MVwiOiBcIuWNq+i+ieW4glwiLFxuXHQgICAgXCI0MTA3ODJcIjogXCLovonljr/luIJcIixcblx0ICAgIFwiNDEwNzgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMDgwMFwiOiBcIueEpuS9nOW4glwiLFxuXHQgICAgXCI0MTA4MDJcIjogXCLop6PmlL7ljLpcIixcblx0ICAgIFwiNDEwODAzXCI6IFwi5Lit56uZ5Yy6XCIsXG5cdCAgICBcIjQxMDgwNFwiOiBcIumprOadkeWMulwiLFxuXHQgICAgXCI0MTA4MTFcIjogXCLlsbHpmLPljLpcIixcblx0ICAgIFwiNDEwODIxXCI6IFwi5L+u5q2m5Y6/XCIsXG5cdCAgICBcIjQxMDgyMlwiOiBcIuWNmueIseWOv1wiLFxuXHQgICAgXCI0MTA4MjNcIjogXCLmrabpmZ/ljr9cIixcblx0ICAgIFwiNDEwODI1XCI6IFwi5rip5Y6/XCIsXG5cdCAgICBcIjQxMDg4MVwiOiBcIua1jua6kOW4glwiLFxuXHQgICAgXCI0MTA4ODJcIjogXCLmsoHpmLPluIJcIixcblx0ICAgIFwiNDEwODgzXCI6IFwi5a2f5bee5biCXCIsXG5cdCAgICBcIjQxMDg4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTA5MDBcIjogXCLmv67pmLPluIJcIixcblx0ICAgIFwiNDEwOTAyXCI6IFwi5Y2O6b6Z5Yy6XCIsXG5cdCAgICBcIjQxMDkyMlwiOiBcIua4heS4sOWOv1wiLFxuXHQgICAgXCI0MTA5MjNcIjogXCLljZfkuZDljr9cIixcblx0ICAgIFwiNDEwOTI2XCI6IFwi6IyD5Y6/XCIsXG5cdCAgICBcIjQxMDkyN1wiOiBcIuWPsOWJjeWOv1wiLFxuXHQgICAgXCI0MTA5MjhcIjogXCLmv67pmLPljr9cIixcblx0ICAgIFwiNDEwOTI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMTAwMFwiOiBcIuiuuOaYjOW4glwiLFxuXHQgICAgXCI0MTEwMDJcIjogXCLprY/pg73ljLpcIixcblx0ICAgIFwiNDExMDIzXCI6IFwi6K645piM5Y6/XCIsXG5cdCAgICBcIjQxMTAyNFwiOiBcIumEoumZteWOv1wiLFxuXHQgICAgXCI0MTEwMjVcIjogXCLopYTln47ljr9cIixcblx0ICAgIFwiNDExMDgxXCI6IFwi56a55bee5biCXCIsXG5cdCAgICBcIjQxMTA4MlwiOiBcIumVv+iRm+W4glwiLFxuXHQgICAgXCI0MTEwODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDExMTAwXCI6IFwi5ryv5rKz5biCXCIsXG5cdCAgICBcIjQxMTEwMlwiOiBcIua6kOaxh+WMulwiLFxuXHQgICAgXCI0MTExMDNcIjogXCLpg77ln47ljLpcIixcblx0ICAgIFwiNDExMTA0XCI6IFwi5Y+s6Zm15Yy6XCIsXG5cdCAgICBcIjQxMTEyMVwiOiBcIuiInumYs+WOv1wiLFxuXHQgICAgXCI0MTExMjJcIjogXCLkuLTpoo3ljr9cIixcblx0ICAgIFwiNDExMTIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQxMTIwMFwiOiBcIuS4iemXqOWzoeW4glwiLFxuXHQgICAgXCI0MTEyMDJcIjogXCLmuZbmu6jljLpcIixcblx0ICAgIFwiNDExMjIxXCI6IFwi5riR5rGg5Y6/XCIsXG5cdCAgICBcIjQxMTIyMlwiOiBcIumZleWOv1wiLFxuXHQgICAgXCI0MTEyMjRcIjogXCLljaLmsI/ljr9cIixcblx0ICAgIFwiNDExMjgxXCI6IFwi5LmJ6ams5biCXCIsXG5cdCAgICBcIjQxMTI4MlwiOiBcIueBteWuneW4glwiLFxuXHQgICAgXCI0MTEyODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDExMzAwXCI6IFwi5Y2X6Ziz5biCXCIsXG5cdCAgICBcIjQxMTMwMlwiOiBcIuWum+WfjuWMulwiLFxuXHQgICAgXCI0MTEzMDNcIjogXCLljafpvpnljLpcIixcblx0ICAgIFwiNDExMzIxXCI6IFwi5Y2X5Y+s5Y6/XCIsXG5cdCAgICBcIjQxMTMyMlwiOiBcIuaWueWfjuWOv1wiLFxuXHQgICAgXCI0MTEzMjNcIjogXCLopb/ls6Hljr9cIixcblx0ICAgIFwiNDExMzI0XCI6IFwi6ZWH5bmz5Y6/XCIsXG5cdCAgICBcIjQxMTMyNVwiOiBcIuWGheS5oeWOv1wiLFxuXHQgICAgXCI0MTEzMjZcIjogXCLmt4Xlt53ljr9cIixcblx0ICAgIFwiNDExMzI3XCI6IFwi56S+5peX5Y6/XCIsXG5cdCAgICBcIjQxMTMyOFwiOiBcIuWUkOays+WOv1wiLFxuXHQgICAgXCI0MTEzMjlcIjogXCLmlrDph47ljr9cIixcblx0ICAgIFwiNDExMzMwXCI6IFwi5qGQ5p+P5Y6/XCIsXG5cdCAgICBcIjQxMTM4MVwiOiBcIumCk+W3nuW4glwiLFxuXHQgICAgXCI0MTEzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDExNDAwXCI6IFwi5ZWG5LiY5biCXCIsXG5cdCAgICBcIjQxMTQwMlwiOiBcIuaigeWbreWMulwiLFxuXHQgICAgXCI0MTE0MDNcIjogXCLnnaLpmLPljLpcIixcblx0ICAgIFwiNDExNDIxXCI6IFwi5rCR5p2D5Y6/XCIsXG5cdCAgICBcIjQxMTQyMlwiOiBcIuedouWOv1wiLFxuXHQgICAgXCI0MTE0MjNcIjogXCLlroHpmbXljr9cIixcblx0ICAgIFwiNDExNDI0XCI6IFwi5p+Y5Z+O5Y6/XCIsXG5cdCAgICBcIjQxMTQyNVwiOiBcIuiZnuWfjuWOv1wiLFxuXHQgICAgXCI0MTE0MjZcIjogXCLlpI/pgpHljr9cIixcblx0ICAgIFwiNDExNDgxXCI6IFwi5rC45Z+O5biCXCIsXG5cdCAgICBcIjQxMTQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTE1MDBcIjogXCLkv6HpmLPluIJcIixcblx0ICAgIFwiNDExNTAyXCI6IFwi5rWJ5rKz5Yy6XCIsXG5cdCAgICBcIjQxMTUwM1wiOiBcIuW5s+ahpeWMulwiLFxuXHQgICAgXCI0MTE1MjFcIjogXCLnvZflsbHljr9cIixcblx0ICAgIFwiNDExNTIyXCI6IFwi5YWJ5bGx5Y6/XCIsXG5cdCAgICBcIjQxMTUyM1wiOiBcIuaWsOWOv1wiLFxuXHQgICAgXCI0MTE1MjRcIjogXCLllYbln47ljr9cIixcblx0ICAgIFwiNDExNTI1XCI6IFwi5Zu65aeL5Y6/XCIsXG5cdCAgICBcIjQxMTUyNlwiOiBcIua9ouW3neWOv1wiLFxuXHQgICAgXCI0MTE1MjdcIjogXCLmt67mu6jljr9cIixcblx0ICAgIFwiNDExNTI4XCI6IFwi5oGv5Y6/XCIsXG5cdCAgICBcIjQxMTUyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTE2MDBcIjogXCLlkajlj6PluIJcIixcblx0ICAgIFwiNDExNjAyXCI6IFwi5bed5rGH5Yy6XCIsXG5cdCAgICBcIjQxMTYyMVwiOiBcIuaJtuayn+WOv1wiLFxuXHQgICAgXCI0MTE2MjJcIjogXCLopb/ljY7ljr9cIixcblx0ICAgIFwiNDExNjIzXCI6IFwi5ZWG5rC05Y6/XCIsXG5cdCAgICBcIjQxMTYyNFwiOiBcIuayiOS4mOWOv1wiLFxuXHQgICAgXCI0MTE2MjVcIjogXCLpg7jln47ljr9cIixcblx0ICAgIFwiNDExNjI2XCI6IFwi5reu6Ziz5Y6/XCIsXG5cdCAgICBcIjQxMTYyN1wiOiBcIuWkquW6t+WOv1wiLFxuXHQgICAgXCI0MTE2MjhcIjogXCLpub/pgpHljr9cIixcblx0ICAgIFwiNDExNjgxXCI6IFwi6aG55Z+O5biCXCIsXG5cdCAgICBcIjQxMTY4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MTE3MDBcIjogXCLpqbvpqazlupfluIJcIixcblx0ICAgIFwiNDExNzAyXCI6IFwi6am/5Z+O5Yy6XCIsXG5cdCAgICBcIjQxMTcyMVwiOiBcIuilv+W5s+WOv1wiLFxuXHQgICAgXCI0MTE3MjJcIjogXCLkuIrolKHljr9cIixcblx0ICAgIFwiNDExNzIzXCI6IFwi5bmz6IiG5Y6/XCIsXG5cdCAgICBcIjQxMTcyNFwiOiBcIuato+mYs+WOv1wiLFxuXHQgICAgXCI0MTE3MjVcIjogXCLnoa7lsbHljr9cIixcblx0ICAgIFwiNDExNzI2XCI6IFwi5rOM6Ziz5Y6/XCIsXG5cdCAgICBcIjQxMTcyN1wiOiBcIuaxneWNl+WOv1wiLFxuXHQgICAgXCI0MTE3MjhcIjogXCLpgYLlubPljr9cIixcblx0ICAgIFwiNDExNzI5XCI6IFwi5paw6JSh5Y6/XCIsXG5cdCAgICBcIjQxMTczMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjAwMDBcIjogXCLmuZbljJfnnIFcIixcblx0ICAgIFwiNDIwMTAwXCI6IFwi5q2m5rGJ5biCXCIsXG5cdCAgICBcIjQyMDEwMlwiOiBcIuaxn+WyuOWMulwiLFxuXHQgICAgXCI0MjAxMDNcIjogXCLmsZ/msYnljLpcIixcblx0ICAgIFwiNDIwMTA0XCI6IFwi56Ga5Y+j5Yy6XCIsXG5cdCAgICBcIjQyMDEwNVwiOiBcIuaxiemYs+WMulwiLFxuXHQgICAgXCI0MjAxMDZcIjogXCLmrabmmIzljLpcIixcblx0ICAgIFwiNDIwMTA3XCI6IFwi6Z2S5bGx5Yy6XCIsXG5cdCAgICBcIjQyMDExMVwiOiBcIua0quWxseWMulwiLFxuXHQgICAgXCI0MjAxMTJcIjogXCLkuJzopb/muZbljLpcIixcblx0ICAgIFwiNDIwMTEzXCI6IFwi5rGJ5Y2X5Yy6XCIsXG5cdCAgICBcIjQyMDExNFwiOiBcIuiUoeeUuOWMulwiLFxuXHQgICAgXCI0MjAxMTVcIjogXCLmsZ/lpI/ljLpcIixcblx0ICAgIFwiNDIwMTE2XCI6IFwi6buE6ZmC5Yy6XCIsXG5cdCAgICBcIjQyMDExN1wiOiBcIuaWsOa0suWMulwiLFxuXHQgICAgXCI0MjAxMThcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIwMjAwXCI6IFwi6buE55+z5biCXCIsXG5cdCAgICBcIjQyMDIwMlwiOiBcIum7hOefs+a4r+WMulwiLFxuXHQgICAgXCI0MjAyMDNcIjogXCLopb/loZ7lsbHljLpcIixcblx0ICAgIFwiNDIwMjA0XCI6IFwi5LiL6ZmG5Yy6XCIsXG5cdCAgICBcIjQyMDIwNVwiOiBcIumTgeWxseWMulwiLFxuXHQgICAgXCI0MjAyMjJcIjogXCLpmLPmlrDljr9cIixcblx0ICAgIFwiNDIwMjgxXCI6IFwi5aSn5Ya25biCXCIsXG5cdCAgICBcIjQyMDI4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjAzMDBcIjogXCLljYHloLDluIJcIixcblx0ICAgIFwiNDIwMzAyXCI6IFwi6IyF566t5Yy6XCIsXG5cdCAgICBcIjQyMDMwM1wiOiBcIuW8oOa5vuWMulwiLFxuXHQgICAgXCI0MjAzMjFcIjogXCLpg6fljr9cIixcblx0ICAgIFwiNDIwMzIyXCI6IFwi6YOn6KW/5Y6/XCIsXG5cdCAgICBcIjQyMDMyM1wiOiBcIuerueWxseWOv1wiLFxuXHQgICAgXCI0MjAzMjRcIjogXCLnq7nmuqrljr9cIixcblx0ICAgIFwiNDIwMzI1XCI6IFwi5oi/5Y6/XCIsXG5cdCAgICBcIjQyMDM4MVwiOiBcIuS4ueaxn+WPo+W4glwiLFxuXHQgICAgXCI0MjAzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIwNTAwXCI6IFwi5a6c5piM5biCXCIsXG5cdCAgICBcIjQyMDUwMlwiOiBcIuilv+mZteWMulwiLFxuXHQgICAgXCI0MjA1MDNcIjogXCLkvI3lrrblspfljLpcIixcblx0ICAgIFwiNDIwNTA0XCI6IFwi54K55Yab5Yy6XCIsXG5cdCAgICBcIjQyMDUwNVwiOiBcIueMh+S6reWMulwiLFxuXHQgICAgXCI0MjA1MDZcIjogXCLlpLfpmbXljLpcIixcblx0ICAgIFwiNDIwNTI1XCI6IFwi6L+c5a6J5Y6/XCIsXG5cdCAgICBcIjQyMDUyNlwiOiBcIuWFtOWxseWOv1wiLFxuXHQgICAgXCI0MjA1MjdcIjogXCLnp63lvZLljr9cIixcblx0ICAgIFwiNDIwNTI4XCI6IFwi6ZW/6Ziz5Zyf5a625peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQyMDUyOVwiOiBcIuS6lOWzsOWcn+WutuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MjA1ODFcIjogXCLlrpzpg73luIJcIixcblx0ICAgIFwiNDIwNTgyXCI6IFwi5b2T6Ziz5biCXCIsXG5cdCAgICBcIjQyMDU4M1wiOiBcIuaeneaxn+W4glwiLFxuXHQgICAgXCI0MjA1ODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIwNjAwXCI6IFwi6KWE6Ziz5biCXCIsXG5cdCAgICBcIjQyMDYwMlwiOiBcIuilhOWfjuWMulwiLFxuXHQgICAgXCI0MjA2MDZcIjogXCLmqIrln47ljLpcIixcblx0ICAgIFwiNDIwNjA3XCI6IFwi6KWE5bee5Yy6XCIsXG5cdCAgICBcIjQyMDYyNFwiOiBcIuWNl+a8s+WOv1wiLFxuXHQgICAgXCI0MjA2MjVcIjogXCLosLfln47ljr9cIixcblx0ICAgIFwiNDIwNjI2XCI6IFwi5L+d5bq35Y6/XCIsXG5cdCAgICBcIjQyMDY4MlwiOiBcIuiAgeays+WPo+W4glwiLFxuXHQgICAgXCI0MjA2ODNcIjogXCLmnqPpmLPluIJcIixcblx0ICAgIFwiNDIwNjg0XCI6IFwi5a6c5Z+O5biCXCIsXG5cdCAgICBcIjQyMDY4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjA3MDBcIjogXCLphILlt57luIJcIixcblx0ICAgIFwiNDIwNzAyXCI6IFwi5qKB5a2Q5rmW5Yy6XCIsXG5cdCAgICBcIjQyMDcwM1wiOiBcIuWNjuWuueWMulwiLFxuXHQgICAgXCI0MjA3MDRcIjogXCLphILln47ljLpcIixcblx0ICAgIFwiNDIwNzA1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQyMDgwMFwiOiBcIuiNhumXqOW4glwiLFxuXHQgICAgXCI0MjA4MDJcIjogXCLkuJzlrp3ljLpcIixcblx0ICAgIFwiNDIwODA0XCI6IFwi5o6H5YiA5Yy6XCIsXG5cdCAgICBcIjQyMDgyMVwiOiBcIuS6rOWxseWOv1wiLFxuXHQgICAgXCI0MjA4MjJcIjogXCLmspnmtIvljr9cIixcblx0ICAgIFwiNDIwODgxXCI6IFwi6ZKf56Wl5biCXCIsXG5cdCAgICBcIjQyMDg4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjA5MDBcIjogXCLlrZ3mhJ/luIJcIixcblx0ICAgIFwiNDIwOTAyXCI6IFwi5a2d5Y2X5Yy6XCIsXG5cdCAgICBcIjQyMDkyMVwiOiBcIuWtneaYjOWOv1wiLFxuXHQgICAgXCI0MjA5MjJcIjogXCLlpKfmgp/ljr9cIixcblx0ICAgIFwiNDIwOTIzXCI6IFwi5LqR5qKm5Y6/XCIsXG5cdCAgICBcIjQyMDk4MVwiOiBcIuW6lOWfjuW4glwiLFxuXHQgICAgXCI0MjA5ODJcIjogXCLlronpmYbluIJcIixcblx0ICAgIFwiNDIwOTg0XCI6IFwi5rGJ5bed5biCXCIsXG5cdCAgICBcIjQyMDk4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjEwMDBcIjogXCLojYblt57luIJcIixcblx0ICAgIFwiNDIxMDAyXCI6IFwi5rKZ5biC5Yy6XCIsXG5cdCAgICBcIjQyMTAwM1wiOiBcIuiNhuW3nuWMulwiLFxuXHQgICAgXCI0MjEwMjJcIjogXCLlhazlronljr9cIixcblx0ICAgIFwiNDIxMDIzXCI6IFwi55uR5Yip5Y6/XCIsXG5cdCAgICBcIjQyMTAyNFwiOiBcIuaxn+mZteWOv1wiLFxuXHQgICAgXCI0MjEwODFcIjogXCLnn7PpppbluIJcIixcblx0ICAgIFwiNDIxMDgzXCI6IFwi5rSq5rmW5biCXCIsXG5cdCAgICBcIjQyMTA4N1wiOiBcIuadvua7i+W4glwiLFxuXHQgICAgXCI0MjEwODhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIxMTAwXCI6IFwi6buE5YaI5biCXCIsXG5cdCAgICBcIjQyMTEwMlwiOiBcIum7hOW3nuWMulwiLFxuXHQgICAgXCI0MjExMjFcIjogXCLlm6Lpo47ljr9cIixcblx0ICAgIFwiNDIxMTIyXCI6IFwi57qi5a6J5Y6/XCIsXG5cdCAgICBcIjQyMTEyM1wiOiBcIue9l+eUsOWOv1wiLFxuXHQgICAgXCI0MjExMjRcIjogXCLoi7HlsbHljr9cIixcblx0ICAgIFwiNDIxMTI1XCI6IFwi5rWg5rC05Y6/XCIsXG5cdCAgICBcIjQyMTEyNlwiOiBcIuiVsuaYpeWOv1wiLFxuXHQgICAgXCI0MjExMjdcIjogXCLpu4TmooXljr9cIixcblx0ICAgIFwiNDIxMTgxXCI6IFwi6bq75Z+O5biCXCIsXG5cdCAgICBcIjQyMTE4MlwiOiBcIuatpueptOW4glwiLFxuXHQgICAgXCI0MjExODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDIxMjAwXCI6IFwi5ZK45a6B5biCXCIsXG5cdCAgICBcIjQyMTIwMlwiOiBcIuWSuOWuieWMulwiLFxuXHQgICAgXCI0MjEyMjFcIjogXCLlmInpsbzljr9cIixcblx0ICAgIFwiNDIxMjIyXCI6IFwi6YCa5Z+O5Y6/XCIsXG5cdCAgICBcIjQyMTIyM1wiOiBcIuW0h+mYs+WOv1wiLFxuXHQgICAgXCI0MjEyMjRcIjogXCLpgJrlsbHljr9cIixcblx0ICAgIFwiNDIxMjgxXCI6IFwi6LWk5aOB5biCXCIsXG5cdCAgICBcIjQyMTI4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjEzMDBcIjogXCLpmo/lt57luIJcIixcblx0ICAgIFwiNDIxMzAyXCI6IFwi5pu+6YO95Yy6XCIsXG5cdCAgICBcIjQyMTMyMVwiOiBcIumaj+WOv1wiLFxuXHQgICAgXCI0MjEzODFcIjogXCLlub/msLTluIJcIixcblx0ICAgIFwiNDIxMzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQyMjgwMFwiOiBcIuaBqeaWveWcn+WutuaXj+iLl+aXj+iHquayu+W3nlwiLFxuXHQgICAgXCI0MjI4MDFcIjogXCLmganmlr3luIJcIixcblx0ICAgIFwiNDIyODAyXCI6IFwi5Yip5bed5biCXCIsXG5cdCAgICBcIjQyMjgyMlwiOiBcIuW7uuWni+WOv1wiLFxuXHQgICAgXCI0MjI4MjNcIjogXCLlt7TkuJzljr9cIixcblx0ICAgIFwiNDIyODI1XCI6IFwi5a6j5oGp5Y6/XCIsXG5cdCAgICBcIjQyMjgyNlwiOiBcIuWSuOS4sOWOv1wiLFxuXHQgICAgXCI0MjI4MjdcIjogXCLmnaXlh6Tljr9cIixcblx0ICAgIFwiNDIyODI4XCI6IFwi6bmk5bOw5Y6/XCIsXG5cdCAgICBcIjQyMjgyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MjkwMDRcIjogXCLku5nmoYPluIJcIixcblx0ICAgIFwiNDI5MDA1XCI6IFwi5r2c5rGf5biCXCIsXG5cdCAgICBcIjQyOTAwNlwiOiBcIuWkqemXqOW4glwiLFxuXHQgICAgXCI0MjkwMjFcIjogXCLnpZ7lhpzmnrbmnpfljLpcIixcblx0ICAgIFwiNDMwMDAwXCI6IFwi5rmW5Y2X55yBXCIsXG5cdCAgICBcIjQzMDEwMFwiOiBcIumVv+aymeW4glwiLFxuXHQgICAgXCI0MzAxMDJcIjogXCLoipnok4nljLpcIixcblx0ICAgIFwiNDMwMTAzXCI6IFwi5aSp5b+D5Yy6XCIsXG5cdCAgICBcIjQzMDEwNFwiOiBcIuWys+m6k+WMulwiLFxuXHQgICAgXCI0MzAxMDVcIjogXCLlvIDnpo/ljLpcIixcblx0ICAgIFwiNDMwMTExXCI6IFwi6Zuo6Iqx5Yy6XCIsXG5cdCAgICBcIjQzMDEyMVwiOiBcIumVv+aymeWOv1wiLFxuXHQgICAgXCI0MzAxMjJcIjogXCLmnJvln47ljLpcIixcblx0ICAgIFwiNDMwMTI0XCI6IFwi5a6B5Lmh5Y6/XCIsXG5cdCAgICBcIjQzMDE4MVwiOiBcIua1j+mYs+W4glwiLFxuXHQgICAgXCI0MzAxODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMwMjAwXCI6IFwi5qCq5rSy5biCXCIsXG5cdCAgICBcIjQzMDIwMlwiOiBcIuiNt+WhmOWMulwiLFxuXHQgICAgXCI0MzAyMDNcIjogXCLoiqbmt57ljLpcIixcblx0ICAgIFwiNDMwMjA0XCI6IFwi55+z5bOw5Yy6XCIsXG5cdCAgICBcIjQzMDIxMVwiOiBcIuWkqeWFg+WMulwiLFxuXHQgICAgXCI0MzAyMjFcIjogXCLmoKrmtLLljr9cIixcblx0ICAgIFwiNDMwMjIzXCI6IFwi5pS45Y6/XCIsXG5cdCAgICBcIjQzMDIyNFwiOiBcIuiMtumZteWOv1wiLFxuXHQgICAgXCI0MzAyMjVcIjogXCLngo7pmbXljr9cIixcblx0ICAgIFwiNDMwMjgxXCI6IFwi6Ya06Zm15biCXCIsXG5cdCAgICBcIjQzMDI4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzAzMDBcIjogXCLmuZjmva3luIJcIixcblx0ICAgIFwiNDMwMzAyXCI6IFwi6Zuo5rmW5Yy6XCIsXG5cdCAgICBcIjQzMDMwNFwiOiBcIuWys+WhmOWMulwiLFxuXHQgICAgXCI0MzAzMjFcIjogXCLmuZjmva3ljr9cIixcblx0ICAgIFwiNDMwMzgxXCI6IFwi5rmY5Lmh5biCXCIsXG5cdCAgICBcIjQzMDM4MlwiOiBcIumftuWxseW4glwiLFxuXHQgICAgXCI0MzAzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMwNDAwXCI6IFwi6KGh6Ziz5biCXCIsXG5cdCAgICBcIjQzMDQwNVwiOiBcIuePoOaZluWMulwiLFxuXHQgICAgXCI0MzA0MDZcIjogXCLpm4Hls7DljLpcIixcblx0ICAgIFwiNDMwNDA3XCI6IFwi55+z6byT5Yy6XCIsXG5cdCAgICBcIjQzMDQwOFwiOiBcIuiSuOa5mOWMulwiLFxuXHQgICAgXCI0MzA0MTJcIjogXCLljZflsrPljLpcIixcblx0ICAgIFwiNDMwNDIxXCI6IFwi6KGh6Ziz5Y6/XCIsXG5cdCAgICBcIjQzMDQyMlwiOiBcIuihoeWNl+WOv1wiLFxuXHQgICAgXCI0MzA0MjNcIjogXCLooaHlsbHljr9cIixcblx0ICAgIFwiNDMwNDI0XCI6IFwi6KGh5Lic5Y6/XCIsXG5cdCAgICBcIjQzMDQyNlwiOiBcIuelgeS4nOWOv1wiLFxuXHQgICAgXCI0MzA0ODFcIjogXCLogJLpmLPluIJcIixcblx0ICAgIFwiNDMwNDgyXCI6IFwi5bi45a6B5biCXCIsXG5cdCAgICBcIjQzMDQ4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzA1MDBcIjogXCLpgrXpmLPluIJcIixcblx0ICAgIFwiNDMwNTAyXCI6IFwi5Y+M5riF5Yy6XCIsXG5cdCAgICBcIjQzMDUwM1wiOiBcIuWkp+elpeWMulwiLFxuXHQgICAgXCI0MzA1MTFcIjogXCLljJfloZTljLpcIixcblx0ICAgIFwiNDMwNTIxXCI6IFwi6YK15Lic5Y6/XCIsXG5cdCAgICBcIjQzMDUyMlwiOiBcIuaWsOmCteWOv1wiLFxuXHQgICAgXCI0MzA1MjNcIjogXCLpgrXpmLPljr9cIixcblx0ICAgIFwiNDMwNTI0XCI6IFwi6ZqG5Zue5Y6/XCIsXG5cdCAgICBcIjQzMDUyNVwiOiBcIua0nuWPo+WOv1wiLFxuXHQgICAgXCI0MzA1MjdcIjogXCLnu6XlroHljr9cIixcblx0ICAgIFwiNDMwNTI4XCI6IFwi5paw5a6B5Y6/XCIsXG5cdCAgICBcIjQzMDUyOVwiOiBcIuWfjuatpeiLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MzA1ODFcIjogXCLmrablhojluIJcIixcblx0ICAgIFwiNDMwNTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQzMDYwMFwiOiBcIuWys+mYs+W4glwiLFxuXHQgICAgXCI0MzA2MDJcIjogXCLlsrPpmLPmpbzljLpcIixcblx0ICAgIFwiNDMwNjAzXCI6IFwi5LqR5rqq5Yy6XCIsXG5cdCAgICBcIjQzMDYxMVwiOiBcIuWQm+WxseWMulwiLFxuXHQgICAgXCI0MzA2MjFcIjogXCLlsrPpmLPljr9cIixcblx0ICAgIFwiNDMwNjIzXCI6IFwi5Y2O5a655Y6/XCIsXG5cdCAgICBcIjQzMDYyNFwiOiBcIua5mOmYtOWOv1wiLFxuXHQgICAgXCI0MzA2MjZcIjogXCLlubPmsZ/ljr9cIixcblx0ICAgIFwiNDMwNjgxXCI6IFwi5rGo572X5biCXCIsXG5cdCAgICBcIjQzMDY4MlwiOiBcIuS4tOa5mOW4glwiLFxuXHQgICAgXCI0MzA2ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMwNzAwXCI6IFwi5bi45b635biCXCIsXG5cdCAgICBcIjQzMDcwMlwiOiBcIuatpumZteWMulwiLFxuXHQgICAgXCI0MzA3MDNcIjogXCLpvI7ln47ljLpcIixcblx0ICAgIFwiNDMwNzIxXCI6IFwi5a6J5Lmh5Y6/XCIsXG5cdCAgICBcIjQzMDcyMlwiOiBcIuaxieWvv+WOv1wiLFxuXHQgICAgXCI0MzA3MjNcIjogXCLmvqfljr9cIixcblx0ICAgIFwiNDMwNzI0XCI6IFwi5Li05r6n5Y6/XCIsXG5cdCAgICBcIjQzMDcyNVwiOiBcIuahg+a6kOWOv1wiLFxuXHQgICAgXCI0MzA3MjZcIjogXCLnn7Ppl6jljr9cIixcblx0ICAgIFwiNDMwNzgxXCI6IFwi5rSl5biC5biCXCIsXG5cdCAgICBcIjQzMDc4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzA4MDBcIjogXCLlvKDlrrbnlYzluIJcIixcblx0ICAgIFwiNDMwODAyXCI6IFwi5rC45a6a5Yy6XCIsXG5cdCAgICBcIjQzMDgxMVwiOiBcIuatpumZtea6kOWMulwiLFxuXHQgICAgXCI0MzA4MjFcIjogXCLmhYjliKnljr9cIixcblx0ICAgIFwiNDMwODIyXCI6IFwi5qGR5qSN5Y6/XCIsXG5cdCAgICBcIjQzMDgyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzA5MDBcIjogXCLnm4rpmLPluIJcIixcblx0ICAgIFwiNDMwOTAyXCI6IFwi6LWE6Ziz5Yy6XCIsXG5cdCAgICBcIjQzMDkwM1wiOiBcIui1q+WxseWMulwiLFxuXHQgICAgXCI0MzA5MjFcIjogXCLljZfljr9cIixcblx0ICAgIFwiNDMwOTIyXCI6IFwi5qGD5rGf5Y6/XCIsXG5cdCAgICBcIjQzMDkyM1wiOiBcIuWuieWMluWOv1wiLFxuXHQgICAgXCI0MzA5ODFcIjogXCLmsoXmsZ/luIJcIixcblx0ICAgIFwiNDMwOTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQzMTAwMFwiOiBcIumDtOW3nuW4glwiLFxuXHQgICAgXCI0MzEwMDJcIjogXCLljJfmuZbljLpcIixcblx0ICAgIFwiNDMxMDAzXCI6IFwi6IuP5LuZ5Yy6XCIsXG5cdCAgICBcIjQzMTAyMVwiOiBcIuahgumYs+WOv1wiLFxuXHQgICAgXCI0MzEwMjJcIjogXCLlrpznq6Dljr9cIixcblx0ICAgIFwiNDMxMDIzXCI6IFwi5rC45YW05Y6/XCIsXG5cdCAgICBcIjQzMTAyNFwiOiBcIuWYieemvuWOv1wiLFxuXHQgICAgXCI0MzEwMjVcIjogXCLkuLTmrabljr9cIixcblx0ICAgIFwiNDMxMDI2XCI6IFwi5rGd5Z+O5Y6/XCIsXG5cdCAgICBcIjQzMTAyN1wiOiBcIuahguS4nOWOv1wiLFxuXHQgICAgXCI0MzEwMjhcIjogXCLlronku4Hljr9cIixcblx0ICAgIFwiNDMxMDgxXCI6IFwi6LWE5YW05biCXCIsXG5cdCAgICBcIjQzMTA4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzExMDBcIjogXCLmsLjlt57luIJcIixcblx0ICAgIFwiNDMxMTAyXCI6IFwi6Zu26Zm15Yy6XCIsXG5cdCAgICBcIjQzMTEwM1wiOiBcIuWGt+awtOa7qeWMulwiLFxuXHQgICAgXCI0MzExMjFcIjogXCLnpYHpmLPljr9cIixcblx0ICAgIFwiNDMxMTIyXCI6IFwi5Lic5a6J5Y6/XCIsXG5cdCAgICBcIjQzMTEyM1wiOiBcIuWPjOeJjOWOv1wiLFxuXHQgICAgXCI0MzExMjRcIjogXCLpgZPljr9cIixcblx0ICAgIFwiNDMxMTI1XCI6IFwi5rGf5rC45Y6/XCIsXG5cdCAgICBcIjQzMTEyNlwiOiBcIuWugei/nOWOv1wiLFxuXHQgICAgXCI0MzExMjdcIjogXCLok53lsbHljr9cIixcblx0ICAgIFwiNDMxMTI4XCI6IFwi5paw55Sw5Y6/XCIsXG5cdCAgICBcIjQzMTEyOVwiOiBcIuaxn+WNjueRtuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MzExMzBcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMxMjAwXCI6IFwi5oCA5YyW5biCXCIsXG5cdCAgICBcIjQzMTIwMlwiOiBcIum5pOWfjuWMulwiLFxuXHQgICAgXCI0MzEyMjFcIjogXCLkuK3mlrnljr9cIixcblx0ICAgIFwiNDMxMjIyXCI6IFwi5rKF6Zm15Y6/XCIsXG5cdCAgICBcIjQzMTIyM1wiOiBcIui+sOa6quWOv1wiLFxuXHQgICAgXCI0MzEyMjRcIjogXCLmuobmtabljr9cIixcblx0ICAgIFwiNDMxMjI1XCI6IFwi5Lya5ZCM5Y6/XCIsXG5cdCAgICBcIjQzMTIyNlwiOiBcIum6u+mYs+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MzEyMjdcIjogXCLmlrDmmYPkvpfml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDMxMjI4XCI6IFwi6Iq35rGf5L6X5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQzMTIyOVwiOiBcIumdluW3nuiLl+aXj+S+l+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0MzEyMzBcIjogXCLpgJrpgZPkvpfml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDMxMjgxXCI6IFwi5rSq5rGf5biCXCIsXG5cdCAgICBcIjQzMTI4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0MzEzMDBcIjogXCLlqITlupXluIJcIixcblx0ICAgIFwiNDMxMzAyXCI6IFwi5aiE5pif5Yy6XCIsXG5cdCAgICBcIjQzMTMyMVwiOiBcIuWPjOWzsOWOv1wiLFxuXHQgICAgXCI0MzEzMjJcIjogXCLmlrDljJbljr9cIixcblx0ICAgIFwiNDMxMzgxXCI6IFwi5Ya35rC05rGf5biCXCIsXG5cdCAgICBcIjQzMTM4MlwiOiBcIua2n+a6kOW4glwiLFxuXHQgICAgXCI0MzEzODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDMzMTAwXCI6IFwi5rmY6KW/5Zyf5a625peP6IuX5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjQzMzEwMVwiOiBcIuWQiemmluW4glwiLFxuXHQgICAgXCI0MzMxMjJcIjogXCLms7jmuqrljr9cIixcblx0ICAgIFwiNDMzMTIzXCI6IFwi5Yek5Yew5Y6/XCIsXG5cdCAgICBcIjQzMzEyNFwiOiBcIuiKseWeo+WOv1wiLFxuXHQgICAgXCI0MzMxMjVcIjogXCLkv53pnZbljr9cIixcblx0ICAgIFwiNDMzMTI2XCI6IFwi5Y+k5LiI5Y6/XCIsXG5cdCAgICBcIjQzMzEyN1wiOiBcIuawuOmhuuWOv1wiLFxuXHQgICAgXCI0MzMxMzBcIjogXCLpvpnlsbHljr9cIixcblx0ICAgIFwiNDMzMTMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDAwMFwiOiBcIuW5v+S4nOecgVwiLFxuXHQgICAgXCI0NDAxMDBcIjogXCLlub/lt57luIJcIixcblx0ICAgIFwiNDQwMTAzXCI6IFwi6I2U5rm+5Yy6XCIsXG5cdCAgICBcIjQ0MDEwNFwiOiBcIui2iuengOWMulwiLFxuXHQgICAgXCI0NDAxMDVcIjogXCLmtbfnj6DljLpcIixcblx0ICAgIFwiNDQwMTA2XCI6IFwi5aSp5rKz5Yy6XCIsXG5cdCAgICBcIjQ0MDExMVwiOiBcIueZveS6keWMulwiLFxuXHQgICAgXCI0NDAxMTJcIjogXCLpu4Tln5TljLpcIixcblx0ICAgIFwiNDQwMTEzXCI6IFwi55Wq56a65Yy6XCIsXG5cdCAgICBcIjQ0MDExNFwiOiBcIuiKsemDveWMulwiLFxuXHQgICAgXCI0NDAxMTVcIjogXCLljZfmspnljLpcIixcblx0ICAgIFwiNDQwMTE2XCI6IFwi6JCd5bKX5Yy6XCIsXG5cdCAgICBcIjQ0MDE4M1wiOiBcIuWinuWfjuW4glwiLFxuXHQgICAgXCI0NDAxODRcIjogXCLku47ljJbluIJcIixcblx0ICAgIFwiNDQwMTg5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDIwMFwiOiBcIumftuWFs+W4glwiLFxuXHQgICAgXCI0NDAyMDNcIjogXCLmrabmsZ/ljLpcIixcblx0ICAgIFwiNDQwMjA0XCI6IFwi5rWI5rGf5Yy6XCIsXG5cdCAgICBcIjQ0MDIwNVwiOiBcIuabsuaxn+WMulwiLFxuXHQgICAgXCI0NDAyMjJcIjogXCLlp4vlhbTljr9cIixcblx0ICAgIFwiNDQwMjI0XCI6IFwi5LuB5YyW5Y6/XCIsXG5cdCAgICBcIjQ0MDIyOVwiOiBcIue/gea6kOWOv1wiLFxuXHQgICAgXCI0NDAyMzJcIjogXCLkubPmupDnkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDQwMjMzXCI6IFwi5paw5Liw5Y6/XCIsXG5cdCAgICBcIjQ0MDI4MVwiOiBcIuS5kOaYjOW4glwiLFxuXHQgICAgXCI0NDAyODJcIjogXCLljZfpm4TluIJcIixcblx0ICAgIFwiNDQwMjgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDMwMFwiOiBcIua3seWcs+W4glwiLFxuXHQgICAgXCI0NDAzMDNcIjogXCLnvZfmuZbljLpcIixcblx0ICAgIFwiNDQwMzA0XCI6IFwi56aP55Sw5Yy6XCIsXG5cdCAgICBcIjQ0MDMwNVwiOiBcIuWNl+WxseWMulwiLFxuXHQgICAgXCI0NDAzMDZcIjogXCLlrp3lronljLpcIixcblx0ICAgIFwiNDQwMzA3XCI6IFwi6b6Z5bKX5Yy6XCIsXG5cdCAgICBcIjQ0MDMwOFwiOiBcIuebkOeUsOWMulwiLFxuXHQgICAgXCI0NDAzMDlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQwMzIwXCI6IFwi5YWJ5piO5paw5Yy6XCIsXG5cdCAgICBcIjQ0MDMyMVwiOiBcIuWdquWxseaWsOWMulwiLFxuXHQgICAgXCI0NDAzMjJcIjogXCLlpKfpuY/mlrDljLpcIixcblx0ICAgIFwiNDQwMzIzXCI6IFwi6b6Z5Y2O5paw5Yy6XCIsXG5cdCAgICBcIjQ0MDQwMFwiOiBcIuePoOa1t+W4glwiLFxuXHQgICAgXCI0NDA0MDJcIjogXCLpppnmtLLljLpcIixcblx0ICAgIFwiNDQwNDAzXCI6IFwi5paX6Zeo5Yy6XCIsXG5cdCAgICBcIjQ0MDQwNFwiOiBcIumHkea5vuWMulwiLFxuXHQgICAgXCI0NDA0ODhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQwNTAwXCI6IFwi5rGV5aS05biCXCIsXG5cdCAgICBcIjQ0MDUwN1wiOiBcIum+mea5luWMulwiLFxuXHQgICAgXCI0NDA1MTFcIjogXCLph5HlubPljLpcIixcblx0ICAgIFwiNDQwNTEyXCI6IFwi5r+g5rGf5Yy6XCIsXG5cdCAgICBcIjQ0MDUxM1wiOiBcIua9rumYs+WMulwiLFxuXHQgICAgXCI0NDA1MTRcIjogXCLmva7ljZfljLpcIixcblx0ICAgIFwiNDQwNTE1XCI6IFwi5r6E5rW35Yy6XCIsXG5cdCAgICBcIjQ0MDUyM1wiOiBcIuWNl+a+s+WOv1wiLFxuXHQgICAgXCI0NDA1MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQwNjAwXCI6IFwi5L2b5bGx5biCXCIsXG5cdCAgICBcIjQ0MDYwNFwiOiBcIuemheWfjuWMulwiLFxuXHQgICAgXCI0NDA2MDVcIjogXCLljZfmtbfljLpcIixcblx0ICAgIFwiNDQwNjA2XCI6IFwi6aG65b635Yy6XCIsXG5cdCAgICBcIjQ0MDYwN1wiOiBcIuS4ieawtOWMulwiLFxuXHQgICAgXCI0NDA2MDhcIjogXCLpq5jmmI7ljLpcIixcblx0ICAgIFwiNDQwNjA5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDcwMFwiOiBcIuaxn+mXqOW4glwiLFxuXHQgICAgXCI0NDA3MDNcIjogXCLok6zmsZ/ljLpcIixcblx0ICAgIFwiNDQwNzA0XCI6IFwi5rGf5rW35Yy6XCIsXG5cdCAgICBcIjQ0MDcwNVwiOiBcIuaWsOS8muWMulwiLFxuXHQgICAgXCI0NDA3ODFcIjogXCLlj7DlsbHluIJcIixcblx0ICAgIFwiNDQwNzgzXCI6IFwi5byA5bmz5biCXCIsXG5cdCAgICBcIjQ0MDc4NFwiOiBcIum5pOWxseW4glwiLFxuXHQgICAgXCI0NDA3ODVcIjogXCLmganlubPluIJcIixcblx0ICAgIFwiNDQwNzg2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MDgwMFwiOiBcIua5m+axn+W4glwiLFxuXHQgICAgXCI0NDA4MDJcIjogXCLotaTlnY7ljLpcIixcblx0ICAgIFwiNDQwODAzXCI6IFwi6Zye5bGx5Yy6XCIsXG5cdCAgICBcIjQ0MDgwNFwiOiBcIuWdoeWktOWMulwiLFxuXHQgICAgXCI0NDA4MTFcIjogXCLpurvnq6DljLpcIixcblx0ICAgIFwiNDQwODIzXCI6IFwi6YGC5rqq5Y6/XCIsXG5cdCAgICBcIjQ0MDgyNVwiOiBcIuW+kOmXu+WOv1wiLFxuXHQgICAgXCI0NDA4ODFcIjogXCLlu4nmsZ/luIJcIixcblx0ICAgIFwiNDQwODgyXCI6IFwi6Zu35bee5biCXCIsXG5cdCAgICBcIjQ0MDg4M1wiOiBcIuWQtOW3neW4glwiLFxuXHQgICAgXCI0NDA4ODRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQwOTAwXCI6IFwi6IyC5ZCN5biCXCIsXG5cdCAgICBcIjQ0MDkwMlwiOiBcIuiMguWNl+WMulwiLFxuXHQgICAgXCI0NDA5MDNcIjogXCLojILmuK/ljLpcIixcblx0ICAgIFwiNDQwOTIzXCI6IFwi55S155m95Y6/XCIsXG5cdCAgICBcIjQ0MDk4MVwiOiBcIumrmOW3nuW4glwiLFxuXHQgICAgXCI0NDA5ODJcIjogXCLljJblt57luIJcIixcblx0ICAgIFwiNDQwOTgzXCI6IFwi5L+h5a6c5biCXCIsXG5cdCAgICBcIjQ0MDk4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDEyMDBcIjogXCLogofluobluIJcIixcblx0ICAgIFwiNDQxMjAyXCI6IFwi56uv5bee5Yy6XCIsXG5cdCAgICBcIjQ0MTIwM1wiOiBcIum8jua5luWMulwiLFxuXHQgICAgXCI0NDEyMjNcIjogXCLlub/lroHljr9cIixcblx0ICAgIFwiNDQxMjI0XCI6IFwi5oCA6ZuG5Y6/XCIsXG5cdCAgICBcIjQ0MTIyNVwiOiBcIuWwgeW8gOWOv1wiLFxuXHQgICAgXCI0NDEyMjZcIjogXCLlvrfluobljr9cIixcblx0ICAgIFwiNDQxMjgzXCI6IFwi6auY6KaB5biCXCIsXG5cdCAgICBcIjQ0MTI4NFwiOiBcIuWbm+S8muW4glwiLFxuXHQgICAgXCI0NDEyODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDQxMzAwXCI6IFwi5oOg5bee5biCXCIsXG5cdCAgICBcIjQ0MTMwMlwiOiBcIuaDoOWfjuWMulwiLFxuXHQgICAgXCI0NDEzMDNcIjogXCLmg6DpmLPljLpcIixcblx0ICAgIFwiNDQxMzIyXCI6IFwi5Y2a572X5Y6/XCIsXG5cdCAgICBcIjQ0MTMyM1wiOiBcIuaDoOS4nOWOv1wiLFxuXHQgICAgXCI0NDEzMjRcIjogXCLpvpnpl6jljr9cIixcblx0ICAgIFwiNDQxMzI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MTQwMFwiOiBcIuaiheW3nuW4glwiLFxuXHQgICAgXCI0NDE0MDJcIjogXCLmooXmsZ/ljLpcIixcblx0ICAgIFwiNDQxNDIxXCI6IFwi5qKF5Y6/XCIsXG5cdCAgICBcIjQ0MTQyMlwiOiBcIuWkp+WflOWOv1wiLFxuXHQgICAgXCI0NDE0MjNcIjogXCLkuLDpobrljr9cIixcblx0ICAgIFwiNDQxNDI0XCI6IFwi5LqU5Y2O5Y6/XCIsXG5cdCAgICBcIjQ0MTQyNlwiOiBcIuW5s+i/nOWOv1wiLFxuXHQgICAgXCI0NDE0MjdcIjogXCLolYnlsq3ljr9cIixcblx0ICAgIFwiNDQxNDgxXCI6IFwi5YW05a6B5biCXCIsXG5cdCAgICBcIjQ0MTQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDE1MDBcIjogXCLmsZXlsL7luIJcIixcblx0ICAgIFwiNDQxNTAyXCI6IFwi5Z+O5Yy6XCIsXG5cdCAgICBcIjQ0MTUyMVwiOiBcIua1t+S4sOWOv1wiLFxuXHQgICAgXCI0NDE1MjNcIjogXCLpmYbmsrPljr9cIixcblx0ICAgIFwiNDQxNTgxXCI6IFwi6ZmG5Liw5biCXCIsXG5cdCAgICBcIjQ0MTU4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDE2MDBcIjogXCLmsrPmupDluIJcIixcblx0ICAgIFwiNDQxNjAyXCI6IFwi5rqQ5Z+O5Yy6XCIsXG5cdCAgICBcIjQ0MTYyMVwiOiBcIue0q+mHkeWOv1wiLFxuXHQgICAgXCI0NDE2MjJcIjogXCLpvpnlt53ljr9cIixcblx0ICAgIFwiNDQxNjIzXCI6IFwi6L+e5bmz5Y6/XCIsXG5cdCAgICBcIjQ0MTYyNFwiOiBcIuWSjOW5s+WOv1wiLFxuXHQgICAgXCI0NDE2MjVcIjogXCLkuJzmupDljr9cIixcblx0ICAgIFwiNDQxNjI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MTcwMFwiOiBcIumYs+axn+W4glwiLFxuXHQgICAgXCI0NDE3MDJcIjogXCLmsZ/ln47ljLpcIixcblx0ICAgIFwiNDQxNzIxXCI6IFwi6Ziz6KW/5Y6/XCIsXG5cdCAgICBcIjQ0MTcyM1wiOiBcIumYs+S4nOWOv1wiLFxuXHQgICAgXCI0NDE3ODFcIjogXCLpmLPmmKXluIJcIixcblx0ICAgIFwiNDQxNzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0MTgwMFwiOiBcIua4hei/nOW4glwiLFxuXHQgICAgXCI0NDE4MDJcIjogXCLmuIXln47ljLpcIixcblx0ICAgIFwiNDQxODIxXCI6IFwi5L2b5YaI5Y6/XCIsXG5cdCAgICBcIjQ0MTgyM1wiOiBcIumYs+WxseWOv1wiLFxuXHQgICAgXCI0NDE4MjVcIjogXCLov57lsbHlo67ml4/nkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDQxODI2XCI6IFwi6L+e5Y2X55G25peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ0MTgyN1wiOiBcIua4heaWsOWMulwiLFxuXHQgICAgXCI0NDE4ODFcIjogXCLoi7HlvrfluIJcIixcblx0ICAgIFwiNDQxODgyXCI6IFwi6L+e5bee5biCXCIsXG5cdCAgICBcIjQ0MTg4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDE5MDBcIjogXCLkuJzojp7luIJcIixcblx0ICAgIFwiNDQyMDAwXCI6IFwi5Lit5bGx5biCXCIsXG5cdCAgICBcIjQ0MjEwMVwiOiBcIuS4nOaymee+pOWym1wiLFxuXHQgICAgXCI0NDUxMDBcIjogXCLmva7lt57luIJcIixcblx0ICAgIFwiNDQ1MTAyXCI6IFwi5rmY5qGl5Yy6XCIsXG5cdCAgICBcIjQ0NTEyMVwiOiBcIua9ruWuieWMulwiLFxuXHQgICAgXCI0NDUxMjJcIjogXCLppbblubPljr9cIixcblx0ICAgIFwiNDQ1MTg2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ0NTIwMFwiOiBcIuaPremYs+W4glwiLFxuXHQgICAgXCI0NDUyMDJcIjogXCLmppXln47ljLpcIixcblx0ICAgIFwiNDQ1MjIxXCI6IFwi5o+t5Lic5Yy6XCIsXG5cdCAgICBcIjQ0NTIyMlwiOiBcIuaPreilv+WOv1wiLFxuXHQgICAgXCI0NDUyMjRcIjogXCLmg6DmnaXljr9cIixcblx0ICAgIFwiNDQ1MjgxXCI6IFwi5pmu5a6B5biCXCIsXG5cdCAgICBcIjQ0NTI4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NDUzMDBcIjogXCLkupHmta7luIJcIixcblx0ICAgIFwiNDQ1MzAyXCI6IFwi5LqR5Z+O5Yy6XCIsXG5cdCAgICBcIjQ0NTMyMVwiOiBcIuaWsOWFtOWOv1wiLFxuXHQgICAgXCI0NDUzMjJcIjogXCLpg4HljZfljr9cIixcblx0ICAgIFwiNDQ1MzIzXCI6IFwi5LqR5a6J5Y6/XCIsXG5cdCAgICBcIjQ0NTM4MVwiOiBcIue9l+WumuW4glwiLFxuXHQgICAgXCI0NDUzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDUwMDAwXCI6IFwi5bm/6KW/5aOu5peP6Ieq5rK75Yy6XCIsXG5cdCAgICBcIjQ1MDEwMFwiOiBcIuWNl+WugeW4glwiLFxuXHQgICAgXCI0NTAxMDJcIjogXCLlhbTlroHljLpcIixcblx0ICAgIFwiNDUwMTAzXCI6IFwi6Z2S56eA5Yy6XCIsXG5cdCAgICBcIjQ1MDEwNVwiOiBcIuaxn+WNl+WMulwiLFxuXHQgICAgXCI0NTAxMDdcIjogXCLopb/kuaHloZjljLpcIixcblx0ICAgIFwiNDUwMTA4XCI6IFwi6Imv5bqG5Yy6XCIsXG5cdCAgICBcIjQ1MDEwOVwiOiBcIumCleWugeWMulwiLFxuXHQgICAgXCI0NTAxMjJcIjogXCLmrabpuKPljr9cIixcblx0ICAgIFwiNDUwMTIzXCI6IFwi6ZqG5a6J5Y6/XCIsXG5cdCAgICBcIjQ1MDEyNFwiOiBcIumprOWxseWOv1wiLFxuXHQgICAgXCI0NTAxMjVcIjogXCLkuIrmnpfljr9cIixcblx0ICAgIFwiNDUwMTI2XCI6IFwi5a6+6Ziz5Y6/XCIsXG5cdCAgICBcIjQ1MDEyN1wiOiBcIuaoquWOv1wiLFxuXHQgICAgXCI0NTAxMjhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDUwMjAwXCI6IFwi5p+z5bee5biCXCIsXG5cdCAgICBcIjQ1MDIwMlwiOiBcIuWfjuS4reWMulwiLFxuXHQgICAgXCI0NTAyMDNcIjogXCLpsbzls7DljLpcIixcblx0ICAgIFwiNDUwMjA0XCI6IFwi5p+z5Y2X5Yy6XCIsXG5cdCAgICBcIjQ1MDIwNVwiOiBcIuafs+WMl+WMulwiLFxuXHQgICAgXCI0NTAyMjFcIjogXCLmn7PmsZ/ljr9cIixcblx0ICAgIFwiNDUwMjIyXCI6IFwi5p+z5Z+O5Y6/XCIsXG5cdCAgICBcIjQ1MDIyM1wiOiBcIum5v+WvqOWOv1wiLFxuXHQgICAgXCI0NTAyMjRcIjogXCLono3lronljr9cIixcblx0ICAgIFwiNDUwMjI1XCI6IFwi6J6N5rC06IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ1MDIyNlwiOiBcIuS4ieaxn+S+l+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NTAyMjdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDUwMzAwXCI6IFwi5qGC5p6X5biCXCIsXG5cdCAgICBcIjQ1MDMwMlwiOiBcIuengOWzsOWMulwiLFxuXHQgICAgXCI0NTAzMDNcIjogXCLlj6DlvanljLpcIixcblx0ICAgIFwiNDUwMzA0XCI6IFwi6LGh5bGx5Yy6XCIsXG5cdCAgICBcIjQ1MDMwNVwiOiBcIuS4g+aYn+WMulwiLFxuXHQgICAgXCI0NTAzMTFcIjogXCLpm4HlsbHljLpcIixcblx0ICAgIFwiNDUwMzIxXCI6IFwi6Ziz5pyU5Y6/XCIsXG5cdCAgICBcIjQ1MDMyMlwiOiBcIuS4tOahguWMulwiLFxuXHQgICAgXCI0NTAzMjNcIjogXCLngbXlt53ljr9cIixcblx0ICAgIFwiNDUwMzI0XCI6IFwi5YWo5bee5Y6/XCIsXG5cdCAgICBcIjQ1MDMyNVwiOiBcIuWFtOWuieWOv1wiLFxuXHQgICAgXCI0NTAzMjZcIjogXCLmsLjnpo/ljr9cIixcblx0ICAgIFwiNDUwMzI3XCI6IFwi54GM6Ziz5Y6/XCIsXG5cdCAgICBcIjQ1MDMyOFwiOiBcIum+meiDnOWQhOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NTAzMjlcIjogXCLotYTmupDljr9cIixcblx0ICAgIFwiNDUwMzMwXCI6IFwi5bmz5LmQ5Y6/XCIsXG5cdCAgICBcIjQ1MDMzMVwiOiBcIuiNlOa1puWOv1wiLFxuXHQgICAgXCI0NTAzMzJcIjogXCLmga3ln47nkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUwMzMzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDQwMFwiOiBcIuaip+W3nuW4glwiLFxuXHQgICAgXCI0NTA0MDNcIjogXCLkuIfnp4DljLpcIixcblx0ICAgIFwiNDUwNDA1XCI6IFwi6ZW/5rSy5Yy6XCIsXG5cdCAgICBcIjQ1MDQwNlwiOiBcIum+meWcqeWMulwiLFxuXHQgICAgXCI0NTA0MjFcIjogXCLoi43moqfljr9cIixcblx0ICAgIFwiNDUwNDIyXCI6IFwi6Jek5Y6/XCIsXG5cdCAgICBcIjQ1MDQyM1wiOiBcIuiSmeWxseWOv1wiLFxuXHQgICAgXCI0NTA0ODFcIjogXCLlspHmuqrluIJcIixcblx0ICAgIFwiNDUwNDgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDUwMFwiOiBcIuWMl+a1t+W4glwiLFxuXHQgICAgXCI0NTA1MDJcIjogXCLmtbfln47ljLpcIixcblx0ICAgIFwiNDUwNTAzXCI6IFwi6ZO25rW35Yy6XCIsXG5cdCAgICBcIjQ1MDUxMlwiOiBcIumTgeWxsea4r+WMulwiLFxuXHQgICAgXCI0NTA1MjFcIjogXCLlkIjmtabljr9cIixcblx0ICAgIFwiNDUwNTIyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDYwMFwiOiBcIumYsuWfjua4r+W4glwiLFxuXHQgICAgXCI0NTA2MDJcIjogXCLmuK/lj6PljLpcIixcblx0ICAgIFwiNDUwNjAzXCI6IFwi6Ziy5Z+O5Yy6XCIsXG5cdCAgICBcIjQ1MDYyMVwiOiBcIuS4iuaAneWOv1wiLFxuXHQgICAgXCI0NTA2ODFcIjogXCLkuJzlhbTluIJcIixcblx0ICAgIFwiNDUwNjgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDcwMFwiOiBcIumSpuW3nuW4glwiLFxuXHQgICAgXCI0NTA3MDJcIjogXCLpkqbljZfljLpcIixcblx0ICAgIFwiNDUwNzAzXCI6IFwi6ZKm5YyX5Yy6XCIsXG5cdCAgICBcIjQ1MDcyMVwiOiBcIueBteWxseWOv1wiLFxuXHQgICAgXCI0NTA3MjJcIjogXCLmtabljJfljr9cIixcblx0ICAgIFwiNDUwNzIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MDgwMFwiOiBcIui0tea4r+W4glwiLFxuXHQgICAgXCI0NTA4MDJcIjogXCLmuK/ljJfljLpcIixcblx0ICAgIFwiNDUwODAzXCI6IFwi5riv5Y2X5Yy6XCIsXG5cdCAgICBcIjQ1MDgwNFwiOiBcIuimg+WhmOWMulwiLFxuXHQgICAgXCI0NTA4MjFcIjogXCLlubPljZfljr9cIixcblx0ICAgIFwiNDUwODgxXCI6IFwi5qGC5bmz5biCXCIsXG5cdCAgICBcIjQ1MDg4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NTA5MDBcIjogXCLnjonmnpfluIJcIixcblx0ICAgIFwiNDUwOTAyXCI6IFwi546J5bee5Yy6XCIsXG5cdCAgICBcIjQ1MDkwM1wiOiBcIuemj+e7teWMulwiLFxuXHQgICAgXCI0NTA5MjFcIjogXCLlrrnljr9cIixcblx0ICAgIFwiNDUwOTIyXCI6IFwi6ZmG5bed5Y6/XCIsXG5cdCAgICBcIjQ1MDkyM1wiOiBcIuWNmueZveWOv1wiLFxuXHQgICAgXCI0NTA5MjRcIjogXCLlhbTkuJrljr9cIixcblx0ICAgIFwiNDUwOTgxXCI6IFwi5YyX5rWB5biCXCIsXG5cdCAgICBcIjQ1MDk4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NTEwMDBcIjogXCLnmb7oibLluIJcIixcblx0ICAgIFwiNDUxMDAyXCI6IFwi5Y+z5rGf5Yy6XCIsXG5cdCAgICBcIjQ1MTAyMVwiOiBcIueUsOmYs+WOv1wiLFxuXHQgICAgXCI0NTEwMjJcIjogXCLnlLDkuJzljr9cIixcblx0ICAgIFwiNDUxMDIzXCI6IFwi5bmz5p6c5Y6/XCIsXG5cdCAgICBcIjQ1MTAyNFwiOiBcIuW+t+S/neWOv1wiLFxuXHQgICAgXCI0NTEwMjVcIjogXCLpnZbopb/ljr9cIixcblx0ICAgIFwiNDUxMDI2XCI6IFwi6YKj5Z2h5Y6/XCIsXG5cdCAgICBcIjQ1MTAyN1wiOiBcIuWHjOS6keWOv1wiLFxuXHQgICAgXCI0NTEwMjhcIjogXCLkuZDkuJrljr9cIixcblx0ICAgIFwiNDUxMDI5XCI6IFwi55Sw5p6X5Y6/XCIsXG5cdCAgICBcIjQ1MTAzMFwiOiBcIuilv+ael+WOv1wiLFxuXHQgICAgXCI0NTEwMzFcIjogXCLpmobmnpflkITml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUxMDMyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjQ1MTEwMFwiOiBcIui0uuW3nuW4glwiLFxuXHQgICAgXCI0NTExMDJcIjogXCLlhavmraXljLpcIixcblx0ICAgIFwiNDUxMTE5XCI6IFwi5bmz5qGC566h55CG5Yy6XCIsXG5cdCAgICBcIjQ1MTEyMVwiOiBcIuaYreW5s+WOv1wiLFxuXHQgICAgXCI0NTExMjJcIjogXCLpkp/lsbHljr9cIixcblx0ICAgIFwiNDUxMTIzXCI6IFwi5a+M5bed55G25peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ1MTEyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NTEyMDBcIjogXCLmsrPmsaDluIJcIixcblx0ICAgIFwiNDUxMjAyXCI6IFwi6YeR5Z+O5rGf5Yy6XCIsXG5cdCAgICBcIjQ1MTIyMVwiOiBcIuWNl+S4ueWOv1wiLFxuXHQgICAgXCI0NTEyMjJcIjogXCLlpKnls6jljr9cIixcblx0ICAgIFwiNDUxMjIzXCI6IFwi5Yek5bGx5Y6/XCIsXG5cdCAgICBcIjQ1MTIyNFwiOiBcIuS4nOWFsOWOv1wiLFxuXHQgICAgXCI0NTEyMjVcIjogXCLnvZfln47ku6vkvazml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUxMjI2XCI6IFwi546v5rGf5q+b5Y2X5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ1MTIyN1wiOiBcIuW3tOmprOeRtuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NTEyMjhcIjogXCLpg73lronnkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUxMjI5XCI6IFwi5aSn5YyW55G25peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ1MTI4MVwiOiBcIuWunOW3nuW4glwiLFxuXHQgICAgXCI0NTEyODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDUxMzAwXCI6IFwi5p2l5a6+5biCXCIsXG5cdCAgICBcIjQ1MTMwMlwiOiBcIuWFtOWuvuWMulwiLFxuXHQgICAgXCI0NTEzMjFcIjogXCLlv7vln47ljr9cIixcblx0ICAgIFwiNDUxMzIyXCI6IFwi6LGh5bee5Y6/XCIsXG5cdCAgICBcIjQ1MTMyM1wiOiBcIuatpuWuo+WOv1wiLFxuXHQgICAgXCI0NTEzMjRcIjogXCLph5Hnp4Dnkbbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDUxMzgxXCI6IFwi5ZCI5bGx5biCXCIsXG5cdCAgICBcIjQ1MTM4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NTE0MDBcIjogXCLltIflt6bluIJcIixcblx0ICAgIFwiNDUxNDAyXCI6IFwi5rGf5bee5Yy6XCIsXG5cdCAgICBcIjQ1MTQyMVwiOiBcIuaJtue7peWOv1wiLFxuXHQgICAgXCI0NTE0MjJcIjogXCLlroHmmI7ljr9cIixcblx0ICAgIFwiNDUxNDIzXCI6IFwi6b6Z5bee5Y6/XCIsXG5cdCAgICBcIjQ1MTQyNFwiOiBcIuWkp+aWsOWOv1wiLFxuXHQgICAgXCI0NTE0MjVcIjogXCLlpKnnrYnljr9cIixcblx0ICAgIFwiNDUxNDgxXCI6IFwi5Yet56Wl5biCXCIsXG5cdCAgICBcIjQ1MTQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI0NjAwMDBcIjogXCLmtbfljZfnnIFcIixcblx0ICAgIFwiNDYwMTAwXCI6IFwi5rW35Y+j5biCXCIsXG5cdCAgICBcIjQ2MDEwNVwiOiBcIuengOiLseWMulwiLFxuXHQgICAgXCI0NjAxMDZcIjogXCLpvpnljY7ljLpcIixcblx0ICAgIFwiNDYwMTA3XCI6IFwi55C85bGx5Yy6XCIsXG5cdCAgICBcIjQ2MDEwOFwiOiBcIue+juWFsOWMulwiLFxuXHQgICAgXCI0NjAxMDlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNDYwMjAwXCI6IFwi5LiJ5Lqa5biCXCIsXG5cdCAgICBcIjQ2MDMwMFwiOiBcIuS4ieaymeW4glwiLFxuXHQgICAgXCI0NjAzMjFcIjogXCLopb/mspnnvqTlsptcIixcblx0ICAgIFwiNDYwMzIyXCI6IFwi5Y2X5rKZ576k5bKbXCIsXG5cdCAgICBcIjQ2MDMyM1wiOiBcIuS4reaymee+pOWym+eahOWym+ekgeWPiuWFtua1t+Wfn1wiLFxuXHQgICAgXCI0NjkwMDFcIjogXCLkupTmjIflsbHluIJcIixcblx0ICAgIFwiNDY5MDAyXCI6IFwi55C85rW35biCXCIsXG5cdCAgICBcIjQ2OTAwM1wiOiBcIuWEi+W3nuW4glwiLFxuXHQgICAgXCI0NjkwMDVcIjogXCLmlofmmIzluIJcIixcblx0ICAgIFwiNDY5MDA2XCI6IFwi5LiH5a6B5biCXCIsXG5cdCAgICBcIjQ2OTAwN1wiOiBcIuS4nOaWueW4glwiLFxuXHQgICAgXCI0NjkwMjVcIjogXCLlrprlronljr9cIixcblx0ICAgIFwiNDY5MDI2XCI6IFwi5bGv5piM5Y6/XCIsXG5cdCAgICBcIjQ2OTAyN1wiOiBcIua+hOi/iOWOv1wiLFxuXHQgICAgXCI0NjkwMjhcIjogXCLkuLTpq5jljr9cIixcblx0ICAgIFwiNDY5MDMwXCI6IFwi55m95rKZ6buO5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ2OTAzMVwiOiBcIuaYjOaxn+m7juaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NjkwMzNcIjogXCLkuZDkuJzpu47ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDY5MDM0XCI6IFwi6Zm15rC06buO5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjQ2OTAzNVwiOiBcIuS/neS6rem7juaXj+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI0NjkwMzZcIjogXCLnkLzkuK3pu47ml4/oi5fml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNDcxMDA1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUwMDAwMFwiOiBcIumHjeW6hlwiLFxuXHQgICAgXCI1MDAxMDBcIjogXCLph43luobluIJcIixcblx0ICAgIFwiNTAwMTAxXCI6IFwi5LiH5bee5Yy6XCIsXG5cdCAgICBcIjUwMDEwMlwiOiBcIua2qumZteWMulwiLFxuXHQgICAgXCI1MDAxMDNcIjogXCLmuJ3kuK3ljLpcIixcblx0ICAgIFwiNTAwMTA0XCI6IFwi5aSn5rih5Y+j5Yy6XCIsXG5cdCAgICBcIjUwMDEwNVwiOiBcIuaxn+WMl+WMulwiLFxuXHQgICAgXCI1MDAxMDZcIjogXCLmspnlnarlnZ3ljLpcIixcblx0ICAgIFwiNTAwMTA3XCI6IFwi5Lmd6b6Z5Z2h5Yy6XCIsXG5cdCAgICBcIjUwMDEwOFwiOiBcIuWNl+WyuOWMulwiLFxuXHQgICAgXCI1MDAxMDlcIjogXCLljJfnoprljLpcIixcblx0ICAgIFwiNTAwMTEwXCI6IFwi5LiH55ub5Yy6XCIsXG5cdCAgICBcIjUwMDExMVwiOiBcIuWPjOahpeWMulwiLFxuXHQgICAgXCI1MDAxMTJcIjogXCLmuJ3ljJfljLpcIixcblx0ICAgIFwiNTAwMTEzXCI6IFwi5be05Y2X5Yy6XCIsXG5cdCAgICBcIjUwMDExNFwiOiBcIum7lOaxn+WMulwiLFxuXHQgICAgXCI1MDAxMTVcIjogXCLplb/lr7/ljLpcIixcblx0ICAgIFwiNTAwMjIyXCI6IFwi57am5rGf5Yy6XCIsXG5cdCAgICBcIjUwMDIyM1wiOiBcIua9vOWNl+WOv1wiLFxuXHQgICAgXCI1MDAyMjRcIjogXCLpk5zmooHljr9cIixcblx0ICAgIFwiNTAwMjI1XCI6IFwi5aSn6Laz5Yy6XCIsXG5cdCAgICBcIjUwMDIyNlwiOiBcIuiNo+aYjOWOv1wiLFxuXHQgICAgXCI1MDAyMjdcIjogXCLnkqflsbHljr9cIixcblx0ICAgIFwiNTAwMjI4XCI6IFwi5qKB5bmz5Y6/XCIsXG5cdCAgICBcIjUwMDIyOVwiOiBcIuWfjuWPo+WOv1wiLFxuXHQgICAgXCI1MDAyMzBcIjogXCLkuLDpg73ljr9cIixcblx0ICAgIFwiNTAwMjMxXCI6IFwi5Z6r5rGf5Y6/XCIsXG5cdCAgICBcIjUwMDIzMlwiOiBcIuatpumahuWOv1wiLFxuXHQgICAgXCI1MDAyMzNcIjogXCLlv6Dljr9cIixcblx0ICAgIFwiNTAwMjM0XCI6IFwi5byA5Y6/XCIsXG5cdCAgICBcIjUwMDIzNVwiOiBcIuS6kemYs+WOv1wiLFxuXHQgICAgXCI1MDAyMzZcIjogXCLlpYnoioLljr9cIixcblx0ICAgIFwiNTAwMjM3XCI6IFwi5ber5bGx5Y6/XCIsXG5cdCAgICBcIjUwMDIzOFwiOiBcIuW3q+a6quWOv1wiLFxuXHQgICAgXCI1MDAyNDBcIjogXCLnn7Pmn7HlnJ/lrrbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTAwMjQxXCI6IFwi56eA5bGx5Zyf5a625peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUwMDI0MlwiOiBcIumFiemYs+Wcn+WutuaXj+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MDAyNDNcIjogXCLlva3msLToi5fml4/lnJ/lrrbml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTAwMzgxXCI6IFwi5rGf5rSl5Yy6XCIsXG5cdCAgICBcIjUwMDM4MlwiOiBcIuWQiOW3neWMulwiLFxuXHQgICAgXCI1MDAzODNcIjogXCLmsLjlt53ljLpcIixcblx0ICAgIFwiNTAwMzg0XCI6IFwi5Y2X5bed5Yy6XCIsXG5cdCAgICBcIjUwMDM4NVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTAwMDBcIjogXCLlm5vlt53nnIFcIixcblx0ICAgIFwiNTEwMTAwXCI6IFwi5oiQ6YO95biCXCIsXG5cdCAgICBcIjUxMDEwNFwiOiBcIumUpuaxn+WMulwiLFxuXHQgICAgXCI1MTAxMDVcIjogXCLpnZLnvorljLpcIixcblx0ICAgIFwiNTEwMTA2XCI6IFwi6YeR54mb5Yy6XCIsXG5cdCAgICBcIjUxMDEwN1wiOiBcIuatpuS+r+WMulwiLFxuXHQgICAgXCI1MTAxMDhcIjogXCLmiJDljY7ljLpcIixcblx0ICAgIFwiNTEwMTEyXCI6IFwi6b6Z5rOJ6am/5Yy6XCIsXG5cdCAgICBcIjUxMDExM1wiOiBcIumdkueZveaxn+WMulwiLFxuXHQgICAgXCI1MTAxMTRcIjogXCLmlrDpg73ljLpcIixcblx0ICAgIFwiNTEwMTE1XCI6IFwi5rip5rGf5Yy6XCIsXG5cdCAgICBcIjUxMDEyMVwiOiBcIumHkeWgguWOv1wiLFxuXHQgICAgXCI1MTAxMjJcIjogXCLlj4zmtYHljr9cIixcblx0ICAgIFwiNTEwMTI0XCI6IFwi6YOr5Y6/XCIsXG5cdCAgICBcIjUxMDEyOVwiOiBcIuWkp+mCkeWOv1wiLFxuXHQgICAgXCI1MTAxMzFcIjogXCLokrLmsZ/ljr9cIixcblx0ICAgIFwiNTEwMTMyXCI6IFwi5paw5rSl5Y6/XCIsXG5cdCAgICBcIjUxMDE4MVwiOiBcIumDveaxn+WgsOW4glwiLFxuXHQgICAgXCI1MTAxODJcIjogXCLlva3lt57luIJcIixcblx0ICAgIFwiNTEwMTgzXCI6IFwi6YKb5bSD5biCXCIsXG5cdCAgICBcIjUxMDE4NFwiOiBcIuW0h+W3nuW4glwiLFxuXHQgICAgXCI1MTAxODVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEwMzAwXCI6IFwi6Ieq6LSh5biCXCIsXG5cdCAgICBcIjUxMDMwMlwiOiBcIuiHqua1geS6leWMulwiLFxuXHQgICAgXCI1MTAzMDNcIjogXCLotKHkupXljLpcIixcblx0ICAgIFwiNTEwMzA0XCI6IFwi5aSn5a6J5Yy6XCIsXG5cdCAgICBcIjUxMDMxMVwiOiBcIuayv+a7qeWMulwiLFxuXHQgICAgXCI1MTAzMjFcIjogXCLojaPljr9cIixcblx0ICAgIFwiNTEwMzIyXCI6IFwi5a+M6aG65Y6/XCIsXG5cdCAgICBcIjUxMDMyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTA0MDBcIjogXCLmlIDmnp3oirHluIJcIixcblx0ICAgIFwiNTEwNDAyXCI6IFwi5Lic5Yy6XCIsXG5cdCAgICBcIjUxMDQwM1wiOiBcIuilv+WMulwiLFxuXHQgICAgXCI1MTA0MTFcIjogXCLku4HlkozljLpcIixcblx0ICAgIFwiNTEwNDIxXCI6IFwi57Gz5piT5Y6/XCIsXG5cdCAgICBcIjUxMDQyMlwiOiBcIuebkOi+ueWOv1wiLFxuXHQgICAgXCI1MTA0MjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEwNTAwXCI6IFwi5rO45bee5biCXCIsXG5cdCAgICBcIjUxMDUwMlwiOiBcIuaxn+mYs+WMulwiLFxuXHQgICAgXCI1MTA1MDNcIjogXCLnurPmuqrljLpcIixcblx0ICAgIFwiNTEwNTA0XCI6IFwi6b6Z6ams5r2t5Yy6XCIsXG5cdCAgICBcIjUxMDUyMVwiOiBcIuazuOWOv1wiLFxuXHQgICAgXCI1MTA1MjJcIjogXCLlkIjmsZ/ljr9cIixcblx0ICAgIFwiNTEwNTI0XCI6IFwi5Y+Z5rC45Y6/XCIsXG5cdCAgICBcIjUxMDUyNVwiOiBcIuWPpOiUuuWOv1wiLFxuXHQgICAgXCI1MTA1MjZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEwNjAwXCI6IFwi5b636Ziz5biCXCIsXG5cdCAgICBcIjUxMDYwM1wiOiBcIuaXjOmYs+WMulwiLFxuXHQgICAgXCI1MTA2MjNcIjogXCLkuK3msZ/ljr9cIixcblx0ICAgIFwiNTEwNjI2XCI6IFwi572X5rGf5Y6/XCIsXG5cdCAgICBcIjUxMDY4MVwiOiBcIuW5v+axieW4glwiLFxuXHQgICAgXCI1MTA2ODJcIjogXCLku4DpgqHluIJcIixcblx0ICAgIFwiNTEwNjgzXCI6IFwi57u156u55biCXCIsXG5cdCAgICBcIjUxMDY4NFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTA3MDBcIjogXCLnu7XpmLPluIJcIixcblx0ICAgIFwiNTEwNzAzXCI6IFwi5raq5Z+O5Yy6XCIsXG5cdCAgICBcIjUxMDcwNFwiOiBcIua4uOS7meWMulwiLFxuXHQgICAgXCI1MTA3MjJcIjogXCLkuInlj7Dljr9cIixcblx0ICAgIFwiNTEwNzIzXCI6IFwi55uQ5Lqt5Y6/XCIsXG5cdCAgICBcIjUxMDcyNFwiOiBcIuWuieWOv1wiLFxuXHQgICAgXCI1MTA3MjVcIjogXCLmopPmvbzljr9cIixcblx0ICAgIFwiNTEwNzI2XCI6IFwi5YyX5bed576M5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUxMDcyN1wiOiBcIuW5s+atpuWOv1wiLFxuXHQgICAgXCI1MTA3ODFcIjogXCLmsZ/msrnluIJcIixcblx0ICAgIFwiNTEwNzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMDgwMFwiOiBcIuW5v+WFg+W4glwiLFxuXHQgICAgXCI1MTA4MDJcIjogXCLliKnlt57ljLpcIixcblx0ICAgIFwiNTEwODExXCI6IFwi5pit5YyW5Yy6XCIsXG5cdCAgICBcIjUxMDgxMlwiOiBcIuacneWkqeWMulwiLFxuXHQgICAgXCI1MTA4MjFcIjogXCLml7roi43ljr9cIixcblx0ICAgIFwiNTEwODIyXCI6IFwi6Z2S5bed5Y6/XCIsXG5cdCAgICBcIjUxMDgyM1wiOiBcIuWJkemYgeWOv1wiLFxuXHQgICAgXCI1MTA4MjRcIjogXCLoi43muqrljr9cIixcblx0ICAgIFwiNTEwODI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMDkwMFwiOiBcIumBguWugeW4glwiLFxuXHQgICAgXCI1MTA5MDNcIjogXCLoiLnlsbHljLpcIixcblx0ICAgIFwiNTEwOTA0XCI6IFwi5a6J5bGF5Yy6XCIsXG5cdCAgICBcIjUxMDkyMVwiOiBcIuiTrOa6quWOv1wiLFxuXHQgICAgXCI1MTA5MjJcIjogXCLlsITmtKrljr9cIixcblx0ICAgIFwiNTEwOTIzXCI6IFwi5aSn6Iux5Y6/XCIsXG5cdCAgICBcIjUxMDkyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTEwMDBcIjogXCLlhoXmsZ/luIJcIixcblx0ICAgIFwiNTExMDAyXCI6IFwi5biC5Lit5Yy6XCIsXG5cdCAgICBcIjUxMTAxMVwiOiBcIuS4nOWFtOWMulwiLFxuXHQgICAgXCI1MTEwMjRcIjogXCLlqIHov5zljr9cIixcblx0ICAgIFwiNTExMDI1XCI6IFwi6LWE5Lit5Y6/XCIsXG5cdCAgICBcIjUxMTAyOFwiOiBcIumahuaYjOWOv1wiLFxuXHQgICAgXCI1MTEwMjlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTExMTAwXCI6IFwi5LmQ5bGx5biCXCIsXG5cdCAgICBcIjUxMTEwMlwiOiBcIuW4guS4reWMulwiLFxuXHQgICAgXCI1MTExMTFcIjogXCLmspnmub7ljLpcIixcblx0ICAgIFwiNTExMTEyXCI6IFwi5LqU6YCa5qGl5Yy6XCIsXG5cdCAgICBcIjUxMTExM1wiOiBcIumHkeWPo+ays+WMulwiLFxuXHQgICAgXCI1MTExMjNcIjogXCLnio3kuLrljr9cIixcblx0ICAgIFwiNTExMTI0XCI6IFwi5LqV56CU5Y6/XCIsXG5cdCAgICBcIjUxMTEyNlwiOiBcIuWkueaxn+WOv1wiLFxuXHQgICAgXCI1MTExMjlcIjogXCLmspDlt53ljr9cIixcblx0ICAgIFwiNTExMTMyXCI6IFwi5bOo6L655b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUxMTEzM1wiOiBcIumprOi+ueW9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MTExODFcIjogXCLls6jnnInlsbHluIJcIixcblx0ICAgIFwiNTExMTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMTMwMFwiOiBcIuWNl+WFheW4glwiLFxuXHQgICAgXCI1MTEzMDJcIjogXCLpobrluobljLpcIixcblx0ICAgIFwiNTExMzAzXCI6IFwi6auY5Z2q5Yy6XCIsXG5cdCAgICBcIjUxMTMwNFwiOiBcIuWYiemZteWMulwiLFxuXHQgICAgXCI1MTEzMjFcIjogXCLljZfpg6jljr9cIixcblx0ICAgIFwiNTExMzIyXCI6IFwi6JCl5bGx5Y6/XCIsXG5cdCAgICBcIjUxMTMyM1wiOiBcIuiTrOWuieWOv1wiLFxuXHQgICAgXCI1MTEzMjRcIjogXCLku6rpmYfljr9cIixcblx0ICAgIFwiNTExMzI1XCI6IFwi6KW/5YWF5Y6/XCIsXG5cdCAgICBcIjUxMTM4MVwiOiBcIumYhuS4reW4glwiLFxuXHQgICAgXCI1MTEzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTExNDAwXCI6IFwi55yJ5bGx5biCXCIsXG5cdCAgICBcIjUxMTQwMlwiOiBcIuS4nOWdoeWMulwiLFxuXHQgICAgXCI1MTE0MjFcIjogXCLku4Hlr7/ljr9cIixcblx0ICAgIFwiNTExNDIyXCI6IFwi5b2t5bGx5Y6/XCIsXG5cdCAgICBcIjUxMTQyM1wiOiBcIua0qumbheWOv1wiLFxuXHQgICAgXCI1MTE0MjRcIjogXCLkuLnmo7Hljr9cIixcblx0ICAgIFwiNTExNDI1XCI6IFwi6Z2S56We5Y6/XCIsXG5cdCAgICBcIjUxMTQyNlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTE1MDBcIjogXCLlrpzlrr7luIJcIixcblx0ICAgIFwiNTExNTAyXCI6IFwi57+g5bGP5Yy6XCIsXG5cdCAgICBcIjUxMTUyMVwiOiBcIuWunOWuvuWOv1wiLFxuXHQgICAgXCI1MTE1MjJcIjogXCLljZfmuqrljLpcIixcblx0ICAgIFwiNTExNTIzXCI6IFwi5rGf5a6J5Y6/XCIsXG5cdCAgICBcIjUxMTUyNFwiOiBcIumVv+WugeWOv1wiLFxuXHQgICAgXCI1MTE1MjVcIjogXCLpq5jljr9cIixcblx0ICAgIFwiNTExNTI2XCI6IFwi54+Z5Y6/XCIsXG5cdCAgICBcIjUxMTUyN1wiOiBcIuetoOi/nuWOv1wiLFxuXHQgICAgXCI1MTE1MjhcIjogXCLlhbTmlofljr9cIixcblx0ICAgIFwiNTExNTI5XCI6IFwi5bGP5bGx5Y6/XCIsXG5cdCAgICBcIjUxMTUzMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTE2MDBcIjogXCLlub/lronluIJcIixcblx0ICAgIFwiNTExNjAyXCI6IFwi5bm/5a6J5Yy6XCIsXG5cdCAgICBcIjUxMTYwM1wiOiBcIuWJjemUi+WMulwiLFxuXHQgICAgXCI1MTE2MjFcIjogXCLlsrPmsaDljr9cIixcblx0ICAgIFwiNTExNjIyXCI6IFwi5q2m6IOc5Y6/XCIsXG5cdCAgICBcIjUxMTYyM1wiOiBcIumCu+awtOWOv1wiLFxuXHQgICAgXCI1MTE2ODFcIjogXCLljY7ok6XluIJcIixcblx0ICAgIFwiNTExNjgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMTcwMFwiOiBcIui+vuW3nuW4glwiLFxuXHQgICAgXCI1MTE3MDJcIjogXCLpgJrlt53ljLpcIixcblx0ICAgIFwiNTExNzIxXCI6IFwi6L6+5bed5Yy6XCIsXG5cdCAgICBcIjUxMTcyMlwiOiBcIuWuo+axieWOv1wiLFxuXHQgICAgXCI1MTE3MjNcIjogXCLlvIDmsZ/ljr9cIixcblx0ICAgIFwiNTExNzI0XCI6IFwi5aSn56u55Y6/XCIsXG5cdCAgICBcIjUxMTcyNVwiOiBcIua4oOWOv1wiLFxuXHQgICAgXCI1MTE3ODFcIjogXCLkuIfmupDluIJcIixcblx0ICAgIFwiNTExNzgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUxMTgwMFwiOiBcIumbheWuieW4glwiLFxuXHQgICAgXCI1MTE4MDJcIjogXCLpm6jln47ljLpcIixcblx0ICAgIFwiNTExODIxXCI6IFwi5ZCN5bGx5Yy6XCIsXG5cdCAgICBcIjUxMTgyMlwiOiBcIuiNpee7j+WOv1wiLFxuXHQgICAgXCI1MTE4MjNcIjogXCLmsYnmupDljr9cIixcblx0ICAgIFwiNTExODI0XCI6IFwi55+z5qOJ5Y6/XCIsXG5cdCAgICBcIjUxMTgyNVwiOiBcIuWkqeWFqOWOv1wiLFxuXHQgICAgXCI1MTE4MjZcIjogXCLoiqblsbHljr9cIixcblx0ICAgIFwiNTExODI3XCI6IFwi5a6d5YW05Y6/XCIsXG5cdCAgICBcIjUxMTgyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTE5MDBcIjogXCLlt7TkuK3luIJcIixcblx0ICAgIFwiNTExOTAyXCI6IFwi5be05bee5Yy6XCIsXG5cdCAgICBcIjUxMTkwM1wiOiBcIuaBqemYs+WMulwiLFxuXHQgICAgXCI1MTE5MjFcIjogXCLpgJrmsZ/ljr9cIixcblx0ICAgIFwiNTExOTIyXCI6IFwi5Y2X5rGf5Y6/XCIsXG5cdCAgICBcIjUxMTkyM1wiOiBcIuW5s+aYjOWOv1wiLFxuXHQgICAgXCI1MTE5MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEyMDAwXCI6IFwi6LWE6Ziz5biCXCIsXG5cdCAgICBcIjUxMjAwMlwiOiBcIumbgeaxn+WMulwiLFxuXHQgICAgXCI1MTIwMjFcIjogXCLlronlsrPljr9cIixcblx0ICAgIFwiNTEyMDIyXCI6IFwi5LmQ6Iez5Y6/XCIsXG5cdCAgICBcIjUxMjA4MVwiOiBcIueugOmYs+W4glwiLFxuXHQgICAgXCI1MTIwODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEzMjAwXCI6IFwi6Zi/5Z2d6JeP5peP576M5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUxMzIyMVwiOiBcIuaxtuW3neWOv1wiLFxuXHQgICAgXCI1MTMyMjJcIjogXCLnkIbljr9cIixcblx0ICAgIFwiNTEzMjIzXCI6IFwi6IyC5Y6/XCIsXG5cdCAgICBcIjUxMzIyNFwiOiBcIuadvua9mOWOv1wiLFxuXHQgICAgXCI1MTMyMjVcIjogXCLkuZ3lr6jmsp/ljr9cIixcblx0ICAgIFwiNTEzMjI2XCI6IFwi6YeR5bed5Y6/XCIsXG5cdCAgICBcIjUxMzIyN1wiOiBcIuWwj+mHkeWOv1wiLFxuXHQgICAgXCI1MTMyMjhcIjogXCLpu5HmsLTljr9cIixcblx0ICAgIFwiNTEzMjI5XCI6IFwi6ams5bCU5bq35Y6/XCIsXG5cdCAgICBcIjUxMzIzMFwiOiBcIuWjpOWhmOWOv1wiLFxuXHQgICAgXCI1MTMyMzFcIjogXCLpmL/lnZ3ljr9cIixcblx0ICAgIFwiNTEzMjMyXCI6IFwi6Iul5bCU55uW5Y6/XCIsXG5cdCAgICBcIjUxMzIzM1wiOiBcIue6ouWOn+WOv1wiLFxuXHQgICAgXCI1MTMyMzRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTEzMzAwXCI6IFwi55SY5a2c6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUxMzMyMVwiOiBcIuW6t+WumuWOv1wiLFxuXHQgICAgXCI1MTMzMjJcIjogXCLms7jlrprljr9cIixcblx0ICAgIFwiNTEzMzIzXCI6IFwi5Li55be05Y6/XCIsXG5cdCAgICBcIjUxMzMyNFwiOiBcIuS5nem+meWOv1wiLFxuXHQgICAgXCI1MTMzMjVcIjogXCLpm4XmsZ/ljr9cIixcblx0ICAgIFwiNTEzMzI2XCI6IFwi6YGT5a2a5Y6/XCIsXG5cdCAgICBcIjUxMzMyN1wiOiBcIueCiemcjeWOv1wiLFxuXHQgICAgXCI1MTMzMjhcIjogXCLnlJjlrZzljr9cIixcblx0ICAgIFwiNTEzMzI5XCI6IFwi5paw6b6Z5Y6/XCIsXG5cdCAgICBcIjUxMzMzMFwiOiBcIuW+t+agvOWOv1wiLFxuXHQgICAgXCI1MTMzMzFcIjogXCLnmb3njonljr9cIixcblx0ICAgIFwiNTEzMzMyXCI6IFwi55+z5rig5Y6/XCIsXG5cdCAgICBcIjUxMzMzM1wiOiBcIuiJsui+vuWOv1wiLFxuXHQgICAgXCI1MTMzMzRcIjogXCLnkIbloZjljr9cIixcblx0ICAgIFwiNTEzMzM1XCI6IFwi5be05aGY5Y6/XCIsXG5cdCAgICBcIjUxMzMzNlwiOiBcIuS5oeWfjuWOv1wiLFxuXHQgICAgXCI1MTMzMzdcIjogXCLnqLvln47ljr9cIixcblx0ICAgIFwiNTEzMzM4XCI6IFwi5b6X6I2j5Y6/XCIsXG5cdCAgICBcIjUxMzMzOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MTM0MDBcIjogXCLlh4nlsbHlvZ3ml4/oh6rmsrvlt55cIixcblx0ICAgIFwiNTEzNDAxXCI6IFwi6KW/5piM5biCXCIsXG5cdCAgICBcIjUxMzQyMlwiOiBcIuacqOmHjOiXj+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MTM0MjNcIjogXCLnm5DmupDljr9cIixcblx0ICAgIFwiNTEzNDI0XCI6IFwi5b635piM5Y6/XCIsXG5cdCAgICBcIjUxMzQyNVwiOiBcIuS8mueQhuWOv1wiLFxuXHQgICAgXCI1MTM0MjZcIjogXCLkvJrkuJzljr9cIixcblx0ICAgIFwiNTEzNDI3XCI6IFwi5a6B5Y2X5Y6/XCIsXG5cdCAgICBcIjUxMzQyOFwiOiBcIuaZruagvOWOv1wiLFxuXHQgICAgXCI1MTM0MjlcIjogXCLluIPmi5bljr9cIixcblx0ICAgIFwiNTEzNDMwXCI6IFwi6YeR6Ziz5Y6/XCIsXG5cdCAgICBcIjUxMzQzMVwiOiBcIuaYreinieWOv1wiLFxuXHQgICAgXCI1MTM0MzJcIjogXCLllpzlvrfljr9cIixcblx0ICAgIFwiNTEzNDMzXCI6IFwi5YaV5a6B5Y6/XCIsXG5cdCAgICBcIjUxMzQzNFwiOiBcIui2iuilv+WOv1wiLFxuXHQgICAgXCI1MTM0MzVcIjogXCLnlJjmtJvljr9cIixcblx0ICAgIFwiNTEzNDM2XCI6IFwi576O5aeR5Y6/XCIsXG5cdCAgICBcIjUxMzQzN1wiOiBcIumbt+azouWOv1wiLFxuXHQgICAgXCI1MTM0MzhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTIwMDAwXCI6IFwi6LS15bee55yBXCIsXG5cdCAgICBcIjUyMDEwMFwiOiBcIui0temYs+W4glwiLFxuXHQgICAgXCI1MjAxMDJcIjogXCLljZfmmI7ljLpcIixcblx0ICAgIFwiNTIwMTAzXCI6IFwi5LqR5bKp5Yy6XCIsXG5cdCAgICBcIjUyMDExMVwiOiBcIuiKsea6quWMulwiLFxuXHQgICAgXCI1MjAxMTJcIjogXCLkuYzlvZPljLpcIixcblx0ICAgIFwiNTIwMTEzXCI6IFwi55m95LqR5Yy6XCIsXG5cdCAgICBcIjUyMDEyMVwiOiBcIuW8gOmYs+WOv1wiLFxuXHQgICAgXCI1MjAxMjJcIjogXCLmga/ng73ljr9cIixcblx0ICAgIFwiNTIwMTIzXCI6IFwi5L+u5paH5Y6/XCIsXG5cdCAgICBcIjUyMDE1MVwiOiBcIuinguWxsea5luWMulwiLFxuXHQgICAgXCI1MjAxODFcIjogXCLmuIXplYfluIJcIixcblx0ICAgIFwiNTIwMTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUyMDIwMFwiOiBcIuWFreebmOawtOW4glwiLFxuXHQgICAgXCI1MjAyMDFcIjogXCLpkp/lsbHljLpcIixcblx0ICAgIFwiNTIwMjAzXCI6IFwi5YWt5p6d54m55Yy6XCIsXG5cdCAgICBcIjUyMDIyMVwiOiBcIuawtOWfjuWOv1wiLFxuXHQgICAgXCI1MjAyMjJcIjogXCLnm5jljr9cIixcblx0ICAgIFwiNTIwMjIzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUyMDMwMFwiOiBcIumBteS5ieW4glwiLFxuXHQgICAgXCI1MjAzMDJcIjogXCLnuqLoirHlspfljLpcIixcblx0ICAgIFwiNTIwMzAzXCI6IFwi5rGH5bed5Yy6XCIsXG5cdCAgICBcIjUyMDMyMVwiOiBcIumBteS5ieWOv1wiLFxuXHQgICAgXCI1MjAzMjJcIjogXCLmoZDmopPljr9cIixcblx0ICAgIFwiNTIwMzIzXCI6IFwi57ul6Ziz5Y6/XCIsXG5cdCAgICBcIjUyMDMyNFwiOiBcIuato+WuieWOv1wiLFxuXHQgICAgXCI1MjAzMjVcIjogXCLpgZPnnJ/ku6Hkvazml4/oi5fml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTIwMzI2XCI6IFwi5Yqh5bed5Luh5L2s5peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMDMyN1wiOiBcIuWHpOWGiOWOv1wiLFxuXHQgICAgXCI1MjAzMjhcIjogXCLmuYTmva3ljr9cIixcblx0ICAgIFwiNTIwMzI5XCI6IFwi5L2Z5bqG5Y6/XCIsXG5cdCAgICBcIjUyMDMzMFwiOiBcIuS5oOawtOWOv1wiLFxuXHQgICAgXCI1MjAzODFcIjogXCLotaTmsLTluIJcIixcblx0ICAgIFwiNTIwMzgyXCI6IFwi5LuB5oCA5biCXCIsXG5cdCAgICBcIjUyMDM4M1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MjA0MDBcIjogXCLlronpobrluIJcIixcblx0ICAgIFwiNTIwNDAyXCI6IFwi6KW/56eA5Yy6XCIsXG5cdCAgICBcIjUyMDQyMVwiOiBcIuW5s+WdneWOv1wiLFxuXHQgICAgXCI1MjA0MjJcIjogXCLmma7lrprljr9cIixcblx0ICAgIFwiNTIwNDIzXCI6IFwi6ZWH5a6B5biD5L6d5peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMDQyNFwiOiBcIuWFs+WyreW4g+S+neaXj+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MjA0MjVcIjogXCLntKvkupHoi5fml4/luIPkvp3ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTIwNDI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUyMjIwMFwiOiBcIumTnOS7geW4glwiLFxuXHQgICAgXCI1MjIyMDFcIjogXCLnoqfmsZ/ljLpcIixcblx0ICAgIFwiNTIyMjIyXCI6IFwi5rGf5Y+j5Y6/XCIsXG5cdCAgICBcIjUyMjIyM1wiOiBcIueOieWxj+S+l+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MjIyMjRcIjogXCLnn7PpmKHljr9cIixcblx0ICAgIFwiNTIyMjI1XCI6IFwi5oCd5Y2X5Y6/XCIsXG5cdCAgICBcIjUyMjIyNlwiOiBcIuWNsOaxn+Wcn+WutuaXj+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MjIyMjdcIjogXCLlvrfmsZ/ljr9cIixcblx0ICAgIFwiNTIyMjI4XCI6IFwi5rK/5rKz5Zyf5a625peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMjIyOVwiOiBcIuadvuahg+iLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MjIyMzBcIjogXCLkuIflsbHljLpcIixcblx0ICAgIFwiNTIyMjMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUyMjMwMFwiOiBcIum7lOilv+WNl+W4g+S+neaXj+iLl+aXj+iHquayu+W3nlwiLFxuXHQgICAgXCI1MjIzMDFcIjogXCLlhbTkuYnluIJcIixcblx0ICAgIFwiNTIyMzIyXCI6IFwi5YW05LuB5Y6/XCIsXG5cdCAgICBcIjUyMjMyM1wiOiBcIuaZruWuieWOv1wiLFxuXHQgICAgXCI1MjIzMjRcIjogXCLmmbTpmobljr9cIixcblx0ICAgIFwiNTIyMzI1XCI6IFwi6LSe5Liw5Y6/XCIsXG5cdCAgICBcIjUyMjMyNlwiOiBcIuacm+iwn+WOv1wiLFxuXHQgICAgXCI1MjIzMjdcIjogXCLlhozkuqjljr9cIixcblx0ICAgIFwiNTIyMzI4XCI6IFwi5a6J6b6Z5Y6/XCIsXG5cdCAgICBcIjUyMjMyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MjI0MDBcIjogXCLmr5XoioLluIJcIixcblx0ICAgIFwiNTIyNDAxXCI6IFwi5LiD5pif5YWz5Yy6XCIsXG5cdCAgICBcIjUyMjQyMlwiOiBcIuWkp+aWueWOv1wiLFxuXHQgICAgXCI1MjI0MjNcIjogXCLpu5Topb/ljr9cIixcblx0ICAgIFwiNTIyNDI0XCI6IFwi6YeR5rKZ5Y6/XCIsXG5cdCAgICBcIjUyMjQyNVwiOiBcIue7h+mHkeWOv1wiLFxuXHQgICAgXCI1MjI0MjZcIjogXCLnurPpm43ljr9cIixcblx0ICAgIFwiNTIyNDI3XCI6IFwi5aiB5a6B5b2d5peP5Zue5peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMjQyOFwiOiBcIui1q+eroOWOv1wiLFxuXHQgICAgXCI1MjI0MjlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTIyNjAwXCI6IFwi6buU5Lic5Y2X6IuX5peP5L6X5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUyMjYwMVwiOiBcIuWHr+mHjOW4glwiLFxuXHQgICAgXCI1MjI2MjJcIjogXCLpu4TlubPljr9cIixcblx0ICAgIFwiNTIyNjIzXCI6IFwi5pa956eJ5Y6/XCIsXG5cdCAgICBcIjUyMjYyNFwiOiBcIuS4ieepl+WOv1wiLFxuXHQgICAgXCI1MjI2MjVcIjogXCLplYfov5zljr9cIixcblx0ICAgIFwiNTIyNjI2XCI6IFwi5bKR5bep5Y6/XCIsXG5cdCAgICBcIjUyMjYyN1wiOiBcIuWkqeafseWOv1wiLFxuXHQgICAgXCI1MjI2MjhcIjogXCLplKblsY/ljr9cIixcblx0ICAgIFwiNTIyNjI5XCI6IFwi5YmR5rKz5Y6/XCIsXG5cdCAgICBcIjUyMjYzMFwiOiBcIuWPsOaxn+WOv1wiLFxuXHQgICAgXCI1MjI2MzFcIjogXCLpu47lubPljr9cIixcblx0ICAgIFwiNTIyNjMyXCI6IFwi5qaV5rGf5Y6/XCIsXG5cdCAgICBcIjUyMjYzM1wiOiBcIuS7juaxn+WOv1wiLFxuXHQgICAgXCI1MjI2MzRcIjogXCLpm7flsbHljr9cIixcblx0ICAgIFwiNTIyNjM1XCI6IFwi6bq75rGf5Y6/XCIsXG5cdCAgICBcIjUyMjYzNlwiOiBcIuS4ueWvqOWOv1wiLFxuXHQgICAgXCI1MjI2MzdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTIyNzAwXCI6IFwi6buU5Y2X5biD5L6d5peP6IuX5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUyMjcwMVwiOiBcIumDveWMgOW4glwiLFxuXHQgICAgXCI1MjI3MDJcIjogXCLnpo/ms4nluIJcIixcblx0ICAgIFwiNTIyNzIyXCI6IFwi6I2U5rOi5Y6/XCIsXG5cdCAgICBcIjUyMjcyM1wiOiBcIui0teWumuWOv1wiLFxuXHQgICAgXCI1MjI3MjVcIjogXCLnk67lronljr9cIixcblx0ICAgIFwiNTIyNzI2XCI6IFwi54us5bGx5Y6/XCIsXG5cdCAgICBcIjUyMjcyN1wiOiBcIuW5s+WhmOWOv1wiLFxuXHQgICAgXCI1MjI3MjhcIjogXCLnvZfnlLjljr9cIixcblx0ICAgIFwiNTIyNzI5XCI6IFwi6ZW/6aG65Y6/XCIsXG5cdCAgICBcIjUyMjczMFwiOiBcIum+memHjOWOv1wiLFxuXHQgICAgXCI1MjI3MzFcIjogXCLmg6DmsLTljr9cIixcblx0ICAgIFwiNTIyNzMyXCI6IFwi5LiJ6YO95rC05peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUyMjczM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzAwMDBcIjogXCLkupHljZfnnIFcIixcblx0ICAgIFwiNTMwMTAwXCI6IFwi5piG5piO5biCXCIsXG5cdCAgICBcIjUzMDEwMlwiOiBcIuS6lOWNjuWMulwiLFxuXHQgICAgXCI1MzAxMDNcIjogXCLnm5jpvpnljLpcIixcblx0ICAgIFwiNTMwMTExXCI6IFwi5a6Y5rih5Yy6XCIsXG5cdCAgICBcIjUzMDExMlwiOiBcIuilv+WxseWMulwiLFxuXHQgICAgXCI1MzAxMTNcIjogXCLkuJzlt53ljLpcIixcblx0ICAgIFwiNTMwMTIxXCI6IFwi5ZGI6LSh5Yy6XCIsXG5cdCAgICBcIjUzMDEyMlwiOiBcIuaZi+WugeWOv1wiLFxuXHQgICAgXCI1MzAxMjRcIjogXCLlr4zmsJHljr9cIixcblx0ICAgIFwiNTMwMTI1XCI6IFwi5a6c6Imv5Y6/XCIsXG5cdCAgICBcIjUzMDEyNlwiOiBcIuefs+ael+W9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzAxMjdcIjogXCLltanmmI7ljr9cIixcblx0ICAgIFwiNTMwMTI4XCI6IFwi56aE5Yqd5b2d5peP6IuX5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDEyOVwiOiBcIuWvu+eUuOWbnuaXj+W9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzAxODFcIjogXCLlronlroHluIJcIixcblx0ICAgIFwiNTMwMTgyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUzMDMwMFwiOiBcIuabsumdluW4glwiLFxuXHQgICAgXCI1MzAzMDJcIjogXCLpupLpup/ljLpcIixcblx0ICAgIFwiNTMwMzIxXCI6IFwi6ams6b6Z5Y6/XCIsXG5cdCAgICBcIjUzMDMyMlwiOiBcIumZhuiJr+WOv1wiLFxuXHQgICAgXCI1MzAzMjNcIjogXCLluIjlrpfljr9cIixcblx0ICAgIFwiNTMwMzI0XCI6IFwi572X5bmz5Y6/XCIsXG5cdCAgICBcIjUzMDMyNVwiOiBcIuWvjOa6kOWOv1wiLFxuXHQgICAgXCI1MzAzMjZcIjogXCLkvJrms73ljr9cIixcblx0ICAgIFwiNTMwMzI4XCI6IFwi5rK+55uK5Y6/XCIsXG5cdCAgICBcIjUzMDM4MVwiOiBcIuWuo+WogeW4glwiLFxuXHQgICAgXCI1MzAzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMwNDAwXCI6IFwi546J5rqq5biCXCIsXG5cdCAgICBcIjUzMDQwMlwiOiBcIue6ouWhlOWMulwiLFxuXHQgICAgXCI1MzA0MjFcIjogXCLmsZ/lt53ljr9cIixcblx0ICAgIFwiNTMwNDIyXCI6IFwi5r6E5rGf5Y6/XCIsXG5cdCAgICBcIjUzMDQyM1wiOiBcIumAmua1t+WOv1wiLFxuXHQgICAgXCI1MzA0MjRcIjogXCLljY7lroHljr9cIixcblx0ICAgIFwiNTMwNDI1XCI6IFwi5piT6Zeo5Y6/XCIsXG5cdCAgICBcIjUzMDQyNlwiOiBcIuWzqOWxseW9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA0MjdcIjogXCLmlrDlubPlvZ3ml4/lgqPml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwNDI4XCI6IFwi5YWD5rGf5ZOI5bC85peP5b2d5peP5YKj5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDQyOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzA1MDBcIjogXCLkv53lsbHluIJcIixcblx0ICAgIFwiNTMwNTAyXCI6IFwi6ZqG6Ziz5Yy6XCIsXG5cdCAgICBcIjUzMDUyMVwiOiBcIuaWveeUuOWOv1wiLFxuXHQgICAgXCI1MzA1MjJcIjogXCLohb7lhrLljr9cIixcblx0ICAgIFwiNTMwNTIzXCI6IFwi6b6Z6Zm15Y6/XCIsXG5cdCAgICBcIjUzMDUyNFwiOiBcIuaYjOWugeWOv1wiLFxuXHQgICAgXCI1MzA1MjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMwNjAwXCI6IFwi5pit6YCa5biCXCIsXG5cdCAgICBcIjUzMDYwMlwiOiBcIuaYremYs+WMulwiLFxuXHQgICAgXCI1MzA2MjFcIjogXCLpsoHnlLjljr9cIixcblx0ICAgIFwiNTMwNjIyXCI6IFwi5ben5a625Y6/XCIsXG5cdCAgICBcIjUzMDYyM1wiOiBcIuebkOa0peWOv1wiLFxuXHQgICAgXCI1MzA2MjRcIjogXCLlpKflhbPljr9cIixcblx0ICAgIFwiNTMwNjI1XCI6IFwi5rC45ZaE5Y6/XCIsXG5cdCAgICBcIjUzMDYyNlwiOiBcIue7peaxn+WOv1wiLFxuXHQgICAgXCI1MzA2MjdcIjogXCLplYfpm4Tljr9cIixcblx0ICAgIFwiNTMwNjI4XCI6IFwi5b2d6Imv5Y6/XCIsXG5cdCAgICBcIjUzMDYyOVwiOiBcIuWogeS/oeWOv1wiLFxuXHQgICAgXCI1MzA2MzBcIjogXCLmsLTlr4zljr9cIixcblx0ICAgIFwiNTMwNjMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUzMDcwMFwiOiBcIuS4veaxn+W4glwiLFxuXHQgICAgXCI1MzA3MDJcIjogXCLlj6Tln47ljLpcIixcblx0ICAgIFwiNTMwNzIxXCI6IFwi546J6b6Z57qz6KW/5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDcyMlwiOiBcIuawuOiDnOWOv1wiLFxuXHQgICAgXCI1MzA3MjNcIjogXCLljY7lnarljr9cIixcblx0ICAgIFwiNTMwNzI0XCI6IFwi5a6B6JKX5b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDcyNVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzA4MDBcIjogXCLmma7mtLHluIJcIixcblx0ICAgIFwiNTMwODAyXCI6IFwi5oCd6IyF5Yy6XCIsXG5cdCAgICBcIjUzMDgyMVwiOiBcIuWugea0seWTiOWwvOaXj+W9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA4MjJcIjogXCLloqjmsZ/lk4jlsLzml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwODIzXCI6IFwi5pmv5Lic5b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDgyNFwiOiBcIuaZr+iwt+WCo+aXj+W9neaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA4MjVcIjogXCLplYfmsoXlvZ3ml4/lk4jlsLzml4/mi4nnpZzml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwODI2XCI6IFwi5rGf5Z+O5ZOI5bC85peP5b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDgyN1wiOiBcIuWtn+i/nuWCo+aXj+aLieelnOaXj+S9pOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA4MjhcIjogXCLmvpzmsqfmi4nnpZzml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwODI5XCI6IFwi6KW/55uf5L2k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDgzMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzA5MDBcIjogXCLkuLTmsqfluIJcIixcblx0ICAgIFwiNTMwOTAyXCI6IFwi5Li057+U5Yy6XCIsXG5cdCAgICBcIjUzMDkyMVwiOiBcIuWHpOW6huWOv1wiLFxuXHQgICAgXCI1MzA5MjJcIjogXCLkupHljr9cIixcblx0ICAgIFwiNTMwOTIzXCI6IFwi5rC45b635Y6/XCIsXG5cdCAgICBcIjUzMDkyNFwiOiBcIumVh+W6t+WOv1wiLFxuXHQgICAgXCI1MzA5MjVcIjogXCLlj4zmsZ/mi4nnpZzml4/kvaTml4/luIPmnJfml4/lgqPml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMwOTI2XCI6IFwi6IC/6ams5YKj5peP5L2k5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMDkyN1wiOiBcIuayp+a6kOS9pOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzA5MjhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMyMzAwXCI6IFwi5qWa6ZuE5b2d5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMjMwMVwiOiBcIualmumbhOW4glwiLFxuXHQgICAgXCI1MzIzMjJcIjogXCLlj4zmn4/ljr9cIixcblx0ICAgIFwiNTMyMzIzXCI6IFwi54mf5a6a5Y6/XCIsXG5cdCAgICBcIjUzMjMyNFwiOiBcIuWNl+WNjuWOv1wiLFxuXHQgICAgXCI1MzIzMjVcIjogXCLlp5rlronljr9cIixcblx0ICAgIFwiNTMyMzI2XCI6IFwi5aSn5aea5Y6/XCIsXG5cdCAgICBcIjUzMjMyN1wiOiBcIuawuOS7geWOv1wiLFxuXHQgICAgXCI1MzIzMjhcIjogXCLlhYPosIvljr9cIixcblx0ICAgIFwiNTMyMzI5XCI6IFwi5q2m5a6a5Y6/XCIsXG5cdCAgICBcIjUzMjMzMVwiOiBcIuemhOS4sOWOv1wiLFxuXHQgICAgXCI1MzIzMzJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMyNTAwXCI6IFwi57qi5rKz5ZOI5bC85peP5b2d5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMjUwMVwiOiBcIuS4quaXp+W4glwiLFxuXHQgICAgXCI1MzI1MDJcIjogXCLlvIDov5zluIJcIixcblx0ICAgIFwiNTMyNTIyXCI6IFwi6JKZ6Ieq5biCXCIsXG5cdCAgICBcIjUzMjUyM1wiOiBcIuWxj+i+ueiLl+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzI1MjRcIjogXCLlu7rmsLTljr9cIixcblx0ICAgIFwiNTMyNTI1XCI6IFwi55+z5bGP5Y6/XCIsXG5cdCAgICBcIjUzMjUyNlwiOiBcIuW8peWLkuW4glwiLFxuXHQgICAgXCI1MzI1MjdcIjogXCLms7jopb/ljr9cIixcblx0ICAgIFwiNTMyNTI4XCI6IFwi5YWD6Ziz5Y6/XCIsXG5cdCAgICBcIjUzMjUyOVwiOiBcIue6ouays+WOv1wiLFxuXHQgICAgXCI1MzI1MzBcIjogXCLph5HlubPoi5fml4/nkbbml4/lgqPml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMyNTMxXCI6IFwi57u/5pil5Y6/XCIsXG5cdCAgICBcIjUzMjUzMlwiOiBcIuays+WPo+eRtuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzI1MzNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMyNjAwXCI6IFwi5paH5bGx5aOu5peP6IuX5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMjYyMVwiOiBcIuaWh+WxseW4glwiLFxuXHQgICAgXCI1MzI2MjJcIjogXCLnoJrlsbHljr9cIixcblx0ICAgIFwiNTMyNjIzXCI6IFwi6KW/55W05Y6/XCIsXG5cdCAgICBcIjUzMjYyNFwiOiBcIum6u+agl+WdoeWOv1wiLFxuXHQgICAgXCI1MzI2MjVcIjogXCLpqazlhbPljr9cIixcblx0ICAgIFwiNTMyNjI2XCI6IFwi5LiY5YyX5Y6/XCIsXG5cdCAgICBcIjUzMjYyN1wiOiBcIuW5v+WNl+WOv1wiLFxuXHQgICAgXCI1MzI2MjhcIjogXCLlr4zlroHljr9cIixcblx0ICAgIFwiNTMyNjI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjUzMjgwMFwiOiBcIuilv+WPjOeJiOe6s+WCo+aXj+iHquayu+W3nlwiLFxuXHQgICAgXCI1MzI4MDFcIjogXCLmma/mtKrluIJcIixcblx0ICAgIFwiNTMyODIyXCI6IFwi5YuQ5rW35Y6/XCIsXG5cdCAgICBcIjUzMjgyM1wiOiBcIuWLkOiFiuWOv1wiLFxuXHQgICAgXCI1MzI4MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMyOTAwXCI6IFwi5aSn55CG55m95peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMjkwMVwiOiBcIuWkp+eQhuW4glwiLFxuXHQgICAgXCI1MzI5MjJcIjogXCLmvL7mv57lvZ3ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNTMyOTIzXCI6IFwi56Wl5LqR5Y6/XCIsXG5cdCAgICBcIjUzMjkyNFwiOiBcIuWuvuW3neWOv1wiLFxuXHQgICAgXCI1MzI5MjVcIjogXCLlvKXmuKHljr9cIixcblx0ICAgIFwiNTMyOTI2XCI6IFwi5Y2X5ran5b2d5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMjkyN1wiOiBcIuW3jeWxseW9neaXj+WbnuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzI5MjhcIjogXCLmsLjlubPljr9cIixcblx0ICAgIFwiNTMyOTI5XCI6IFwi5LqR6b6Z5Y6/XCIsXG5cdCAgICBcIjUzMjkzMFwiOiBcIua0sea6kOWOv1wiLFxuXHQgICAgXCI1MzI5MzFcIjogXCLliZHlt53ljr9cIixcblx0ICAgIFwiNTMyOTMyXCI6IFwi6bmk5bqG5Y6/XCIsXG5cdCAgICBcIjUzMjkzM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1MzMxMDBcIjogXCLlvrflro/lgqPml4/mma/poofml4/oh6rmsrvlt55cIixcblx0ICAgIFwiNTMzMTAyXCI6IFwi55Ge5Li95biCXCIsXG5cdCAgICBcIjUzMzEwM1wiOiBcIuiKkuW4glwiLFxuXHQgICAgXCI1MzMxMjJcIjogXCLmooHmsrPljr9cIixcblx0ICAgIFwiNTMzMTIzXCI6IFwi55uI5rGf5Y6/XCIsXG5cdCAgICBcIjUzMzEyNFwiOiBcIumZh+W3neWOv1wiLFxuXHQgICAgXCI1MzMxMjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMzMzAwXCI6IFwi5oCS5rGf5YKI5YOz5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMzMyMVwiOiBcIuazuOawtOWOv1wiLFxuXHQgICAgXCI1MzMzMjNcIjogXCLnpo/otKHljr9cIixcblx0ICAgIFwiNTMzMzI0XCI6IFwi6LSh5bGx54us6b6Z5peP5oCS5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMzMyNVwiOiBcIuWFsOWdqueZveaXj+aZruexs+aXj+iHquayu+WOv1wiLFxuXHQgICAgXCI1MzMzMjZcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTMzNDAwXCI6IFwi6L+q5bqG6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjUzMzQyMVwiOiBcIummmeagvOmHjOaLieWOv1wiLFxuXHQgICAgXCI1MzM0MjJcIjogXCLlvrfpkqbljr9cIixcblx0ICAgIFwiNTMzNDIzXCI6IFwi57u06KW/5YKI5YOz5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjUzMzQyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1NDAwMDBcIjogXCLopb/ol4/oh6rmsrvljLpcIixcblx0ICAgIFwiNTQwMTAwXCI6IFwi5ouJ6JCo5biCXCIsXG5cdCAgICBcIjU0MDEwMlwiOiBcIuWfjuWFs+WMulwiLFxuXHQgICAgXCI1NDAxMjFcIjogXCLmnpflkajljr9cIixcblx0ICAgIFwiNTQwMTIyXCI6IFwi5b2T6ZuE5Y6/XCIsXG5cdCAgICBcIjU0MDEyM1wiOiBcIuWwvOacqOWOv1wiLFxuXHQgICAgXCI1NDAxMjRcIjogXCLmm7LmsLTljr9cIixcblx0ICAgIFwiNTQwMTI1XCI6IFwi5aCG6b6Z5b635bqG5Y6/XCIsXG5cdCAgICBcIjU0MDEyNlwiOiBcIui+vuWtnOWOv1wiLFxuXHQgICAgXCI1NDAxMjdcIjogXCLloqjnq7nlt6XljaHljr9cIixcblx0ICAgIFwiNTQwMTI4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjU0MjEwMFwiOiBcIuaYjOmDveWcsOWMulwiLFxuXHQgICAgXCI1NDIxMjFcIjogXCLmmIzpg73ljr9cIixcblx0ICAgIFwiNTQyMTIyXCI6IFwi5rGf6L6+5Y6/XCIsXG5cdCAgICBcIjU0MjEyM1wiOiBcIui0oeinieWOv1wiLFxuXHQgICAgXCI1NDIxMjRcIjogXCLnsbvkuYzpvZDljr9cIixcblx0ICAgIFwiNTQyMTI1XCI6IFwi5LiB6Z2S5Y6/XCIsXG5cdCAgICBcIjU0MjEyNlwiOiBcIuWvn+mbheWOv1wiLFxuXHQgICAgXCI1NDIxMjdcIjogXCLlhavlrr/ljr9cIixcblx0ICAgIFwiNTQyMTI4XCI6IFwi5bem6LSh5Y6/XCIsXG5cdCAgICBcIjU0MjEyOVwiOiBcIuiKkuW6t+WOv1wiLFxuXHQgICAgXCI1NDIxMzJcIjogXCLmtJvpmobljr9cIixcblx0ICAgIFwiNTQyMTMzXCI6IFwi6L655Z2d5Y6/XCIsXG5cdCAgICBcIjU0MjEzNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI1NDIyMDBcIjogXCLlsbHljZflnLDljLpcIixcblx0ICAgIFwiNTQyMjIxXCI6IFwi5LmD5Lic5Y6/XCIsXG5cdCAgICBcIjU0MjIyMlwiOiBcIuaJjuWbiuWOv1wiLFxuXHQgICAgXCI1NDIyMjNcIjogXCLotKHlmI7ljr9cIixcblx0ICAgIFwiNTQyMjI0XCI6IFwi5qGR5pel5Y6/XCIsXG5cdCAgICBcIjU0MjIyNVwiOiBcIueQvOe7k+WOv1wiLFxuXHQgICAgXCI1NDIyMjZcIjogXCLmm7Lmnb7ljr9cIixcblx0ICAgIFwiNTQyMjI3XCI6IFwi5o6q576O5Y6/XCIsXG5cdCAgICBcIjU0MjIyOFwiOiBcIua0m+aJjuWOv1wiLFxuXHQgICAgXCI1NDIyMjlcIjogXCLliqDmn6Xljr9cIixcblx0ICAgIFwiNTQyMjMxXCI6IFwi6ZqG5a2Q5Y6/XCIsXG5cdCAgICBcIjU0MjIzMlwiOiBcIumUmemCo+WOv1wiLFxuXHQgICAgXCI1NDIyMzNcIjogXCLmtarljaHlrZDljr9cIixcblx0ICAgIFwiNTQyMjM0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjU0MjMwMFwiOiBcIuaXpeWWgOWImeWcsOWMulwiLFxuXHQgICAgXCI1NDIzMDFcIjogXCLml6XlloDliJnluIJcIixcblx0ICAgIFwiNTQyMzIyXCI6IFwi5Y2X5pyo5p6X5Y6/XCIsXG5cdCAgICBcIjU0MjMyM1wiOiBcIuaxn+WtnOWOv1wiLFxuXHQgICAgXCI1NDIzMjRcIjogXCLlrprml6Xljr9cIixcblx0ICAgIFwiNTQyMzI1XCI6IFwi6JCo6L+m5Y6/XCIsXG5cdCAgICBcIjU0MjMyNlwiOiBcIuaLieWtnOWOv1wiLFxuXHQgICAgXCI1NDIzMjdcIjogXCLmmILku4Hljr9cIixcblx0ICAgIFwiNTQyMzI4XCI6IFwi6LCi6YCa6Zeo5Y6/XCIsXG5cdCAgICBcIjU0MjMyOVwiOiBcIueZveacl+WOv1wiLFxuXHQgICAgXCI1NDIzMzBcIjogXCLku4HluIPljr9cIixcblx0ICAgIFwiNTQyMzMxXCI6IFwi5bq36ams5Y6/XCIsXG5cdCAgICBcIjU0MjMzMlwiOiBcIuWumue7k+WOv1wiLFxuXHQgICAgXCI1NDIzMzNcIjogXCLku7Llt7Tljr9cIixcblx0ICAgIFwiNTQyMzM0XCI6IFwi5Lqa5Lic5Y6/XCIsXG5cdCAgICBcIjU0MjMzNVwiOiBcIuWQiemahuWOv1wiLFxuXHQgICAgXCI1NDIzMzZcIjogXCLogYLmi4nmnKjljr9cIixcblx0ICAgIFwiNTQyMzM3XCI6IFwi6JCo5ZiO5Y6/XCIsXG5cdCAgICBcIjU0MjMzOFwiOiBcIuWyl+W3tOWOv1wiLFxuXHQgICAgXCI1NDIzMzlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTQyNDAwXCI6IFwi6YKj5puy5Zyw5Yy6XCIsXG5cdCAgICBcIjU0MjQyMVwiOiBcIumCo+absuWOv1wiLFxuXHQgICAgXCI1NDI0MjJcIjogXCLlmInpu47ljr9cIixcblx0ICAgIFwiNTQyNDIzXCI6IFwi5q+U5aaC5Y6/XCIsXG5cdCAgICBcIjU0MjQyNFwiOiBcIuiBguiNo+WOv1wiLFxuXHQgICAgXCI1NDI0MjVcIjogXCLlronlpJrljr9cIixcblx0ICAgIFwiNTQyNDI2XCI6IFwi55Sz5omO5Y6/XCIsXG5cdCAgICBcIjU0MjQyN1wiOiBcIue0ouWOv1wiLFxuXHQgICAgXCI1NDI0MjhcIjogXCLnj63miIjljr9cIixcblx0ICAgIFwiNTQyNDI5XCI6IFwi5be06Z2S5Y6/XCIsXG5cdCAgICBcIjU0MjQzMFwiOiBcIuWwvOeOm+WOv1wiLFxuXHQgICAgXCI1NDI0MzFcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNTQyNDMyXCI6IFwi5Y+M5rmW5Y6/XCIsXG5cdCAgICBcIjU0MjUwMFwiOiBcIumYv+mHjOWcsOWMulwiLFxuXHQgICAgXCI1NDI1MjFcIjogXCLmma7lhbDljr9cIixcblx0ICAgIFwiNTQyNTIyXCI6IFwi5pyt6L6+5Y6/XCIsXG5cdCAgICBcIjU0MjUyM1wiOiBcIuWZtuWwlOWOv1wiLFxuXHQgICAgXCI1NDI1MjRcIjogXCLml6XlnJ/ljr9cIixcblx0ICAgIFwiNTQyNTI1XCI6IFwi6Z2p5ZCJ5Y6/XCIsXG5cdCAgICBcIjU0MjUyNlwiOiBcIuaUueWImeWOv1wiLFxuXHQgICAgXCI1NDI1MjdcIjogXCLmjqrli6Tljr9cIixcblx0ICAgIFwiNTQyNTI4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjU0MjYwMFwiOiBcIuael+iKneWcsOWMulwiLFxuXHQgICAgXCI1NDI2MjFcIjogXCLmnpfoip3ljr9cIixcblx0ICAgIFwiNTQyNjIyXCI6IFwi5bel5biD5rGf6L6+5Y6/XCIsXG5cdCAgICBcIjU0MjYyM1wiOiBcIuexs+ael+WOv1wiLFxuXHQgICAgXCI1NDI2MjRcIjogXCLloqjohLHljr9cIixcblx0ICAgIFwiNTQyNjI1XCI6IFwi5rOi5a+G5Y6/XCIsXG5cdCAgICBcIjU0MjYyNlwiOiBcIuWvn+maheWOv1wiLFxuXHQgICAgXCI1NDI2MjdcIjogXCLmnJfljr9cIixcblx0ICAgIFwiNTQyNjI4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYxMDAwMFwiOiBcIumZleilv+ecgVwiLFxuXHQgICAgXCI2MTAxMDBcIjogXCLopb/lronluIJcIixcblx0ICAgIFwiNjEwMTAyXCI6IFwi5paw5Z+O5Yy6XCIsXG5cdCAgICBcIjYxMDEwM1wiOiBcIueikeael+WMulwiLFxuXHQgICAgXCI2MTAxMDRcIjogXCLojrLmuZbljLpcIixcblx0ICAgIFwiNjEwMTExXCI6IFwi54Ge5qGl5Yy6XCIsXG5cdCAgICBcIjYxMDExMlwiOiBcIuacquWkruWMulwiLFxuXHQgICAgXCI2MTAxMTNcIjogXCLpm4HloZTljLpcIixcblx0ICAgIFwiNjEwMTE0XCI6IFwi6ZiO6Imv5Yy6XCIsXG5cdCAgICBcIjYxMDExNVwiOiBcIuS4tOa9vOWMulwiLFxuXHQgICAgXCI2MTAxMTZcIjogXCLplb/lronljLpcIixcblx0ICAgIFwiNjEwMTIyXCI6IFwi6JOd55Sw5Y6/XCIsXG5cdCAgICBcIjYxMDEyNFwiOiBcIuWRqOiHs+WOv1wiLFxuXHQgICAgXCI2MTAxMjVcIjogXCLmiLfljr9cIixcblx0ICAgIFwiNjEwMTI2XCI6IFwi6auY6Zm15Y6/XCIsXG5cdCAgICBcIjYxMDEyN1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MTAyMDBcIjogXCLpk5zlt53luIJcIixcblx0ICAgIFwiNjEwMjAyXCI6IFwi546L55uK5Yy6XCIsXG5cdCAgICBcIjYxMDIwM1wiOiBcIuWNsOWPsOWMulwiLFxuXHQgICAgXCI2MTAyMDRcIjogXCLogIDlt57ljLpcIixcblx0ICAgIFwiNjEwMjIyXCI6IFwi5a6c5ZCb5Y6/XCIsXG5cdCAgICBcIjYxMDIyM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MTAzMDBcIjogXCLlrp3puKHluIJcIixcblx0ICAgIFwiNjEwMzAyXCI6IFwi5rit5ruo5Yy6XCIsXG5cdCAgICBcIjYxMDMwM1wiOiBcIumHkeWPsOWMulwiLFxuXHQgICAgXCI2MTAzMDRcIjogXCLpmYjku5PljLpcIixcblx0ICAgIFwiNjEwMzIyXCI6IFwi5Yek57+U5Y6/XCIsXG5cdCAgICBcIjYxMDMyM1wiOiBcIuWykOWxseWOv1wiLFxuXHQgICAgXCI2MTAzMjRcIjogXCLmibbpo47ljr9cIixcblx0ICAgIFwiNjEwMzI2XCI6IFwi55yJ5Y6/XCIsXG5cdCAgICBcIjYxMDMyN1wiOiBcIumZh+WOv1wiLFxuXHQgICAgXCI2MTAzMjhcIjogXCLljYPpmLPljr9cIixcblx0ICAgIFwiNjEwMzI5XCI6IFwi6bqf5ri45Y6/XCIsXG5cdCAgICBcIjYxMDMzMFwiOiBcIuWHpOWOv1wiLFxuXHQgICAgXCI2MTAzMzFcIjogXCLlpKrnmb3ljr9cIixcblx0ICAgIFwiNjEwMzMyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYxMDQwMFwiOiBcIuWSuOmYs+W4glwiLFxuXHQgICAgXCI2MTA0MDJcIjogXCLnp6bpg73ljLpcIixcblx0ICAgIFwiNjEwNDAzXCI6IFwi5p2o6Zm15Yy6XCIsXG5cdCAgICBcIjYxMDQwNFwiOiBcIua4reWfjuWMulwiLFxuXHQgICAgXCI2MTA0MjJcIjogXCLkuInljp/ljr9cIixcblx0ICAgIFwiNjEwNDIzXCI6IFwi5rO+6Ziz5Y6/XCIsXG5cdCAgICBcIjYxMDQyNFwiOiBcIuS5vuWOv1wiLFxuXHQgICAgXCI2MTA0MjVcIjogXCLnpLzms4nljr9cIixcblx0ICAgIFwiNjEwNDI2XCI6IFwi5rC45a+/5Y6/XCIsXG5cdCAgICBcIjYxMDQyN1wiOiBcIuW9rOWOv1wiLFxuXHQgICAgXCI2MTA0MjhcIjogXCLplb/mrabljr9cIixcblx0ICAgIFwiNjEwNDI5XCI6IFwi5pes6YKR5Y6/XCIsXG5cdCAgICBcIjYxMDQzMFwiOiBcIua3s+WMluWOv1wiLFxuXHQgICAgXCI2MTA0MzFcIjogXCLmrablip/ljr9cIixcblx0ICAgIFwiNjEwNDgxXCI6IFwi5YW05bmz5biCXCIsXG5cdCAgICBcIjYxMDQ4MlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MTA1MDBcIjogXCLmuK3ljZfluIJcIixcblx0ICAgIFwiNjEwNTAyXCI6IFwi5Li05rit5Yy6XCIsXG5cdCAgICBcIjYxMDUyMVwiOiBcIuWNjuWOv1wiLFxuXHQgICAgXCI2MTA1MjJcIjogXCLmvbzlhbPljr9cIixcblx0ICAgIFwiNjEwNTIzXCI6IFwi5aSn6I2U5Y6/XCIsXG5cdCAgICBcIjYxMDUyNFwiOiBcIuWQiOmYs+WOv1wiLFxuXHQgICAgXCI2MTA1MjVcIjogXCLmvoTln47ljr9cIixcblx0ICAgIFwiNjEwNTI2XCI6IFwi6JKy5Z+O5Y6/XCIsXG5cdCAgICBcIjYxMDUyN1wiOiBcIueZveawtOWOv1wiLFxuXHQgICAgXCI2MTA1MjhcIjogXCLlr4zlubPljr9cIixcblx0ICAgIFwiNjEwNTgxXCI6IFwi6Z+p5Z+O5biCXCIsXG5cdCAgICBcIjYxMDU4MlwiOiBcIuWNjumYtOW4glwiLFxuXHQgICAgXCI2MTA1ODNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjEwNjAwXCI6IFwi5bu25a6J5biCXCIsXG5cdCAgICBcIjYxMDYwMlwiOiBcIuWuneWhlOWMulwiLFxuXHQgICAgXCI2MTA2MjFcIjogXCLlu7bplb/ljr9cIixcblx0ICAgIFwiNjEwNjIyXCI6IFwi5bu25bed5Y6/XCIsXG5cdCAgICBcIjYxMDYyM1wiOiBcIuWtkOmVv+WOv1wiLFxuXHQgICAgXCI2MTA2MjRcIjogXCLlronloZ7ljr9cIixcblx0ICAgIFwiNjEwNjI1XCI6IFwi5b+X5Li55Y6/XCIsXG5cdCAgICBcIjYxMDYyNlwiOiBcIuWQtOi1t+WOv1wiLFxuXHQgICAgXCI2MTA2MjdcIjogXCLnlJjms4nljr9cIixcblx0ICAgIFwiNjEwNjI4XCI6IFwi5a+M5Y6/XCIsXG5cdCAgICBcIjYxMDYyOVwiOiBcIua0m+W3neWOv1wiLFxuXHQgICAgXCI2MTA2MzBcIjogXCLlrpzlt53ljr9cIixcblx0ICAgIFwiNjEwNjMxXCI6IFwi6buE6b6Z5Y6/XCIsXG5cdCAgICBcIjYxMDYzMlwiOiBcIum7hOmZteWOv1wiLFxuXHQgICAgXCI2MTA2MzNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjEwNzAwXCI6IFwi5rGJ5Lit5biCXCIsXG5cdCAgICBcIjYxMDcwMlwiOiBcIuaxieWPsOWMulwiLFxuXHQgICAgXCI2MTA3MjFcIjogXCLljZfpg5Hljr9cIixcblx0ICAgIFwiNjEwNzIyXCI6IFwi5Z+O5Zu65Y6/XCIsXG5cdCAgICBcIjYxMDcyM1wiOiBcIua0i+WOv1wiLFxuXHQgICAgXCI2MTA3MjRcIjogXCLopb/kuaHljr9cIixcblx0ICAgIFwiNjEwNzI1XCI6IFwi5YuJ5Y6/XCIsXG5cdCAgICBcIjYxMDcyNlwiOiBcIuWugeW8uuWOv1wiLFxuXHQgICAgXCI2MTA3MjdcIjogXCLnlaXpmLPljr9cIixcblx0ICAgIFwiNjEwNzI4XCI6IFwi6ZWH5be05Y6/XCIsXG5cdCAgICBcIjYxMDcyOVwiOiBcIueVmeWdneWOv1wiLFxuXHQgICAgXCI2MTA3MzBcIjogXCLkvZvlnarljr9cIixcblx0ICAgIFwiNjEwNzMxXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYxMDgwMFwiOiBcIuamhuael+W4glwiLFxuXHQgICAgXCI2MTA4MDJcIjogXCLmpobpmLPljLpcIixcblx0ICAgIFwiNjEwODIxXCI6IFwi56We5pyo5Y6/XCIsXG5cdCAgICBcIjYxMDgyMlwiOiBcIuW6nOiwt+WOv1wiLFxuXHQgICAgXCI2MTA4MjNcIjogXCLmqKrlsbHljr9cIixcblx0ICAgIFwiNjEwODI0XCI6IFwi6Z2W6L655Y6/XCIsXG5cdCAgICBcIjYxMDgyNVwiOiBcIuWumui+ueWOv1wiLFxuXHQgICAgXCI2MTA4MjZcIjogXCLnu6Xlvrfljr9cIixcblx0ICAgIFwiNjEwODI3XCI6IFwi57Gz6ISC5Y6/XCIsXG5cdCAgICBcIjYxMDgyOFwiOiBcIuS9s+WOv1wiLFxuXHQgICAgXCI2MTA4MjlcIjogXCLlkLTloKHljr9cIixcblx0ICAgIFwiNjEwODMwXCI6IFwi5riF5ran5Y6/XCIsXG5cdCAgICBcIjYxMDgzMVwiOiBcIuWtkOa0suWOv1wiLFxuXHQgICAgXCI2MTA4MzJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjEwOTAwXCI6IFwi5a6J5bq35biCXCIsXG5cdCAgICBcIjYxMDkwMlwiOiBcIuaxiea7qOWMulwiLFxuXHQgICAgXCI2MTA5MjFcIjogXCLmsYnpmLTljr9cIixcblx0ICAgIFwiNjEwOTIyXCI6IFwi55+z5rOJ5Y6/XCIsXG5cdCAgICBcIjYxMDkyM1wiOiBcIuWugemZleWOv1wiLFxuXHQgICAgXCI2MTA5MjRcIjogXCLntKvpmLPljr9cIixcblx0ICAgIFwiNjEwOTI1XCI6IFwi5bKa55qL5Y6/XCIsXG5cdCAgICBcIjYxMDkyNlwiOiBcIuW5s+WIqeWOv1wiLFxuXHQgICAgXCI2MTA5MjdcIjogXCLplYflnarljr9cIixcblx0ICAgIFwiNjEwOTI4XCI6IFwi5pes6Ziz5Y6/XCIsXG5cdCAgICBcIjYxMDkyOVwiOiBcIueZveays+WOv1wiLFxuXHQgICAgXCI2MTA5MzBcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjExMDAwXCI6IFwi5ZWG5rSb5biCXCIsXG5cdCAgICBcIjYxMTAwMlwiOiBcIuWVhuW3nuWMulwiLFxuXHQgICAgXCI2MTEwMjFcIjogXCLmtJvljZfljr9cIixcblx0ICAgIFwiNjExMDIyXCI6IFwi5Li55Yek5Y6/XCIsXG5cdCAgICBcIjYxMTAyM1wiOiBcIuWVhuWNl+WOv1wiLFxuXHQgICAgXCI2MTEwMjRcIjogXCLlsbHpmLPljr9cIixcblx0ICAgIFwiNjExMDI1XCI6IFwi6ZWH5a6J5Y6/XCIsXG5cdCAgICBcIjYxMTAyNlwiOiBcIuafnuawtOWOv1wiLFxuXHQgICAgXCI2MTEwMjdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjIwMDAwXCI6IFwi55SY6IKD55yBXCIsXG5cdCAgICBcIjYyMDEwMFwiOiBcIuWFsOW3nuW4glwiLFxuXHQgICAgXCI2MjAxMDJcIjogXCLln47lhbPljLpcIixcblx0ICAgIFwiNjIwMTAzXCI6IFwi5LiD6YeM5rKz5Yy6XCIsXG5cdCAgICBcIjYyMDEwNFwiOiBcIuilv+WbuuWMulwiLFxuXHQgICAgXCI2MjAxMDVcIjogXCLlronlroHljLpcIixcblx0ICAgIFwiNjIwMTExXCI6IFwi57qi5Y+k5Yy6XCIsXG5cdCAgICBcIjYyMDEyMVwiOiBcIuawuOeZu+WOv1wiLFxuXHQgICAgXCI2MjAxMjJcIjogXCLnmovlhbDljr9cIixcblx0ICAgIFwiNjIwMTIzXCI6IFwi5qaG5Lit5Y6/XCIsXG5cdCAgICBcIjYyMDEyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjAyMDBcIjogXCLlmInls6rlhbPluIJcIixcblx0ICAgIFwiNjIwMzAwXCI6IFwi6YeR5piM5biCXCIsXG5cdCAgICBcIjYyMDMwMlwiOiBcIumHkeW3neWMulwiLFxuXHQgICAgXCI2MjAzMjFcIjogXCLmsLjmmIzljr9cIixcblx0ICAgIFwiNjIwMzIyXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMDQwMFwiOiBcIueZvemTtuW4glwiLFxuXHQgICAgXCI2MjA0MDJcIjogXCLnmb3pk7bljLpcIixcblx0ICAgIFwiNjIwNDAzXCI6IFwi5bmz5bed5Yy6XCIsXG5cdCAgICBcIjYyMDQyMVwiOiBcIumdlui/nOWOv1wiLFxuXHQgICAgXCI2MjA0MjJcIjogXCLkvJrlroHljr9cIixcblx0ICAgIFwiNjIwNDIzXCI6IFwi5pmv5rOw5Y6/XCIsXG5cdCAgICBcIjYyMDQyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjA1MDBcIjogXCLlpKnmsLTluIJcIixcblx0ICAgIFwiNjIwNTAyXCI6IFwi56em5bee5Yy6XCIsXG5cdCAgICBcIjYyMDUwM1wiOiBcIum6puenr+WMulwiLFxuXHQgICAgXCI2MjA1MjFcIjogXCLmuIXmsLTljr9cIixcblx0ICAgIFwiNjIwNTIyXCI6IFwi56em5a6J5Y6/XCIsXG5cdCAgICBcIjYyMDUyM1wiOiBcIueUmOiwt+WOv1wiLFxuXHQgICAgXCI2MjA1MjRcIjogXCLmrablsbHljr9cIixcblx0ICAgIFwiNjIwNTI1XCI6IFwi5byg5a625bed5Zue5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYyMDUyNlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjA2MDBcIjogXCLmrablqIHluIJcIixcblx0ICAgIFwiNjIwNjAyXCI6IFwi5YeJ5bee5Yy6XCIsXG5cdCAgICBcIjYyMDYyMVwiOiBcIuawkeWLpOWOv1wiLFxuXHQgICAgXCI2MjA2MjJcIjogXCLlj6Tmtarljr9cIixcblx0ICAgIFwiNjIwNjIzXCI6IFwi5aSp56Wd6JeP5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYyMDYyNFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjA3MDBcIjogXCLlvKDmjpbluIJcIixcblx0ICAgIFwiNjIwNzAyXCI6IFwi55SY5bee5Yy6XCIsXG5cdCAgICBcIjYyMDcyMVwiOiBcIuiCg+WNl+ijleWbuuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI2MjA3MjJcIjogXCLmsJHkuZDljr9cIixcblx0ICAgIFwiNjIwNzIzXCI6IFwi5Li05rO95Y6/XCIsXG5cdCAgICBcIjYyMDcyNFwiOiBcIumrmOWPsOWOv1wiLFxuXHQgICAgXCI2MjA3MjVcIjogXCLlsbHkuLnljr9cIixcblx0ICAgIFwiNjIwNzI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMDgwMFwiOiBcIuW5s+WHieW4glwiLFxuXHQgICAgXCI2MjA4MDJcIjogXCLltIbls5LljLpcIixcblx0ICAgIFwiNjIwODIxXCI6IFwi5rO+5bed5Y6/XCIsXG5cdCAgICBcIjYyMDgyMlwiOiBcIueBteWPsOWOv1wiLFxuXHQgICAgXCI2MjA4MjNcIjogXCLltIfkv6Hljr9cIixcblx0ICAgIFwiNjIwODI0XCI6IFwi5Y2O5Lqt5Y6/XCIsXG5cdCAgICBcIjYyMDgyNVwiOiBcIuW6hOa1quWOv1wiLFxuXHQgICAgXCI2MjA4MjZcIjogXCLpnZnlroHljr9cIixcblx0ICAgIFwiNjIwODI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMDkwMFwiOiBcIumFkuazieW4glwiLFxuXHQgICAgXCI2MjA5MDJcIjogXCLogoPlt57ljLpcIixcblx0ICAgIFwiNjIwOTIxXCI6IFwi6YeR5aGU5Y6/XCIsXG5cdCAgICBcIjYyMDkyMlwiOiBcIueTnOW3nuWOv1wiLFxuXHQgICAgXCI2MjA5MjNcIjogXCLogoPljJfokpnlj6Tml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNjIwOTI0XCI6IFwi6Zi/5YWL5aGe5ZOI6JCo5YWL5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYyMDk4MVwiOiBcIueOiemXqOW4glwiLFxuXHQgICAgXCI2MjA5ODJcIjogXCLmlabnhYzluIJcIixcblx0ICAgIFwiNjIwOTgzXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMTAwMFwiOiBcIuW6humYs+W4glwiLFxuXHQgICAgXCI2MjEwMDJcIjogXCLopb/ls7DljLpcIixcblx0ICAgIFwiNjIxMDIxXCI6IFwi5bqG5Z+O5Y6/XCIsXG5cdCAgICBcIjYyMTAyMlwiOiBcIueOr+WOv1wiLFxuXHQgICAgXCI2MjEwMjNcIjogXCLljY7msaDljr9cIixcblx0ICAgIFwiNjIxMDI0XCI6IFwi5ZCI5rC05Y6/XCIsXG5cdCAgICBcIjYyMTAyNVwiOiBcIuato+WugeWOv1wiLFxuXHQgICAgXCI2MjEwMjZcIjogXCLlroHljr9cIixcblx0ICAgIFwiNjIxMDI3XCI6IFwi6ZWH5Y6f5Y6/XCIsXG5cdCAgICBcIjYyMTAyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjExMDBcIjogXCLlrpropb/luIJcIixcblx0ICAgIFwiNjIxMTAyXCI6IFwi5a6J5a6a5Yy6XCIsXG5cdCAgICBcIjYyMTEyMVwiOiBcIumAmua4reWOv1wiLFxuXHQgICAgXCI2MjExMjJcIjogXCLpmYfopb/ljr9cIixcblx0ICAgIFwiNjIxMTIzXCI6IFwi5rit5rqQ5Y6/XCIsXG5cdCAgICBcIjYyMTEyNFwiOiBcIuS4tOa0ruWOv1wiLFxuXHQgICAgXCI2MjExMjVcIjogXCLmvLPljr9cIixcblx0ICAgIFwiNjIxMTI2XCI6IFwi5bK35Y6/XCIsXG5cdCAgICBcIjYyMTEyN1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjEyMDBcIjogXCLpmYfljZfluIJcIixcblx0ICAgIFwiNjIxMjAyXCI6IFwi5q2m6YO95Yy6XCIsXG5cdCAgICBcIjYyMTIyMVwiOiBcIuaIkOWOv1wiLFxuXHQgICAgXCI2MjEyMjJcIjogXCLmlofljr9cIixcblx0ICAgIFwiNjIxMjIzXCI6IFwi5a6V5piM5Y6/XCIsXG5cdCAgICBcIjYyMTIyNFwiOiBcIuW6t+WOv1wiLFxuXHQgICAgXCI2MjEyMjVcIjogXCLopb/lkozljr9cIixcblx0ICAgIFwiNjIxMjI2XCI6IFwi56S85Y6/XCIsXG5cdCAgICBcIjYyMTIyN1wiOiBcIuW+veWOv1wiLFxuXHQgICAgXCI2MjEyMjhcIjogXCLkuKTlvZPljr9cIixcblx0ICAgIFwiNjIxMjI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYyMjkwMFwiOiBcIuS4tOWkj+WbnuaXj+iHquayu+W3nlwiLFxuXHQgICAgXCI2MjI5MDFcIjogXCLkuLTlpI/luIJcIixcblx0ICAgIFwiNjIyOTIxXCI6IFwi5Li05aSP5Y6/XCIsXG5cdCAgICBcIjYyMjkyMlwiOiBcIuW6t+S5kOWOv1wiLFxuXHQgICAgXCI2MjI5MjNcIjogXCLmsLjpnZbljr9cIixcblx0ICAgIFwiNjIyOTI0XCI6IFwi5bm/5rKz5Y6/XCIsXG5cdCAgICBcIjYyMjkyNVwiOiBcIuWSjOaUv+WOv1wiLFxuXHQgICAgXCI2MjI5MjZcIjogXCLkuJzkuaHml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNjIyOTI3XCI6IFwi56ev55+z5bGx5L+d5a6J5peP5Lic5Lmh5peP5pKS5ouJ5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYyMjkyOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MjMwMDBcIjogXCLnlJjljZfol4/ml4/oh6rmsrvlt55cIixcblx0ICAgIFwiNjIzMDAxXCI6IFwi5ZCI5L2c5biCXCIsXG5cdCAgICBcIjYyMzAyMVwiOiBcIuS4tOa9reWOv1wiLFxuXHQgICAgXCI2MjMwMjJcIjogXCLljZPlsLzljr9cIixcblx0ICAgIFwiNjIzMDIzXCI6IFwi6Iif5puy5Y6/XCIsXG5cdCAgICBcIjYyMzAyNFwiOiBcIui/remDqOWOv1wiLFxuXHQgICAgXCI2MjMwMjVcIjogXCLnjpvmm7Lljr9cIixcblx0ICAgIFwiNjIzMDI2XCI6IFwi56KM5puy5Y6/XCIsXG5cdCAgICBcIjYyMzAyN1wiOiBcIuWkj+ays+WOv1wiLFxuXHQgICAgXCI2MjMwMjhcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMwMDAwXCI6IFwi6Z2S5rW355yBXCIsXG5cdCAgICBcIjYzMDEwMFwiOiBcIuilv+WugeW4glwiLFxuXHQgICAgXCI2MzAxMDJcIjogXCLln47kuJzljLpcIixcblx0ICAgIFwiNjMwMTAzXCI6IFwi5Z+O5Lit5Yy6XCIsXG5cdCAgICBcIjYzMDEwNFwiOiBcIuWfjuilv+WMulwiLFxuXHQgICAgXCI2MzAxMDVcIjogXCLln47ljJfljLpcIixcblx0ICAgIFwiNjMwMTIxXCI6IFwi5aSn6YCa5Zue5peP5Zyf5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYzMDEyMlwiOiBcIua5n+S4reWOv1wiLFxuXHQgICAgXCI2MzAxMjNcIjogXCLmuZ/mupDljr9cIixcblx0ICAgIFwiNjMwMTI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYzMjEwMFwiOiBcIua1t+S4nOW4glwiLFxuXHQgICAgXCI2MzIxMjFcIjogXCLlubPlronljr9cIixcblx0ICAgIFwiNjMyMTIyXCI6IFwi5rCR5ZKM5Zue5peP5Zyf5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYzMjEyM1wiOiBcIuS5kOmDveWMulwiLFxuXHQgICAgXCI2MzIxMjZcIjogXCLkupLliqnlnJ/ml4/oh6rmsrvljr9cIixcblx0ICAgIFwiNjMyMTI3XCI6IFwi5YyW6ZqG5Zue5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjYzMjEyOFwiOiBcIuW+quWMluaSkuaLieaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI2MzIxMjlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMyMjAwXCI6IFwi5rW35YyX6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjYzMjIyMVwiOiBcIumXqOa6kOWbnuaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI2MzIyMjJcIjogXCLnpYHov57ljr9cIixcblx0ICAgIFwiNjMyMjIzXCI6IFwi5rW35pmP5Y6/XCIsXG5cdCAgICBcIjYzMjIyNFwiOiBcIuWImuWvn+WOv1wiLFxuXHQgICAgXCI2MzIyMjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMyMzAwXCI6IFwi6buE5Y2X6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjYzMjMyMVwiOiBcIuWQjOS7geWOv1wiLFxuXHQgICAgXCI2MzIzMjJcIjogXCLlsJbmiY7ljr9cIixcblx0ICAgIFwiNjMyMzIzXCI6IFwi5rO95bqT5Y6/XCIsXG5cdCAgICBcIjYzMjMyNFwiOiBcIuays+WNl+iSmeWPpOaXj+iHquayu+WOv1wiLFxuXHQgICAgXCI2MzIzMjVcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMyNTAwXCI6IFwi5rW35Y2X6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjYzMjUyMVwiOiBcIuWFseWSjOWOv1wiLFxuXHQgICAgXCI2MzI1MjJcIjogXCLlkIzlvrfljr9cIixcblx0ICAgIFwiNjMyNTIzXCI6IFwi6LS15b635Y6/XCIsXG5cdCAgICBcIjYzMjUyNFwiOiBcIuWFtOa1t+WOv1wiLFxuXHQgICAgXCI2MzI1MjVcIjogXCLotLXljZfljr9cIixcblx0ICAgIFwiNjMyNTI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjYzMjYwMFwiOiBcIuaenOa0m+iXj+aXj+iHquayu+W3nlwiLFxuXHQgICAgXCI2MzI2MjFcIjogXCLnjpvmsoHljr9cIixcblx0ICAgIFwiNjMyNjIyXCI6IFwi54+t546b5Y6/XCIsXG5cdCAgICBcIjYzMjYyM1wiOiBcIueUmOW+t+WOv1wiLFxuXHQgICAgXCI2MzI2MjRcIjogXCLovr7ml6Xljr9cIixcblx0ICAgIFwiNjMyNjI1XCI6IFwi5LmF5rK75Y6/XCIsXG5cdCAgICBcIjYzMjYyNlwiOiBcIueOm+WkmuWOv1wiLFxuXHQgICAgXCI2MzI2MjdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjMyNzAwXCI6IFwi546J5qCR6JeP5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjYzMjcyMVwiOiBcIueOieagkeW4glwiLFxuXHQgICAgXCI2MzI3MjJcIjogXCLmnYLlpJrljr9cIixcblx0ICAgIFwiNjMyNzIzXCI6IFwi56ew5aSa5Y6/XCIsXG5cdCAgICBcIjYzMjcyNFwiOiBcIuayu+WkmuWOv1wiLFxuXHQgICAgXCI2MzI3MjVcIjogXCLlm4rosKbljr9cIixcblx0ICAgIFwiNjMyNzI2XCI6IFwi5puy6bq76I6x5Y6/XCIsXG5cdCAgICBcIjYzMjcyN1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2MzI4MDBcIjogXCLmtbfopb/okpnlj6Tml4/ol4/ml4/oh6rmsrvlt55cIixcblx0ICAgIFwiNjMyODAxXCI6IFwi5qC85bCU5pyo5biCXCIsXG5cdCAgICBcIjYzMjgwMlwiOiBcIuW+t+S7pOWTiOW4glwiLFxuXHQgICAgXCI2MzI4MjFcIjogXCLkuYzlhbDljr9cIixcblx0ICAgIFwiNjMyODIyXCI6IFwi6YO95YWw5Y6/XCIsXG5cdCAgICBcIjYzMjgyM1wiOiBcIuWkqeWzu+WOv1wiLFxuXHQgICAgXCI2MzI4MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjQwMDAwXCI6IFwi5a6B5aSP5Zue5peP6Ieq5rK75Yy6XCIsXG5cdCAgICBcIjY0MDEwMFwiOiBcIumTtuW3neW4glwiLFxuXHQgICAgXCI2NDAxMDRcIjogXCLlhbTluobljLpcIixcblx0ICAgIFwiNjQwMTA1XCI6IFwi6KW/5aSP5Yy6XCIsXG5cdCAgICBcIjY0MDEwNlwiOiBcIumHkeWHpOWMulwiLFxuXHQgICAgXCI2NDAxMjFcIjogXCLmsLjlroHljr9cIixcblx0ICAgIFwiNjQwMTIyXCI6IFwi6LS65YWw5Y6/XCIsXG5cdCAgICBcIjY0MDE4MVwiOiBcIueBteatpuW4glwiLFxuXHQgICAgXCI2NDAxODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjQwMjAwXCI6IFwi55+z5Zi05bGx5biCXCIsXG5cdCAgICBcIjY0MDIwMlwiOiBcIuWkp+atpuWPo+WMulwiLFxuXHQgICAgXCI2NDAyMDVcIjogXCLmg6DlhpzljLpcIixcblx0ICAgIFwiNjQwMjIxXCI6IFwi5bmz572X5Y6/XCIsXG5cdCAgICBcIjY0MDIyMlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2NDAzMDBcIjogXCLlkLTlv6DluIJcIixcblx0ICAgIFwiNjQwMzAyXCI6IFwi5Yip6YCa5Yy6XCIsXG5cdCAgICBcIjY0MDMwM1wiOiBcIue6ouWvuuWgoeWMulwiLFxuXHQgICAgXCI2NDAzMjNcIjogXCLnm5DmsaDljr9cIixcblx0ICAgIFwiNjQwMzI0XCI6IFwi5ZCM5b+D5Y6/XCIsXG5cdCAgICBcIjY0MDM4MVwiOiBcIumdkumTnOWzoeW4glwiLFxuXHQgICAgXCI2NDAzODJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjQwNDAwXCI6IFwi5Zu65Y6f5biCXCIsXG5cdCAgICBcIjY0MDQwMlwiOiBcIuWOn+W3nuWMulwiLFxuXHQgICAgXCI2NDA0MjJcIjogXCLopb/lkInljr9cIixcblx0ICAgIFwiNjQwNDIzXCI6IFwi6ZqG5b635Y6/XCIsXG5cdCAgICBcIjY0MDQyNFwiOiBcIuazvua6kOWOv1wiLFxuXHQgICAgXCI2NDA0MjVcIjogXCLlva3pmLPljr9cIixcblx0ICAgIFwiNjQwNDI2XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY0MDUwMFwiOiBcIuS4reWNq+W4glwiLFxuXHQgICAgXCI2NDA1MDJcIjogXCLmspnlnaHlpLTljLpcIixcblx0ICAgIFwiNjQwNTIxXCI6IFwi5Lit5a6B5Y6/XCIsXG5cdCAgICBcIjY0MDUyMlwiOiBcIua1t+WOn+WOv1wiLFxuXHQgICAgXCI2NDA1MjNcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUwMDAwXCI6IFwi5paw55aG57u05ZC+5bCU6Ieq5rK75Yy6XCIsXG5cdCAgICBcIjY1MDEwMFwiOiBcIuS5jOmygeacqOm9kOW4glwiLFxuXHQgICAgXCI2NTAxMDJcIjogXCLlpKnlsbHljLpcIixcblx0ICAgIFwiNjUwMTAzXCI6IFwi5rKZ5L6d5be05YWL5Yy6XCIsXG5cdCAgICBcIjY1MDEwNFwiOiBcIuaWsOW4guWMulwiLFxuXHQgICAgXCI2NTAxMDVcIjogXCLmsLTno6jmsp/ljLpcIixcblx0ICAgIFwiNjUwMTA2XCI6IFwi5aS05bGv5rKz5Yy6XCIsXG5cdCAgICBcIjY1MDEwN1wiOiBcIui+vuWdguWfjuWMulwiLFxuXHQgICAgXCI2NTAxMDlcIjogXCLnsbPkuJzljLpcIixcblx0ICAgIFwiNjUwMTIxXCI6IFwi5LmM6bKB5pyo6b2Q5Y6/XCIsXG5cdCAgICBcIjY1MDEyMlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2NTAyMDBcIjogXCLlhYvmi4nnjpvkvp3luIJcIixcblx0ICAgIFwiNjUwMjAyXCI6IFwi54us5bGx5a2Q5Yy6XCIsXG5cdCAgICBcIjY1MDIwM1wiOiBcIuWFi+aLieeOm+S+neWMulwiLFxuXHQgICAgXCI2NTAyMDRcIjogXCLnmb3norHmu6nljLpcIixcblx0ICAgIFwiNjUwMjA1XCI6IFwi5LmM5bCU56a+5Yy6XCIsXG5cdCAgICBcIjY1MDIwNlwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2NTIxMDBcIjogXCLlkJDpsoHnlarlnLDljLpcIixcblx0ICAgIFwiNjUyMTAxXCI6IFwi5ZCQ6bKB55Wq5biCXCIsXG5cdCAgICBcIjY1MjEyMlwiOiBcIumEr+WWhOWOv1wiLFxuXHQgICAgXCI2NTIxMjNcIjogXCLmiZjlhYvpgIrljr9cIixcblx0ICAgIFwiNjUyMTI0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1MjIwMFwiOiBcIuWTiOWvhuWcsOWMulwiLFxuXHQgICAgXCI2NTIyMDFcIjogXCLlk4jlr4bluIJcIixcblx0ICAgIFwiNjUyMjIyXCI6IFwi5be06YeM5Z2k5ZOI6JCo5YWL6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjY1MjIyM1wiOiBcIuS8iuWQvuWOv1wiLFxuXHQgICAgXCI2NTIyMjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUyMzAwXCI6IFwi5piM5ZCJ5Zue5peP6Ieq5rK75beeXCIsXG5cdCAgICBcIjY1MjMwMVwiOiBcIuaYjOWQieW4glwiLFxuXHQgICAgXCI2NTIzMDJcIjogXCLpmJzlurfluIJcIixcblx0ICAgIFwiNjUyMzIzXCI6IFwi5ZG85Zu+5aOB5Y6/XCIsXG5cdCAgICBcIjY1MjMyNFwiOiBcIueOm+e6s+aWr+WOv1wiLFxuXHQgICAgXCI2NTIzMjVcIjogXCLlpYflj7Dljr9cIixcblx0ICAgIFwiNjUyMzI3XCI6IFwi5ZCJ5pyo6JCo5bCU5Y6/XCIsXG5cdCAgICBcIjY1MjMyOFwiOiBcIuacqOWekuWTiOiQqOWFi+iHquayu+WOv1wiLFxuXHQgICAgXCI2NTIzMjlcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUyNzAwXCI6IFwi5Y2a5bCU5aGU5ouJ6JKZ5Y+k6Ieq5rK75beeXCIsXG5cdCAgICBcIjY1MjcwMVwiOiBcIuWNmuS5kOW4glwiLFxuXHQgICAgXCI2NTI3MDJcIjogXCLpmL/mi4nlsbHlj6PluIJcIixcblx0ICAgIFwiNjUyNzIyXCI6IFwi57K+5rKz5Y6/XCIsXG5cdCAgICBcIjY1MjcyM1wiOiBcIua4qeazieWOv1wiLFxuXHQgICAgXCI2NTI3MjRcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUyODAwXCI6IFwi5be06Z+z6YOt5qWe6JKZ5Y+k6Ieq5rK75beeXCIsXG5cdCAgICBcIjY1MjgwMVwiOiBcIuW6k+WwlOWLkuW4glwiLFxuXHQgICAgXCI2NTI4MjJcIjogXCLova7lj7Dljr9cIixcblx0ICAgIFwiNjUyODIzXCI6IFwi5bCJ54qB5Y6/XCIsXG5cdCAgICBcIjY1MjgyNFwiOiBcIuiLpee+jOWOv1wiLFxuXHQgICAgXCI2NTI4MjVcIjogXCLkuJTmnKvljr9cIixcblx0ICAgIFwiNjUyODI2XCI6IFwi54SJ6ICG5Zue5peP6Ieq5rK75Y6/XCIsXG5cdCAgICBcIjY1MjgyN1wiOiBcIuWSjOmdmeWOv1wiLFxuXHQgICAgXCI2NTI4MjhcIjogXCLlkoznoZXljr9cIixcblx0ICAgIFwiNjUyODI5XCI6IFwi5Y2a5rmW5Y6/XCIsXG5cdCAgICBcIjY1MjgzMFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI2NTI5MDBcIjogXCLpmL/lhYvoi4/lnLDljLpcIixcblx0ICAgIFwiNjUyOTAxXCI6IFwi6Zi/5YWL6IuP5biCXCIsXG5cdCAgICBcIjY1MjkyMlwiOiBcIua4qeWuv+WOv1wiLFxuXHQgICAgXCI2NTI5MjNcIjogXCLlupPovabljr9cIixcblx0ICAgIFwiNjUyOTI0XCI6IFwi5rKZ6ZuF5Y6/XCIsXG5cdCAgICBcIjY1MjkyNVwiOiBcIuaWsOWSjOWOv1wiLFxuXHQgICAgXCI2NTI5MjZcIjogXCLmi5zln47ljr9cIixcblx0ICAgIFwiNjUyOTI3XCI6IFwi5LmM5LuA5Y6/XCIsXG5cdCAgICBcIjY1MjkyOFwiOiBcIumYv+eTpuaPkOWOv1wiLFxuXHQgICAgXCI2NTI5MjlcIjogXCLmn6/lnarljr9cIixcblx0ICAgIFwiNjUyOTMwXCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1MzAwMFwiOiBcIuWFi+WtnOWLkuiLj+afr+WwlOWFi+WtnOiHquayu+W3nlwiLFxuXHQgICAgXCI2NTMwMDFcIjogXCLpmL/lm77ku4DluIJcIixcblx0ICAgIFwiNjUzMDIyXCI6IFwi6Zi/5YWL6Zm25Y6/XCIsXG5cdCAgICBcIjY1MzAyM1wiOiBcIumYv+WQiOWlh+WOv1wiLFxuXHQgICAgXCI2NTMwMjRcIjogXCLkuYzmgbDljr9cIixcblx0ICAgIFwiNjUzMDI1XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1MzEwMFwiOiBcIuWWgOS7gOWcsOWMulwiLFxuXHQgICAgXCI2NTMxMDFcIjogXCLlloDku4DluIJcIixcblx0ICAgIFwiNjUzMTIxXCI6IFwi55aP6ZmE5Y6/XCIsXG5cdCAgICBcIjY1MzEyMlwiOiBcIueWj+WLkuWOv1wiLFxuXHQgICAgXCI2NTMxMjNcIjogXCLoi7HlkInmspnljr9cIixcblx0ICAgIFwiNjUzMTI0XCI6IFwi5rO95pmu5Y6/XCIsXG5cdCAgICBcIjY1MzEyNVwiOiBcIuiOjui9puWOv1wiLFxuXHQgICAgXCI2NTMxMjZcIjogXCLlj7bln47ljr9cIixcblx0ICAgIFwiNjUzMTI3XCI6IFwi6bqm55uW5o+Q5Y6/XCIsXG5cdCAgICBcIjY1MzEyOFwiOiBcIuWys+aZrua5luWOv1wiLFxuXHQgICAgXCI2NTMxMjlcIjogXCLkvL3luIjljr9cIixcblx0ICAgIFwiNjUzMTMwXCI6IFwi5be05qWa5Y6/XCIsXG5cdCAgICBcIjY1MzEzMVwiOiBcIuWhlOS7gOW6k+WwlOW5suWhlOWQieWFi+iHquayu+WOv1wiLFxuXHQgICAgXCI2NTMxMzJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNjUzMjAwXCI6IFwi5ZKM55Sw5Zyw5Yy6XCIsXG5cdCAgICBcIjY1MzIwMVwiOiBcIuWSjOeUsOW4glwiLFxuXHQgICAgXCI2NTMyMjFcIjogXCLlkoznlLDljr9cIixcblx0ICAgIFwiNjUzMjIyXCI6IFwi5aKo546J5Y6/XCIsXG5cdCAgICBcIjY1MzIyM1wiOiBcIuearuWxseWOv1wiLFxuXHQgICAgXCI2NTMyMjRcIjogXCLmtJvmtabljr9cIixcblx0ICAgIFwiNjUzMjI1XCI6IFwi562W5YuS5Y6/XCIsXG5cdCAgICBcIjY1MzIyNlwiOiBcIuS6jueUsOWOv1wiLFxuXHQgICAgXCI2NTMyMjdcIjogXCLmsJHkuLDljr9cIixcblx0ICAgIFwiNjUzMjI4XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1NDAwMFwiOiBcIuS8iueKgeWTiOiQqOWFi+iHquayu+W3nlwiLFxuXHQgICAgXCI2NTQwMDJcIjogXCLkvIrlroHluIJcIixcblx0ICAgIFwiNjU0MDAzXCI6IFwi5aWO5bGv5biCXCIsXG5cdCAgICBcIjY1NDAyMVwiOiBcIuS8iuWugeWOv1wiLFxuXHQgICAgXCI2NTQwMjJcIjogXCLlr5/luIPmn6XlsJTplKHkvK/oh6rmsrvljr9cIixcblx0ICAgIFwiNjU0MDIzXCI6IFwi6ZyN5Z+O5Y6/XCIsXG5cdCAgICBcIjY1NDAyNFwiOiBcIuW3qeeVmeWOv1wiLFxuXHQgICAgXCI2NTQwMjVcIjogXCLmlrDmupDljr9cIixcblx0ICAgIFwiNjU0MDI2XCI6IFwi5pit6IuP5Y6/XCIsXG5cdCAgICBcIjY1NDAyN1wiOiBcIueJueWFi+aWr+WOv1wiLFxuXHQgICAgXCI2NTQwMjhcIjogXCLlsLzli5LlhYvljr9cIixcblx0ICAgIFwiNjU0MDI5XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1NDIwMFwiOiBcIuWhlOWfjuWcsOWMulwiLFxuXHQgICAgXCI2NTQyMDFcIjogXCLloZTln47luIJcIixcblx0ICAgIFwiNjU0MjAyXCI6IFwi5LmM6IuP5biCXCIsXG5cdCAgICBcIjY1NDIyMVwiOiBcIumineaVj+WOv1wiLFxuXHQgICAgXCI2NTQyMjNcIjogXCLmspnmub7ljr9cIixcblx0ICAgIFwiNjU0MjI0XCI6IFwi5omY6YeM5Y6/XCIsXG5cdCAgICBcIjY1NDIyNVwiOiBcIuijleawkeWOv1wiLFxuXHQgICAgXCI2NTQyMjZcIjogXCLlkozluIPlhYvotZvlsJTokpnlj6Toh6rmsrvljr9cIixcblx0ICAgIFwiNjU0MjI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1NDMwMFwiOiBcIumYv+WLkuazsOWcsOWMulwiLFxuXHQgICAgXCI2NTQzMDFcIjogXCLpmL/li5Lms7DluIJcIixcblx0ICAgIFwiNjU0MzIxXCI6IFwi5biD5bCU5rSl5Y6/XCIsXG5cdCAgICBcIjY1NDMyMlwiOiBcIuWvjOiVtOWOv1wiLFxuXHQgICAgXCI2NTQzMjNcIjogXCLnpo/mtbfljr9cIixcblx0ICAgIFwiNjU0MzI0XCI6IFwi5ZOI5be05rKz5Y6/XCIsXG5cdCAgICBcIjY1NDMyNVwiOiBcIumdkuays+WOv1wiLFxuXHQgICAgXCI2NTQzMjZcIjogXCLlkInmnKjkuYPljr9cIixcblx0ICAgIFwiNjU0MzI3XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjY1OTAwMVwiOiBcIuefs+ays+WtkOW4glwiLFxuXHQgICAgXCI2NTkwMDJcIjogXCLpmL/mi4nlsJTluIJcIixcblx0ICAgIFwiNjU5MDAzXCI6IFwi5Zu+5pyo6IiS5YWL5biCXCIsXG5cdCAgICBcIjY1OTAwNFwiOiBcIuS6lOWutua4oOW4glwiLFxuXHQgICAgXCI3MTAwMDBcIjogXCLlj7Dmub5cIixcblx0ICAgIFwiNzEwMTAwXCI6IFwi5Y+w5YyX5biCXCIsXG5cdCAgICBcIjcxMDEwMVwiOiBcIuS4reato+WMulwiLFxuXHQgICAgXCI3MTAxMDJcIjogXCLlpKflkIzljLpcIixcblx0ICAgIFwiNzEwMTAzXCI6IFwi5Lit5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDEwNFwiOiBcIuadvuWxseWMulwiLFxuXHQgICAgXCI3MTAxMDVcIjogXCLlpKflronljLpcIixcblx0ICAgIFwiNzEwMTA2XCI6IFwi5LiH5Y2O5Yy6XCIsXG5cdCAgICBcIjcxMDEwN1wiOiBcIuS/oeS5ieWMulwiLFxuXHQgICAgXCI3MTAxMDhcIjogXCLlo6vmnpfljLpcIixcblx0ICAgIFwiNzEwMTA5XCI6IFwi5YyX5oqV5Yy6XCIsXG5cdCAgICBcIjcxMDExMFwiOiBcIuWGhea5luWMulwiLFxuXHQgICAgXCI3MTAxMTFcIjogXCLljZfmuK/ljLpcIixcblx0ICAgIFwiNzEwMTEyXCI6IFwi5paH5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDExM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI3MTAyMDBcIjogXCLpq5jpm4TluIJcIixcblx0ICAgIFwiNzEwMjAxXCI6IFwi5paw5YW05Yy6XCIsXG5cdCAgICBcIjcxMDIwMlwiOiBcIuWJjemHkeWMulwiLFxuXHQgICAgXCI3MTAyMDNcIjogXCLoiqnpm4XljLpcIixcblx0ICAgIFwiNzEwMjA0XCI6IFwi55uQ5Z+V5Yy6XCIsXG5cdCAgICBcIjcxMDIwNVwiOiBcIum8k+WxseWMulwiLFxuXHQgICAgXCI3MTAyMDZcIjogXCLml5fmtKXljLpcIixcblx0ICAgIFwiNzEwMjA3XCI6IFwi5YmN6ZWH5Yy6XCIsXG5cdCAgICBcIjcxMDIwOFwiOiBcIuS4ieawkeWMulwiLFxuXHQgICAgXCI3MTAyMDlcIjogXCLlt6bokKXljLpcIixcblx0ICAgIFwiNzEwMjEwXCI6IFwi5qWg5qKT5Yy6XCIsXG5cdCAgICBcIjcxMDIxMVwiOiBcIuWwj+a4r+WMulwiLFxuXHQgICAgXCI3MTAyMTJcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNzEwMjQxXCI6IFwi6IuT6ZuF5Yy6XCIsXG5cdCAgICBcIjcxMDI0MlwiOiBcIuS7geatpuWMulwiLFxuXHQgICAgXCI3MTAyNDNcIjogXCLlpKfnpL7ljLpcIixcblx0ICAgIFwiNzEwMjQ0XCI6IFwi5YaI5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDI0NVwiOiBcIui3r+erueWMulwiLFxuXHQgICAgXCI3MTAyNDZcIjogXCLpmL/ojrLljLpcIixcblx0ICAgIFwiNzEwMjQ3XCI6IFwi55Sw5a+u5Yy6XCIsXG5cdCAgICBcIjcxMDI0OFwiOiBcIueHleW3ouWMulwiLFxuXHQgICAgXCI3MTAyNDlcIjogXCLmoaXlpLTljLpcIixcblx0ICAgIFwiNzEwMjUwXCI6IFwi5qKT5a6Y5Yy6XCIsXG5cdCAgICBcIjcxMDI1MVwiOiBcIuW8pemZgOWMulwiLFxuXHQgICAgXCI3MTAyNTJcIjogXCLmsLjlronljLpcIixcblx0ICAgIFwiNzEwMjUzXCI6IFwi5rmW5YaF5Yy6XCIsXG5cdCAgICBcIjcxMDI1NFwiOiBcIuWHpOWxseWMulwiLFxuXHQgICAgXCI3MTAyNTVcIjogXCLlpKflr67ljLpcIixcblx0ICAgIFwiNzEwMjU2XCI6IFwi5p6X5Zut5Yy6XCIsXG5cdCAgICBcIjcxMDI1N1wiOiBcIum4n+advuWMulwiLFxuXHQgICAgXCI3MTAyNThcIjogXCLlpKfmoJHljLpcIixcblx0ICAgIFwiNzEwMjU5XCI6IFwi5peX5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDI2MFwiOiBcIue+jua1k+WMulwiLFxuXHQgICAgXCI3MTAyNjFcIjogXCLlha3pvp/ljLpcIixcblx0ICAgIFwiNzEwMjYyXCI6IFwi5YaF6Zeo5Yy6XCIsXG5cdCAgICBcIjcxMDI2M1wiOiBcIuadieael+WMulwiLFxuXHQgICAgXCI3MTAyNjRcIjogXCLnlLLku5nljLpcIixcblx0ICAgIFwiNzEwMjY1XCI6IFwi5qGD5rqQ5Yy6XCIsXG5cdCAgICBcIjcxMDI2NlwiOiBcIumCo+eOm+Wkj+WMulwiLFxuXHQgICAgXCI3MTAyNjdcIjogXCLojILmnpfljLpcIixcblx0ICAgIFwiNzEwMjY4XCI6IFwi6IyE6JCj5Yy6XCIsXG5cdCAgICBcIjcxMDMwMFwiOiBcIuWPsOWNl+W4glwiLFxuXHQgICAgXCI3MTAzMDFcIjogXCLkuK3opb/ljLpcIixcblx0ICAgIFwiNzEwMzAyXCI6IFwi5Lic5Yy6XCIsXG5cdCAgICBcIjcxMDMwM1wiOiBcIuWNl+WMulwiLFxuXHQgICAgXCI3MTAzMDRcIjogXCLljJfljLpcIixcblx0ICAgIFwiNzEwMzA1XCI6IFwi5a6J5bmz5Yy6XCIsXG5cdCAgICBcIjcxMDMwNlwiOiBcIuWuieWNl+WMulwiLFxuXHQgICAgXCI3MTAzMDdcIjogXCLlhbblroPljLpcIixcblx0ICAgIFwiNzEwMzM5XCI6IFwi5rC45bq35Yy6XCIsXG5cdCAgICBcIjcxMDM0MFwiOiBcIuW9kuS7geWMulwiLFxuXHQgICAgXCI3MTAzNDFcIjogXCLmlrDljJbljLpcIixcblx0ICAgIFwiNzEwMzQyXCI6IFwi5bem6ZWH5Yy6XCIsXG5cdCAgICBcIjcxMDM0M1wiOiBcIueOieS6leWMulwiLFxuXHQgICAgXCI3MTAzNDRcIjogXCLmpaDopb/ljLpcIixcblx0ICAgIFwiNzEwMzQ1XCI6IFwi5Y2X5YyW5Yy6XCIsXG5cdCAgICBcIjcxMDM0NlwiOiBcIuS7geW+t+WMulwiLFxuXHQgICAgXCI3MTAzNDdcIjogXCLlhbPlupnljLpcIixcblx0ICAgIFwiNzEwMzQ4XCI6IFwi6b6Z5bSO5Yy6XCIsXG5cdCAgICBcIjcxMDM0OVwiOiBcIuWumOeUsOWMulwiLFxuXHQgICAgXCI3MTAzNTBcIjogXCLpurvosYbljLpcIixcblx0ICAgIFwiNzEwMzUxXCI6IFwi5L2z6YeM5Yy6XCIsXG5cdCAgICBcIjcxMDM1MlwiOiBcIuilv+a4r+WMulwiLFxuXHQgICAgXCI3MTAzNTNcIjogXCLkuIPogqHljLpcIixcblx0ICAgIFwiNzEwMzU0XCI6IFwi5bCG5Yab5Yy6XCIsXG5cdCAgICBcIjcxMDM1NVwiOiBcIuWtpueUsuWMulwiLFxuXHQgICAgXCI3MTAzNTZcIjogXCLljJfpl6jljLpcIixcblx0ICAgIFwiNzEwMzU3XCI6IFwi5paw6JCl5Yy6XCIsXG5cdCAgICBcIjcxMDM1OFwiOiBcIuWQjuWjgeWMulwiLFxuXHQgICAgXCI3MTAzNTlcIjogXCLnmb3msrPljLpcIixcblx0ICAgIFwiNzEwMzYwXCI6IFwi5Lic5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDM2MVwiOiBcIuWFreeUsuWMulwiLFxuXHQgICAgXCI3MTAzNjJcIjogXCLkuIvokKXljLpcIixcblx0ICAgIFwiNzEwMzYzXCI6IFwi5p+z6JCl5Yy6XCIsXG5cdCAgICBcIjcxMDM2NFwiOiBcIuebkOawtOWMulwiLFxuXHQgICAgXCI3MTAzNjVcIjogXCLlloTljJbljLpcIixcblx0ICAgIFwiNzEwMzY2XCI6IFwi5aSn5YaF5Yy6XCIsXG5cdCAgICBcIjcxMDM2N1wiOiBcIuWxseS4iuWMulwiLFxuXHQgICAgXCI3MTAzNjhcIjogXCLmlrDluILljLpcIixcblx0ICAgIFwiNzEwMzY5XCI6IFwi5a6J5a6a5Yy6XCIsXG5cdCAgICBcIjcxMDQwMFwiOiBcIuWPsOS4reW4glwiLFxuXHQgICAgXCI3MTA0MDFcIjogXCLkuK3ljLpcIixcblx0ICAgIFwiNzEwNDAyXCI6IFwi5Lic5Yy6XCIsXG5cdCAgICBcIjcxMDQwM1wiOiBcIuWNl+WMulwiLFxuXHQgICAgXCI3MTA0MDRcIjogXCLopb/ljLpcIixcblx0ICAgIFwiNzEwNDA1XCI6IFwi5YyX5Yy6XCIsXG5cdCAgICBcIjcxMDQwNlwiOiBcIuWMl+Wxr+WMulwiLFxuXHQgICAgXCI3MTA0MDdcIjogXCLopb/lsa/ljLpcIixcblx0ICAgIFwiNzEwNDA4XCI6IFwi5Y2X5bGv5Yy6XCIsXG5cdCAgICBcIjcxMDQwOVwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI3MTA0MzFcIjogXCLlpKrlubPljLpcIixcblx0ICAgIFwiNzEwNDMyXCI6IFwi5aSn6YeM5Yy6XCIsXG5cdCAgICBcIjcxMDQzM1wiOiBcIumbvuWzsOWMulwiLFxuXHQgICAgXCI3MTA0MzRcIjogXCLkuYzml6XljLpcIixcblx0ICAgIFwiNzEwNDM1XCI6IFwi5Liw5Y6f5Yy6XCIsXG5cdCAgICBcIjcxMDQzNlwiOiBcIuWQjumHjOWMulwiLFxuXHQgICAgXCI3MTA0MzdcIjogXCLnn7PlhojljLpcIixcblx0ICAgIFwiNzEwNDM4XCI6IFwi5Lic5Yq/5Yy6XCIsXG5cdCAgICBcIjcxMDQzOVwiOiBcIuWSjOW5s+WMulwiLFxuXHQgICAgXCI3MTA0NDBcIjogXCLmlrDnpL7ljLpcIixcblx0ICAgIFwiNzEwNDQxXCI6IFwi5r2t5a2Q5Yy6XCIsXG5cdCAgICBcIjcxMDQ0MlwiOiBcIuWkp+mbheWMulwiLFxuXHQgICAgXCI3MTA0NDNcIjogXCLnpZ7lhojljLpcIixcblx0ICAgIFwiNzEwNDQ0XCI6IFwi5aSn6IKa5Yy6XCIsXG5cdCAgICBcIjcxMDQ0NVwiOiBcIuaymem5v+WMulwiLFxuXHQgICAgXCI3MTA0NDZcIjogXCLpvpnkupXljLpcIixcblx0ICAgIFwiNzEwNDQ3XCI6IFwi5qKn5qCW5Yy6XCIsXG5cdCAgICBcIjcxMDQ0OFwiOiBcIua4heawtOWMulwiLFxuXHQgICAgXCI3MTA0NDlcIjogXCLlpKfnlLLljLpcIixcblx0ICAgIFwiNzEwNDUwXCI6IFwi5aSW5Z+U5Yy6XCIsXG5cdCAgICBcIjcxMDQ1MVwiOiBcIuWkp+WuieWMulwiLFxuXHQgICAgXCI3MTA1MDBcIjogXCLph5Hpl6jljr9cIixcblx0ICAgIFwiNzEwNTA3XCI6IFwi6YeR5rKZ6ZWHXCIsXG5cdCAgICBcIjcxMDUwOFwiOiBcIumHkea5lumVh1wiLFxuXHQgICAgXCI3MTA1MDlcIjogXCLph5HlroHkuaFcIixcblx0ICAgIFwiNzEwNTEwXCI6IFwi6YeR5Z+O6ZWHXCIsXG5cdCAgICBcIjcxMDUxMVwiOiBcIueDiOWxv+S5oVwiLFxuXHQgICAgXCI3MTA1MTJcIjogXCLkuYzlnbXkuaFcIixcblx0ICAgIFwiNzEwNjAwXCI6IFwi5Y2X5oqV5Y6/XCIsXG5cdCAgICBcIjcxMDYxNFwiOiBcIuWNl+aKleW4glwiLFxuXHQgICAgXCI3MTA2MTVcIjogXCLkuK3lr67kuaFcIixcblx0ICAgIFwiNzEwNjE2XCI6IFwi6I2J5bGv6ZWHXCIsXG5cdCAgICBcIjcxMDYxN1wiOiBcIuWbveWnk+S5oVwiLFxuXHQgICAgXCI3MTA2MThcIjogXCLln5Tph4zplYdcIixcblx0ICAgIFwiNzEwNjE5XCI6IFwi5LuB54ix5LmhXCIsXG5cdCAgICBcIjcxMDYyMFwiOiBcIuWQjemXtOS5oVwiLFxuXHQgICAgXCI3MTA2MjFcIjogXCLpm4bpm4bplYdcIixcblx0ICAgIFwiNzEwNjIyXCI6IFwi5rC06YeM5LmhXCIsXG5cdCAgICBcIjcxMDYyM1wiOiBcIumxvOaxoOS5oVwiLFxuXHQgICAgXCI3MTA2MjRcIjogXCLkv6HkuYnkuaFcIixcblx0ICAgIFwiNzEwNjI1XCI6IFwi56u55bGx6ZWHXCIsXG5cdCAgICBcIjcxMDYyNlwiOiBcIum5v+iwt+S5oVwiLFxuXHQgICAgXCI3MTA3MDBcIjogXCLln7rpmobluIJcIixcblx0ICAgIFwiNzEwNzAxXCI6IFwi5LuB54ix5Yy6XCIsXG5cdCAgICBcIjcxMDcwMlwiOiBcIuS/oeS5ieWMulwiLFxuXHQgICAgXCI3MTA3MDNcIjogXCLkuK3mraPljLpcIixcblx0ICAgIFwiNzEwNzA0XCI6IFwi5Lit5bGx5Yy6XCIsXG5cdCAgICBcIjcxMDcwNVwiOiBcIuWuieS5kOWMulwiLFxuXHQgICAgXCI3MTA3MDZcIjogXCLmmpbmmpbljLpcIixcblx0ICAgIFwiNzEwNzA3XCI6IFwi5LiD5aC15Yy6XCIsXG5cdCAgICBcIjcxMDcwOFwiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI3MTA4MDBcIjogXCLmlrDnq7nluIJcIixcblx0ICAgIFwiNzEwODAxXCI6IFwi5Lic5Yy6XCIsXG5cdCAgICBcIjcxMDgwMlwiOiBcIuWMl+WMulwiLFxuXHQgICAgXCI3MTA4MDNcIjogXCLpppnlsbHljLpcIixcblx0ICAgIFwiNzEwODA0XCI6IFwi5YW25a6D5Yy6XCIsXG5cdCAgICBcIjcxMDkwMFwiOiBcIuWYieS5ieW4glwiLFxuXHQgICAgXCI3MTA5MDFcIjogXCLkuJzljLpcIixcblx0ICAgIFwiNzEwOTAyXCI6IFwi6KW/5Yy6XCIsXG5cdCAgICBcIjcxMDkwM1wiOiBcIuWFtuWug+WMulwiLFxuXHQgICAgXCI3MTExMDBcIjogXCLmlrDljJfluIJcIixcblx0ICAgIFwiNzExMTMwXCI6IFwi5LiH6YeM5Yy6XCIsXG5cdCAgICBcIjcxMTEzMVwiOiBcIumHkeWxseWMulwiLFxuXHQgICAgXCI3MTExMzJcIjogXCLmnb/moaXljLpcIixcblx0ICAgIFwiNzExMTMzXCI6IFwi5rGQ5q2i5Yy6XCIsXG5cdCAgICBcIjcxMTEzNFwiOiBcIua3seWdkeWMulwiLFxuXHQgICAgXCI3MTExMzVcIjogXCLnn7PnoofljLpcIixcblx0ICAgIFwiNzExMTM2XCI6IFwi55Ge6Iqz5Yy6XCIsXG5cdCAgICBcIjcxMTEzN1wiOiBcIuW5s+a6quWMulwiLFxuXHQgICAgXCI3MTExMzhcIjogXCLlj4zmuqrljLpcIixcblx0ICAgIFwiNzExMTM5XCI6IFwi6LSh5a+u5Yy6XCIsXG5cdCAgICBcIjcxMTE0MFwiOiBcIuaWsOW6l+WMulwiLFxuXHQgICAgXCI3MTExNDFcIjogXCLlnarmnpfljLpcIixcblx0ICAgIFwiNzExMTQyXCI6IFwi5LmM5p2l5Yy6XCIsXG5cdCAgICBcIjcxMTE0M1wiOiBcIuawuOWSjOWMulwiLFxuXHQgICAgXCI3MTExNDRcIjogXCLkuK3lkozljLpcIixcblx0ICAgIFwiNzExMTQ1XCI6IFwi5Zyf5Z+O5Yy6XCIsXG5cdCAgICBcIjcxMTE0NlwiOiBcIuS4ieWzoeWMulwiLFxuXHQgICAgXCI3MTExNDdcIjogXCLmoJHmnpfljLpcIixcblx0ICAgIFwiNzExMTQ4XCI6IFwi6I665q2M5Yy6XCIsXG5cdCAgICBcIjcxMTE0OVwiOiBcIuS4iemHjeWMulwiLFxuXHQgICAgXCI3MTExNTBcIjogXCLmlrDluoTljLpcIixcblx0ICAgIFwiNzExMTUxXCI6IFwi5rOw5bGx5Yy6XCIsXG5cdCAgICBcIjcxMTE1MlwiOiBcIuael+WPo+WMulwiLFxuXHQgICAgXCI3MTExNTNcIjogXCLoiqbmtLLljLpcIixcblx0ICAgIFwiNzExMTU0XCI6IFwi5LqU6IKh5Yy6XCIsXG5cdCAgICBcIjcxMTE1NVwiOiBcIuWFq+mHjOWMulwiLFxuXHQgICAgXCI3MTExNTZcIjogXCLmt6HmsLTljLpcIixcblx0ICAgIFwiNzExMTU3XCI6IFwi5LiJ6Iqd5Yy6XCIsXG5cdCAgICBcIjcxMTE1OFwiOiBcIuefs+mXqOWMulwiLFxuXHQgICAgXCI3MTEyMDBcIjogXCLlrpzlhbDljr9cIixcblx0ICAgIFwiNzExMjE0XCI6IFwi5a6c5YWw5biCXCIsXG5cdCAgICBcIjcxMTIxNVwiOiBcIuWktOWfjumVh1wiLFxuXHQgICAgXCI3MTEyMTZcIjogXCLnpIHmuqrkuaFcIixcblx0ICAgIFwiNzExMjE3XCI6IFwi5aOu5Zu05LmhXCIsXG5cdCAgICBcIjcxMTIxOFwiOiBcIuWRmOWxseS5oVwiLFxuXHQgICAgXCI3MTEyMTlcIjogXCLnvZfkuJzplYdcIixcblx0ICAgIFwiNzExMjIwXCI6IFwi5LiJ5pif5LmhXCIsXG5cdCAgICBcIjcxMTIyMVwiOiBcIuWkp+WQjOS5oVwiLFxuXHQgICAgXCI3MTEyMjJcIjogXCLkupTnu5PkuaFcIixcblx0ICAgIFwiNzExMjIzXCI6IFwi5Yas5bGx5LmhXCIsXG5cdCAgICBcIjcxMTIyNFwiOiBcIuiLj+a+s+mVh1wiLFxuXHQgICAgXCI3MTEyMjVcIjogXCLljZfmvrPkuaFcIixcblx0ICAgIFwiNzExMjI2XCI6IFwi6ZKT6bG85Y+wXCIsXG5cdCAgICBcIjcxMTMwMFwiOiBcIuaWsOerueWOv1wiLFxuXHQgICAgXCI3MTEzMTRcIjogXCLnq7nljJfluIJcIixcblx0ICAgIFwiNzExMzE1XCI6IFwi5rmW5Y+j5LmhXCIsXG5cdCAgICBcIjcxMTMxNlwiOiBcIuaWsOS4sOS5oVwiLFxuXHQgICAgXCI3MTEzMTdcIjogXCLmlrDln5TplYdcIixcblx0ICAgIFwiNzExMzE4XCI6IFwi5YWz6KW/6ZWHXCIsXG5cdCAgICBcIjcxMTMxOVwiOiBcIuiKjuael+S5oVwiLFxuXHQgICAgXCI3MTEzMjBcIjogXCLlrp3lsbHkuaFcIixcblx0ICAgIFwiNzExMzIxXCI6IFwi56u55Lic6ZWHXCIsXG5cdCAgICBcIjcxMTMyMlwiOiBcIuS6lOWzsOS5oVwiLFxuXHQgICAgXCI3MTEzMjNcIjogXCLmqKrlsbHkuaFcIixcblx0ICAgIFwiNzExMzI0XCI6IFwi5bCW55+z5LmhXCIsXG5cdCAgICBcIjcxMTMyNVwiOiBcIuWMl+WflOS5oVwiLFxuXHQgICAgXCI3MTEzMjZcIjogXCLls6jnnInkuaFcIixcblx0ICAgIFwiNzExNDAwXCI6IFwi5qGD5Zut5Y6/XCIsXG5cdCAgICBcIjcxMTQxNFwiOiBcIuS4reWdnOW4glwiLFxuXHQgICAgXCI3MTE0MTVcIjogXCLlubPplYfluIJcIixcblx0ICAgIFwiNzExNDE2XCI6IFwi6b6Z5r2t5LmhXCIsXG5cdCAgICBcIjcxMTQxN1wiOiBcIuadqOaiheW4glwiLFxuXHQgICAgXCI3MTE0MThcIjogXCLmlrDlsYvkuaFcIixcblx0ICAgIFwiNzExNDE5XCI6IFwi6KeC6Z+z5LmhXCIsXG5cdCAgICBcIjcxMTQyMFwiOiBcIuahg+WbreW4glwiLFxuXHQgICAgXCI3MTE0MjFcIjogXCLpvp/lsbHkuaFcIixcblx0ICAgIFwiNzExNDIyXCI6IFwi5YWr5b635biCXCIsXG5cdCAgICBcIjcxMTQyM1wiOiBcIuWkp+a6qumVh1wiLFxuXHQgICAgXCI3MTE0MjRcIjogXCLlpI3lhbTkuaFcIixcblx0ICAgIFwiNzExNDI1XCI6IFwi5aSn5Zut5LmhXCIsXG5cdCAgICBcIjcxMTQyNlwiOiBcIuiKpuerueS5oVwiLFxuXHQgICAgXCI3MTE1MDBcIjogXCLoi5fmoJfljr9cIixcblx0ICAgIFwiNzExNTE5XCI6IFwi56u55Y2X6ZWHXCIsXG5cdCAgICBcIjcxMTUyMFwiOiBcIuWktOS7vemVh1wiLFxuXHQgICAgXCI3MTE1MjFcIjogXCLkuInmub7kuaFcIixcblx0ICAgIFwiNzExNTIyXCI6IFwi5Y2X5bqE5LmhXCIsXG5cdCAgICBcIjcxMTUyM1wiOiBcIueLrua9reS5oVwiLFxuXHQgICAgXCI3MTE1MjRcIjogXCLlkI7pvpnplYdcIixcblx0ICAgIFwiNzExNTI1XCI6IFwi6YCa6ZyE6ZWHXCIsXG5cdCAgICBcIjcxMTUyNlwiOiBcIuiLkemHjOmVh1wiLFxuXHQgICAgXCI3MTE1MjdcIjogXCLoi5fmoJfluIJcIixcblx0ICAgIFwiNzExNTI4XCI6IFwi6YCg5qGl5LmhXCIsXG5cdCAgICBcIjcxMTUyOVwiOiBcIuWktOWxi+S5oVwiLFxuXHQgICAgXCI3MTE1MzBcIjogXCLlhazppobkuaFcIixcblx0ICAgIFwiNzExNTMxXCI6IFwi5aSn5rmW5LmhXCIsXG5cdCAgICBcIjcxMTUzMlwiOiBcIuazsOWuieS5oVwiLFxuXHQgICAgXCI3MTE1MzNcIjogXCLpk5zplKPkuaFcIixcblx0ICAgIFwiNzExNTM0XCI6IFwi5LiJ5LmJ5LmhXCIsXG5cdCAgICBcIjcxMTUzNVwiOiBcIuilv+a5luS5oVwiLFxuXHQgICAgXCI3MTE1MzZcIjogXCLljZPlhbDplYdcIixcblx0ICAgIFwiNzExNzAwXCI6IFwi5b2w5YyW5Y6/XCIsXG5cdCAgICBcIjcxMTcyN1wiOiBcIuW9sOWMluW4glwiLFxuXHQgICAgXCI3MTE3MjhcIjogXCLoiqzlm63kuaFcIixcblx0ICAgIFwiNzExNzI5XCI6IFwi6Iqx5Z2b5LmhXCIsXG5cdCAgICBcIjcxMTczMFwiOiBcIuengOawtOS5oVwiLFxuXHQgICAgXCI3MTE3MzFcIjogXCLpub/muK/plYdcIixcblx0ICAgIFwiNzExNzMyXCI6IFwi56aP5YW05LmhXCIsXG5cdCAgICBcIjcxMTczM1wiOiBcIue6v+ilv+S5oVwiLFxuXHQgICAgXCI3MTE3MzRcIjogXCLlkoznvo7plYdcIixcblx0ICAgIFwiNzExNzM1XCI6IFwi5Ly45riv5LmhXCIsXG5cdCAgICBcIjcxMTczNlwiOiBcIuWRmOael+mVh1wiLFxuXHQgICAgXCI3MTE3MzdcIjogXCLnpL7lpLTkuaFcIixcblx0ICAgIFwiNzExNzM4XCI6IFwi5rC46Z2W5LmhXCIsXG5cdCAgICBcIjcxMTczOVwiOiBcIuWflOW/g+S5oVwiLFxuXHQgICAgXCI3MTE3NDBcIjogXCLmuqrmuZbplYdcIixcblx0ICAgIFwiNzExNzQxXCI6IFwi5aSn5p2R5LmhXCIsXG5cdCAgICBcIjcxMTc0MlwiOiBcIuWflOebkOS5oVwiLFxuXHQgICAgXCI3MTE3NDNcIjogXCLnlLDkuK3plYdcIixcblx0ICAgIFwiNzExNzQ0XCI6IFwi5YyX5paX6ZWHXCIsXG5cdCAgICBcIjcxMTc0NVwiOiBcIueUsOWwvuS5oVwiLFxuXHQgICAgXCI3MTE3NDZcIjogXCLln6TlpLTkuaFcIixcblx0ICAgIFwiNzExNzQ3XCI6IFwi5rqq5bee5LmhXCIsXG5cdCAgICBcIjcxMTc0OFwiOiBcIuerueWhmOS5oVwiLFxuXHQgICAgXCI3MTE3NDlcIjogXCLkuozmnpfplYdcIixcblx0ICAgIFwiNzExNzUwXCI6IFwi5aSn5Z+O5LmhXCIsXG5cdCAgICBcIjcxMTc1MVwiOiBcIuiKs+iLkeS5oVwiLFxuXHQgICAgXCI3MTE3NTJcIjogXCLkuozmsLTkuaFcIixcblx0ICAgIFwiNzExOTAwXCI6IFwi5ZiJ5LmJ5Y6/XCIsXG5cdCAgICBcIjcxMTkxOVwiOiBcIueVqui3r+S5oVwiLFxuXHQgICAgXCI3MTE5MjBcIjogXCLmooXlsbHkuaFcIixcblx0ICAgIFwiNzExOTIxXCI6IFwi56u55bSO5LmhXCIsXG5cdCAgICBcIjcxMTkyMlwiOiBcIumYv+mHjOWxseS5oVwiLFxuXHQgICAgXCI3MTE5MjNcIjogXCLkuK3ln5TkuaFcIixcblx0ICAgIFwiNzExOTI0XCI6IFwi5aSn5Z+U5LmhXCIsXG5cdCAgICBcIjcxMTkyNVwiOiBcIuawtOS4iuS5oVwiLFxuXHQgICAgXCI3MTE5MjZcIjogXCLpub/ojYnkuaFcIixcblx0ICAgIFwiNzExOTI3XCI6IFwi5aSq5L+d5biCXCIsXG5cdCAgICBcIjcxMTkyOFwiOiBcIuactOWtkOW4glwiLFxuXHQgICAgXCI3MTE5MjlcIjogXCLkuJznn7PkuaFcIixcblx0ICAgIFwiNzExOTMwXCI6IFwi5YWt6ISa5LmhXCIsXG5cdCAgICBcIjcxMTkzMVwiOiBcIuaWsOa4r+S5oVwiLFxuXHQgICAgXCI3MTE5MzJcIjogXCLmsJHpm4TkuaFcIixcblx0ICAgIFwiNzExOTMzXCI6IFwi5aSn5p6X6ZWHXCIsXG5cdCAgICBcIjcxMTkzNFwiOiBcIua6quWPo+S5oVwiLFxuXHQgICAgXCI3MTE5MzVcIjogXCLkuYnnq7nkuaFcIixcblx0ICAgIFwiNzExOTM2XCI6IFwi5biD6KKL6ZWHXCIsXG5cdCAgICBcIjcxMjEwMFwiOiBcIuS6keael+WOv1wiLFxuXHQgICAgXCI3MTIxMjFcIjogXCLmlpfljZfplYdcIixcblx0ICAgIFwiNzEyMTIyXCI6IFwi5aSn5Z+k5LmhXCIsXG5cdCAgICBcIjcxMjEyM1wiOiBcIuiZjuWwvumVh1wiLFxuXHQgICAgXCI3MTIxMjRcIjogXCLlnJ/lupPplYdcIixcblx0ICAgIFwiNzEyMTI1XCI6IFwi6KSS5b+g5LmhXCIsXG5cdCAgICBcIjcxMjEyNlwiOiBcIuS4nOWKv+S5oVwiLFxuXHQgICAgXCI3MTIxMjdcIjogXCLlj7Dopb/kuaFcIixcblx0ICAgIFwiNzEyMTI4XCI6IFwi5LuR6IOM5LmhXCIsXG5cdCAgICBcIjcxMjEyOVwiOiBcIum6puWvruS5oVwiLFxuXHQgICAgXCI3MTIxMzBcIjogXCLmlpflha3luIJcIixcblx0ICAgIFwiNzEyMTMxXCI6IFwi5p6X5YaF5LmhXCIsXG5cdCAgICBcIjcxMjEzMlwiOiBcIuWPpOWdkeS5oVwiLFxuXHQgICAgXCI3MTIxMzNcIjogXCLojr/moZDkuaFcIixcblx0ICAgIFwiNzEyMTM0XCI6IFwi6KW/6J666ZWHXCIsXG5cdCAgICBcIjcxMjEzNVwiOiBcIuS6jOS7keS5oVwiLFxuXHQgICAgXCI3MTIxMzZcIjogXCLljJfmuK/plYdcIixcblx0ICAgIFwiNzEyMTM3XCI6IFwi5rC05p6X5LmhXCIsXG5cdCAgICBcIjcxMjEzOFwiOiBcIuWPo+a5luS5oVwiLFxuXHQgICAgXCI3MTIxMzlcIjogXCLlm5vmuZbkuaFcIixcblx0ICAgIFwiNzEyMTQwXCI6IFwi5YWD6ZW/5LmhXCIsXG5cdCAgICBcIjcxMjQwMFwiOiBcIuWxj+S4nOWOv1wiLFxuXHQgICAgXCI3MTI0MzRcIjogXCLlsY/kuJzluIJcIixcblx0ICAgIFwiNzEyNDM1XCI6IFwi5LiJ5Zyw6Zeo5LmhXCIsXG5cdCAgICBcIjcxMjQzNlwiOiBcIumbvuWPsOS5oVwiLFxuXHQgICAgXCI3MTI0MzdcIjogXCLnjpvlrrbkuaFcIixcblx0ICAgIFwiNzEyNDM4XCI6IFwi5Lmd5aaC5LmhXCIsXG5cdCAgICBcIjcxMjQzOVwiOiBcIumHjOa4r+S5oVwiLFxuXHQgICAgXCI3MTI0NDBcIjogXCLpq5jmoJHkuaFcIixcblx0ICAgIFwiNzEyNDQxXCI6IFwi55uQ5Z+U5LmhXCIsXG5cdCAgICBcIjcxMjQ0MlwiOiBcIumVv+ayu+S5oVwiLFxuXHQgICAgXCI3MTI0NDNcIjogXCLpup/mtJvkuaFcIixcblx0ICAgIFwiNzEyNDQ0XCI6IFwi56u555Sw5LmhXCIsXG5cdCAgICBcIjcxMjQ0NVwiOiBcIuWGheWflOS5oVwiLFxuXHQgICAgXCI3MTI0NDZcIjogXCLkuIfkuLnkuaFcIixcblx0ICAgIFwiNzEyNDQ3XCI6IFwi5r2u5bee6ZWHXCIsXG5cdCAgICBcIjcxMjQ0OFwiOiBcIuazsOatpuS5oVwiLFxuXHQgICAgXCI3MTI0NDlcIjogXCLmnaXkuYnkuaFcIixcblx0ICAgIFwiNzEyNDUwXCI6IFwi5LiH5bOm5LmhXCIsXG5cdCAgICBcIjcxMjQ1MVwiOiBcIuW0gemhtuS5oVwiLFxuXHQgICAgXCI3MTI0NTJcIjogXCLmlrDln6TkuaFcIixcblx0ICAgIFwiNzEyNDUzXCI6IFwi5Y2X5bee5LmhXCIsXG5cdCAgICBcIjcxMjQ1NFwiOiBcIuael+i+ueS5oVwiLFxuXHQgICAgXCI3MTI0NTVcIjogXCLkuJzmuK/plYdcIixcblx0ICAgIFwiNzEyNDU2XCI6IFwi55CJ55CD5LmhXCIsXG5cdCAgICBcIjcxMjQ1N1wiOiBcIuS9s+WGrOS5oVwiLFxuXHQgICAgXCI3MTI0NThcIjogXCLmlrDlm63kuaFcIixcblx0ICAgIFwiNzEyNDU5XCI6IFwi5p6L5a+u5LmhXCIsXG5cdCAgICBcIjcxMjQ2MFwiOiBcIuaei+WxseS5oVwiLFxuXHQgICAgXCI3MTI0NjFcIjogXCLmmKXml6XkuaFcIixcblx0ICAgIFwiNzEyNDYyXCI6IFwi54uu5a2Q5LmhXCIsXG5cdCAgICBcIjcxMjQ2M1wiOiBcIui9puWfjuS5oVwiLFxuXHQgICAgXCI3MTI0NjRcIjogXCLniaHkuLnkuaFcIixcblx0ICAgIFwiNzEyNDY1XCI6IFwi5oGS5pil6ZWHXCIsXG5cdCAgICBcIjcxMjQ2NlwiOiBcIua7oeW3nuS5oVwiLFxuXHQgICAgXCI3MTI1MDBcIjogXCLlj7DkuJzljr9cIixcblx0ICAgIFwiNzEyNTE3XCI6IFwi5Y+w5Lic5biCXCIsXG5cdCAgICBcIjcxMjUxOFwiOiBcIue7v+Wym+S5oVwiLFxuXHQgICAgXCI3MTI1MTlcIjogXCLlhbDlsb/kuaFcIixcblx0ICAgIFwiNzEyNTIwXCI6IFwi5bu25bmz5LmhXCIsXG5cdCAgICBcIjcxMjUyMVwiOiBcIuWNkeWNl+S5oVwiLFxuXHQgICAgXCI3MTI1MjJcIjogXCLpub/ph47kuaFcIixcblx0ICAgIFwiNzEyNTIzXCI6IFwi5YWz5bGx6ZWHXCIsXG5cdCAgICBcIjcxMjUyNFwiOiBcIua1t+err+S5oVwiLFxuXHQgICAgXCI3MTI1MjVcIjogXCLmsaDkuIrkuaFcIixcblx0ICAgIFwiNzEyNTI2XCI6IFwi5Lic5rKz5LmhXCIsXG5cdCAgICBcIjcxMjUyN1wiOiBcIuaIkOWKn+mVh1wiLFxuXHQgICAgXCI3MTI1MjhcIjogXCLplb/mu6jkuaFcIixcblx0ICAgIFwiNzEyNTI5XCI6IFwi6YeR5bOw5LmhXCIsXG5cdCAgICBcIjcxMjUzMFwiOiBcIuWkp+atpuS5oVwiLFxuXHQgICAgXCI3MTI1MzFcIjogXCLovr7ku4HkuaFcIixcblx0ICAgIFwiNzEyNTMyXCI6IFwi5aSq6bq76YeM5LmhXCIsXG5cdCAgICBcIjcxMjYwMFwiOiBcIuiKseiOsuWOv1wiLFxuXHQgICAgXCI3MTI2MTVcIjogXCLoirHojrLluIJcIixcblx0ICAgIFwiNzEyNjE2XCI6IFwi5paw5Z+O5LmhXCIsXG5cdCAgICBcIjcxMjYxN1wiOiBcIuWkqumygemYgVwiLFxuXHQgICAgXCI3MTI2MThcIjogXCLnp4DmnpfkuaFcIixcblx0ICAgIFwiNzEyNjE5XCI6IFwi5ZCJ5a6J5LmhXCIsXG5cdCAgICBcIjcxMjYyMFwiOiBcIuWvv+S4sOS5oVwiLFxuXHQgICAgXCI3MTI2MjFcIjogXCLlh6TmnpfplYdcIixcblx0ICAgIFwiNzEyNjIyXCI6IFwi5YWJ5aSN5LmhXCIsXG5cdCAgICBcIjcxMjYyM1wiOiBcIuS4sOa7qOS5oVwiLFxuXHQgICAgXCI3MTI2MjRcIjogXCLnkZ7nqZfkuaFcIixcblx0ICAgIFwiNzEyNjI1XCI6IFwi5LiH6I2j5LmhXCIsXG5cdCAgICBcIjcxMjYyNlwiOiBcIueOiemHjOmVh1wiLFxuXHQgICAgXCI3MTI2MjdcIjogXCLljZPmuqrkuaFcIixcblx0ICAgIFwiNzEyNjI4XCI6IFwi5a+M6YeM5LmhXCIsXG5cdCAgICBcIjcxMjcwMFwiOiBcIua+jua5luWOv1wiLFxuXHQgICAgXCI3MTI3MDdcIjogXCLpqazlhazluIJcIixcblx0ICAgIFwiNzEyNzA4XCI6IFwi6KW/5bG/5LmhXCIsXG5cdCAgICBcIjcxMjcwOVwiOiBcIuacm+WuieS5oVwiLFxuXHQgICAgXCI3MTI3MTBcIjogXCLkuIPnvo7kuaFcIixcblx0ICAgIFwiNzEyNzExXCI6IFwi55m95rKZ5LmhXCIsXG5cdCAgICBcIjcxMjcxMlwiOiBcIua5luilv+S5oVwiLFxuXHQgICAgXCI3MTI4MDBcIjogXCLov57msZ/ljr9cIixcblx0ICAgIFwiNzEyODA1XCI6IFwi5Y2X56u/5LmhXCIsXG5cdCAgICBcIjcxMjgwNlwiOiBcIuWMl+erv+S5oVwiLFxuXHQgICAgXCI3MTI4MDdcIjogXCLojpLlhYnkuaFcIixcblx0ICAgIFwiNzEyODA4XCI6IFwi5Lic5byV5LmhXCIsXG5cdCAgICBcIjgxMDAwMFwiOiBcIummmea4r+eJueWIq+ihjOaUv+WMulwiLFxuXHQgICAgXCI4MTAxMDBcIjogXCLpppnmuK/lsptcIixcblx0ICAgIFwiODEwMTAxXCI6IFwi5Lit6KW/5Yy6XCIsXG5cdCAgICBcIjgxMDEwMlwiOiBcIua5vuS7lFwiLFxuXHQgICAgXCI4MTAxMDNcIjogXCLkuJzljLpcIixcblx0ICAgIFwiODEwMTA0XCI6IFwi5Y2X5Yy6XCIsXG5cdCAgICBcIjgxMDIwMFwiOiBcIuS5nem+mVwiLFxuXHQgICAgXCI4MTAyMDFcIjogXCLkuZ3pvpnln47ljLpcIixcblx0ICAgIFwiODEwMjAyXCI6IFwi5rK55bCW5pe65Yy6XCIsXG5cdCAgICBcIjgxMDIwM1wiOiBcIua3seawtOWfl+WMulwiLFxuXHQgICAgXCI4MTAyMDRcIjogXCLpu4TlpKfku5nljLpcIixcblx0ICAgIFwiODEwMjA1XCI6IFwi6KeC5aGY5Yy6XCIsXG5cdCAgICBcIjgxMDMwMFwiOiBcIuaWsOeVjFwiLFxuXHQgICAgXCI4MTAzMDFcIjogXCLljJfljLpcIixcblx0ICAgIFwiODEwMzAyXCI6IFwi5aSn5Z+U5Yy6XCIsXG5cdCAgICBcIjgxMDMwM1wiOiBcIuaymeeUsOWMulwiLFxuXHQgICAgXCI4MTAzMDRcIjogXCLopb/otKHljLpcIixcblx0ICAgIFwiODEwMzA1XCI6IFwi5YWD5pyX5Yy6XCIsXG5cdCAgICBcIjgxMDMwNlwiOiBcIuWxr+mXqOWMulwiLFxuXHQgICAgXCI4MTAzMDdcIjogXCLojYPmub7ljLpcIixcblx0ICAgIFwiODEwMzA4XCI6IFwi6JG16Z2S5Yy6XCIsXG5cdCAgICBcIjgxMDMwOVwiOiBcIuemu+Wym+WMulwiLFxuXHQgICAgXCI4MjAwMDBcIjogXCLmvrPpl6jnibnliKvooYzmlL/ljLpcIixcblx0ICAgIFwiODIwMTAwXCI6IFwi5r6z6Zeo5Y2K5bKbXCIsXG5cdCAgICBcIjgyMDIwMFwiOiBcIuemu+Wym1wiLFxuXHQgICAgXCI5OTAwMDBcIjogXCLmtbflpJZcIixcblx0ICAgIFwiOTkwMTAwXCI6IFwi5rW35aSWXCJcblx0fVxuXG5cdC8vIGlkIHBpZC9wYXJlbnRJZCBuYW1lIGNoaWxkcmVuXG5cdGZ1bmN0aW9uIHRyZWUobGlzdCkge1xuXHQgICAgdmFyIG1hcHBlZCA9IHt9XG5cdCAgICBmb3IgKHZhciBpID0gMCwgaXRlbTsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICBpdGVtID0gbGlzdFtpXVxuXHQgICAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5pZCkgY29udGludWVcblx0ICAgICAgICBtYXBwZWRbaXRlbS5pZF0gPSBpdGVtXG5cdCAgICB9XG5cblx0ICAgIHZhciByZXN1bHQgPSBbXVxuXHQgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGxpc3QubGVuZ3RoOyBpaSsrKSB7XG5cdCAgICAgICAgaXRlbSA9IGxpc3RbaWldXG5cblx0ICAgICAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlXG5cdCAgICAgICAgICAgIC8qIGpzaGludCAtVzA0MSAqL1xuXHQgICAgICAgIGlmIChpdGVtLnBpZCA9PSB1bmRlZmluZWQgJiYgaXRlbS5wYXJlbnRJZCA9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbSlcblx0ICAgICAgICAgICAgY29udGludWVcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHBhcmVudCA9IG1hcHBlZFtpdGVtLnBpZF0gfHwgbWFwcGVkW2l0ZW0ucGFyZW50SWRdXG5cdCAgICAgICAgaWYgKCFwYXJlbnQpIGNvbnRpbnVlXG5cdCAgICAgICAgaWYgKCFwYXJlbnQuY2hpbGRyZW4pIHBhcmVudC5jaGlsZHJlbiA9IFtdXG5cdCAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goaXRlbSlcblx0ICAgIH1cblx0ICAgIHJldHVybiByZXN1bHRcblx0fVxuXG5cdHZhciBESUNUX0ZJWEVEID0gZnVuY3Rpb24oKSB7XG5cdCAgICB2YXIgZml4ZWQgPSBbXVxuXHQgICAgZm9yICh2YXIgaWQgaW4gRElDVCkge1xuXHQgICAgICAgIHZhciBwaWQgPSBpZC5zbGljZSgyLCA2KSA9PT0gJzAwMDAnID8gdW5kZWZpbmVkIDpcblx0ICAgICAgICAgICAgaWQuc2xpY2UoNCwgNikgPT0gJzAwJyA/IChpZC5zbGljZSgwLCAyKSArICcwMDAwJykgOlxuXHQgICAgICAgICAgICBpZC5zbGljZSgwLCA0KSArICcwMCdcblx0ICAgICAgICBmaXhlZC5wdXNoKHtcblx0ICAgICAgICAgICAgaWQ6IGlkLFxuXHQgICAgICAgICAgICBwaWQ6IHBpZCxcblx0ICAgICAgICAgICAgbmFtZTogRElDVFtpZF1cblx0ICAgICAgICB9KVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRyZWUoZml4ZWQpXG5cdH0oKVxuXG5cdG1vZHVsZS5leHBvcnRzID0gRElDVF9GSVhFRFxuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0ICAgICMjIE1pc2NlbGxhbmVvdXNcblx0Ki9cblx0dmFyIERJQ1QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KVxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0XHQvLyBEaWNlXG5cdFx0ZDQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCA0KVxuXHRcdH0sXG5cdFx0ZDY6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCA2KVxuXHRcdH0sXG5cdFx0ZDg6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCA4KVxuXHRcdH0sXG5cdFx0ZDEyOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLm5hdHVyYWwoMSwgMTIpXG5cdFx0fSxcblx0XHRkMjA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCAyMClcblx0XHR9LFxuXHRcdGQxMDA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubmF0dXJhbCgxLCAxMDApXG5cdFx0fSxcblx0XHQvKlxuXHRcdCAgICDpmo/mnLrnlJ/miJDkuIDkuKogR1VJROOAglxuXG5cdFx0ICAgIGh0dHA6Ly93d3cuYnJvb2ZhLmNvbS8yMDA4LzA5L2phdmFzY3JpcHQtdXVpZC1mdW5jdGlvbi9cblx0XHQgICAgW1VVSUQg6KeE6IyDXShodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MTIyLnR4dClcblx0XHQgICAgICAgIFVVSURzIChVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllcilcblx0XHQgICAgICAgIEdVSURzIChHbG9iYWxseSBVbmlxdWUgSURlbnRpZmllcilcblx0XHQgICAgICAgIFRoZSBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGUgVVVJRCBzdHJpbmcgcmVwcmVzZW50YXRpb24gaXMgcHJvdmlkZWQgYnkgdGhlIGZvbGxvd2luZyBBQk5GIFs3XTpcblx0XHQgICAgICAgICAgICBVVUlEICAgICAgICAgICAgICAgICAgID0gdGltZS1sb3cgXCItXCIgdGltZS1taWQgXCItXCJcblx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUtaGlnaC1hbmQtdmVyc2lvbiBcIi1cIlxuXHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2stc2VxLWFuZC1yZXNlcnZlZFxuXHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2stc2VxLWxvdyBcIi1cIiBub2RlXG5cdFx0ICAgICAgICAgICAgdGltZS1sb3cgICAgICAgICAgICAgICA9IDRoZXhPY3RldFxuXHRcdCAgICAgICAgICAgIHRpbWUtbWlkICAgICAgICAgICAgICAgPSAyaGV4T2N0ZXRcblx0XHQgICAgICAgICAgICB0aW1lLWhpZ2gtYW5kLXZlcnNpb24gID0gMmhleE9jdGV0XG5cdFx0ICAgICAgICAgICAgY2xvY2stc2VxLWFuZC1yZXNlcnZlZCA9IGhleE9jdGV0XG5cdFx0ICAgICAgICAgICAgY2xvY2stc2VxLWxvdyAgICAgICAgICA9IGhleE9jdGV0XG5cdFx0ICAgICAgICAgICAgbm9kZSAgICAgICAgICAgICAgICAgICA9IDZoZXhPY3RldFxuXHRcdCAgICAgICAgICAgIGhleE9jdGV0ICAgICAgICAgICAgICAgPSBoZXhEaWdpdCBoZXhEaWdpdFxuXHRcdCAgICAgICAgICAgIGhleERpZ2l0ID1cblx0XHQgICAgICAgICAgICAgICAgXCIwXCIgLyBcIjFcIiAvIFwiMlwiIC8gXCIzXCIgLyBcIjRcIiAvIFwiNVwiIC8gXCI2XCIgLyBcIjdcIiAvIFwiOFwiIC8gXCI5XCIgL1xuXHRcdCAgICAgICAgICAgICAgICBcImFcIiAvIFwiYlwiIC8gXCJjXCIgLyBcImRcIiAvIFwiZVwiIC8gXCJmXCIgL1xuXHRcdCAgICAgICAgICAgICAgICBcIkFcIiAvIFwiQlwiIC8gXCJDXCIgLyBcIkRcIiAvIFwiRVwiIC8gXCJGXCJcblx0XHQgICAgXG5cdFx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS92aWN0b3JxdWlubi9jaGFuY2Vqcy9ibG9iL2RldmVsb3AvY2hhbmNlLmpzI0wxMzQ5XG5cdFx0Ki9cblx0XHRndWlkOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBwb29sID0gXCJhYmNkZWZBQkNERUYxMjM0NTY3ODkwXCIsXG5cdFx0XHRcdGd1aWQgPSB0aGlzLnN0cmluZyhwb29sLCA4KSArICctJyArXG5cdFx0XHRcdHRoaXMuc3RyaW5nKHBvb2wsIDQpICsgJy0nICtcblx0XHRcdFx0dGhpcy5zdHJpbmcocG9vbCwgNCkgKyAnLScgK1xuXHRcdFx0XHR0aGlzLnN0cmluZyhwb29sLCA0KSArICctJyArXG5cdFx0XHRcdHRoaXMuc3RyaW5nKHBvb2wsIDEyKTtcblx0XHRcdHJldHVybiBndWlkXG5cdFx0fSxcblx0XHR1dWlkOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmd1aWQoKVxuXHRcdH0sXG5cdFx0Lypcblx0XHQgICAg6ZqP5py655Sf5oiQ5LiA5LiqIDE4IOS9jei6q+S7veivgeOAglxuXG5cdFx0ICAgIFvouqvku73or4FdKGh0dHA6Ly9iYWlrZS5iYWlkdS5jb20vdmlldy8xNjk3Lmh0bSM0KVxuXHRcdCAgICAgICAg5Zyw5Z2A56CBIDYgKyDlh7rnlJ/ml6XmnJ/noIEgOCArIOmhuuW6j+eggSAzICsg5qCh6aqM56CBIDFcblx0XHQgICAgW+OAiuS4reWNjuS6uuawkeWFseWSjOWbveihjOaUv+WMuuWIkuS7o+eggeOAi+WbveWutuagh+WHhihHQi9UMjI2MCldKGh0dHA6Ly96aGlkYW8uYmFpZHUuY29tL3F1ZXN0aW9uLzE5NTQ1NjEuaHRtbClcblx0XHQqL1xuXHRcdGlkOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpZCxcblx0XHRcdFx0c3VtID0gMCxcblx0XHRcdFx0cmFuayA9IFtcblx0XHRcdFx0XHRcIjdcIiwgXCI5XCIsIFwiMTBcIiwgXCI1XCIsIFwiOFwiLCBcIjRcIiwgXCIyXCIsIFwiMVwiLCBcIjZcIiwgXCIzXCIsIFwiN1wiLCBcIjlcIiwgXCIxMFwiLCBcIjVcIiwgXCI4XCIsIFwiNFwiLCBcIjJcIlxuXHRcdFx0XHRdLFxuXHRcdFx0XHRsYXN0ID0gW1xuXHRcdFx0XHRcdFwiMVwiLCBcIjBcIiwgXCJYXCIsIFwiOVwiLCBcIjhcIiwgXCI3XCIsIFwiNlwiLCBcIjVcIiwgXCI0XCIsIFwiM1wiLCBcIjJcIlxuXHRcdFx0XHRdXG5cblx0XHRcdGlkID0gdGhpcy5waWNrKERJQ1QpLmlkICtcblx0XHRcdFx0dGhpcy5kYXRlKCd5eXl5TU1kZCcpICtcblx0XHRcdFx0dGhpcy5zdHJpbmcoJ251bWJlcicsIDMpXG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0c3VtICs9IGlkW2ldICogcmFua1tpXTtcblx0XHRcdH1cblx0XHRcdGlkICs9IGxhc3Rbc3VtICUgMTFdO1xuXG5cdFx0XHRyZXR1cm4gaWRcblx0XHR9LFxuXG5cdFx0Lypcblx0XHQgICAg55Sf5oiQ5LiA5Liq5YWo5bGA55qE6Ieq5aKe5pW05pWw44CCXG5cdFx0ICAgIOexu+S8vOiHquWinuS4u+mUru+8iGF1dG8gaW5jcmVtZW50IHByaW1hcnkga2V577yJ44CCXG5cdFx0Ki9cblx0XHRpbmNyZW1lbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGtleSA9IDBcblx0XHRcdHJldHVybiBmdW5jdGlvbihzdGVwKSB7XG5cdFx0XHRcdHJldHVybiBrZXkgKz0gKCtzdGVwIHx8IDEpIC8vIHN0ZXA/XG5cdFx0XHR9XG5cdFx0fSgpLFxuXHRcdGluYzogZnVuY3Rpb24oc3RlcCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaW5jcmVtZW50KHN0ZXApXG5cdFx0fVxuXHR9XG5cbi8qKiovIH0pLFxuLyogMjAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgUGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSlcblx0dmFyIEhhbmRsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKVxuXHRtb2R1bGUuZXhwb3J0cyA9IHtcblx0XHRQYXJzZXI6IFBhcnNlcixcblx0XHRIYW5kbGVyOiBIYW5kbGVyXG5cdH1cblxuLyoqKi8gfSksXG4vKiAyMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9udXlzb2Z0L3JlZ2V4cFxuXHQvLyBmb3JrZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vRm9yYmVzTGluZGVzYXkvcmVnZXhwXG5cblx0ZnVuY3Rpb24gcGFyc2Uobikge1xuXHQgICAgaWYgKFwic3RyaW5nXCIgIT0gdHlwZW9mIG4pIHtcblx0ICAgICAgICB2YXIgbCA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgcmVnZXhwIHRvIHBhcnNlIG11c3QgYmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuXCIpO1xuXHQgICAgICAgIHRocm93IGw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gaW5kZXggPSAxLCBjZ3MgPSB7fSwgcGFyc2VyLnBhcnNlKG4pO1xuXHR9XG5cblx0ZnVuY3Rpb24gVG9rZW4obikge1xuXHQgICAgdGhpcy50eXBlID0gbiwgdGhpcy5vZmZzZXQgPSBUb2tlbi5vZmZzZXQoKSwgdGhpcy50ZXh0ID0gVG9rZW4udGV4dCgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gQWx0ZXJuYXRlKG4sIGwpIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJhbHRlcm5hdGVcIiksIHRoaXMubGVmdCA9IG4sIHRoaXMucmlnaHQgPSBsO1xuXHR9XG5cblx0ZnVuY3Rpb24gTWF0Y2gobikge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcIm1hdGNoXCIpLCB0aGlzLmJvZHkgPSBuLmZpbHRlcihCb29sZWFuKTtcblx0fVxuXG5cdGZ1bmN0aW9uIEdyb3VwKG4sIGwpIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgbiksIHRoaXMuYm9keSA9IGw7XG5cdH1cblxuXHRmdW5jdGlvbiBDYXB0dXJlR3JvdXAobikge1xuXHQgICAgR3JvdXAuY2FsbCh0aGlzLCBcImNhcHR1cmUtZ3JvdXBcIiksIHRoaXMuaW5kZXggPSBjZ3NbdGhpcy5vZmZzZXRdIHx8IChjZ3NbdGhpcy5vZmZzZXRdID0gaW5kZXgrKyksIFxuXHQgICAgdGhpcy5ib2R5ID0gbjtcblx0fVxuXG5cdGZ1bmN0aW9uIFF1YW50aWZpZWQobiwgbCkge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcInF1YW50aWZpZWRcIiksIHRoaXMuYm9keSA9IG4sIHRoaXMucXVhbnRpZmllciA9IGw7XG5cdH1cblxuXHRmdW5jdGlvbiBRdWFudGlmaWVyKG4sIGwpIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJxdWFudGlmaWVyXCIpLCB0aGlzLm1pbiA9IG4sIHRoaXMubWF4ID0gbCwgdGhpcy5ncmVlZHkgPSAhMDtcblx0fVxuXG5cdGZ1bmN0aW9uIENoYXJTZXQobiwgbCkge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcImNoYXJzZXRcIiksIHRoaXMuaW52ZXJ0ID0gbiwgdGhpcy5ib2R5ID0gbDtcblx0fVxuXG5cdGZ1bmN0aW9uIENoYXJhY3RlclJhbmdlKG4sIGwpIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJyYW5nZVwiKSwgdGhpcy5zdGFydCA9IG4sIHRoaXMuZW5kID0gbDtcblx0fVxuXG5cdGZ1bmN0aW9uIExpdGVyYWwobikge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcImxpdGVyYWxcIiksIHRoaXMuYm9keSA9IG4sIHRoaXMuZXNjYXBlZCA9IHRoaXMuYm9keSAhPSB0aGlzLnRleHQ7XG5cdH1cblxuXHRmdW5jdGlvbiBVbmljb2RlKG4pIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJ1bmljb2RlXCIpLCB0aGlzLmNvZGUgPSBuLnRvVXBwZXJDYXNlKCk7XG5cdH1cblxuXHRmdW5jdGlvbiBIZXgobikge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcImhleFwiKSwgdGhpcy5jb2RlID0gbi50b1VwcGVyQ2FzZSgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gT2N0YWwobikge1xuXHQgICAgVG9rZW4uY2FsbCh0aGlzLCBcIm9jdGFsXCIpLCB0aGlzLmNvZGUgPSBuLnRvVXBwZXJDYXNlKCk7XG5cdH1cblxuXHRmdW5jdGlvbiBCYWNrUmVmZXJlbmNlKG4pIHtcblx0ICAgIFRva2VuLmNhbGwodGhpcywgXCJiYWNrLXJlZmVyZW5jZVwiKSwgdGhpcy5jb2RlID0gbi50b1VwcGVyQ2FzZSgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gQ29udHJvbENoYXJhY3RlcihuKSB7XG5cdCAgICBUb2tlbi5jYWxsKHRoaXMsIFwiY29udHJvbC1jaGFyYWN0ZXJcIiksIHRoaXMuY29kZSA9IG4udG9VcHBlckNhc2UoKTtcblx0fVxuXG5cdHZhciBwYXJzZXIgPSBmdW5jdGlvbigpIHtcblx0ICAgIGZ1bmN0aW9uIG4obiwgbCkge1xuXHQgICAgICAgIGZ1bmN0aW9uIHUoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB1LnByb3RvdHlwZSA9IGwucHJvdG90eXBlLCBuLnByb3RvdHlwZSA9IG5ldyB1KCk7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBsKG4sIGwsIHUsIHQsIHIpIHtcblx0ICAgICAgICBmdW5jdGlvbiBlKG4sIGwpIHtcblx0ICAgICAgICAgICAgZnVuY3Rpb24gdShuKSB7XG5cdCAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKG4pIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG4ucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXHgwOC9nLCBcIlxcXFxiXCIpLnJlcGxhY2UoL1xcdC9nLCBcIlxcXFx0XCIpLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpLnJlcGxhY2UoL1xcZi9nLCBcIlxcXFxmXCIpLnJlcGxhY2UoL1xcci9nLCBcIlxcXFxyXCIpLnJlcGxhY2UoL1tcXHgwMC1cXHgwN1xceDBCXFx4MEVcXHgwRl0vZywgZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlxcXFx4MFwiICsgbChuKTtcblx0ICAgICAgICAgICAgICAgIH0pLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDgwLVxceEZGXS9nLCBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXFxcXHhcIiArIGwobik7XG5cdCAgICAgICAgICAgICAgICB9KS5yZXBsYWNlKC9bXFx1MDE4MC1cXHUwRkZGXS9nLCBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXFxcXHUwXCIgKyBsKG4pO1xuXHQgICAgICAgICAgICAgICAgfSkucmVwbGFjZSgvW1xcdTEwODAtXFx1RkZGRl0vZywgZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlxcXFx1XCIgKyBsKG4pO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIHQsIHI7XG5cdCAgICAgICAgICAgIHN3aXRjaCAobi5sZW5ndGgpIHtcblx0ICAgICAgICAgICAgICBjYXNlIDA6XG5cdCAgICAgICAgICAgICAgICB0ID0gXCJlbmQgb2YgaW5wdXRcIjtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICAgICAgY2FzZSAxOlxuXHQgICAgICAgICAgICAgICAgdCA9IG5bMF07XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICB0ID0gbi5zbGljZSgwLCAtMSkuam9pbihcIiwgXCIpICsgXCIgb3IgXCIgKyBuW24ubGVuZ3RoIC0gMV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHIgPSBsID8gJ1wiJyArIHUobCkgKyAnXCInIDogXCJlbmQgb2YgaW5wdXRcIiwgXCJFeHBlY3RlZCBcIiArIHQgKyBcIiBidXQgXCIgKyByICsgXCIgZm91bmQuXCI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0ZWQgPSBuLCB0aGlzLmZvdW5kID0gbCwgdGhpcy5vZmZzZXQgPSB1LCB0aGlzLmxpbmUgPSB0LCB0aGlzLmNvbHVtbiA9IHIsIFxuXHQgICAgICAgIHRoaXMubmFtZSA9IFwiU3ludGF4RXJyb3JcIiwgdGhpcy5tZXNzYWdlID0gZShuLCBsKTtcblx0ICAgIH1cblx0ICAgIGZ1bmN0aW9uIHUobikge1xuXHQgICAgICAgIGZ1bmN0aW9uIHUoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuLnN1YnN0cmluZyhMdCwgcXQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiB0KCkge1xuXHQgICAgICAgICAgICByZXR1cm4gTHQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHIobCkge1xuXHQgICAgICAgICAgICBmdW5jdGlvbiB1KGwsIHUsIHQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciByLCBlO1xuXHQgICAgICAgICAgICAgICAgZm9yIChyID0gdTsgdCA+IHI7IHIrKykgZSA9IG4uY2hhckF0KHIpLCBcIlxcblwiID09PSBlID8gKGwuc2VlbkNSIHx8IGwubGluZSsrLCBsLmNvbHVtbiA9IDEsIFxuXHQgICAgICAgICAgICAgICAgbC5zZWVuQ1IgPSAhMSkgOiBcIlxcclwiID09PSBlIHx8IFwiXFx1MjAyOFwiID09PSBlIHx8IFwiXFx1MjAyOVwiID09PSBlID8gKGwubGluZSsrLCBsLmNvbHVtbiA9IDEsIFxuXHQgICAgICAgICAgICAgICAgbC5zZWVuQ1IgPSAhMCkgOiAobC5jb2x1bW4rKywgbC5zZWVuQ1IgPSAhMSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIE10ICE9PSBsICYmIChNdCA+IGwgJiYgKE10ID0gMCwgRHQgPSB7XG5cdCAgICAgICAgICAgICAgICBsaW5lOiAxLFxuXHQgICAgICAgICAgICAgICAgY29sdW1uOiAxLFxuXHQgICAgICAgICAgICAgICAgc2VlbkNSOiAhMVxuXHQgICAgICAgICAgICB9KSwgdShEdCwgTXQsIGwpLCBNdCA9IGwpLCBEdDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZShuKSB7XG5cdCAgICAgICAgICAgIEh0ID4gcXQgfHwgKHF0ID4gSHQgJiYgKEh0ID0gcXQsIE90ID0gW10pLCBPdC5wdXNoKG4pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gbyhuKSB7XG5cdCAgICAgICAgICAgIHZhciBsID0gMDtcblx0ICAgICAgICAgICAgZm9yIChuLnNvcnQoKTsgbCA8IG4ubGVuZ3RoOyApIG5bbCAtIDFdID09PSBuW2xdID8gbi5zcGxpY2UobCwgMSkgOiBsKys7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIGMoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByLCBvO1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCB1ID0gaSgpLCBudWxsICE9PSB1ID8gKHQgPSBxdCwgMTI0ID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHIgPSBmbCwgXG5cdCAgICAgICAgICAgIHF0KyspIDogKHIgPSBudWxsLCAwID09PSBXdCAmJiBlKHNsKSksIG51bGwgIT09IHIgPyAobyA9IGMoKSwgbnVsbCAhPT0gbyA/IChyID0gWyByLCBvIF0sIFxuXHQgICAgICAgICAgICB0ID0gcikgOiAocXQgPSB0LCB0ID0gaWwpKSA6IChxdCA9IHQsIHQgPSBpbCksIG51bGwgPT09IHQgJiYgKHQgPSBhbCksIG51bGwgIT09IHQgPyAoTHQgPSBsLCBcblx0ICAgICAgICAgICAgdSA9IGhsKHUsIHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgbCA9IGlsKSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gaSgpIHtcblx0ICAgICAgICAgICAgdmFyIG4sIGwsIHUsIHQsIHI7XG5cdCAgICAgICAgICAgIGlmIChuID0gcXQsIGwgPSBmKCksIG51bGwgPT09IGwgJiYgKGwgPSBhbCksIG51bGwgIT09IGwpIGlmICh1ID0gcXQsIFd0KyssIHQgPSBkKCksIFxuXHQgICAgICAgICAgICBXdC0tLCBudWxsID09PSB0ID8gdSA9IGFsIDogKHF0ID0gdSwgdSA9IGlsKSwgbnVsbCAhPT0gdSkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh0ID0gW10sIHIgPSBoKCksIG51bGwgPT09IHIgJiYgKHIgPSBhKCkpOyBudWxsICE9PSByOyApIHQucHVzaChyKSwgciA9IGgoKSwgXG5cdCAgICAgICAgICAgICAgICBudWxsID09PSByICYmIChyID0gYSgpKTtcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IHQgPyAociA9IHMoKSwgbnVsbCA9PT0gciAmJiAociA9IGFsKSwgbnVsbCAhPT0gciA/IChMdCA9IG4sIGwgPSBkbChsLCB0LCByKSwgXG5cdCAgICAgICAgICAgICAgICBudWxsID09PSBsID8gKHF0ID0gbiwgbiA9IGwpIDogbiA9IGwpIDogKHF0ID0gbiwgbiA9IGlsKSkgOiAocXQgPSBuLCBuID0gaWwpO1xuXHQgICAgICAgICAgICB9IGVsc2UgcXQgPSBuLCBuID0gaWw7IGVsc2UgcXQgPSBuLCBuID0gaWw7XG5cdCAgICAgICAgICAgIHJldHVybiBuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBhKCkge1xuXHQgICAgICAgICAgICB2YXIgbjtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSB4KCksIG51bGwgPT09IG4gJiYgKG4gPSBRKCksIG51bGwgPT09IG4gJiYgKG4gPSBCKCkpKSwgbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIDk0ID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSBwbCwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUodmwpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IHdsKCkpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUsIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHMoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCAzNiA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gQWwsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKENsKSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1ICYmIChMdCA9IGwsIHUgPSBnbCgpKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1LCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBoKCkge1xuXHQgICAgICAgICAgICB2YXIgbiwgbCwgdTtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSBxdCwgbCA9IGEoKSwgbnVsbCAhPT0gbCA/ICh1ID0gZCgpLCBudWxsICE9PSB1ID8gKEx0ID0gbiwgbCA9IGJsKGwsIHUpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbCA/IChxdCA9IG4sIG4gPSBsKSA6IG4gPSBsKSA6IChxdCA9IG4sIG4gPSBpbCkpIDogKHF0ID0gbiwgbiA9IGlsKSwgbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZCgpIHtcblx0ICAgICAgICAgICAgdmFyIG4sIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBXdCsrLCBuID0gcXQsIGwgPSBwKCksIG51bGwgIT09IGwgPyAodSA9IGsoKSwgbnVsbCA9PT0gdSAmJiAodSA9IGFsKSwgbnVsbCAhPT0gdSA/IChMdCA9IG4sIFxuXHQgICAgICAgICAgICBsID0gVGwobCwgdSksIG51bGwgPT09IGwgPyAocXQgPSBuLCBuID0gbCkgOiBuID0gbCkgOiAocXQgPSBuLCBuID0gaWwpKSA6IChxdCA9IG4sIFxuXHQgICAgICAgICAgICBuID0gaWwpLCBXdC0tLCBudWxsID09PSBuICYmIChsID0gbnVsbCwgMCA9PT0gV3QgJiYgZShrbCkpLCBuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBwKCkge1xuXHQgICAgICAgICAgICB2YXIgbjtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSB2KCksIG51bGwgPT09IG4gJiYgKG4gPSB3KCksIG51bGwgPT09IG4gJiYgKG4gPSBBKCksIG51bGwgPT09IG4gJiYgKG4gPSBDKCksIFxuXHQgICAgICAgICAgICBudWxsID09PSBuICYmIChuID0gZygpLCBudWxsID09PSBuICYmIChuID0gYigpKSkpKSksIG47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHYoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByLCBvLCBjO1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCAxMjMgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodSA9IHhsLCBxdCsrKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh5bCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSA/ICh0ID0gVCgpLCBudWxsICE9PSB0ID8gKDQ0ID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHIgPSBtbCwgcXQrKykgOiAociA9IG51bGwsIFxuXHQgICAgICAgICAgICAwID09PSBXdCAmJiBlKFJsKSksIG51bGwgIT09IHIgPyAobyA9IFQoKSwgbnVsbCAhPT0gbyA/ICgxMjUgPT09IG4uY2hhckNvZGVBdChxdCkgPyAoYyA9IEZsLCBcblx0ICAgICAgICAgICAgcXQrKykgOiAoYyA9IG51bGwsIDAgPT09IFd0ICYmIGUoUWwpKSwgbnVsbCAhPT0gYyA/IChMdCA9IGwsIHUgPSBTbCh0LCBvKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIFxuXHQgICAgICAgICAgICBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpLCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiB3KCkge1xuXHQgICAgICAgICAgICB2YXIgbCwgdSwgdCwgcjtcblx0ICAgICAgICAgICAgcmV0dXJuIGwgPSBxdCwgMTIzID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSB4bCwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoeWwpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAodCA9IFQoKSwgbnVsbCAhPT0gdCA/IChuLnN1YnN0cihxdCwgMikgPT09IFVsID8gKHIgPSBVbCwgcXQgKz0gMikgOiAociA9IG51bGwsIFxuXHQgICAgICAgICAgICAwID09PSBXdCAmJiBlKEVsKSksIG51bGwgIT09IHIgPyAoTHQgPSBsLCB1ID0gR2wodCksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIEEoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByO1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCAxMjMgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodSA9IHhsLCBxdCsrKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh5bCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSA/ICh0ID0gVCgpLCBudWxsICE9PSB0ID8gKDEyNSA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/IChyID0gRmwsIHF0KyspIDogKHIgPSBudWxsLCBcblx0ICAgICAgICAgICAgMCA9PT0gV3QgJiYgZShRbCkpLCBudWxsICE9PSByID8gKEx0ID0gbCwgdSA9IEJsKHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgXG5cdCAgICAgICAgICAgIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpLCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBDKCkge1xuXHQgICAgICAgICAgICB2YXIgbCwgdTtcblx0ICAgICAgICAgICAgcmV0dXJuIGwgPSBxdCwgNDMgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodSA9IGpsLCBxdCsrKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSgkbCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gcWwoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIDQyID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSBMbCwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoTWwpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IERsKCkpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUsIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIGIoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCA2MyA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gSGwsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKE9sKSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1ICYmIChMdCA9IGwsIHUgPSBXbCgpKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1LCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBrKCkge1xuXHQgICAgICAgICAgICB2YXIgbDtcblx0ICAgICAgICAgICAgcmV0dXJuIDYzID09PSBuLmNoYXJDb2RlQXQocXQpID8gKGwgPSBIbCwgcXQrKykgOiAobCA9IG51bGwsIDAgPT09IFd0ICYmIGUoT2wpKSwgXG5cdCAgICAgICAgICAgIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIFQoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICBpZiAobCA9IHF0LCB1ID0gW10sIHpsLnRlc3Qobi5jaGFyQXQocXQpKSA/ICh0ID0gbi5jaGFyQXQocXQpLCBxdCsrKSA6ICh0ID0gbnVsbCwgXG5cdCAgICAgICAgICAgIDAgPT09IFd0ICYmIGUoSWwpKSwgbnVsbCAhPT0gdCkgZm9yICg7bnVsbCAhPT0gdDsgKSB1LnB1c2godCksIHpsLnRlc3Qobi5jaGFyQXQocXQpKSA/ICh0ID0gbi5jaGFyQXQocXQpLCBcblx0ICAgICAgICAgICAgcXQrKykgOiAodCA9IG51bGwsIDAgPT09IFd0ICYmIGUoSWwpKTsgZWxzZSB1ID0gaWw7XG5cdCAgICAgICAgICAgIHJldHVybiBudWxsICE9PSB1ICYmIChMdCA9IGwsIHUgPSBKbCh1KSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgXG5cdCAgICAgICAgICAgIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHgoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByO1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCA0MCA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gS2wsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKE5sKSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1ID8gKHQgPSBSKCksIG51bGwgPT09IHQgJiYgKHQgPSBGKCksIG51bGwgPT09IHQgJiYgKHQgPSBtKCksIG51bGwgPT09IHQgJiYgKHQgPSB5KCkpKSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB0ID8gKDQxID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHIgPSBQbCwgcXQrKykgOiAociA9IG51bGwsIDAgPT09IFd0ICYmIGUoVmwpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHIgPyAoTHQgPSBsLCB1ID0gWGwodCksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIHkoKSB7XG5cdCAgICAgICAgICAgIHZhciBuLCBsO1xuXHQgICAgICAgICAgICByZXR1cm4gbiA9IHF0LCBsID0gYygpLCBudWxsICE9PSBsICYmIChMdCA9IG4sIGwgPSBZbChsKSksIG51bGwgPT09IGwgPyAocXQgPSBuLCBcblx0ICAgICAgICAgICAgbiA9IGwpIDogbiA9IGwsIG47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIG0oKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCBuLnN1YnN0cihxdCwgMikgPT09IFpsID8gKHUgPSBabCwgcXQgKz0gMikgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoX2wpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAodCA9IGMoKSwgbnVsbCAhPT0gdCA/IChMdCA9IGwsIHUgPSBudSh0KSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIFxuXHQgICAgICAgICAgICBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIFIoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCBuLnN1YnN0cihxdCwgMikgPT09IGx1ID8gKHUgPSBsdSwgcXQgKz0gMikgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUodXUpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAodCA9IGMoKSwgbnVsbCAhPT0gdCA/IChMdCA9IGwsIHUgPSB0dSh0KSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIFxuXHQgICAgICAgICAgICBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIEYoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCBuLnN1YnN0cihxdCwgMikgPT09IHJ1ID8gKHUgPSBydSwgcXQgKz0gMikgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoZXUpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAodCA9IGMoKSwgbnVsbCAhPT0gdCA/IChMdCA9IGwsIHUgPSBvdSh0KSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIFxuXHQgICAgICAgICAgICBsID0gaWwpKSA6IChxdCA9IGwsIGwgPSBpbCksIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIFEoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByLCBvO1xuXHQgICAgICAgICAgICBpZiAoV3QrKywgbCA9IHF0LCA5MSA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gaXUsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKGF1KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1KSBpZiAoOTQgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodCA9IHBsLCBxdCsrKSA6ICh0ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh2bCkpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gdCAmJiAodCA9IGFsKSwgbnVsbCAhPT0gdCkge1xuXHQgICAgICAgICAgICAgICAgZm9yIChyID0gW10sIG8gPSBTKCksIG51bGwgPT09IG8gJiYgKG8gPSBVKCkpOyBudWxsICE9PSBvOyApIHIucHVzaChvKSwgbyA9IFMoKSwgXG5cdCAgICAgICAgICAgICAgICBudWxsID09PSBvICYmIChvID0gVSgpKTtcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IHIgPyAoOTMgPT09IG4uY2hhckNvZGVBdChxdCkgPyAobyA9IGZ1LCBxdCsrKSA6IChvID0gbnVsbCwgMCA9PT0gV3QgJiYgZShzdSkpLCBcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IG8gPyAoTHQgPSBsLCB1ID0gaHUodCwgciksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgICAgIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHF0ID0gbCwgbCA9IGlsOyBlbHNlIHF0ID0gbCwgbCA9IGlsO1xuXHQgICAgICAgICAgICByZXR1cm4gV3QtLSwgbnVsbCA9PT0gbCAmJiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoY3UpKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gUygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHUsIHQsIHI7XG5cdCAgICAgICAgICAgIHJldHVybiBXdCsrLCBsID0gcXQsIHUgPSBVKCksIG51bGwgIT09IHUgPyAoNDUgPT09IG4uY2hhckNvZGVBdChxdCkgPyAodCA9IHB1LCBxdCsrKSA6ICh0ID0gbnVsbCwgXG5cdCAgICAgICAgICAgIDAgPT09IFd0ICYmIGUodnUpKSwgbnVsbCAhPT0gdCA/IChyID0gVSgpLCBudWxsICE9PSByID8gKEx0ID0gbCwgdSA9IHd1KHUsIHIpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgXG5cdCAgICAgICAgICAgIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpLCBXdC0tLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbCAmJiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoZHUpKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gVSgpIHtcblx0ICAgICAgICAgICAgdmFyIG4sIGw7XG5cdCAgICAgICAgICAgIHJldHVybiBXdCsrLCBuID0gRygpLCBudWxsID09PSBuICYmIChuID0gRSgpKSwgV3QtLSwgbnVsbCA9PT0gbiAmJiAobCA9IG51bGwsIDAgPT09IFd0ICYmIGUoQXUpKSwgXG5cdCAgICAgICAgICAgIG47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIEUoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCBDdS50ZXN0KG4uY2hhckF0KHF0KSkgPyAodSA9IG4uY2hhckF0KHF0KSwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoZ3UpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IGJ1KHUpKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1LCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBHKCkge1xuXHQgICAgICAgICAgICB2YXIgbjtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSBMKCksIG51bGwgPT09IG4gJiYgKG4gPSBZKCksIG51bGwgPT09IG4gJiYgKG4gPSBIKCksIG51bGwgPT09IG4gJiYgKG4gPSBPKCksIFxuXHQgICAgICAgICAgICBudWxsID09PSBuICYmIChuID0gVygpLCBudWxsID09PSBuICYmIChuID0geigpLCBudWxsID09PSBuICYmIChuID0gSSgpLCBudWxsID09PSBuICYmIChuID0gSigpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbiAmJiAobiA9IEsoKSwgbnVsbCA9PT0gbiAmJiAobiA9IE4oKSwgbnVsbCA9PT0gbiAmJiAobiA9IFAoKSwgbnVsbCA9PT0gbiAmJiAobiA9IFYoKSwgXG5cdCAgICAgICAgICAgIG51bGwgPT09IG4gJiYgKG4gPSBYKCksIG51bGwgPT09IG4gJiYgKG4gPSBfKCksIG51bGwgPT09IG4gJiYgKG4gPSBubCgpLCBudWxsID09PSBuICYmIChuID0gbGwoKSwgXG5cdCAgICAgICAgICAgIG51bGwgPT09IG4gJiYgKG4gPSB1bCgpLCBudWxsID09PSBuICYmIChuID0gdGwoKSkpKSkpKSkpKSkpKSkpKSkpLCBuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBCKCkge1xuXHQgICAgICAgICAgICB2YXIgbjtcblx0ICAgICAgICAgICAgcmV0dXJuIG4gPSBqKCksIG51bGwgPT09IG4gJiYgKG4gPSBxKCksIG51bGwgPT09IG4gJiYgKG4gPSAkKCkpKSwgbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gaigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIDQ2ID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSBrdSwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoVHUpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IHh1KCkpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUsIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uICQoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1O1xuXHQgICAgICAgICAgICByZXR1cm4gV3QrKywgbCA9IHF0LCBtdS50ZXN0KG4uY2hhckF0KHF0KSkgPyAodSA9IG4uY2hhckF0KHF0KSwgcXQrKykgOiAodSA9IG51bGwsIFxuXHQgICAgICAgICAgICAwID09PSBXdCAmJiBlKFJ1KSksIG51bGwgIT09IHUgJiYgKEx0ID0gbCwgdSA9IGJ1KHUpKSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1LCBcblx0ICAgICAgICAgICAgV3QtLSwgbnVsbCA9PT0gbCAmJiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoeXUpKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gcSgpIHtcblx0ICAgICAgICAgICAgdmFyIG47XG5cdCAgICAgICAgICAgIHJldHVybiBuID0gTSgpLCBudWxsID09PSBuICYmIChuID0gRCgpLCBudWxsID09PSBuICYmIChuID0gWSgpLCBudWxsID09PSBuICYmIChuID0gSCgpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbiAmJiAobiA9IE8oKSwgbnVsbCA9PT0gbiAmJiAobiA9IFcoKSwgbnVsbCA9PT0gbiAmJiAobiA9IHooKSwgbnVsbCA9PT0gbiAmJiAobiA9IEkoKSwgXG5cdCAgICAgICAgICAgIG51bGwgPT09IG4gJiYgKG4gPSBKKCksIG51bGwgPT09IG4gJiYgKG4gPSBLKCksIG51bGwgPT09IG4gJiYgKG4gPSBOKCksIG51bGwgPT09IG4gJiYgKG4gPSBQKCksIFxuXHQgICAgICAgICAgICBudWxsID09PSBuICYmIChuID0gVigpLCBudWxsID09PSBuICYmIChuID0gWCgpLCBudWxsID09PSBuICYmIChuID0gWigpLCBudWxsID09PSBuICYmIChuID0gXygpLCBcblx0ICAgICAgICAgICAgbnVsbCA9PT0gbiAmJiAobiA9IG5sKCksIG51bGwgPT09IG4gJiYgKG4gPSBsbCgpLCBudWxsID09PSBuICYmIChuID0gdWwoKSwgbnVsbCA9PT0gbiAmJiAobiA9IHRsKCkpKSkpKSkpKSkpKSkpKSkpKSkpLCBcblx0ICAgICAgICAgICAgbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gTCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gRnUgPyAodSA9IEZ1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShRdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gU3UoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gTSgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gRnUgPyAodSA9IEZ1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShRdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gVXUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gRCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gRXUgPyAodSA9IEV1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShHdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gQnUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gSCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0ganUgPyAodSA9IGp1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSgkdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gcXUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gTygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gTHUgPyAodSA9IEx1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShNdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gRHUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gVygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gSHUgPyAodSA9IEh1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShPdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gV3UoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24geigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0genUgPyAodSA9IHp1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShJdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gSnUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gSSgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gS3UgPyAodSA9IEt1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShOdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gUHUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gSigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gVnUgPyAodSA9IFZ1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShYdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gWXUoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gSygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gWnUgPyAodSA9IFp1LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShfdSkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gbnQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gTigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gbHQgPyAodSA9IGx0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh1dCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gdHQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gUCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gcnQgPyAodSA9IHJ0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShldCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gb3QoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gVigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gY3QgPyAodSA9IGN0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShpdCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gYXQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gWCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gZnQgPyAodSA9IGZ0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShzdCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gaHQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gWSgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHUsIHQ7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gZHQgPyAodSA9IGR0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZShwdCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSA/IChuLmxlbmd0aCA+IHF0ID8gKHQgPSBuLmNoYXJBdChxdCksIHF0KyspIDogKHQgPSBudWxsLCAwID09PSBXdCAmJiBlKHZ0KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB0ID8gKEx0ID0gbCwgdSA9IHd0KHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgXG5cdCAgICAgICAgICAgIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gWigpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHUsIHQ7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIDkyID09PSBuLmNoYXJDb2RlQXQocXQpID8gKHUgPSBBdCwgcXQrKykgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoQ3QpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUgPyAoZ3QudGVzdChuLmNoYXJBdChxdCkpID8gKHQgPSBuLmNoYXJBdChxdCksIHF0KyspIDogKHQgPSBudWxsLCAwID09PSBXdCAmJiBlKGJ0KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB0ID8gKEx0ID0gbCwgdSA9IGt0KHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgXG5cdCAgICAgICAgICAgIGwgPSBpbCkpIDogKHF0ID0gbCwgbCA9IGlsKSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gXygpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHUsIHQsIHI7XG5cdCAgICAgICAgICAgIGlmIChsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gVHQgPyAodSA9IFR0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh4dCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHQgPSBbXSwgeXQudGVzdChuLmNoYXJBdChxdCkpID8gKHIgPSBuLmNoYXJBdChxdCksIHF0KyspIDogKHIgPSBudWxsLCAwID09PSBXdCAmJiBlKG10KSksIFxuXHQgICAgICAgICAgICAgICAgbnVsbCAhPT0gcikgZm9yICg7bnVsbCAhPT0gcjsgKSB0LnB1c2gociksIHl0LnRlc3Qobi5jaGFyQXQocXQpKSA/IChyID0gbi5jaGFyQXQocXQpLCBcblx0ICAgICAgICAgICAgICAgIHF0KyspIDogKHIgPSBudWxsLCAwID09PSBXdCAmJiBlKG10KSk7IGVsc2UgdCA9IGlsO1xuXHQgICAgICAgICAgICAgICAgbnVsbCAhPT0gdCA/IChMdCA9IGwsIHUgPSBSdCh0KSwgbnVsbCA9PT0gdSA/IChxdCA9IGwsIGwgPSB1KSA6IGwgPSB1KSA6IChxdCA9IGwsIFxuXHQgICAgICAgICAgICAgICAgbCA9IGlsKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHF0ID0gbCwgbCA9IGlsO1xuXHQgICAgICAgICAgICByZXR1cm4gbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gbmwoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0LCByO1xuXHQgICAgICAgICAgICBpZiAobCA9IHF0LCBuLnN1YnN0cihxdCwgMikgPT09IEZ0ID8gKHUgPSBGdCwgcXQgKz0gMikgOiAodSA9IG51bGwsIDAgPT09IFd0ICYmIGUoUXQpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHUpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0ID0gW10sIFN0LnRlc3Qobi5jaGFyQXQocXQpKSA/IChyID0gbi5jaGFyQXQocXQpLCBxdCsrKSA6IChyID0gbnVsbCwgMCA9PT0gV3QgJiYgZShVdCkpLCBcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IHIpIGZvciAoO251bGwgIT09IHI7ICkgdC5wdXNoKHIpLCBTdC50ZXN0KG4uY2hhckF0KHF0KSkgPyAociA9IG4uY2hhckF0KHF0KSwgXG5cdCAgICAgICAgICAgICAgICBxdCsrKSA6IChyID0gbnVsbCwgMCA9PT0gV3QgJiYgZShVdCkpOyBlbHNlIHQgPSBpbDtcblx0ICAgICAgICAgICAgICAgIG51bGwgIT09IHQgPyAoTHQgPSBsLCB1ID0gRXQodCksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgICAgIGwgPSBpbCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBxdCA9IGwsIGwgPSBpbDtcblx0ICAgICAgICAgICAgcmV0dXJuIGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIGxsKCkge1xuXHQgICAgICAgICAgICB2YXIgbCwgdSwgdCwgcjtcblx0ICAgICAgICAgICAgaWYgKGwgPSBxdCwgbi5zdWJzdHIocXQsIDIpID09PSBHdCA/ICh1ID0gR3QsIHF0ICs9IDIpIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKEJ0KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodCA9IFtdLCBTdC50ZXN0KG4uY2hhckF0KHF0KSkgPyAociA9IG4uY2hhckF0KHF0KSwgcXQrKykgOiAociA9IG51bGwsIDAgPT09IFd0ICYmIGUoVXQpKSwgXG5cdCAgICAgICAgICAgICAgICBudWxsICE9PSByKSBmb3IgKDtudWxsICE9PSByOyApIHQucHVzaChyKSwgU3QudGVzdChuLmNoYXJBdChxdCkpID8gKHIgPSBuLmNoYXJBdChxdCksIFxuXHQgICAgICAgICAgICAgICAgcXQrKykgOiAociA9IG51bGwsIDAgPT09IFd0ICYmIGUoVXQpKTsgZWxzZSB0ID0gaWw7XG5cdCAgICAgICAgICAgICAgICBudWxsICE9PSB0ID8gKEx0ID0gbCwgdSA9IGp0KHQpLCBudWxsID09PSB1ID8gKHF0ID0gbCwgbCA9IHUpIDogbCA9IHUpIDogKHF0ID0gbCwgXG5cdCAgICAgICAgICAgICAgICBsID0gaWwpO1xuXHQgICAgICAgICAgICB9IGVsc2UgcXQgPSBsLCBsID0gaWw7XG5cdCAgICAgICAgICAgIHJldHVybiBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiB1bCgpIHtcblx0ICAgICAgICAgICAgdmFyIGwsIHU7XG5cdCAgICAgICAgICAgIHJldHVybiBsID0gcXQsIG4uc3Vic3RyKHF0LCAyKSA9PT0gVHQgPyAodSA9IFR0LCBxdCArPSAyKSA6ICh1ID0gbnVsbCwgMCA9PT0gV3QgJiYgZSh4dCkpLCBcblx0ICAgICAgICAgICAgbnVsbCAhPT0gdSAmJiAoTHQgPSBsLCB1ID0gJHQoKSksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSwgbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gdGwoKSB7XG5cdCAgICAgICAgICAgIHZhciBsLCB1LCB0O1xuXHQgICAgICAgICAgICByZXR1cm4gbCA9IHF0LCA5MiA9PT0gbi5jaGFyQ29kZUF0KHF0KSA/ICh1ID0gQXQsIHF0KyspIDogKHUgPSBudWxsLCAwID09PSBXdCAmJiBlKEN0KSksIFxuXHQgICAgICAgICAgICBudWxsICE9PSB1ID8gKG4ubGVuZ3RoID4gcXQgPyAodCA9IG4uY2hhckF0KHF0KSwgcXQrKykgOiAodCA9IG51bGwsIDAgPT09IFd0ICYmIGUodnQpKSwgXG5cdCAgICAgICAgICAgIG51bGwgIT09IHQgPyAoTHQgPSBsLCB1ID0gYnUodCksIG51bGwgPT09IHUgPyAocXQgPSBsLCBsID0gdSkgOiBsID0gdSkgOiAocXQgPSBsLCBcblx0ICAgICAgICAgICAgbCA9IGlsKSkgOiAocXQgPSBsLCBsID0gaWwpLCBsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcmwsIGVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB7fSwgb2wgPSB7XG5cdCAgICAgICAgICAgIHJlZ2V4cDogY1xuXHQgICAgICAgIH0sIGNsID0gYywgaWwgPSBudWxsLCBhbCA9IFwiXCIsIGZsID0gXCJ8XCIsIHNsID0gJ1wifFwiJywgaGwgPSBmdW5jdGlvbihuLCBsKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBsID8gbmV3IEFsdGVybmF0ZShuLCBsWzFdKSA6IG47XG5cdCAgICAgICAgfSwgZGwgPSBmdW5jdGlvbihuLCBsLCB1KSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgTWF0Y2goWyBuIF0uY29uY2F0KGwpLmNvbmNhdChbIHUgXSkpO1xuXHQgICAgICAgIH0sIHBsID0gXCJeXCIsIHZsID0gJ1wiXlwiJywgd2wgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcInN0YXJ0XCIpO1xuXHQgICAgICAgIH0sIEFsID0gXCIkXCIsIENsID0gJ1wiJFwiJywgZ2wgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcImVuZFwiKTtcblx0ICAgICAgICB9LCBibCA9IGZ1bmN0aW9uKG4sIGwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWFudGlmaWVkKG4sIGwpO1xuXHQgICAgICAgIH0sIGtsID0gXCJRdWFudGlmaWVyXCIsIFRsID0gZnVuY3Rpb24obiwgbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbCAmJiAobi5ncmVlZHkgPSAhMSksIG47XG5cdCAgICAgICAgfSwgeGwgPSBcIntcIiwgeWwgPSAnXCJ7XCInLCBtbCA9IFwiLFwiLCBSbCA9ICdcIixcIicsIEZsID0gXCJ9XCIsIFFsID0gJ1wifVwiJywgU2wgPSBmdW5jdGlvbihuLCBsKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgUXVhbnRpZmllcihuLCBsKTtcblx0ICAgICAgICB9LCBVbCA9IFwiLH1cIiwgRWwgPSAnXCIsfVwiJywgR2wgPSBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgUXVhbnRpZmllcihuLCAxLzApO1xuXHQgICAgICAgIH0sIEJsID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFF1YW50aWZpZXIobiwgbik7XG5cdCAgICAgICAgfSwgamwgPSBcIitcIiwgJGwgPSAnXCIrXCInLCBxbCA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFF1YW50aWZpZXIoMSwgMS8wKTtcblx0ICAgICAgICB9LCBMbCA9IFwiKlwiLCBNbCA9ICdcIipcIicsIERsID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgUXVhbnRpZmllcigwLCAxLzApO1xuXHQgICAgICAgIH0sIEhsID0gXCI/XCIsIE9sID0gJ1wiP1wiJywgV2wgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWFudGlmaWVyKDAsIDEpO1xuXHQgICAgICAgIH0sIHpsID0gL15bMC05XS8sIElsID0gXCJbMC05XVwiLCBKbCA9IGZ1bmN0aW9uKG4pIHtcblx0ICAgICAgICAgICAgcmV0dXJuICtuLmpvaW4oXCJcIik7XG5cdCAgICAgICAgfSwgS2wgPSBcIihcIiwgTmwgPSAnXCIoXCInLCBQbCA9IFwiKVwiLCBWbCA9ICdcIilcIicsIFhsID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbjtcblx0ICAgICAgICB9LCBZbCA9IGZ1bmN0aW9uKG4pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXB0dXJlR3JvdXAobik7XG5cdCAgICAgICAgfSwgWmwgPSBcIj86XCIsIF9sID0gJ1wiPzpcIicsIG51ID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IEdyb3VwKFwibm9uLWNhcHR1cmUtZ3JvdXBcIiwgbik7XG5cdCAgICAgICAgfSwgbHUgPSBcIj89XCIsIHV1ID0gJ1wiPz1cIicsIHR1ID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IEdyb3VwKFwicG9zaXRpdmUtbG9va2FoZWFkXCIsIG4pO1xuXHQgICAgICAgIH0sIHJ1ID0gXCI/IVwiLCBldSA9ICdcIj8hXCInLCBvdSA9IGZ1bmN0aW9uKG4pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBHcm91cChcIm5lZ2F0aXZlLWxvb2thaGVhZFwiLCBuKTtcblx0ICAgICAgICB9LCBjdSA9IFwiQ2hhcmFjdGVyU2V0XCIsIGl1ID0gXCJbXCIsIGF1ID0gJ1wiW1wiJywgZnUgPSBcIl1cIiwgc3UgPSAnXCJdXCInLCBodSA9IGZ1bmN0aW9uKG4sIGwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFyU2V0KCEhbiwgbCk7XG5cdCAgICAgICAgfSwgZHUgPSBcIkNoYXJhY3RlclJhbmdlXCIsIHB1ID0gXCItXCIsIHZ1ID0gJ1wiLVwiJywgd3UgPSBmdW5jdGlvbihuLCBsKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyUmFuZ2UobiwgbCk7XG5cdCAgICAgICAgfSwgQXUgPSBcIkNoYXJhY3RlclwiLCBDdSA9IC9eW15cXFxcXFxdXS8sIGd1ID0gXCJbXlxcXFxcXFxcXFxcXF1dXCIsIGJ1ID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWwobik7XG5cdCAgICAgICAgfSwga3UgPSBcIi5cIiwgVHUgPSAnXCIuXCInLCB4dSA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFwiYW55LWNoYXJhY3RlclwiKTtcblx0ICAgICAgICB9LCB5dSA9IFwiTGl0ZXJhbFwiLCBtdSA9IC9eW158XFxcXFxcLy5bKCk/KyokXFxeXS8sIFJ1ID0gXCJbXnxcXFxcXFxcXFxcXFwvLlsoKT8rKiRcXFxcXl1cIiwgRnUgPSBcIlxcXFxiXCIsIFF1ID0gJ1wiXFxcXFxcXFxiXCInLCBTdSA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFwiYmFja3NwYWNlXCIpO1xuXHQgICAgICAgIH0sIFV1ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJ3b3JkLWJvdW5kYXJ5XCIpO1xuXHQgICAgICAgIH0sIEV1ID0gXCJcXFxcQlwiLCBHdSA9ICdcIlxcXFxcXFxcQlwiJywgQnUgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcIm5vbi13b3JkLWJvdW5kYXJ5XCIpO1xuXHQgICAgICAgIH0sIGp1ID0gXCJcXFxcZFwiLCAkdSA9ICdcIlxcXFxcXFxcZFwiJywgcXUgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcImRpZ2l0XCIpO1xuXHQgICAgICAgIH0sIEx1ID0gXCJcXFxcRFwiLCBNdSA9ICdcIlxcXFxcXFxcRFwiJywgRHUgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcIm5vbi1kaWdpdFwiKTtcblx0ICAgICAgICB9LCBIdSA9IFwiXFxcXGZcIiwgT3UgPSAnXCJcXFxcXFxcXGZcIicsIFd1ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJmb3JtLWZlZWRcIik7XG5cdCAgICAgICAgfSwgenUgPSBcIlxcXFxuXCIsIEl1ID0gJ1wiXFxcXFxcXFxuXCInLCBKdSA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFwibGluZS1mZWVkXCIpO1xuXHQgICAgICAgIH0sIEt1ID0gXCJcXFxcclwiLCBOdSA9ICdcIlxcXFxcXFxcclwiJywgUHUgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcImNhcnJpYWdlLXJldHVyblwiKTtcblx0ICAgICAgICB9LCBWdSA9IFwiXFxcXHNcIiwgWHUgPSAnXCJcXFxcXFxcXHNcIicsIFl1ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJ3aGl0ZS1zcGFjZVwiKTtcblx0ICAgICAgICB9LCBadSA9IFwiXFxcXFNcIiwgX3UgPSAnXCJcXFxcXFxcXFNcIicsIG50ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJub24td2hpdGUtc3BhY2VcIik7XG5cdCAgICAgICAgfSwgbHQgPSBcIlxcXFx0XCIsIHV0ID0gJ1wiXFxcXFxcXFx0XCInLCB0dCA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFwidGFiXCIpO1xuXHQgICAgICAgIH0sIHJ0ID0gXCJcXFxcdlwiLCBldCA9ICdcIlxcXFxcXFxcdlwiJywgb3QgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcInZlcnRpY2FsLXRhYlwiKTtcblx0ICAgICAgICB9LCBjdCA9IFwiXFxcXHdcIiwgaXQgPSAnXCJcXFxcXFxcXHdcIicsIGF0ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJ3b3JkXCIpO1xuXHQgICAgICAgIH0sIGZ0ID0gXCJcXFxcV1wiLCBzdCA9ICdcIlxcXFxcXFxcV1wiJywgaHQgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihcIm5vbi13b3JkXCIpO1xuXHQgICAgICAgIH0sIGR0ID0gXCJcXFxcY1wiLCBwdCA9ICdcIlxcXFxcXFxcY1wiJywgdnQgPSBcImFueSBjaGFyYWN0ZXJcIiwgd3QgPSBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbENoYXJhY3RlcihuKTtcblx0ICAgICAgICB9LCBBdCA9IFwiXFxcXFwiLCBDdCA9ICdcIlxcXFxcXFxcXCInLCBndCA9IC9eWzEtOV0vLCBidCA9IFwiWzEtOV1cIiwga3QgPSBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1JlZmVyZW5jZShuKTtcblx0ICAgICAgICB9LCBUdCA9IFwiXFxcXDBcIiwgeHQgPSAnXCJcXFxcXFxcXDBcIicsIHl0ID0gL15bMC03XS8sIG10ID0gXCJbMC03XVwiLCBSdCA9IGZ1bmN0aW9uKG4pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBPY3RhbChuLmpvaW4oXCJcIikpO1xuXHQgICAgICAgIH0sIEZ0ID0gXCJcXFxceFwiLCBRdCA9ICdcIlxcXFxcXFxceFwiJywgU3QgPSAvXlswLTlhLWZBLUZdLywgVXQgPSBcIlswLTlhLWZBLUZdXCIsIEV0ID0gZnVuY3Rpb24obikge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IEhleChuLmpvaW4oXCJcIikpO1xuXHQgICAgICAgIH0sIEd0ID0gXCJcXFxcdVwiLCBCdCA9ICdcIlxcXFxcXFxcdVwiJywganQgPSBmdW5jdGlvbihuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVW5pY29kZShuLmpvaW4oXCJcIikpO1xuXHQgICAgICAgIH0sICR0ID0gZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oXCJudWxsLWNoYXJhY3RlclwiKTtcblx0ICAgICAgICB9LCBxdCA9IDAsIEx0ID0gMCwgTXQgPSAwLCBEdCA9IHtcblx0ICAgICAgICAgICAgbGluZTogMSxcblx0ICAgICAgICAgICAgY29sdW1uOiAxLFxuXHQgICAgICAgICAgICBzZWVuQ1I6ICExXG5cdCAgICAgICAgfSwgSHQgPSAwLCBPdCA9IFtdLCBXdCA9IDA7XG5cdCAgICAgICAgaWYgKFwic3RhcnRSdWxlXCIgaW4gZWwpIHtcblx0ICAgICAgICAgICAgaWYgKCEoZWwuc3RhcnRSdWxlIGluIG9sKSkgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3Qgc3RhcnQgcGFyc2luZyBmcm9tIHJ1bGUgXFxcIlwiICsgZWwuc3RhcnRSdWxlICsgJ1wiLicpO1xuXHQgICAgICAgICAgICBjbCA9IG9sW2VsLnN0YXJ0UnVsZV07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChUb2tlbi5vZmZzZXQgPSB0LCBUb2tlbi50ZXh0ID0gdSwgcmwgPSBjbCgpLCBudWxsICE9PSBybCAmJiBxdCA9PT0gbi5sZW5ndGgpIHJldHVybiBybDtcblx0ICAgICAgICB0aHJvdyBvKE90KSwgTHQgPSBNYXRoLm1heChxdCwgSHQpLCBuZXcgbChPdCwgTHQgPCBuLmxlbmd0aCA/IG4uY2hhckF0KEx0KSA6IG51bGwsIEx0LCByKEx0KS5saW5lLCByKEx0KS5jb2x1bW4pO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG4obCwgRXJyb3IpLCB7XG5cdCAgICAgICAgU3ludGF4RXJyb3I6IGwsXG5cdCAgICAgICAgcGFyc2U6IHVcblx0ICAgIH07XG5cdH0oKSwgaW5kZXggPSAxLCBjZ3MgPSB7fTtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHBhcnNlclxuXG4vKioqLyB9KSxcbi8qIDIyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0ICAgICMjIFJlZ0V4cCBIYW5kbGVyXG5cblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3JiZXNMaW5kZXNheS9yZWdleHBcblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9kbWFqZGEvcGVnanNcblx0ICAgIGh0dHA6Ly93d3cucmVnZXhwZXIuY29tL1xuXG5cdCAgICDmr4/kuKroioLngrnnmoTnu5PmnoRcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6ICcnLFxuXHQgICAgICAgICAgICBvZmZzZXQ6IG51bWJlcixcblx0ICAgICAgICAgICAgdGV4dDogJycsXG5cdCAgICAgICAgICAgIGJvZHk6IHt9LFxuXHQgICAgICAgICAgICBlc2NhcGVkOiB0cnVlL2ZhbHNlXG5cdCAgICAgICAgfVxuXG5cdCAgICB0eXBlIOWPr+mAieWAvFxuXHQgICAgICAgIGFsdGVybmF0ZSAgICAgICAgICAgICB8ICAgICAgICAg6YCJ5oupXG5cdCAgICAgICAgbWF0Y2ggICAgICAgICAgICAgICAgIOWMuemFjVxuXHQgICAgICAgIGNhcHR1cmUtZ3JvdXAgICAgICAgICAoKSAgICAgICAg5o2V6I6357uEXG5cdCAgICAgICAgbm9uLWNhcHR1cmUtZ3JvdXAgICAgICg/Oi4uLikgICDpnZ7mjZXojrfnu4Rcblx0ICAgICAgICBwb3NpdGl2ZS1sb29rYWhlYWQgICAgKD89cCkgICAgIOmbtuWuveato+WQkeWFiOihjOaWreiogFxuXHQgICAgICAgIG5lZ2F0aXZlLWxvb2thaGVhZCAgICAoPyFwKSAgICAg6Zu25a696LSf5ZCR5YWI6KGM5pat6KiAXG5cdCAgICAgICAgcXVhbnRpZmllZCAgICAgICAgICAgIGEqICAgICAgICDph43lpI3oioLngrlcblx0ICAgICAgICBxdWFudGlmaWVyICAgICAgICAgICAgKiAgICAgICAgIOmHj+ivjVxuXHQgICAgICAgIGNoYXJzZXQgICAgICAgICAgICAgICBbXSAgICAgICAg5a2X56ym6ZuGXG5cdCAgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgIHttLCBufSAgICDojIPlm7Rcblx0ICAgICAgICBsaXRlcmFsICAgICAgICAgICAgICAgYSAgICAgICAgIOebtOaOpemHj+Wtl+esplxuXHQgICAgICAgIHVuaWNvZGUgICAgICAgICAgICAgICBcXHV4eHh4ICAgIFVuaWNvZGVcblx0ICAgICAgICBoZXggICAgICAgICAgICAgICAgICAgXFx4ICAgICAgICDljYHlha3ov5vliLZcblx0ICAgICAgICBvY3RhbCAgICAgICAgICAgICAgICAg5YWr6L+b5Yi2XG5cdCAgICAgICAgYmFjay1yZWZlcmVuY2UgICAgICAgIFxcbiAgICAgICAg5Y+N5ZCR5byV55SoXG5cdCAgICAgICAgY29udHJvbC1jaGFyYWN0ZXIgICAgIFxcY1ggICAgICAg5o6n5Yi25a2X56ymXG5cblx0ICAgICAgICAvLyBUb2tlblxuXHQgICAgICAgIHN0YXJ0ICAgICAgICAgICAgICAgXiAgICAgICDlvIDlpLRcblx0ICAgICAgICBlbmQgICAgICAgICAgICAgICAgICQgICAgICAg57uT5bC+XG5cdCAgICAgICAgYW55LWNoYXJhY3RlciAgICAgICAuICAgICAgIOS7u+aEj+Wtl+esplxuXHQgICAgICAgIGJhY2tzcGFjZSAgICAgICAgICAgW1xcYl0gICAg6YCA5qC855u05o6l6YePXG5cdCAgICAgICAgd29yZC1ib3VuZGFyeSAgICAgICBcXGIgICAgICDljZXor43ovrnnlYxcblx0ICAgICAgICBub24td29yZC1ib3VuZGFyeSAgIFxcQiAgICAgIOmdnuWNleivjei+ueeVjFxuXHQgICAgICAgIGRpZ2l0ICAgICAgICAgICAgICAgXFxkICAgICAgQVNDSUkg5pWw5a2X77yMWzAtOV1cblx0ICAgICAgICBub24tZGlnaXQgICAgICAgICAgIFxcRCAgICAgIOmdniBBU0NJSSDmlbDlrZfvvIxbXjAtOV1cblx0ICAgICAgICBmb3JtLWZlZWQgICAgICAgICAgIFxcZiAgICAgIOaNoumhteesplxuXHQgICAgICAgIGxpbmUtZmVlZCAgICAgICAgICAgXFxuICAgICAg5o2i6KGM56ymXG5cdCAgICAgICAgY2FycmlhZ2UtcmV0dXJuICAgICBcXHIgICAgICDlm57ovabnrKZcblx0ICAgICAgICB3aGl0ZS1zcGFjZSAgICAgICAgIFxccyAgICAgIOepuueZveesplxuXHQgICAgICAgIG5vbi13aGl0ZS1zcGFjZSAgICAgXFxTICAgICAg6Z2e56m655m956ymXG5cdCAgICAgICAgdGFiICAgICAgICAgICAgICAgICBcXHQgICAgICDliLbooajnrKZcblx0ICAgICAgICB2ZXJ0aWNhbC10YWIgICAgICAgIFxcdiAgICAgIOWeguebtOWItuihqOesplxuXHQgICAgICAgIHdvcmQgICAgICAgICAgICAgICAgXFx3ICAgICAgQVNDSUkg5a2X56ym77yMW2EtekEtWjAtOV1cblx0ICAgICAgICBub24td29yZCAgICAgICAgICAgIFxcVyAgICAgIOmdniBBU0NJSSDlrZfnrKbvvIxbXmEtekEtWjAtOV1cblx0ICAgICAgICBudWxsLWNoYXJhY3RlciAgICAgIFxcbyAgICAgIE5VTCDlrZfnrKZcblx0ICovXG5cblx0dmFyIFV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG5cdHZhciBSYW5kb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cdCAgICAvKlxuXHQgICAgICAgIFxuXHQgICAgKi9cblx0dmFyIEhhbmRsZXIgPSB7XG5cdCAgICBleHRlbmQ6IFV0aWwuZXh0ZW5kXG5cdH1cblxuXHQvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FTQ0lJI0FTQ0lJX3ByaW50YWJsZV9jb2RlX2NoYXJ0XG5cdC8qdmFyIEFTQ0lJX0NPTlRST0xfQ09ERV9DSEFSVCA9IHtcblx0ICAgICdAJzogWydcXHUwMDAwJ10sXG5cdCAgICBBOiBbJ1xcdTAwMDEnXSxcblx0ICAgIEI6IFsnXFx1MDAwMiddLFxuXHQgICAgQzogWydcXHUwMDAzJ10sXG5cdCAgICBEOiBbJ1xcdTAwMDQnXSxcblx0ICAgIEU6IFsnXFx1MDAwNSddLFxuXHQgICAgRjogWydcXHUwMDA2J10sXG5cdCAgICBHOiBbJ1xcdTAwMDcnLCAnXFxhJ10sXG5cdCAgICBIOiBbJ1xcdTAwMDgnLCAnXFxiJ10sXG5cdCAgICBJOiBbJ1xcdTAwMDknLCAnXFx0J10sXG5cdCAgICBKOiBbJ1xcdTAwMEEnLCAnXFxuJ10sXG5cdCAgICBLOiBbJ1xcdTAwMEInLCAnXFx2J10sXG5cdCAgICBMOiBbJ1xcdTAwMEMnLCAnXFxmJ10sXG5cdCAgICBNOiBbJ1xcdTAwMEQnLCAnXFxyJ10sXG5cdCAgICBOOiBbJ1xcdTAwMEUnXSxcblx0ICAgIE86IFsnXFx1MDAwRiddLFxuXHQgICAgUDogWydcXHUwMDEwJ10sXG5cdCAgICBROiBbJ1xcdTAwMTEnXSxcblx0ICAgIFI6IFsnXFx1MDAxMiddLFxuXHQgICAgUzogWydcXHUwMDEzJ10sXG5cdCAgICBUOiBbJ1xcdTAwMTQnXSxcblx0ICAgIFU6IFsnXFx1MDAxNSddLFxuXHQgICAgVjogWydcXHUwMDE2J10sXG5cdCAgICBXOiBbJ1xcdTAwMTcnXSxcblx0ICAgIFg6IFsnXFx1MDAxOCddLFxuXHQgICAgWTogWydcXHUwMDE5J10sXG5cdCAgICBaOiBbJ1xcdTAwMUEnXSxcblx0ICAgICdbJzogWydcXHUwMDFCJywgJ1xcZSddLFxuXHQgICAgJ1xcXFwnOiBbJ1xcdTAwMUMnXSxcblx0ICAgICddJzogWydcXHUwMDFEJ10sXG5cdCAgICAnXic6IFsnXFx1MDAxRSddLFxuXHQgICAgJ18nOiBbJ1xcdTAwMUYnXVxuXHR9Ki9cblxuXHQvLyBBU0NJSSBwcmludGFibGUgY29kZSBjaGFydFxuXHQvLyB2YXIgTE9XRVIgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonXG5cdC8vIHZhciBVUFBFUiA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidcblx0Ly8gdmFyIE5VTUJFUiA9ICcwMTIzNDU2Nzg5J1xuXHQvLyB2YXIgU1lNQk9MID0gJyAhXCIjJCUmXFwnKCkqKywtLi8nICsgJzo7PD0+P0AnICsgJ1tcXFxcXV5fYCcgKyAne3x9fidcblx0dmFyIExPV0VSID0gYXNjaWkoOTcsIDEyMilcblx0dmFyIFVQUEVSID0gYXNjaWkoNjUsIDkwKVxuXHR2YXIgTlVNQkVSID0gYXNjaWkoNDgsIDU3KVxuXHR2YXIgT1RIRVIgPSBhc2NpaSgzMiwgNDcpICsgYXNjaWkoNTgsIDY0KSArIGFzY2lpKDkxLCA5NikgKyBhc2NpaSgxMjMsIDEyNikgLy8g5o6S6ZmkIDk1IF8gYXNjaWkoOTEsIDk0KSArIGFzY2lpKDk2LCA5Nilcblx0dmFyIFBSSU5UQUJMRSA9IGFzY2lpKDMyLCAxMjYpXG5cdHZhciBTUEFDRSA9ICcgXFxmXFxuXFxyXFx0XFx2XFx1MDBBMFxcdTIwMjhcXHUyMDI5J1xuXHR2YXIgQ0hBUkFDVEVSX0NMQVNTRVMgPSB7XG5cdCAgICAnXFxcXHcnOiBMT1dFUiArIFVQUEVSICsgTlVNQkVSICsgJ18nLCAvLyBhc2NpaSg5NSwgOTUpXG5cdCAgICAnXFxcXFcnOiBPVEhFUi5yZXBsYWNlKCdfJywgJycpLFxuXHQgICAgJ1xcXFxzJzogU1BBQ0UsXG5cdCAgICAnXFxcXFMnOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gUFJJTlRBQkxFXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBTUEFDRS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShTUEFDRVtpXSwgJycpXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0oKSxcblx0ICAgICdcXFxcZCc6IE5VTUJFUixcblx0ICAgICdcXFxcRCc6IExPV0VSICsgVVBQRVIgKyBPVEhFUlxuXHR9XG5cblx0ZnVuY3Rpb24gYXNjaWkoZnJvbSwgdG8pIHtcblx0ICAgIHZhciByZXN1bHQgPSAnJ1xuXHQgICAgZm9yICh2YXIgaSA9IGZyb207IGkgPD0gdG87IGkrKykge1xuXHQgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmVzdWx0XG5cdH1cblxuXHQvLyB2YXIgYXN0ID0gUmVnRXhwUGFyc2VyLnBhcnNlKHJlZ2V4cC5zb3VyY2UpXG5cdEhhbmRsZXIuZ2VuID0gZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgY2FjaGUgPSBjYWNoZSB8fCB7XG5cdCAgICAgICAgZ3VpZDogMVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIEhhbmRsZXJbbm9kZS50eXBlXSA/IEhhbmRsZXJbbm9kZS50eXBlXShub2RlLCByZXN1bHQsIGNhY2hlKSA6XG5cdCAgICAgICAgSGFuZGxlci50b2tlbihub2RlLCByZXN1bHQsIGNhY2hlKVxuXHR9XG5cblx0SGFuZGxlci5leHRlbmQoe1xuXHQgICAgLyoganNoaW50IHVudXNlZDpmYWxzZSAqL1xuXHQgICAgdG9rZW46IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlICdzdGFydCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gJydcblx0ICAgICAgICAgICAgY2FzZSAnYW55LWNoYXJhY3Rlcic6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUmFuZG9tLmNoYXJhY3RlcigpXG5cdCAgICAgICAgICAgIGNhc2UgJ2JhY2tzcGFjZSc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gJydcblx0ICAgICAgICAgICAgY2FzZSAnd29yZC1ib3VuZGFyeSc6IC8vIFRPRE9cblx0ICAgICAgICAgICAgICAgIHJldHVybiAnJ1xuXHQgICAgICAgICAgICBjYXNlICdub24td29yZC1ib3VuZGFyeSc6IC8vIFRPRE9cblx0ICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgIGNhc2UgJ2RpZ2l0Jzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBSYW5kb20ucGljayhcblx0ICAgICAgICAgICAgICAgICAgICBOVU1CRVIuc3BsaXQoJycpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIGNhc2UgJ25vbi1kaWdpdCc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUmFuZG9tLnBpY2soXG5cdCAgICAgICAgICAgICAgICAgICAgKExPV0VSICsgVVBQRVIgKyBPVEhFUikuc3BsaXQoJycpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIGNhc2UgJ2Zvcm0tZmVlZCc6XG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICBjYXNlICdsaW5lLWZlZWQnOlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuYm9keSB8fCBub2RlLnRleHRcblx0ICAgICAgICAgICAgY2FzZSAnY2FycmlhZ2UtcmV0dXJuJzpcblx0ICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgIGNhc2UgJ3doaXRlLXNwYWNlJzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBSYW5kb20ucGljayhcblx0ICAgICAgICAgICAgICAgICAgICBTUEFDRS5zcGxpdCgnJylcblx0ICAgICAgICAgICAgICAgIClcblx0ICAgICAgICAgICAgY2FzZSAnbm9uLXdoaXRlLXNwYWNlJzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBSYW5kb20ucGljayhcblx0ICAgICAgICAgICAgICAgICAgICAoTE9XRVIgKyBVUFBFUiArIE5VTUJFUikuc3BsaXQoJycpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIGNhc2UgJ3RhYic6XG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICBjYXNlICd2ZXJ0aWNhbC10YWInOlxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICAgICAgY2FzZSAnd29yZCc6IC8vIFxcdyBbYS16QS1aMC05XVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmRvbS5waWNrKFxuXHQgICAgICAgICAgICAgICAgICAgIChMT1dFUiArIFVQUEVSICsgTlVNQkVSKS5zcGxpdCgnJylcblx0ICAgICAgICAgICAgICAgIClcblx0ICAgICAgICAgICAgY2FzZSAnbm9uLXdvcmQnOiAvLyBcXFcgW15hLXpBLVowLTldXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUmFuZG9tLnBpY2soXG5cdCAgICAgICAgICAgICAgICAgICAgT1RIRVIucmVwbGFjZSgnXycsICcnKS5zcGxpdCgnJylcblx0ICAgICAgICAgICAgICAgIClcblx0ICAgICAgICAgICAgY2FzZSAnbnVsbC1jaGFyYWN0ZXInOlxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG5vZGUuYm9keSB8fCBub2RlLnRleHRcblx0ICAgIH0sXG5cdCAgICAvKlxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgdHlwZTogJ2FsdGVybmF0ZScsXG5cdCAgICAgICAgICAgIG9mZnNldDogMCxcblx0ICAgICAgICAgICAgdGV4dDogJycsXG5cdCAgICAgICAgICAgIGxlZnQ6IHtcblx0ICAgICAgICAgICAgICAgIGJveWQ6IFtdXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHJpZ2h0OiB7XG5cdCAgICAgICAgICAgICAgICBib3lkOiBbXVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgKi9cblx0ICAgIGFsdGVybmF0ZTogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIC8vIG5vZGUubGVmdC9yaWdodCB7fVxuXHQgICAgICAgIHJldHVybiB0aGlzLmdlbihcblx0ICAgICAgICAgICAgUmFuZG9tLmJvb2xlYW4oKSA/IG5vZGUubGVmdCA6IG5vZGUucmlnaHQsXG5cdCAgICAgICAgICAgIHJlc3VsdCxcblx0ICAgICAgICAgICAgY2FjaGVcblx0ICAgICAgICApXG5cdCAgICB9LFxuXHQgICAgLypcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHR5cGU6ICdtYXRjaCcsXG5cdCAgICAgICAgICAgIG9mZnNldDogMCxcblx0ICAgICAgICAgICAgdGV4dDogJycsXG5cdCAgICAgICAgICAgIGJvZHk6IFtdXG5cdCAgICAgICAgfVxuXHQgICAgKi9cblx0ICAgIG1hdGNoOiBmdW5jdGlvbihub2RlLCByZXN1bHQsIGNhY2hlKSB7XG5cdCAgICAgICAgcmVzdWx0ID0gJydcblx0ICAgICAgICAgICAgLy8gbm9kZS5ib2R5IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmJvZHkubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuZ2VuKG5vZGUuYm9keVtpXSwgcmVzdWx0LCBjYWNoZSlcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIC8vICgpXG5cdCAgICAnY2FwdHVyZS1ncm91cCc6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICAvLyBub2RlLmJvZHkge31cblx0ICAgICAgICByZXN1bHQgPSB0aGlzLmdlbihub2RlLmJvZHksIHJlc3VsdCwgY2FjaGUpXG5cdCAgICAgICAgY2FjaGVbY2FjaGUuZ3VpZCsrXSA9IHJlc3VsdFxuXHQgICAgICAgIHJldHVybiByZXN1bHRcblx0ICAgIH0sXG5cdCAgICAvLyAoPzouLi4pXG5cdCAgICAnbm9uLWNhcHR1cmUtZ3JvdXAnOiBmdW5jdGlvbihub2RlLCByZXN1bHQsIGNhY2hlKSB7XG5cdCAgICAgICAgLy8gbm9kZS5ib2R5IHt9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZ2VuKG5vZGUuYm9keSwgcmVzdWx0LCBjYWNoZSlcblx0ICAgIH0sXG5cdCAgICAvLyAoPz1wKVxuXHQgICAgJ3Bvc2l0aXZlLWxvb2thaGVhZCc6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICAvLyBub2RlLmJvZHlcblx0ICAgICAgICByZXR1cm4gdGhpcy5nZW4obm9kZS5ib2R5LCByZXN1bHQsIGNhY2hlKVxuXHQgICAgfSxcblx0ICAgIC8vICg/IXApXG5cdCAgICAnbmVnYXRpdmUtbG9va2FoZWFkJzogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIC8vIG5vZGUuYm9keVxuXHQgICAgICAgIHJldHVybiAnJ1xuXHQgICAgfSxcblx0ICAgIC8qXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICB0eXBlOiAncXVhbnRpZmllZCcsXG5cdCAgICAgICAgICAgIG9mZnNldDogMyxcblx0ICAgICAgICAgICAgdGV4dDogJ2MqJyxcblx0ICAgICAgICAgICAgYm9keToge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogJ2xpdGVyYWwnLFxuXHQgICAgICAgICAgICAgICAgb2Zmc2V0OiAzLFxuXHQgICAgICAgICAgICAgICAgdGV4dDogJ2MnLFxuXHQgICAgICAgICAgICAgICAgYm9keTogJ2MnLFxuXHQgICAgICAgICAgICAgICAgZXNjYXBlZDogZmFsc2Vcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgcXVhbnRpZmllcjoge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogJ3F1YW50aWZpZXInLFxuXHQgICAgICAgICAgICAgICAgb2Zmc2V0OiA0LFxuXHQgICAgICAgICAgICAgICAgdGV4dDogJyonLFxuXHQgICAgICAgICAgICAgICAgbWluOiAwLFxuXHQgICAgICAgICAgICAgICAgbWF4OiBJbmZpbml0eSxcblx0ICAgICAgICAgICAgICAgIGdyZWVkeTogdHJ1ZVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgKi9cblx0ICAgIHF1YW50aWZpZWQ6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXN1bHQgPSAnJ1xuXHQgICAgICAgICAgICAvLyBub2RlLnF1YW50aWZpZXIge31cblx0ICAgICAgICB2YXIgY291bnQgPSB0aGlzLnF1YW50aWZpZXIobm9kZS5xdWFudGlmaWVyKTtcblx0ICAgICAgICAvLyBub2RlLmJvZHkge31cblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcblx0ICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuZ2VuKG5vZGUuYm9keSwgcmVzdWx0LCBjYWNoZSlcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIC8qXG5cdCAgICAgICAgcXVhbnRpZmllcjoge1xuXHQgICAgICAgICAgICB0eXBlOiAncXVhbnRpZmllcicsXG5cdCAgICAgICAgICAgIG9mZnNldDogNCxcblx0ICAgICAgICAgICAgdGV4dDogJyonLFxuXHQgICAgICAgICAgICBtaW46IDAsXG5cdCAgICAgICAgICAgIG1heDogSW5maW5pdHksXG5cdCAgICAgICAgICAgIGdyZWVkeTogdHJ1ZVxuXHQgICAgICAgIH1cblx0ICAgICovXG5cdCAgICBxdWFudGlmaWVyOiBmdW5jdGlvbihub2RlLCByZXN1bHQsIGNhY2hlKSB7XG5cdCAgICAgICAgdmFyIG1pbiA9IE1hdGgubWF4KG5vZGUubWluLCAwKVxuXHQgICAgICAgIHZhciBtYXggPSBpc0Zpbml0ZShub2RlLm1heCkgPyBub2RlLm1heCA6XG5cdCAgICAgICAgICAgIG1pbiArIFJhbmRvbS5pbnRlZ2VyKDMsIDcpXG5cdCAgICAgICAgcmV0dXJuIFJhbmRvbS5pbnRlZ2VyKG1pbiwgbWF4KVxuXHQgICAgfSxcblx0ICAgIC8qXG5cdCAgICAgICAgXG5cdCAgICAqL1xuXHQgICAgY2hhcnNldDogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIC8vIG5vZGUuaW52ZXJ0XG5cdCAgICAgICAgaWYgKG5vZGUuaW52ZXJ0KSByZXR1cm4gdGhpc1snaW52ZXJ0LWNoYXJzZXQnXShub2RlLCByZXN1bHQsIGNhY2hlKVxuXG5cdCAgICAgICAgLy8gbm9kZS5ib2R5IFtdXG5cdCAgICAgICAgdmFyIGxpdGVyYWwgPSBSYW5kb20ucGljayhub2RlLmJvZHkpXG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZ2VuKGxpdGVyYWwsIHJlc3VsdCwgY2FjaGUpXG5cdCAgICB9LFxuXHQgICAgJ2ludmVydC1jaGFyc2V0JzogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIHZhciBwb29sID0gUFJJTlRBQkxFXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDAsIGl0ZW07IGkgPCBub2RlLmJvZHkubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgaXRlbSA9IG5vZGUuYm9keVtpXVxuXHQgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnbGl0ZXJhbCc6XG5cdCAgICAgICAgICAgICAgICAgICAgcG9vbCA9IHBvb2wucmVwbGFjZShpdGVtLmJvZHksICcnKVxuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgICAgICBjYXNlICdyYW5nZSc6XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG1pbiA9IHRoaXMuZ2VuKGl0ZW0uc3RhcnQsIHJlc3VsdCwgY2FjaGUpLmNoYXJDb2RlQXQoKVxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSB0aGlzLmdlbihpdGVtLmVuZCwgcmVzdWx0LCBjYWNoZSkuY2hhckNvZGVBdCgpXG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaWkgPSBtaW47IGlpIDw9IG1heDsgaWkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwb29sID0gcG9vbC5yZXBsYWNlKFN0cmluZy5mcm9tQ2hhckNvZGUoaWkpLCAnJylcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXHQgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcmFjdGVycyA9IENIQVJBQ1RFUl9DTEFTU0VTW2l0ZW0udGV4dF1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVycykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpaWkgPSAwOyBpaWkgPD0gY2hhcmFjdGVycy5sZW5ndGg7IGlpaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sID0gcG9vbC5yZXBsYWNlKGNoYXJhY3RlcnNbaWlpXSwgJycpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIFJhbmRvbS5waWNrKHBvb2wuc3BsaXQoJycpKVxuXHQgICAgfSxcblx0ICAgIHJhbmdlOiBmdW5jdGlvbihub2RlLCByZXN1bHQsIGNhY2hlKSB7XG5cdCAgICAgICAgLy8gbm9kZS5zdGFydCwgbm9kZS5lbmRcblx0ICAgICAgICB2YXIgbWluID0gdGhpcy5nZW4obm9kZS5zdGFydCwgcmVzdWx0LCBjYWNoZSkuY2hhckNvZGVBdCgpXG5cdCAgICAgICAgdmFyIG1heCA9IHRoaXMuZ2VuKG5vZGUuZW5kLCByZXN1bHQsIGNhY2hlKS5jaGFyQ29kZUF0KClcblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0ICAgICAgICAgICAgUmFuZG9tLmludGVnZXIobWluLCBtYXgpXG5cdCAgICAgICAgKVxuXHQgICAgfSxcblx0ICAgIGxpdGVyYWw6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gbm9kZS5lc2NhcGVkID8gbm9kZS5ib2R5IDogbm9kZS50ZXh0XG5cdCAgICB9LFxuXHQgICAgLy8gVW5pY29kZSBcXHVcblx0ICAgIHVuaWNvZGU6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0ICAgICAgICAgICAgcGFyc2VJbnQobm9kZS5jb2RlLCAxNilcblx0ICAgICAgICApXG5cdCAgICB9LFxuXHQgICAgLy8g5Y2B5YWt6L+b5Yi2IFxceEZGXG5cdCAgICBoZXg6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0ICAgICAgICAgICAgcGFyc2VJbnQobm9kZS5jb2RlLCAxNilcblx0ICAgICAgICApXG5cdCAgICB9LFxuXHQgICAgLy8g5YWr6L+b5Yi2IFxcMFxuXHQgICAgb2N0YWw6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcblx0ICAgICAgICAgICAgcGFyc2VJbnQobm9kZS5jb2RlLCA4KVxuXHQgICAgICAgIClcblx0ICAgIH0sXG5cdCAgICAvLyDlj43lkJHlvJXnlKhcblx0ICAgICdiYWNrLXJlZmVyZW5jZSc6IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdCwgY2FjaGUpIHtcblx0ICAgICAgICByZXR1cm4gY2FjaGVbbm9kZS5jb2RlXSB8fCAnJ1xuXHQgICAgfSxcblx0ICAgIC8qXG5cdCAgICAgICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DMF9hbmRfQzFfY29udHJvbF9jb2Rlc1xuXHQgICAgKi9cblx0ICAgIENPTlRST0xfQ0hBUkFDVEVSX01BUDogZnVuY3Rpb24oKSB7XG5cdCAgICAgICAgdmFyIENPTlRST0xfQ0hBUkFDVEVSID0gJ0AgQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgTSBOIE8gUCBRIFIgUyBUIFUgViBXIFggWSBaIFsgXFxcXCBdIF4gXycuc3BsaXQoJyAnKVxuXHQgICAgICAgIHZhciBDT05UUk9MX0NIQVJBQ1RFUl9VTklDT0RFID0gJ1xcdTAwMDAgXFx1MDAwMSBcXHUwMDAyIFxcdTAwMDMgXFx1MDAwNCBcXHUwMDA1IFxcdTAwMDYgXFx1MDAwNyBcXHUwMDA4IFxcdTAwMDkgXFx1MDAwQSBcXHUwMDBCIFxcdTAwMEMgXFx1MDAwRCBcXHUwMDBFIFxcdTAwMEYgXFx1MDAxMCBcXHUwMDExIFxcdTAwMTIgXFx1MDAxMyBcXHUwMDE0IFxcdTAwMTUgXFx1MDAxNiBcXHUwMDE3IFxcdTAwMTggXFx1MDAxOSBcXHUwMDFBIFxcdTAwMUIgXFx1MDAxQyBcXHUwMDFEIFxcdTAwMUUgXFx1MDAxRicuc3BsaXQoJyAnKVxuXHQgICAgICAgIHZhciBtYXAgPSB7fVxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQ09OVFJPTF9DSEFSQUNURVIubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgbWFwW0NPTlRST0xfQ0hBUkFDVEVSW2ldXSA9IENPTlRST0xfQ0hBUkFDVEVSX1VOSUNPREVbaV1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG1hcFxuXHQgICAgfSgpLFxuXHQgICAgJ2NvbnRyb2wtY2hhcmFjdGVyJzogZnVuY3Rpb24obm9kZSwgcmVzdWx0LCBjYWNoZSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLkNPTlRST0xfQ0hBUkFDVEVSX01BUFtub2RlLmNvZGVdXG5cdCAgICB9XG5cdH0pXG5cblx0bW9kdWxlLmV4cG9ydHMgPSBIYW5kbGVyXG5cbi8qKiovIH0pLFxuLyogMjMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpXG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHQgICAgIyMgdG9KU09OU2NoZW1hXG5cblx0ICAgIOaKiiBNb2NrLmpzIOmjjuagvOeahOaVsOaNruaooeadv+i9rOaNouaIkCBKU09OIFNjaGVtYeOAglxuXG5cdCAgICA+IFtKU09OIFNjaGVtYV0oaHR0cDovL2pzb24tc2NoZW1hLm9yZy8pXG5cdCAqL1xuXHR2YXIgQ29uc3RhbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG5cdHZhciBVdGlsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKVxuXHR2YXIgUGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KVxuXG5cdGZ1bmN0aW9uIHRvSlNPTlNjaGVtYSh0ZW1wbGF0ZSwgbmFtZSwgcGF0aCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0ICAgIC8vIHR5cGUgcnVsZSBwcm9wZXJ0aWVzIGl0ZW1zXG5cdCAgICBwYXRoID0gcGF0aCB8fCBbXVxuXHQgICAgdmFyIHJlc3VsdCA9IHtcblx0ICAgICAgICBuYW1lOiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgPyBuYW1lLnJlcGxhY2UoQ29uc3RhbnQuUkVfS0VZLCAnJDEnKSA6IG5hbWUsXG5cdCAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuXHQgICAgICAgIHR5cGU6IFV0aWwudHlwZSh0ZW1wbGF0ZSksIC8vIOWPr+iDveS4jeWHhuehru+8jOS+i+WmgiB7ICduYW1lfDEnOiBbe30sIHt9IC4uLl0gfVxuXHQgICAgICAgIHJ1bGU6IFBhcnNlci5wYXJzZShuYW1lKVxuXHQgICAgfVxuXHQgICAgcmVzdWx0LnBhdGggPSBwYXRoLnNsaWNlKDApXG5cdCAgICByZXN1bHQucGF0aC5wdXNoKG5hbWUgPT09IHVuZGVmaW5lZCA/ICdST09UJyA6IHJlc3VsdC5uYW1lKVxuXG5cdCAgICBzd2l0Y2ggKHJlc3VsdC50eXBlKSB7XG5cdCAgICAgICAgY2FzZSAnYXJyYXknOlxuXHQgICAgICAgICAgICByZXN1bHQuaXRlbXMgPSBbXVxuXHQgICAgICAgICAgICBVdGlsLmVhY2godGVtcGxhdGUsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuXHQgICAgICAgICAgICAgICAgcmVzdWx0Lml0ZW1zLnB1c2goXG5cdCAgICAgICAgICAgICAgICAgICAgdG9KU09OU2NoZW1hKHZhbHVlLCBpbmRleCwgcmVzdWx0LnBhdGgpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgY2FzZSAnb2JqZWN0Jzpcblx0ICAgICAgICAgICAgcmVzdWx0LnByb3BlcnRpZXMgPSBbXVxuXHQgICAgICAgICAgICBVdGlsLmVhY2godGVtcGxhdGUsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQucHJvcGVydGllcy5wdXNoKFxuXHQgICAgICAgICAgICAgICAgICAgIHRvSlNPTlNjaGVtYSh2YWx1ZSwgbmFtZSwgcmVzdWx0LnBhdGgpXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgIGJyZWFrXG5cdCAgICB9XG5cblx0ICAgIHJldHVybiByZXN1bHRcblxuXHR9XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB0b0pTT05TY2hlbWFcblxuXG4vKioqLyB9KSxcbi8qIDI1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KVxuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Lypcblx0ICAgICMjIHZhbGlkKHRlbXBsYXRlLCBkYXRhKVxuXG5cdCAgICDmoKHpqoznnJ/lrp7mlbDmja4gZGF0YSDmmK/lkKbkuI7mlbDmja7mqKHmnb8gdGVtcGxhdGUg5Yy56YWN44CCXG5cdCAgICBcblx0ICAgIOWunueOsOaAnei3r++8mlxuXHQgICAgMS4g6Kej5p6Q6KeE5YiZ44CCXG5cdCAgICAgICAg5YWI5oqK5pWw5o2u5qih5p2/IHRlbXBsYXRlIOino+aekOS4uuabtOaWueS+v+acuuWZqOino+aekOeahCBKU09OLVNjaGFtZVxuXHQgICAgICAgIG5hbWUgICAgICAgICAgICAgICDlsZ7mgKflkI0gXG5cdCAgICAgICAgdHlwZSAgICAgICAgICAgICAgIOWxnuaAp+WAvOexu+Wei1xuXHQgICAgICAgIHRlbXBsYXRlICAgICAgICAgICDlsZ7mgKflgLzmqKHmnb9cblx0ICAgICAgICBwcm9wZXJ0aWVzICAgICAgICAg5a+56LGh5bGe5oCn5pWw57uEXG5cdCAgICAgICAgaXRlbXMgICAgICAgICAgICAgIOaVsOe7hOWFg+e0oOaVsOe7hFxuXHQgICAgICAgIHJ1bGUgICAgICAgICAgICAgICDlsZ7mgKflgLznlJ/miJDop4TliJlcblx0ICAgIDIuIOmAkuW9kumqjOivgeinhOWImeOAglxuXHQgICAgICAgIOeEtuWQjueUqCBKU09OLVNjaGVtYSDmoKHpqoznnJ/lrp7mlbDmja7vvIzmoKHpqozpobnljIXmi6zlsZ7mgKflkI3jgIHlgLznsbvlnovjgIHlgLzjgIHlgLznlJ/miJDop4TliJnjgIJcblxuXHQgICAg5o+Q56S65L+h5oGvIFxuXHQgICAgaHR0cHM6Ly9naXRodWIuY29tL2ZnZS9qc29uLXNjaGVtYS12YWxpZGF0b3IvYmxvYi9tYXN0ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9naXRodWIvZmdlL2pzb25zY2hlbWEvdmFsaWRhdG9yL3ZhbGlkYXRpb24ucHJvcGVydGllc1xuXHQgICAgW0pTT04tU2NoYW1hIHZhbGlkYXRvcl0oaHR0cDovL2pzb24tc2NoZW1hLXZhbGlkYXRvci5oZXJva3VhcHAuY29tLylcblx0ICAgIFtSZWdleHAgRGVtb10oaHR0cDovL2RlbW9zLmZvcmJlc2xpbmRlc2F5LmNvLnVrL3JlZ2V4cC8pXG5cdCovXG5cdHZhciBDb25zdGFudCA9IF9fd2VicGFja19yZXF1aXJlX18oMilcblx0dmFyIFV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG5cdHZhciB0b0pTT05TY2hlbWEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKVxuXG5cdGZ1bmN0aW9uIHZhbGlkKHRlbXBsYXRlLCBkYXRhKSB7XG5cdCAgICB2YXIgc2NoZW1hID0gdG9KU09OU2NoZW1hKHRlbXBsYXRlKVxuXHQgICAgdmFyIHJlc3VsdCA9IERpZmYuZGlmZihzY2hlbWEsIGRhdGEpXG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIC8vIGNvbnNvbGUubG9nKHRlbXBsYXRlLCBkYXRhKVxuXHQgICAgICAgIC8vIGNvbnNvbGUud2FybihBc3NlcnQubWVzc2FnZShyZXN1bHRbaV0pKVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdFxuXHR9XG5cblx0Lypcblx0ICAgICMjIG5hbWVcblx0ICAgICAgICDmnInnlJ/miJDop4TliJnvvJrmr5TovoPop6PmnpDlkI7nmoQgbmFtZVxuXHQgICAgICAgIOaXoOeUn+aIkOinhOWIme+8muebtOaOpeavlOi+g1xuXHQgICAgIyMgdHlwZVxuXHQgICAgICAgIOaXoOexu+Wei+i9rOaNou+8muebtOaOpeavlOi+g1xuXHQgICAgICAgIOacieexu+Wei+i9rOaNou+8muWFiOivleedgOino+aekCB0ZW1wbGF0Ze+8jOeEtuWQjuWGjeajgOafpe+8n1xuXHQgICAgIyMgdmFsdWUgdnMuIHRlbXBsYXRlXG5cdCAgICAgICAg5Z+65pys57G75Z6LXG5cdCAgICAgICAgICAgIOaXoOeUn+aIkOinhOWIme+8muebtOaOpeavlOi+g1xuXHQgICAgICAgICAgICDmnInnlJ/miJDop4TliJnvvJpcblx0ICAgICAgICAgICAgICAgIG51bWJlclxuXHQgICAgICAgICAgICAgICAgICAgIG1pbi1tYXguZG1pbi1kbWF4XG5cdCAgICAgICAgICAgICAgICAgICAgbWluLW1heC5kY291bnRcblx0ICAgICAgICAgICAgICAgICAgICBjb3VudC5kbWluLWRtYXhcblx0ICAgICAgICAgICAgICAgICAgICBjb3VudC5kY291bnRcblx0ICAgICAgICAgICAgICAgICAgICArc3RlcFxuXHQgICAgICAgICAgICAgICAgICAgIOaVtOaVsOmDqOWIhlxuXHQgICAgICAgICAgICAgICAgICAgIOWwj+aVsOmDqOWIhlxuXHQgICAgICAgICAgICAgICAgYm9vbGVhbiBcblx0ICAgICAgICAgICAgICAgIHN0cmluZyAgXG5cdCAgICAgICAgICAgICAgICAgICAgbWluLW1heFxuXHQgICAgICAgICAgICAgICAgICAgIGNvdW50XG5cdCAgICAjIyBwcm9wZXJ0aWVzXG5cdCAgICAgICAg5a+56LGhXG5cdCAgICAgICAgICAgIOacieeUn+aIkOinhOWIme+8muajgOa1i+acn+acm+eahOWxnuaAp+S4quaVsO+8jOe7p+e7remAkuW9klxuXHQgICAgICAgICAgICDml6DnlJ/miJDop4TliJnvvJrmo4DmtYvlhajpg6jnmoTlsZ7mgKfkuKrmlbDvvIznu6fnu63pgJLlvZJcblx0ICAgICMjIGl0ZW1zXG5cdCAgICAgICAg5pWw57uEXG5cdCAgICAgICAgICAgIOacieeUn+aIkOinhOWIme+8mlxuXHQgICAgICAgICAgICAgICAgYCduYW1lfDEnOiBbe30sIHt9IC4uLl1gICAgICAgICAgICAg5YW25Lit5LmL5LiA77yM57un57ut6YCS5b2SXG5cdCAgICAgICAgICAgICAgICBgJ25hbWV8KzEnOiBbe30sIHt9IC4uLl1gICAgICAgICAgICDpobrluo/mo4DmtYvvvIznu6fnu63pgJLlvZJcblx0ICAgICAgICAgICAgICAgIGAnbmFtZXxtaW4tbWF4JzogW3t9LCB7fSAuLi5dYCAgICAgIOajgOa1i+S4quaVsO+8jOe7p+e7remAkuW9klxuXHQgICAgICAgICAgICAgICAgYCduYW1lfGNvdW50JzogW3t9LCB7fSAuLi5dYCAgICAgICAg5qOA5rWL5Liq5pWw77yM57un57ut6YCS5b2SXG5cdCAgICAgICAgICAgIOaXoOeUn+aIkOinhOWIme+8muajgOa1i+WFqOmDqOeahOWFg+e0oOS4quaVsO+8jOe7p+e7remAkuW9klxuXHQqL1xuXHR2YXIgRGlmZiA9IHtcblx0ICAgIGRpZmY6IGZ1bmN0aW9uIGRpZmYoc2NoZW1hLCBkYXRhLCBuYW1lIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHQgICAgICAgIHZhciByZXN1bHQgPSBbXVxuXG5cdCAgICAgICAgLy8g5YWI5qOA5rWL5ZCN56ewIG5hbWUg5ZKM57G75Z6LIHR5cGXvvIzlpoLmnpzljLnphY3vvIzmiY3mnInlv4XopoHnu6fnu63mo4DmtYtcblx0ICAgICAgICBpZiAoXG5cdCAgICAgICAgICAgIHRoaXMubmFtZShzY2hlbWEsIGRhdGEsIG5hbWUsIHJlc3VsdCkgJiZcblx0ICAgICAgICAgICAgdGhpcy50eXBlKHNjaGVtYSwgZGF0YSwgbmFtZSwgcmVzdWx0KVxuXHQgICAgICAgICkge1xuXHQgICAgICAgICAgICB0aGlzLnZhbHVlKHNjaGVtYSwgZGF0YSwgbmFtZSwgcmVzdWx0KVxuXHQgICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBuYW1lLCByZXN1bHQpXG5cdCAgICAgICAgICAgIHRoaXMuaXRlbXMoc2NoZW1hLCBkYXRhLCBuYW1lLCByZXN1bHQpXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdFxuXHQgICAgfSxcblx0ICAgIC8qIGpzaGludCB1bnVzZWQ6ZmFsc2UgKi9cblx0ICAgIG5hbWU6IGZ1bmN0aW9uKHNjaGVtYSwgZGF0YSwgbmFtZSwgcmVzdWx0KSB7XG5cdCAgICAgICAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGhcblxuXHQgICAgICAgIEFzc2VydC5lcXVhbCgnbmFtZScsIHNjaGVtYS5wYXRoLCBuYW1lICsgJycsIHNjaGVtYS5uYW1lICsgJycsIHJlc3VsdClcblxuXHQgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgIH0sXG5cdCAgICB0eXBlOiBmdW5jdGlvbihzY2hlbWEsIGRhdGEsIG5hbWUsIHJlc3VsdCkge1xuXHQgICAgICAgIHZhciBsZW5ndGggPSByZXN1bHQubGVuZ3RoXG5cblx0ICAgICAgICBzd2l0Y2ggKHNjaGVtYS50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG5cdCAgICAgICAgICAgICAgICAvLyDot7Pov4flkKvmnInjgI7ljaDkvY3nrKbjgI/nmoTlsZ7mgKflgLzvvIzlm6DkuLrjgI7ljaDkvY3nrKbjgI/ov5Tlm57lgLznmoTnsbvlnovlj6/og73lkozmqKHmnb/kuI3kuIDoh7TvvIzkvovlpoIgJ0BpbnQnIOS8mui/lOWbnuS4gOS4quaVtOW9ouWAvFxuXHQgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS50ZW1wbGF0ZS5tYXRjaChDb25zdGFudC5SRV9QTEFDRUhPTERFUikpIHJldHVybiB0cnVlXG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICBjYXNlICdhcnJheSc6XG5cdCAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJ1bGUucGFyYW1ldGVycykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIG5hbWV8Y291bnQ6IGFycmF5XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5ydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHNjaGVtYS5ydWxlLm1heCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOi3s+i/hyBuYW1lfDE6IGFycmF577yM5Zug5Li65pyA57uI5YC855qE57G75Z6L77yI5b6I5Y+v6IO977yJ5LiN5piv5pWw57uE77yM5Lmf5LiN5LiA5a6a5LiOIGBhcnJheWAg5Lit55qE57G75Z6L5LiA6Ie0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEucnVsZS5jb3VudCA9PT0gMSkgcmV0dXJuIHRydWVcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLy8g6Lez6L+HIG5hbWV8K2luYzogYXJyYXlcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLnJ1bGUucGFyYW1ldGVyc1syXSkgcmV0dXJuIHRydWVcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrXG5cdCAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcblx0ICAgICAgICAgICAgICAgIC8vIOi3s+i/hyBgJ25hbWUnOiBmdW5jdGlvbmDvvIzlm6DkuLrlh73mlbDlj6/ku6Xov5Tlm57ku7vkvZXnsbvlnovnmoTlgLzjgIJcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgQXNzZXJ0LmVxdWFsKCd0eXBlJywgc2NoZW1hLnBhdGgsIFV0aWwudHlwZShkYXRhKSwgc2NoZW1hLnR5cGUsIHJlc3VsdClcblxuXHQgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24oc2NoZW1hLCBkYXRhLCBuYW1lLCByZXN1bHQpIHtcblx0ICAgICAgICB2YXIgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aFxuXG5cdCAgICAgICAgdmFyIHJ1bGUgPSBzY2hlbWEucnVsZVxuXHQgICAgICAgIHZhciB0ZW1wbGF0ZVR5cGUgPSBzY2hlbWEudHlwZVxuXHQgICAgICAgIGlmICh0ZW1wbGF0ZVR5cGUgPT09ICdvYmplY3QnIHx8IHRlbXBsYXRlVHlwZSA9PT0gJ2FycmF5JyB8fCB0ZW1wbGF0ZVR5cGUgPT09ICdmdW5jdGlvbicpIHJldHVybiB0cnVlXG5cblx0ICAgICAgICAvLyDml6DnlJ/miJDop4TliJlcblx0ICAgICAgICBpZiAoIXJ1bGUucGFyYW1ldGVycykge1xuXHQgICAgICAgICAgICBzd2l0Y2ggKHRlbXBsYXRlVHlwZSkge1xuXHQgICAgICAgICAgICAgICAgY2FzZSAncmVnZXhwJzpcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQubWF0Y2goJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIGRhdGEsIHNjaGVtYS50ZW1wbGF0ZSwgcmVzdWx0KVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG5cdCAgICAgICAgICAgICAgICAgICAgLy8g5ZCM5qC36Lez6L+H5ZCr5pyJ44CO5Y2g5L2N56ym44CP55qE5bGe5oCn5YC877yM5Zug5Li644CO5Y2g5L2N56ym44CP55qE6L+U5Zue5YC85Lya6YCa5bi45Lya5LiO5qih5p2/5LiN5LiA6Ie0XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS50ZW1wbGF0ZS5tYXRjaChDb25zdGFudC5SRV9QTEFDRUhPTERFUikpIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgICAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIEFzc2VydC5lcXVhbCgndmFsdWUnLCBzY2hlbWEucGF0aCwgZGF0YSwgc2NoZW1hLnRlbXBsYXRlLCByZXN1bHQpXG5cdCAgICAgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmnInnlJ/miJDop4TliJlcblx0ICAgICAgICB2YXIgYWN0dWFsUmVwZWF0Q291bnRcblx0ICAgICAgICBzd2l0Y2ggKHRlbXBsYXRlVHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlICdudW1iZXInOlxuXHQgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gKGRhdGEgKyAnJykuc3BsaXQoJy4nKVxuXHQgICAgICAgICAgICAgICAgcGFydHNbMF0gPSArcGFydHNbMF1cblxuXHQgICAgICAgICAgICAgICAgLy8g5pW05pWw6YOo5YiGXG5cdCAgICAgICAgICAgICAgICAvLyB8bWluLW1heFxuXHQgICAgICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgcnVsZS5tYXggIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIEFzc2VydC5ncmVhdGVyVGhhbk9yRXF1YWxUbygndmFsdWUnLCBzY2hlbWEucGF0aCwgcGFydHNbMF0sIE1hdGgubWluKHJ1bGUubWluLCBydWxlLm1heCksIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gLCAnbnVtZXJpYyBpbnN0YW5jZSBpcyBsb3dlciB0aGFuIHRoZSByZXF1aXJlZCBtaW5pbXVtIChtaW5pbXVtOiB7ZXhwZWN0ZWR9LCBmb3VuZDoge2FjdHVhbH0pJylcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQubGVzc1RoYW5PckVxdWFsVG8oJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIHBhcnRzWzBdLCBNYXRoLm1heChydWxlLm1pbiwgcnVsZS5tYXgpLCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyB8Y291bnRcblx0ICAgICAgICAgICAgICAgIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJ1bGUubWF4ID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZXF1YWwoJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIHBhcnRzWzBdLCBydWxlLm1pbiwgcmVzdWx0LCAnW3ZhbHVlXSAnICsgbmFtZSlcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8g5bCP5pWw6YOo5YiGXG5cdCAgICAgICAgICAgICAgICBpZiAocnVsZS5kZWNpbWFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gfGRtaW4tZG1heFxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmRtaW4gIT09IHVuZGVmaW5lZCAmJiBydWxlLmRtYXggIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZ3JlYXRlclRoYW5PckVxdWFsVG8oJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIHBhcnRzWzFdLmxlbmd0aCwgcnVsZS5kbWluLCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5sZXNzVGhhbk9yRXF1YWxUbygndmFsdWUnLCBzY2hlbWEucGF0aCwgcGFydHNbMV0ubGVuZ3RoLCBydWxlLmRtYXgsIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gfGRjb3VudFxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmRtaW4gIT09IHVuZGVmaW5lZCAmJiBydWxlLmRtYXggPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZXF1YWwoJ3ZhbHVlJywgc2NoZW1hLnBhdGgsIHBhcnRzWzFdLmxlbmd0aCwgcnVsZS5kbWluLCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBicmVha1xuXG5cdCAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblxuXHQgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuXHQgICAgICAgICAgICAgICAgLy8gJ2FhYScubWF0Y2goL2EvZylcblx0ICAgICAgICAgICAgICAgIGFjdHVhbFJlcGVhdENvdW50ID0gZGF0YS5tYXRjaChuZXcgUmVnRXhwKHNjaGVtYS50ZW1wbGF0ZSwgJ2cnKSlcblx0ICAgICAgICAgICAgICAgIGFjdHVhbFJlcGVhdENvdW50ID0gYWN0dWFsUmVwZWF0Q291bnQgPyBhY3R1YWxSZXBlYXRDb3VudC5sZW5ndGggOiAwXG5cblx0ICAgICAgICAgICAgICAgIC8vIHxtaW4tbWF4XG5cdCAgICAgICAgICAgICAgICBpZiAocnVsZS5taW4gIT09IHVuZGVmaW5lZCAmJiBydWxlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmdyZWF0ZXJUaGFuT3JFcXVhbFRvKCdyZXBlYXQgY291bnQnLCBzY2hlbWEucGF0aCwgYWN0dWFsUmVwZWF0Q291bnQsIHJ1bGUubWluLCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICAgICAgQXNzZXJ0Lmxlc3NUaGFuT3JFcXVhbFRvKCdyZXBlYXQgY291bnQnLCBzY2hlbWEucGF0aCwgYWN0dWFsUmVwZWF0Q291bnQsIHJ1bGUubWF4LCByZXN1bHQpXG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyB8Y291bnRcblx0ICAgICAgICAgICAgICAgIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJ1bGUubWF4ID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZXF1YWwoJ3JlcGVhdCBjb3VudCcsIHNjaGVtYS5wYXRoLCBhY3R1YWxSZXBlYXRDb3VudCwgcnVsZS5taW4sIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblxuXHQgICAgICAgICAgICBjYXNlICdyZWdleHAnOlxuXHQgICAgICAgICAgICAgICAgYWN0dWFsUmVwZWF0Q291bnQgPSBkYXRhLm1hdGNoKG5ldyBSZWdFeHAoc2NoZW1hLnRlbXBsYXRlLnNvdXJjZS5yZXBsYWNlKC9eXFxefFxcJCQvZywgJycpLCAnZycpKVxuXHQgICAgICAgICAgICAgICAgYWN0dWFsUmVwZWF0Q291bnQgPSBhY3R1YWxSZXBlYXRDb3VudCA/IGFjdHVhbFJlcGVhdENvdW50Lmxlbmd0aCA6IDBcblxuXHQgICAgICAgICAgICAgICAgLy8gfG1pbi1tYXhcblx0ICAgICAgICAgICAgICAgIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJ1bGUubWF4ICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZ3JlYXRlclRoYW5PckVxdWFsVG8oJ3JlcGVhdCBjb3VudCcsIHNjaGVtYS5wYXRoLCBhY3R1YWxSZXBlYXRDb3VudCwgcnVsZS5taW4sIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgICAgICBBc3NlcnQubGVzc1RoYW5PckVxdWFsVG8oJ3JlcGVhdCBjb3VudCcsIHNjaGVtYS5wYXRoLCBhY3R1YWxSZXBlYXRDb3VudCwgcnVsZS5tYXgsIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIHxjb3VudFxuXHQgICAgICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgcnVsZS5tYXggPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIEFzc2VydC5lcXVhbCgncmVwZWF0IGNvdW50Jywgc2NoZW1hLnBhdGgsIGFjdHVhbFJlcGVhdENvdW50LCBydWxlLm1pbiwgcmVzdWx0KVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gbGVuZ3RoXG5cdCAgICB9LFxuXHQgICAgcHJvcGVydGllczogZnVuY3Rpb24oc2NoZW1hLCBkYXRhLCBuYW1lLCByZXN1bHQpIHtcblx0ICAgICAgICB2YXIgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aFxuXG5cdCAgICAgICAgdmFyIHJ1bGUgPSBzY2hlbWEucnVsZVxuXHQgICAgICAgIHZhciBrZXlzID0gVXRpbC5rZXlzKGRhdGEpXG5cdCAgICAgICAgaWYgKCFzY2hlbWEucHJvcGVydGllcykgcmV0dXJuXG5cblx0ICAgICAgICAvLyDml6DnlJ/miJDop4TliJlcblx0ICAgICAgICBpZiAoIXNjaGVtYS5ydWxlLnBhcmFtZXRlcnMpIHtcblx0ICAgICAgICAgICAgQXNzZXJ0LmVxdWFsKCdwcm9wZXJ0aWVzIGxlbmd0aCcsIHNjaGVtYS5wYXRoLCBrZXlzLmxlbmd0aCwgc2NoZW1hLnByb3BlcnRpZXMubGVuZ3RoLCByZXN1bHQpXG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgLy8g5pyJ55Sf5oiQ6KeE5YiZXG5cdCAgICAgICAgICAgIC8vIHxtaW4tbWF4XG5cdCAgICAgICAgICAgIGlmIChydWxlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJ1bGUubWF4ICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIEFzc2VydC5ncmVhdGVyVGhhbk9yRXF1YWxUbygncHJvcGVydGllcyBsZW5ndGgnLCBzY2hlbWEucGF0aCwga2V5cy5sZW5ndGgsIE1hdGgubWluKHJ1bGUubWluLCBydWxlLm1heCksIHJlc3VsdClcblx0ICAgICAgICAgICAgICAgIEFzc2VydC5sZXNzVGhhbk9yRXF1YWxUbygncHJvcGVydGllcyBsZW5ndGgnLCBzY2hlbWEucGF0aCwga2V5cy5sZW5ndGgsIE1hdGgubWF4KHJ1bGUubWluLCBydWxlLm1heCksIHJlc3VsdClcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyB8Y291bnRcblx0ICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgcnVsZS5tYXggPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgLy8gfDEsIHw+MVxuXHQgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY291bnQgIT09IDEpIEFzc2VydC5lcXVhbCgncHJvcGVydGllcyBsZW5ndGgnLCBzY2hlbWEucGF0aCwga2V5cy5sZW5ndGgsIHJ1bGUubWluLCByZXN1bHQpXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gbGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICByZXN1bHQucHVzaC5hcHBseShcblx0ICAgICAgICAgICAgICAgIHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgIHRoaXMuZGlmZihcblx0ICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuZWFjaChzY2hlbWEucHJvcGVydGllcywgZnVuY3Rpb24oaXRlbSAvKiwgaW5kZXgqLyApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09IGtleXNbaV0pIHByb3BlcnR5ID0gaXRlbVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHkgfHwgc2NoZW1hLnByb3BlcnRpZXNbaV1cblx0ICAgICAgICAgICAgICAgICAgICB9KCksXG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXlzW2ldXSxcblx0ICAgICAgICAgICAgICAgICAgICBrZXlzW2ldXG5cdCAgICAgICAgICAgICAgICApXG5cdCAgICAgICAgICAgIClcblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gbGVuZ3RoXG5cdCAgICB9LFxuXHQgICAgaXRlbXM6IGZ1bmN0aW9uKHNjaGVtYSwgZGF0YSwgbmFtZSwgcmVzdWx0KSB7XG5cdCAgICAgICAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGhcblxuXHQgICAgICAgIGlmICghc2NoZW1hLml0ZW1zKSByZXR1cm5cblxuXHQgICAgICAgIHZhciBydWxlID0gc2NoZW1hLnJ1bGVcblxuXHQgICAgICAgIC8vIOaXoOeUn+aIkOinhOWImVxuXHQgICAgICAgIGlmICghc2NoZW1hLnJ1bGUucGFyYW1ldGVycykge1xuXHQgICAgICAgICAgICBBc3NlcnQuZXF1YWwoJ2l0ZW1zIGxlbmd0aCcsIHNjaGVtYS5wYXRoLCBkYXRhLmxlbmd0aCwgc2NoZW1hLml0ZW1zLmxlbmd0aCwgcmVzdWx0KVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIC8vIOacieeUn+aIkOinhOWImVxuXHQgICAgICAgICAgICAvLyB8bWluLW1heFxuXHQgICAgICAgICAgICBpZiAocnVsZS5taW4gIT09IHVuZGVmaW5lZCAmJiBydWxlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICBBc3NlcnQuZ3JlYXRlclRoYW5PckVxdWFsVG8oJ2l0ZW1zJywgc2NoZW1hLnBhdGgsIGRhdGEubGVuZ3RoLCAoTWF0aC5taW4ocnVsZS5taW4sIHJ1bGUubWF4KSAqIHNjaGVtYS5pdGVtcy5sZW5ndGgpLCByZXN1bHQsXG5cdCAgICAgICAgICAgICAgICAgICAgJ1t7dXR5cGV9XSBhcnJheSBpcyB0b28gc2hvcnQ6IHtwYXRofSBtdXN0IGhhdmUgYXQgbGVhc3Qge2V4cGVjdGVkfSBlbGVtZW50cyBidXQgaW5zdGFuY2UgaGFzIHthY3R1YWx9IGVsZW1lbnRzJylcblx0ICAgICAgICAgICAgICAgIEFzc2VydC5sZXNzVGhhbk9yRXF1YWxUbygnaXRlbXMnLCBzY2hlbWEucGF0aCwgZGF0YS5sZW5ndGgsIChNYXRoLm1heChydWxlLm1pbiwgcnVsZS5tYXgpICogc2NoZW1hLml0ZW1zLmxlbmd0aCksIHJlc3VsdCxcblx0ICAgICAgICAgICAgICAgICAgICAnW3t1dHlwZX1dIGFycmF5IGlzIHRvbyBsb25nOiB7cGF0aH0gbXVzdCBoYXZlIGF0IG1vc3Qge2V4cGVjdGVkfSBlbGVtZW50cyBidXQgaW5zdGFuY2UgaGFzIHthY3R1YWx9IGVsZW1lbnRzJylcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyB8Y291bnRcblx0ICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgcnVsZS5tYXggPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgLy8gfDEsIHw+MVxuXHQgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY291bnQgPT09IDEpIHJldHVybiByZXN1bHQubGVuZ3RoID09PSBsZW5ndGhcblx0ICAgICAgICAgICAgICAgIGVsc2UgQXNzZXJ0LmVxdWFsKCdpdGVtcyBsZW5ndGgnLCBzY2hlbWEucGF0aCwgZGF0YS5sZW5ndGgsIChydWxlLm1pbiAqIHNjaGVtYS5pdGVtcy5sZW5ndGgpLCByZXN1bHQpXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gfCtpbmNcblx0ICAgICAgICAgICAgaWYgKHJ1bGUucGFyYW1ldGVyc1syXSkgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IGxlbmd0aFxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSBsZW5ndGgpIHJldHVybiBmYWxzZVxuXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHJlc3VsdC5wdXNoLmFwcGx5KFxuXHQgICAgICAgICAgICAgICAgcmVzdWx0LFxuXHQgICAgICAgICAgICAgICAgdGhpcy5kaWZmKFxuXHQgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5pdGVtc1tpICUgc2NoZW1hLml0ZW1zLmxlbmd0aF0sXG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YVtpXSxcblx0ICAgICAgICAgICAgICAgICAgICBpICUgc2NoZW1hLml0ZW1zLmxlbmd0aFxuXHQgICAgICAgICAgICAgICAgKVxuXHQgICAgICAgICAgICApXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IGxlbmd0aFxuXHQgICAgfVxuXHR9XG5cblx0Lypcblx0ICAgIOWujOWWhOOAgeWPi+WlveeahOaPkOekuuS/oeaBr1xuXHQgICAgXG5cdCAgICBFcXVhbCwgbm90IGVxdWFsIHRvLCBncmVhdGVyIHRoYW4sIGxlc3MgdGhhbiwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLCBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cblx0ICAgIOi3r+W+hCDpqozor4Hnsbvlnosg5o+P6L+wIFxuXG5cdCAgICBFeHBlY3QgcGF0aC5uYW1lIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBleHBlY3RlZCwgYnV0IHBhdGgubmFtZSBpcyBhY3R1YWwuXG5cblx0ICAgIEV4cGVjdCBwYXRoLm5hbWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGV4cGVjdGVkLCBidXQgcGF0aC5uYW1lIGlzIGFjdHVhbC5cblx0ICAgIEV4cGVjdCBwYXRoLm5hbWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGV4cGVjdGVkLCBidXQgcGF0aC5uYW1lIGlzIGFjdHVhbC5cblxuXHQqL1xuXHR2YXIgQXNzZXJ0ID0ge1xuXHQgICAgbWVzc2FnZTogZnVuY3Rpb24oaXRlbSkge1xuXHQgICAgICAgIHJldHVybiAoaXRlbS5tZXNzYWdlIHx8XG5cdCAgICAgICAgICAgICAgICAnW3t1dHlwZX1dIEV4cGVjdCB7cGF0aH1cXCd7bHR5cGV9IHthY3Rpb259IHtleHBlY3RlZH0sIGJ1dCBpcyB7YWN0dWFsfScpXG5cdCAgICAgICAgICAgIC5yZXBsYWNlKCd7dXR5cGV9JywgaXRlbS50eXBlLnRvVXBwZXJDYXNlKCkpXG5cdCAgICAgICAgICAgIC5yZXBsYWNlKCd7bHR5cGV9JywgaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkpXG5cdCAgICAgICAgICAgIC5yZXBsYWNlKCd7cGF0aH0nLCBVdGlsLmlzQXJyYXkoaXRlbS5wYXRoKSAmJiBpdGVtLnBhdGguam9pbignLicpIHx8IGl0ZW0ucGF0aClcblx0ICAgICAgICAgICAgLnJlcGxhY2UoJ3thY3Rpb259JywgaXRlbS5hY3Rpb24pXG5cdCAgICAgICAgICAgIC5yZXBsYWNlKCd7ZXhwZWN0ZWR9JywgaXRlbS5leHBlY3RlZClcblx0ICAgICAgICAgICAgLnJlcGxhY2UoJ3thY3R1YWx9JywgaXRlbS5hY3R1YWwpXG5cdCAgICB9LFxuXHQgICAgZXF1YWw6IGZ1bmN0aW9uKHR5cGUsIHBhdGgsIGFjdHVhbCwgZXhwZWN0ZWQsIHJlc3VsdCwgbWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHN3aXRjaCAodHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlICd0eXBlJzpcblx0ICAgICAgICAgICAgICAgIC8vIOato+WImeaooeadvyA9PT0g5a2X56ym5Liy5pyA57uI5YC8XG5cdCAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgPT09ICdyZWdleHAnICYmIGFjdHVhbCA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlXG5cdCAgICAgICAgICAgICAgICBicmVha1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBlcXVhbCB0bycsXG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2Vcblx0ICAgICAgICB9XG5cdCAgICAgICAgaXRlbS5tZXNzYWdlID0gQXNzZXJ0Lm1lc3NhZ2UoaXRlbSlcblx0ICAgICAgICByZXN1bHQucHVzaChpdGVtKVxuXHQgICAgICAgIHJldHVybiBmYWxzZVxuXHQgICAgfSxcblx0ICAgIC8vIGFjdHVhbCBtYXRjaGVzIGV4cGVjdGVkXG5cdCAgICBtYXRjaDogZnVuY3Rpb24odHlwZSwgcGF0aCwgYWN0dWFsLCBleHBlY3RlZCwgcmVzdWx0LCBtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKGV4cGVjdGVkLnRlc3QoYWN0dWFsKSkgcmV0dXJuIHRydWVcblxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdtYXRjaGVzJyxcblx0ICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpdGVtLm1lc3NhZ2UgPSBBc3NlcnQubWVzc2FnZShpdGVtKVxuXHQgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pXG5cdCAgICAgICAgcmV0dXJuIGZhbHNlXG5cdCAgICB9LFxuXHQgICAgbm90RXF1YWw6IGZ1bmN0aW9uKHR5cGUsIHBhdGgsIGFjdHVhbCwgZXhwZWN0ZWQsIHJlc3VsdCwgbWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBub3QgZXF1YWwgdG8nLFxuXHQgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlXG5cdCAgICAgICAgfVxuXHQgICAgICAgIGl0ZW0ubWVzc2FnZSA9IEFzc2VydC5tZXNzYWdlKGl0ZW0pXG5cdCAgICAgICAgcmVzdWx0LnB1c2goaXRlbSlcblx0ICAgICAgICByZXR1cm4gZmFsc2Vcblx0ICAgIH0sXG5cdCAgICBncmVhdGVyVGhhbjogZnVuY3Rpb24odHlwZSwgcGF0aCwgYWN0dWFsLCBleHBlY3RlZCwgcmVzdWx0LCBtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKGFjdHVhbCA+IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBncmVhdGVyIHRoYW4nLFxuXHQgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlXG5cdCAgICAgICAgfVxuXHQgICAgICAgIGl0ZW0ubWVzc2FnZSA9IEFzc2VydC5tZXNzYWdlKGl0ZW0pXG5cdCAgICAgICAgcmVzdWx0LnB1c2goaXRlbSlcblx0ICAgICAgICByZXR1cm4gZmFsc2Vcblx0ICAgIH0sXG5cdCAgICBsZXNzVGhhbjogZnVuY3Rpb24odHlwZSwgcGF0aCwgYWN0dWFsLCBleHBlY3RlZCwgcmVzdWx0LCBtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKGFjdHVhbCA8IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBsZXNzIHRvJyxcblx0ICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpdGVtLm1lc3NhZ2UgPSBBc3NlcnQubWVzc2FnZShpdGVtKVxuXHQgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pXG5cdCAgICAgICAgcmV0dXJuIGZhbHNlXG5cdCAgICB9LFxuXHQgICAgZ3JlYXRlclRoYW5PckVxdWFsVG86IGZ1bmN0aW9uKHR5cGUsIHBhdGgsIGFjdHVhbCwgZXhwZWN0ZWQsIHJlc3VsdCwgbWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChhY3R1YWwgPj0gZXhwZWN0ZWQpIHJldHVybiB0cnVlXG5cdCAgICAgICAgdmFyIGl0ZW0gPSB7XG5cdCAgICAgICAgICAgIHBhdGg6IHBhdGgsXG5cdCAgICAgICAgICAgIHR5cGU6IHR5cGUsXG5cdCAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuXHQgICAgICAgICAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG5cdCAgICAgICAgICAgIGFjdGlvbjogJ2lzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bycsXG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2Vcblx0ICAgICAgICB9XG5cdCAgICAgICAgaXRlbS5tZXNzYWdlID0gQXNzZXJ0Lm1lc3NhZ2UoaXRlbSlcblx0ICAgICAgICByZXN1bHQucHVzaChpdGVtKVxuXHQgICAgICAgIHJldHVybiBmYWxzZVxuXHQgICAgfSxcblx0ICAgIGxlc3NUaGFuT3JFcXVhbFRvOiBmdW5jdGlvbih0eXBlLCBwYXRoLCBhY3R1YWwsIGV4cGVjdGVkLCByZXN1bHQsIG1lc3NhZ2UpIHtcblx0ICAgICAgICBpZiAoYWN0dWFsIDw9IGV4cGVjdGVkKSByZXR1cm4gdHJ1ZVxuXHQgICAgICAgIHZhciBpdGVtID0ge1xuXHQgICAgICAgICAgICBwYXRoOiBwYXRoLFxuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcblx0ICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuXHQgICAgICAgICAgICBhY3Rpb246ICdpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8nLFxuXHQgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlXG5cdCAgICAgICAgfVxuXHQgICAgICAgIGl0ZW0ubWVzc2FnZSA9IEFzc2VydC5tZXNzYWdlKGl0ZW0pXG5cdCAgICAgICAgcmVzdWx0LnB1c2goaXRlbSlcblx0ICAgICAgICByZXR1cm4gZmFsc2Vcblx0ICAgIH1cblx0fVxuXG5cdHZhbGlkLkRpZmYgPSBEaWZmXG5cdHZhbGlkLkFzc2VydCA9IEFzc2VydFxuXG5cdG1vZHVsZS5leHBvcnRzID0gdmFsaWRcblxuLyoqKi8gfSksXG4vKiAyNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOClcblxuLyoqKi8gfSksXG4vKiAyOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qIGdsb2JhbCB3aW5kb3csIGRvY3VtZW50LCBsb2NhdGlvbiwgRXZlbnQsIHNldFRpbWVvdXQgKi9cblx0Lypcblx0ICAgICMjIE1vY2tYTUxIdHRwUmVxdWVzdFxuXG5cdCAgICDmnJ/mnJvnmoTlip/og73vvJpcblx0ICAgIDEuIOWujOaVtOWcsOimhuebluWOn+eUnyBYSFIg55qE6KGM5Li6XG5cdCAgICAyLiDlrozmlbTlnLDmqKHmi5/ljp/nlJ8gWEhSIOeahOihjOS4ulxuXHQgICAgMy4g5Zyo5Y+R6LW36K+35rGC5pe277yM6Ieq5Yqo5qOA5rWL5piv5ZCm6ZyA6KaB5oum5oiqXG5cdCAgICA0LiDlpoLmnpzkuI3lv4Xmi6bmiKrvvIzliJnmiafooYzljp/nlJ8gWEhSIOeahOihjOS4ulxuXHQgICAgNS4g5aaC5p6c6ZyA6KaB5oum5oiq77yM5YiZ5omn6KGM6Jma5oufIFhIUiDnmoTooYzkuLpcblx0ICAgIDYuIOWFvOWuuSBYTUxIdHRwUmVxdWVzdCDlkowgQWN0aXZlWE9iamVjdFxuXHQgICAgICAgIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKVxuXHQgICAgICAgIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQXCIpXG5cblx0ICAgIOWFs+mUruaWueazleeahOmAu+i+ke+8mlxuXHQgICAgKiBuZXcgICDmraTml7blsJrml6Dms5Xnoa7lrprmmK/lkKbpnIDopoHmi6bmiKrvvIzmiYDku6XliJvlu7rljp/nlJ8gWEhSIOWvueixoeaYr+W/hemhu+eahOOAglxuXHQgICAgKiBvcGVuICDmraTml7blj6/ku6Xlj5bliLAgVVJM77yM5Y+v5Lul5Yaz5a6a5piv5ZCm6L+b6KGM5oum5oiq44CCXG5cdCAgICAqIHNlbmQgIOatpOaXtuW3sue7j+ehruWumuS6huivt+axguaWueW8j+OAglxuXG5cdCAgICDop4TojIPvvJpcblx0ICAgIGh0dHA6Ly94aHIuc3BlYy53aGF0d2cub3JnL1xuXHQgICAgaHR0cDovL3d3dy53My5vcmcvVFIvWE1MSHR0cFJlcXVlc3QyL1xuXG5cdCAgICDlj4LogIPlrp7njrDvvJpcblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsaWtvbi9Nb2NrSHR0cFJlcXVlc3QvYmxvYi9tYXN0ZXIvbGliL21vY2suanNcblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS90cmVrL0Zha2VYTUxIdHRwUmVxdWVzdC9ibG9iL21hc3Rlci9mYWtlX3htbF9odHRwX3JlcXVlc3QuanNcblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9pbGluc2t5L3htbGh0dHByZXF1ZXN0L2Jsb2IvbWFzdGVyL1hNTEh0dHBSZXF1ZXN0LmpzXG5cdCAgICBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJ1Zy9maXJlYnVnLWxpdGUvYmxvYi9tYXN0ZXIvY29udGVudC9saXRlL3hoci5qc1xuXHQgICAgaHR0cHM6Ly9naXRodWIuY29tL3RoeC9SQVAvYmxvYi9tYXN0ZXIvbGFiL3JhcC5wbHVnaW4ueGluZ2xpZS5qc1xuXG5cdCAgICAqKumcgOS4jemcgOimgeWFqOmdoumHjeWGmSBYTUxIdHRwUmVxdWVzdO+8nyoqXG5cdCAgICAgICAgaHR0cDovL3hoci5zcGVjLndoYXR3Zy5vcmcvI2ludGVyZmFjZS14bWxodHRwcmVxdWVzdFxuXHQgICAgICAgIOWFs+mUruWxnuaApyByZWFkeVN0YXRl44CBc3RhdHVz44CBc3RhdHVzVGV4dOOAgXJlc3BvbnNl44CBcmVzcG9uc2VUZXh044CBcmVzcG9uc2VYTUwg5pivIHJlYWRvbmx577yM5omA5Lul77yM6K+V5Zu+6YCa6L+H5L+u5pS56L+Z5Lqb54q25oCB77yM5p2l5qih5ouf5ZON5bqU5piv5LiN5Y+v6KGM55qE44CCXG5cdCAgICAgICAg5Zug5q2k77yM5ZSv5LiA55qE5Yqe5rOV5piv5qih5ouf5pW05LiqIFhNTEh0dHBSZXF1ZXN077yM5bCx5YOPIGpRdWVyeSDlr7nkuovku7bmqKHlnovnmoTlsIHoo4XjgIJcblxuXHQgICAgLy8gRXZlbnQgaGFuZGxlcnNcblx0ICAgIG9ubG9hZHN0YXJ0ICAgICAgICAgbG9hZHN0YXJ0XG5cdCAgICBvbnByb2dyZXNzICAgICAgICAgIHByb2dyZXNzXG5cdCAgICBvbmFib3J0ICAgICAgICAgICAgIGFib3J0XG5cdCAgICBvbmVycm9yICAgICAgICAgICAgIGVycm9yXG5cdCAgICBvbmxvYWQgICAgICAgICAgICAgIGxvYWRcblx0ICAgIG9udGltZW91dCAgICAgICAgICAgdGltZW91dFxuXHQgICAgb25sb2FkZW5kICAgICAgICAgICBsb2FkZW5kXG5cdCAgICBvbnJlYWR5c3RhdGVjaGFuZ2UgIHJlYWR5c3RhdGVjaGFuZ2Vcblx0ICovXG5cblx0dmFyIFV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG5cblx0Ly8g5aSH5Lu95Y6f55SfIFhNTEh0dHBSZXF1ZXN0XG5cdHdpbmRvdy5fWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3Rcblx0d2luZG93Ll9BY3RpdmVYT2JqZWN0ID0gd2luZG93LkFjdGl2ZVhPYmplY3RcblxuXHQvKlxuXHQgICAgUGhhbnRvbUpTXG5cdCAgICBUeXBlRXJyb3I6ICdbb2JqZWN0IEV2ZW50Q29uc3RydWN0b3JdJyBpcyBub3QgYSBjb25zdHJ1Y3RvciAoZXZhbHVhdGluZyAnbmV3IEV2ZW50KFwicmVhZHlzdGF0ZWNoYW5nZVwiKScpXG5cblx0ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlcmFpbC90d2l0dGVyLWJvb3RzdHJhcC1yYWlscy1jb25maXJtL2lzc3Vlcy8xOFxuXHQgICAgaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9pc3N1ZXMvMTEyODlcblx0Ki9cblx0dHJ5IHtcblx0ICAgIG5ldyB3aW5kb3cuRXZlbnQoJ2N1c3RvbScpXG5cdH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuXHQgICAgd2luZG93LkV2ZW50ID0gZnVuY3Rpb24odHlwZSwgYnViYmxlcywgY2FuY2VsYWJsZSwgZGV0YWlsKSB7XG5cdCAgICAgICAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JykgLy8gTVVTVCBiZSAnQ3VzdG9tRXZlbnQnXG5cdCAgICAgICAgZXZlbnQuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGJ1YmJsZXMsIGNhbmNlbGFibGUsIGRldGFpbClcblx0ICAgICAgICByZXR1cm4gZXZlbnRcblx0ICAgIH1cblx0fVxuXG5cdHZhciBYSFJfU1RBVEVTID0ge1xuXHQgICAgLy8gVGhlIG9iamVjdCBoYXMgYmVlbiBjb25zdHJ1Y3RlZC5cblx0ICAgIFVOU0VOVDogMCxcblx0ICAgIC8vIFRoZSBvcGVuKCkgbWV0aG9kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbnZva2VkLlxuXHQgICAgT1BFTkVEOiAxLFxuXHQgICAgLy8gQWxsIHJlZGlyZWN0cyAoaWYgYW55KSBoYXZlIGJlZW4gZm9sbG93ZWQgYW5kIGFsbCBIVFRQIGhlYWRlcnMgb2YgdGhlIHJlc3BvbnNlIGhhdmUgYmVlbiByZWNlaXZlZC5cblx0ICAgIEhFQURFUlNfUkVDRUlWRUQ6IDIsXG5cdCAgICAvLyBUaGUgcmVzcG9uc2UncyBib2R5IGlzIGJlaW5nIHJlY2VpdmVkLlxuXHQgICAgTE9BRElORzogMyxcblx0ICAgIC8vIFRoZSBkYXRhIHRyYW5zZmVyIGhhcyBiZWVuIGNvbXBsZXRlZCBvciBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIHRyYW5zZmVyIChlLmcuIGluZmluaXRlIHJlZGlyZWN0cykuXG5cdCAgICBET05FOiA0XG5cdH1cblxuXHR2YXIgWEhSX0VWRU5UUyA9ICdyZWFkeXN0YXRlY2hhbmdlIGxvYWRzdGFydCBwcm9ncmVzcyBhYm9ydCBlcnJvciBsb2FkIHRpbWVvdXQgbG9hZGVuZCcuc3BsaXQoJyAnKVxuXHR2YXIgWEhSX1JFUVVFU1RfUFJPUEVSVElFUyA9ICd0aW1lb3V0IHdpdGhDcmVkZW50aWFscycuc3BsaXQoJyAnKVxuXHR2YXIgWEhSX1JFU1BPTlNFX1BST1BFUlRJRVMgPSAncmVhZHlTdGF0ZSByZXNwb25zZVVSTCBzdGF0dXMgc3RhdHVzVGV4dCByZXNwb25zZVR5cGUgcmVzcG9uc2UgcmVzcG9uc2VUZXh0IHJlc3BvbnNlWE1MJy5zcGxpdCgnICcpXG5cblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RyZWsvRmFrZVhNTEh0dHBSZXF1ZXN0L2Jsb2IvbWFzdGVyL2Zha2VfeG1sX2h0dHBfcmVxdWVzdC5qcyNMMzJcblx0dmFyIEhUVFBfU1RBVFVTX0NPREVTID0ge1xuXHQgICAgMTAwOiBcIkNvbnRpbnVlXCIsXG5cdCAgICAxMDE6IFwiU3dpdGNoaW5nIFByb3RvY29sc1wiLFxuXHQgICAgMjAwOiBcIk9LXCIsXG5cdCAgICAyMDE6IFwiQ3JlYXRlZFwiLFxuXHQgICAgMjAyOiBcIkFjY2VwdGVkXCIsXG5cdCAgICAyMDM6IFwiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25cIixcblx0ICAgIDIwNDogXCJObyBDb250ZW50XCIsXG5cdCAgICAyMDU6IFwiUmVzZXQgQ29udGVudFwiLFxuXHQgICAgMjA2OiBcIlBhcnRpYWwgQ29udGVudFwiLFxuXHQgICAgMzAwOiBcIk11bHRpcGxlIENob2ljZVwiLFxuXHQgICAgMzAxOiBcIk1vdmVkIFBlcm1hbmVudGx5XCIsXG5cdCAgICAzMDI6IFwiRm91bmRcIixcblx0ICAgIDMwMzogXCJTZWUgT3RoZXJcIixcblx0ICAgIDMwNDogXCJOb3QgTW9kaWZpZWRcIixcblx0ICAgIDMwNTogXCJVc2UgUHJveHlcIixcblx0ICAgIDMwNzogXCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcblx0ICAgIDQwMDogXCJCYWQgUmVxdWVzdFwiLFxuXHQgICAgNDAxOiBcIlVuYXV0aG9yaXplZFwiLFxuXHQgICAgNDAyOiBcIlBheW1lbnQgUmVxdWlyZWRcIixcblx0ICAgIDQwMzogXCJGb3JiaWRkZW5cIixcblx0ICAgIDQwNDogXCJOb3QgRm91bmRcIixcblx0ICAgIDQwNTogXCJNZXRob2QgTm90IEFsbG93ZWRcIixcblx0ICAgIDQwNjogXCJOb3QgQWNjZXB0YWJsZVwiLFxuXHQgICAgNDA3OiBcIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXG5cdCAgICA0MDg6IFwiUmVxdWVzdCBUaW1lb3V0XCIsXG5cdCAgICA0MDk6IFwiQ29uZmxpY3RcIixcblx0ICAgIDQxMDogXCJHb25lXCIsXG5cdCAgICA0MTE6IFwiTGVuZ3RoIFJlcXVpcmVkXCIsXG5cdCAgICA0MTI6IFwiUHJlY29uZGl0aW9uIEZhaWxlZFwiLFxuXHQgICAgNDEzOiBcIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZVwiLFxuXHQgICAgNDE0OiBcIlJlcXVlc3QtVVJJIFRvbyBMb25nXCIsXG5cdCAgICA0MTU6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuXHQgICAgNDE2OiBcIlJlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGVcIixcblx0ICAgIDQxNzogXCJFeHBlY3RhdGlvbiBGYWlsZWRcIixcblx0ICAgIDQyMjogXCJVbnByb2Nlc3NhYmxlIEVudGl0eVwiLFxuXHQgICAgNTAwOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuXHQgICAgNTAxOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuXHQgICAgNTAyOiBcIkJhZCBHYXRld2F5XCIsXG5cdCAgICA1MDM6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuXHQgICAgNTA0OiBcIkdhdGV3YXkgVGltZW91dFwiLFxuXHQgICAgNTA1OiBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCJcblx0fVxuXG5cdC8qXG5cdCAgICBNb2NrWE1MSHR0cFJlcXVlc3Rcblx0Ki9cblxuXHRmdW5jdGlvbiBNb2NrWE1MSHR0cFJlcXVlc3QoKSB7XG5cdCAgICAvLyDliJ3lp4vljJYgY3VzdG9tIOWvueixoe+8jOeUqOS6juWtmOWCqOiHquWumuS5ieWxnuaAp1xuXHQgICAgdGhpcy5jdXN0b20gPSB7XG5cdCAgICAgICAgZXZlbnRzOiB7fSxcblx0ICAgICAgICByZXF1ZXN0SGVhZGVyczoge30sXG5cdCAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiB7fVxuXHQgICAgfVxuXHR9XG5cblx0TW9ja1hNTEh0dHBSZXF1ZXN0Ll9zZXR0aW5ncyA9IHtcblx0ICAgIHRpbWVvdXQ6ICcxMC0xMDAnLFxuXHQgICAgLypcblx0ICAgICAgICB0aW1lb3V0OiA1MCxcblx0ICAgICAgICB0aW1lb3V0OiAnMTAtMTAwJyxcblx0ICAgICAqL1xuXHR9XG5cblx0TW9ja1hNTEh0dHBSZXF1ZXN0LnNldHVwID0gZnVuY3Rpb24oc2V0dGluZ3MpIHtcblx0ICAgIFV0aWwuZXh0ZW5kKE1vY2tYTUxIdHRwUmVxdWVzdC5fc2V0dGluZ3MsIHNldHRpbmdzKVxuXHQgICAgcmV0dXJuIE1vY2tYTUxIdHRwUmVxdWVzdC5fc2V0dGluZ3Ncblx0fVxuXG5cdFV0aWwuZXh0ZW5kKE1vY2tYTUxIdHRwUmVxdWVzdCwgWEhSX1NUQVRFUylcblx0VXRpbC5leHRlbmQoTW9ja1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwgWEhSX1NUQVRFUylcblxuXHQvLyDmoIforrDlvZPliY3lr7nosaHkuLogTW9ja1hNTEh0dHBSZXF1ZXN0XG5cdE1vY2tYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUubW9jayA9IHRydWVcblxuXHQvLyDmmK/lkKbmi6bmiKogQWpheCDor7fmsYJcblx0TW9ja1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5tYXRjaCA9IGZhbHNlXG5cblx0Ly8g5Yid5aeL5YyWIFJlcXVlc3Qg55u45YWz55qE5bGe5oCn5ZKM5pa55rOVXG5cdFV0aWwuZXh0ZW5kKE1vY2tYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUsIHtcblx0ICAgIC8vIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jdGhlLW9wZW4oKS1tZXRob2Rcblx0ICAgIC8vIFNldHMgdGhlIHJlcXVlc3QgbWV0aG9kLCByZXF1ZXN0IFVSTCwgYW5kIHN5bmNocm9ub3VzIGZsYWcuXG5cdCAgICBvcGVuOiBmdW5jdGlvbihtZXRob2QsIHVybCwgYXN5bmMsIHVzZXJuYW1lLCBwYXNzd29yZCkge1xuXHQgICAgICAgIHZhciB0aGF0ID0gdGhpc1xuXG5cdCAgICAgICAgVXRpbC5leHRlbmQodGhpcy5jdXN0b20sIHtcblx0ICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG5cdCAgICAgICAgICAgIHVybDogdXJsLFxuXHQgICAgICAgICAgICBhc3luYzogdHlwZW9mIGFzeW5jID09PSAnYm9vbGVhbicgPyBhc3luYyA6IHRydWUsXG5cdCAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcblx0ICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuXHQgICAgICAgICAgICBvcHRpb25zOiB7XG5cdCAgICAgICAgICAgICAgICB1cmw6IHVybCxcblx0ICAgICAgICAgICAgICAgIHR5cGU6IG1ldGhvZFxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSlcblxuXHQgICAgICAgIHRoaXMuY3VzdG9tLnRpbWVvdXQgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgdGltZW91dCA9PT0gJ251bWJlcicpIHJldHVybiB0aW1lb3V0XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgdGltZW91dCA9PT0gJ3N0cmluZycgJiYgIX50aW1lb3V0LmluZGV4T2YoJy0nKSkgcmV0dXJuIHBhcnNlSW50KHRpbWVvdXQsIDEwKVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIHRpbWVvdXQgPT09ICdzdHJpbmcnICYmIH50aW1lb3V0LmluZGV4T2YoJy0nKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHRpbWVvdXQuc3BsaXQoJy0nKVxuXHQgICAgICAgICAgICAgICAgdmFyIG1pbiA9IHBhcnNlSW50KHRtcFswXSwgMTApXG5cdCAgICAgICAgICAgICAgICB2YXIgbWF4ID0gcGFyc2VJbnQodG1wWzFdLCAxMClcblx0ICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW5cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0oTW9ja1hNTEh0dHBSZXF1ZXN0Ll9zZXR0aW5ncy50aW1lb3V0KVxuXG5cdCAgICAgICAgLy8g5p+l5om+5LiO6K+35rGC5Y+C5pWw5Yy56YWN55qE5pWw5o2u5qih5p2/XG5cdCAgICAgICAgdmFyIGl0ZW0gPSBmaW5kKHRoaXMuY3VzdG9tLm9wdGlvbnMpXG5cblx0ICAgICAgICBmdW5jdGlvbiBoYW5kbGUoZXZlbnQpIHtcblx0ICAgICAgICAgICAgLy8g5ZCM5q2l5bGe5oCnIE5hdGl2ZVhNTEh0dHBSZXF1ZXN0ID0+IE1vY2tYTUxIdHRwUmVxdWVzdFxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFhIUl9SRVNQT05TRV9QUk9QRVJUSUVTLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoYXRbWEhSX1JFU1BPTlNFX1BST1BFUlRJRVNbaV1dID0geGhyW1hIUl9SRVNQT05TRV9QUk9QRVJUSUVTW2ldXVxuXHQgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyDop6blj5EgTW9ja1hNTEh0dHBSZXF1ZXN0IOS4iueahOWQjOWQjeS6i+S7tlxuXHQgICAgICAgICAgICB0aGF0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KGV2ZW50LnR5cGUgLyosIGZhbHNlLCBmYWxzZSwgdGhhdCovICkpXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8g5aaC5p6c5pyq5om+5Yiw5Yy56YWN55qE5pWw5o2u5qih5p2/77yM5YiZ6YeH55So5Y6f55SfIFhIUiDlj5HpgIHor7fmsYLjgIJcblx0ICAgICAgICBpZiAoIWl0ZW0pIHtcblx0ICAgICAgICAgICAgLy8g5Yib5bu65Y6f55SfIFhIUiDlr7nosaHvvIzosIPnlKjljp/nlJ8gb3Blbigp77yM55uR5ZCs5omA5pyJ5Y6f55Sf5LqL5Lu2XG5cdCAgICAgICAgICAgIHZhciB4aHIgPSBjcmVhdGVOYXRpdmVYTUxIdHRwUmVxdWVzdCgpXG5cdCAgICAgICAgICAgIHRoaXMuY3VzdG9tLnhociA9IHhoclxuXG5cdCAgICAgICAgICAgIC8vIOWIneWni+WMluaJgOacieS6i+S7tu+8jOeUqOS6juebkeWQrOWOn+eUnyBYSFIg5a+56LGh55qE5LqL5Lu2XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgWEhSX0VWRU5UUy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoWEhSX0VWRU5UU1tpXSwgaGFuZGxlKVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8geGhyLm9wZW4oKVxuXHQgICAgICAgICAgICBpZiAodXNlcm5hbWUpIHhoci5vcGVuKG1ldGhvZCwgdXJsLCBhc3luYywgdXNlcm5hbWUsIHBhc3N3b3JkKVxuXHQgICAgICAgICAgICBlbHNlIHhoci5vcGVuKG1ldGhvZCwgdXJsLCBhc3luYylcblxuXHQgICAgICAgICAgICAvLyDlkIzmraXlsZ7mgKcgTW9ja1hNTEh0dHBSZXF1ZXN0ID0+IE5hdGl2ZVhNTEh0dHBSZXF1ZXN0XG5cdCAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgWEhSX1JFUVVFU1RfUFJPUEVSVElFUy5sZW5ndGg7IGorKykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICB4aHJbWEhSX1JFUVVFU1RfUFJPUEVSVElFU1tqXV0gPSB0aGF0W1hIUl9SRVFVRVNUX1BST1BFUlRJRVNbal1dXG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8g5om+5Yiw5LqG5Yy56YWN55qE5pWw5o2u5qih5p2/77yM5byA5aeL5oum5oiqIFhIUiDor7fmsYJcblx0ICAgICAgICB0aGlzLm1hdGNoID0gdHJ1ZVxuXHQgICAgICAgIHRoaXMuY3VzdG9tLnRlbXBsYXRlID0gaXRlbVxuXHQgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IE1vY2tYTUxIdHRwUmVxdWVzdC5PUEVORURcblx0ICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZWFkeXN0YXRlY2hhbmdlJyAvKiwgZmFsc2UsIGZhbHNlLCB0aGlzKi8gKSlcblx0ICAgIH0sXG5cdCAgICAvLyBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3RoZS1zZXRyZXF1ZXN0aGVhZGVyKCktbWV0aG9kXG5cdCAgICAvLyBDb21iaW5lcyBhIGhlYWRlciBpbiBhdXRob3IgcmVxdWVzdCBoZWFkZXJzLlxuXHQgICAgc2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcblx0ICAgICAgICAvLyDljp/nlJ8gWEhSXG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY3VzdG9tLnhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuXHQgICAgICAgICAgICByZXR1cm5cblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmi6bmiKogWEhSXG5cdCAgICAgICAgdmFyIHJlcXVlc3RIZWFkZXJzID0gdGhpcy5jdXN0b20ucmVxdWVzdEhlYWRlcnNcblx0ICAgICAgICBpZiAocmVxdWVzdEhlYWRlcnNbbmFtZV0pIHJlcXVlc3RIZWFkZXJzW25hbWVdICs9ICcsJyArIHZhbHVlXG5cdCAgICAgICAgZWxzZSByZXF1ZXN0SGVhZGVyc1tuYW1lXSA9IHZhbHVlXG5cdCAgICB9LFxuXHQgICAgdGltZW91dDogMCxcblx0ICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG5cdCAgICB1cGxvYWQ6IHt9LFxuXHQgICAgLy8gaHR0cHM6Ly94aHIuc3BlYy53aGF0d2cub3JnLyN0aGUtc2VuZCgpLW1ldGhvZFxuXHQgICAgLy8gSW5pdGlhdGVzIHRoZSByZXF1ZXN0LlxuXHQgICAgc2VuZDogZnVuY3Rpb24gc2VuZChkYXRhKSB7XG5cdCAgICAgICAgdmFyIHRoYXQgPSB0aGlzXG5cdCAgICAgICAgdGhpcy5jdXN0b20ub3B0aW9ucy5ib2R5ID0gZGF0YVxuXG5cdCAgICAgICAgLy8g5Y6f55SfIFhIUlxuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCkge1xuXHQgICAgICAgICAgICB0aGlzLmN1c3RvbS54aHIuc2VuZChkYXRhKVxuXHQgICAgICAgICAgICByZXR1cm5cblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmi6bmiKogWEhSXG5cblx0ICAgICAgICAvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHQgICAgICAgIHRoaXMuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdNb2NrWE1MSHR0cFJlcXVlc3QnKVxuXG5cdCAgICAgICAgLy8gbG9hZHN0YXJ0IFRoZSBmZXRjaCBpbml0aWF0ZXMuXG5cdCAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZHN0YXJ0JyAvKiwgZmFsc2UsIGZhbHNlLCB0aGlzKi8gKSlcblxuXHQgICAgICAgIGlmICh0aGlzLmN1c3RvbS5hc3luYykgc2V0VGltZW91dChkb25lLCB0aGlzLmN1c3RvbS50aW1lb3V0KSAvLyDlvILmraVcblx0ICAgICAgICBlbHNlIGRvbmUoKSAvLyDlkIzmraVcblxuXHQgICAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG5cdCAgICAgICAgICAgIHRoYXQucmVhZHlTdGF0ZSA9IE1vY2tYTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEXG5cdCAgICAgICAgICAgIHRoYXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3JlYWR5c3RhdGVjaGFuZ2UnIC8qLCBmYWxzZSwgZmFsc2UsIHRoYXQqLyApKVxuXHQgICAgICAgICAgICB0aGF0LnJlYWR5U3RhdGUgPSBNb2NrWE1MSHR0cFJlcXVlc3QuTE9BRElOR1xuXHQgICAgICAgICAgICB0aGF0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZWFkeXN0YXRlY2hhbmdlJyAvKiwgZmFsc2UsIGZhbHNlLCB0aGF0Ki8gKSlcblxuXHQgICAgICAgICAgICB0aGF0LnN0YXR1cyA9IDIwMFxuXHQgICAgICAgICAgICB0aGF0LnN0YXR1c1RleHQgPSBIVFRQX1NUQVRVU19DT0RFU1syMDBdXG5cblx0ICAgICAgICAgICAgLy8gZml4ICM5MiAjOTMgYnkgQHFkZGVndHlhXG5cdCAgICAgICAgICAgIHRoYXQucmVzcG9uc2UgPSB0aGF0LnJlc3BvbnNlVGV4dCA9IEpTT04uc3RyaW5naWZ5KFxuXHQgICAgICAgICAgICAgICAgY29udmVydCh0aGF0LmN1c3RvbS50ZW1wbGF0ZSwgdGhhdC5jdXN0b20ub3B0aW9ucyksXG5cdCAgICAgICAgICAgICAgICBudWxsLCA0XG5cdCAgICAgICAgICAgIClcblxuXHQgICAgICAgICAgICB0aGF0LnJlYWR5U3RhdGUgPSBNb2NrWE1MSHR0cFJlcXVlc3QuRE9ORVxuXHQgICAgICAgICAgICB0aGF0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZWFkeXN0YXRlY2hhbmdlJyAvKiwgZmFsc2UsIGZhbHNlLCB0aGF0Ki8gKSlcblx0ICAgICAgICAgICAgdGhhdC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcgLyosIGZhbHNlLCBmYWxzZSwgdGhhdCovICkpO1xuXHQgICAgICAgICAgICB0aGF0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdsb2FkZW5kJyAvKiwgZmFsc2UsIGZhbHNlLCB0aGF0Ki8gKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSxcblx0ICAgIC8vIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jdGhlLWFib3J0KCktbWV0aG9kXG5cdCAgICAvLyBDYW5jZWxzIGFueSBuZXR3b3JrIGFjdGl2aXR5LlxuXHQgICAgYWJvcnQ6IGZ1bmN0aW9uIGFib3J0KCkge1xuXHQgICAgICAgIC8vIOWOn+eUnyBYSFJcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2gpIHtcblx0ICAgICAgICAgICAgdGhpcy5jdXN0b20ueGhyLmFib3J0KClcblx0ICAgICAgICAgICAgcmV0dXJuXG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8g5oum5oiqIFhIUlxuXHQgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IE1vY2tYTUxIdHRwUmVxdWVzdC5VTlNFTlRcblx0ICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdhYm9ydCcsIGZhbHNlLCBmYWxzZSwgdGhpcykpXG5cdCAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXJyb3InLCBmYWxzZSwgZmFsc2UsIHRoaXMpKVxuXHQgICAgfVxuXHR9KVxuXG5cdC8vIOWIneWni+WMliBSZXNwb25zZSDnm7jlhbPnmoTlsZ7mgKflkozmlrnms5Vcblx0VXRpbC5leHRlbmQoTW9ja1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwge1xuXHQgICAgcmVzcG9uc2VVUkw6ICcnLFxuXHQgICAgc3RhdHVzOiBNb2NrWE1MSHR0cFJlcXVlc3QuVU5TRU5ULFxuXHQgICAgc3RhdHVzVGV4dDogJycsXG5cdCAgICAvLyBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3RoZS1nZXRyZXNwb25zZWhlYWRlcigpLW1ldGhvZFxuXHQgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHtcblx0ICAgICAgICAvLyDljp/nlJ8gWEhSXG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbS54aHIuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSlcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmi6bmiKogWEhSXG5cdCAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tLnJlc3BvbnNlSGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldXG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly94aHIuc3BlYy53aGF0d2cub3JnLyN0aGUtZ2V0YWxscmVzcG9uc2VoZWFkZXJzKCktbWV0aG9kXG5cdCAgICAvLyBodHRwOi8vd3d3LnV0ZjgtY2hhcnRhYmxlLmRlL1xuXHQgICAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHtcblx0ICAgICAgICAvLyDljp/nlJ8gWEhSXG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbS54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyDmi6bmiKogWEhSXG5cdCAgICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9IHRoaXMuY3VzdG9tLnJlc3BvbnNlSGVhZGVyc1xuXHQgICAgICAgIHZhciBoZWFkZXJzID0gJydcblx0ICAgICAgICBmb3IgKHZhciBoIGluIHJlc3BvbnNlSGVhZGVycykge1xuXHQgICAgICAgICAgICBpZiAoIXJlc3BvbnNlSGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoKSkgY29udGludWVcblx0ICAgICAgICAgICAgaGVhZGVycyArPSBoICsgJzogJyArIHJlc3BvbnNlSGVhZGVyc1toXSArICdcXHJcXG4nXG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBoZWFkZXJzXG5cdCAgICB9LFxuXHQgICAgb3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIC8qbWltZSovICkge30sXG5cdCAgICByZXNwb25zZVR5cGU6ICcnLCAvLyAnJywgJ3RleHQnLCAnYXJyYXlidWZmZXInLCAnYmxvYicsICdkb2N1bWVudCcsICdqc29uJ1xuXHQgICAgcmVzcG9uc2U6IG51bGwsXG5cdCAgICByZXNwb25zZVRleHQ6ICcnLFxuXHQgICAgcmVzcG9uc2VYTUw6IG51bGxcblx0fSlcblxuXHQvLyBFdmVudFRhcmdldFxuXHRVdGlsLmV4dGVuZChNb2NrWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLCB7XG5cdCAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZSkge1xuXHQgICAgICAgIHZhciBldmVudHMgPSB0aGlzLmN1c3RvbS5ldmVudHNcblx0ICAgICAgICBpZiAoIWV2ZW50c1t0eXBlXSkgZXZlbnRzW3R5cGVdID0gW11cblx0ICAgICAgICBldmVudHNbdHlwZV0ucHVzaChoYW5kbGUpXG5cdCAgICB9LFxuXHQgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUpIHtcblx0ICAgICAgICB2YXIgaGFuZGxlcyA9IHRoaXMuY3VzdG9tLmV2ZW50c1t0eXBlXSB8fCBbXVxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICBpZiAoaGFuZGxlc1tpXSA9PT0gaGFuZGxlKSB7XG5cdCAgICAgICAgICAgICAgICBoYW5kbGVzLnNwbGljZShpLS0sIDEpXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChldmVudCkge1xuXHQgICAgICAgIHZhciBoYW5kbGVzID0gdGhpcy5jdXN0b20uZXZlbnRzW2V2ZW50LnR5cGVdIHx8IFtdXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGhhbmRsZXNbaV0uY2FsbCh0aGlzLCBldmVudClcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgb250eXBlID0gJ29uJyArIGV2ZW50LnR5cGVcblx0ICAgICAgICBpZiAodGhpc1tvbnR5cGVdKSB0aGlzW29udHlwZV0oZXZlbnQpXG5cdCAgICB9XG5cdH0pXG5cblx0Ly8gSW5zcGlyZWQgYnkgalF1ZXJ5XG5cdGZ1bmN0aW9uIGNyZWF0ZU5hdGl2ZVhNTEh0dHBSZXF1ZXN0KCkge1xuXHQgICAgdmFyIGlzTG9jYWwgPSBmdW5jdGlvbigpIHtcblx0ICAgICAgICB2YXIgcmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokL1xuXHQgICAgICAgIHZhciBydXJsID0gL14oW1xcdy4rLV0rOikoPzpcXC9cXC8oW15cXC8/IzpdKikoPzo6KFxcZCspfCl8KS9cblx0ICAgICAgICB2YXIgYWpheExvY2F0aW9uID0gbG9jYXRpb24uaHJlZlxuXHQgICAgICAgIHZhciBhamF4TG9jUGFydHMgPSBydXJsLmV4ZWMoYWpheExvY2F0aW9uLnRvTG93ZXJDYXNlKCkpIHx8IFtdXG5cdCAgICAgICAgcmV0dXJuIHJsb2NhbFByb3RvY29sLnRlc3QoYWpheExvY1BhcnRzWzFdKVxuXHQgICAgfSgpXG5cblx0ICAgIHJldHVybiB3aW5kb3cuQWN0aXZlWE9iamVjdCA/XG5cdCAgICAgICAgKCFpc0xvY2FsICYmIGNyZWF0ZVN0YW5kYXJkWEhSKCkgfHwgY3JlYXRlQWN0aXZlWEhSKCkpIDogY3JlYXRlU3RhbmRhcmRYSFIoKVxuXG5cdCAgICBmdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IHdpbmRvdy5fWE1MSHR0cFJlcXVlc3QoKTtcblx0ICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyB3aW5kb3cuX0FjdGl2ZVhPYmplY3QoXCJNaWNyb3NvZnQuWE1MSFRUUFwiKTtcblx0ICAgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgfVxuXHR9XG5cblxuXHQvLyDmn6Xmib7kuI7or7fmsYLlj4LmlbDljLnphY3nmoTmlbDmja7mqKHmnb/vvJpVUkzvvIxUeXBlXG5cdGZ1bmN0aW9uIGZpbmQob3B0aW9ucykge1xuXG5cdCAgICBmb3IgKHZhciBzVXJsVHlwZSBpbiBNb2NrWE1MSHR0cFJlcXVlc3QuTW9jay5fbW9ja2VkKSB7XG5cdCAgICAgICAgdmFyIGl0ZW0gPSBNb2NrWE1MSHR0cFJlcXVlc3QuTW9jay5fbW9ja2VkW3NVcmxUeXBlXVxuXHQgICAgICAgIGlmIChcblx0ICAgICAgICAgICAgKCFpdGVtLnJ1cmwgfHwgbWF0Y2goaXRlbS5ydXJsLCBvcHRpb25zLnVybCkpICYmXG5cdCAgICAgICAgICAgICghaXRlbS5ydHlwZSB8fCBtYXRjaChpdGVtLnJ0eXBlLCBvcHRpb25zLnR5cGUudG9Mb3dlckNhc2UoKSkpXG5cdCAgICAgICAgKSB7XG5cdCAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdbbW9ja10nLCBvcHRpb25zLnVybCwgJz4nLCBpdGVtLnJ1cmwpXG5cdCAgICAgICAgICAgIHJldHVybiBpdGVtXG5cdCAgICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBtYXRjaChleHBlY3RlZCwgYWN0dWFsKSB7XG5cdCAgICAgICAgaWYgKFV0aWwudHlwZShleHBlY3RlZCkgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBleHBlY3RlZCA9PT0gYWN0dWFsXG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChVdGlsLnR5cGUoZXhwZWN0ZWQpID09PSAncmVnZXhwJykge1xuXHQgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQudGVzdChhY3R1YWwpXG5cdCAgICAgICAgfVxuXHQgICAgfVxuXG5cdH1cblxuXHQvLyDmlbDmja7mqKHmnb8g77ydPiDlk43lupTmlbDmja5cblx0ZnVuY3Rpb24gY29udmVydChpdGVtLCBvcHRpb25zKSB7XG5cdCAgICByZXR1cm4gVXRpbC5pc0Z1bmN0aW9uKGl0ZW0udGVtcGxhdGUpID9cblx0ICAgICAgICBpdGVtLnRlbXBsYXRlKG9wdGlvbnMpIDogTW9ja1hNTEh0dHBSZXF1ZXN0Lk1vY2subW9jayhpdGVtLnRlbXBsYXRlKVxuXHR9XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBNb2NrWE1MSHR0cFJlcXVlc3RcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pXG59KTtcbjsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBLFFBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_mockjs@1.1.0@mockjs/dist/mock.js\n");

/***/ }),

/***/ "./node_modules/_node-libs-browser@2.2.1@node-libs-browser/mock/empty.js":
/*!*******************************************************************************!*\
  !*** ./node_modules/_node-libs-browser@2.2.1@node-libs-browser/mock/empty.js ***!
  \*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX25vZGUtbGlicy1icm93c2VyQDIuMi4xQG5vZGUtbGlicy1icm93c2VyL21vY2svZW1wdHkuanMuanMiLCJzb3VyY2VzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_node-libs-browser@2.2.1@node-libs-browser/mock/empty.js\n");

/***/ }),

/***/ "./node_modules/_object-is@1.0.1@object-is/index.js":
/*!**********************************************************!*\
  !*** ./node_modules/_object-is@1.0.1@object-is/index.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\n/* https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.is */\n\nvar NumberIsNaN = function (value) {\n\treturn value !== value;\n};\n\nmodule.exports = function is(a, b) {\n\tif (a === 0 && b === 0) {\n\t\treturn 1 / a === 1 / b;\n\t} else if (a === b) {\n\t\treturn true;\n\t} else if (NumberIsNaN(a) && NumberIsNaN(b)) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX29iamVjdC1pc0AxLjAuMUBvYmplY3QtaXMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX29iamVjdC1pc0AxLjAuMUBvYmplY3QtaXMvaW5kZXguanM/MTMzNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLW9iamVjdC5pcyAqL1xuXG52YXIgTnVtYmVySXNOYU4gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXMoYSwgYikge1xuXHRpZiAoYSA9PT0gMCAmJiBiID09PSAwKSB7XG5cdFx0cmV0dXJuIDEgLyBhID09PSAxIC8gYjtcblx0fSBlbHNlIGlmIChhID09PSBiKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gZWxzZSBpZiAoTnVtYmVySXNOYU4oYSkgJiYgTnVtYmVySXNOYU4oYikpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_object-is@1.0.1@object-is/index.js\n");

/***/ }),

/***/ "./node_modules/_object-keys@1.1.1@object-keys/implementation.js":
/*!***********************************************************************!*\
  !*** ./node_modules/_object-keys@1.1.1@object-keys/implementation.js ***!
  \***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar keysShim;\nif (!Object.keys) {\n\t// modified from https://github.com/es-shims/es5-shim\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar toStr = Object.prototype.toString;\n\tvar isArgs = __webpack_require__(/*! ./isArguments */ \"./node_modules/_object-keys@1.1.1@object-keys/isArguments.js\"); // eslint-disable-line global-require\n\tvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\tvar hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');\n\tvar hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');\n\tvar dontEnums = [\n\t\t'toString',\n\t\t'toLocaleString',\n\t\t'valueOf',\n\t\t'hasOwnProperty',\n\t\t'isPrototypeOf',\n\t\t'propertyIsEnumerable',\n\t\t'constructor'\n\t];\n\tvar equalsConstructorPrototype = function (o) {\n\t\tvar ctor = o.constructor;\n\t\treturn ctor && ctor.prototype === o;\n\t};\n\tvar excludedKeys = {\n\t\t$applicationCache: true,\n\t\t$console: true,\n\t\t$external: true,\n\t\t$frame: true,\n\t\t$frameElement: true,\n\t\t$frames: true,\n\t\t$innerHeight: true,\n\t\t$innerWidth: true,\n\t\t$onmozfullscreenchange: true,\n\t\t$onmozfullscreenerror: true,\n\t\t$outerHeight: true,\n\t\t$outerWidth: true,\n\t\t$pageXOffset: true,\n\t\t$pageYOffset: true,\n\t\t$parent: true,\n\t\t$scrollLeft: true,\n\t\t$scrollTop: true,\n\t\t$scrollX: true,\n\t\t$scrollY: true,\n\t\t$self: true,\n\t\t$webkitIndexedDB: true,\n\t\t$webkitStorageInfo: true,\n\t\t$window: true\n\t};\n\tvar hasAutomationEqualityBug = (function () {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined') { return false; }\n\t\tfor (var k in window) {\n\t\t\ttry {\n\t\t\t\tif (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}());\n\tvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t}\n\t\ttry {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tkeysShim = function keys(object) {\n\t\tvar isObject = object !== null && typeof object === 'object';\n\t\tvar isFunction = toStr.call(object) === '[object Function]';\n\t\tvar isArguments = isArgs(object);\n\t\tvar isString = isObject && toStr.call(object) === '[object String]';\n\t\tvar theKeys = [];\n\n\t\tif (!isObject && !isFunction && !isArguments) {\n\t\t\tthrow new TypeError('Object.keys called on a non-object');\n\t\t}\n\n\t\tvar skipProto = hasProtoEnumBug && isFunction;\n\t\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\t\ttheKeys.push(String(i));\n\t\t\t}\n\t\t}\n\n\t\tif (isArguments && object.length > 0) {\n\t\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\t\ttheKeys.push(String(j));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var name in object) {\n\t\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\t\ttheKeys.push(String(name));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasDontEnumBug) {\n\t\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn theKeys;\n\t};\n}\nmodule.exports = keysShim;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX29iamVjdC1rZXlzQDEuMS4xQG9iamVjdC1rZXlzL2ltcGxlbWVudGF0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19vYmplY3Qta2V5c0AxLjEuMUBvYmplY3Qta2V5cy9pbXBsZW1lbnRhdGlvbi5qcz9jMmIyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXNTaGltO1xuaWYgKCFPYmplY3Qua2V5cykge1xuXHQvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbVxuXHR2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblx0dmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnbG9iYWwtcmVxdWlyZVxuXHR2YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0dmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bWVyYWJsZS5jYWxsKHsgdG9TdHJpbmc6IG51bGwgfSwgJ3RvU3RyaW5nJyk7XG5cdHZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuXHR2YXIgZG9udEVudW1zID0gW1xuXHRcdCd0b1N0cmluZycsXG5cdFx0J3RvTG9jYWxlU3RyaW5nJyxcblx0XHQndmFsdWVPZicsXG5cdFx0J2hhc093blByb3BlcnR5Jyxcblx0XHQnaXNQcm90b3R5cGVPZicsXG5cdFx0J3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcblx0XHQnY29uc3RydWN0b3InXG5cdF07XG5cdHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0dmFyIGN0b3IgPSBvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xuXHR9O1xuXHR2YXIgZXhjbHVkZWRLZXlzID0ge1xuXHRcdCRhcHBsaWNhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdCRjb25zb2xlOiB0cnVlLFxuXHRcdCRleHRlcm5hbDogdHJ1ZSxcblx0XHQkZnJhbWU6IHRydWUsXG5cdFx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0XHQkZnJhbWVzOiB0cnVlLFxuXHRcdCRpbm5lckhlaWdodDogdHJ1ZSxcblx0XHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0XHQkb25tb3pmdWxsc2NyZWVuY2hhbmdlOiB0cnVlLFxuXHRcdCRvbm1vemZ1bGxzY3JlZW5lcnJvcjogdHJ1ZSxcblx0XHQkb3V0ZXJIZWlnaHQ6IHRydWUsXG5cdFx0JG91dGVyV2lkdGg6IHRydWUsXG5cdFx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHRcdCRwYWdlWU9mZnNldDogdHJ1ZSxcblx0XHQkcGFyZW50OiB0cnVlLFxuXHRcdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHRcdCRzY3JvbGxUb3A6IHRydWUsXG5cdFx0JHNjcm9sbFg6IHRydWUsXG5cdFx0JHNjcm9sbFk6IHRydWUsXG5cdFx0JHNlbGY6IHRydWUsXG5cdFx0JHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcblx0XHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdFx0JHdpbmRvdzogdHJ1ZVxuXHR9O1xuXHR2YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBoYXMuY2FsbCh3aW5kb3csIGspICYmIHdpbmRvd1trXSAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSh3aW5kb3dba10pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KCkpO1xuXHR2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXG5cdGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0XHR2YXIgaXNPYmplY3QgPSBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCc7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdFx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdFx0dmFyIGlzU3RyaW5nID0gaXNPYmplY3QgJiYgdG9TdHIuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBTdHJpbmddJztcblx0XHR2YXIgdGhlS2V5cyA9IFtdO1xuXG5cdFx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcblx0XHR9XG5cblx0XHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdFx0aWYgKGlzU3RyaW5nICYmIG9iamVjdC5sZW5ndGggPiAwICYmICFoYXMuY2FsbChvYmplY3QsIDApKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgb2JqZWN0Lmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcoaikpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKHZhciBuYW1lIGluIG9iamVjdCkge1xuXHRcdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKG5hbWUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNEb250RW51bUJ1Zykge1xuXHRcdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGRvbnRFbnVtcy5sZW5ndGg7ICsraykge1xuXHRcdFx0XHRpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW1zW2tdID09PSAnY29uc3RydWN0b3InKSAmJiBoYXMuY2FsbChvYmplY3QsIGRvbnRFbnVtc1trXSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhlS2V5cztcblx0fTtcbn1cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_object-keys@1.1.1@object-keys/implementation.js\n");

/***/ }),

/***/ "./node_modules/_object-keys@1.1.1@object-keys/index.js":
/*!**************************************************************!*\
  !*** ./node_modules/_object-keys@1.1.1@object-keys/index.js ***!
  \**************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar slice = Array.prototype.slice;\nvar isArgs = __webpack_require__(/*! ./isArguments */ \"./node_modules/_object-keys@1.1.1@object-keys/isArguments.js\");\n\nvar origKeys = Object.keys;\nvar keysShim = origKeys ? function keys(o) { return origKeys(o); } : __webpack_require__(/*! ./implementation */ \"./node_modules/_object-keys@1.1.1@object-keys/implementation.js\");\n\nvar originalKeys = Object.keys;\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (Object.keys) {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\tvar args = Object.keys(arguments);\n\t\t\treturn args && args.length === arguments.length;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tObject.keys = function keys(object) { // eslint-disable-line func-name-matching\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t}\n\t\t\t\treturn originalKeys(object);\n\t\t\t};\n\t\t}\n\t} else {\n\t\tObject.keys = keysShim;\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX29iamVjdC1rZXlzQDEuMS4xQG9iamVjdC1rZXlzL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19vYmplY3Qta2V5c0AxLjEuMUBvYmplY3Qta2V5cy9pbmRleC5qcz8wOTkzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTtcblxudmFyIG9yaWdLZXlzID0gT2JqZWN0LmtleXM7XG52YXIga2V5c1NoaW0gPSBvcmlnS2V5cyA/IGZ1bmN0aW9uIGtleXMobykgeyByZXR1cm4gb3JpZ0tleXMobyk7IH0gOiByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbnZhciBvcmlnaW5hbEtleXMgPSBPYmplY3Qua2V5cztcblxua2V5c1NoaW0uc2hpbSA9IGZ1bmN0aW9uIHNoaW1PYmplY3RLZXlzKCkge1xuXHRpZiAoT2JqZWN0LmtleXMpIHtcblx0XHR2YXIga2V5c1dvcmtzV2l0aEFyZ3VtZW50cyA9IChmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBTYWZhcmkgNS4wIGJ1Z1xuXHRcdFx0dmFyIGFyZ3MgPSBPYmplY3Qua2V5cyhhcmd1bWVudHMpO1xuXHRcdFx0cmV0dXJuIGFyZ3MgJiYgYXJncy5sZW5ndGggPT09IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0fSgxLCAyKSk7XG5cdFx0aWYgKCFrZXlzV29ya3NXaXRoQXJndW1lbnRzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG5cdFx0XHRcdGlmIChpc0FyZ3Mob2JqZWN0KSkge1xuXHRcdFx0XHRcdHJldHVybiBvcmlnaW5hbEtleXMoc2xpY2UuY2FsbChvYmplY3QpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxLZXlzKG9iamVjdCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRPYmplY3Qua2V5cyA9IGtleXNTaGltO1xuXHR9XG5cdHJldHVybiBPYmplY3Qua2V5cyB8fCBrZXlzU2hpbTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_object-keys@1.1.1@object-keys/index.js\n");

/***/ }),

/***/ "./node_modules/_object-keys@1.1.1@object-keys/isArguments.js":
/*!********************************************************************!*\
  !*** ./node_modules/_object-keys@1.1.1@object-keys/isArguments.js ***!
  \********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX29iamVjdC1rZXlzQDEuMS4xQG9iamVjdC1rZXlzL2lzQXJndW1lbnRzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19vYmplY3Qta2V5c0AxLjEuMUBvYmplY3Qta2V5cy9pc0FyZ3VtZW50cy5qcz81N2MyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHR2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdHZhciBpc0FyZ3MgPSBzdHIgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXHRpZiAoIWlzQXJncykge1xuXHRcdGlzQXJncyA9IHN0ciAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJlxuXHRcdFx0dmFsdWUgIT09IG51bGwgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0XHR2YWx1ZS5sZW5ndGggPj0gMCAmJlxuXHRcdFx0dG9TdHIuY2FsbCh2YWx1ZS5jYWxsZWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXHR9XG5cdHJldHVybiBpc0FyZ3M7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_object-keys@1.1.1@object-keys/isArguments.js\n");

/***/ }),

/***/ "./node_modules/_parse-headers@2.0.3@parse-headers/parse-headers.js":
/*!**************************************************************************!*\
  !*** ./node_modules/_parse-headers@2.0.3@parse-headers/parse-headers.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var trim = function(string) {\n  return string.replace(/^\\s+|\\s+$/g, '');\n}\n  , isArray = function(arg) {\n      return Object.prototype.toString.call(arg) === '[object Array]';\n    }\n\nmodule.exports = function (headers) {\n  if (!headers)\n    return {}\n\n  var result = {}\n\n  var headersArr = trim(headers).split('\\n')\n\n  for (var i = 0; i < headersArr.length; i++) {\n    var row = headersArr[i]\n    var index = row.indexOf(':')\n    , key = trim(row.slice(0, index)).toLowerCase()\n    , value = trim(row.slice(index + 1))\n\n    if (typeof(result[key]) === 'undefined') {\n      result[key] = value\n    } else if (isArray(result[key])) {\n      result[key].push(value)\n    } else {\n      result[key] = [ result[key], value ]\n    }\n  }\n\n  return result\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3BhcnNlLWhlYWRlcnNAMi4wLjNAcGFyc2UtaGVhZGVycy9wYXJzZS1oZWFkZXJzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19wYXJzZS1oZWFkZXJzQDIuMC4zQHBhcnNlLWhlYWRlcnMvcGFyc2UtaGVhZGVycy5qcz80ZGFiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0cmltID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xufVxuICAsIGlzQXJyYXkgPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgaWYgKCFoZWFkZXJzKVxuICAgIHJldHVybiB7fVxuXG4gIHZhciByZXN1bHQgPSB7fVxuXG4gIHZhciBoZWFkZXJzQXJyID0gdHJpbShoZWFkZXJzKS5zcGxpdCgnXFxuJylcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnNBcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcm93ID0gaGVhZGVyc0FycltpXVxuICAgIHZhciBpbmRleCA9IHJvdy5pbmRleE9mKCc6JylcbiAgICAsIGtleSA9IHRyaW0ocm93LnNsaWNlKDAsIGluZGV4KSkudG9Mb3dlckNhc2UoKVxuICAgICwgdmFsdWUgPSB0cmltKHJvdy5zbGljZShpbmRleCArIDEpKVxuXG4gICAgaWYgKHR5cGVvZihyZXN1bHRba2V5XSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJlc3VsdFtrZXldKSkge1xuICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBbIHJlc3VsdFtrZXldLCB2YWx1ZSBdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_parse-headers@2.0.3@parse-headers/parse-headers.js\n");

/***/ }),

/***/ "./node_modules/_process@0.11.10@process/browser.js":
/*!**********************************************************!*\
  !*** ./node_modules/_process@0.11.10@process/browser.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Byb2Nlc3NAMC4xMS4xMEBwcm9jZXNzL2Jyb3dzZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3Byb2Nlc3NAMC4xMS4xMEBwcm9jZXNzL2Jyb3dzZXIuanM/NGMzOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_process@0.11.10@process/browser.js\n");

/***/ }),

/***/ "./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js":
/*!*********************************************************************************************!*\
  !*** ./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js ***!
  \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar toObject = Object;\nvar TypeErr = TypeError;\n\nmodule.exports = function flags() {\n\tif (this != null && this !== toObject(this)) {\n\t\tthrow new TypeErr('RegExp.prototype.flags getter called on non-object');\n\t}\n\tvar result = '';\n\tif (this.global) {\n\t\tresult += 'g';\n\t}\n\tif (this.ignoreCase) {\n\t\tresult += 'i';\n\t}\n\tif (this.multiline) {\n\t\tresult += 'm';\n\t}\n\tif (this.dotAll) {\n\t\tresult += 's';\n\t}\n\tif (this.unicode) {\n\t\tresult += 'u';\n\t}\n\tif (this.sticky) {\n\t\tresult += 'y';\n\t}\n\treturn result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3NAMS4yLjBAcmVnZXhwLnByb3RvdHlwZS5mbGFncy9pbXBsZW1lbnRhdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fcmVnZXhwLnByb3RvdHlwZS5mbGFnc0AxLjIuMEByZWdleHAucHJvdG90eXBlLmZsYWdzL2ltcGxlbWVudGF0aW9uLmpzPzY1MjYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9PYmplY3QgPSBPYmplY3Q7XG52YXIgVHlwZUVyciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmbGFncygpIHtcblx0aWYgKHRoaXMgIT0gbnVsbCAmJiB0aGlzICE9PSB0b09iamVjdCh0aGlzKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIGdldHRlciBjYWxsZWQgb24gbm9uLW9iamVjdCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSAnJztcblx0aWYgKHRoaXMuZ2xvYmFsKSB7XG5cdFx0cmVzdWx0ICs9ICdnJztcblx0fVxuXHRpZiAodGhpcy5pZ25vcmVDYXNlKSB7XG5cdFx0cmVzdWx0ICs9ICdpJztcblx0fVxuXHRpZiAodGhpcy5tdWx0aWxpbmUpIHtcblx0XHRyZXN1bHQgKz0gJ20nO1xuXHR9XG5cdGlmICh0aGlzLmRvdEFsbCkge1xuXHRcdHJlc3VsdCArPSAncyc7XG5cdH1cblx0aWYgKHRoaXMudW5pY29kZSkge1xuXHRcdHJlc3VsdCArPSAndSc7XG5cdH1cblx0aWYgKHRoaXMuc3RpY2t5KSB7XG5cdFx0cmVzdWx0ICs9ICd5Jztcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js\n");

/***/ }),

/***/ "./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/index.js":
/*!************************************************************************************!*\
  !*** ./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/index.js ***!
  \************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar define = __webpack_require__(/*! define-properties */ \"./node_modules/_define-properties@1.1.3@define-properties/index.js\");\n\nvar implementation = __webpack_require__(/*! ./implementation */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js\");\nvar getPolyfill = __webpack_require__(/*! ./polyfill */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js\");\nvar shim = __webpack_require__(/*! ./shim */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/shim.js\");\n\nvar flagsBound = Function.call.bind(implementation);\n\ndefine(flagsBound, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = flagsBound;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3NAMS4yLjBAcmVnZXhwLnByb3RvdHlwZS5mbGFncy9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fcmVnZXhwLnByb3RvdHlwZS5mbGFnc0AxLjIuMEByZWdleHAucHJvdG90eXBlLmZsYWdzL2luZGV4LmpzPzQ2MzAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyIGZsYWdzQm91bmQgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaW1wbGVtZW50YXRpb24pO1xuXG5kZWZpbmUoZmxhZ3NCb3VuZCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhZ3NCb3VuZDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/index.js\n");

/***/ }),

/***/ "./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js":
/*!***************************************************************************************!*\
  !*** ./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js ***!
  \***************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar implementation = __webpack_require__(/*! ./implementation */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/implementation.js\");\n\nvar supportsDescriptors = __webpack_require__(/*! define-properties */ \"./node_modules/_define-properties@1.1.3@define-properties/index.js\").supportsDescriptors;\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar TypeErr = TypeError;\n\nmodule.exports = function getPolyfill() {\n\tif (!supportsDescriptors) {\n\t\tthrow new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');\n\t}\n\tif (/a/mig.flags === 'gim') {\n\t\tvar descriptor = gOPD(RegExp.prototype, 'flags');\n\t\tif (descriptor && typeof descriptor.get === 'function' && typeof (/a/).dotAll === 'boolean') {\n\t\t\treturn descriptor.get;\n\t\t}\n\t}\n\treturn implementation;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3NAMS4yLjBAcmVnZXhwLnByb3RvdHlwZS5mbGFncy9wb2x5ZmlsbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fcmVnZXhwLnByb3RvdHlwZS5mbGFnc0AxLjIuMEByZWdleHAucHJvdG90eXBlLmZsYWdzL3BvbHlmaWxsLmpzP2NlM2UiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKS5zdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIFR5cGVFcnIgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIHJlcXVpcmVzIGEgdHJ1ZSBFUzUgZW52aXJvbm1lbnQgdGhhdCBzdXBwb3J0cyBwcm9wZXJ0eSBkZXNjcmlwdG9ycycpO1xuXHR9XG5cdGlmICgvYS9taWcuZmxhZ3MgPT09ICdnaW0nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBnT1BEKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycpO1xuXHRcdGlmIChkZXNjcmlwdG9yICYmIHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKC9hLykuZG90QWxsID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHJldHVybiBkZXNjcmlwdG9yLmdldDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js\n");

/***/ }),

/***/ "./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/shim.js":
/*!***********************************************************************************!*\
  !*** ./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/shim.js ***!
  \***********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\n\nvar supportsDescriptors = __webpack_require__(/*! define-properties */ \"./node_modules/_define-properties@1.1.3@define-properties/index.js\").supportsDescriptors;\nvar getPolyfill = __webpack_require__(/*! ./polyfill */ \"./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/polyfill.js\");\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar defineProperty = Object.defineProperty;\nvar TypeErr = TypeError;\nvar getProto = Object.getPrototypeOf;\nvar regex = /a/;\n\nmodule.exports = function shimFlags() {\n\tif (!supportsDescriptors || !getProto) {\n\t\tthrow new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');\n\t}\n\tvar polyfill = getPolyfill();\n\tvar proto = getProto(regex);\n\tvar descriptor = gOPD(proto, 'flags');\n\tif (!descriptor || descriptor.get !== polyfill) {\n\t\tdefineProperty(proto, 'flags', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tget: polyfill\n\t\t});\n\t}\n\treturn polyfill;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3NAMS4yLjBAcmVnZXhwLnByb3RvdHlwZS5mbGFncy9zaGltLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL19yZWdleHAucHJvdG90eXBlLmZsYWdzQDEuMi4wQHJlZ2V4cC5wcm90b3R5cGUuZmxhZ3Mvc2hpbS5qcz9kNjY0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpLnN1cHBvcnRzRGVzY3JpcHRvcnM7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgVHlwZUVyciA9IFR5cGVFcnJvcjtcbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciByZWdleCA9IC9hLztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltRmxhZ3MoKSB7XG5cdGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycyB8fCAhZ2V0UHJvdG8pIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycignUmVnRXhwLnByb3RvdHlwZS5mbGFncyByZXF1aXJlcyBhIHRydWUgRVM1IGVudmlyb25tZW50IHRoYXQgc3VwcG9ydHMgcHJvcGVydHkgZGVzY3JpcHRvcnMnKTtcblx0fVxuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHR2YXIgcHJvdG8gPSBnZXRQcm90byhyZWdleCk7XG5cdHZhciBkZXNjcmlwdG9yID0gZ09QRChwcm90bywgJ2ZsYWdzJyk7XG5cdGlmICghZGVzY3JpcHRvciB8fCBkZXNjcmlwdG9yLmdldCAhPT0gcG9seWZpbGwpIHtcblx0XHRkZWZpbmVQcm9wZXJ0eShwcm90bywgJ2ZsYWdzJywge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6IHBvbHlmaWxsXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_regexp.prototype.flags@1.2.0@regexp.prototype.flags/shim.js\n");

/***/ }),

/***/ "./node_modules/_safe-json-parse@4.0.0@safe-json-parse/tuple.js":
/*!**********************************************************************!*\
  !*** ./node_modules/_safe-json-parse@4.0.0@safe-json-parse/tuple.js ***!
  \**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = SafeParseTuple\n\nfunction SafeParseTuple(obj, reviver) {\n    var json\n    var error = null\n\n    try {\n        json = JSON.parse(obj, reviver)\n    } catch (err) {\n        error = err\n    }\n\n    return [error, json]\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3NhZmUtanNvbi1wYXJzZUA0LjAuMEBzYWZlLWpzb24tcGFyc2UvdHVwbGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3NhZmUtanNvbi1wYXJzZUA0LjAuMEBzYWZlLWpzb24tcGFyc2UvdHVwbGUuanM/MDYzMCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFNhZmVQYXJzZVR1cGxlXG5cbmZ1bmN0aW9uIFNhZmVQYXJzZVR1cGxlKG9iaiwgcmV2aXZlcikge1xuICAgIHZhciBqc29uXG4gICAgdmFyIGVycm9yID0gbnVsbFxuXG4gICAgdHJ5IHtcbiAgICAgICAganNvbiA9IEpTT04ucGFyc2Uob2JqLCByZXZpdmVyKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvciA9IGVyclxuICAgIH1cblxuICAgIHJldHVybiBbZXJyb3IsIGpzb25dXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_safe-json-parse@4.0.0@safe-json-parse/tuple.js\n");

/***/ }),

/***/ "./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css":
/*!***************************************************************!*\
  !*** ./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./swiper.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"49a14e50\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./swiper.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\", function() {\n     var newContent = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./swiper.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3N3aXBlckA0LjUuMUBzd2lwZXIvZGlzdC9jc3Mvc3dpcGVyLmNzcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fc3dpcGVyQDQuNS4xQHN3aXBlci9kaXN0L2Nzcy9zd2lwZXIuY3NzPzJiNjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblxuLy8gbG9hZCB0aGUgc3R5bGVzXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL3N3aXBlci5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI0OWExNGU1MFwiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL3N3aXBlci5jc3NcIiwgZnVuY3Rpb24oKSB7XG4gICAgIHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMSEuLi8uLi8uLi9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0yIS4vc3dpcGVyLmNzc1wiKTtcbiAgICAgaWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG4gICAgIHVwZGF0ZShuZXdDb250ZW50KTtcbiAgIH0pO1xuIH1cbiAvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG4gbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\n");

/***/ }),

/***/ "./node_modules/_swiper@4.5.1@swiper/dist/js/swiper.js":
/*!*************************************************************!*\
  !*** ./node_modules/_swiper@4.5.1@swiper/dist/js/swiper.js ***!
  \*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/**\n * Swiper 4.5.1\n * Most modern mobile touch slider and framework with hardware accelerated transitions\n * http://www.idangero.us/swiper/\n *\n * Copyright 2014-2019 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: September 13, 2019\n */\n\n(function (global, factory) {\n   true ? module.exports = factory() :\n  undefined;\n}(this, function () { 'use strict';\n\n  /**\n   * SSR Window 1.0.1\n   * Better handling for window object in SSR environment\n   * https://github.com/nolimits4web/ssr-window\n   *\n   * Copyright 2018, Vladimir Kharlampidi\n   *\n   * Licensed under MIT\n   *\n   * Released on: July 18, 2018\n   */\n  var doc = (typeof document === 'undefined') ? {\n    body: {},\n    addEventListener: function addEventListener() {},\n    removeEventListener: function removeEventListener() {},\n    activeElement: {\n      blur: function blur() {},\n      nodeName: '',\n    },\n    querySelector: function querySelector() {\n      return null;\n    },\n    querySelectorAll: function querySelectorAll() {\n      return [];\n    },\n    getElementById: function getElementById() {\n      return null;\n    },\n    createEvent: function createEvent() {\n      return {\n        initEvent: function initEvent() {},\n      };\n    },\n    createElement: function createElement() {\n      return {\n        children: [],\n        childNodes: [],\n        style: {},\n        setAttribute: function setAttribute() {},\n        getElementsByTagName: function getElementsByTagName() {\n          return [];\n        },\n      };\n    },\n    location: { hash: '' },\n  } : document; // eslint-disable-line\n\n  var win = (typeof window === 'undefined') ? {\n    document: doc,\n    navigator: {\n      userAgent: '',\n    },\n    location: {},\n    history: {},\n    CustomEvent: function CustomEvent() {\n      return this;\n    },\n    addEventListener: function addEventListener() {},\n    removeEventListener: function removeEventListener() {},\n    getComputedStyle: function getComputedStyle() {\n      return {\n        getPropertyValue: function getPropertyValue() {\n          return '';\n        },\n      };\n    },\n    Image: function Image() {},\n    Date: function Date() {},\n    screen: {},\n    setTimeout: function setTimeout() {},\n    clearTimeout: function clearTimeout() {},\n  } : window; // eslint-disable-line\n\n  /**\n   * Dom7 2.1.3\n   * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n   * http://framework7.io/docs/dom.html\n   *\n   * Copyright 2019, Vladimir Kharlampidi\n   * The iDangero.us\n   * http://www.idangero.us/\n   *\n   * Licensed under MIT\n   *\n   * Released on: February 11, 2019\n   */\n\n  var Dom7 = function Dom7(arr) {\n    var self = this;\n    // Create array-like object\n    for (var i = 0; i < arr.length; i += 1) {\n      self[i] = arr[i];\n    }\n    self.length = arr.length;\n    // Return collection with methods\n    return this;\n  };\n\n  function $(selector, context) {\n    var arr = [];\n    var i = 0;\n    if (selector && !context) {\n      if (selector instanceof Dom7) {\n        return selector;\n      }\n    }\n    if (selector) {\n        // String\n      if (typeof selector === 'string') {\n        var els;\n        var tempParent;\n        var html = selector.trim();\n        if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n          var toCreate = 'div';\n          if (html.indexOf('<li') === 0) { toCreate = 'ul'; }\n          if (html.indexOf('<tr') === 0) { toCreate = 'tbody'; }\n          if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) { toCreate = 'tr'; }\n          if (html.indexOf('<tbody') === 0) { toCreate = 'table'; }\n          if (html.indexOf('<option') === 0) { toCreate = 'select'; }\n          tempParent = doc.createElement(toCreate);\n          tempParent.innerHTML = html;\n          for (i = 0; i < tempParent.childNodes.length; i += 1) {\n            arr.push(tempParent.childNodes[i]);\n          }\n        } else {\n          if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {\n            // Pure ID selector\n            els = [doc.getElementById(selector.trim().split('#')[1])];\n          } else {\n            // Other selectors\n            els = (context || doc).querySelectorAll(selector.trim());\n          }\n          for (i = 0; i < els.length; i += 1) {\n            if (els[i]) { arr.push(els[i]); }\n          }\n        }\n      } else if (selector.nodeType || selector === win || selector === doc) {\n        // Node/element\n        arr.push(selector);\n      } else if (selector.length > 0 && selector[0].nodeType) {\n        // Array of elements or instance of Dom\n        for (i = 0; i < selector.length; i += 1) {\n          arr.push(selector[i]);\n        }\n      }\n    }\n    return new Dom7(arr);\n  }\n\n  $.fn = Dom7.prototype;\n  $.Class = Dom7;\n  $.Dom7 = Dom7;\n\n  function unique(arr) {\n    var uniqueArray = [];\n    for (var i = 0; i < arr.length; i += 1) {\n      if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }\n    }\n    return uniqueArray;\n  }\n\n  // Classes and attributes\n  function addClass(className) {\n    if (typeof className === 'undefined') {\n      return this;\n    }\n    var classes = className.split(' ');\n    for (var i = 0; i < classes.length; i += 1) {\n      for (var j = 0; j < this.length; j += 1) {\n        if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }\n      }\n    }\n    return this;\n  }\n  function removeClass(className) {\n    var classes = className.split(' ');\n    for (var i = 0; i < classes.length; i += 1) {\n      for (var j = 0; j < this.length; j += 1) {\n        if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }\n      }\n    }\n    return this;\n  }\n  function hasClass(className) {\n    if (!this[0]) { return false; }\n    return this[0].classList.contains(className);\n  }\n  function toggleClass(className) {\n    var classes = className.split(' ');\n    for (var i = 0; i < classes.length; i += 1) {\n      for (var j = 0; j < this.length; j += 1) {\n        if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }\n      }\n    }\n    return this;\n  }\n  function attr(attrs, value) {\n    var arguments$1 = arguments;\n\n    if (arguments.length === 1 && typeof attrs === 'string') {\n      // Get attr\n      if (this[0]) { return this[0].getAttribute(attrs); }\n      return undefined;\n    }\n\n    // Set attrs\n    for (var i = 0; i < this.length; i += 1) {\n      if (arguments$1.length === 2) {\n        // String\n        this[i].setAttribute(attrs, value);\n      } else {\n        // Object\n        // eslint-disable-next-line\n        for (var attrName in attrs) {\n          this[i][attrName] = attrs[attrName];\n          this[i].setAttribute(attrName, attrs[attrName]);\n        }\n      }\n    }\n    return this;\n  }\n  // eslint-disable-next-line\n  function removeAttr(attr) {\n    for (var i = 0; i < this.length; i += 1) {\n      this[i].removeAttribute(attr);\n    }\n    return this;\n  }\n  function data(key, value) {\n    var el;\n    if (typeof value === 'undefined') {\n      el = this[0];\n      // Get value\n      if (el) {\n        if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {\n          return el.dom7ElementDataStorage[key];\n        }\n\n        var dataKey = el.getAttribute((\"data-\" + key));\n        if (dataKey) {\n          return dataKey;\n        }\n        return undefined;\n      }\n      return undefined;\n    }\n\n    // Set value\n    for (var i = 0; i < this.length; i += 1) {\n      el = this[i];\n      if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }\n      el.dom7ElementDataStorage[key] = value;\n    }\n    return this;\n  }\n  // Transforms\n  // eslint-disable-next-line\n  function transform(transform) {\n    for (var i = 0; i < this.length; i += 1) {\n      var elStyle = this[i].style;\n      elStyle.webkitTransform = transform;\n      elStyle.transform = transform;\n    }\n    return this;\n  }\n  function transition(duration) {\n    if (typeof duration !== 'string') {\n      duration = duration + \"ms\"; // eslint-disable-line\n    }\n    for (var i = 0; i < this.length; i += 1) {\n      var elStyle = this[i].style;\n      elStyle.webkitTransitionDuration = duration;\n      elStyle.transitionDuration = duration;\n    }\n    return this;\n  }\n  // Events\n  function on() {\n    var assign;\n\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n    var eventType = args[0];\n    var targetSelector = args[1];\n    var listener = args[2];\n    var capture = args[3];\n    if (typeof args[1] === 'function') {\n      (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);\n      targetSelector = undefined;\n    }\n    if (!capture) { capture = false; }\n\n    function handleLiveEvent(e) {\n      var target = e.target;\n      if (!target) { return; }\n      var eventData = e.target.dom7EventData || [];\n      if (eventData.indexOf(e) < 0) {\n        eventData.unshift(e);\n      }\n      if ($(target).is(targetSelector)) { listener.apply(target, eventData); }\n      else {\n        var parents = $(target).parents(); // eslint-disable-line\n        for (var k = 0; k < parents.length; k += 1) {\n          if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }\n        }\n      }\n    }\n    function handleEvent(e) {\n      var eventData = e && e.target ? e.target.dom7EventData || [] : [];\n      if (eventData.indexOf(e) < 0) {\n        eventData.unshift(e);\n      }\n      listener.apply(this, eventData);\n    }\n    var events = eventType.split(' ');\n    var j;\n    for (var i = 0; i < this.length; i += 1) {\n      var el = this[i];\n      if (!targetSelector) {\n        for (j = 0; j < events.length; j += 1) {\n          var event = events[j];\n          if (!el.dom7Listeners) { el.dom7Listeners = {}; }\n          if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }\n          el.dom7Listeners[event].push({\n            listener: listener,\n            proxyListener: handleEvent,\n          });\n          el.addEventListener(event, handleEvent, capture);\n        }\n      } else {\n        // Live events\n        for (j = 0; j < events.length; j += 1) {\n          var event$1 = events[j];\n          if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }\n          if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }\n          el.dom7LiveListeners[event$1].push({\n            listener: listener,\n            proxyListener: handleLiveEvent,\n          });\n          el.addEventListener(event$1, handleLiveEvent, capture);\n        }\n      }\n    }\n    return this;\n  }\n  function off() {\n    var assign;\n\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n    var eventType = args[0];\n    var targetSelector = args[1];\n    var listener = args[2];\n    var capture = args[3];\n    if (typeof args[1] === 'function') {\n      (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);\n      targetSelector = undefined;\n    }\n    if (!capture) { capture = false; }\n\n    var events = eventType.split(' ');\n    for (var i = 0; i < events.length; i += 1) {\n      var event = events[i];\n      for (var j = 0; j < this.length; j += 1) {\n        var el = this[j];\n        var handlers = (void 0);\n        if (!targetSelector && el.dom7Listeners) {\n          handlers = el.dom7Listeners[event];\n        } else if (targetSelector && el.dom7LiveListeners) {\n          handlers = el.dom7LiveListeners[event];\n        }\n        if (handlers && handlers.length) {\n          for (var k = handlers.length - 1; k >= 0; k -= 1) {\n            var handler = handlers[k];\n            if (listener && handler.listener === listener) {\n              el.removeEventListener(event, handler.proxyListener, capture);\n              handlers.splice(k, 1);\n            } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n              el.removeEventListener(event, handler.proxyListener, capture);\n              handlers.splice(k, 1);\n            } else if (!listener) {\n              el.removeEventListener(event, handler.proxyListener, capture);\n              handlers.splice(k, 1);\n            }\n          }\n        }\n      }\n    }\n    return this;\n  }\n  function trigger() {\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n\n    var events = args[0].split(' ');\n    var eventData = args[1];\n    for (var i = 0; i < events.length; i += 1) {\n      var event = events[i];\n      for (var j = 0; j < this.length; j += 1) {\n        var el = this[j];\n        var evt = (void 0);\n        try {\n          evt = new win.CustomEvent(event, {\n            detail: eventData,\n            bubbles: true,\n            cancelable: true,\n          });\n        } catch (e) {\n          evt = doc.createEvent('Event');\n          evt.initEvent(event, true, true);\n          evt.detail = eventData;\n        }\n        // eslint-disable-next-line\n        el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });\n        el.dispatchEvent(evt);\n        el.dom7EventData = [];\n        delete el.dom7EventData;\n      }\n    }\n    return this;\n  }\n  function transitionEnd(callback) {\n    var events = ['webkitTransitionEnd', 'transitionend'];\n    var dom = this;\n    var i;\n    function fireCallBack(e) {\n      /* jshint validthis:true */\n      if (e.target !== this) { return; }\n      callback.call(this, e);\n      for (i = 0; i < events.length; i += 1) {\n        dom.off(events[i], fireCallBack);\n      }\n    }\n    if (callback) {\n      for (i = 0; i < events.length; i += 1) {\n        dom.on(events[i], fireCallBack);\n      }\n    }\n    return this;\n  }\n  function outerWidth(includeMargins) {\n    if (this.length > 0) {\n      if (includeMargins) {\n        // eslint-disable-next-line\n        var styles = this.styles();\n        return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n      }\n      return this[0].offsetWidth;\n    }\n    return null;\n  }\n  function outerHeight(includeMargins) {\n    if (this.length > 0) {\n      if (includeMargins) {\n        // eslint-disable-next-line\n        var styles = this.styles();\n        return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n      }\n      return this[0].offsetHeight;\n    }\n    return null;\n  }\n  function offset() {\n    if (this.length > 0) {\n      var el = this[0];\n      var box = el.getBoundingClientRect();\n      var body = doc.body;\n      var clientTop = el.clientTop || body.clientTop || 0;\n      var clientLeft = el.clientLeft || body.clientLeft || 0;\n      var scrollTop = el === win ? win.scrollY : el.scrollTop;\n      var scrollLeft = el === win ? win.scrollX : el.scrollLeft;\n      return {\n        top: (box.top + scrollTop) - clientTop,\n        left: (box.left + scrollLeft) - clientLeft,\n      };\n    }\n\n    return null;\n  }\n  function styles() {\n    if (this[0]) { return win.getComputedStyle(this[0], null); }\n    return {};\n  }\n  function css(props, value) {\n    var i;\n    if (arguments.length === 1) {\n      if (typeof props === 'string') {\n        if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }\n      } else {\n        for (i = 0; i < this.length; i += 1) {\n          // eslint-disable-next-line\n          for (var prop in props) {\n            this[i].style[prop] = props[prop];\n          }\n        }\n        return this;\n      }\n    }\n    if (arguments.length === 2 && typeof props === 'string') {\n      for (i = 0; i < this.length; i += 1) {\n        this[i].style[props] = value;\n      }\n      return this;\n    }\n    return this;\n  }\n  // Iterate over the collection passing elements to `callback`\n  function each(callback) {\n    // Don't bother continuing without a callback\n    if (!callback) { return this; }\n    // Iterate over the current collection\n    for (var i = 0; i < this.length; i += 1) {\n      // If the callback returns false\n      if (callback.call(this[i], i, this[i]) === false) {\n        // End the loop early\n        return this;\n      }\n    }\n    // Return `this` to allow chained DOM operations\n    return this;\n  }\n  // eslint-disable-next-line\n  function html(html) {\n    if (typeof html === 'undefined') {\n      return this[0] ? this[0].innerHTML : undefined;\n    }\n\n    for (var i = 0; i < this.length; i += 1) {\n      this[i].innerHTML = html;\n    }\n    return this;\n  }\n  // eslint-disable-next-line\n  function text(text) {\n    if (typeof text === 'undefined') {\n      if (this[0]) {\n        return this[0].textContent.trim();\n      }\n      return null;\n    }\n\n    for (var i = 0; i < this.length; i += 1) {\n      this[i].textContent = text;\n    }\n    return this;\n  }\n  function is(selector) {\n    var el = this[0];\n    var compareWith;\n    var i;\n    if (!el || typeof selector === 'undefined') { return false; }\n    if (typeof selector === 'string') {\n      if (el.matches) { return el.matches(selector); }\n      else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }\n      else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }\n\n      compareWith = $(selector);\n      for (i = 0; i < compareWith.length; i += 1) {\n        if (compareWith[i] === el) { return true; }\n      }\n      return false;\n    } else if (selector === doc) { return el === doc; }\n    else if (selector === win) { return el === win; }\n\n    if (selector.nodeType || selector instanceof Dom7) {\n      compareWith = selector.nodeType ? [selector] : selector;\n      for (i = 0; i < compareWith.length; i += 1) {\n        if (compareWith[i] === el) { return true; }\n      }\n      return false;\n    }\n    return false;\n  }\n  function index() {\n    var child = this[0];\n    var i;\n    if (child) {\n      i = 0;\n      // eslint-disable-next-line\n      while ((child = child.previousSibling) !== null) {\n        if (child.nodeType === 1) { i += 1; }\n      }\n      return i;\n    }\n    return undefined;\n  }\n  // eslint-disable-next-line\n  function eq(index) {\n    if (typeof index === 'undefined') { return this; }\n    var length = this.length;\n    var returnIndex;\n    if (index > length - 1) {\n      return new Dom7([]);\n    }\n    if (index < 0) {\n      returnIndex = length + index;\n      if (returnIndex < 0) { return new Dom7([]); }\n      return new Dom7([this[returnIndex]]);\n    }\n    return new Dom7([this[index]]);\n  }\n  function append() {\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n\n    var newChild;\n\n    for (var k = 0; k < args.length; k += 1) {\n      newChild = args[k];\n      for (var i = 0; i < this.length; i += 1) {\n        if (typeof newChild === 'string') {\n          var tempDiv = doc.createElement('div');\n          tempDiv.innerHTML = newChild;\n          while (tempDiv.firstChild) {\n            this[i].appendChild(tempDiv.firstChild);\n          }\n        } else if (newChild instanceof Dom7) {\n          for (var j = 0; j < newChild.length; j += 1) {\n            this[i].appendChild(newChild[j]);\n          }\n        } else {\n          this[i].appendChild(newChild);\n        }\n      }\n    }\n\n    return this;\n  }\n  function prepend(newChild) {\n    var i;\n    var j;\n    for (i = 0; i < this.length; i += 1) {\n      if (typeof newChild === 'string') {\n        var tempDiv = doc.createElement('div');\n        tempDiv.innerHTML = newChild;\n        for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n          this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n        }\n      } else if (newChild instanceof Dom7) {\n        for (j = 0; j < newChild.length; j += 1) {\n          this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n        }\n      } else {\n        this[i].insertBefore(newChild, this[i].childNodes[0]);\n      }\n    }\n    return this;\n  }\n  function next(selector) {\n    if (this.length > 0) {\n      if (selector) {\n        if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n          return new Dom7([this[0].nextElementSibling]);\n        }\n        return new Dom7([]);\n      }\n\n      if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }\n      return new Dom7([]);\n    }\n    return new Dom7([]);\n  }\n  function nextAll(selector) {\n    var nextEls = [];\n    var el = this[0];\n    if (!el) { return new Dom7([]); }\n    while (el.nextElementSibling) {\n      var next = el.nextElementSibling; // eslint-disable-line\n      if (selector) {\n        if ($(next).is(selector)) { nextEls.push(next); }\n      } else { nextEls.push(next); }\n      el = next;\n    }\n    return new Dom7(nextEls);\n  }\n  function prev(selector) {\n    if (this.length > 0) {\n      var el = this[0];\n      if (selector) {\n        if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n          return new Dom7([el.previousElementSibling]);\n        }\n        return new Dom7([]);\n      }\n\n      if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }\n      return new Dom7([]);\n    }\n    return new Dom7([]);\n  }\n  function prevAll(selector) {\n    var prevEls = [];\n    var el = this[0];\n    if (!el) { return new Dom7([]); }\n    while (el.previousElementSibling) {\n      var prev = el.previousElementSibling; // eslint-disable-line\n      if (selector) {\n        if ($(prev).is(selector)) { prevEls.push(prev); }\n      } else { prevEls.push(prev); }\n      el = prev;\n    }\n    return new Dom7(prevEls);\n  }\n  function parent(selector) {\n    var parents = []; // eslint-disable-line\n    for (var i = 0; i < this.length; i += 1) {\n      if (this[i].parentNode !== null) {\n        if (selector) {\n          if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }\n        } else {\n          parents.push(this[i].parentNode);\n        }\n      }\n    }\n    return $(unique(parents));\n  }\n  function parents(selector) {\n    var parents = []; // eslint-disable-line\n    for (var i = 0; i < this.length; i += 1) {\n      var parent = this[i].parentNode; // eslint-disable-line\n      while (parent) {\n        if (selector) {\n          if ($(parent).is(selector)) { parents.push(parent); }\n        } else {\n          parents.push(parent);\n        }\n        parent = parent.parentNode;\n      }\n    }\n    return $(unique(parents));\n  }\n  function closest(selector) {\n    var closest = this; // eslint-disable-line\n    if (typeof selector === 'undefined') {\n      return new Dom7([]);\n    }\n    if (!closest.is(selector)) {\n      closest = closest.parents(selector).eq(0);\n    }\n    return closest;\n  }\n  function find(selector) {\n    var foundElements = [];\n    for (var i = 0; i < this.length; i += 1) {\n      var found = this[i].querySelectorAll(selector);\n      for (var j = 0; j < found.length; j += 1) {\n        foundElements.push(found[j]);\n      }\n    }\n    return new Dom7(foundElements);\n  }\n  function children(selector) {\n    var children = []; // eslint-disable-line\n    for (var i = 0; i < this.length; i += 1) {\n      var childNodes = this[i].childNodes;\n\n      for (var j = 0; j < childNodes.length; j += 1) {\n        if (!selector) {\n          if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }\n        } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {\n          children.push(childNodes[j]);\n        }\n      }\n    }\n    return new Dom7(unique(children));\n  }\n  function remove() {\n    for (var i = 0; i < this.length; i += 1) {\n      if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }\n    }\n    return this;\n  }\n  function add() {\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n\n    var dom = this;\n    var i;\n    var j;\n    for (i = 0; i < args.length; i += 1) {\n      var toAdd = $(args[i]);\n      for (j = 0; j < toAdd.length; j += 1) {\n        dom[dom.length] = toAdd[j];\n        dom.length += 1;\n      }\n    }\n    return dom;\n  }\n\n  var Methods = {\n    addClass: addClass,\n    removeClass: removeClass,\n    hasClass: hasClass,\n    toggleClass: toggleClass,\n    attr: attr,\n    removeAttr: removeAttr,\n    data: data,\n    transform: transform,\n    transition: transition,\n    on: on,\n    off: off,\n    trigger: trigger,\n    transitionEnd: transitionEnd,\n    outerWidth: outerWidth,\n    outerHeight: outerHeight,\n    offset: offset,\n    css: css,\n    each: each,\n    html: html,\n    text: text,\n    is: is,\n    index: index,\n    eq: eq,\n    append: append,\n    prepend: prepend,\n    next: next,\n    nextAll: nextAll,\n    prev: prev,\n    prevAll: prevAll,\n    parent: parent,\n    parents: parents,\n    closest: closest,\n    find: find,\n    children: children,\n    remove: remove,\n    add: add,\n    styles: styles,\n  };\n\n  Object.keys(Methods).forEach(function (methodName) {\n    $.fn[methodName] = $.fn[methodName] || Methods[methodName];\n  });\n\n  var Utils = {\n    deleteProps: function deleteProps(obj) {\n      var object = obj;\n      Object.keys(object).forEach(function (key) {\n        try {\n          object[key] = null;\n        } catch (e) {\n          // no getter for object\n        }\n        try {\n          delete object[key];\n        } catch (e) {\n          // something got wrong\n        }\n      });\n    },\n    nextTick: function nextTick(callback, delay) {\n      if ( delay === void 0 ) delay = 0;\n\n      return setTimeout(callback, delay);\n    },\n    now: function now() {\n      return Date.now();\n    },\n    getTranslate: function getTranslate(el, axis) {\n      if ( axis === void 0 ) axis = 'x';\n\n      var matrix;\n      var curTransform;\n      var transformMatrix;\n\n      var curStyle = win.getComputedStyle(el, null);\n\n      if (win.WebKitCSSMatrix) {\n        curTransform = curStyle.transform || curStyle.webkitTransform;\n        if (curTransform.split(',').length > 6) {\n          curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');\n        }\n        // Some old versions of Webkit choke when 'none' is passed; pass\n        // empty string instead in this case\n        transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n      } else {\n        transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n        matrix = transformMatrix.toString().split(',');\n      }\n\n      if (axis === 'x') {\n        // Latest Chrome and webkits Fix\n        if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }\n        // Crazy IE10 Matrix\n        else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }\n        // Normal Browsers\n        else { curTransform = parseFloat(matrix[4]); }\n      }\n      if (axis === 'y') {\n        // Latest Chrome and webkits Fix\n        if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }\n        // Crazy IE10 Matrix\n        else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }\n        // Normal Browsers\n        else { curTransform = parseFloat(matrix[5]); }\n      }\n      return curTransform || 0;\n    },\n    parseUrlQuery: function parseUrlQuery(url) {\n      var query = {};\n      var urlToParse = url || win.location.href;\n      var i;\n      var params;\n      var param;\n      var length;\n      if (typeof urlToParse === 'string' && urlToParse.length) {\n        urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\\S*\\?/, '') : '';\n        params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });\n        length = params.length;\n\n        for (i = 0; i < length; i += 1) {\n          param = params[i].replace(/#\\S+/g, '').split('=');\n          query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param[1]) || '';\n        }\n      }\n      return query;\n    },\n    isObject: function isObject(o) {\n      return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;\n    },\n    extend: function extend() {\n      var args = [], len$1 = arguments.length;\n      while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];\n\n      var to = Object(args[0]);\n      for (var i = 1; i < args.length; i += 1) {\n        var nextSource = args[i];\n        if (nextSource !== undefined && nextSource !== null) {\n          var keysArray = Object.keys(Object(nextSource));\n          for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n            var nextKey = keysArray[nextIndex];\n            var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n            if (desc !== undefined && desc.enumerable) {\n              if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {\n                Utils.extend(to[nextKey], nextSource[nextKey]);\n              } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {\n                to[nextKey] = {};\n                Utils.extend(to[nextKey], nextSource[nextKey]);\n              } else {\n                to[nextKey] = nextSource[nextKey];\n              }\n            }\n          }\n        }\n      }\n      return to;\n    },\n  };\n\n  var Support = (function Support() {\n    var testDiv = doc.createElement('div');\n    return {\n      touch: (win.Modernizr && win.Modernizr.touch === true) || (function checkTouch() {\n        return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch));\n      }()),\n\n      pointerEvents: !!(win.navigator.pointerEnabled || win.PointerEvent || ('maxTouchPoints' in win.navigator && win.navigator.maxTouchPoints > 0)),\n      prefixedPointerEvents: !!win.navigator.msPointerEnabled,\n\n      transition: (function checkTransition() {\n        var style = testDiv.style;\n        return ('transition' in style || 'webkitTransition' in style || 'MozTransition' in style);\n      }()),\n      transforms3d: (win.Modernizr && win.Modernizr.csstransforms3d === true) || (function checkTransforms3d() {\n        var style = testDiv.style;\n        return ('webkitPerspective' in style || 'MozPerspective' in style || 'OPerspective' in style || 'MsPerspective' in style || 'perspective' in style);\n      }()),\n\n      flexbox: (function checkFlexbox() {\n        var style = testDiv.style;\n        var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' ');\n        for (var i = 0; i < styles.length; i += 1) {\n          if (styles[i] in style) { return true; }\n        }\n        return false;\n      }()),\n\n      observer: (function checkObserver() {\n        return ('MutationObserver' in win || 'WebkitMutationObserver' in win);\n      }()),\n\n      passiveListener: (function checkPassiveListener() {\n        var supportsPassive = false;\n        try {\n          var opts = Object.defineProperty({}, 'passive', {\n            // eslint-disable-next-line\n            get: function get() {\n              supportsPassive = true;\n            },\n          });\n          win.addEventListener('testPassiveListener', null, opts);\n        } catch (e) {\n          // No support\n        }\n        return supportsPassive;\n      }()),\n\n      gestures: (function checkGestures() {\n        return 'ongesturestart' in win;\n      }()),\n    };\n  }());\n\n  var Browser = (function Browser() {\n    function isSafari() {\n      var ua = win.navigator.userAgent.toLowerCase();\n      return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);\n    }\n    return {\n      isIE: !!win.navigator.userAgent.match(/Trident/g) || !!win.navigator.userAgent.match(/MSIE/g),\n      isEdge: !!win.navigator.userAgent.match(/Edge/g),\n      isSafari: isSafari(),\n      isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),\n    };\n  }());\n\n  var SwiperClass = function SwiperClass(params) {\n    if ( params === void 0 ) params = {};\n\n    var self = this;\n    self.params = params;\n\n    // Events\n    self.eventsListeners = {};\n\n    if (self.params && self.params.on) {\n      Object.keys(self.params.on).forEach(function (eventName) {\n        self.on(eventName, self.params.on[eventName]);\n      });\n    }\n  };\n\n  var staticAccessors = { components: { configurable: true } };\n\n  SwiperClass.prototype.on = function on (events, handler, priority) {\n    var self = this;\n    if (typeof handler !== 'function') { return self; }\n    var method = priority ? 'unshift' : 'push';\n    events.split(' ').forEach(function (event) {\n      if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }\n      self.eventsListeners[event][method](handler);\n    });\n    return self;\n  };\n\n  SwiperClass.prototype.once = function once (events, handler, priority) {\n    var self = this;\n    if (typeof handler !== 'function') { return self; }\n    function onceHandler() {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n      handler.apply(self, args);\n      self.off(events, onceHandler);\n      if (onceHandler.f7proxy) {\n        delete onceHandler.f7proxy;\n      }\n    }\n    onceHandler.f7proxy = handler;\n    return self.on(events, onceHandler, priority);\n  };\n\n  SwiperClass.prototype.off = function off (events, handler) {\n    var self = this;\n    if (!self.eventsListeners) { return self; }\n    events.split(' ').forEach(function (event) {\n      if (typeof handler === 'undefined') {\n        self.eventsListeners[event] = [];\n      } else if (self.eventsListeners[event] && self.eventsListeners[event].length) {\n        self.eventsListeners[event].forEach(function (eventHandler, index) {\n          if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {\n            self.eventsListeners[event].splice(index, 1);\n          }\n        });\n      }\n    });\n    return self;\n  };\n\n  SwiperClass.prototype.emit = function emit () {\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n\n    var self = this;\n    if (!self.eventsListeners) { return self; }\n    var events;\n    var data;\n    var context;\n    if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n      events = args[0];\n      data = args.slice(1, args.length);\n      context = self;\n    } else {\n      events = args[0].events;\n      data = args[0].data;\n      context = args[0].context || self;\n    }\n    var eventsArray = Array.isArray(events) ? events : events.split(' ');\n    eventsArray.forEach(function (event) {\n      if (self.eventsListeners && self.eventsListeners[event]) {\n        var handlers = [];\n        self.eventsListeners[event].forEach(function (eventHandler) {\n          handlers.push(eventHandler);\n        });\n        handlers.forEach(function (eventHandler) {\n          eventHandler.apply(context, data);\n        });\n      }\n    });\n    return self;\n  };\n\n  SwiperClass.prototype.useModulesParams = function useModulesParams (instanceParams) {\n    var instance = this;\n    if (!instance.modules) { return; }\n    Object.keys(instance.modules).forEach(function (moduleName) {\n      var module = instance.modules[moduleName];\n      // Extend params\n      if (module.params) {\n        Utils.extend(instanceParams, module.params);\n      }\n    });\n  };\n\n  SwiperClass.prototype.useModules = function useModules (modulesParams) {\n      if ( modulesParams === void 0 ) modulesParams = {};\n\n    var instance = this;\n    if (!instance.modules) { return; }\n    Object.keys(instance.modules).forEach(function (moduleName) {\n      var module = instance.modules[moduleName];\n      var moduleParams = modulesParams[moduleName] || {};\n      // Extend instance methods and props\n      if (module.instance) {\n        Object.keys(module.instance).forEach(function (modulePropName) {\n          var moduleProp = module.instance[modulePropName];\n          if (typeof moduleProp === 'function') {\n            instance[modulePropName] = moduleProp.bind(instance);\n          } else {\n            instance[modulePropName] = moduleProp;\n          }\n        });\n      }\n      // Add event listeners\n      if (module.on && instance.on) {\n        Object.keys(module.on).forEach(function (moduleEventName) {\n          instance.on(moduleEventName, module.on[moduleEventName]);\n        });\n      }\n\n      // Module create callback\n      if (module.create) {\n        module.create.bind(instance)(moduleParams);\n      }\n    });\n  };\n\n  staticAccessors.components.set = function (components) {\n    var Class = this;\n    if (!Class.use) { return; }\n    Class.use(components);\n  };\n\n  SwiperClass.installModule = function installModule (module) {\n      var params = [], len = arguments.length - 1;\n      while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];\n\n    var Class = this;\n    if (!Class.prototype.modules) { Class.prototype.modules = {}; }\n    var name = module.name || (((Object.keys(Class.prototype.modules).length) + \"_\" + (Utils.now())));\n    Class.prototype.modules[name] = module;\n    // Prototype\n    if (module.proto) {\n      Object.keys(module.proto).forEach(function (key) {\n        Class.prototype[key] = module.proto[key];\n      });\n    }\n    // Class\n    if (module.static) {\n      Object.keys(module.static).forEach(function (key) {\n        Class[key] = module.static[key];\n      });\n    }\n    // Callback\n    if (module.install) {\n      module.install.apply(Class, params);\n    }\n    return Class;\n  };\n\n  SwiperClass.use = function use (module) {\n      var params = [], len = arguments.length - 1;\n      while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];\n\n    var Class = this;\n    if (Array.isArray(module)) {\n      module.forEach(function (m) { return Class.installModule(m); });\n      return Class;\n    }\n    return Class.installModule.apply(Class, [ module ].concat( params ));\n  };\n\n  Object.defineProperties( SwiperClass, staticAccessors );\n\n  function updateSize () {\n    var swiper = this;\n    var width;\n    var height;\n    var $el = swiper.$el;\n    if (typeof swiper.params.width !== 'undefined') {\n      width = swiper.params.width;\n    } else {\n      width = $el[0].clientWidth;\n    }\n    if (typeof swiper.params.height !== 'undefined') {\n      height = swiper.params.height;\n    } else {\n      height = $el[0].clientHeight;\n    }\n    if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n      return;\n    }\n\n    // Subtract paddings\n    width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);\n    height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);\n\n    Utils.extend(swiper, {\n      width: width,\n      height: height,\n      size: swiper.isHorizontal() ? width : height,\n    });\n  }\n\n  function updateSlides () {\n    var swiper = this;\n    var params = swiper.params;\n\n    var $wrapperEl = swiper.$wrapperEl;\n    var swiperSize = swiper.size;\n    var rtl = swiper.rtlTranslate;\n    var wrongRTL = swiper.wrongRTL;\n    var isVirtual = swiper.virtual && params.virtual.enabled;\n    var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n    var slides = $wrapperEl.children((\".\" + (swiper.params.slideClass)));\n    var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n    var snapGrid = [];\n    var slidesGrid = [];\n    var slidesSizesGrid = [];\n\n    var offsetBefore = params.slidesOffsetBefore;\n    if (typeof offsetBefore === 'function') {\n      offsetBefore = params.slidesOffsetBefore.call(swiper);\n    }\n\n    var offsetAfter = params.slidesOffsetAfter;\n    if (typeof offsetAfter === 'function') {\n      offsetAfter = params.slidesOffsetAfter.call(swiper);\n    }\n\n    var previousSnapGridLength = swiper.snapGrid.length;\n    var previousSlidesGridLength = swiper.snapGrid.length;\n\n    var spaceBetween = params.spaceBetween;\n    var slidePosition = -offsetBefore;\n    var prevSlideSize = 0;\n    var index = 0;\n    if (typeof swiperSize === 'undefined') {\n      return;\n    }\n    if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n      spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n    }\n\n    swiper.virtualSize = -spaceBetween;\n\n    // reset margins\n    if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }\n    else { slides.css({ marginRight: '', marginBottom: '' }); }\n\n    var slidesNumberEvenToRows;\n    if (params.slidesPerColumn > 1) {\n      if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {\n        slidesNumberEvenToRows = slidesLength;\n      } else {\n        slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;\n      }\n      if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {\n        slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);\n      }\n    }\n\n    // Calc slides\n    var slideSize;\n    var slidesPerColumn = params.slidesPerColumn;\n    var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;\n    var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);\n    for (var i = 0; i < slidesLength; i += 1) {\n      slideSize = 0;\n      var slide = slides.eq(i);\n      if (params.slidesPerColumn > 1) {\n        // Set slides order\n        var newSlideOrderIndex = (void 0);\n        var column = (void 0);\n        var row = (void 0);\n        if (\n          (params.slidesPerColumnFill === 'column')\n          || (params.slidesPerColumnFill === 'row' && params.slidesPerGroup > 1)\n        ) {\n          if (params.slidesPerColumnFill === 'column') {\n            column = Math.floor(i / slidesPerColumn);\n            row = i - (column * slidesPerColumn);\n            if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {\n              row += 1;\n              if (row >= slidesPerColumn) {\n                row = 0;\n                column += 1;\n              }\n            }\n          } else {\n            var groupIndex = Math.floor(i / params.slidesPerGroup);\n            row = Math.floor(i / params.slidesPerView) - groupIndex * params.slidesPerColumn;\n            column = i - row * params.slidesPerView - groupIndex * params.slidesPerView;\n          }\n          newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);\n          slide\n            .css({\n              '-webkit-box-ordinal-group': newSlideOrderIndex,\n              '-moz-box-ordinal-group': newSlideOrderIndex,\n              '-ms-flex-order': newSlideOrderIndex,\n              '-webkit-order': newSlideOrderIndex,\n              order: newSlideOrderIndex,\n            });\n        } else {\n          row = Math.floor(i / slidesPerRow);\n          column = i - (row * slidesPerRow);\n        }\n        slide\n          .css(\n            (\"margin-\" + (swiper.isHorizontal() ? 'top' : 'left')),\n            (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + \"px\"))\n          )\n          .attr('data-swiper-column', column)\n          .attr('data-swiper-row', row);\n      }\n      if (slide.css('display') === 'none') { continue; } // eslint-disable-line\n\n      if (params.slidesPerView === 'auto') {\n        var slideStyles = win.getComputedStyle(slide[0], null);\n        var currentTransform = slide[0].style.transform;\n        var currentWebKitTransform = slide[0].style.webkitTransform;\n        if (currentTransform) {\n          slide[0].style.transform = 'none';\n        }\n        if (currentWebKitTransform) {\n          slide[0].style.webkitTransform = 'none';\n        }\n        if (params.roundLengths) {\n          slideSize = swiper.isHorizontal()\n            ? slide.outerWidth(true)\n            : slide.outerHeight(true);\n        } else {\n          // eslint-disable-next-line\n          if (swiper.isHorizontal()) {\n            var width = parseFloat(slideStyles.getPropertyValue('width'));\n            var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));\n            var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));\n            var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));\n            var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));\n            var boxSizing = slideStyles.getPropertyValue('box-sizing');\n            if (boxSizing && boxSizing === 'border-box' && !Browser.isIE) {\n              slideSize = width + marginLeft + marginRight;\n            } else {\n              slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;\n            }\n          } else {\n            var height = parseFloat(slideStyles.getPropertyValue('height'));\n            var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));\n            var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));\n            var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));\n            var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));\n            var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');\n            if (boxSizing$1 && boxSizing$1 === 'border-box' && !Browser.isIE) {\n              slideSize = height + marginTop + marginBottom;\n            } else {\n              slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;\n            }\n          }\n        }\n        if (currentTransform) {\n          slide[0].style.transform = currentTransform;\n        }\n        if (currentWebKitTransform) {\n          slide[0].style.webkitTransform = currentWebKitTransform;\n        }\n        if (params.roundLengths) { slideSize = Math.floor(slideSize); }\n      } else {\n        slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;\n        if (params.roundLengths) { slideSize = Math.floor(slideSize); }\n\n        if (slides[i]) {\n          if (swiper.isHorizontal()) {\n            slides[i].style.width = slideSize + \"px\";\n          } else {\n            slides[i].style.height = slideSize + \"px\";\n          }\n        }\n      }\n      if (slides[i]) {\n        slides[i].swiperSlideSize = slideSize;\n      }\n      slidesSizesGrid.push(slideSize);\n\n\n      if (params.centeredSlides) {\n        slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;\n        if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }\n        if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }\n        if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }\n        if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }\n        if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }\n        slidesGrid.push(slidePosition);\n      } else {\n        if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }\n        if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }\n        slidesGrid.push(slidePosition);\n        slidePosition = slidePosition + slideSize + spaceBetween;\n      }\n\n      swiper.virtualSize += slideSize + spaceBetween;\n\n      prevSlideSize = slideSize;\n\n      index += 1;\n    }\n    swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n    var newSlidesGrid;\n\n    if (\n      rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n      $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + \"px\") });\n    }\n    if (!Support.flexbox || params.setWrapperSize) {\n      if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n      else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n    }\n\n    if (params.slidesPerColumn > 1) {\n      swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;\n      swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;\n      if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n      else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n      if (params.centeredSlides) {\n        newSlidesGrid = [];\n        for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {\n          var slidesGridItem = snapGrid[i$1];\n          if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }\n          if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }\n        }\n        snapGrid = newSlidesGrid;\n      }\n    }\n\n    // Remove last grid elements depending on width\n    if (!params.centeredSlides) {\n      newSlidesGrid = [];\n      for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {\n        var slidesGridItem$1 = snapGrid[i$2];\n        if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }\n        if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {\n          newSlidesGrid.push(slidesGridItem$1);\n        }\n      }\n      snapGrid = newSlidesGrid;\n      if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n        snapGrid.push(swiper.virtualSize - swiperSize);\n      }\n    }\n    if (snapGrid.length === 0) { snapGrid = [0]; }\n\n    if (params.spaceBetween !== 0) {\n      if (swiper.isHorizontal()) {\n        if (rtl) { slides.css({ marginLeft: (spaceBetween + \"px\") }); }\n        else { slides.css({ marginRight: (spaceBetween + \"px\") }); }\n      } else { slides.css({ marginBottom: (spaceBetween + \"px\") }); }\n    }\n\n    if (params.centerInsufficientSlides) {\n      var allSlidesSize = 0;\n      slidesSizesGrid.forEach(function (slideSizeValue) {\n        allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n      });\n      allSlidesSize -= params.spaceBetween;\n      if (allSlidesSize < swiperSize) {\n        var allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n        snapGrid.forEach(function (snap, snapIndex) {\n          snapGrid[snapIndex] = snap - allSlidesOffset;\n        });\n        slidesGrid.forEach(function (snap, snapIndex) {\n          slidesGrid[snapIndex] = snap + allSlidesOffset;\n        });\n      }\n    }\n\n    Utils.extend(swiper, {\n      slides: slides,\n      snapGrid: snapGrid,\n      slidesGrid: slidesGrid,\n      slidesSizesGrid: slidesSizesGrid,\n    });\n\n    if (slidesLength !== previousSlidesLength) {\n      swiper.emit('slidesLengthChange');\n    }\n    if (snapGrid.length !== previousSnapGridLength) {\n      if (swiper.params.watchOverflow) { swiper.checkOverflow(); }\n      swiper.emit('snapGridLengthChange');\n    }\n    if (slidesGrid.length !== previousSlidesGridLength) {\n      swiper.emit('slidesGridLengthChange');\n    }\n\n    if (params.watchSlidesProgress || params.watchSlidesVisibility) {\n      swiper.updateSlidesOffset();\n    }\n  }\n\n  function updateAutoHeight (speed) {\n    var swiper = this;\n    var activeSlides = [];\n    var newHeight = 0;\n    var i;\n    if (typeof speed === 'number') {\n      swiper.setTransition(speed);\n    } else if (speed === true) {\n      swiper.setTransition(swiper.params.speed);\n    }\n    // Find slides currently in view\n    if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n        var index = swiper.activeIndex + i;\n        if (index > swiper.slides.length) { break; }\n        activeSlides.push(swiper.slides.eq(index)[0]);\n      }\n    } else {\n      activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);\n    }\n\n    // Find new height from highest slide in view\n    for (i = 0; i < activeSlides.length; i += 1) {\n      if (typeof activeSlides[i] !== 'undefined') {\n        var height = activeSlides[i].offsetHeight;\n        newHeight = height > newHeight ? height : newHeight;\n      }\n    }\n\n    // Update Height\n    if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + \"px\")); }\n  }\n\n  function updateSlidesOffset () {\n    var swiper = this;\n    var slides = swiper.slides;\n    for (var i = 0; i < slides.length; i += 1) {\n      slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;\n    }\n  }\n\n  function updateSlidesProgress (translate) {\n    if ( translate === void 0 ) translate = (this && this.translate) || 0;\n\n    var swiper = this;\n    var params = swiper.params;\n\n    var slides = swiper.slides;\n    var rtl = swiper.rtlTranslate;\n\n    if (slides.length === 0) { return; }\n    if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }\n\n    var offsetCenter = -translate;\n    if (rtl) { offsetCenter = translate; }\n\n    // Visible Slides\n    slides.removeClass(params.slideVisibleClass);\n\n    swiper.visibleSlidesIndexes = [];\n    swiper.visibleSlides = [];\n\n    for (var i = 0; i < slides.length; i += 1) {\n      var slide = slides[i];\n      var slideProgress = (\n        (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset\n      ) / (slide.swiperSlideSize + params.spaceBetween);\n      if (params.watchSlidesVisibility) {\n        var slideBefore = -(offsetCenter - slide.swiperSlideOffset);\n        var slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n        var isVisible = (slideBefore >= 0 && slideBefore < swiper.size - 1)\n                  || (slideAfter > 1 && slideAfter <= swiper.size)\n                  || (slideBefore <= 0 && slideAfter >= swiper.size);\n        if (isVisible) {\n          swiper.visibleSlides.push(slide);\n          swiper.visibleSlidesIndexes.push(i);\n          slides.eq(i).addClass(params.slideVisibleClass);\n        }\n      }\n      slide.progress = rtl ? -slideProgress : slideProgress;\n    }\n    swiper.visibleSlides = $(swiper.visibleSlides);\n  }\n\n  function updateProgress (translate) {\n    if ( translate === void 0 ) translate = (this && this.translate) || 0;\n\n    var swiper = this;\n    var params = swiper.params;\n\n    var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n    var progress = swiper.progress;\n    var isBeginning = swiper.isBeginning;\n    var isEnd = swiper.isEnd;\n    var wasBeginning = isBeginning;\n    var wasEnd = isEnd;\n    if (translatesDiff === 0) {\n      progress = 0;\n      isBeginning = true;\n      isEnd = true;\n    } else {\n      progress = (translate - swiper.minTranslate()) / (translatesDiff);\n      isBeginning = progress <= 0;\n      isEnd = progress >= 1;\n    }\n    Utils.extend(swiper, {\n      progress: progress,\n      isBeginning: isBeginning,\n      isEnd: isEnd,\n    });\n\n    if (params.watchSlidesProgress || params.watchSlidesVisibility) { swiper.updateSlidesProgress(translate); }\n\n    if (isBeginning && !wasBeginning) {\n      swiper.emit('reachBeginning toEdge');\n    }\n    if (isEnd && !wasEnd) {\n      swiper.emit('reachEnd toEdge');\n    }\n    if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n      swiper.emit('fromEdge');\n    }\n\n    swiper.emit('progress', progress);\n  }\n\n  function updateSlidesClasses () {\n    var swiper = this;\n\n    var slides = swiper.slides;\n    var params = swiper.params;\n    var $wrapperEl = swiper.$wrapperEl;\n    var activeIndex = swiper.activeIndex;\n    var realIndex = swiper.realIndex;\n    var isVirtual = swiper.virtual && params.virtual.enabled;\n\n    slides.removeClass(((params.slideActiveClass) + \" \" + (params.slideNextClass) + \" \" + (params.slidePrevClass) + \" \" + (params.slideDuplicateActiveClass) + \" \" + (params.slideDuplicateNextClass) + \" \" + (params.slideDuplicatePrevClass)));\n\n    var activeSlide;\n    if (isVirtual) {\n      activeSlide = swiper.$wrapperEl.find((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + activeIndex + \"\\\"]\"));\n    } else {\n      activeSlide = slides.eq(activeIndex);\n    }\n\n    // Active classes\n    activeSlide.addClass(params.slideActiveClass);\n\n    if (params.loop) {\n      // Duplicate to all looped slides\n      if (activeSlide.hasClass(params.slideDuplicateClass)) {\n        $wrapperEl\n          .children((\".\" + (params.slideClass) + \":not(.\" + (params.slideDuplicateClass) + \")[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]\"))\n          .addClass(params.slideDuplicateActiveClass);\n      } else {\n        $wrapperEl\n          .children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]\"))\n          .addClass(params.slideDuplicateActiveClass);\n      }\n    }\n    // Next Slide\n    var nextSlide = activeSlide.nextAll((\".\" + (params.slideClass))).eq(0).addClass(params.slideNextClass);\n    if (params.loop && nextSlide.length === 0) {\n      nextSlide = slides.eq(0);\n      nextSlide.addClass(params.slideNextClass);\n    }\n    // Prev Slide\n    var prevSlide = activeSlide.prevAll((\".\" + (params.slideClass))).eq(0).addClass(params.slidePrevClass);\n    if (params.loop && prevSlide.length === 0) {\n      prevSlide = slides.eq(-1);\n      prevSlide.addClass(params.slidePrevClass);\n    }\n    if (params.loop) {\n      // Duplicate to all looped slides\n      if (nextSlide.hasClass(params.slideDuplicateClass)) {\n        $wrapperEl\n          .children((\".\" + (params.slideClass) + \":not(.\" + (params.slideDuplicateClass) + \")[data-swiper-slide-index=\\\"\" + (nextSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n          .addClass(params.slideDuplicateNextClass);\n      } else {\n        $wrapperEl\n          .children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + (nextSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n          .addClass(params.slideDuplicateNextClass);\n      }\n      if (prevSlide.hasClass(params.slideDuplicateClass)) {\n        $wrapperEl\n          .children((\".\" + (params.slideClass) + \":not(.\" + (params.slideDuplicateClass) + \")[data-swiper-slide-index=\\\"\" + (prevSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n          .addClass(params.slideDuplicatePrevClass);\n      } else {\n        $wrapperEl\n          .children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + (prevSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n          .addClass(params.slideDuplicatePrevClass);\n      }\n    }\n  }\n\n  function updateActiveIndex (newActiveIndex) {\n    var swiper = this;\n    var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n    var slidesGrid = swiper.slidesGrid;\n    var snapGrid = swiper.snapGrid;\n    var params = swiper.params;\n    var previousIndex = swiper.activeIndex;\n    var previousRealIndex = swiper.realIndex;\n    var previousSnapIndex = swiper.snapIndex;\n    var activeIndex = newActiveIndex;\n    var snapIndex;\n    if (typeof activeIndex === 'undefined') {\n      for (var i = 0; i < slidesGrid.length; i += 1) {\n        if (typeof slidesGrid[i + 1] !== 'undefined') {\n          if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {\n            activeIndex = i;\n          } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n            activeIndex = i + 1;\n          }\n        } else if (translate >= slidesGrid[i]) {\n          activeIndex = i;\n        }\n      }\n      // Normalize slideIndex\n      if (params.normalizeSlideIndex) {\n        if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }\n      }\n    }\n    if (snapGrid.indexOf(translate) >= 0) {\n      snapIndex = snapGrid.indexOf(translate);\n    } else {\n      snapIndex = Math.floor(activeIndex / params.slidesPerGroup);\n    }\n    if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }\n    if (activeIndex === previousIndex) {\n      if (snapIndex !== previousSnapIndex) {\n        swiper.snapIndex = snapIndex;\n        swiper.emit('snapIndexChange');\n      }\n      return;\n    }\n\n    // Get real index\n    var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);\n\n    Utils.extend(swiper, {\n      snapIndex: snapIndex,\n      realIndex: realIndex,\n      previousIndex: previousIndex,\n      activeIndex: activeIndex,\n    });\n    swiper.emit('activeIndexChange');\n    swiper.emit('snapIndexChange');\n    if (previousRealIndex !== realIndex) {\n      swiper.emit('realIndexChange');\n    }\n    if (swiper.initialized || swiper.runCallbacksOnInit) {\n      swiper.emit('slideChange');\n    }\n  }\n\n  function updateClickedSlide (e) {\n    var swiper = this;\n    var params = swiper.params;\n    var slide = $(e.target).closest((\".\" + (params.slideClass)))[0];\n    var slideFound = false;\n    if (slide) {\n      for (var i = 0; i < swiper.slides.length; i += 1) {\n        if (swiper.slides[i] === slide) { slideFound = true; }\n      }\n    }\n\n    if (slide && slideFound) {\n      swiper.clickedSlide = slide;\n      if (swiper.virtual && swiper.params.virtual.enabled) {\n        swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n      } else {\n        swiper.clickedIndex = $(slide).index();\n      }\n    } else {\n      swiper.clickedSlide = undefined;\n      swiper.clickedIndex = undefined;\n      return;\n    }\n    if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n      swiper.slideToClickedSlide();\n    }\n  }\n\n  var update = {\n    updateSize: updateSize,\n    updateSlides: updateSlides,\n    updateAutoHeight: updateAutoHeight,\n    updateSlidesOffset: updateSlidesOffset,\n    updateSlidesProgress: updateSlidesProgress,\n    updateProgress: updateProgress,\n    updateSlidesClasses: updateSlidesClasses,\n    updateActiveIndex: updateActiveIndex,\n    updateClickedSlide: updateClickedSlide,\n  };\n\n  function getTranslate (axis) {\n    if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';\n\n    var swiper = this;\n\n    var params = swiper.params;\n    var rtl = swiper.rtlTranslate;\n    var translate = swiper.translate;\n    var $wrapperEl = swiper.$wrapperEl;\n\n    if (params.virtualTranslate) {\n      return rtl ? -translate : translate;\n    }\n\n    var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);\n    if (rtl) { currentTranslate = -currentTranslate; }\n\n    return currentTranslate || 0;\n  }\n\n  function setTranslate (translate, byController) {\n    var swiper = this;\n    var rtl = swiper.rtlTranslate;\n    var params = swiper.params;\n    var $wrapperEl = swiper.$wrapperEl;\n    var progress = swiper.progress;\n    var x = 0;\n    var y = 0;\n    var z = 0;\n\n    if (swiper.isHorizontal()) {\n      x = rtl ? -translate : translate;\n    } else {\n      y = translate;\n    }\n\n    if (params.roundLengths) {\n      x = Math.floor(x);\n      y = Math.floor(y);\n    }\n\n    if (!params.virtualTranslate) {\n      if (Support.transforms3d) { $wrapperEl.transform((\"translate3d(\" + x + \"px, \" + y + \"px, \" + z + \"px)\")); }\n      else { $wrapperEl.transform((\"translate(\" + x + \"px, \" + y + \"px)\")); }\n    }\n    swiper.previousTranslate = swiper.translate;\n    swiper.translate = swiper.isHorizontal() ? x : y;\n\n    // Check if we need to update progress\n    var newProgress;\n    var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n    if (translatesDiff === 0) {\n      newProgress = 0;\n    } else {\n      newProgress = (translate - swiper.minTranslate()) / (translatesDiff);\n    }\n    if (newProgress !== progress) {\n      swiper.updateProgress(translate);\n    }\n\n    swiper.emit('setTranslate', swiper.translate, byController);\n  }\n\n  function minTranslate () {\n    return (-this.snapGrid[0]);\n  }\n\n  function maxTranslate () {\n    return (-this.snapGrid[this.snapGrid.length - 1]);\n  }\n\n  var translate = {\n    getTranslate: getTranslate,\n    setTranslate: setTranslate,\n    minTranslate: minTranslate,\n    maxTranslate: maxTranslate,\n  };\n\n  function setTransition (duration, byController) {\n    var swiper = this;\n\n    swiper.$wrapperEl.transition(duration);\n\n    swiper.emit('setTransition', duration, byController);\n  }\n\n  function transitionStart (runCallbacks, direction) {\n    if ( runCallbacks === void 0 ) runCallbacks = true;\n\n    var swiper = this;\n    var activeIndex = swiper.activeIndex;\n    var params = swiper.params;\n    var previousIndex = swiper.previousIndex;\n    if (params.autoHeight) {\n      swiper.updateAutoHeight();\n    }\n\n    var dir = direction;\n    if (!dir) {\n      if (activeIndex > previousIndex) { dir = 'next'; }\n      else if (activeIndex < previousIndex) { dir = 'prev'; }\n      else { dir = 'reset'; }\n    }\n\n    swiper.emit('transitionStart');\n\n    if (runCallbacks && activeIndex !== previousIndex) {\n      if (dir === 'reset') {\n        swiper.emit('slideResetTransitionStart');\n        return;\n      }\n      swiper.emit('slideChangeTransitionStart');\n      if (dir === 'next') {\n        swiper.emit('slideNextTransitionStart');\n      } else {\n        swiper.emit('slidePrevTransitionStart');\n      }\n    }\n  }\n\n  function transitionEnd$1 (runCallbacks, direction) {\n    if ( runCallbacks === void 0 ) runCallbacks = true;\n\n    var swiper = this;\n    var activeIndex = swiper.activeIndex;\n    var previousIndex = swiper.previousIndex;\n    swiper.animating = false;\n    swiper.setTransition(0);\n\n    var dir = direction;\n    if (!dir) {\n      if (activeIndex > previousIndex) { dir = 'next'; }\n      else if (activeIndex < previousIndex) { dir = 'prev'; }\n      else { dir = 'reset'; }\n    }\n\n    swiper.emit('transitionEnd');\n\n    if (runCallbacks && activeIndex !== previousIndex) {\n      if (dir === 'reset') {\n        swiper.emit('slideResetTransitionEnd');\n        return;\n      }\n      swiper.emit('slideChangeTransitionEnd');\n      if (dir === 'next') {\n        swiper.emit('slideNextTransitionEnd');\n      } else {\n        swiper.emit('slidePrevTransitionEnd');\n      }\n    }\n  }\n\n  var transition$1 = {\n    setTransition: setTransition,\n    transitionStart: transitionStart,\n    transitionEnd: transitionEnd$1,\n  };\n\n  function slideTo (index, speed, runCallbacks, internal) {\n    if ( index === void 0 ) index = 0;\n    if ( speed === void 0 ) speed = this.params.speed;\n    if ( runCallbacks === void 0 ) runCallbacks = true;\n\n    var swiper = this;\n    var slideIndex = index;\n    if (slideIndex < 0) { slideIndex = 0; }\n\n    var params = swiper.params;\n    var snapGrid = swiper.snapGrid;\n    var slidesGrid = swiper.slidesGrid;\n    var previousIndex = swiper.previousIndex;\n    var activeIndex = swiper.activeIndex;\n    var rtl = swiper.rtlTranslate;\n    if (swiper.animating && params.preventInteractionOnTransition) {\n      return false;\n    }\n\n    var snapIndex = Math.floor(slideIndex / params.slidesPerGroup);\n    if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }\n\n    if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n      swiper.emit('beforeSlideChangeStart');\n    }\n\n    var translate = -snapGrid[snapIndex];\n\n    // Update progress\n    swiper.updateProgress(translate);\n\n    // Normalize slideIndex\n    if (params.normalizeSlideIndex) {\n      for (var i = 0; i < slidesGrid.length; i += 1) {\n        if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {\n          slideIndex = i;\n        }\n      }\n    }\n    // Directions locks\n    if (swiper.initialized && slideIndex !== activeIndex) {\n      if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {\n        return false;\n      }\n      if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n        if ((activeIndex || 0) !== slideIndex) { return false; }\n      }\n    }\n\n    var direction;\n    if (slideIndex > activeIndex) { direction = 'next'; }\n    else if (slideIndex < activeIndex) { direction = 'prev'; }\n    else { direction = 'reset'; }\n\n\n    // Update Index\n    if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n      swiper.updateActiveIndex(slideIndex);\n      // Update Height\n      if (params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n      swiper.updateSlidesClasses();\n      if (params.effect !== 'slide') {\n        swiper.setTranslate(translate);\n      }\n      if (direction !== 'reset') {\n        swiper.transitionStart(runCallbacks, direction);\n        swiper.transitionEnd(runCallbacks, direction);\n      }\n      return false;\n    }\n\n    if (speed === 0 || !Support.transition) {\n      swiper.setTransition(0);\n      swiper.setTranslate(translate);\n      swiper.updateActiveIndex(slideIndex);\n      swiper.updateSlidesClasses();\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.transitionStart(runCallbacks, direction);\n      swiper.transitionEnd(runCallbacks, direction);\n    } else {\n      swiper.setTransition(speed);\n      swiper.setTranslate(translate);\n      swiper.updateActiveIndex(slideIndex);\n      swiper.updateSlidesClasses();\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.transitionStart(runCallbacks, direction);\n      if (!swiper.animating) {\n        swiper.animating = true;\n        if (!swiper.onSlideToWrapperTransitionEnd) {\n          swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n            if (!swiper || swiper.destroyed) { return; }\n            if (e.target !== this) { return; }\n            swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n            swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n            swiper.onSlideToWrapperTransitionEnd = null;\n            delete swiper.onSlideToWrapperTransitionEnd;\n            swiper.transitionEnd(runCallbacks, direction);\n          };\n        }\n        swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n        swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n      }\n    }\n\n    return true;\n  }\n\n  function slideToLoop (index, speed, runCallbacks, internal) {\n    if ( index === void 0 ) index = 0;\n    if ( speed === void 0 ) speed = this.params.speed;\n    if ( runCallbacks === void 0 ) runCallbacks = true;\n\n    var swiper = this;\n    var newIndex = index;\n    if (swiper.params.loop) {\n      newIndex += swiper.loopedSlides;\n    }\n\n    return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n  }\n\n  /* eslint no-unused-vars: \"off\" */\n  function slideNext (speed, runCallbacks, internal) {\n    if ( speed === void 0 ) speed = this.params.speed;\n    if ( runCallbacks === void 0 ) runCallbacks = true;\n\n    var swiper = this;\n    var params = swiper.params;\n    var animating = swiper.animating;\n    if (params.loop) {\n      if (animating) { return false; }\n      swiper.loopFix();\n      // eslint-disable-next-line\n      swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n      return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);\n    }\n    return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);\n  }\n\n  /* eslint no-unused-vars: \"off\" */\n  function slidePrev (speed, runCallbacks, internal) {\n    if ( speed === void 0 ) speed = this.params.speed;\n    if ( runCallbacks === void 0 ) runCallbacks = true;\n\n    var swiper = this;\n    var params = swiper.params;\n    var animating = swiper.animating;\n    var snapGrid = swiper.snapGrid;\n    var slidesGrid = swiper.slidesGrid;\n    var rtlTranslate = swiper.rtlTranslate;\n\n    if (params.loop) {\n      if (animating) { return false; }\n      swiper.loopFix();\n      // eslint-disable-next-line\n      swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n    }\n    var translate = rtlTranslate ? swiper.translate : -swiper.translate;\n    function normalize(val) {\n      if (val < 0) { return -Math.floor(Math.abs(val)); }\n      return Math.floor(val);\n    }\n    var normalizedTranslate = normalize(translate);\n    var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });\n    var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });\n\n    var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];\n    var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n    var prevIndex;\n    if (typeof prevSnap !== 'undefined') {\n      prevIndex = slidesGrid.indexOf(prevSnap);\n      if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }\n    }\n    return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n  }\n\n  /* eslint no-unused-vars: \"off\" */\n  function slideReset (speed, runCallbacks, internal) {\n    if ( speed === void 0 ) speed = this.params.speed;\n    if ( runCallbacks === void 0 ) runCallbacks = true;\n\n    var swiper = this;\n    return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n  }\n\n  /* eslint no-unused-vars: \"off\" */\n  function slideToClosest (speed, runCallbacks, internal) {\n    if ( speed === void 0 ) speed = this.params.speed;\n    if ( runCallbacks === void 0 ) runCallbacks = true;\n\n    var swiper = this;\n    var index = swiper.activeIndex;\n    var snapIndex = Math.floor(index / swiper.params.slidesPerGroup);\n\n    if (snapIndex < swiper.snapGrid.length - 1) {\n      var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n      var currentSnap = swiper.snapGrid[snapIndex];\n      var nextSnap = swiper.snapGrid[snapIndex + 1];\n\n      if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) {\n        index = swiper.params.slidesPerGroup;\n      }\n    }\n\n    return swiper.slideTo(index, speed, runCallbacks, internal);\n  }\n\n  function slideToClickedSlide () {\n    var swiper = this;\n    var params = swiper.params;\n    var $wrapperEl = swiper.$wrapperEl;\n\n    var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n    var slideToIndex = swiper.clickedIndex;\n    var realIndex;\n    if (params.loop) {\n      if (swiper.animating) { return; }\n      realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n      if (params.centeredSlides) {\n        if (\n          (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))\n          || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))\n        ) {\n          swiper.loopFix();\n          slideToIndex = $wrapperEl\n            .children((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]:not(.\" + (params.slideDuplicateClass) + \")\"))\n            .eq(0)\n            .index();\n\n          Utils.nextTick(function () {\n            swiper.slideTo(slideToIndex);\n          });\n        } else {\n          swiper.slideTo(slideToIndex);\n        }\n      } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n        swiper.loopFix();\n        slideToIndex = $wrapperEl\n          .children((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]:not(.\" + (params.slideDuplicateClass) + \")\"))\n          .eq(0)\n          .index();\n\n        Utils.nextTick(function () {\n          swiper.slideTo(slideToIndex);\n        });\n      } else {\n        swiper.slideTo(slideToIndex);\n      }\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  }\n\n  var slide = {\n    slideTo: slideTo,\n    slideToLoop: slideToLoop,\n    slideNext: slideNext,\n    slidePrev: slidePrev,\n    slideReset: slideReset,\n    slideToClosest: slideToClosest,\n    slideToClickedSlide: slideToClickedSlide,\n  };\n\n  function loopCreate () {\n    var swiper = this;\n    var params = swiper.params;\n    var $wrapperEl = swiper.$wrapperEl;\n    // Remove duplicated slides\n    $wrapperEl.children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass))).remove();\n\n    var slides = $wrapperEl.children((\".\" + (params.slideClass)));\n\n    if (params.loopFillGroupWithBlank) {\n      var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n      if (blankSlidesNum !== params.slidesPerGroup) {\n        for (var i = 0; i < blankSlidesNum; i += 1) {\n          var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + \" \" + (params.slideBlankClass)));\n          $wrapperEl.append(blankNode);\n        }\n        slides = $wrapperEl.children((\".\" + (params.slideClass)));\n      }\n    }\n\n    if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }\n\n    swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10);\n    swiper.loopedSlides += params.loopAdditionalSlides;\n    if (swiper.loopedSlides > slides.length) {\n      swiper.loopedSlides = slides.length;\n    }\n\n    var prependSlides = [];\n    var appendSlides = [];\n    slides.each(function (index, el) {\n      var slide = $(el);\n      if (index < swiper.loopedSlides) { appendSlides.push(el); }\n      if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }\n      slide.attr('data-swiper-slide-index', index);\n    });\n    for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {\n      $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));\n    }\n    for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {\n      $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));\n    }\n  }\n\n  function loopFix () {\n    var swiper = this;\n    var params = swiper.params;\n    var activeIndex = swiper.activeIndex;\n    var slides = swiper.slides;\n    var loopedSlides = swiper.loopedSlides;\n    var allowSlidePrev = swiper.allowSlidePrev;\n    var allowSlideNext = swiper.allowSlideNext;\n    var snapGrid = swiper.snapGrid;\n    var rtl = swiper.rtlTranslate;\n    var newIndex;\n    swiper.allowSlidePrev = true;\n    swiper.allowSlideNext = true;\n\n    var snapTranslate = -snapGrid[activeIndex];\n    var diff = snapTranslate - swiper.getTranslate();\n\n\n    // Fix For Negative Oversliding\n    if (activeIndex < loopedSlides) {\n      newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;\n      newIndex += loopedSlides;\n      var slideChanged = swiper.slideTo(newIndex, 0, false, true);\n      if (slideChanged && diff !== 0) {\n        swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n      }\n    } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) {\n      // Fix For Positive Oversliding\n      newIndex = -slides.length + activeIndex + loopedSlides;\n      newIndex += loopedSlides;\n      var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);\n      if (slideChanged$1 && diff !== 0) {\n        swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n      }\n    }\n    swiper.allowSlidePrev = allowSlidePrev;\n    swiper.allowSlideNext = allowSlideNext;\n  }\n\n  function loopDestroy () {\n    var swiper = this;\n    var $wrapperEl = swiper.$wrapperEl;\n    var params = swiper.params;\n    var slides = swiper.slides;\n    $wrapperEl.children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \",.\" + (params.slideClass) + \".\" + (params.slideBlankClass))).remove();\n    slides.removeAttr('data-swiper-slide-index');\n  }\n\n  var loop = {\n    loopCreate: loopCreate,\n    loopFix: loopFix,\n    loopDestroy: loopDestroy,\n  };\n\n  function setGrabCursor (moving) {\n    var swiper = this;\n    if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }\n    var el = swiper.el;\n    el.style.cursor = 'move';\n    el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n    el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n    el.style.cursor = moving ? 'grabbing' : 'grab';\n  }\n\n  function unsetGrabCursor () {\n    var swiper = this;\n    if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }\n    swiper.el.style.cursor = '';\n  }\n\n  var grabCursor = {\n    setGrabCursor: setGrabCursor,\n    unsetGrabCursor: unsetGrabCursor,\n  };\n\n  function appendSlide (slides) {\n    var swiper = this;\n    var $wrapperEl = swiper.$wrapperEl;\n    var params = swiper.params;\n    if (params.loop) {\n      swiper.loopDestroy();\n    }\n    if (typeof slides === 'object' && 'length' in slides) {\n      for (var i = 0; i < slides.length; i += 1) {\n        if (slides[i]) { $wrapperEl.append(slides[i]); }\n      }\n    } else {\n      $wrapperEl.append(slides);\n    }\n    if (params.loop) {\n      swiper.loopCreate();\n    }\n    if (!(params.observer && Support.observer)) {\n      swiper.update();\n    }\n  }\n\n  function prependSlide (slides) {\n    var swiper = this;\n    var params = swiper.params;\n    var $wrapperEl = swiper.$wrapperEl;\n    var activeIndex = swiper.activeIndex;\n\n    if (params.loop) {\n      swiper.loopDestroy();\n    }\n    var newActiveIndex = activeIndex + 1;\n    if (typeof slides === 'object' && 'length' in slides) {\n      for (var i = 0; i < slides.length; i += 1) {\n        if (slides[i]) { $wrapperEl.prepend(slides[i]); }\n      }\n      newActiveIndex = activeIndex + slides.length;\n    } else {\n      $wrapperEl.prepend(slides);\n    }\n    if (params.loop) {\n      swiper.loopCreate();\n    }\n    if (!(params.observer && Support.observer)) {\n      swiper.update();\n    }\n    swiper.slideTo(newActiveIndex, 0, false);\n  }\n\n  function addSlide (index, slides) {\n    var swiper = this;\n    var $wrapperEl = swiper.$wrapperEl;\n    var params = swiper.params;\n    var activeIndex = swiper.activeIndex;\n    var activeIndexBuffer = activeIndex;\n    if (params.loop) {\n      activeIndexBuffer -= swiper.loopedSlides;\n      swiper.loopDestroy();\n      swiper.slides = $wrapperEl.children((\".\" + (params.slideClass)));\n    }\n    var baseLength = swiper.slides.length;\n    if (index <= 0) {\n      swiper.prependSlide(slides);\n      return;\n    }\n    if (index >= baseLength) {\n      swiper.appendSlide(slides);\n      return;\n    }\n    var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n    var slidesBuffer = [];\n    for (var i = baseLength - 1; i >= index; i -= 1) {\n      var currentSlide = swiper.slides.eq(i);\n      currentSlide.remove();\n      slidesBuffer.unshift(currentSlide);\n    }\n\n    if (typeof slides === 'object' && 'length' in slides) {\n      for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {\n        if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }\n      }\n      newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n    } else {\n      $wrapperEl.append(slides);\n    }\n\n    for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {\n      $wrapperEl.append(slidesBuffer[i$2]);\n    }\n\n    if (params.loop) {\n      swiper.loopCreate();\n    }\n    if (!(params.observer && Support.observer)) {\n      swiper.update();\n    }\n    if (params.loop) {\n      swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n    } else {\n      swiper.slideTo(newActiveIndex, 0, false);\n    }\n  }\n\n  function removeSlide (slidesIndexes) {\n    var swiper = this;\n    var params = swiper.params;\n    var $wrapperEl = swiper.$wrapperEl;\n    var activeIndex = swiper.activeIndex;\n\n    var activeIndexBuffer = activeIndex;\n    if (params.loop) {\n      activeIndexBuffer -= swiper.loopedSlides;\n      swiper.loopDestroy();\n      swiper.slides = $wrapperEl.children((\".\" + (params.slideClass)));\n    }\n    var newActiveIndex = activeIndexBuffer;\n    var indexToRemove;\n\n    if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n      for (var i = 0; i < slidesIndexes.length; i += 1) {\n        indexToRemove = slidesIndexes[i];\n        if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }\n        if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }\n      }\n      newActiveIndex = Math.max(newActiveIndex, 0);\n    } else {\n      indexToRemove = slidesIndexes;\n      if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }\n      if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }\n      newActiveIndex = Math.max(newActiveIndex, 0);\n    }\n\n    if (params.loop) {\n      swiper.loopCreate();\n    }\n\n    if (!(params.observer && Support.observer)) {\n      swiper.update();\n    }\n    if (params.loop) {\n      swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n    } else {\n      swiper.slideTo(newActiveIndex, 0, false);\n    }\n  }\n\n  function removeAllSlides () {\n    var swiper = this;\n\n    var slidesIndexes = [];\n    for (var i = 0; i < swiper.slides.length; i += 1) {\n      slidesIndexes.push(i);\n    }\n    swiper.removeSlide(slidesIndexes);\n  }\n\n  var manipulation = {\n    appendSlide: appendSlide,\n    prependSlide: prependSlide,\n    addSlide: addSlide,\n    removeSlide: removeSlide,\n    removeAllSlides: removeAllSlides,\n  };\n\n  var Device = (function Device() {\n    var ua = win.navigator.userAgent;\n\n    var device = {\n      ios: false,\n      android: false,\n      androidChrome: false,\n      desktop: false,\n      windows: false,\n      iphone: false,\n      ipod: false,\n      ipad: false,\n      cordova: win.cordova || win.phonegap,\n      phonegap: win.cordova || win.phonegap,\n    };\n\n    var windows = ua.match(/(Windows Phone);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n    var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n    var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n    var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n    var iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n\n\n    // Windows\n    if (windows) {\n      device.os = 'windows';\n      device.osVersion = windows[2];\n      device.windows = true;\n    }\n    // Android\n    if (android && !windows) {\n      device.os = 'android';\n      device.osVersion = android[2];\n      device.android = true;\n      device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\n    }\n    if (ipad || iphone || ipod) {\n      device.os = 'ios';\n      device.ios = true;\n    }\n    // iOS\n    if (iphone && !ipod) {\n      device.osVersion = iphone[2].replace(/_/g, '.');\n      device.iphone = true;\n    }\n    if (ipad) {\n      device.osVersion = ipad[2].replace(/_/g, '.');\n      device.ipad = true;\n    }\n    if (ipod) {\n      device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\n      device.iphone = true;\n    }\n    // iOS 8+ changed UA\n    if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\n      if (device.osVersion.split('.')[0] === '10') {\n        device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\n      }\n    }\n\n    // Desktop\n    device.desktop = !(device.os || device.android || device.webView);\n\n    // Webview\n    device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\n\n    // Minimal UI\n    if (device.os && device.os === 'ios') {\n      var osVersionArr = device.osVersion.split('.');\n      var metaViewport = doc.querySelector('meta[name=\"viewport\"]');\n      device.minimalUi = !device.webView\n        && (ipod || iphone)\n        && (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7)\n        && metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0;\n    }\n\n    // Pixel Ratio\n    device.pixelRatio = win.devicePixelRatio || 1;\n\n    // Export object\n    return device;\n  }());\n\n  function onTouchStart (event) {\n    var swiper = this;\n    var data = swiper.touchEventsData;\n    var params = swiper.params;\n    var touches = swiper.touches;\n    if (swiper.animating && params.preventInteractionOnTransition) {\n      return;\n    }\n    var e = event;\n    if (e.originalEvent) { e = e.originalEvent; }\n    data.isTouchEvent = e.type === 'touchstart';\n    if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }\n    if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }\n    if (data.isTouched && data.isMoved) { return; }\n    if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : (\".\" + (params.noSwipingClass)))[0]) {\n      swiper.allowClick = true;\n      return;\n    }\n    if (params.swipeHandler) {\n      if (!$(e).closest(params.swipeHandler)[0]) { return; }\n    }\n\n    touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n    touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n    var startX = touches.currentX;\n    var startY = touches.currentY;\n\n    // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore\n\n    var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n    var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n    if (\n      edgeSwipeDetection\n      && ((startX <= edgeSwipeThreshold)\n      || (startX >= win.screen.width - edgeSwipeThreshold))\n    ) {\n      return;\n    }\n\n    Utils.extend(data, {\n      isTouched: true,\n      isMoved: false,\n      allowTouchCallbacks: true,\n      isScrolling: undefined,\n      startMoving: undefined,\n    });\n\n    touches.startX = startX;\n    touches.startY = startY;\n    data.touchStartTime = Utils.now();\n    swiper.allowClick = true;\n    swiper.updateSize();\n    swiper.swipeDirection = undefined;\n    if (params.threshold > 0) { data.allowThresholdMove = false; }\n    if (e.type !== 'touchstart') {\n      var preventDefault = true;\n      if ($(e.target).is(data.formElements)) { preventDefault = false; }\n      if (\n        doc.activeElement\n        && $(doc.activeElement).is(data.formElements)\n        && doc.activeElement !== e.target\n      ) {\n        doc.activeElement.blur();\n      }\n\n      var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n      if (params.touchStartForcePreventDefault || shouldPreventDefault) {\n        e.preventDefault();\n      }\n    }\n    swiper.emit('touchStart', e);\n  }\n\n  function onTouchMove (event) {\n    var swiper = this;\n    var data = swiper.touchEventsData;\n    var params = swiper.params;\n    var touches = swiper.touches;\n    var rtl = swiper.rtlTranslate;\n    var e = event;\n    if (e.originalEvent) { e = e.originalEvent; }\n    if (!data.isTouched) {\n      if (data.startMoving && data.isScrolling) {\n        swiper.emit('touchMoveOpposite', e);\n      }\n      return;\n    }\n    if (data.isTouchEvent && e.type === 'mousemove') { return; }\n    var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n    var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n    if (e.preventedByNestedSwiper) {\n      touches.startX = pageX;\n      touches.startY = pageY;\n      return;\n    }\n    if (!swiper.allowTouchMove) {\n      // isMoved = true;\n      swiper.allowClick = false;\n      if (data.isTouched) {\n        Utils.extend(touches, {\n          startX: pageX,\n          startY: pageY,\n          currentX: pageX,\n          currentY: pageY,\n        });\n        data.touchStartTime = Utils.now();\n      }\n      return;\n    }\n    if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n      if (swiper.isVertical()) {\n        // Vertical\n        if (\n          (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())\n          || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n        ) {\n          data.isTouched = false;\n          data.isMoved = false;\n          return;\n        }\n      } else if (\n        (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())\n        || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n      ) {\n        return;\n      }\n    }\n    if (data.isTouchEvent && doc.activeElement) {\n      if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {\n        data.isMoved = true;\n        swiper.allowClick = false;\n        return;\n      }\n    }\n    if (data.allowTouchCallbacks) {\n      swiper.emit('touchMove', e);\n    }\n    if (e.targetTouches && e.targetTouches.length > 1) { return; }\n\n    touches.currentX = pageX;\n    touches.currentY = pageY;\n\n    var diffX = touches.currentX - touches.startX;\n    var diffY = touches.currentY - touches.startY;\n    if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }\n\n    if (typeof data.isScrolling === 'undefined') {\n      var touchAngle;\n      if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {\n        data.isScrolling = false;\n      } else {\n        // eslint-disable-next-line\n        if ((diffX * diffX) + (diffY * diffY) >= 25) {\n          touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n          data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);\n        }\n      }\n    }\n    if (data.isScrolling) {\n      swiper.emit('touchMoveOpposite', e);\n    }\n    if (typeof data.startMoving === 'undefined') {\n      if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n        data.startMoving = true;\n      }\n    }\n    if (data.isScrolling) {\n      data.isTouched = false;\n      return;\n    }\n    if (!data.startMoving) {\n      return;\n    }\n    swiper.allowClick = false;\n    e.preventDefault();\n    if (params.touchMoveStopPropagation && !params.nested) {\n      e.stopPropagation();\n    }\n\n    if (!data.isMoved) {\n      if (params.loop) {\n        swiper.loopFix();\n      }\n      data.startTranslate = swiper.getTranslate();\n      swiper.setTransition(0);\n      if (swiper.animating) {\n        swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n      }\n      data.allowMomentumBounce = false;\n      // Grab Cursor\n      if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n        swiper.setGrabCursor(true);\n      }\n      swiper.emit('sliderFirstMove', e);\n    }\n    swiper.emit('sliderMove', e);\n    data.isMoved = true;\n\n    var diff = swiper.isHorizontal() ? diffX : diffY;\n    touches.diff = diff;\n\n    diff *= params.touchRatio;\n    if (rtl) { diff = -diff; }\n\n    swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n    data.currentTranslate = diff + data.startTranslate;\n\n    var disableParentSwiper = true;\n    var resistanceRatio = params.resistanceRatio;\n    if (params.touchReleaseOnEdges) {\n      resistanceRatio = 0;\n    }\n    if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {\n      disableParentSwiper = false;\n      if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }\n    } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n      disableParentSwiper = false;\n      if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }\n    }\n\n    if (disableParentSwiper) {\n      e.preventedByNestedSwiper = true;\n    }\n\n    // Directions locks\n    if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n      data.currentTranslate = data.startTranslate;\n    }\n    if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n      data.currentTranslate = data.startTranslate;\n    }\n\n\n    // Threshold\n    if (params.threshold > 0) {\n      if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n        if (!data.allowThresholdMove) {\n          data.allowThresholdMove = true;\n          touches.startX = touches.currentX;\n          touches.startY = touches.currentY;\n          data.currentTranslate = data.startTranslate;\n          touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n          return;\n        }\n      } else {\n        data.currentTranslate = data.startTranslate;\n        return;\n      }\n    }\n\n    if (!params.followFinger) { return; }\n\n    // Update active index in free mode\n    if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n    if (params.freeMode) {\n      // Velocity\n      if (data.velocities.length === 0) {\n        data.velocities.push({\n          position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n          time: data.touchStartTime,\n        });\n      }\n      data.velocities.push({\n        position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n        time: Utils.now(),\n      });\n    }\n    // Update progress\n    swiper.updateProgress(data.currentTranslate);\n    // Update translate\n    swiper.setTranslate(data.currentTranslate);\n  }\n\n  function onTouchEnd (event) {\n    var swiper = this;\n    var data = swiper.touchEventsData;\n\n    var params = swiper.params;\n    var touches = swiper.touches;\n    var rtl = swiper.rtlTranslate;\n    var $wrapperEl = swiper.$wrapperEl;\n    var slidesGrid = swiper.slidesGrid;\n    var snapGrid = swiper.snapGrid;\n    var e = event;\n    if (e.originalEvent) { e = e.originalEvent; }\n    if (data.allowTouchCallbacks) {\n      swiper.emit('touchEnd', e);\n    }\n    data.allowTouchCallbacks = false;\n    if (!data.isTouched) {\n      if (data.isMoved && params.grabCursor) {\n        swiper.setGrabCursor(false);\n      }\n      data.isMoved = false;\n      data.startMoving = false;\n      return;\n    }\n    // Return Grab Cursor\n    if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n      swiper.setGrabCursor(false);\n    }\n\n    // Time diff\n    var touchEndTime = Utils.now();\n    var timeDiff = touchEndTime - data.touchStartTime;\n\n    // Tap, doubleTap, Click\n    if (swiper.allowClick) {\n      swiper.updateClickedSlide(e);\n      swiper.emit('tap', e);\n      if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) {\n        if (data.clickTimeout) { clearTimeout(data.clickTimeout); }\n        data.clickTimeout = Utils.nextTick(function () {\n          if (!swiper || swiper.destroyed) { return; }\n          swiper.emit('click', e);\n        }, 300);\n      }\n      if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {\n        if (data.clickTimeout) { clearTimeout(data.clickTimeout); }\n        swiper.emit('doubleTap', e);\n      }\n    }\n\n    data.lastClickTime = Utils.now();\n    Utils.nextTick(function () {\n      if (!swiper.destroyed) { swiper.allowClick = true; }\n    });\n\n    if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {\n      data.isTouched = false;\n      data.isMoved = false;\n      data.startMoving = false;\n      return;\n    }\n    data.isTouched = false;\n    data.isMoved = false;\n    data.startMoving = false;\n\n    var currentPos;\n    if (params.followFinger) {\n      currentPos = rtl ? swiper.translate : -swiper.translate;\n    } else {\n      currentPos = -data.currentTranslate;\n    }\n\n    if (params.freeMode) {\n      if (currentPos < -swiper.minTranslate()) {\n        swiper.slideTo(swiper.activeIndex);\n        return;\n      }\n      if (currentPos > -swiper.maxTranslate()) {\n        if (swiper.slides.length < snapGrid.length) {\n          swiper.slideTo(snapGrid.length - 1);\n        } else {\n          swiper.slideTo(swiper.slides.length - 1);\n        }\n        return;\n      }\n\n      if (params.freeModeMomentum) {\n        if (data.velocities.length > 1) {\n          var lastMoveEvent = data.velocities.pop();\n          var velocityEvent = data.velocities.pop();\n\n          var distance = lastMoveEvent.position - velocityEvent.position;\n          var time = lastMoveEvent.time - velocityEvent.time;\n          swiper.velocity = distance / time;\n          swiper.velocity /= 2;\n          if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {\n            swiper.velocity = 0;\n          }\n          // this implies that the user stopped moving a finger then released.\n          // There would be no events with distance zero, so the last event is stale.\n          if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {\n            swiper.velocity = 0;\n          }\n        } else {\n          swiper.velocity = 0;\n        }\n        swiper.velocity *= params.freeModeMomentumVelocityRatio;\n\n        data.velocities.length = 0;\n        var momentumDuration = 1000 * params.freeModeMomentumRatio;\n        var momentumDistance = swiper.velocity * momentumDuration;\n\n        var newPosition = swiper.translate + momentumDistance;\n        if (rtl) { newPosition = -newPosition; }\n\n        var doBounce = false;\n        var afterBouncePosition;\n        var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;\n        var needsLoopFix;\n        if (newPosition < swiper.maxTranslate()) {\n          if (params.freeModeMomentumBounce) {\n            if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n              newPosition = swiper.maxTranslate() - bounceAmount;\n            }\n            afterBouncePosition = swiper.maxTranslate();\n            doBounce = true;\n            data.allowMomentumBounce = true;\n          } else {\n            newPosition = swiper.maxTranslate();\n          }\n          if (params.loop && params.centeredSlides) { needsLoopFix = true; }\n        } else if (newPosition > swiper.minTranslate()) {\n          if (params.freeModeMomentumBounce) {\n            if (newPosition - swiper.minTranslate() > bounceAmount) {\n              newPosition = swiper.minTranslate() + bounceAmount;\n            }\n            afterBouncePosition = swiper.minTranslate();\n            doBounce = true;\n            data.allowMomentumBounce = true;\n          } else {\n            newPosition = swiper.minTranslate();\n          }\n          if (params.loop && params.centeredSlides) { needsLoopFix = true; }\n        } else if (params.freeModeSticky) {\n          var nextSlide;\n          for (var j = 0; j < snapGrid.length; j += 1) {\n            if (snapGrid[j] > -newPosition) {\n              nextSlide = j;\n              break;\n            }\n          }\n\n          if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {\n            newPosition = snapGrid[nextSlide];\n          } else {\n            newPosition = snapGrid[nextSlide - 1];\n          }\n          newPosition = -newPosition;\n        }\n        if (needsLoopFix) {\n          swiper.once('transitionEnd', function () {\n            swiper.loopFix();\n          });\n        }\n        // Fix duration\n        if (swiper.velocity !== 0) {\n          if (rtl) {\n            momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n          } else {\n            momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n          }\n        } else if (params.freeModeSticky) {\n          swiper.slideToClosest();\n          return;\n        }\n\n        if (params.freeModeMomentumBounce && doBounce) {\n          swiper.updateProgress(afterBouncePosition);\n          swiper.setTransition(momentumDuration);\n          swiper.setTranslate(newPosition);\n          swiper.transitionStart(true, swiper.swipeDirection);\n          swiper.animating = true;\n          $wrapperEl.transitionEnd(function () {\n            if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }\n            swiper.emit('momentumBounce');\n\n            swiper.setTransition(params.speed);\n            swiper.setTranslate(afterBouncePosition);\n            $wrapperEl.transitionEnd(function () {\n              if (!swiper || swiper.destroyed) { return; }\n              swiper.transitionEnd();\n            });\n          });\n        } else if (swiper.velocity) {\n          swiper.updateProgress(newPosition);\n          swiper.setTransition(momentumDuration);\n          swiper.setTranslate(newPosition);\n          swiper.transitionStart(true, swiper.swipeDirection);\n          if (!swiper.animating) {\n            swiper.animating = true;\n            $wrapperEl.transitionEnd(function () {\n              if (!swiper || swiper.destroyed) { return; }\n              swiper.transitionEnd();\n            });\n          }\n        } else {\n          swiper.updateProgress(newPosition);\n        }\n\n        swiper.updateActiveIndex();\n        swiper.updateSlidesClasses();\n      } else if (params.freeModeSticky) {\n        swiper.slideToClosest();\n        return;\n      }\n\n      if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {\n        swiper.updateProgress();\n        swiper.updateActiveIndex();\n        swiper.updateSlidesClasses();\n      }\n      return;\n    }\n\n    // Find current slide\n    var stopIndex = 0;\n    var groupSize = swiper.slidesSizesGrid[0];\n    for (var i = 0; i < slidesGrid.length; i += params.slidesPerGroup) {\n      if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') {\n        if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) {\n          stopIndex = i;\n          groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i];\n        }\n      } else if (currentPos >= slidesGrid[i]) {\n        stopIndex = i;\n        groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n      }\n    }\n\n    // Find current slide size\n    var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n\n    if (timeDiff > params.longSwipesMs) {\n      // Long touches\n      if (!params.longSwipes) {\n        swiper.slideTo(swiper.activeIndex);\n        return;\n      }\n      if (swiper.swipeDirection === 'next') {\n        if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + params.slidesPerGroup); }\n        else { swiper.slideTo(stopIndex); }\n      }\n      if (swiper.swipeDirection === 'prev') {\n        if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + params.slidesPerGroup); }\n        else { swiper.slideTo(stopIndex); }\n      }\n    } else {\n      // Short swipes\n      if (!params.shortSwipes) {\n        swiper.slideTo(swiper.activeIndex);\n        return;\n      }\n      if (swiper.swipeDirection === 'next') {\n        swiper.slideTo(stopIndex + params.slidesPerGroup);\n      }\n      if (swiper.swipeDirection === 'prev') {\n        swiper.slideTo(stopIndex);\n      }\n    }\n  }\n\n  function onResize () {\n    var swiper = this;\n\n    var params = swiper.params;\n    var el = swiper.el;\n\n    if (el && el.offsetWidth === 0) { return; }\n\n    // Breakpoints\n    if (params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n\n    // Save locks\n    var allowSlideNext = swiper.allowSlideNext;\n    var allowSlidePrev = swiper.allowSlidePrev;\n    var snapGrid = swiper.snapGrid;\n\n    // Disable locks on resize\n    swiper.allowSlideNext = true;\n    swiper.allowSlidePrev = true;\n\n    swiper.updateSize();\n    swiper.updateSlides();\n\n    if (params.freeMode) {\n      var newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate());\n      swiper.setTranslate(newTranslate);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n\n      if (params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n    } else {\n      swiper.updateSlidesClasses();\n      if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n        swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n      } else {\n        swiper.slideTo(swiper.activeIndex, 0, false, true);\n      }\n    }\n    if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n      swiper.autoplay.run();\n    }\n    // Return locks after resize\n    swiper.allowSlidePrev = allowSlidePrev;\n    swiper.allowSlideNext = allowSlideNext;\n\n    if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n      swiper.checkOverflow();\n    }\n  }\n\n  function onClick (e) {\n    var swiper = this;\n    if (!swiper.allowClick) {\n      if (swiper.params.preventClicks) { e.preventDefault(); }\n      if (swiper.params.preventClicksPropagation && swiper.animating) {\n        e.stopPropagation();\n        e.stopImmediatePropagation();\n      }\n    }\n  }\n\n  function attachEvents() {\n    var swiper = this;\n    var params = swiper.params;\n    var touchEvents = swiper.touchEvents;\n    var el = swiper.el;\n    var wrapperEl = swiper.wrapperEl;\n\n    {\n      swiper.onTouchStart = onTouchStart.bind(swiper);\n      swiper.onTouchMove = onTouchMove.bind(swiper);\n      swiper.onTouchEnd = onTouchEnd.bind(swiper);\n    }\n\n    swiper.onClick = onClick.bind(swiper);\n\n    var target = params.touchEventsTarget === 'container' ? el : wrapperEl;\n    var capture = !!params.nested;\n\n    // Touch Events\n    {\n      if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n        target.addEventListener(touchEvents.start, swiper.onTouchStart, false);\n        doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);\n        doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);\n      } else {\n        if (Support.touch) {\n          var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n          target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);\n          target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);\n          target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);\n        }\n        if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {\n          target.addEventListener('mousedown', swiper.onTouchStart, false);\n          doc.addEventListener('mousemove', swiper.onTouchMove, capture);\n          doc.addEventListener('mouseup', swiper.onTouchEnd, false);\n        }\n      }\n      // Prevent Links Clicks\n      if (params.preventClicks || params.preventClicksPropagation) {\n        target.addEventListener('click', swiper.onClick, true);\n      }\n    }\n\n    // Resize handler\n    swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);\n  }\n\n  function detachEvents() {\n    var swiper = this;\n\n    var params = swiper.params;\n    var touchEvents = swiper.touchEvents;\n    var el = swiper.el;\n    var wrapperEl = swiper.wrapperEl;\n\n    var target = params.touchEventsTarget === 'container' ? el : wrapperEl;\n    var capture = !!params.nested;\n\n    // Touch Events\n    {\n      if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n        target.removeEventListener(touchEvents.start, swiper.onTouchStart, false);\n        doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);\n        doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);\n      } else {\n        if (Support.touch) {\n          var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n          target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);\n          target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);\n          target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);\n        }\n        if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {\n          target.removeEventListener('mousedown', swiper.onTouchStart, false);\n          doc.removeEventListener('mousemove', swiper.onTouchMove, capture);\n          doc.removeEventListener('mouseup', swiper.onTouchEnd, false);\n        }\n      }\n      // Prevent Links Clicks\n      if (params.preventClicks || params.preventClicksPropagation) {\n        target.removeEventListener('click', swiper.onClick, true);\n      }\n    }\n\n    // Resize handler\n    swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);\n  }\n\n  var events = {\n    attachEvents: attachEvents,\n    detachEvents: detachEvents,\n  };\n\n  function setBreakpoint () {\n    var swiper = this;\n    var activeIndex = swiper.activeIndex;\n    var initialized = swiper.initialized;\n    var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;\n    var params = swiper.params;\n    var breakpoints = params.breakpoints;\n    if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }\n\n    // Set breakpoint for window width and update parameters\n    var breakpoint = swiper.getBreakpoint(breakpoints);\n\n    if (breakpoint && swiper.currentBreakpoint !== breakpoint) {\n      var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n      if (breakpointOnlyParams) {\n        ['slidesPerView', 'spaceBetween', 'slidesPerGroup'].forEach(function (param) {\n          var paramValue = breakpointOnlyParams[param];\n          if (typeof paramValue === 'undefined') { return; }\n          if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {\n            breakpointOnlyParams[param] = 'auto';\n          } else if (param === 'slidesPerView') {\n            breakpointOnlyParams[param] = parseFloat(paramValue);\n          } else {\n            breakpointOnlyParams[param] = parseInt(paramValue, 10);\n          }\n        });\n      }\n\n      var breakpointParams = breakpointOnlyParams || swiper.originalParams;\n      var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n      var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n      if (directionChanged && initialized) {\n        swiper.changeDirection();\n      }\n\n      Utils.extend(swiper.params, breakpointParams);\n\n      Utils.extend(swiper, {\n        allowTouchMove: swiper.params.allowTouchMove,\n        allowSlideNext: swiper.params.allowSlideNext,\n        allowSlidePrev: swiper.params.allowSlidePrev,\n      });\n\n      swiper.currentBreakpoint = breakpoint;\n\n      if (needsReLoop && initialized) {\n        swiper.loopDestroy();\n        swiper.loopCreate();\n        swiper.updateSlides();\n        swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);\n      }\n\n      swiper.emit('breakpoint', breakpointParams);\n    }\n  }\n\n  function getBreakpoint (breakpoints) {\n    var swiper = this;\n    // Get breakpoint for window width\n    if (!breakpoints) { return undefined; }\n    var breakpoint = false;\n    var points = [];\n    Object.keys(breakpoints).forEach(function (point) {\n      points.push(point);\n    });\n    points.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); });\n    for (var i = 0; i < points.length; i += 1) {\n      var point = points[i];\n      if (swiper.params.breakpointsInverse) {\n        if (point <= win.innerWidth) {\n          breakpoint = point;\n        }\n      } else if (point >= win.innerWidth && !breakpoint) {\n        breakpoint = point;\n      }\n    }\n    return breakpoint || 'max';\n  }\n\n  var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };\n\n  function addClasses () {\n    var swiper = this;\n    var classNames = swiper.classNames;\n    var params = swiper.params;\n    var rtl = swiper.rtl;\n    var $el = swiper.$el;\n    var suffixes = [];\n\n    suffixes.push('initialized');\n    suffixes.push(params.direction);\n\n    if (params.freeMode) {\n      suffixes.push('free-mode');\n    }\n    if (!Support.flexbox) {\n      suffixes.push('no-flexbox');\n    }\n    if (params.autoHeight) {\n      suffixes.push('autoheight');\n    }\n    if (rtl) {\n      suffixes.push('rtl');\n    }\n    if (params.slidesPerColumn > 1) {\n      suffixes.push('multirow');\n    }\n    if (Device.android) {\n      suffixes.push('android');\n    }\n    if (Device.ios) {\n      suffixes.push('ios');\n    }\n    // WP8 Touch Events Fix\n    if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n      suffixes.push((\"wp8-\" + (params.direction)));\n    }\n\n    suffixes.forEach(function (suffix) {\n      classNames.push(params.containerModifierClass + suffix);\n    });\n\n    $el.addClass(classNames.join(' '));\n  }\n\n  function removeClasses () {\n    var swiper = this;\n    var $el = swiper.$el;\n    var classNames = swiper.classNames;\n\n    $el.removeClass(classNames.join(' '));\n  }\n\n  var classes = { addClasses: addClasses, removeClasses: removeClasses };\n\n  function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {\n    var image;\n    function onReady() {\n      if (callback) { callback(); }\n    }\n    if (!imageEl.complete || !checkForComplete) {\n      if (src) {\n        image = new win.Image();\n        image.onload = onReady;\n        image.onerror = onReady;\n        if (sizes) {\n          image.sizes = sizes;\n        }\n        if (srcset) {\n          image.srcset = srcset;\n        }\n        if (src) {\n          image.src = src;\n        }\n      } else {\n        onReady();\n      }\n    } else {\n      // image already loaded...\n      onReady();\n    }\n  }\n\n  function preloadImages () {\n    var swiper = this;\n    swiper.imagesToLoad = swiper.$el.find('img');\n    function onReady() {\n      if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }\n      if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }\n      if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n        if (swiper.params.updateOnImagesReady) { swiper.update(); }\n        swiper.emit('imagesReady');\n      }\n    }\n    for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {\n      var imageEl = swiper.imagesToLoad[i];\n      swiper.loadImage(\n        imageEl,\n        imageEl.currentSrc || imageEl.getAttribute('src'),\n        imageEl.srcset || imageEl.getAttribute('srcset'),\n        imageEl.sizes || imageEl.getAttribute('sizes'),\n        true,\n        onReady\n      );\n    }\n  }\n\n  var images = {\n    loadImage: loadImage,\n    preloadImages: preloadImages,\n  };\n\n  function checkOverflow() {\n    var swiper = this;\n    var wasLocked = swiper.isLocked;\n\n    swiper.isLocked = swiper.snapGrid.length === 1;\n    swiper.allowSlideNext = !swiper.isLocked;\n    swiper.allowSlidePrev = !swiper.isLocked;\n\n    // events\n    if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }\n\n    if (wasLocked && wasLocked !== swiper.isLocked) {\n      swiper.isEnd = false;\n      swiper.navigation.update();\n    }\n  }\n\n  var checkOverflow$1 = { checkOverflow: checkOverflow };\n\n  var defaults = {\n    init: true,\n    direction: 'horizontal',\n    touchEventsTarget: 'container',\n    initialSlide: 0,\n    speed: 300,\n    //\n    preventInteractionOnTransition: false,\n\n    // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).\n    edgeSwipeDetection: false,\n    edgeSwipeThreshold: 20,\n\n    // Free mode\n    freeMode: false,\n    freeModeMomentum: true,\n    freeModeMomentumRatio: 1,\n    freeModeMomentumBounce: true,\n    freeModeMomentumBounceRatio: 1,\n    freeModeMomentumVelocityRatio: 1,\n    freeModeSticky: false,\n    freeModeMinimumVelocity: 0.02,\n\n    // Autoheight\n    autoHeight: false,\n\n    // Set wrapper width\n    setWrapperSize: false,\n\n    // Virtual Translate\n    virtualTranslate: false,\n\n    // Effects\n    effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n    // Breakpoints\n    breakpoints: undefined,\n    breakpointsInverse: false,\n\n    // Slides grid\n    spaceBetween: 0,\n    slidesPerView: 1,\n    slidesPerColumn: 1,\n    slidesPerColumnFill: 'column',\n    slidesPerGroup: 1,\n    centeredSlides: false,\n    slidesOffsetBefore: 0, // in px\n    slidesOffsetAfter: 0, // in px\n    normalizeSlideIndex: true,\n    centerInsufficientSlides: false,\n\n    // Disable swiper and hide navigation when container not overflow\n    watchOverflow: false,\n\n    // Round length\n    roundLengths: false,\n\n    // Touches\n    touchRatio: 1,\n    touchAngle: 45,\n    simulateTouch: true,\n    shortSwipes: true,\n    longSwipes: true,\n    longSwipesRatio: 0.5,\n    longSwipesMs: 300,\n    followFinger: true,\n    allowTouchMove: true,\n    threshold: 0,\n    touchMoveStopPropagation: true,\n    touchStartPreventDefault: true,\n    touchStartForcePreventDefault: false,\n    touchReleaseOnEdges: false,\n\n    // Unique Navigation Elements\n    uniqueNavElements: true,\n\n    // Resistance\n    resistance: true,\n    resistanceRatio: 0.85,\n\n    // Progress\n    watchSlidesProgress: false,\n    watchSlidesVisibility: false,\n\n    // Cursor\n    grabCursor: false,\n\n    // Clicks\n    preventClicks: true,\n    preventClicksPropagation: true,\n    slideToClickedSlide: false,\n\n    // Images\n    preloadImages: true,\n    updateOnImagesReady: true,\n\n    // loop\n    loop: false,\n    loopAdditionalSlides: 0,\n    loopedSlides: null,\n    loopFillGroupWithBlank: false,\n\n    // Swiping/no swiping\n    allowSlidePrev: true,\n    allowSlideNext: true,\n    swipeHandler: null, // '.swipe-handler',\n    noSwiping: true,\n    noSwipingClass: 'swiper-no-swiping',\n    noSwipingSelector: null,\n\n    // Passive Listeners\n    passiveListeners: true,\n\n    // NS\n    containerModifierClass: 'swiper-container-', // NEW\n    slideClass: 'swiper-slide',\n    slideBlankClass: 'swiper-slide-invisible-blank',\n    slideActiveClass: 'swiper-slide-active',\n    slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n    slideVisibleClass: 'swiper-slide-visible',\n    slideDuplicateClass: 'swiper-slide-duplicate',\n    slideNextClass: 'swiper-slide-next',\n    slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n    slidePrevClass: 'swiper-slide-prev',\n    slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n    wrapperClass: 'swiper-wrapper',\n\n    // Callbacks\n    runCallbacksOnInit: true,\n  };\n\n  /* eslint no-param-reassign: \"off\" */\n\n  var prototypes = {\n    update: update,\n    translate: translate,\n    transition: transition$1,\n    slide: slide,\n    loop: loop,\n    grabCursor: grabCursor,\n    manipulation: manipulation,\n    events: events,\n    breakpoints: breakpoints,\n    checkOverflow: checkOverflow$1,\n    classes: classes,\n    images: images,\n  };\n\n  var extendedDefaults = {};\n\n  var Swiper = /*@__PURE__*/(function (SwiperClass) {\n    function Swiper() {\n      var assign;\n\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n      var el;\n      var params;\n      if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {\n        params = args[0];\n      } else {\n        (assign = args, el = assign[0], params = assign[1]);\n      }\n      if (!params) { params = {}; }\n\n      params = Utils.extend({}, params);\n      if (el && !params.el) { params.el = el; }\n\n      SwiperClass.call(this, params);\n\n      Object.keys(prototypes).forEach(function (prototypeGroup) {\n        Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {\n          if (!Swiper.prototype[protoMethod]) {\n            Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n          }\n        });\n      });\n\n      // Swiper Instance\n      var swiper = this;\n      if (typeof swiper.modules === 'undefined') {\n        swiper.modules = {};\n      }\n      Object.keys(swiper.modules).forEach(function (moduleName) {\n        var module = swiper.modules[moduleName];\n        if (module.params) {\n          var moduleParamName = Object.keys(module.params)[0];\n          var moduleParams = module.params[moduleParamName];\n          if (typeof moduleParams !== 'object' || moduleParams === null) { return; }\n          if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }\n          if (params[moduleParamName] === true) {\n            params[moduleParamName] = { enabled: true };\n          }\n          if (\n            typeof params[moduleParamName] === 'object'\n            && !('enabled' in params[moduleParamName])\n          ) {\n            params[moduleParamName].enabled = true;\n          }\n          if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }\n        }\n      });\n\n      // Extend defaults with modules params\n      var swiperParams = Utils.extend({}, defaults);\n      swiper.useModulesParams(swiperParams);\n\n      // Extend defaults with passed params\n      swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);\n      swiper.originalParams = Utils.extend({}, swiper.params);\n      swiper.passedParams = Utils.extend({}, params);\n\n      // Save Dom lib\n      swiper.$ = $;\n\n      // Find el\n      var $el = $(swiper.params.el);\n      el = $el[0];\n\n      if (!el) {\n        return undefined;\n      }\n\n      if ($el.length > 1) {\n        var swipers = [];\n        $el.each(function (index, containerEl) {\n          var newParams = Utils.extend({}, params, { el: containerEl });\n          swipers.push(new Swiper(newParams));\n        });\n        return swipers;\n      }\n\n      el.swiper = swiper;\n      $el.data('swiper', swiper);\n\n      // Find Wrapper\n      var $wrapperEl = $el.children((\".\" + (swiper.params.wrapperClass)));\n\n      // Extend Swiper\n      Utils.extend(swiper, {\n        $el: $el,\n        el: el,\n        $wrapperEl: $wrapperEl,\n        wrapperEl: $wrapperEl[0],\n\n        // Classes\n        classNames: [],\n\n        // Slides\n        slides: $(),\n        slidesGrid: [],\n        snapGrid: [],\n        slidesSizesGrid: [],\n\n        // isDirection\n        isHorizontal: function isHorizontal() {\n          return swiper.params.direction === 'horizontal';\n        },\n        isVertical: function isVertical() {\n          return swiper.params.direction === 'vertical';\n        },\n        // RTL\n        rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n        rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n        wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n\n        // Indexes\n        activeIndex: 0,\n        realIndex: 0,\n\n        //\n        isBeginning: true,\n        isEnd: false,\n\n        // Props\n        translate: 0,\n        previousTranslate: 0,\n        progress: 0,\n        velocity: 0,\n        animating: false,\n\n        // Locks\n        allowSlideNext: swiper.params.allowSlideNext,\n        allowSlidePrev: swiper.params.allowSlidePrev,\n\n        // Touch Events\n        touchEvents: (function touchEvents() {\n          var touch = ['touchstart', 'touchmove', 'touchend'];\n          var desktop = ['mousedown', 'mousemove', 'mouseup'];\n          if (Support.pointerEvents) {\n            desktop = ['pointerdown', 'pointermove', 'pointerup'];\n          } else if (Support.prefixedPointerEvents) {\n            desktop = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp'];\n          }\n          swiper.touchEventsTouch = {\n            start: touch[0],\n            move: touch[1],\n            end: touch[2],\n          };\n          swiper.touchEventsDesktop = {\n            start: desktop[0],\n            move: desktop[1],\n            end: desktop[2],\n          };\n          return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;\n        }()),\n        touchEventsData: {\n          isTouched: undefined,\n          isMoved: undefined,\n          allowTouchCallbacks: undefined,\n          touchStartTime: undefined,\n          isScrolling: undefined,\n          currentTranslate: undefined,\n          startTranslate: undefined,\n          allowThresholdMove: undefined,\n          // Form elements to match\n          formElements: 'input, select, option, textarea, button, video',\n          // Last click time\n          lastClickTime: Utils.now(),\n          clickTimeout: undefined,\n          // Velocities\n          velocities: [],\n          allowMomentumBounce: undefined,\n          isTouchEvent: undefined,\n          startMoving: undefined,\n        },\n\n        // Clicks\n        allowClick: true,\n\n        // Touches\n        allowTouchMove: swiper.params.allowTouchMove,\n\n        touches: {\n          startX: 0,\n          startY: 0,\n          currentX: 0,\n          currentY: 0,\n          diff: 0,\n        },\n\n        // Images\n        imagesToLoad: [],\n        imagesLoaded: 0,\n\n      });\n\n      // Install Modules\n      swiper.useModules();\n\n      // Init\n      if (swiper.params.init) {\n        swiper.init();\n      }\n\n      // Return app instance\n      return swiper;\n    }\n\n    if ( SwiperClass ) Swiper.__proto__ = SwiperClass;\n    Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );\n    Swiper.prototype.constructor = Swiper;\n\n    var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };\n\n    Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {\n      var swiper = this;\n      var params = swiper.params;\n      var slides = swiper.slides;\n      var slidesGrid = swiper.slidesGrid;\n      var swiperSize = swiper.size;\n      var activeIndex = swiper.activeIndex;\n      var spv = 1;\n      if (params.centeredSlides) {\n        var slideSize = slides[activeIndex].swiperSlideSize;\n        var breakLoop;\n        for (var i = activeIndex + 1; i < slides.length; i += 1) {\n          if (slides[i] && !breakLoop) {\n            slideSize += slides[i].swiperSlideSize;\n            spv += 1;\n            if (slideSize > swiperSize) { breakLoop = true; }\n          }\n        }\n        for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {\n          if (slides[i$1] && !breakLoop) {\n            slideSize += slides[i$1].swiperSlideSize;\n            spv += 1;\n            if (slideSize > swiperSize) { breakLoop = true; }\n          }\n        }\n      } else {\n        for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {\n          if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {\n            spv += 1;\n          }\n        }\n      }\n      return spv;\n    };\n\n    Swiper.prototype.update = function update () {\n      var swiper = this;\n      if (!swiper || swiper.destroyed) { return; }\n      var snapGrid = swiper.snapGrid;\n      var params = swiper.params;\n      // Breakpoints\n      if (params.breakpoints) {\n        swiper.setBreakpoint();\n      }\n      swiper.updateSize();\n      swiper.updateSlides();\n      swiper.updateProgress();\n      swiper.updateSlidesClasses();\n\n      function setTranslate() {\n        var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n        var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n        swiper.setTranslate(newTranslate);\n        swiper.updateActiveIndex();\n        swiper.updateSlidesClasses();\n      }\n      var translated;\n      if (swiper.params.freeMode) {\n        setTranslate();\n        if (swiper.params.autoHeight) {\n          swiper.updateAutoHeight();\n        }\n      } else {\n        if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n          translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n        } else {\n          translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n        }\n        if (!translated) {\n          setTranslate();\n        }\n      }\n      if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n        swiper.checkOverflow();\n      }\n      swiper.emit('update');\n    };\n\n    Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) {\n      if ( needUpdate === void 0 ) needUpdate = true;\n\n      var swiper = this;\n      var currentDirection = swiper.params.direction;\n      if (!newDirection) {\n        // eslint-disable-next-line\n        newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n      }\n      if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) {\n        return swiper;\n      }\n\n      swiper.$el\n        .removeClass((\"\" + (swiper.params.containerModifierClass) + currentDirection + \" wp8-\" + currentDirection))\n        .addClass((\"\" + (swiper.params.containerModifierClass) + newDirection));\n\n      if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n        swiper.$el.addClass(((swiper.params.containerModifierClass) + \"wp8-\" + newDirection));\n      }\n\n      swiper.params.direction = newDirection;\n\n      swiper.slides.each(function (slideIndex, slideEl) {\n        if (newDirection === 'vertical') {\n          slideEl.style.width = '';\n        } else {\n          slideEl.style.height = '';\n        }\n      });\n\n      swiper.emit('changeDirection');\n      if (needUpdate) { swiper.update(); }\n\n      return swiper;\n    };\n\n    Swiper.prototype.init = function init () {\n      var swiper = this;\n      if (swiper.initialized) { return; }\n\n      swiper.emit('beforeInit');\n\n      // Set breakpoint\n      if (swiper.params.breakpoints) {\n        swiper.setBreakpoint();\n      }\n\n      // Add Classes\n      swiper.addClasses();\n\n      // Create loop\n      if (swiper.params.loop) {\n        swiper.loopCreate();\n      }\n\n      // Update size\n      swiper.updateSize();\n\n      // Update slides\n      swiper.updateSlides();\n\n      if (swiper.params.watchOverflow) {\n        swiper.checkOverflow();\n      }\n\n      // Set Grab Cursor\n      if (swiper.params.grabCursor) {\n        swiper.setGrabCursor();\n      }\n\n      if (swiper.params.preloadImages) {\n        swiper.preloadImages();\n      }\n\n      // Slide To Initial Slide\n      if (swiper.params.loop) {\n        swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);\n      } else {\n        swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);\n      }\n\n      // Attach events\n      swiper.attachEvents();\n\n      // Init Flag\n      swiper.initialized = true;\n\n      // Emit\n      swiper.emit('init');\n    };\n\n    Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {\n      if ( deleteInstance === void 0 ) deleteInstance = true;\n      if ( cleanStyles === void 0 ) cleanStyles = true;\n\n      var swiper = this;\n      var params = swiper.params;\n      var $el = swiper.$el;\n      var $wrapperEl = swiper.$wrapperEl;\n      var slides = swiper.slides;\n\n      if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n        return null;\n      }\n\n      swiper.emit('beforeDestroy');\n\n      // Init Flag\n      swiper.initialized = false;\n\n      // Detach events\n      swiper.detachEvents();\n\n      // Destroy loop\n      if (params.loop) {\n        swiper.loopDestroy();\n      }\n\n      // Cleanup styles\n      if (cleanStyles) {\n        swiper.removeClasses();\n        $el.removeAttr('style');\n        $wrapperEl.removeAttr('style');\n        if (slides && slides.length) {\n          slides\n            .removeClass([\n              params.slideVisibleClass,\n              params.slideActiveClass,\n              params.slideNextClass,\n              params.slidePrevClass ].join(' '))\n            .removeAttr('style')\n            .removeAttr('data-swiper-slide-index')\n            .removeAttr('data-swiper-column')\n            .removeAttr('data-swiper-row');\n        }\n      }\n\n      swiper.emit('destroy');\n\n      // Detach emitter events\n      Object.keys(swiper.eventsListeners).forEach(function (eventName) {\n        swiper.off(eventName);\n      });\n\n      if (deleteInstance !== false) {\n        swiper.$el[0].swiper = null;\n        swiper.$el.data('swiper', null);\n        Utils.deleteProps(swiper);\n      }\n      swiper.destroyed = true;\n\n      return null;\n    };\n\n    Swiper.extendDefaults = function extendDefaults (newDefaults) {\n      Utils.extend(extendedDefaults, newDefaults);\n    };\n\n    staticAccessors.extendedDefaults.get = function () {\n      return extendedDefaults;\n    };\n\n    staticAccessors.defaults.get = function () {\n      return defaults;\n    };\n\n    staticAccessors.Class.get = function () {\n      return SwiperClass;\n    };\n\n    staticAccessors.$.get = function () {\n      return $;\n    };\n\n    Object.defineProperties( Swiper, staticAccessors );\n\n    return Swiper;\n  }(SwiperClass));\n\n  var Device$1 = {\n    name: 'device',\n    proto: {\n      device: Device,\n    },\n    static: {\n      device: Device,\n    },\n  };\n\n  var Support$1 = {\n    name: 'support',\n    proto: {\n      support: Support,\n    },\n    static: {\n      support: Support,\n    },\n  };\n\n  var Browser$1 = {\n    name: 'browser',\n    proto: {\n      browser: Browser,\n    },\n    static: {\n      browser: Browser,\n    },\n  };\n\n  var Resize = {\n    name: 'resize',\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        resize: {\n          resizeHandler: function resizeHandler() {\n            if (!swiper || swiper.destroyed || !swiper.initialized) { return; }\n            swiper.emit('beforeResize');\n            swiper.emit('resize');\n          },\n          orientationChangeHandler: function orientationChangeHandler() {\n            if (!swiper || swiper.destroyed || !swiper.initialized) { return; }\n            swiper.emit('orientationchange');\n          },\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        // Emit resize\n        win.addEventListener('resize', swiper.resize.resizeHandler);\n\n        // Emit orientationchange\n        win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        win.removeEventListener('resize', swiper.resize.resizeHandler);\n        win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);\n      },\n    },\n  };\n\n  var Observer = {\n    func: win.MutationObserver || win.WebkitMutationObserver,\n    attach: function attach(target, options) {\n      if ( options === void 0 ) options = {};\n\n      var swiper = this;\n\n      var ObserverFunc = Observer.func;\n      var observer = new ObserverFunc(function (mutations) {\n        // The observerUpdate event should only be triggered\n        // once despite the number of mutations.  Additional\n        // triggers are redundant and are very costly\n        if (mutations.length === 1) {\n          swiper.emit('observerUpdate', mutations[0]);\n          return;\n        }\n        var observerUpdate = function observerUpdate() {\n          swiper.emit('observerUpdate', mutations[0]);\n        };\n\n        if (win.requestAnimationFrame) {\n          win.requestAnimationFrame(observerUpdate);\n        } else {\n          win.setTimeout(observerUpdate, 0);\n        }\n      });\n\n      observer.observe(target, {\n        attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n        childList: typeof options.childList === 'undefined' ? true : options.childList,\n        characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n      });\n\n      swiper.observer.observers.push(observer);\n    },\n    init: function init() {\n      var swiper = this;\n      if (!Support.observer || !swiper.params.observer) { return; }\n      if (swiper.params.observeParents) {\n        var containerParents = swiper.$el.parents();\n        for (var i = 0; i < containerParents.length; i += 1) {\n          swiper.observer.attach(containerParents[i]);\n        }\n      }\n      // Observe container\n      swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });\n\n      // Observe wrapper\n      swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });\n    },\n    destroy: function destroy() {\n      var swiper = this;\n      swiper.observer.observers.forEach(function (observer) {\n        observer.disconnect();\n      });\n      swiper.observer.observers = [];\n    },\n  };\n\n  var Observer$1 = {\n    name: 'observer',\n    params: {\n      observer: false,\n      observeParents: false,\n      observeSlideChildren: false,\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        observer: {\n          init: Observer.init.bind(swiper),\n          attach: Observer.attach.bind(swiper),\n          destroy: Observer.destroy.bind(swiper),\n          observers: [],\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        swiper.observer.init();\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        swiper.observer.destroy();\n      },\n    },\n  };\n\n  var Virtual = {\n    update: function update(force) {\n      var swiper = this;\n      var ref = swiper.params;\n      var slidesPerView = ref.slidesPerView;\n      var slidesPerGroup = ref.slidesPerGroup;\n      var centeredSlides = ref.centeredSlides;\n      var ref$1 = swiper.params.virtual;\n      var addSlidesBefore = ref$1.addSlidesBefore;\n      var addSlidesAfter = ref$1.addSlidesAfter;\n      var ref$2 = swiper.virtual;\n      var previousFrom = ref$2.from;\n      var previousTo = ref$2.to;\n      var slides = ref$2.slides;\n      var previousSlidesGrid = ref$2.slidesGrid;\n      var renderSlide = ref$2.renderSlide;\n      var previousOffset = ref$2.offset;\n      swiper.updateActiveIndex();\n      var activeIndex = swiper.activeIndex || 0;\n\n      var offsetProp;\n      if (swiper.rtlTranslate) { offsetProp = 'right'; }\n      else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }\n\n      var slidesAfter;\n      var slidesBefore;\n      if (centeredSlides) {\n        slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n        slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n      } else {\n        slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;\n        slidesBefore = slidesPerGroup + addSlidesAfter;\n      }\n      var from = Math.max((activeIndex || 0) - slidesBefore, 0);\n      var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n      var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n      Utils.extend(swiper.virtual, {\n        from: from,\n        to: to,\n        offset: offset,\n        slidesGrid: swiper.slidesGrid,\n      });\n\n      function onRendered() {\n        swiper.updateSlides();\n        swiper.updateProgress();\n        swiper.updateSlidesClasses();\n        if (swiper.lazy && swiper.params.lazy.enabled) {\n          swiper.lazy.load();\n        }\n      }\n\n      if (previousFrom === from && previousTo === to && !force) {\n        if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n          swiper.slides.css(offsetProp, (offset + \"px\"));\n        }\n        swiper.updateProgress();\n        return;\n      }\n      if (swiper.params.virtual.renderExternal) {\n        swiper.params.virtual.renderExternal.call(swiper, {\n          offset: offset,\n          from: from,\n          to: to,\n          slides: (function getSlides() {\n            var slidesToRender = [];\n            for (var i = from; i <= to; i += 1) {\n              slidesToRender.push(slides[i]);\n            }\n            return slidesToRender;\n          }()),\n        });\n        onRendered();\n        return;\n      }\n      var prependIndexes = [];\n      var appendIndexes = [];\n      if (force) {\n        swiper.$wrapperEl.find((\".\" + (swiper.params.slideClass))).remove();\n      } else {\n        for (var i = previousFrom; i <= previousTo; i += 1) {\n          if (i < from || i > to) {\n            swiper.$wrapperEl.find((\".\" + (swiper.params.slideClass) + \"[data-swiper-slide-index=\\\"\" + i + \"\\\"]\")).remove();\n          }\n        }\n      }\n      for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {\n        if (i$1 >= from && i$1 <= to) {\n          if (typeof previousTo === 'undefined' || force) {\n            appendIndexes.push(i$1);\n          } else {\n            if (i$1 > previousTo) { appendIndexes.push(i$1); }\n            if (i$1 < previousFrom) { prependIndexes.push(i$1); }\n          }\n        }\n      }\n      appendIndexes.forEach(function (index) {\n        swiper.$wrapperEl.append(renderSlide(slides[index], index));\n      });\n      prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {\n        swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n      });\n      swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + \"px\"));\n      onRendered();\n    },\n    renderSlide: function renderSlide(slide, index) {\n      var swiper = this;\n      var params = swiper.params.virtual;\n      if (params.cache && swiper.virtual.cache[index]) {\n        return swiper.virtual.cache[index];\n      }\n      var $slideEl = params.renderSlide\n        ? $(params.renderSlide.call(swiper, slide, index))\n        : $((\"<div class=\\\"\" + (swiper.params.slideClass) + \"\\\" data-swiper-slide-index=\\\"\" + index + \"\\\">\" + slide + \"</div>\"));\n      if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }\n      if (params.cache) { swiper.virtual.cache[index] = $slideEl; }\n      return $slideEl;\n    },\n    appendSlide: function appendSlide(slides) {\n      var swiper = this;\n      if (typeof slides === 'object' && 'length' in slides) {\n        for (var i = 0; i < slides.length; i += 1) {\n          if (slides[i]) { swiper.virtual.slides.push(slides[i]); }\n        }\n      } else {\n        swiper.virtual.slides.push(slides);\n      }\n      swiper.virtual.update(true);\n    },\n    prependSlide: function prependSlide(slides) {\n      var swiper = this;\n      var activeIndex = swiper.activeIndex;\n      var newActiveIndex = activeIndex + 1;\n      var numberOfNewSlides = 1;\n\n      if (Array.isArray(slides)) {\n        for (var i = 0; i < slides.length; i += 1) {\n          if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); }\n        }\n        newActiveIndex = activeIndex + slides.length;\n        numberOfNewSlides = slides.length;\n      } else {\n        swiper.virtual.slides.unshift(slides);\n      }\n      if (swiper.params.virtual.cache) {\n        var cache = swiper.virtual.cache;\n        var newCache = {};\n        Object.keys(cache).forEach(function (cachedIndex) {\n          newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cache[cachedIndex];\n        });\n        swiper.virtual.cache = newCache;\n      }\n      swiper.virtual.update(true);\n      swiper.slideTo(newActiveIndex, 0);\n    },\n    removeSlide: function removeSlide(slidesIndexes) {\n      var swiper = this;\n      if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; }\n      var activeIndex = swiper.activeIndex;\n      if (Array.isArray(slidesIndexes)) {\n        for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n          swiper.virtual.slides.splice(slidesIndexes[i], 1);\n          if (swiper.params.virtual.cache) {\n            delete swiper.virtual.cache[slidesIndexes[i]];\n          }\n          if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; }\n          activeIndex = Math.max(activeIndex, 0);\n        }\n      } else {\n        swiper.virtual.slides.splice(slidesIndexes, 1);\n        if (swiper.params.virtual.cache) {\n          delete swiper.virtual.cache[slidesIndexes];\n        }\n        if (slidesIndexes < activeIndex) { activeIndex -= 1; }\n        activeIndex = Math.max(activeIndex, 0);\n      }\n      swiper.virtual.update(true);\n      swiper.slideTo(activeIndex, 0);\n    },\n    removeAllSlides: function removeAllSlides() {\n      var swiper = this;\n      swiper.virtual.slides = [];\n      if (swiper.params.virtual.cache) {\n        swiper.virtual.cache = {};\n      }\n      swiper.virtual.update(true);\n      swiper.slideTo(0, 0);\n    },\n  };\n\n  var Virtual$1 = {\n    name: 'virtual',\n    params: {\n      virtual: {\n        enabled: false,\n        slides: [],\n        cache: true,\n        renderSlide: null,\n        renderExternal: null,\n        addSlidesBefore: 0,\n        addSlidesAfter: 0,\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        virtual: {\n          update: Virtual.update.bind(swiper),\n          appendSlide: Virtual.appendSlide.bind(swiper),\n          prependSlide: Virtual.prependSlide.bind(swiper),\n          removeSlide: Virtual.removeSlide.bind(swiper),\n          removeAllSlides: Virtual.removeAllSlides.bind(swiper),\n          renderSlide: Virtual.renderSlide.bind(swiper),\n          slides: swiper.params.virtual.slides,\n          cache: {},\n        },\n      });\n    },\n    on: {\n      beforeInit: function beforeInit() {\n        var swiper = this;\n        if (!swiper.params.virtual.enabled) { return; }\n        swiper.classNames.push(((swiper.params.containerModifierClass) + \"virtual\"));\n        var overwriteParams = {\n          watchSlidesProgress: true,\n        };\n        Utils.extend(swiper.params, overwriteParams);\n        Utils.extend(swiper.originalParams, overwriteParams);\n\n        if (!swiper.params.initialSlide) {\n          swiper.virtual.update();\n        }\n      },\n      setTranslate: function setTranslate() {\n        var swiper = this;\n        if (!swiper.params.virtual.enabled) { return; }\n        swiper.virtual.update();\n      },\n    },\n  };\n\n  var Keyboard = {\n    handle: function handle(event) {\n      var swiper = this;\n      var rtl = swiper.rtlTranslate;\n      var e = event;\n      if (e.originalEvent) { e = e.originalEvent; } // jquery fix\n      var kc = e.keyCode || e.charCode;\n      // Directions locks\n      if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40) || kc === 34)) {\n        return false;\n      }\n      if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38) || kc === 33)) {\n        return false;\n      }\n      if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n        return undefined;\n      }\n      if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) {\n        return undefined;\n      }\n      if (swiper.params.keyboard.onlyInViewport && (kc === 33 || kc === 34 || kc === 37 || kc === 39 || kc === 38 || kc === 40)) {\n        var inView = false;\n        // Check that swiper should be inside of visible area of window\n        if (swiper.$el.parents((\".\" + (swiper.params.slideClass))).length > 0 && swiper.$el.parents((\".\" + (swiper.params.slideActiveClass))).length === 0) {\n          return undefined;\n        }\n        var windowWidth = win.innerWidth;\n        var windowHeight = win.innerHeight;\n        var swiperOffset = swiper.$el.offset();\n        if (rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; }\n        var swiperCoord = [\n          [swiperOffset.left, swiperOffset.top],\n          [swiperOffset.left + swiper.width, swiperOffset.top],\n          [swiperOffset.left, swiperOffset.top + swiper.height],\n          [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ];\n        for (var i = 0; i < swiperCoord.length; i += 1) {\n          var point = swiperCoord[i];\n          if (\n            point[0] >= 0 && point[0] <= windowWidth\n            && point[1] >= 0 && point[1] <= windowHeight\n          ) {\n            inView = true;\n          }\n        }\n        if (!inView) { return undefined; }\n      }\n      if (swiper.isHorizontal()) {\n        if (kc === 33 || kc === 34 || kc === 37 || kc === 39) {\n          if (e.preventDefault) { e.preventDefault(); }\n          else { e.returnValue = false; }\n        }\n        if (((kc === 34 || kc === 39) && !rtl) || ((kc === 33 || kc === 37) && rtl)) { swiper.slideNext(); }\n        if (((kc === 33 || kc === 37) && !rtl) || ((kc === 34 || kc === 39) && rtl)) { swiper.slidePrev(); }\n      } else {\n        if (kc === 33 || kc === 34 || kc === 38 || kc === 40) {\n          if (e.preventDefault) { e.preventDefault(); }\n          else { e.returnValue = false; }\n        }\n        if (kc === 34 || kc === 40) { swiper.slideNext(); }\n        if (kc === 33 || kc === 38) { swiper.slidePrev(); }\n      }\n      swiper.emit('keyPress', kc);\n      return undefined;\n    },\n    enable: function enable() {\n      var swiper = this;\n      if (swiper.keyboard.enabled) { return; }\n      $(doc).on('keydown', swiper.keyboard.handle);\n      swiper.keyboard.enabled = true;\n    },\n    disable: function disable() {\n      var swiper = this;\n      if (!swiper.keyboard.enabled) { return; }\n      $(doc).off('keydown', swiper.keyboard.handle);\n      swiper.keyboard.enabled = false;\n    },\n  };\n\n  var Keyboard$1 = {\n    name: 'keyboard',\n    params: {\n      keyboard: {\n        enabled: false,\n        onlyInViewport: true,\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        keyboard: {\n          enabled: false,\n          enable: Keyboard.enable.bind(swiper),\n          disable: Keyboard.disable.bind(swiper),\n          handle: Keyboard.handle.bind(swiper),\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        if (swiper.params.keyboard.enabled) {\n          swiper.keyboard.enable();\n        }\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        if (swiper.keyboard.enabled) {\n          swiper.keyboard.disable();\n        }\n      },\n    },\n  };\n\n  function isEventSupported() {\n    var eventName = 'onwheel';\n    var isSupported = eventName in doc;\n\n    if (!isSupported) {\n      var element = doc.createElement('div');\n      element.setAttribute(eventName, 'return;');\n      isSupported = typeof element[eventName] === 'function';\n    }\n\n    if (!isSupported\n      && doc.implementation\n      && doc.implementation.hasFeature\n      // always returns true in newer browsers as per the standard.\n      // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n      && doc.implementation.hasFeature('', '') !== true\n    ) {\n      // This is the only way to test support for the `wheel` event in IE9+.\n      isSupported = doc.implementation.hasFeature('Events.wheel', '3.0');\n    }\n\n    return isSupported;\n  }\n  var Mousewheel = {\n    lastScrollTime: Utils.now(),\n    event: (function getEvent() {\n      if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; }\n      return isEventSupported() ? 'wheel' : 'mousewheel';\n    }()),\n    normalize: function normalize(e) {\n      // Reasonable defaults\n      var PIXEL_STEP = 10;\n      var LINE_HEIGHT = 40;\n      var PAGE_HEIGHT = 800;\n\n      var sX = 0;\n      var sY = 0; // spinX, spinY\n      var pX = 0;\n      var pY = 0; // pixelX, pixelY\n\n      // Legacy\n      if ('detail' in e) {\n        sY = e.detail;\n      }\n      if ('wheelDelta' in e) {\n        sY = -e.wheelDelta / 120;\n      }\n      if ('wheelDeltaY' in e) {\n        sY = -e.wheelDeltaY / 120;\n      }\n      if ('wheelDeltaX' in e) {\n        sX = -e.wheelDeltaX / 120;\n      }\n\n      // side scrolling on FF with DOMMouseScroll\n      if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n        sX = sY;\n        sY = 0;\n      }\n\n      pX = sX * PIXEL_STEP;\n      pY = sY * PIXEL_STEP;\n\n      if ('deltaY' in e) {\n        pY = e.deltaY;\n      }\n      if ('deltaX' in e) {\n        pX = e.deltaX;\n      }\n\n      if ((pX || pY) && e.deltaMode) {\n        if (e.deltaMode === 1) { // delta in LINE units\n          pX *= LINE_HEIGHT;\n          pY *= LINE_HEIGHT;\n        } else { // delta in PAGE units\n          pX *= PAGE_HEIGHT;\n          pY *= PAGE_HEIGHT;\n        }\n      }\n\n      // Fall-back if spin cannot be determined\n      if (pX && !sX) {\n        sX = (pX < 1) ? -1 : 1;\n      }\n      if (pY && !sY) {\n        sY = (pY < 1) ? -1 : 1;\n      }\n\n      return {\n        spinX: sX,\n        spinY: sY,\n        pixelX: pX,\n        pixelY: pY,\n      };\n    },\n    handleMouseEnter: function handleMouseEnter() {\n      var swiper = this;\n      swiper.mouseEntered = true;\n    },\n    handleMouseLeave: function handleMouseLeave() {\n      var swiper = this;\n      swiper.mouseEntered = false;\n    },\n    handle: function handle(event) {\n      var e = event;\n      var swiper = this;\n      var params = swiper.params.mousewheel;\n\n      if (!swiper.mouseEntered && !params.releaseOnEdges) { return true; }\n\n      if (e.originalEvent) { e = e.originalEvent; } // jquery fix\n      var delta = 0;\n      var rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n      var data = Mousewheel.normalize(e);\n\n      if (params.forceToAxis) {\n        if (swiper.isHorizontal()) {\n          if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; }\n          else { return true; }\n        } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; }\n        else { return true; }\n      } else {\n        delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n      }\n\n      if (delta === 0) { return true; }\n\n      if (params.invert) { delta = -delta; }\n\n      if (!swiper.params.freeMode) {\n        if (Utils.now() - swiper.mousewheel.lastScrollTime > 60) {\n          if (delta < 0) {\n            if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n              swiper.slideNext();\n              swiper.emit('scroll', e);\n            } else if (params.releaseOnEdges) { return true; }\n          } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n            swiper.slidePrev();\n            swiper.emit('scroll', e);\n          } else if (params.releaseOnEdges) { return true; }\n        }\n        swiper.mousewheel.lastScrollTime = (new win.Date()).getTime();\n      } else {\n        // Freemode or scrollContainer:\n        if (swiper.params.loop) {\n          swiper.loopFix();\n        }\n        var position = swiper.getTranslate() + (delta * params.sensitivity);\n        var wasBeginning = swiper.isBeginning;\n        var wasEnd = swiper.isEnd;\n\n        if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); }\n        if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); }\n\n        swiper.setTransition(0);\n        swiper.setTranslate(position);\n        swiper.updateProgress();\n        swiper.updateActiveIndex();\n        swiper.updateSlidesClasses();\n\n        if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n          swiper.updateSlidesClasses();\n        }\n\n        if (swiper.params.freeModeSticky) {\n          clearTimeout(swiper.mousewheel.timeout);\n          swiper.mousewheel.timeout = Utils.nextTick(function () {\n            swiper.slideToClosest();\n          }, 300);\n        }\n        // Emit event\n        swiper.emit('scroll', e);\n\n        // Stop autoplay\n        if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.autoplay.stop(); }\n        // Return page scroll on edge positions\n        if (position === swiper.minTranslate() || position === swiper.maxTranslate()) { return true; }\n      }\n\n      if (e.preventDefault) { e.preventDefault(); }\n      else { e.returnValue = false; }\n      return false;\n    },\n    enable: function enable() {\n      var swiper = this;\n      if (!Mousewheel.event) { return false; }\n      if (swiper.mousewheel.enabled) { return false; }\n      var target = swiper.$el;\n      if (swiper.params.mousewheel.eventsTarged !== 'container') {\n        target = $(swiper.params.mousewheel.eventsTarged);\n      }\n      target.on('mouseenter', swiper.mousewheel.handleMouseEnter);\n      target.on('mouseleave', swiper.mousewheel.handleMouseLeave);\n      target.on(Mousewheel.event, swiper.mousewheel.handle);\n      swiper.mousewheel.enabled = true;\n      return true;\n    },\n    disable: function disable() {\n      var swiper = this;\n      if (!Mousewheel.event) { return false; }\n      if (!swiper.mousewheel.enabled) { return false; }\n      var target = swiper.$el;\n      if (swiper.params.mousewheel.eventsTarged !== 'container') {\n        target = $(swiper.params.mousewheel.eventsTarged);\n      }\n      target.off(Mousewheel.event, swiper.mousewheel.handle);\n      swiper.mousewheel.enabled = false;\n      return true;\n    },\n  };\n\n  var Mousewheel$1 = {\n    name: 'mousewheel',\n    params: {\n      mousewheel: {\n        enabled: false,\n        releaseOnEdges: false,\n        invert: false,\n        forceToAxis: false,\n        sensitivity: 1,\n        eventsTarged: 'container',\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        mousewheel: {\n          enabled: false,\n          enable: Mousewheel.enable.bind(swiper),\n          disable: Mousewheel.disable.bind(swiper),\n          handle: Mousewheel.handle.bind(swiper),\n          handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper),\n          handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper),\n          lastScrollTime: Utils.now(),\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); }\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); }\n      },\n    },\n  };\n\n  var Navigation = {\n    update: function update() {\n      // Update Navigation Buttons\n      var swiper = this;\n      var params = swiper.params.navigation;\n\n      if (swiper.params.loop) { return; }\n      var ref = swiper.navigation;\n      var $nextEl = ref.$nextEl;\n      var $prevEl = ref.$prevEl;\n\n      if ($prevEl && $prevEl.length > 0) {\n        if (swiper.isBeginning) {\n          $prevEl.addClass(params.disabledClass);\n        } else {\n          $prevEl.removeClass(params.disabledClass);\n        }\n        $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n      }\n      if ($nextEl && $nextEl.length > 0) {\n        if (swiper.isEnd) {\n          $nextEl.addClass(params.disabledClass);\n        } else {\n          $nextEl.removeClass(params.disabledClass);\n        }\n        $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n      }\n    },\n    onPrevClick: function onPrevClick(e) {\n      var swiper = this;\n      e.preventDefault();\n      if (swiper.isBeginning && !swiper.params.loop) { return; }\n      swiper.slidePrev();\n    },\n    onNextClick: function onNextClick(e) {\n      var swiper = this;\n      e.preventDefault();\n      if (swiper.isEnd && !swiper.params.loop) { return; }\n      swiper.slideNext();\n    },\n    init: function init() {\n      var swiper = this;\n      var params = swiper.params.navigation;\n      if (!(params.nextEl || params.prevEl)) { return; }\n\n      var $nextEl;\n      var $prevEl;\n      if (params.nextEl) {\n        $nextEl = $(params.nextEl);\n        if (\n          swiper.params.uniqueNavElements\n          && typeof params.nextEl === 'string'\n          && $nextEl.length > 1\n          && swiper.$el.find(params.nextEl).length === 1\n        ) {\n          $nextEl = swiper.$el.find(params.nextEl);\n        }\n      }\n      if (params.prevEl) {\n        $prevEl = $(params.prevEl);\n        if (\n          swiper.params.uniqueNavElements\n          && typeof params.prevEl === 'string'\n          && $prevEl.length > 1\n          && swiper.$el.find(params.prevEl).length === 1\n        ) {\n          $prevEl = swiper.$el.find(params.prevEl);\n        }\n      }\n\n      if ($nextEl && $nextEl.length > 0) {\n        $nextEl.on('click', swiper.navigation.onNextClick);\n      }\n      if ($prevEl && $prevEl.length > 0) {\n        $prevEl.on('click', swiper.navigation.onPrevClick);\n      }\n\n      Utils.extend(swiper.navigation, {\n        $nextEl: $nextEl,\n        nextEl: $nextEl && $nextEl[0],\n        $prevEl: $prevEl,\n        prevEl: $prevEl && $prevEl[0],\n      });\n    },\n    destroy: function destroy() {\n      var swiper = this;\n      var ref = swiper.navigation;\n      var $nextEl = ref.$nextEl;\n      var $prevEl = ref.$prevEl;\n      if ($nextEl && $nextEl.length) {\n        $nextEl.off('click', swiper.navigation.onNextClick);\n        $nextEl.removeClass(swiper.params.navigation.disabledClass);\n      }\n      if ($prevEl && $prevEl.length) {\n        $prevEl.off('click', swiper.navigation.onPrevClick);\n        $prevEl.removeClass(swiper.params.navigation.disabledClass);\n      }\n    },\n  };\n\n  var Navigation$1 = {\n    name: 'navigation',\n    params: {\n      navigation: {\n        nextEl: null,\n        prevEl: null,\n\n        hideOnClick: false,\n        disabledClass: 'swiper-button-disabled',\n        hiddenClass: 'swiper-button-hidden',\n        lockClass: 'swiper-button-lock',\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        navigation: {\n          init: Navigation.init.bind(swiper),\n          update: Navigation.update.bind(swiper),\n          destroy: Navigation.destroy.bind(swiper),\n          onNextClick: Navigation.onNextClick.bind(swiper),\n          onPrevClick: Navigation.onPrevClick.bind(swiper),\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        swiper.navigation.init();\n        swiper.navigation.update();\n      },\n      toEdge: function toEdge() {\n        var swiper = this;\n        swiper.navigation.update();\n      },\n      fromEdge: function fromEdge() {\n        var swiper = this;\n        swiper.navigation.update();\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        swiper.navigation.destroy();\n      },\n      click: function click(e) {\n        var swiper = this;\n        var ref = swiper.navigation;\n        var $nextEl = ref.$nextEl;\n        var $prevEl = ref.$prevEl;\n        if (\n          swiper.params.navigation.hideOnClick\n          && !$(e.target).is($prevEl)\n          && !$(e.target).is($nextEl)\n        ) {\n          var isHidden;\n          if ($nextEl) {\n            isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n          } else if ($prevEl) {\n            isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n          }\n          if (isHidden === true) {\n            swiper.emit('navigationShow', swiper);\n          } else {\n            swiper.emit('navigationHide', swiper);\n          }\n          if ($nextEl) {\n            $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n          }\n          if ($prevEl) {\n            $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n          }\n        }\n      },\n    },\n  };\n\n  var Pagination = {\n    update: function update() {\n      // Render || Update Pagination bullets/items\n      var swiper = this;\n      var rtl = swiper.rtl;\n      var params = swiper.params.pagination;\n      if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n      var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n      var $el = swiper.pagination.$el;\n      // Current/Total\n      var current;\n      var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n      if (swiper.params.loop) {\n        current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);\n        if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {\n          current -= (slidesLength - (swiper.loopedSlides * 2));\n        }\n        if (current > total - 1) { current -= total; }\n        if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }\n      } else if (typeof swiper.snapIndex !== 'undefined') {\n        current = swiper.snapIndex;\n      } else {\n        current = swiper.activeIndex || 0;\n      }\n      // Types\n      if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n        var bullets = swiper.pagination.bullets;\n        var firstIndex;\n        var lastIndex;\n        var midIndex;\n        if (params.dynamicBullets) {\n          swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n          $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + \"px\"));\n          if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n            swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);\n            if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {\n              swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;\n            } else if (swiper.pagination.dynamicBulletIndex < 0) {\n              swiper.pagination.dynamicBulletIndex = 0;\n            }\n          }\n          firstIndex = current - swiper.pagination.dynamicBulletIndex;\n          lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n          midIndex = (lastIndex + firstIndex) / 2;\n        }\n        bullets.removeClass(((params.bulletActiveClass) + \" \" + (params.bulletActiveClass) + \"-next \" + (params.bulletActiveClass) + \"-next-next \" + (params.bulletActiveClass) + \"-prev \" + (params.bulletActiveClass) + \"-prev-prev \" + (params.bulletActiveClass) + \"-main\"));\n        if ($el.length > 1) {\n          bullets.each(function (index, bullet) {\n            var $bullet = $(bullet);\n            var bulletIndex = $bullet.index();\n            if (bulletIndex === current) {\n              $bullet.addClass(params.bulletActiveClass);\n            }\n            if (params.dynamicBullets) {\n              if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n                $bullet.addClass(((params.bulletActiveClass) + \"-main\"));\n              }\n              if (bulletIndex === firstIndex) {\n                $bullet\n                  .prev()\n                  .addClass(((params.bulletActiveClass) + \"-prev\"))\n                  .prev()\n                  .addClass(((params.bulletActiveClass) + \"-prev-prev\"));\n              }\n              if (bulletIndex === lastIndex) {\n                $bullet\n                  .next()\n                  .addClass(((params.bulletActiveClass) + \"-next\"))\n                  .next()\n                  .addClass(((params.bulletActiveClass) + \"-next-next\"));\n              }\n            }\n          });\n        } else {\n          var $bullet = bullets.eq(current);\n          $bullet.addClass(params.bulletActiveClass);\n          if (params.dynamicBullets) {\n            var $firstDisplayedBullet = bullets.eq(firstIndex);\n            var $lastDisplayedBullet = bullets.eq(lastIndex);\n            for (var i = firstIndex; i <= lastIndex; i += 1) {\n              bullets.eq(i).addClass(((params.bulletActiveClass) + \"-main\"));\n            }\n            $firstDisplayedBullet\n              .prev()\n              .addClass(((params.bulletActiveClass) + \"-prev\"))\n              .prev()\n              .addClass(((params.bulletActiveClass) + \"-prev-prev\"));\n            $lastDisplayedBullet\n              .next()\n              .addClass(((params.bulletActiveClass) + \"-next\"))\n              .next()\n              .addClass(((params.bulletActiveClass) + \"-next-next\"));\n          }\n        }\n        if (params.dynamicBullets) {\n          var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n          var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);\n          var offsetProp = rtl ? 'right' : 'left';\n          bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + \"px\"));\n        }\n      }\n      if (params.type === 'fraction') {\n        $el.find((\".\" + (params.currentClass))).text(params.formatFractionCurrent(current + 1));\n        $el.find((\".\" + (params.totalClass))).text(params.formatFractionTotal(total));\n      }\n      if (params.type === 'progressbar') {\n        var progressbarDirection;\n        if (params.progressbarOpposite) {\n          progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n        } else {\n          progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n        }\n        var scale = (current + 1) / total;\n        var scaleX = 1;\n        var scaleY = 1;\n        if (progressbarDirection === 'horizontal') {\n          scaleX = scale;\n        } else {\n          scaleY = scale;\n        }\n        $el.find((\".\" + (params.progressbarFillClass))).transform((\"translate3d(0,0,0) scaleX(\" + scaleX + \") scaleY(\" + scaleY + \")\")).transition(swiper.params.speed);\n      }\n      if (params.type === 'custom' && params.renderCustom) {\n        $el.html(params.renderCustom(swiper, current + 1, total));\n        swiper.emit('paginationRender', swiper, $el[0]);\n      } else {\n        swiper.emit('paginationUpdate', swiper, $el[0]);\n      }\n      $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n    },\n    render: function render() {\n      // Render Container\n      var swiper = this;\n      var params = swiper.params.pagination;\n      if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n      var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n\n      var $el = swiper.pagination.$el;\n      var paginationHTML = '';\n      if (params.type === 'bullets') {\n        var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n        for (var i = 0; i < numberOfBullets; i += 1) {\n          if (params.renderBullet) {\n            paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n          } else {\n            paginationHTML += \"<\" + (params.bulletElement) + \" class=\\\"\" + (params.bulletClass) + \"\\\"></\" + (params.bulletElement) + \">\";\n          }\n        }\n        $el.html(paginationHTML);\n        swiper.pagination.bullets = $el.find((\".\" + (params.bulletClass)));\n      }\n      if (params.type === 'fraction') {\n        if (params.renderFraction) {\n          paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n        } else {\n          paginationHTML = \"<span class=\\\"\" + (params.currentClass) + \"\\\"></span>\"\n          + ' / '\n          + \"<span class=\\\"\" + (params.totalClass) + \"\\\"></span>\";\n        }\n        $el.html(paginationHTML);\n      }\n      if (params.type === 'progressbar') {\n        if (params.renderProgressbar) {\n          paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n        } else {\n          paginationHTML = \"<span class=\\\"\" + (params.progressbarFillClass) + \"\\\"></span>\";\n        }\n        $el.html(paginationHTML);\n      }\n      if (params.type !== 'custom') {\n        swiper.emit('paginationRender', swiper.pagination.$el[0]);\n      }\n    },\n    init: function init() {\n      var swiper = this;\n      var params = swiper.params.pagination;\n      if (!params.el) { return; }\n\n      var $el = $(params.el);\n      if ($el.length === 0) { return; }\n\n      if (\n        swiper.params.uniqueNavElements\n        && typeof params.el === 'string'\n        && $el.length > 1\n        && swiper.$el.find(params.el).length === 1\n      ) {\n        $el = swiper.$el.find(params.el);\n      }\n\n      if (params.type === 'bullets' && params.clickable) {\n        $el.addClass(params.clickableClass);\n      }\n\n      $el.addClass(params.modifierClass + params.type);\n\n      if (params.type === 'bullets' && params.dynamicBullets) {\n        $el.addClass((\"\" + (params.modifierClass) + (params.type) + \"-dynamic\"));\n        swiper.pagination.dynamicBulletIndex = 0;\n        if (params.dynamicMainBullets < 1) {\n          params.dynamicMainBullets = 1;\n        }\n      }\n      if (params.type === 'progressbar' && params.progressbarOpposite) {\n        $el.addClass(params.progressbarOppositeClass);\n      }\n\n      if (params.clickable) {\n        $el.on('click', (\".\" + (params.bulletClass)), function onClick(e) {\n          e.preventDefault();\n          var index = $(this).index() * swiper.params.slidesPerGroup;\n          if (swiper.params.loop) { index += swiper.loopedSlides; }\n          swiper.slideTo(index);\n        });\n      }\n\n      Utils.extend(swiper.pagination, {\n        $el: $el,\n        el: $el[0],\n      });\n    },\n    destroy: function destroy() {\n      var swiper = this;\n      var params = swiper.params.pagination;\n      if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n      var $el = swiper.pagination.$el;\n\n      $el.removeClass(params.hiddenClass);\n      $el.removeClass(params.modifierClass + params.type);\n      if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }\n      if (params.clickable) {\n        $el.off('click', (\".\" + (params.bulletClass)));\n      }\n    },\n  };\n\n  var Pagination$1 = {\n    name: 'pagination',\n    params: {\n      pagination: {\n        el: null,\n        bulletElement: 'span',\n        clickable: false,\n        hideOnClick: false,\n        renderBullet: null,\n        renderProgressbar: null,\n        renderFraction: null,\n        renderCustom: null,\n        progressbarOpposite: false,\n        type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n        dynamicBullets: false,\n        dynamicMainBullets: 1,\n        formatFractionCurrent: function (number) { return number; },\n        formatFractionTotal: function (number) { return number; },\n        bulletClass: 'swiper-pagination-bullet',\n        bulletActiveClass: 'swiper-pagination-bullet-active',\n        modifierClass: 'swiper-pagination-', // NEW\n        currentClass: 'swiper-pagination-current',\n        totalClass: 'swiper-pagination-total',\n        hiddenClass: 'swiper-pagination-hidden',\n        progressbarFillClass: 'swiper-pagination-progressbar-fill',\n        progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',\n        clickableClass: 'swiper-pagination-clickable', // NEW\n        lockClass: 'swiper-pagination-lock',\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        pagination: {\n          init: Pagination.init.bind(swiper),\n          render: Pagination.render.bind(swiper),\n          update: Pagination.update.bind(swiper),\n          destroy: Pagination.destroy.bind(swiper),\n          dynamicBulletIndex: 0,\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        swiper.pagination.init();\n        swiper.pagination.render();\n        swiper.pagination.update();\n      },\n      activeIndexChange: function activeIndexChange() {\n        var swiper = this;\n        if (swiper.params.loop) {\n          swiper.pagination.update();\n        } else if (typeof swiper.snapIndex === 'undefined') {\n          swiper.pagination.update();\n        }\n      },\n      snapIndexChange: function snapIndexChange() {\n        var swiper = this;\n        if (!swiper.params.loop) {\n          swiper.pagination.update();\n        }\n      },\n      slidesLengthChange: function slidesLengthChange() {\n        var swiper = this;\n        if (swiper.params.loop) {\n          swiper.pagination.render();\n          swiper.pagination.update();\n        }\n      },\n      snapGridLengthChange: function snapGridLengthChange() {\n        var swiper = this;\n        if (!swiper.params.loop) {\n          swiper.pagination.render();\n          swiper.pagination.update();\n        }\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        swiper.pagination.destroy();\n      },\n      click: function click(e) {\n        var swiper = this;\n        if (\n          swiper.params.pagination.el\n          && swiper.params.pagination.hideOnClick\n          && swiper.pagination.$el.length > 0\n          && !$(e.target).hasClass(swiper.params.pagination.bulletClass)\n        ) {\n          var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);\n          if (isHidden === true) {\n            swiper.emit('paginationShow', swiper);\n          } else {\n            swiper.emit('paginationHide', swiper);\n          }\n          swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);\n        }\n      },\n    },\n  };\n\n  var Scrollbar = {\n    setTranslate: function setTranslate() {\n      var swiper = this;\n      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n      var scrollbar = swiper.scrollbar;\n      var rtl = swiper.rtlTranslate;\n      var progress = swiper.progress;\n      var dragSize = scrollbar.dragSize;\n      var trackSize = scrollbar.trackSize;\n      var $dragEl = scrollbar.$dragEl;\n      var $el = scrollbar.$el;\n      var params = swiper.params.scrollbar;\n\n      var newSize = dragSize;\n      var newPos = (trackSize - dragSize) * progress;\n      if (rtl) {\n        newPos = -newPos;\n        if (newPos > 0) {\n          newSize = dragSize - newPos;\n          newPos = 0;\n        } else if (-newPos + dragSize > trackSize) {\n          newSize = trackSize + newPos;\n        }\n      } else if (newPos < 0) {\n        newSize = dragSize + newPos;\n        newPos = 0;\n      } else if (newPos + dragSize > trackSize) {\n        newSize = trackSize - newPos;\n      }\n      if (swiper.isHorizontal()) {\n        if (Support.transforms3d) {\n          $dragEl.transform((\"translate3d(\" + newPos + \"px, 0, 0)\"));\n        } else {\n          $dragEl.transform((\"translateX(\" + newPos + \"px)\"));\n        }\n        $dragEl[0].style.width = newSize + \"px\";\n      } else {\n        if (Support.transforms3d) {\n          $dragEl.transform((\"translate3d(0px, \" + newPos + \"px, 0)\"));\n        } else {\n          $dragEl.transform((\"translateY(\" + newPos + \"px)\"));\n        }\n        $dragEl[0].style.height = newSize + \"px\";\n      }\n      if (params.hide) {\n        clearTimeout(swiper.scrollbar.timeout);\n        $el[0].style.opacity = 1;\n        swiper.scrollbar.timeout = setTimeout(function () {\n          $el[0].style.opacity = 0;\n          $el.transition(400);\n        }, 1000);\n      }\n    },\n    setTransition: function setTransition(duration) {\n      var swiper = this;\n      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n      swiper.scrollbar.$dragEl.transition(duration);\n    },\n    updateSize: function updateSize() {\n      var swiper = this;\n      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n\n      var scrollbar = swiper.scrollbar;\n      var $dragEl = scrollbar.$dragEl;\n      var $el = scrollbar.$el;\n\n      $dragEl[0].style.width = '';\n      $dragEl[0].style.height = '';\n      var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n      var divider = swiper.size / swiper.virtualSize;\n      var moveDivider = divider * (trackSize / swiper.size);\n      var dragSize;\n      if (swiper.params.scrollbar.dragSize === 'auto') {\n        dragSize = trackSize * divider;\n      } else {\n        dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n      }\n\n      if (swiper.isHorizontal()) {\n        $dragEl[0].style.width = dragSize + \"px\";\n      } else {\n        $dragEl[0].style.height = dragSize + \"px\";\n      }\n\n      if (divider >= 1) {\n        $el[0].style.display = 'none';\n      } else {\n        $el[0].style.display = '';\n      }\n      if (swiper.params.scrollbar.hide) {\n        $el[0].style.opacity = 0;\n      }\n      Utils.extend(scrollbar, {\n        trackSize: trackSize,\n        divider: divider,\n        moveDivider: moveDivider,\n        dragSize: dragSize,\n      });\n      scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);\n    },\n    getPointerPosition: function getPointerPosition(e) {\n      var swiper = this;\n      if (swiper.isHorizontal()) {\n        return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX);\n      }\n      return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY);\n    },\n    setDragPosition: function setDragPosition(e) {\n      var swiper = this;\n      var scrollbar = swiper.scrollbar;\n      var rtl = swiper.rtlTranslate;\n      var $el = scrollbar.$el;\n      var dragSize = scrollbar.dragSize;\n      var trackSize = scrollbar.trackSize;\n      var dragStartPos = scrollbar.dragStartPos;\n\n      var positionRatio;\n      positionRatio = ((scrollbar.getPointerPosition(e)) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top']\n        - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);\n      positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n      if (rtl) {\n        positionRatio = 1 - positionRatio;\n      }\n\n      var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);\n\n      swiper.updateProgress(position);\n      swiper.setTranslate(position);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    },\n    onDragStart: function onDragStart(e) {\n      var swiper = this;\n      var params = swiper.params.scrollbar;\n      var scrollbar = swiper.scrollbar;\n      var $wrapperEl = swiper.$wrapperEl;\n      var $el = scrollbar.$el;\n      var $dragEl = scrollbar.$dragEl;\n      swiper.scrollbar.isTouched = true;\n      swiper.scrollbar.dragStartPos = (e.target === $dragEl[0] || e.target === $dragEl)\n        ? scrollbar.getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;\n      e.preventDefault();\n      e.stopPropagation();\n\n      $wrapperEl.transition(100);\n      $dragEl.transition(100);\n      scrollbar.setDragPosition(e);\n\n      clearTimeout(swiper.scrollbar.dragTimeout);\n\n      $el.transition(0);\n      if (params.hide) {\n        $el.css('opacity', 1);\n      }\n      swiper.emit('scrollbarDragStart', e);\n    },\n    onDragMove: function onDragMove(e) {\n      var swiper = this;\n      var scrollbar = swiper.scrollbar;\n      var $wrapperEl = swiper.$wrapperEl;\n      var $el = scrollbar.$el;\n      var $dragEl = scrollbar.$dragEl;\n\n      if (!swiper.scrollbar.isTouched) { return; }\n      if (e.preventDefault) { e.preventDefault(); }\n      else { e.returnValue = false; }\n      scrollbar.setDragPosition(e);\n      $wrapperEl.transition(0);\n      $el.transition(0);\n      $dragEl.transition(0);\n      swiper.emit('scrollbarDragMove', e);\n    },\n    onDragEnd: function onDragEnd(e) {\n      var swiper = this;\n\n      var params = swiper.params.scrollbar;\n      var scrollbar = swiper.scrollbar;\n      var $el = scrollbar.$el;\n\n      if (!swiper.scrollbar.isTouched) { return; }\n      swiper.scrollbar.isTouched = false;\n      if (params.hide) {\n        clearTimeout(swiper.scrollbar.dragTimeout);\n        swiper.scrollbar.dragTimeout = Utils.nextTick(function () {\n          $el.css('opacity', 0);\n          $el.transition(400);\n        }, 1000);\n      }\n      swiper.emit('scrollbarDragEnd', e);\n      if (params.snapOnRelease) {\n        swiper.slideToClosest();\n      }\n    },\n    enableDraggable: function enableDraggable() {\n      var swiper = this;\n      if (!swiper.params.scrollbar.el) { return; }\n      var scrollbar = swiper.scrollbar;\n      var touchEventsTouch = swiper.touchEventsTouch;\n      var touchEventsDesktop = swiper.touchEventsDesktop;\n      var params = swiper.params;\n      var $el = scrollbar.$el;\n      var target = $el[0];\n      var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;\n      var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n      if (!Support.touch) {\n        target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);\n        doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);\n        doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);\n      } else {\n        target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);\n        target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);\n        target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);\n      }\n    },\n    disableDraggable: function disableDraggable() {\n      var swiper = this;\n      if (!swiper.params.scrollbar.el) { return; }\n      var scrollbar = swiper.scrollbar;\n      var touchEventsTouch = swiper.touchEventsTouch;\n      var touchEventsDesktop = swiper.touchEventsDesktop;\n      var params = swiper.params;\n      var $el = scrollbar.$el;\n      var target = $el[0];\n      var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;\n      var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n      if (!Support.touch) {\n        target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);\n        doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);\n        doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);\n      } else {\n        target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);\n        target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);\n        target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);\n      }\n    },\n    init: function init() {\n      var swiper = this;\n      if (!swiper.params.scrollbar.el) { return; }\n      var scrollbar = swiper.scrollbar;\n      var $swiperEl = swiper.$el;\n      var params = swiper.params.scrollbar;\n\n      var $el = $(params.el);\n      if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {\n        $el = $swiperEl.find(params.el);\n      }\n\n      var $dragEl = $el.find((\".\" + (swiper.params.scrollbar.dragClass)));\n      if ($dragEl.length === 0) {\n        $dragEl = $((\"<div class=\\\"\" + (swiper.params.scrollbar.dragClass) + \"\\\"></div>\"));\n        $el.append($dragEl);\n      }\n\n      Utils.extend(scrollbar, {\n        $el: $el,\n        el: $el[0],\n        $dragEl: $dragEl,\n        dragEl: $dragEl[0],\n      });\n\n      if (params.draggable) {\n        scrollbar.enableDraggable();\n      }\n    },\n    destroy: function destroy() {\n      var swiper = this;\n      swiper.scrollbar.disableDraggable();\n    },\n  };\n\n  var Scrollbar$1 = {\n    name: 'scrollbar',\n    params: {\n      scrollbar: {\n        el: null,\n        dragSize: 'auto',\n        hide: false,\n        draggable: false,\n        snapOnRelease: true,\n        lockClass: 'swiper-scrollbar-lock',\n        dragClass: 'swiper-scrollbar-drag',\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        scrollbar: {\n          init: Scrollbar.init.bind(swiper),\n          destroy: Scrollbar.destroy.bind(swiper),\n          updateSize: Scrollbar.updateSize.bind(swiper),\n          setTranslate: Scrollbar.setTranslate.bind(swiper),\n          setTransition: Scrollbar.setTransition.bind(swiper),\n          enableDraggable: Scrollbar.enableDraggable.bind(swiper),\n          disableDraggable: Scrollbar.disableDraggable.bind(swiper),\n          setDragPosition: Scrollbar.setDragPosition.bind(swiper),\n          getPointerPosition: Scrollbar.getPointerPosition.bind(swiper),\n          onDragStart: Scrollbar.onDragStart.bind(swiper),\n          onDragMove: Scrollbar.onDragMove.bind(swiper),\n          onDragEnd: Scrollbar.onDragEnd.bind(swiper),\n          isTouched: false,\n          timeout: null,\n          dragTimeout: null,\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        swiper.scrollbar.init();\n        swiper.scrollbar.updateSize();\n        swiper.scrollbar.setTranslate();\n      },\n      update: function update() {\n        var swiper = this;\n        swiper.scrollbar.updateSize();\n      },\n      resize: function resize() {\n        var swiper = this;\n        swiper.scrollbar.updateSize();\n      },\n      observerUpdate: function observerUpdate() {\n        var swiper = this;\n        swiper.scrollbar.updateSize();\n      },\n      setTranslate: function setTranslate() {\n        var swiper = this;\n        swiper.scrollbar.setTranslate();\n      },\n      setTransition: function setTransition(duration) {\n        var swiper = this;\n        swiper.scrollbar.setTransition(duration);\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        swiper.scrollbar.destroy();\n      },\n    },\n  };\n\n  var Parallax = {\n    setTransform: function setTransform(el, progress) {\n      var swiper = this;\n      var rtl = swiper.rtl;\n\n      var $el = $(el);\n      var rtlFactor = rtl ? -1 : 1;\n\n      var p = $el.attr('data-swiper-parallax') || '0';\n      var x = $el.attr('data-swiper-parallax-x');\n      var y = $el.attr('data-swiper-parallax-y');\n      var scale = $el.attr('data-swiper-parallax-scale');\n      var opacity = $el.attr('data-swiper-parallax-opacity');\n\n      if (x || y) {\n        x = x || '0';\n        y = y || '0';\n      } else if (swiper.isHorizontal()) {\n        x = p;\n        y = '0';\n      } else {\n        y = p;\n        x = '0';\n      }\n\n      if ((x).indexOf('%') >= 0) {\n        x = (parseInt(x, 10) * progress * rtlFactor) + \"%\";\n      } else {\n        x = (x * progress * rtlFactor) + \"px\";\n      }\n      if ((y).indexOf('%') >= 0) {\n        y = (parseInt(y, 10) * progress) + \"%\";\n      } else {\n        y = (y * progress) + \"px\";\n      }\n\n      if (typeof opacity !== 'undefined' && opacity !== null) {\n        var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));\n        $el[0].style.opacity = currentOpacity;\n      }\n      if (typeof scale === 'undefined' || scale === null) {\n        $el.transform((\"translate3d(\" + x + \", \" + y + \", 0px)\"));\n      } else {\n        var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));\n        $el.transform((\"translate3d(\" + x + \", \" + y + \", 0px) scale(\" + currentScale + \")\"));\n      }\n    },\n    setTranslate: function setTranslate() {\n      var swiper = this;\n      var $el = swiper.$el;\n      var slides = swiper.slides;\n      var progress = swiper.progress;\n      var snapGrid = swiper.snapGrid;\n      $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')\n        .each(function (index, el) {\n          swiper.parallax.setTransform(el, progress);\n        });\n      slides.each(function (slideIndex, slideEl) {\n        var slideProgress = slideEl.progress;\n        if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n          slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));\n        }\n        slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n        $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')\n          .each(function (index, el) {\n            swiper.parallax.setTransform(el, slideProgress);\n          });\n      });\n    },\n    setTransition: function setTransition(duration) {\n      if ( duration === void 0 ) duration = this.params.speed;\n\n      var swiper = this;\n      var $el = swiper.$el;\n      $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')\n        .each(function (index, parallaxEl) {\n          var $parallaxEl = $(parallaxEl);\n          var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n          if (duration === 0) { parallaxDuration = 0; }\n          $parallaxEl.transition(parallaxDuration);\n        });\n    },\n  };\n\n  var Parallax$1 = {\n    name: 'parallax',\n    params: {\n      parallax: {\n        enabled: false,\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        parallax: {\n          setTransform: Parallax.setTransform.bind(swiper),\n          setTranslate: Parallax.setTranslate.bind(swiper),\n          setTransition: Parallax.setTransition.bind(swiper),\n        },\n      });\n    },\n    on: {\n      beforeInit: function beforeInit() {\n        var swiper = this;\n        if (!swiper.params.parallax.enabled) { return; }\n        swiper.params.watchSlidesProgress = true;\n        swiper.originalParams.watchSlidesProgress = true;\n      },\n      init: function init() {\n        var swiper = this;\n        if (!swiper.params.parallax.enabled) { return; }\n        swiper.parallax.setTranslate();\n      },\n      setTranslate: function setTranslate() {\n        var swiper = this;\n        if (!swiper.params.parallax.enabled) { return; }\n        swiper.parallax.setTranslate();\n      },\n      setTransition: function setTransition(duration) {\n        var swiper = this;\n        if (!swiper.params.parallax.enabled) { return; }\n        swiper.parallax.setTransition(duration);\n      },\n    },\n  };\n\n  var Zoom = {\n    // Calc Scale From Multi-touches\n    getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {\n      if (e.targetTouches.length < 2) { return 1; }\n      var x1 = e.targetTouches[0].pageX;\n      var y1 = e.targetTouches[0].pageY;\n      var x2 = e.targetTouches[1].pageX;\n      var y2 = e.targetTouches[1].pageY;\n      var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));\n      return distance;\n    },\n    // Events\n    onGestureStart: function onGestureStart(e) {\n      var swiper = this;\n      var params = swiper.params.zoom;\n      var zoom = swiper.zoom;\n      var gesture = zoom.gesture;\n      zoom.fakeGestureTouched = false;\n      zoom.fakeGestureMoved = false;\n      if (!Support.gestures) {\n        if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n          return;\n        }\n        zoom.fakeGestureTouched = true;\n        gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);\n      }\n      if (!gesture.$slideEl || !gesture.$slideEl.length) {\n        gesture.$slideEl = $(e.target).closest('.swiper-slide');\n        if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }\n        gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n        gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n        gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n        if (gesture.$imageWrapEl.length === 0) {\n          gesture.$imageEl = undefined;\n          return;\n        }\n      }\n      gesture.$imageEl.transition(0);\n      swiper.zoom.isScaling = true;\n    },\n    onGestureChange: function onGestureChange(e) {\n      var swiper = this;\n      var params = swiper.params.zoom;\n      var zoom = swiper.zoom;\n      var gesture = zoom.gesture;\n      if (!Support.gestures) {\n        if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n          return;\n        }\n        zoom.fakeGestureMoved = true;\n        gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);\n      }\n      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n      if (Support.gestures) {\n        zoom.scale = e.scale * zoom.currentScale;\n      } else {\n        zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;\n      }\n      if (zoom.scale > gesture.maxRatio) {\n        zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));\n      }\n      if (zoom.scale < params.minRatio) {\n        zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));\n      }\n      gesture.$imageEl.transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n    },\n    onGestureEnd: function onGestureEnd(e) {\n      var swiper = this;\n      var params = swiper.params.zoom;\n      var zoom = swiper.zoom;\n      var gesture = zoom.gesture;\n      if (!Support.gestures) {\n        if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {\n          return;\n        }\n        if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {\n          return;\n        }\n        zoom.fakeGestureTouched = false;\n        zoom.fakeGestureMoved = false;\n      }\n      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n      zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n      gesture.$imageEl.transition(swiper.params.speed).transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n      zoom.currentScale = zoom.scale;\n      zoom.isScaling = false;\n      if (zoom.scale === 1) { gesture.$slideEl = undefined; }\n    },\n    onTouchStart: function onTouchStart(e) {\n      var swiper = this;\n      var zoom = swiper.zoom;\n      var gesture = zoom.gesture;\n      var image = zoom.image;\n      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n      if (image.isTouched) { return; }\n      if (Device.android) { e.preventDefault(); }\n      image.isTouched = true;\n      image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n      image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n    },\n    onTouchMove: function onTouchMove(e) {\n      var swiper = this;\n      var zoom = swiper.zoom;\n      var gesture = zoom.gesture;\n      var image = zoom.image;\n      var velocity = zoom.velocity;\n      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n      swiper.allowClick = false;\n      if (!image.isTouched || !gesture.$slideEl) { return; }\n\n      if (!image.isMoved) {\n        image.width = gesture.$imageEl[0].offsetWidth;\n        image.height = gesture.$imageEl[0].offsetHeight;\n        image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n        image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n        gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n        gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n        gesture.$imageWrapEl.transition(0);\n        if (swiper.rtl) {\n          image.startX = -image.startX;\n          image.startY = -image.startY;\n        }\n      }\n      // Define if we need image drag\n      var scaledWidth = image.width * zoom.scale;\n      var scaledHeight = image.height * zoom.scale;\n\n      if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }\n\n      image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);\n      image.maxX = -image.minX;\n      image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);\n      image.maxY = -image.minY;\n\n      image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n      image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n      if (!image.isMoved && !zoom.isScaling) {\n        if (\n          swiper.isHorizontal()\n          && (\n            (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)\n            || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)\n          )\n        ) {\n          image.isTouched = false;\n          return;\n        } if (\n          !swiper.isHorizontal()\n          && (\n            (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)\n            || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)\n          )\n        ) {\n          image.isTouched = false;\n          return;\n        }\n      }\n      e.preventDefault();\n      e.stopPropagation();\n\n      image.isMoved = true;\n      image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;\n      image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;\n\n      if (image.currentX < image.minX) {\n        image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));\n      }\n      if (image.currentX > image.maxX) {\n        image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));\n      }\n\n      if (image.currentY < image.minY) {\n        image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));\n      }\n      if (image.currentY > image.maxY) {\n        image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));\n      }\n\n      // Velocity\n      if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }\n      if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }\n      if (!velocity.prevTime) { velocity.prevTime = Date.now(); }\n      velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n      velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n      if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }\n      if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }\n      velocity.prevPositionX = image.touchesCurrent.x;\n      velocity.prevPositionY = image.touchesCurrent.y;\n      velocity.prevTime = Date.now();\n\n      gesture.$imageWrapEl.transform((\"translate3d(\" + (image.currentX) + \"px, \" + (image.currentY) + \"px,0)\"));\n    },\n    onTouchEnd: function onTouchEnd() {\n      var swiper = this;\n      var zoom = swiper.zoom;\n      var gesture = zoom.gesture;\n      var image = zoom.image;\n      var velocity = zoom.velocity;\n      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n      if (!image.isTouched || !image.isMoved) {\n        image.isTouched = false;\n        image.isMoved = false;\n        return;\n      }\n      image.isTouched = false;\n      image.isMoved = false;\n      var momentumDurationX = 300;\n      var momentumDurationY = 300;\n      var momentumDistanceX = velocity.x * momentumDurationX;\n      var newPositionX = image.currentX + momentumDistanceX;\n      var momentumDistanceY = velocity.y * momentumDurationY;\n      var newPositionY = image.currentY + momentumDistanceY;\n\n      // Fix duration\n      if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }\n      if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }\n      var momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n      image.currentX = newPositionX;\n      image.currentY = newPositionY;\n\n      // Define if we need image drag\n      var scaledWidth = image.width * zoom.scale;\n      var scaledHeight = image.height * zoom.scale;\n      image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);\n      image.maxX = -image.minX;\n      image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);\n      image.maxY = -image.minY;\n      image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n      image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n      gesture.$imageWrapEl.transition(momentumDuration).transform((\"translate3d(\" + (image.currentX) + \"px, \" + (image.currentY) + \"px,0)\"));\n    },\n    onTransitionEnd: function onTransitionEnd() {\n      var swiper = this;\n      var zoom = swiper.zoom;\n      var gesture = zoom.gesture;\n      if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n        gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n        gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n\n        zoom.scale = 1;\n        zoom.currentScale = 1;\n\n        gesture.$slideEl = undefined;\n        gesture.$imageEl = undefined;\n        gesture.$imageWrapEl = undefined;\n      }\n    },\n    // Toggle Zoom\n    toggle: function toggle(e) {\n      var swiper = this;\n      var zoom = swiper.zoom;\n\n      if (zoom.scale && zoom.scale !== 1) {\n        // Zoom Out\n        zoom.out();\n      } else {\n        // Zoom In\n        zoom.in(e);\n      }\n    },\n    in: function in$1(e) {\n      var swiper = this;\n\n      var zoom = swiper.zoom;\n      var params = swiper.params.zoom;\n      var gesture = zoom.gesture;\n      var image = zoom.image;\n\n      if (!gesture.$slideEl) {\n        gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);\n        gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n        gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n      }\n      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n\n      gesture.$slideEl.addClass((\"\" + (params.zoomedSlideClass)));\n\n      var touchX;\n      var touchY;\n      var offsetX;\n      var offsetY;\n      var diffX;\n      var diffY;\n      var translateX;\n      var translateY;\n      var imageWidth;\n      var imageHeight;\n      var scaledWidth;\n      var scaledHeight;\n      var translateMinX;\n      var translateMinY;\n      var translateMaxX;\n      var translateMaxY;\n      var slideWidth;\n      var slideHeight;\n\n      if (typeof image.touchesStart.x === 'undefined' && e) {\n        touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n        touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n      } else {\n        touchX = image.touchesStart.x;\n        touchY = image.touchesStart.y;\n      }\n\n      zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n      zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n      if (e) {\n        slideWidth = gesture.$slideEl[0].offsetWidth;\n        slideHeight = gesture.$slideEl[0].offsetHeight;\n        offsetX = gesture.$slideEl.offset().left;\n        offsetY = gesture.$slideEl.offset().top;\n        diffX = (offsetX + (slideWidth / 2)) - touchX;\n        diffY = (offsetY + (slideHeight / 2)) - touchY;\n\n        imageWidth = gesture.$imageEl[0].offsetWidth;\n        imageHeight = gesture.$imageEl[0].offsetHeight;\n        scaledWidth = imageWidth * zoom.scale;\n        scaledHeight = imageHeight * zoom.scale;\n\n        translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);\n        translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);\n        translateMaxX = -translateMinX;\n        translateMaxY = -translateMinY;\n\n        translateX = diffX * zoom.scale;\n        translateY = diffY * zoom.scale;\n\n        if (translateX < translateMinX) {\n          translateX = translateMinX;\n        }\n        if (translateX > translateMaxX) {\n          translateX = translateMaxX;\n        }\n\n        if (translateY < translateMinY) {\n          translateY = translateMinY;\n        }\n        if (translateY > translateMaxY) {\n          translateY = translateMaxY;\n        }\n      } else {\n        translateX = 0;\n        translateY = 0;\n      }\n      gesture.$imageWrapEl.transition(300).transform((\"translate3d(\" + translateX + \"px, \" + translateY + \"px,0)\"));\n      gesture.$imageEl.transition(300).transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n    },\n    out: function out() {\n      var swiper = this;\n\n      var zoom = swiper.zoom;\n      var params = swiper.params.zoom;\n      var gesture = zoom.gesture;\n\n      if (!gesture.$slideEl) {\n        gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);\n        gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n        gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n      }\n      if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n\n      zoom.scale = 1;\n      zoom.currentScale = 1;\n      gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n      gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n      gesture.$slideEl.removeClass((\"\" + (params.zoomedSlideClass)));\n      gesture.$slideEl = undefined;\n    },\n    // Attach/Detach Events\n    enable: function enable() {\n      var swiper = this;\n      var zoom = swiper.zoom;\n      if (zoom.enabled) { return; }\n      zoom.enabled = true;\n\n      var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;\n\n      // Scale image\n      if (Support.gestures) {\n        swiper.$wrapperEl.on('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);\n        swiper.$wrapperEl.on('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);\n        swiper.$wrapperEl.on('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);\n      } else if (swiper.touchEvents.start === 'touchstart') {\n        swiper.$wrapperEl.on(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);\n        swiper.$wrapperEl.on(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);\n        swiper.$wrapperEl.on(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);\n      }\n\n      // Move image\n      swiper.$wrapperEl.on(swiper.touchEvents.move, (\".\" + (swiper.params.zoom.containerClass)), zoom.onTouchMove);\n    },\n    disable: function disable() {\n      var swiper = this;\n      var zoom = swiper.zoom;\n      if (!zoom.enabled) { return; }\n\n      swiper.zoom.enabled = false;\n\n      var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;\n\n      // Scale image\n      if (Support.gestures) {\n        swiper.$wrapperEl.off('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);\n        swiper.$wrapperEl.off('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);\n        swiper.$wrapperEl.off('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);\n      } else if (swiper.touchEvents.start === 'touchstart') {\n        swiper.$wrapperEl.off(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);\n        swiper.$wrapperEl.off(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);\n        swiper.$wrapperEl.off(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);\n      }\n\n      // Move image\n      swiper.$wrapperEl.off(swiper.touchEvents.move, (\".\" + (swiper.params.zoom.containerClass)), zoom.onTouchMove);\n    },\n  };\n\n  var Zoom$1 = {\n    name: 'zoom',\n    params: {\n      zoom: {\n        enabled: false,\n        maxRatio: 3,\n        minRatio: 1,\n        toggle: true,\n        containerClass: 'swiper-zoom-container',\n        zoomedSlideClass: 'swiper-slide-zoomed',\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      var zoom = {\n        enabled: false,\n        scale: 1,\n        currentScale: 1,\n        isScaling: false,\n        gesture: {\n          $slideEl: undefined,\n          slideWidth: undefined,\n          slideHeight: undefined,\n          $imageEl: undefined,\n          $imageWrapEl: undefined,\n          maxRatio: 3,\n        },\n        image: {\n          isTouched: undefined,\n          isMoved: undefined,\n          currentX: undefined,\n          currentY: undefined,\n          minX: undefined,\n          minY: undefined,\n          maxX: undefined,\n          maxY: undefined,\n          width: undefined,\n          height: undefined,\n          startX: undefined,\n          startY: undefined,\n          touchesStart: {},\n          touchesCurrent: {},\n        },\n        velocity: {\n          x: undefined,\n          y: undefined,\n          prevPositionX: undefined,\n          prevPositionY: undefined,\n          prevTime: undefined,\n        },\n      };\n\n      ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {\n        zoom[methodName] = Zoom[methodName].bind(swiper);\n      });\n      Utils.extend(swiper, {\n        zoom: zoom,\n      });\n\n      var scale = 1;\n      Object.defineProperty(swiper.zoom, 'scale', {\n        get: function get() {\n          return scale;\n        },\n        set: function set(value) {\n          if (scale !== value) {\n            var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;\n            var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;\n            swiper.emit('zoomChange', value, imageEl, slideEl);\n          }\n          scale = value;\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        if (swiper.params.zoom.enabled) {\n          swiper.zoom.enable();\n        }\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        swiper.zoom.disable();\n      },\n      touchStart: function touchStart(e) {\n        var swiper = this;\n        if (!swiper.zoom.enabled) { return; }\n        swiper.zoom.onTouchStart(e);\n      },\n      touchEnd: function touchEnd(e) {\n        var swiper = this;\n        if (!swiper.zoom.enabled) { return; }\n        swiper.zoom.onTouchEnd(e);\n      },\n      doubleTap: function doubleTap(e) {\n        var swiper = this;\n        if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {\n          swiper.zoom.toggle(e);\n        }\n      },\n      transitionEnd: function transitionEnd() {\n        var swiper = this;\n        if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n          swiper.zoom.onTransitionEnd();\n        }\n      },\n    },\n  };\n\n  var Lazy = {\n    loadInSlide: function loadInSlide(index, loadInDuplicate) {\n      if ( loadInDuplicate === void 0 ) loadInDuplicate = true;\n\n      var swiper = this;\n      var params = swiper.params.lazy;\n      if (typeof index === 'undefined') { return; }\n      if (swiper.slides.length === 0) { return; }\n      var isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n      var $slideEl = isVirtual\n        ? swiper.$wrapperEl.children((\".\" + (swiper.params.slideClass) + \"[data-swiper-slide-index=\\\"\" + index + \"\\\"]\"))\n        : swiper.slides.eq(index);\n\n      var $images = $slideEl.find((\".\" + (params.elementClass) + \":not(.\" + (params.loadedClass) + \"):not(.\" + (params.loadingClass) + \")\"));\n      if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {\n        $images = $images.add($slideEl[0]);\n      }\n      if ($images.length === 0) { return; }\n\n      $images.each(function (imageIndex, imageEl) {\n        var $imageEl = $(imageEl);\n        $imageEl.addClass(params.loadingClass);\n\n        var background = $imageEl.attr('data-background');\n        var src = $imageEl.attr('data-src');\n        var srcset = $imageEl.attr('data-srcset');\n        var sizes = $imageEl.attr('data-sizes');\n\n        swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {\n          if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }\n          if (background) {\n            $imageEl.css('background-image', (\"url(\\\"\" + background + \"\\\")\"));\n            $imageEl.removeAttr('data-background');\n          } else {\n            if (srcset) {\n              $imageEl.attr('srcset', srcset);\n              $imageEl.removeAttr('data-srcset');\n            }\n            if (sizes) {\n              $imageEl.attr('sizes', sizes);\n              $imageEl.removeAttr('data-sizes');\n            }\n            if (src) {\n              $imageEl.attr('src', src);\n              $imageEl.removeAttr('data-src');\n            }\n          }\n\n          $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n          $slideEl.find((\".\" + (params.preloaderClass))).remove();\n          if (swiper.params.loop && loadInDuplicate) {\n            var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n            if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n              var originalSlide = swiper.$wrapperEl.children((\"[data-swiper-slide-index=\\\"\" + slideOriginalIndex + \"\\\"]:not(.\" + (swiper.params.slideDuplicateClass) + \")\"));\n              swiper.lazy.loadInSlide(originalSlide.index(), false);\n            } else {\n              var duplicatedSlide = swiper.$wrapperEl.children((\".\" + (swiper.params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + slideOriginalIndex + \"\\\"]\"));\n              swiper.lazy.loadInSlide(duplicatedSlide.index(), false);\n            }\n          }\n          swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n        });\n\n        swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n      });\n    },\n    load: function load() {\n      var swiper = this;\n      var $wrapperEl = swiper.$wrapperEl;\n      var swiperParams = swiper.params;\n      var slides = swiper.slides;\n      var activeIndex = swiper.activeIndex;\n      var isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n      var params = swiperParams.lazy;\n\n      var slidesPerView = swiperParams.slidesPerView;\n      if (slidesPerView === 'auto') {\n        slidesPerView = 0;\n      }\n\n      function slideExist(index) {\n        if (isVirtual) {\n          if ($wrapperEl.children((\".\" + (swiperParams.slideClass) + \"[data-swiper-slide-index=\\\"\" + index + \"\\\"]\")).length) {\n            return true;\n          }\n        } else if (slides[index]) { return true; }\n        return false;\n      }\n      function slideIndex(slideEl) {\n        if (isVirtual) {\n          return $(slideEl).attr('data-swiper-slide-index');\n        }\n        return $(slideEl).index();\n      }\n\n      if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }\n      if (swiper.params.watchSlidesVisibility) {\n        $wrapperEl.children((\".\" + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {\n          var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n          swiper.lazy.loadInSlide(index);\n        });\n      } else if (slidesPerView > 1) {\n        for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n          if (slideExist(i)) { swiper.lazy.loadInSlide(i); }\n        }\n      } else {\n        swiper.lazy.loadInSlide(activeIndex);\n      }\n      if (params.loadPrevNext) {\n        if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n          var amount = params.loadPrevNextAmount;\n          var spv = slidesPerView;\n          var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n          var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n          // Next Slides\n          for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {\n            if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }\n          }\n          // Prev Slides\n          for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {\n            if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }\n          }\n        } else {\n          var nextSlide = $wrapperEl.children((\".\" + (swiperParams.slideNextClass)));\n          if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }\n\n          var prevSlide = $wrapperEl.children((\".\" + (swiperParams.slidePrevClass)));\n          if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }\n        }\n      }\n    },\n  };\n\n  var Lazy$1 = {\n    name: 'lazy',\n    params: {\n      lazy: {\n        enabled: false,\n        loadPrevNext: false,\n        loadPrevNextAmount: 1,\n        loadOnTransitionStart: false,\n\n        elementClass: 'swiper-lazy',\n        loadingClass: 'swiper-lazy-loading',\n        loadedClass: 'swiper-lazy-loaded',\n        preloaderClass: 'swiper-lazy-preloader',\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        lazy: {\n          initialImageLoaded: false,\n          load: Lazy.load.bind(swiper),\n          loadInSlide: Lazy.loadInSlide.bind(swiper),\n        },\n      });\n    },\n    on: {\n      beforeInit: function beforeInit() {\n        var swiper = this;\n        if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n          swiper.params.preloadImages = false;\n        }\n      },\n      init: function init() {\n        var swiper = this;\n        if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {\n          swiper.lazy.load();\n        }\n      },\n      scroll: function scroll() {\n        var swiper = this;\n        if (swiper.params.freeMode && !swiper.params.freeModeSticky) {\n          swiper.lazy.load();\n        }\n      },\n      resize: function resize() {\n        var swiper = this;\n        if (swiper.params.lazy.enabled) {\n          swiper.lazy.load();\n        }\n      },\n      scrollbarDragMove: function scrollbarDragMove() {\n        var swiper = this;\n        if (swiper.params.lazy.enabled) {\n          swiper.lazy.load();\n        }\n      },\n      transitionStart: function transitionStart() {\n        var swiper = this;\n        if (swiper.params.lazy.enabled) {\n          if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {\n            swiper.lazy.load();\n          }\n        }\n      },\n      transitionEnd: function transitionEnd() {\n        var swiper = this;\n        if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n          swiper.lazy.load();\n        }\n      },\n    },\n  };\n\n  /* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\n\n  var Controller = {\n    LinearSpline: function LinearSpline(x, y) {\n      var binarySearch = (function search() {\n        var maxIndex;\n        var minIndex;\n        var guess;\n        return function (array, val) {\n          minIndex = -1;\n          maxIndex = array.length;\n          while (maxIndex - minIndex > 1) {\n            guess = maxIndex + minIndex >> 1;\n            if (array[guess] <= val) {\n              minIndex = guess;\n            } else {\n              maxIndex = guess;\n            }\n          }\n          return maxIndex;\n        };\n      }());\n      this.x = x;\n      this.y = y;\n      this.lastIndex = x.length - 1;\n      // Given an x value (x2), return the expected y2 value:\n      // (x1,y1) is the known point before given value,\n      // (x3,y3) is the known point after given value.\n      var i1;\n      var i3;\n\n      this.interpolate = function interpolate(x2) {\n        if (!x2) { return 0; }\n\n        // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n        i3 = binarySearch(this.x, x2);\n        i1 = i3 - 1;\n\n        // We have our indexes i1 & i3, so we can calculate already:\n        // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n        return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];\n      };\n      return this;\n    },\n    // xxx: for now i will just save one spline function to to\n    getInterpolateFunction: function getInterpolateFunction(c) {\n      var swiper = this;\n      if (!swiper.controller.spline) {\n        swiper.controller.spline = swiper.params.loop\n          ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)\n          : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);\n      }\n    },\n    setTranslate: function setTranslate(setTranslate$1, byController) {\n      var swiper = this;\n      var controlled = swiper.controller.control;\n      var multiplier;\n      var controlledTranslate;\n      function setControlledTranslate(c) {\n        // this will create an Interpolate function based on the snapGrids\n        // x is the Grid of the scrolled scroller and y will be the controlled scroller\n        // it makes sense to create this only once and recall it for the interpolation\n        // the function does a lot of value caching for performance\n        var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n        if (swiper.params.controller.by === 'slide') {\n          swiper.controller.getInterpolateFunction(c);\n          // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n          // but it did not work out\n          controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n        }\n\n        if (!controlledTranslate || swiper.params.controller.by === 'container') {\n          multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n          controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();\n        }\n\n        if (swiper.params.controller.inverse) {\n          controlledTranslate = c.maxTranslate() - controlledTranslate;\n        }\n        c.updateProgress(controlledTranslate);\n        c.setTranslate(controlledTranslate, swiper);\n        c.updateActiveIndex();\n        c.updateSlidesClasses();\n      }\n      if (Array.isArray(controlled)) {\n        for (var i = 0; i < controlled.length; i += 1) {\n          if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n            setControlledTranslate(controlled[i]);\n          }\n        }\n      } else if (controlled instanceof Swiper && byController !== controlled) {\n        setControlledTranslate(controlled);\n      }\n    },\n    setTransition: function setTransition(duration, byController) {\n      var swiper = this;\n      var controlled = swiper.controller.control;\n      var i;\n      function setControlledTransition(c) {\n        c.setTransition(duration, swiper);\n        if (duration !== 0) {\n          c.transitionStart();\n          if (c.params.autoHeight) {\n            Utils.nextTick(function () {\n              c.updateAutoHeight();\n            });\n          }\n          c.$wrapperEl.transitionEnd(function () {\n            if (!controlled) { return; }\n            if (c.params.loop && swiper.params.controller.by === 'slide') {\n              c.loopFix();\n            }\n            c.transitionEnd();\n          });\n        }\n      }\n      if (Array.isArray(controlled)) {\n        for (i = 0; i < controlled.length; i += 1) {\n          if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n            setControlledTransition(controlled[i]);\n          }\n        }\n      } else if (controlled instanceof Swiper && byController !== controlled) {\n        setControlledTransition(controlled);\n      }\n    },\n  };\n  var Controller$1 = {\n    name: 'controller',\n    params: {\n      controller: {\n        control: undefined,\n        inverse: false,\n        by: 'slide', // or 'container'\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        controller: {\n          control: swiper.params.controller.control,\n          getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),\n          setTranslate: Controller.setTranslate.bind(swiper),\n          setTransition: Controller.setTransition.bind(swiper),\n        },\n      });\n    },\n    on: {\n      update: function update() {\n        var swiper = this;\n        if (!swiper.controller.control) { return; }\n        if (swiper.controller.spline) {\n          swiper.controller.spline = undefined;\n          delete swiper.controller.spline;\n        }\n      },\n      resize: function resize() {\n        var swiper = this;\n        if (!swiper.controller.control) { return; }\n        if (swiper.controller.spline) {\n          swiper.controller.spline = undefined;\n          delete swiper.controller.spline;\n        }\n      },\n      observerUpdate: function observerUpdate() {\n        var swiper = this;\n        if (!swiper.controller.control) { return; }\n        if (swiper.controller.spline) {\n          swiper.controller.spline = undefined;\n          delete swiper.controller.spline;\n        }\n      },\n      setTranslate: function setTranslate(translate, byController) {\n        var swiper = this;\n        if (!swiper.controller.control) { return; }\n        swiper.controller.setTranslate(translate, byController);\n      },\n      setTransition: function setTransition(duration, byController) {\n        var swiper = this;\n        if (!swiper.controller.control) { return; }\n        swiper.controller.setTransition(duration, byController);\n      },\n    },\n  };\n\n  var a11y = {\n    makeElFocusable: function makeElFocusable($el) {\n      $el.attr('tabIndex', '0');\n      return $el;\n    },\n    addElRole: function addElRole($el, role) {\n      $el.attr('role', role);\n      return $el;\n    },\n    addElLabel: function addElLabel($el, label) {\n      $el.attr('aria-label', label);\n      return $el;\n    },\n    disableEl: function disableEl($el) {\n      $el.attr('aria-disabled', true);\n      return $el;\n    },\n    enableEl: function enableEl($el) {\n      $el.attr('aria-disabled', false);\n      return $el;\n    },\n    onEnterKey: function onEnterKey(e) {\n      var swiper = this;\n      var params = swiper.params.a11y;\n      if (e.keyCode !== 13) { return; }\n      var $targetEl = $(e.target);\n      if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n        if (!(swiper.isEnd && !swiper.params.loop)) {\n          swiper.slideNext();\n        }\n        if (swiper.isEnd) {\n          swiper.a11y.notify(params.lastSlideMessage);\n        } else {\n          swiper.a11y.notify(params.nextSlideMessage);\n        }\n      }\n      if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n        if (!(swiper.isBeginning && !swiper.params.loop)) {\n          swiper.slidePrev();\n        }\n        if (swiper.isBeginning) {\n          swiper.a11y.notify(params.firstSlideMessage);\n        } else {\n          swiper.a11y.notify(params.prevSlideMessage);\n        }\n      }\n      if (swiper.pagination && $targetEl.is((\".\" + (swiper.params.pagination.bulletClass)))) {\n        $targetEl[0].click();\n      }\n    },\n    notify: function notify(message) {\n      var swiper = this;\n      var notification = swiper.a11y.liveRegion;\n      if (notification.length === 0) { return; }\n      notification.html('');\n      notification.html(message);\n    },\n    updateNavigation: function updateNavigation() {\n      var swiper = this;\n\n      if (swiper.params.loop) { return; }\n      var ref = swiper.navigation;\n      var $nextEl = ref.$nextEl;\n      var $prevEl = ref.$prevEl;\n\n      if ($prevEl && $prevEl.length > 0) {\n        if (swiper.isBeginning) {\n          swiper.a11y.disableEl($prevEl);\n        } else {\n          swiper.a11y.enableEl($prevEl);\n        }\n      }\n      if ($nextEl && $nextEl.length > 0) {\n        if (swiper.isEnd) {\n          swiper.a11y.disableEl($nextEl);\n        } else {\n          swiper.a11y.enableEl($nextEl);\n        }\n      }\n    },\n    updatePagination: function updatePagination() {\n      var swiper = this;\n      var params = swiper.params.a11y;\n      if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n        swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {\n          var $bulletEl = $(bulletEl);\n          swiper.a11y.makeElFocusable($bulletEl);\n          swiper.a11y.addElRole($bulletEl, 'button');\n          swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1));\n        });\n      }\n    },\n    init: function init() {\n      var swiper = this;\n\n      swiper.$el.append(swiper.a11y.liveRegion);\n\n      // Navigation\n      var params = swiper.params.a11y;\n      var $nextEl;\n      var $prevEl;\n      if (swiper.navigation && swiper.navigation.$nextEl) {\n        $nextEl = swiper.navigation.$nextEl;\n      }\n      if (swiper.navigation && swiper.navigation.$prevEl) {\n        $prevEl = swiper.navigation.$prevEl;\n      }\n      if ($nextEl) {\n        swiper.a11y.makeElFocusable($nextEl);\n        swiper.a11y.addElRole($nextEl, 'button');\n        swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);\n        $nextEl.on('keydown', swiper.a11y.onEnterKey);\n      }\n      if ($prevEl) {\n        swiper.a11y.makeElFocusable($prevEl);\n        swiper.a11y.addElRole($prevEl, 'button');\n        swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);\n        $prevEl.on('keydown', swiper.a11y.onEnterKey);\n      }\n\n      // Pagination\n      if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n        swiper.pagination.$el.on('keydown', (\".\" + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);\n      }\n    },\n    destroy: function destroy() {\n      var swiper = this;\n      if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }\n\n      var $nextEl;\n      var $prevEl;\n      if (swiper.navigation && swiper.navigation.$nextEl) {\n        $nextEl = swiper.navigation.$nextEl;\n      }\n      if (swiper.navigation && swiper.navigation.$prevEl) {\n        $prevEl = swiper.navigation.$prevEl;\n      }\n      if ($nextEl) {\n        $nextEl.off('keydown', swiper.a11y.onEnterKey);\n      }\n      if ($prevEl) {\n        $prevEl.off('keydown', swiper.a11y.onEnterKey);\n      }\n\n      // Pagination\n      if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n        swiper.pagination.$el.off('keydown', (\".\" + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);\n      }\n    },\n  };\n  var A11y = {\n    name: 'a11y',\n    params: {\n      a11y: {\n        enabled: true,\n        notificationClass: 'swiper-notification',\n        prevSlideMessage: 'Previous slide',\n        nextSlideMessage: 'Next slide',\n        firstSlideMessage: 'This is the first slide',\n        lastSlideMessage: 'This is the last slide',\n        paginationBulletMessage: 'Go to slide {{index}}',\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        a11y: {\n          liveRegion: $((\"<span class=\\\"\" + (swiper.params.a11y.notificationClass) + \"\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\"></span>\")),\n        },\n      });\n      Object.keys(a11y).forEach(function (methodName) {\n        swiper.a11y[methodName] = a11y[methodName].bind(swiper);\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        if (!swiper.params.a11y.enabled) { return; }\n        swiper.a11y.init();\n        swiper.a11y.updateNavigation();\n      },\n      toEdge: function toEdge() {\n        var swiper = this;\n        if (!swiper.params.a11y.enabled) { return; }\n        swiper.a11y.updateNavigation();\n      },\n      fromEdge: function fromEdge() {\n        var swiper = this;\n        if (!swiper.params.a11y.enabled) { return; }\n        swiper.a11y.updateNavigation();\n      },\n      paginationUpdate: function paginationUpdate() {\n        var swiper = this;\n        if (!swiper.params.a11y.enabled) { return; }\n        swiper.a11y.updatePagination();\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        if (!swiper.params.a11y.enabled) { return; }\n        swiper.a11y.destroy();\n      },\n    },\n  };\n\n  var History = {\n    init: function init() {\n      var swiper = this;\n      if (!swiper.params.history) { return; }\n      if (!win.history || !win.history.pushState) {\n        swiper.params.history.enabled = false;\n        swiper.params.hashNavigation.enabled = true;\n        return;\n      }\n      var history = swiper.history;\n      history.initialized = true;\n      history.paths = History.getPathValues();\n      if (!history.paths.key && !history.paths.value) { return; }\n      history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);\n      if (!swiper.params.history.replaceState) {\n        win.addEventListener('popstate', swiper.history.setHistoryPopState);\n      }\n    },\n    destroy: function destroy() {\n      var swiper = this;\n      if (!swiper.params.history.replaceState) {\n        win.removeEventListener('popstate', swiper.history.setHistoryPopState);\n      }\n    },\n    setHistoryPopState: function setHistoryPopState() {\n      var swiper = this;\n      swiper.history.paths = History.getPathValues();\n      swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);\n    },\n    getPathValues: function getPathValues() {\n      var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; });\n      var total = pathArray.length;\n      var key = pathArray[total - 2];\n      var value = pathArray[total - 1];\n      return { key: key, value: value };\n    },\n    setHistory: function setHistory(key, index) {\n      var swiper = this;\n      if (!swiper.history.initialized || !swiper.params.history.enabled) { return; }\n      var slide = swiper.slides.eq(index);\n      var value = History.slugify(slide.attr('data-history'));\n      if (!win.location.pathname.includes(key)) {\n        value = key + \"/\" + value;\n      }\n      var currentState = win.history.state;\n      if (currentState && currentState.value === value) {\n        return;\n      }\n      if (swiper.params.history.replaceState) {\n        win.history.replaceState({ value: value }, null, value);\n      } else {\n        win.history.pushState({ value: value }, null, value);\n      }\n    },\n    slugify: function slugify(text) {\n      return text.toString()\n        .replace(/\\s+/g, '-')\n        .replace(/[^\\w-]+/g, '')\n        .replace(/--+/g, '-')\n        .replace(/^-+/, '')\n        .replace(/-+$/, '');\n    },\n    scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {\n      var swiper = this;\n      if (value) {\n        for (var i = 0, length = swiper.slides.length; i < length; i += 1) {\n          var slide = swiper.slides.eq(i);\n          var slideHistory = History.slugify(slide.attr('data-history'));\n          if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n            var index = slide.index();\n            swiper.slideTo(index, speed, runCallbacks);\n          }\n        }\n      } else {\n        swiper.slideTo(0, speed, runCallbacks);\n      }\n    },\n  };\n\n  var History$1 = {\n    name: 'history',\n    params: {\n      history: {\n        enabled: false,\n        replaceState: false,\n        key: 'slides',\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        history: {\n          init: History.init.bind(swiper),\n          setHistory: History.setHistory.bind(swiper),\n          setHistoryPopState: History.setHistoryPopState.bind(swiper),\n          scrollToSlide: History.scrollToSlide.bind(swiper),\n          destroy: History.destroy.bind(swiper),\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        if (swiper.params.history.enabled) {\n          swiper.history.init();\n        }\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        if (swiper.params.history.enabled) {\n          swiper.history.destroy();\n        }\n      },\n      transitionEnd: function transitionEnd() {\n        var swiper = this;\n        if (swiper.history.initialized) {\n          swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);\n        }\n      },\n    },\n  };\n\n  var HashNavigation = {\n    onHashCange: function onHashCange() {\n      var swiper = this;\n      var newHash = doc.location.hash.replace('#', '');\n      var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n      if (newHash !== activeSlideHash) {\n        var newIndex = swiper.$wrapperEl.children((\".\" + (swiper.params.slideClass) + \"[data-hash=\\\"\" + newHash + \"\\\"]\")).index();\n        if (typeof newIndex === 'undefined') { return; }\n        swiper.slideTo(newIndex);\n      }\n    },\n    setHash: function setHash() {\n      var swiper = this;\n      if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; }\n      if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) {\n        win.history.replaceState(null, null, ((\"#\" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || false));\n      } else {\n        var slide = swiper.slides.eq(swiper.activeIndex);\n        var hash = slide.attr('data-hash') || slide.attr('data-history');\n        doc.location.hash = hash || '';\n      }\n    },\n    init: function init() {\n      var swiper = this;\n      if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; }\n      swiper.hashNavigation.initialized = true;\n      var hash = doc.location.hash.replace('#', '');\n      if (hash) {\n        var speed = 0;\n        for (var i = 0, length = swiper.slides.length; i < length; i += 1) {\n          var slide = swiper.slides.eq(i);\n          var slideHash = slide.attr('data-hash') || slide.attr('data-history');\n          if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n            var index = slide.index();\n            swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n          }\n        }\n      }\n      if (swiper.params.hashNavigation.watchState) {\n        $(win).on('hashchange', swiper.hashNavigation.onHashCange);\n      }\n    },\n    destroy: function destroy() {\n      var swiper = this;\n      if (swiper.params.hashNavigation.watchState) {\n        $(win).off('hashchange', swiper.hashNavigation.onHashCange);\n      }\n    },\n  };\n  var HashNavigation$1 = {\n    name: 'hash-navigation',\n    params: {\n      hashNavigation: {\n        enabled: false,\n        replaceState: false,\n        watchState: false,\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        hashNavigation: {\n          initialized: false,\n          init: HashNavigation.init.bind(swiper),\n          destroy: HashNavigation.destroy.bind(swiper),\n          setHash: HashNavigation.setHash.bind(swiper),\n          onHashCange: HashNavigation.onHashCange.bind(swiper),\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        if (swiper.params.hashNavigation.enabled) {\n          swiper.hashNavigation.init();\n        }\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        if (swiper.params.hashNavigation.enabled) {\n          swiper.hashNavigation.destroy();\n        }\n      },\n      transitionEnd: function transitionEnd() {\n        var swiper = this;\n        if (swiper.hashNavigation.initialized) {\n          swiper.hashNavigation.setHash();\n        }\n      },\n    },\n  };\n\n  /* eslint no-underscore-dangle: \"off\" */\n\n  var Autoplay = {\n    run: function run() {\n      var swiper = this;\n      var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n      var delay = swiper.params.autoplay.delay;\n      if ($activeSlideEl.attr('data-swiper-autoplay')) {\n        delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n      }\n      clearTimeout(swiper.autoplay.timeout);\n      swiper.autoplay.timeout = Utils.nextTick(function () {\n        if (swiper.params.autoplay.reverseDirection) {\n          if (swiper.params.loop) {\n            swiper.loopFix();\n            swiper.slidePrev(swiper.params.speed, true, true);\n            swiper.emit('autoplay');\n          } else if (!swiper.isBeginning) {\n            swiper.slidePrev(swiper.params.speed, true, true);\n            swiper.emit('autoplay');\n          } else if (!swiper.params.autoplay.stopOnLastSlide) {\n            swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);\n            swiper.emit('autoplay');\n          } else {\n            swiper.autoplay.stop();\n          }\n        } else if (swiper.params.loop) {\n          swiper.loopFix();\n          swiper.slideNext(swiper.params.speed, true, true);\n          swiper.emit('autoplay');\n        } else if (!swiper.isEnd) {\n          swiper.slideNext(swiper.params.speed, true, true);\n          swiper.emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          swiper.slideTo(0, swiper.params.speed, true, true);\n          swiper.emit('autoplay');\n        } else {\n          swiper.autoplay.stop();\n        }\n      }, delay);\n    },\n    start: function start() {\n      var swiper = this;\n      if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }\n      if (swiper.autoplay.running) { return false; }\n      swiper.autoplay.running = true;\n      swiper.emit('autoplayStart');\n      swiper.autoplay.run();\n      return true;\n    },\n    stop: function stop() {\n      var swiper = this;\n      if (!swiper.autoplay.running) { return false; }\n      if (typeof swiper.autoplay.timeout === 'undefined') { return false; }\n\n      if (swiper.autoplay.timeout) {\n        clearTimeout(swiper.autoplay.timeout);\n        swiper.autoplay.timeout = undefined;\n      }\n      swiper.autoplay.running = false;\n      swiper.emit('autoplayStop');\n      return true;\n    },\n    pause: function pause(speed) {\n      var swiper = this;\n      if (!swiper.autoplay.running) { return; }\n      if (swiper.autoplay.paused) { return; }\n      if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }\n      swiper.autoplay.paused = true;\n      if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n        swiper.autoplay.paused = false;\n        swiper.autoplay.run();\n      } else {\n        swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);\n        swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);\n      }\n    },\n  };\n\n  var Autoplay$1 = {\n    name: 'autoplay',\n    params: {\n      autoplay: {\n        enabled: false,\n        delay: 3000,\n        waitForTransition: true,\n        disableOnInteraction: true,\n        stopOnLastSlide: false,\n        reverseDirection: false,\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        autoplay: {\n          running: false,\n          paused: false,\n          run: Autoplay.run.bind(swiper),\n          start: Autoplay.start.bind(swiper),\n          stop: Autoplay.stop.bind(swiper),\n          pause: Autoplay.pause.bind(swiper),\n          onTransitionEnd: function onTransitionEnd(e) {\n            if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }\n            if (e.target !== this) { return; }\n            swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);\n            swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);\n            swiper.autoplay.paused = false;\n            if (!swiper.autoplay.running) {\n              swiper.autoplay.stop();\n            } else {\n              swiper.autoplay.run();\n            }\n          },\n        },\n      });\n    },\n    on: {\n      init: function init() {\n        var swiper = this;\n        if (swiper.params.autoplay.enabled) {\n          swiper.autoplay.start();\n        }\n      },\n      beforeTransitionStart: function beforeTransitionStart(speed, internal) {\n        var swiper = this;\n        if (swiper.autoplay.running) {\n          if (internal || !swiper.params.autoplay.disableOnInteraction) {\n            swiper.autoplay.pause(speed);\n          } else {\n            swiper.autoplay.stop();\n          }\n        }\n      },\n      sliderFirstMove: function sliderFirstMove() {\n        var swiper = this;\n        if (swiper.autoplay.running) {\n          if (swiper.params.autoplay.disableOnInteraction) {\n            swiper.autoplay.stop();\n          } else {\n            swiper.autoplay.pause();\n          }\n        }\n      },\n      destroy: function destroy() {\n        var swiper = this;\n        if (swiper.autoplay.running) {\n          swiper.autoplay.stop();\n        }\n      },\n    },\n  };\n\n  var Fade = {\n    setTranslate: function setTranslate() {\n      var swiper = this;\n      var slides = swiper.slides;\n      for (var i = 0; i < slides.length; i += 1) {\n        var $slideEl = swiper.slides.eq(i);\n        var offset = $slideEl[0].swiperSlideOffset;\n        var tx = -offset;\n        if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }\n        var ty = 0;\n        if (!swiper.isHorizontal()) {\n          ty = tx;\n          tx = 0;\n        }\n        var slideOpacity = swiper.params.fadeEffect.crossFade\n          ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n          : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n        $slideEl\n          .css({\n            opacity: slideOpacity,\n          })\n          .transform((\"translate3d(\" + tx + \"px, \" + ty + \"px, 0px)\"));\n      }\n    },\n    setTransition: function setTransition(duration) {\n      var swiper = this;\n      var slides = swiper.slides;\n      var $wrapperEl = swiper.$wrapperEl;\n      slides.transition(duration);\n      if (swiper.params.virtualTranslate && duration !== 0) {\n        var eventTriggered = false;\n        slides.transitionEnd(function () {\n          if (eventTriggered) { return; }\n          if (!swiper || swiper.destroyed) { return; }\n          eventTriggered = true;\n          swiper.animating = false;\n          var triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n          for (var i = 0; i < triggerEvents.length; i += 1) {\n            $wrapperEl.trigger(triggerEvents[i]);\n          }\n        });\n      }\n    },\n  };\n\n  var EffectFade = {\n    name: 'effect-fade',\n    params: {\n      fadeEffect: {\n        crossFade: false,\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        fadeEffect: {\n          setTranslate: Fade.setTranslate.bind(swiper),\n          setTransition: Fade.setTransition.bind(swiper),\n        },\n      });\n    },\n    on: {\n      beforeInit: function beforeInit() {\n        var swiper = this;\n        if (swiper.params.effect !== 'fade') { return; }\n        swiper.classNames.push(((swiper.params.containerModifierClass) + \"fade\"));\n        var overwriteParams = {\n          slidesPerView: 1,\n          slidesPerColumn: 1,\n          slidesPerGroup: 1,\n          watchSlidesProgress: true,\n          spaceBetween: 0,\n          virtualTranslate: true,\n        };\n        Utils.extend(swiper.params, overwriteParams);\n        Utils.extend(swiper.originalParams, overwriteParams);\n      },\n      setTranslate: function setTranslate() {\n        var swiper = this;\n        if (swiper.params.effect !== 'fade') { return; }\n        swiper.fadeEffect.setTranslate();\n      },\n      setTransition: function setTransition(duration) {\n        var swiper = this;\n        if (swiper.params.effect !== 'fade') { return; }\n        swiper.fadeEffect.setTransition(duration);\n      },\n    },\n  };\n\n  var Cube = {\n    setTranslate: function setTranslate() {\n      var swiper = this;\n      var $el = swiper.$el;\n      var $wrapperEl = swiper.$wrapperEl;\n      var slides = swiper.slides;\n      var swiperWidth = swiper.width;\n      var swiperHeight = swiper.height;\n      var rtl = swiper.rtlTranslate;\n      var swiperSize = swiper.size;\n      var params = swiper.params.cubeEffect;\n      var isHorizontal = swiper.isHorizontal();\n      var isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n      var wrapperRotate = 0;\n      var $cubeShadowEl;\n      if (params.shadow) {\n        if (isHorizontal) {\n          $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n          if ($cubeShadowEl.length === 0) {\n            $cubeShadowEl = $('<div class=\"swiper-cube-shadow\"></div>');\n            $wrapperEl.append($cubeShadowEl);\n          }\n          $cubeShadowEl.css({ height: (swiperWidth + \"px\") });\n        } else {\n          $cubeShadowEl = $el.find('.swiper-cube-shadow');\n          if ($cubeShadowEl.length === 0) {\n            $cubeShadowEl = $('<div class=\"swiper-cube-shadow\"></div>');\n            $el.append($cubeShadowEl);\n          }\n        }\n      }\n      for (var i = 0; i < slides.length; i += 1) {\n        var $slideEl = slides.eq(i);\n        var slideIndex = i;\n        if (isVirtual) {\n          slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n        }\n        var slideAngle = slideIndex * 90;\n        var round = Math.floor(slideAngle / 360);\n        if (rtl) {\n          slideAngle = -slideAngle;\n          round = Math.floor(-slideAngle / 360);\n        }\n        var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n        var tx = 0;\n        var ty = 0;\n        var tz = 0;\n        if (slideIndex % 4 === 0) {\n          tx = -round * 4 * swiperSize;\n          tz = 0;\n        } else if ((slideIndex - 1) % 4 === 0) {\n          tx = 0;\n          tz = -round * 4 * swiperSize;\n        } else if ((slideIndex - 2) % 4 === 0) {\n          tx = swiperSize + (round * 4 * swiperSize);\n          tz = swiperSize;\n        } else if ((slideIndex - 3) % 4 === 0) {\n          tx = -swiperSize;\n          tz = (3 * swiperSize) + (swiperSize * 4 * round);\n        }\n        if (rtl) {\n          tx = -tx;\n        }\n\n        if (!isHorizontal) {\n          ty = tx;\n          tx = 0;\n        }\n\n        var transform = \"rotateX(\" + (isHorizontal ? 0 : -slideAngle) + \"deg) rotateY(\" + (isHorizontal ? slideAngle : 0) + \"deg) translate3d(\" + tx + \"px, \" + ty + \"px, \" + tz + \"px)\";\n        if (progress <= 1 && progress > -1) {\n          wrapperRotate = (slideIndex * 90) + (progress * 90);\n          if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }\n        }\n        $slideEl.transform(transform);\n        if (params.slideShadows) {\n          // Set shadows\n          var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n          var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n          if (shadowBefore.length === 0) {\n            shadowBefore = $((\"<div class=\\\"swiper-slide-shadow-\" + (isHorizontal ? 'left' : 'top') + \"\\\"></div>\"));\n            $slideEl.append(shadowBefore);\n          }\n          if (shadowAfter.length === 0) {\n            shadowAfter = $((\"<div class=\\\"swiper-slide-shadow-\" + (isHorizontal ? 'right' : 'bottom') + \"\\\"></div>\"));\n            $slideEl.append(shadowAfter);\n          }\n          if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }\n          if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }\n        }\n      }\n      $wrapperEl.css({\n        '-webkit-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n        '-moz-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n        '-ms-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n        'transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n      });\n\n      if (params.shadow) {\n        if (isHorizontal) {\n          $cubeShadowEl.transform((\"translate3d(0px, \" + ((swiperWidth / 2) + params.shadowOffset) + \"px, \" + (-swiperWidth / 2) + \"px) rotateX(90deg) rotateZ(0deg) scale(\" + (params.shadowScale) + \")\"));\n        } else {\n          var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);\n          var multiplier = 1.5 - (\n            (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)\n            + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)\n          );\n          var scale1 = params.shadowScale;\n          var scale2 = params.shadowScale / multiplier;\n          var offset = params.shadowOffset;\n          $cubeShadowEl.transform((\"scale3d(\" + scale1 + \", 1, \" + scale2 + \") translate3d(0px, \" + ((swiperHeight / 2) + offset) + \"px, \" + (-swiperHeight / 2 / scale2) + \"px) rotateX(-90deg)\"));\n        }\n      }\n      var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;\n      $wrapperEl\n        .transform((\"translate3d(0px,0,\" + zFactor + \"px) rotateX(\" + (swiper.isHorizontal() ? 0 : wrapperRotate) + \"deg) rotateY(\" + (swiper.isHorizontal() ? -wrapperRotate : 0) + \"deg)\"));\n    },\n    setTransition: function setTransition(duration) {\n      var swiper = this;\n      var $el = swiper.$el;\n      var slides = swiper.slides;\n      slides\n        .transition(duration)\n        .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n        .transition(duration);\n      if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n        $el.find('.swiper-cube-shadow').transition(duration);\n      }\n    },\n  };\n\n  var EffectCube = {\n    name: 'effect-cube',\n    params: {\n      cubeEffect: {\n        slideShadows: true,\n        shadow: true,\n        shadowOffset: 20,\n        shadowScale: 0.94,\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        cubeEffect: {\n          setTranslate: Cube.setTranslate.bind(swiper),\n          setTransition: Cube.setTransition.bind(swiper),\n        },\n      });\n    },\n    on: {\n      beforeInit: function beforeInit() {\n        var swiper = this;\n        if (swiper.params.effect !== 'cube') { return; }\n        swiper.classNames.push(((swiper.params.containerModifierClass) + \"cube\"));\n        swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n        var overwriteParams = {\n          slidesPerView: 1,\n          slidesPerColumn: 1,\n          slidesPerGroup: 1,\n          watchSlidesProgress: true,\n          resistanceRatio: 0,\n          spaceBetween: 0,\n          centeredSlides: false,\n          virtualTranslate: true,\n        };\n        Utils.extend(swiper.params, overwriteParams);\n        Utils.extend(swiper.originalParams, overwriteParams);\n      },\n      setTranslate: function setTranslate() {\n        var swiper = this;\n        if (swiper.params.effect !== 'cube') { return; }\n        swiper.cubeEffect.setTranslate();\n      },\n      setTransition: function setTransition(duration) {\n        var swiper = this;\n        if (swiper.params.effect !== 'cube') { return; }\n        swiper.cubeEffect.setTransition(duration);\n      },\n    },\n  };\n\n  var Flip = {\n    setTranslate: function setTranslate() {\n      var swiper = this;\n      var slides = swiper.slides;\n      var rtl = swiper.rtlTranslate;\n      for (var i = 0; i < slides.length; i += 1) {\n        var $slideEl = slides.eq(i);\n        var progress = $slideEl[0].progress;\n        if (swiper.params.flipEffect.limitRotation) {\n          progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n        }\n        var offset = $slideEl[0].swiperSlideOffset;\n        var rotate = -180 * progress;\n        var rotateY = rotate;\n        var rotateX = 0;\n        var tx = -offset;\n        var ty = 0;\n        if (!swiper.isHorizontal()) {\n          ty = tx;\n          tx = 0;\n          rotateX = -rotateY;\n          rotateY = 0;\n        } else if (rtl) {\n          rotateY = -rotateY;\n        }\n\n        $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n        if (swiper.params.flipEffect.slideShadows) {\n          // Set shadows\n          var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n          var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n          if (shadowBefore.length === 0) {\n            shadowBefore = $((\"<div class=\\\"swiper-slide-shadow-\" + (swiper.isHorizontal() ? 'left' : 'top') + \"\\\"></div>\"));\n            $slideEl.append(shadowBefore);\n          }\n          if (shadowAfter.length === 0) {\n            shadowAfter = $((\"<div class=\\\"swiper-slide-shadow-\" + (swiper.isHorizontal() ? 'right' : 'bottom') + \"\\\"></div>\"));\n            $slideEl.append(shadowAfter);\n          }\n          if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }\n          if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }\n        }\n        $slideEl\n          .transform((\"translate3d(\" + tx + \"px, \" + ty + \"px, 0px) rotateX(\" + rotateX + \"deg) rotateY(\" + rotateY + \"deg)\"));\n      }\n    },\n    setTransition: function setTransition(duration) {\n      var swiper = this;\n      var slides = swiper.slides;\n      var activeIndex = swiper.activeIndex;\n      var $wrapperEl = swiper.$wrapperEl;\n      slides\n        .transition(duration)\n        .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n        .transition(duration);\n      if (swiper.params.virtualTranslate && duration !== 0) {\n        var eventTriggered = false;\n        // eslint-disable-next-line\n        slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {\n          if (eventTriggered) { return; }\n          if (!swiper || swiper.destroyed) { return; }\n          // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;\n          eventTriggered = true;\n          swiper.animating = false;\n          var triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n          for (var i = 0; i < triggerEvents.length; i += 1) {\n            $wrapperEl.trigger(triggerEvents[i]);\n          }\n        });\n      }\n    },\n  };\n\n  var EffectFlip = {\n    name: 'effect-flip',\n    params: {\n      flipEffect: {\n        slideShadows: true,\n        limitRotation: true,\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        flipEffect: {\n          setTranslate: Flip.setTranslate.bind(swiper),\n          setTransition: Flip.setTransition.bind(swiper),\n        },\n      });\n    },\n    on: {\n      beforeInit: function beforeInit() {\n        var swiper = this;\n        if (swiper.params.effect !== 'flip') { return; }\n        swiper.classNames.push(((swiper.params.containerModifierClass) + \"flip\"));\n        swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n        var overwriteParams = {\n          slidesPerView: 1,\n          slidesPerColumn: 1,\n          slidesPerGroup: 1,\n          watchSlidesProgress: true,\n          spaceBetween: 0,\n          virtualTranslate: true,\n        };\n        Utils.extend(swiper.params, overwriteParams);\n        Utils.extend(swiper.originalParams, overwriteParams);\n      },\n      setTranslate: function setTranslate() {\n        var swiper = this;\n        if (swiper.params.effect !== 'flip') { return; }\n        swiper.flipEffect.setTranslate();\n      },\n      setTransition: function setTransition(duration) {\n        var swiper = this;\n        if (swiper.params.effect !== 'flip') { return; }\n        swiper.flipEffect.setTransition(duration);\n      },\n    },\n  };\n\n  var Coverflow = {\n    setTranslate: function setTranslate() {\n      var swiper = this;\n      var swiperWidth = swiper.width;\n      var swiperHeight = swiper.height;\n      var slides = swiper.slides;\n      var $wrapperEl = swiper.$wrapperEl;\n      var slidesSizesGrid = swiper.slidesSizesGrid;\n      var params = swiper.params.coverflowEffect;\n      var isHorizontal = swiper.isHorizontal();\n      var transform = swiper.translate;\n      var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);\n      var rotate = isHorizontal ? params.rotate : -params.rotate;\n      var translate = params.depth;\n      // Each slide offset from center\n      for (var i = 0, length = slides.length; i < length; i += 1) {\n        var $slideEl = slides.eq(i);\n        var slideSize = slidesSizesGrid[i];\n        var slideOffset = $slideEl[0].swiperSlideOffset;\n        var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;\n\n        var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n        var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n        // var rotateZ = 0\n        var translateZ = -translate * Math.abs(offsetMultiplier);\n\n        var translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier);\n        var translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0;\n\n        // Fix for ultra small values\n        if (Math.abs(translateX) < 0.001) { translateX = 0; }\n        if (Math.abs(translateY) < 0.001) { translateY = 0; }\n        if (Math.abs(translateZ) < 0.001) { translateZ = 0; }\n        if (Math.abs(rotateY) < 0.001) { rotateY = 0; }\n        if (Math.abs(rotateX) < 0.001) { rotateX = 0; }\n\n        var slideTransform = \"translate3d(\" + translateX + \"px,\" + translateY + \"px,\" + translateZ + \"px)  rotateX(\" + rotateX + \"deg) rotateY(\" + rotateY + \"deg)\";\n\n        $slideEl.transform(slideTransform);\n        $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n        if (params.slideShadows) {\n          // Set shadows\n          var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n          var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n          if ($shadowBeforeEl.length === 0) {\n            $shadowBeforeEl = $((\"<div class=\\\"swiper-slide-shadow-\" + (isHorizontal ? 'left' : 'top') + \"\\\"></div>\"));\n            $slideEl.append($shadowBeforeEl);\n          }\n          if ($shadowAfterEl.length === 0) {\n            $shadowAfterEl = $((\"<div class=\\\"swiper-slide-shadow-\" + (isHorizontal ? 'right' : 'bottom') + \"\\\"></div>\"));\n            $slideEl.append($shadowAfterEl);\n          }\n          if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }\n          if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }\n        }\n      }\n\n      // Set correct perspective for IE10\n      if (Support.pointerEvents || Support.prefixedPointerEvents) {\n        var ws = $wrapperEl[0].style;\n        ws.perspectiveOrigin = center + \"px 50%\";\n      }\n    },\n    setTransition: function setTransition(duration) {\n      var swiper = this;\n      swiper.slides\n        .transition(duration)\n        .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n        .transition(duration);\n    },\n  };\n\n  var EffectCoverflow = {\n    name: 'effect-coverflow',\n    params: {\n      coverflowEffect: {\n        rotate: 50,\n        stretch: 0,\n        depth: 100,\n        modifier: 1,\n        slideShadows: true,\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        coverflowEffect: {\n          setTranslate: Coverflow.setTranslate.bind(swiper),\n          setTransition: Coverflow.setTransition.bind(swiper),\n        },\n      });\n    },\n    on: {\n      beforeInit: function beforeInit() {\n        var swiper = this;\n        if (swiper.params.effect !== 'coverflow') { return; }\n\n        swiper.classNames.push(((swiper.params.containerModifierClass) + \"coverflow\"));\n        swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n\n        swiper.params.watchSlidesProgress = true;\n        swiper.originalParams.watchSlidesProgress = true;\n      },\n      setTranslate: function setTranslate() {\n        var swiper = this;\n        if (swiper.params.effect !== 'coverflow') { return; }\n        swiper.coverflowEffect.setTranslate();\n      },\n      setTransition: function setTransition(duration) {\n        var swiper = this;\n        if (swiper.params.effect !== 'coverflow') { return; }\n        swiper.coverflowEffect.setTransition(duration);\n      },\n    },\n  };\n\n  var Thumbs = {\n    init: function init() {\n      var swiper = this;\n      var ref = swiper.params;\n      var thumbsParams = ref.thumbs;\n      var SwiperClass = swiper.constructor;\n      if (thumbsParams.swiper instanceof SwiperClass) {\n        swiper.thumbs.swiper = thumbsParams.swiper;\n        Utils.extend(swiper.thumbs.swiper.originalParams, {\n          watchSlidesProgress: true,\n          slideToClickedSlide: false,\n        });\n        Utils.extend(swiper.thumbs.swiper.params, {\n          watchSlidesProgress: true,\n          slideToClickedSlide: false,\n        });\n      } else if (Utils.isObject(thumbsParams.swiper)) {\n        swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {\n          watchSlidesVisibility: true,\n          watchSlidesProgress: true,\n          slideToClickedSlide: false,\n        }));\n        swiper.thumbs.swiperCreated = true;\n      }\n      swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n      swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);\n    },\n    onThumbClick: function onThumbClick() {\n      var swiper = this;\n      var thumbsSwiper = swiper.thumbs.swiper;\n      if (!thumbsSwiper) { return; }\n      var clickedIndex = thumbsSwiper.clickedIndex;\n      var clickedSlide = thumbsSwiper.clickedSlide;\n      if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }\n      if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }\n      var slideToIndex;\n      if (thumbsSwiper.params.loop) {\n        slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n      } else {\n        slideToIndex = clickedIndex;\n      }\n      if (swiper.params.loop) {\n        var currentIndex = swiper.activeIndex;\n        if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n          swiper.loopFix();\n          // eslint-disable-next-line\n          swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n          currentIndex = swiper.activeIndex;\n        }\n        var prevIndex = swiper.slides.eq(currentIndex).prevAll((\"[data-swiper-slide-index=\\\"\" + slideToIndex + \"\\\"]\")).eq(0).index();\n        var nextIndex = swiper.slides.eq(currentIndex).nextAll((\"[data-swiper-slide-index=\\\"\" + slideToIndex + \"\\\"]\")).eq(0).index();\n        if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }\n        else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }\n        else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }\n        else { slideToIndex = prevIndex; }\n      }\n      swiper.slideTo(slideToIndex);\n    },\n    update: function update(initial) {\n      var swiper = this;\n      var thumbsSwiper = swiper.thumbs.swiper;\n      if (!thumbsSwiper) { return; }\n\n      var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'\n        ? thumbsSwiper.slidesPerViewDynamic()\n        : thumbsSwiper.params.slidesPerView;\n\n      if (swiper.realIndex !== thumbsSwiper.realIndex) {\n        var currentThumbsIndex = thumbsSwiper.activeIndex;\n        var newThumbsIndex;\n        if (thumbsSwiper.params.loop) {\n          if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {\n            thumbsSwiper.loopFix();\n            // eslint-disable-next-line\n            thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n            currentThumbsIndex = thumbsSwiper.activeIndex;\n          }\n          // Find actual thumbs index to slide to\n          var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll((\"[data-swiper-slide-index=\\\"\" + (swiper.realIndex) + \"\\\"]\")).eq(0).index();\n          var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll((\"[data-swiper-slide-index=\\\"\" + (swiper.realIndex) + \"\\\"]\")).eq(0).index();\n          if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }\n          else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }\n          else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }\n          else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }\n          else { newThumbsIndex = prevThumbsIndex; }\n        } else {\n          newThumbsIndex = swiper.realIndex;\n        }\n        if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {\n          if (thumbsSwiper.params.centeredSlides) {\n            if (newThumbsIndex > currentThumbsIndex) {\n              newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n            } else {\n              newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n            }\n          } else if (newThumbsIndex > currentThumbsIndex) {\n            newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n          }\n          thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n        }\n      }\n\n      // Activate thumbs\n      var thumbsToActivate = 1;\n      var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n      if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n        thumbsToActivate = swiper.params.slidesPerView;\n      }\n\n      thumbsSwiper.slides.removeClass(thumbActiveClass);\n      if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual) {\n        for (var i = 0; i < thumbsToActivate; i += 1) {\n          thumbsSwiper.$wrapperEl.children((\"[data-swiper-slide-index=\\\"\" + (swiper.realIndex + i) + \"\\\"]\")).addClass(thumbActiveClass);\n        }\n      } else {\n        for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {\n          thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);\n        }\n      }\n    },\n  };\n  var Thumbs$1 = {\n    name: 'thumbs',\n    params: {\n      thumbs: {\n        swiper: null,\n        slideThumbActiveClass: 'swiper-slide-thumb-active',\n        thumbsContainerClass: 'swiper-container-thumbs',\n      },\n    },\n    create: function create() {\n      var swiper = this;\n      Utils.extend(swiper, {\n        thumbs: {\n          swiper: null,\n          init: Thumbs.init.bind(swiper),\n          update: Thumbs.update.bind(swiper),\n          onThumbClick: Thumbs.onThumbClick.bind(swiper),\n        },\n      });\n    },\n    on: {\n      beforeInit: function beforeInit() {\n        var swiper = this;\n        var ref = swiper.params;\n        var thumbs = ref.thumbs;\n        if (!thumbs || !thumbs.swiper) { return; }\n        swiper.thumbs.init();\n        swiper.thumbs.update(true);\n      },\n      slideChange: function slideChange() {\n        var swiper = this;\n        if (!swiper.thumbs.swiper) { return; }\n        swiper.thumbs.update();\n      },\n      update: function update() {\n        var swiper = this;\n        if (!swiper.thumbs.swiper) { return; }\n        swiper.thumbs.update();\n      },\n      resize: function resize() {\n        var swiper = this;\n        if (!swiper.thumbs.swiper) { return; }\n        swiper.thumbs.update();\n      },\n      observerUpdate: function observerUpdate() {\n        var swiper = this;\n        if (!swiper.thumbs.swiper) { return; }\n        swiper.thumbs.update();\n      },\n      setTransition: function setTransition(duration) {\n        var swiper = this;\n        var thumbsSwiper = swiper.thumbs.swiper;\n        if (!thumbsSwiper) { return; }\n        thumbsSwiper.setTransition(duration);\n      },\n      beforeDestroy: function beforeDestroy() {\n        var swiper = this;\n        var thumbsSwiper = swiper.thumbs.swiper;\n        if (!thumbsSwiper) { return; }\n        if (swiper.thumbs.swiperCreated && thumbsSwiper) {\n          thumbsSwiper.destroy();\n        }\n      },\n    },\n  };\n\n  // Swiper Class\n\n  var components = [\n    Device$1,\n    Support$1,\n    Browser$1,\n    Resize,\n    Observer$1,\n    Virtual$1,\n    Keyboard$1,\n    Mousewheel$1,\n    Navigation$1,\n    Pagination$1,\n    Scrollbar$1,\n    Parallax$1,\n    Zoom$1,\n    Lazy$1,\n    Controller$1,\n    A11y,\n    History$1,\n    HashNavigation$1,\n    Autoplay$1,\n    EffectFade,\n    EffectCube,\n    EffectFlip,\n    EffectCoverflow,\n    Thumbs$1\n  ];\n\n  if (typeof Swiper.use === 'undefined') {\n    Swiper.use = Swiper.Class.use;\n    Swiper.installModule = Swiper.Class.installModule;\n  }\n\n  Swiper.use(components);\n\n  return Swiper;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3N3aXBlckA0LjUuMUBzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3N3aXBlckA0LjUuMUBzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanM/YzAwNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN3aXBlciA0LjUuMVxuICogTW9zdCBtb2Rlcm4gbW9iaWxlIHRvdWNoIHNsaWRlciBhbmQgZnJhbWV3b3JrIHdpdGggaGFyZHdhcmUgYWNjZWxlcmF0ZWQgdHJhbnNpdGlvbnNcbiAqIGh0dHA6Ly93d3cuaWRhbmdlcm8udXMvc3dpcGVyL1xuICpcbiAqIENvcHlyaWdodCAyMDE0LTIwMTkgVmxhZGltaXIgS2hhcmxhbXBpZGlcbiAqXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqXG4gKiBSZWxlYXNlZCBvbjogU2VwdGVtYmVyIDEzLCAyMDE5XG4gKi9cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Td2lwZXIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogU1NSIFdpbmRvdyAxLjAuMVxuICAgKiBCZXR0ZXIgaGFuZGxpbmcgZm9yIHdpbmRvdyBvYmplY3QgaW4gU1NSIGVudmlyb25tZW50XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2xpbWl0czR3ZWIvc3NyLXdpbmRvd1xuICAgKlxuICAgKiBDb3B5cmlnaHQgMjAxOCwgVmxhZGltaXIgS2hhcmxhbXBpZGlcbiAgICpcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUXG4gICAqXG4gICAqIFJlbGVhc2VkIG9uOiBKdWx5IDE4LCAyMDE4XG4gICAqL1xuICB2YXIgZG9jID0gKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpID8ge1xuICAgIGJvZHk6IHt9LFxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoKSB7fSxcbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKCkge30sXG4gICAgYWN0aXZlRWxlbWVudDoge1xuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHt9LFxuICAgICAgbm9kZU5hbWU6ICcnLFxuICAgIH0sXG4gICAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24gcXVlcnlTZWxlY3RvcigpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbCgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuICAgIGdldEVsZW1lbnRCeUlkOiBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgY3JlYXRlRXZlbnQ6IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5pdEV2ZW50OiBmdW5jdGlvbiBpbml0RXZlbnQoKSB7fSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgc3R5bGU6IHt9LFxuICAgICAgICBzZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZSgpIHt9LFxuICAgICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZTogZnVuY3Rpb24gZ2V0RWxlbWVudHNCeVRhZ05hbWUoKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICAgIGxvY2F0aW9uOiB7IGhhc2g6ICcnIH0sXG4gIH0gOiBkb2N1bWVudDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gIHZhciB3aW4gPSAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpID8ge1xuICAgIGRvY3VtZW50OiBkb2MsXG4gICAgbmF2aWdhdG9yOiB7XG4gICAgICB1c2VyQWdlbnQ6ICcnLFxuICAgIH0sXG4gICAgbG9jYXRpb246IHt9LFxuICAgIGhpc3Rvcnk6IHt9LFxuICAgIEN1c3RvbUV2ZW50OiBmdW5jdGlvbiBDdXN0b21FdmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcigpIHt9LFxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoKSB7fSxcbiAgICBnZXRDb21wdXRlZFN0eWxlOiBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0UHJvcGVydHlWYWx1ZTogZnVuY3Rpb24gZ2V0UHJvcGVydHlWYWx1ZSgpIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gICAgSW1hZ2U6IGZ1bmN0aW9uIEltYWdlKCkge30sXG4gICAgRGF0ZTogZnVuY3Rpb24gRGF0ZSgpIHt9LFxuICAgIHNjcmVlbjoge30sXG4gICAgc2V0VGltZW91dDogZnVuY3Rpb24gc2V0VGltZW91dCgpIHt9LFxuICAgIGNsZWFyVGltZW91dDogZnVuY3Rpb24gY2xlYXJUaW1lb3V0KCkge30sXG4gIH0gOiB3aW5kb3c7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAvKipcbiAgICogRG9tNyAyLjEuM1xuICAgKiBNaW5pbWFsaXN0aWMgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBET00gbWFuaXB1bGF0aW9uLCB3aXRoIGEgalF1ZXJ5LWNvbXBhdGlibGUgQVBJXG4gICAqIGh0dHA6Ly9mcmFtZXdvcms3LmlvL2RvY3MvZG9tLmh0bWxcbiAgICpcbiAgICogQ29weXJpZ2h0IDIwMTksIFZsYWRpbWlyIEtoYXJsYW1waWRpXG4gICAqIFRoZSBpRGFuZ2Vyby51c1xuICAgKiBodHRwOi8vd3d3LmlkYW5nZXJvLnVzL1xuICAgKlxuICAgKiBMaWNlbnNlZCB1bmRlciBNSVRcbiAgICpcbiAgICogUmVsZWFzZWQgb246IEZlYnJ1YXJ5IDExLCAyMDE5XG4gICAqL1xuXG4gIHZhciBEb203ID0gZnVuY3Rpb24gRG9tNyhhcnIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gQ3JlYXRlIGFycmF5LWxpa2Ugb2JqZWN0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHNlbGZbaV0gPSBhcnJbaV07XG4gICAgfVxuICAgIHNlbGYubGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICAvLyBSZXR1cm4gY29sbGVjdGlvbiB3aXRoIG1ldGhvZHNcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBmdW5jdGlvbiAkKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICBpZiAoc2VsZWN0b3IgJiYgIWNvbnRleHQpIHtcbiAgICAgIGlmIChzZWxlY3RvciBpbnN0YW5jZW9mIERvbTcpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgLy8gU3RyaW5nXG4gICAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZWxzO1xuICAgICAgICB2YXIgdGVtcFBhcmVudDtcbiAgICAgICAgdmFyIGh0bWwgPSBzZWxlY3Rvci50cmltKCk7XG4gICAgICAgIGlmIChodG1sLmluZGV4T2YoJzwnKSA+PSAwICYmIGh0bWwuaW5kZXhPZignPicpID49IDApIHtcbiAgICAgICAgICB2YXIgdG9DcmVhdGUgPSAnZGl2JztcbiAgICAgICAgICBpZiAoaHRtbC5pbmRleE9mKCc8bGknKSA9PT0gMCkgeyB0b0NyZWF0ZSA9ICd1bCc7IH1cbiAgICAgICAgICBpZiAoaHRtbC5pbmRleE9mKCc8dHInKSA9PT0gMCkgeyB0b0NyZWF0ZSA9ICd0Ym9keSc7IH1cbiAgICAgICAgICBpZiAoaHRtbC5pbmRleE9mKCc8dGQnKSA9PT0gMCB8fCBodG1sLmluZGV4T2YoJzx0aCcpID09PSAwKSB7IHRvQ3JlYXRlID0gJ3RyJzsgfVxuICAgICAgICAgIGlmIChodG1sLmluZGV4T2YoJzx0Ym9keScpID09PSAwKSB7IHRvQ3JlYXRlID0gJ3RhYmxlJzsgfVxuICAgICAgICAgIGlmIChodG1sLmluZGV4T2YoJzxvcHRpb24nKSA9PT0gMCkgeyB0b0NyZWF0ZSA9ICdzZWxlY3QnOyB9XG4gICAgICAgICAgdGVtcFBhcmVudCA9IGRvYy5jcmVhdGVFbGVtZW50KHRvQ3JlYXRlKTtcbiAgICAgICAgICB0ZW1wUGFyZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlbXBQYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgYXJyLnB1c2godGVtcFBhcmVudC5jaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjb250ZXh0ICYmIHNlbGVjdG9yWzBdID09PSAnIycgJiYgIXNlbGVjdG9yLm1hdGNoKC9bIC48Pjp+XS8pKSB7XG4gICAgICAgICAgICAvLyBQdXJlIElEIHNlbGVjdG9yXG4gICAgICAgICAgICBlbHMgPSBbZG9jLmdldEVsZW1lbnRCeUlkKHNlbGVjdG9yLnRyaW0oKS5zcGxpdCgnIycpWzFdKV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyIHNlbGVjdG9yc1xuICAgICAgICAgICAgZWxzID0gKGNvbnRleHQgfHwgZG9jKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yLnRyaW0oKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChlbHNbaV0pIHsgYXJyLnB1c2goZWxzW2ldKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5ub2RlVHlwZSB8fCBzZWxlY3RvciA9PT0gd2luIHx8IHNlbGVjdG9yID09PSBkb2MpIHtcbiAgICAgICAgLy8gTm9kZS9lbGVtZW50XG4gICAgICAgIGFyci5wdXNoKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCAmJiBzZWxlY3RvclswXS5ub2RlVHlwZSkge1xuICAgICAgICAvLyBBcnJheSBvZiBlbGVtZW50cyBvciBpbnN0YW5jZSBvZiBEb21cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGVjdG9yLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgYXJyLnB1c2goc2VsZWN0b3JbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9tNyhhcnIpO1xuICB9XG5cbiAgJC5mbiA9IERvbTcucHJvdG90eXBlO1xuICAkLkNsYXNzID0gRG9tNztcbiAgJC5Eb203ID0gRG9tNztcblxuICBmdW5jdGlvbiB1bmlxdWUoYXJyKSB7XG4gICAgdmFyIHVuaXF1ZUFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICh1bmlxdWVBcnJheS5pbmRleE9mKGFycltpXSkgPT09IC0xKSB7IHVuaXF1ZUFycmF5LnB1c2goYXJyW2ldKTsgfVxuICAgIH1cbiAgICByZXR1cm4gdW5pcXVlQXJyYXk7XG4gIH1cblxuICAvLyBDbGFzc2VzIGFuZCBhdHRyaWJ1dGVzXG4gIGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzTmFtZSkge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBjbGFzc2VzID0gY2xhc3NOYW1lLnNwbGl0KCcgJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2pdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGhpc1tqXS5jbGFzc0xpc3QgIT09ICd1bmRlZmluZWQnKSB7IHRoaXNbal0uY2xhc3NMaXN0LmFkZChjbGFzc2VzW2ldKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc05hbWUpIHtcbiAgICB2YXIgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgnICcpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1tqXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHRoaXNbal0uY2xhc3NMaXN0ICE9PSAndW5kZWZpbmVkJykgeyB0aGlzW2pdLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3Nlc1tpXSk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gaGFzQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgaWYgKCF0aGlzWzBdKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiB0aGlzWzBdLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpO1xuICB9XG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzTmFtZSkge1xuICAgIHZhciBjbGFzc2VzID0gY2xhc3NOYW1lLnNwbGl0KCcgJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2pdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGhpc1tqXS5jbGFzc0xpc3QgIT09ICd1bmRlZmluZWQnKSB7IHRoaXNbal0uY2xhc3NMaXN0LnRvZ2dsZShjbGFzc2VzW2ldKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiBhdHRyKGF0dHJzLCB2YWx1ZSkge1xuICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhdHRycyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdldCBhdHRyXG4gICAgICBpZiAodGhpc1swXSkgeyByZXR1cm4gdGhpc1swXS5nZXRBdHRyaWJ1dGUoYXR0cnMpOyB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNldCBhdHRyc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKGFyZ3VtZW50cyQxLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAvLyBTdHJpbmdcbiAgICAgICAgdGhpc1tpXS5zZXRBdHRyaWJ1dGUoYXR0cnMsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9iamVjdFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgZm9yICh2YXIgYXR0ck5hbWUgaW4gYXR0cnMpIHtcbiAgICAgICAgICB0aGlzW2ldW2F0dHJOYW1lXSA9IGF0dHJzW2F0dHJOYW1lXTtcbiAgICAgICAgICB0aGlzW2ldLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0cnNbYXR0ck5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZnVuY3Rpb24gcmVtb3ZlQXR0cihhdHRyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB0aGlzW2ldLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gZGF0YShrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVsO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlbCA9IHRoaXNbMF07XG4gICAgICAvLyBHZXQgdmFsdWVcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBpZiAoZWwuZG9tN0VsZW1lbnREYXRhU3RvcmFnZSAmJiAoa2V5IGluIGVsLmRvbTdFbGVtZW50RGF0YVN0b3JhZ2UpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLmRvbTdFbGVtZW50RGF0YVN0b3JhZ2Vba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhS2V5ID0gZWwuZ2V0QXR0cmlidXRlKChcImRhdGEtXCIgKyBrZXkpKTtcbiAgICAgICAgaWYgKGRhdGFLZXkpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YUtleTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBTZXQgdmFsdWVcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGVsID0gdGhpc1tpXTtcbiAgICAgIGlmICghZWwuZG9tN0VsZW1lbnREYXRhU3RvcmFnZSkgeyBlbC5kb203RWxlbWVudERhdGFTdG9yYWdlID0ge307IH1cbiAgICAgIGVsLmRvbTdFbGVtZW50RGF0YVN0b3JhZ2Vba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyBUcmFuc2Zvcm1zXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBmdW5jdGlvbiB0cmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZWxTdHlsZSA9IHRoaXNbaV0uc3R5bGU7XG4gICAgICBlbFN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgIGVsU3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiB0cmFuc2l0aW9uKGR1cmF0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBkdXJhdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGR1cmF0aW9uID0gZHVyYXRpb24gKyBcIm1zXCI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZWxTdHlsZSA9IHRoaXNbaV0uc3R5bGU7XG4gICAgICBlbFN0eWxlLndlYmtpdFRyYW5zaXRpb25EdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgZWxTdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy8gRXZlbnRzXG4gIGZ1bmN0aW9uIG9uKCkge1xuICAgIHZhciBhc3NpZ247XG5cbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG4gICAgdmFyIGV2ZW50VHlwZSA9IGFyZ3NbMF07XG4gICAgdmFyIHRhcmdldFNlbGVjdG9yID0gYXJnc1sxXTtcbiAgICB2YXIgbGlzdGVuZXIgPSBhcmdzWzJdO1xuICAgIHZhciBjYXB0dXJlID0gYXJnc1szXTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIChhc3NpZ24gPSBhcmdzLCBldmVudFR5cGUgPSBhc3NpZ25bMF0sIGxpc3RlbmVyID0gYXNzaWduWzFdLCBjYXB0dXJlID0gYXNzaWduWzJdKTtcbiAgICAgIHRhcmdldFNlbGVjdG9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIWNhcHR1cmUpIHsgY2FwdHVyZSA9IGZhbHNlOyB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVMaXZlRXZlbnQoZSkge1xuICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgaWYgKCF0YXJnZXQpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgZXZlbnREYXRhID0gZS50YXJnZXQuZG9tN0V2ZW50RGF0YSB8fCBbXTtcbiAgICAgIGlmIChldmVudERhdGEuaW5kZXhPZihlKSA8IDApIHtcbiAgICAgICAgZXZlbnREYXRhLnVuc2hpZnQoZSk7XG4gICAgICB9XG4gICAgICBpZiAoJCh0YXJnZXQpLmlzKHRhcmdldFNlbGVjdG9yKSkgeyBsaXN0ZW5lci5hcHBseSh0YXJnZXQsIGV2ZW50RGF0YSk7IH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgcGFyZW50cyA9ICQodGFyZ2V0KS5wYXJlbnRzKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwYXJlbnRzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICAgICAgaWYgKCQocGFyZW50c1trXSkuaXModGFyZ2V0U2VsZWN0b3IpKSB7IGxpc3RlbmVyLmFwcGx5KHBhcmVudHNba10sIGV2ZW50RGF0YSk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoYW5kbGVFdmVudChlKSB7XG4gICAgICB2YXIgZXZlbnREYXRhID0gZSAmJiBlLnRhcmdldCA/IGUudGFyZ2V0LmRvbTdFdmVudERhdGEgfHwgW10gOiBbXTtcbiAgICAgIGlmIChldmVudERhdGEuaW5kZXhPZihlKSA8IDApIHtcbiAgICAgICAgZXZlbnREYXRhLnVuc2hpZnQoZSk7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBldmVudERhdGEpO1xuICAgIH1cbiAgICB2YXIgZXZlbnRzID0gZXZlbnRUeXBlLnNwbGl0KCcgJyk7XG4gICAgdmFyIGo7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzW2ldO1xuICAgICAgaWYgKCF0YXJnZXRTZWxlY3Rvcikge1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgZXZlbnRzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgdmFyIGV2ZW50ID0gZXZlbnRzW2pdO1xuICAgICAgICAgIGlmICghZWwuZG9tN0xpc3RlbmVycykgeyBlbC5kb203TGlzdGVuZXJzID0ge307IH1cbiAgICAgICAgICBpZiAoIWVsLmRvbTdMaXN0ZW5lcnNbZXZlbnRdKSB7IGVsLmRvbTdMaXN0ZW5lcnNbZXZlbnRdID0gW107IH1cbiAgICAgICAgICBlbC5kb203TGlzdGVuZXJzW2V2ZW50XS5wdXNoKHtcbiAgICAgICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICAgICAgICAgIHByb3h5TGlzdGVuZXI6IGhhbmRsZUV2ZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZUV2ZW50LCBjYXB0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTGl2ZSBldmVudHNcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGV2ZW50cy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgIHZhciBldmVudCQxID0gZXZlbnRzW2pdO1xuICAgICAgICAgIGlmICghZWwuZG9tN0xpdmVMaXN0ZW5lcnMpIHsgZWwuZG9tN0xpdmVMaXN0ZW5lcnMgPSB7fTsgfVxuICAgICAgICAgIGlmICghZWwuZG9tN0xpdmVMaXN0ZW5lcnNbZXZlbnQkMV0pIHsgZWwuZG9tN0xpdmVMaXN0ZW5lcnNbZXZlbnQkMV0gPSBbXTsgfVxuICAgICAgICAgIGVsLmRvbTdMaXZlTGlzdGVuZXJzW2V2ZW50JDFdLnB1c2goe1xuICAgICAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgICAgICAgICAgcHJveHlMaXN0ZW5lcjogaGFuZGxlTGl2ZUV2ZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQkMSwgaGFuZGxlTGl2ZUV2ZW50LCBjYXB0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiBvZmYoKSB7XG4gICAgdmFyIGFzc2lnbjtcblxuICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcbiAgICB2YXIgZXZlbnRUeXBlID0gYXJnc1swXTtcbiAgICB2YXIgdGFyZ2V0U2VsZWN0b3IgPSBhcmdzWzFdO1xuICAgIHZhciBsaXN0ZW5lciA9IGFyZ3NbMl07XG4gICAgdmFyIGNhcHR1cmUgPSBhcmdzWzNdO1xuICAgIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKGFzc2lnbiA9IGFyZ3MsIGV2ZW50VHlwZSA9IGFzc2lnblswXSwgbGlzdGVuZXIgPSBhc3NpZ25bMV0sIGNhcHR1cmUgPSBhc3NpZ25bMl0pO1xuICAgICAgdGFyZ2V0U2VsZWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghY2FwdHVyZSkgeyBjYXB0dXJlID0gZmFsc2U7IH1cblxuICAgIHZhciBldmVudHMgPSBldmVudFR5cGUuc3BsaXQoJyAnKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGV2ZW50ID0gZXZlbnRzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXNbal07XG4gICAgICAgIHZhciBoYW5kbGVycyA9ICh2b2lkIDApO1xuICAgICAgICBpZiAoIXRhcmdldFNlbGVjdG9yICYmIGVsLmRvbTdMaXN0ZW5lcnMpIHtcbiAgICAgICAgICBoYW5kbGVycyA9IGVsLmRvbTdMaXN0ZW5lcnNbZXZlbnRdO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldFNlbGVjdG9yICYmIGVsLmRvbTdMaXZlTGlzdGVuZXJzKSB7XG4gICAgICAgICAgaGFuZGxlcnMgPSBlbC5kb203TGl2ZUxpc3RlbmVyc1tldmVudF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAodmFyIGsgPSBoYW5kbGVycy5sZW5ndGggLSAxOyBrID49IDA7IGsgLT0gMSkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1trXTtcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lciAmJiBoYW5kbGVyLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLnByb3h5TGlzdGVuZXIsIGNhcHR1cmUpO1xuICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoaywgMSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RlbmVyICYmIGhhbmRsZXIubGlzdGVuZXIgJiYgaGFuZGxlci5saXN0ZW5lci5kb203cHJveHkgJiYgaGFuZGxlci5saXN0ZW5lci5kb203cHJveHkgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIucHJveHlMaXN0ZW5lciwgY2FwdHVyZSk7XG4gICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShrLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIucHJveHlMaXN0ZW5lciwgY2FwdHVyZSk7XG4gICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShrLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gdHJpZ2dlcigpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICB2YXIgZXZlbnRzID0gYXJnc1swXS5zcGxpdCgnICcpO1xuICAgIHZhciBldmVudERhdGEgPSBhcmdzWzFdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgZXZlbnQgPSBldmVudHNbaV07XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpc1tqXTtcbiAgICAgICAgdmFyIGV2dCA9ICh2b2lkIDApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGV2dCA9IG5ldyB3aW4uQ3VzdG9tRXZlbnQoZXZlbnQsIHtcbiAgICAgICAgICAgIGRldGFpbDogZXZlbnREYXRhLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBldnQgPSBkb2MuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICAgICAgZXZ0LmluaXRFdmVudChldmVudCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgZXZ0LmRldGFpbCA9IGV2ZW50RGF0YTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgZWwuZG9tN0V2ZW50RGF0YSA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uIChkYXRhLCBkYXRhSW5kZXgpIHsgcmV0dXJuIGRhdGFJbmRleCA+IDA7IH0pO1xuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgICAgIGVsLmRvbTdFdmVudERhdGEgPSBbXTtcbiAgICAgICAgZGVsZXRlIGVsLmRvbTdFdmVudERhdGE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoY2FsbGJhY2spIHtcbiAgICB2YXIgZXZlbnRzID0gWyd3ZWJraXRUcmFuc2l0aW9uRW5kJywgJ3RyYW5zaXRpb25lbmQnXTtcbiAgICB2YXIgZG9tID0gdGhpcztcbiAgICB2YXIgaTtcbiAgICBmdW5jdGlvbiBmaXJlQ2FsbEJhY2soZSkge1xuICAgICAgLyoganNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHsgcmV0dXJuOyB9XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGUpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBkb20ub2ZmKGV2ZW50c1tpXSwgZmlyZUNhbGxCYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGRvbS5vbihldmVudHNbaV0sIGZpcmVDYWxsQmFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIG91dGVyV2lkdGgoaW5jbHVkZU1hcmdpbnMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoaW5jbHVkZU1hcmdpbnMpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHZhciBzdHlsZXMgPSB0aGlzLnN0eWxlcygpO1xuICAgICAgICByZXR1cm4gdGhpc1swXS5vZmZzZXRXaWR0aCArIHBhcnNlRmxvYXQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1yaWdodCcpKSArIHBhcnNlRmxvYXQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1sZWZ0JykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNbMF0ub2Zmc2V0V2lkdGg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIG91dGVySGVpZ2h0KGluY2x1ZGVNYXJnaW5zKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGluY2x1ZGVNYXJnaW5zKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB2YXIgc3R5bGVzID0gdGhpcy5zdHlsZXMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXNbMF0ub2Zmc2V0SGVpZ2h0ICsgcGFyc2VGbG9hdChzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLXRvcCcpKSArIHBhcnNlRmxvYXQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1ib3R0b20nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1swXS5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzWzBdO1xuICAgICAgdmFyIGJveCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgICAgIHZhciBjbGllbnRUb3AgPSBlbC5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMDtcbiAgICAgIHZhciBjbGllbnRMZWZ0ID0gZWwuY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcbiAgICAgIHZhciBzY3JvbGxUb3AgPSBlbCA9PT0gd2luID8gd2luLnNjcm9sbFkgOiBlbC5zY3JvbGxUb3A7XG4gICAgICB2YXIgc2Nyb2xsTGVmdCA9IGVsID09PSB3aW4gPyB3aW4uc2Nyb2xsWCA6IGVsLnNjcm9sbExlZnQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b3A6IChib3gudG9wICsgc2Nyb2xsVG9wKSAtIGNsaWVudFRvcCxcbiAgICAgICAgbGVmdDogKGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCkgLSBjbGllbnRMZWZ0LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBzdHlsZXMoKSB7XG4gICAgaWYgKHRoaXNbMF0pIHsgcmV0dXJuIHdpbi5nZXRDb21wdXRlZFN0eWxlKHRoaXNbMF0sIG51bGwpOyB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGZ1bmN0aW9uIGNzcyhwcm9wcywgdmFsdWUpIHtcbiAgICB2YXIgaTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRoaXNbMF0pIHsgcmV0dXJuIHdpbi5nZXRDb21wdXRlZFN0eWxlKHRoaXNbMF0sIG51bGwpLmdldFByb3BlcnR5VmFsdWUocHJvcHMpOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXNbaV0uc3R5bGVbcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBwcm9wcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHRoaXNbaV0uc3R5bGVbcHJvcHNdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBjb2xsZWN0aW9uIHBhc3NpbmcgZWxlbWVudHMgdG8gYGNhbGxiYWNrYFxuICBmdW5jdGlvbiBlYWNoKGNhbGxiYWNrKSB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbnRpbnVpbmcgd2l0aG91dCBhIGNhbGxiYWNrXG4gICAgaWYgKCFjYWxsYmFjaykgeyByZXR1cm4gdGhpczsgfVxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgY3VycmVudCBjb2xsZWN0aW9uXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAvLyBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpc1tpXSwgaSwgdGhpc1tpXSkgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIEVuZCB0aGUgbG9vcCBlYXJseVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmV0dXJuIGB0aGlzYCB0byBhbGxvdyBjaGFpbmVkIERPTSBvcGVyYXRpb25zXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGZ1bmN0aW9uIGh0bWwoaHRtbCkge1xuICAgIGlmICh0eXBlb2YgaHRtbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzWzBdID8gdGhpc1swXS5pbm5lckhUTUwgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB0aGlzW2ldLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBmdW5jdGlvbiB0ZXh0KHRleHQpIHtcbiAgICBpZiAodHlwZW9mIHRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpc1swXSkge1xuICAgICAgICByZXR1cm4gdGhpc1swXS50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHRoaXNbaV0udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmdW5jdGlvbiBpcyhzZWxlY3Rvcikge1xuICAgIHZhciBlbCA9IHRoaXNbMF07XG4gICAgdmFyIGNvbXBhcmVXaXRoO1xuICAgIHZhciBpO1xuICAgIGlmICghZWwgfHwgdHlwZW9mIHNlbGVjdG9yID09PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGVsLm1hdGNoZXMpIHsgcmV0dXJuIGVsLm1hdGNoZXMoc2VsZWN0b3IpOyB9XG4gICAgICBlbHNlIGlmIChlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3IpIHsgcmV0dXJuIGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7IH1cbiAgICAgIGVsc2UgaWYgKGVsLm1zTWF0Y2hlc1NlbGVjdG9yKSB7IHJldHVybiBlbC5tc01hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7IH1cblxuICAgICAgY29tcGFyZVdpdGggPSAkKHNlbGVjdG9yKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wYXJlV2l0aC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoY29tcGFyZVdpdGhbaV0gPT09IGVsKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gZG9jKSB7IHJldHVybiBlbCA9PT0gZG9jOyB9XG4gICAgZWxzZSBpZiAoc2VsZWN0b3IgPT09IHdpbikgeyByZXR1cm4gZWwgPT09IHdpbjsgfVxuXG4gICAgaWYgKHNlbGVjdG9yLm5vZGVUeXBlIHx8IHNlbGVjdG9yIGluc3RhbmNlb2YgRG9tNykge1xuICAgICAgY29tcGFyZVdpdGggPSBzZWxlY3Rvci5ub2RlVHlwZSA/IFtzZWxlY3Rvcl0gOiBzZWxlY3RvcjtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wYXJlV2l0aC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoY29tcGFyZVdpdGhbaV0gPT09IGVsKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmdW5jdGlvbiBpbmRleCgpIHtcbiAgICB2YXIgY2hpbGQgPSB0aGlzWzBdO1xuICAgIHZhciBpO1xuICAgIGlmIChjaGlsZCkge1xuICAgICAgaSA9IDA7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIHdoaWxlICgoY2hpbGQgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkgeyBpICs9IDE7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBmdW5jdGlvbiBlcShpbmRleCkge1xuICAgIGlmICh0eXBlb2YgaW5kZXggPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiB0aGlzOyB9XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIHZhciByZXR1cm5JbmRleDtcbiAgICBpZiAoaW5kZXggPiBsZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gbmV3IERvbTcoW10pO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm5JbmRleCA9IGxlbmd0aCArIGluZGV4O1xuICAgICAgaWYgKHJldHVybkluZGV4IDwgMCkgeyByZXR1cm4gbmV3IERvbTcoW10pOyB9XG4gICAgICByZXR1cm4gbmV3IERvbTcoW3RoaXNbcmV0dXJuSW5kZXhdXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9tNyhbdGhpc1tpbmRleF1dKTtcbiAgfVxuICBmdW5jdGlvbiBhcHBlbmQoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgdmFyIG5ld0NoaWxkO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBhcmdzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICBuZXdDaGlsZCA9IGFyZ3Nba107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YXIgdGVtcERpdiA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICB0ZW1wRGl2LmlubmVySFRNTCA9IG5ld0NoaWxkO1xuICAgICAgICAgIHdoaWxlICh0ZW1wRGl2LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXNbaV0uYXBwZW5kQ2hpbGQodGVtcERpdi5maXJzdENoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3Q2hpbGQgaW5zdGFuY2VvZiBEb203KSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuZXdDaGlsZC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgdGhpc1tpXS5hcHBlbmRDaGlsZChuZXdDaGlsZFtqXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXNbaV0uYXBwZW5kQ2hpbGQobmV3Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gcHJlcGVuZChuZXdDaGlsZCkge1xuICAgIHZhciBpO1xuICAgIHZhciBqO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdGVtcERpdiA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBuZXdDaGlsZDtcbiAgICAgICAgZm9yIChqID0gdGVtcERpdi5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGogPj0gMDsgaiAtPSAxKSB7XG4gICAgICAgICAgdGhpc1tpXS5pbnNlcnRCZWZvcmUodGVtcERpdi5jaGlsZE5vZGVzW2pdLCB0aGlzW2ldLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgRG9tNykge1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmV3Q2hpbGQubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICB0aGlzW2ldLmluc2VydEJlZm9yZShuZXdDaGlsZFtqXSwgdGhpc1tpXS5jaGlsZE5vZGVzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tpXS5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHRoaXNbaV0uY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQoc2VsZWN0b3IpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgaWYgKHRoaXNbMF0ubmV4dEVsZW1lbnRTaWJsaW5nICYmICQodGhpc1swXS5uZXh0RWxlbWVudFNpYmxpbmcpLmlzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRG9tNyhbdGhpc1swXS5uZXh0RWxlbWVudFNpYmxpbmddKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERvbTcoW10pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1swXS5uZXh0RWxlbWVudFNpYmxpbmcpIHsgcmV0dXJuIG5ldyBEb203KFt0aGlzWzBdLm5leHRFbGVtZW50U2libGluZ10pOyB9XG4gICAgICByZXR1cm4gbmV3IERvbTcoW10pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERvbTcoW10pO1xuICB9XG4gIGZ1bmN0aW9uIG5leHRBbGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgbmV4dEVscyA9IFtdO1xuICAgIHZhciBlbCA9IHRoaXNbMF07XG4gICAgaWYgKCFlbCkgeyByZXR1cm4gbmV3IERvbTcoW10pOyB9XG4gICAgd2hpbGUgKGVsLm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgdmFyIG5leHQgPSBlbC5uZXh0RWxlbWVudFNpYmxpbmc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICBpZiAoJChuZXh0KS5pcyhzZWxlY3RvcikpIHsgbmV4dEVscy5wdXNoKG5leHQpOyB9XG4gICAgICB9IGVsc2UgeyBuZXh0RWxzLnB1c2gobmV4dCk7IH1cbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEb203KG5leHRFbHMpO1xuICB9XG4gIGZ1bmN0aW9uIHByZXYoc2VsZWN0b3IpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzWzBdO1xuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIGlmIChlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmICQoZWwucHJldmlvdXNFbGVtZW50U2libGluZykuaXMoc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEb203KFtlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEb203KFtdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHsgcmV0dXJuIG5ldyBEb203KFtlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXSk7IH1cbiAgICAgIHJldHVybiBuZXcgRG9tNyhbXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9tNyhbXSk7XG4gIH1cbiAgZnVuY3Rpb24gcHJldkFsbChzZWxlY3Rvcikge1xuICAgIHZhciBwcmV2RWxzID0gW107XG4gICAgdmFyIGVsID0gdGhpc1swXTtcbiAgICBpZiAoIWVsKSB7IHJldHVybiBuZXcgRG9tNyhbXSk7IH1cbiAgICB3aGlsZSAoZWwucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgICAgdmFyIHByZXYgPSBlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgaWYgKCQocHJldikuaXMoc2VsZWN0b3IpKSB7IHByZXZFbHMucHVzaChwcmV2KTsgfVxuICAgICAgfSBlbHNlIHsgcHJldkVscy5wdXNoKHByZXYpOyB9XG4gICAgICBlbCA9IHByZXY7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9tNyhwcmV2RWxzKTtcbiAgfVxuICBmdW5jdGlvbiBwYXJlbnQoc2VsZWN0b3IpIHtcbiAgICB2YXIgcGFyZW50cyA9IFtdOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodGhpc1tpXS5wYXJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgIGlmICgkKHRoaXNbaV0ucGFyZW50Tm9kZSkuaXMoc2VsZWN0b3IpKSB7IHBhcmVudHMucHVzaCh0aGlzW2ldLnBhcmVudE5vZGUpOyB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50cy5wdXNoKHRoaXNbaV0ucGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICQodW5pcXVlKHBhcmVudHMpKTtcbiAgfVxuICBmdW5jdGlvbiBwYXJlbnRzKHNlbGVjdG9yKSB7XG4gICAgdmFyIHBhcmVudHMgPSBbXTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXNbaV0ucGFyZW50Tm9kZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICBpZiAoJChwYXJlbnQpLmlzKHNlbGVjdG9yKSkgeyBwYXJlbnRzLnB1c2gocGFyZW50KTsgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudHMucHVzaChwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJCh1bmlxdWUocGFyZW50cykpO1xuICB9XG4gIGZ1bmN0aW9uIGNsb3Nlc3Qoc2VsZWN0b3IpIHtcbiAgICB2YXIgY2xvc2VzdCA9IHRoaXM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBEb203KFtdKTtcbiAgICB9XG4gICAgaWYgKCFjbG9zZXN0LmlzKHNlbGVjdG9yKSkge1xuICAgICAgY2xvc2VzdCA9IGNsb3Nlc3QucGFyZW50cyhzZWxlY3RvcikuZXEoMCk7XG4gICAgfVxuICAgIHJldHVybiBjbG9zZXN0O1xuICB9XG4gIGZ1bmN0aW9uIGZpbmQoc2VsZWN0b3IpIHtcbiAgICB2YXIgZm91bmRFbGVtZW50cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpc1tpXS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZm91bmQubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgZm91bmRFbGVtZW50cy5wdXNoKGZvdW5kW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEb203KGZvdW5kRWxlbWVudHMpO1xuICB9XG4gIGZ1bmN0aW9uIGNoaWxkcmVuKHNlbGVjdG9yKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gW107IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gdGhpc1tpXS5jaGlsZE5vZGVzO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNoaWxkTm9kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2pdLm5vZGVUeXBlID09PSAxKSB7IGNoaWxkcmVuLnB1c2goY2hpbGROb2Rlc1tqXSk7IH1cbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZE5vZGVzW2pdLm5vZGVUeXBlID09PSAxICYmICQoY2hpbGROb2Rlc1tqXSkuaXMoc2VsZWN0b3IpKSB7XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZE5vZGVzW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IERvbTcodW5pcXVlKGNoaWxkcmVuKSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKHRoaXNbaV0ucGFyZW50Tm9kZSkgeyB0aGlzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpc1tpXSk7IH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gYWRkKCkge1xuICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgIHZhciBkb20gPSB0aGlzO1xuICAgIHZhciBpO1xuICAgIHZhciBqO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgdG9BZGQgPSAkKGFyZ3NbaV0pO1xuICAgICAgZm9yIChqID0gMDsgaiA8IHRvQWRkLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGRvbVtkb20ubGVuZ3RoXSA9IHRvQWRkW2pdO1xuICAgICAgICBkb20ubGVuZ3RoICs9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkb207XG4gIH1cblxuICB2YXIgTWV0aG9kcyA9IHtcbiAgICBhZGRDbGFzczogYWRkQ2xhc3MsXG4gICAgcmVtb3ZlQ2xhc3M6IHJlbW92ZUNsYXNzLFxuICAgIGhhc0NsYXNzOiBoYXNDbGFzcyxcbiAgICB0b2dnbGVDbGFzczogdG9nZ2xlQ2xhc3MsXG4gICAgYXR0cjogYXR0cixcbiAgICByZW1vdmVBdHRyOiByZW1vdmVBdHRyLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbixcbiAgICBvbjogb24sXG4gICAgb2ZmOiBvZmYsXG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcbiAgICB0cmFuc2l0aW9uRW5kOiB0cmFuc2l0aW9uRW5kLFxuICAgIG91dGVyV2lkdGg6IG91dGVyV2lkdGgsXG4gICAgb3V0ZXJIZWlnaHQ6IG91dGVySGVpZ2h0LFxuICAgIG9mZnNldDogb2Zmc2V0LFxuICAgIGNzczogY3NzLFxuICAgIGVhY2g6IGVhY2gsXG4gICAgaHRtbDogaHRtbCxcbiAgICB0ZXh0OiB0ZXh0LFxuICAgIGlzOiBpcyxcbiAgICBpbmRleDogaW5kZXgsXG4gICAgZXE6IGVxLFxuICAgIGFwcGVuZDogYXBwZW5kLFxuICAgIHByZXBlbmQ6IHByZXBlbmQsXG4gICAgbmV4dDogbmV4dCxcbiAgICBuZXh0QWxsOiBuZXh0QWxsLFxuICAgIHByZXY6IHByZXYsXG4gICAgcHJldkFsbDogcHJldkFsbCxcbiAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICBwYXJlbnRzOiBwYXJlbnRzLFxuICAgIGNsb3Nlc3Q6IGNsb3Nlc3QsXG4gICAgZmluZDogZmluZCxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgcmVtb3ZlOiByZW1vdmUsXG4gICAgYWRkOiBhZGQsXG4gICAgc3R5bGVzOiBzdHlsZXMsXG4gIH07XG5cbiAgT2JqZWN0LmtleXMoTWV0aG9kcykuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xuICAgICQuZm5bbWV0aG9kTmFtZV0gPSAkLmZuW21ldGhvZE5hbWVdIHx8IE1ldGhvZHNbbWV0aG9kTmFtZV07XG4gIH0pO1xuXG4gIHZhciBVdGlscyA9IHtcbiAgICBkZWxldGVQcm9wczogZnVuY3Rpb24gZGVsZXRlUHJvcHMob2JqKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gb2JqO1xuICAgICAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvYmplY3Rba2V5XSA9IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBubyBnZXR0ZXIgZm9yIG9iamVjdFxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVsZXRlIG9iamVjdFtrZXldO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gc29tZXRoaW5nIGdvdCB3cm9uZ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIG5leHRUaWNrOiBmdW5jdGlvbiBuZXh0VGljayhjYWxsYmFjaywgZGVsYXkpIHtcbiAgICAgIGlmICggZGVsYXkgPT09IHZvaWQgMCApIGRlbGF5ID0gMDtcblxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5KTtcbiAgICB9LFxuICAgIG5vdzogZnVuY3Rpb24gbm93KCkge1xuICAgICAgcmV0dXJuIERhdGUubm93KCk7XG4gICAgfSxcbiAgICBnZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIGdldFRyYW5zbGF0ZShlbCwgYXhpcykge1xuICAgICAgaWYgKCBheGlzID09PSB2b2lkIDAgKSBheGlzID0gJ3gnO1xuXG4gICAgICB2YXIgbWF0cml4O1xuICAgICAgdmFyIGN1clRyYW5zZm9ybTtcbiAgICAgIHZhciB0cmFuc2Zvcm1NYXRyaXg7XG5cbiAgICAgIHZhciBjdXJTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTtcblxuICAgICAgaWYgKHdpbi5XZWJLaXRDU1NNYXRyaXgpIHtcbiAgICAgICAgY3VyVHJhbnNmb3JtID0gY3VyU3R5bGUudHJhbnNmb3JtIHx8IGN1clN0eWxlLndlYmtpdFRyYW5zZm9ybTtcbiAgICAgICAgaWYgKGN1clRyYW5zZm9ybS5zcGxpdCgnLCcpLmxlbmd0aCA+IDYpIHtcbiAgICAgICAgICBjdXJUcmFuc2Zvcm0gPSBjdXJUcmFuc2Zvcm0uc3BsaXQoJywgJykubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLnJlcGxhY2UoJywnLCAnLicpOyB9KS5qb2luKCcsICcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvbWUgb2xkIHZlcnNpb25zIG9mIFdlYmtpdCBjaG9rZSB3aGVuICdub25lJyBpcyBwYXNzZWQ7IHBhc3NcbiAgICAgICAgLy8gZW1wdHkgc3RyaW5nIGluc3RlYWQgaW4gdGhpcyBjYXNlXG4gICAgICAgIHRyYW5zZm9ybU1hdHJpeCA9IG5ldyB3aW4uV2ViS2l0Q1NTTWF0cml4KGN1clRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBjdXJUcmFuc2Zvcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNmb3JtTWF0cml4ID0gY3VyU3R5bGUuTW96VHJhbnNmb3JtIHx8IGN1clN0eWxlLk9UcmFuc2Zvcm0gfHwgY3VyU3R5bGUuTXNUcmFuc2Zvcm0gfHwgY3VyU3R5bGUubXNUcmFuc2Zvcm0gfHwgY3VyU3R5bGUudHJhbnNmb3JtIHx8IGN1clN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3RyYW5zZm9ybScpLnJlcGxhY2UoJ3RyYW5zbGF0ZSgnLCAnbWF0cml4KDEsIDAsIDAsIDEsJyk7XG4gICAgICAgIG1hdHJpeCA9IHRyYW5zZm9ybU1hdHJpeC50b1N0cmluZygpLnNwbGl0KCcsJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChheGlzID09PSAneCcpIHtcbiAgICAgICAgLy8gTGF0ZXN0IENocm9tZSBhbmQgd2Via2l0cyBGaXhcbiAgICAgICAgaWYgKHdpbi5XZWJLaXRDU1NNYXRyaXgpIHsgY3VyVHJhbnNmb3JtID0gdHJhbnNmb3JtTWF0cml4Lm00MTsgfVxuICAgICAgICAvLyBDcmF6eSBJRTEwIE1hdHJpeFxuICAgICAgICBlbHNlIGlmIChtYXRyaXgubGVuZ3RoID09PSAxNikgeyBjdXJUcmFuc2Zvcm0gPSBwYXJzZUZsb2F0KG1hdHJpeFsxMl0pOyB9XG4gICAgICAgIC8vIE5vcm1hbCBCcm93c2Vyc1xuICAgICAgICBlbHNlIHsgY3VyVHJhbnNmb3JtID0gcGFyc2VGbG9hdChtYXRyaXhbNF0pOyB9XG4gICAgICB9XG4gICAgICBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgICAgIC8vIExhdGVzdCBDaHJvbWUgYW5kIHdlYmtpdHMgRml4XG4gICAgICAgIGlmICh3aW4uV2ViS2l0Q1NTTWF0cml4KSB7IGN1clRyYW5zZm9ybSA9IHRyYW5zZm9ybU1hdHJpeC5tNDI7IH1cbiAgICAgICAgLy8gQ3JhenkgSUUxMCBNYXRyaXhcbiAgICAgICAgZWxzZSBpZiAobWF0cml4Lmxlbmd0aCA9PT0gMTYpIHsgY3VyVHJhbnNmb3JtID0gcGFyc2VGbG9hdChtYXRyaXhbMTNdKTsgfVxuICAgICAgICAvLyBOb3JtYWwgQnJvd3NlcnNcbiAgICAgICAgZWxzZSB7IGN1clRyYW5zZm9ybSA9IHBhcnNlRmxvYXQobWF0cml4WzVdKTsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGN1clRyYW5zZm9ybSB8fCAwO1xuICAgIH0sXG4gICAgcGFyc2VVcmxRdWVyeTogZnVuY3Rpb24gcGFyc2VVcmxRdWVyeSh1cmwpIHtcbiAgICAgIHZhciBxdWVyeSA9IHt9O1xuICAgICAgdmFyIHVybFRvUGFyc2UgPSB1cmwgfHwgd2luLmxvY2F0aW9uLmhyZWY7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBwYXJhbXM7XG4gICAgICB2YXIgcGFyYW07XG4gICAgICB2YXIgbGVuZ3RoO1xuICAgICAgaWYgKHR5cGVvZiB1cmxUb1BhcnNlID09PSAnc3RyaW5nJyAmJiB1cmxUb1BhcnNlLmxlbmd0aCkge1xuICAgICAgICB1cmxUb1BhcnNlID0gdXJsVG9QYXJzZS5pbmRleE9mKCc/JykgPiAtMSA/IHVybFRvUGFyc2UucmVwbGFjZSgvXFxTKlxcPy8sICcnKSA6ICcnO1xuICAgICAgICBwYXJhbXMgPSB1cmxUb1BhcnNlLnNwbGl0KCcmJykuZmlsdGVyKGZ1bmN0aW9uIChwYXJhbXNQYXJ0KSB7IHJldHVybiBwYXJhbXNQYXJ0ICE9PSAnJzsgfSk7XG4gICAgICAgIGxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgcGFyYW0gPSBwYXJhbXNbaV0ucmVwbGFjZSgvI1xcUysvZywgJycpLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgcXVlcnlbZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtWzBdKV0gPSB0eXBlb2YgcGFyYW1bMV0gPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtWzFdKSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH0sXG4gICAgaXNPYmplY3Q6IGZ1bmN0aW9uIGlzT2JqZWN0KG8pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgbyAhPT0gbnVsbCAmJiBvLmNvbnN0cnVjdG9yICYmIG8uY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICB9LFxuICAgIGV4dGVuZDogZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuJDEgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4kMS0tICkgYXJnc1sgbGVuJDEgXSA9IGFyZ3VtZW50c1sgbGVuJDEgXTtcblxuICAgICAgdmFyIHRvID0gT2JqZWN0KGFyZ3NbMF0pO1xuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBuZXh0U291cmNlID0gYXJnc1tpXTtcbiAgICAgICAgaWYgKG5leHRTb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBuZXh0U291cmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGtleXNBcnJheSA9IE9iamVjdC5rZXlzKE9iamVjdChuZXh0U291cmNlKSk7XG4gICAgICAgICAgZm9yICh2YXIgbmV4dEluZGV4ID0gMCwgbGVuID0ga2V5c0FycmF5Lmxlbmd0aDsgbmV4dEluZGV4IDwgbGVuOyBuZXh0SW5kZXggKz0gMSkge1xuICAgICAgICAgICAgdmFyIG5leHRLZXkgPSBrZXlzQXJyYXlbbmV4dEluZGV4XTtcbiAgICAgICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuZXh0U291cmNlLCBuZXh0S2V5KTtcbiAgICAgICAgICAgIGlmIChkZXNjICE9PSB1bmRlZmluZWQgJiYgZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgICAgICAgICAgIGlmIChVdGlscy5pc09iamVjdCh0b1tuZXh0S2V5XSkgJiYgVXRpbHMuaXNPYmplY3QobmV4dFNvdXJjZVtuZXh0S2V5XSkpIHtcbiAgICAgICAgICAgICAgICBVdGlscy5leHRlbmQodG9bbmV4dEtleV0sIG5leHRTb3VyY2VbbmV4dEtleV0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFVdGlscy5pc09iamVjdCh0b1tuZXh0S2V5XSkgJiYgVXRpbHMuaXNPYmplY3QobmV4dFNvdXJjZVtuZXh0S2V5XSkpIHtcbiAgICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIFV0aWxzLmV4dGVuZCh0b1tuZXh0S2V5XSwgbmV4dFNvdXJjZVtuZXh0S2V5XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdG87XG4gICAgfSxcbiAgfTtcblxuICB2YXIgU3VwcG9ydCA9IChmdW5jdGlvbiBTdXBwb3J0KCkge1xuICAgIHZhciB0ZXN0RGl2ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHJldHVybiB7XG4gICAgICB0b3VjaDogKHdpbi5Nb2Rlcm5penIgJiYgd2luLk1vZGVybml6ci50b3VjaCA9PT0gdHJ1ZSkgfHwgKGZ1bmN0aW9uIGNoZWNrVG91Y2goKSB7XG4gICAgICAgIHJldHVybiAhISgod2luLm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDApIHx8ICgnb250b3VjaHN0YXJ0JyBpbiB3aW4pIHx8ICh3aW4uRG9jdW1lbnRUb3VjaCAmJiBkb2MgaW5zdGFuY2VvZiB3aW4uRG9jdW1lbnRUb3VjaCkpO1xuICAgICAgfSgpKSxcblxuICAgICAgcG9pbnRlckV2ZW50czogISEod2luLm5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCB8fCB3aW4uUG9pbnRlckV2ZW50IHx8ICgnbWF4VG91Y2hQb2ludHMnIGluIHdpbi5uYXZpZ2F0b3IgJiYgd2luLm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDApKSxcbiAgICAgIHByZWZpeGVkUG9pbnRlckV2ZW50czogISF3aW4ubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQsXG5cbiAgICAgIHRyYW5zaXRpb246IChmdW5jdGlvbiBjaGVja1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHRlc3REaXYuc3R5bGU7XG4gICAgICAgIHJldHVybiAoJ3RyYW5zaXRpb24nIGluIHN0eWxlIHx8ICd3ZWJraXRUcmFuc2l0aW9uJyBpbiBzdHlsZSB8fCAnTW96VHJhbnNpdGlvbicgaW4gc3R5bGUpO1xuICAgICAgfSgpKSxcbiAgICAgIHRyYW5zZm9ybXMzZDogKHdpbi5Nb2Rlcm5penIgJiYgd2luLk1vZGVybml6ci5jc3N0cmFuc2Zvcm1zM2QgPT09IHRydWUpIHx8IChmdW5jdGlvbiBjaGVja1RyYW5zZm9ybXMzZCgpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGVzdERpdi5zdHlsZTtcbiAgICAgICAgcmV0dXJuICgnd2Via2l0UGVyc3BlY3RpdmUnIGluIHN0eWxlIHx8ICdNb3pQZXJzcGVjdGl2ZScgaW4gc3R5bGUgfHwgJ09QZXJzcGVjdGl2ZScgaW4gc3R5bGUgfHwgJ01zUGVyc3BlY3RpdmUnIGluIHN0eWxlIHx8ICdwZXJzcGVjdGl2ZScgaW4gc3R5bGUpO1xuICAgICAgfSgpKSxcblxuICAgICAgZmxleGJveDogKGZ1bmN0aW9uIGNoZWNrRmxleGJveCgpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGVzdERpdi5zdHlsZTtcbiAgICAgICAgdmFyIHN0eWxlcyA9ICgnYWxpZ25JdGVtcyB3ZWJraXRBbGlnbkl0ZW1zIHdlYmtpdEJveEFsaWduIG1zRmxleEFsaWduIG1vekJveEFsaWduIHdlYmtpdEZsZXhEaXJlY3Rpb24gbXNGbGV4RGlyZWN0aW9uIG1vekJveERpcmVjdGlvbiBtb3pCb3hPcmllbnQgd2Via2l0Qm94RGlyZWN0aW9uIHdlYmtpdEJveE9yaWVudCcpLnNwbGl0KCcgJyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKHN0eWxlc1tpXSBpbiBzdHlsZSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0oKSksXG5cbiAgICAgIG9ic2VydmVyOiAoZnVuY3Rpb24gY2hlY2tPYnNlcnZlcigpIHtcbiAgICAgICAgcmV0dXJuICgnTXV0YXRpb25PYnNlcnZlcicgaW4gd2luIHx8ICdXZWJraXRNdXRhdGlvbk9ic2VydmVyJyBpbiB3aW4pO1xuICAgICAgfSgpKSxcblxuICAgICAgcGFzc2l2ZUxpc3RlbmVyOiAoZnVuY3Rpb24gY2hlY2tQYXNzaXZlTGlzdGVuZXIoKSB7XG4gICAgICAgIHZhciBzdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmVMaXN0ZW5lcicsIG51bGwsIG9wdHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gTm8gc3VwcG9ydFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBwb3J0c1Bhc3NpdmU7XG4gICAgICB9KCkpLFxuXG4gICAgICBnZXN0dXJlczogKGZ1bmN0aW9uIGNoZWNrR2VzdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiAnb25nZXN0dXJlc3RhcnQnIGluIHdpbjtcbiAgICAgIH0oKSksXG4gICAgfTtcbiAgfSgpKTtcblxuICB2YXIgQnJvd3NlciA9IChmdW5jdGlvbiBCcm93c2VyKCkge1xuICAgIGZ1bmN0aW9uIGlzU2FmYXJpKCkge1xuICAgICAgdmFyIHVhID0gd2luLm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiAodWEuaW5kZXhPZignc2FmYXJpJykgPj0gMCAmJiB1YS5pbmRleE9mKCdjaHJvbWUnKSA8IDAgJiYgdWEuaW5kZXhPZignYW5kcm9pZCcpIDwgMCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpc0lFOiAhIXdpbi5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9UcmlkZW50L2cpIHx8ICEhd2luLm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01TSUUvZyksXG4gICAgICBpc0VkZ2U6ICEhd2luLm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0VkZ2UvZyksXG4gICAgICBpc1NhZmFyaTogaXNTYWZhcmkoKSxcbiAgICAgIGlzVWlXZWJWaWV3OiAvKGlQaG9uZXxpUG9kfGlQYWQpLipBcHBsZVdlYktpdCg/IS4qU2FmYXJpKS9pLnRlc3Qod2luLm5hdmlnYXRvci51c2VyQWdlbnQpLFxuICAgIH07XG4gIH0oKSk7XG5cbiAgdmFyIFN3aXBlckNsYXNzID0gZnVuY3Rpb24gU3dpcGVyQ2xhc3MocGFyYW1zKSB7XG4gICAgaWYgKCBwYXJhbXMgPT09IHZvaWQgMCApIHBhcmFtcyA9IHt9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYucGFyYW1zID0gcGFyYW1zO1xuXG4gICAgLy8gRXZlbnRzXG4gICAgc2VsZi5ldmVudHNMaXN0ZW5lcnMgPSB7fTtcblxuICAgIGlmIChzZWxmLnBhcmFtcyAmJiBzZWxmLnBhcmFtcy5vbikge1xuICAgICAgT2JqZWN0LmtleXMoc2VsZi5wYXJhbXMub24pLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICBzZWxmLm9uKGV2ZW50TmFtZSwgc2VsZi5wYXJhbXMub25bZXZlbnROYW1lXSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHN0YXRpY0FjY2Vzc29ycyA9IHsgY29tcG9uZW50czogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gIFN3aXBlckNsYXNzLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIG9uIChldmVudHMsIGhhbmRsZXIsIHByaW9yaXR5KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gc2VsZjsgfVxuICAgIHZhciBtZXRob2QgPSBwcmlvcml0eSA/ICd1bnNoaWZ0JyA6ICdwdXNoJztcbiAgICBldmVudHMuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0pIHsgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdID0gW107IH1cbiAgICAgIHNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XVttZXRob2RdKGhhbmRsZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIFN3aXBlckNsYXNzLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSAoZXZlbnRzLCBoYW5kbGVyLCBwcmlvcml0eSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIHNlbGY7IH1cbiAgICBmdW5jdGlvbiBvbmNlSGFuZGxlcigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgICAgaGFuZGxlci5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIHNlbGYub2ZmKGV2ZW50cywgb25jZUhhbmRsZXIpO1xuICAgICAgaWYgKG9uY2VIYW5kbGVyLmY3cHJveHkpIHtcbiAgICAgICAgZGVsZXRlIG9uY2VIYW5kbGVyLmY3cHJveHk7XG4gICAgICB9XG4gICAgfVxuICAgIG9uY2VIYW5kbGVyLmY3cHJveHkgPSBoYW5kbGVyO1xuICAgIHJldHVybiBzZWxmLm9uKGV2ZW50cywgb25jZUhhbmRsZXIsIHByaW9yaXR5KTtcbiAgfTtcblxuICBTd2lwZXJDbGFzcy5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gb2ZmIChldmVudHMsIGhhbmRsZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVycykgeyByZXR1cm4gc2VsZjsgfVxuICAgIGV2ZW50cy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XSA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0gJiYgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdLmxlbmd0aCkge1xuICAgICAgICBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnRIYW5kbGVyLCBpbmRleCkge1xuICAgICAgICAgIGlmIChldmVudEhhbmRsZXIgPT09IGhhbmRsZXIgfHwgKGV2ZW50SGFuZGxlci5mN3Byb3h5ICYmIGV2ZW50SGFuZGxlci5mN3Byb3h5ID09PSBoYW5kbGVyKSkge1xuICAgICAgICAgICAgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICBTd2lwZXJDbGFzcy5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQgKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVycykgeyByZXR1cm4gc2VsZjsgfVxuICAgIHZhciBldmVudHM7XG4gICAgdmFyIGRhdGE7XG4gICAgdmFyIGNvbnRleHQ7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7XG4gICAgICBldmVudHMgPSBhcmdzWzBdO1xuICAgICAgZGF0YSA9IGFyZ3Muc2xpY2UoMSwgYXJncy5sZW5ndGgpO1xuICAgICAgY29udGV4dCA9IHNlbGY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV2ZW50cyA9IGFyZ3NbMF0uZXZlbnRzO1xuICAgICAgZGF0YSA9IGFyZ3NbMF0uZGF0YTtcbiAgICAgIGNvbnRleHQgPSBhcmdzWzBdLmNvbnRleHQgfHwgc2VsZjtcbiAgICB9XG4gICAgdmFyIGV2ZW50c0FycmF5ID0gQXJyYXkuaXNBcnJheShldmVudHMpID8gZXZlbnRzIDogZXZlbnRzLnNwbGl0KCcgJyk7XG4gICAgZXZlbnRzQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChzZWxmLmV2ZW50c0xpc3RlbmVycyAmJiBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgdmFyIGhhbmRsZXJzID0gW107XG4gICAgICAgIHNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICBoYW5kbGVycy5wdXNoKGV2ZW50SGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICBldmVudEhhbmRsZXIuYXBwbHkoY29udGV4dCwgZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIFN3aXBlckNsYXNzLnByb3RvdHlwZS51c2VNb2R1bGVzUGFyYW1zID0gZnVuY3Rpb24gdXNlTW9kdWxlc1BhcmFtcyAoaW5zdGFuY2VQYXJhbXMpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB0aGlzO1xuICAgIGlmICghaW5zdGFuY2UubW9kdWxlcykgeyByZXR1cm47IH1cbiAgICBPYmplY3Qua2V5cyhpbnN0YW5jZS5tb2R1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGVOYW1lKSB7XG4gICAgICB2YXIgbW9kdWxlID0gaW5zdGFuY2UubW9kdWxlc1ttb2R1bGVOYW1lXTtcbiAgICAgIC8vIEV4dGVuZCBwYXJhbXNcbiAgICAgIGlmIChtb2R1bGUucGFyYW1zKSB7XG4gICAgICAgIFV0aWxzLmV4dGVuZChpbnN0YW5jZVBhcmFtcywgbW9kdWxlLnBhcmFtcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgU3dpcGVyQ2xhc3MucHJvdG90eXBlLnVzZU1vZHVsZXMgPSBmdW5jdGlvbiB1c2VNb2R1bGVzIChtb2R1bGVzUGFyYW1zKSB7XG4gICAgICBpZiAoIG1vZHVsZXNQYXJhbXMgPT09IHZvaWQgMCApIG1vZHVsZXNQYXJhbXMgPSB7fTtcblxuICAgIHZhciBpbnN0YW5jZSA9IHRoaXM7XG4gICAgaWYgKCFpbnN0YW5jZS5tb2R1bGVzKSB7IHJldHVybjsgfVxuICAgIE9iamVjdC5rZXlzKGluc3RhbmNlLm1vZHVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHtcbiAgICAgIHZhciBtb2R1bGUgPSBpbnN0YW5jZS5tb2R1bGVzW21vZHVsZU5hbWVdO1xuICAgICAgdmFyIG1vZHVsZVBhcmFtcyA9IG1vZHVsZXNQYXJhbXNbbW9kdWxlTmFtZV0gfHwge307XG4gICAgICAvLyBFeHRlbmQgaW5zdGFuY2UgbWV0aG9kcyBhbmQgcHJvcHNcbiAgICAgIGlmIChtb2R1bGUuaW5zdGFuY2UpIHtcbiAgICAgICAgT2JqZWN0LmtleXMobW9kdWxlLmluc3RhbmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGVQcm9wTmFtZSkge1xuICAgICAgICAgIHZhciBtb2R1bGVQcm9wID0gbW9kdWxlLmluc3RhbmNlW21vZHVsZVByb3BOYW1lXTtcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZVByb3AgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGluc3RhbmNlW21vZHVsZVByb3BOYW1lXSA9IG1vZHVsZVByb3AuYmluZChpbnN0YW5jZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc3RhbmNlW21vZHVsZVByb3BOYW1lXSA9IG1vZHVsZVByb3A7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIGlmIChtb2R1bGUub24gJiYgaW5zdGFuY2Uub24pIHtcbiAgICAgICAgT2JqZWN0LmtleXMobW9kdWxlLm9uKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGVFdmVudE5hbWUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5vbihtb2R1bGVFdmVudE5hbWUsIG1vZHVsZS5vblttb2R1bGVFdmVudE5hbWVdKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vZHVsZSBjcmVhdGUgY2FsbGJhY2tcbiAgICAgIGlmIChtb2R1bGUuY3JlYXRlKSB7XG4gICAgICAgIG1vZHVsZS5jcmVhdGUuYmluZChpbnN0YW5jZSkobW9kdWxlUGFyYW1zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBzdGF0aWNBY2Nlc3NvcnMuY29tcG9uZW50cy5zZXQgPSBmdW5jdGlvbiAoY29tcG9uZW50cykge1xuICAgIHZhciBDbGFzcyA9IHRoaXM7XG4gICAgaWYgKCFDbGFzcy51c2UpIHsgcmV0dXJuOyB9XG4gICAgQ2xhc3MudXNlKGNvbXBvbmVudHMpO1xuICB9O1xuXG4gIFN3aXBlckNsYXNzLmluc3RhbGxNb2R1bGUgPSBmdW5jdGlvbiBpbnN0YWxsTW9kdWxlIChtb2R1bGUpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoIGxlbi0tID4gMCApIHBhcmFtc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgIHZhciBDbGFzcyA9IHRoaXM7XG4gICAgaWYgKCFDbGFzcy5wcm90b3R5cGUubW9kdWxlcykgeyBDbGFzcy5wcm90b3R5cGUubW9kdWxlcyA9IHt9OyB9XG4gICAgdmFyIG5hbWUgPSBtb2R1bGUubmFtZSB8fCAoKChPYmplY3Qua2V5cyhDbGFzcy5wcm90b3R5cGUubW9kdWxlcykubGVuZ3RoKSArIFwiX1wiICsgKFV0aWxzLm5vdygpKSkpO1xuICAgIENsYXNzLnByb3RvdHlwZS5tb2R1bGVzW25hbWVdID0gbW9kdWxlO1xuICAgIC8vIFByb3RvdHlwZVxuICAgIGlmIChtb2R1bGUucHJvdG8pIHtcbiAgICAgIE9iamVjdC5rZXlzKG1vZHVsZS5wcm90bykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIENsYXNzLnByb3RvdHlwZVtrZXldID0gbW9kdWxlLnByb3RvW2tleV07XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ2xhc3NcbiAgICBpZiAobW9kdWxlLnN0YXRpYykge1xuICAgICAgT2JqZWN0LmtleXMobW9kdWxlLnN0YXRpYykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIENsYXNzW2tleV0gPSBtb2R1bGUuc3RhdGljW2tleV07XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ2FsbGJhY2tcbiAgICBpZiAobW9kdWxlLmluc3RhbGwpIHtcbiAgICAgIG1vZHVsZS5pbnN0YWxsLmFwcGx5KENsYXNzLCBwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gQ2xhc3M7XG4gIH07XG5cbiAgU3dpcGVyQ2xhc3MudXNlID0gZnVuY3Rpb24gdXNlIChtb2R1bGUpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoIGxlbi0tID4gMCApIHBhcmFtc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgIHZhciBDbGFzcyA9IHRoaXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobW9kdWxlKSkge1xuICAgICAgbW9kdWxlLmZvckVhY2goZnVuY3Rpb24gKG0pIHsgcmV0dXJuIENsYXNzLmluc3RhbGxNb2R1bGUobSk7IH0pO1xuICAgICAgcmV0dXJuIENsYXNzO1xuICAgIH1cbiAgICByZXR1cm4gQ2xhc3MuaW5zdGFsbE1vZHVsZS5hcHBseShDbGFzcywgWyBtb2R1bGUgXS5jb25jYXQoIHBhcmFtcyApKTtcbiAgfTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggU3dpcGVyQ2xhc3MsIHN0YXRpY0FjY2Vzc29ycyApO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNpemUgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciB3aWR0aDtcbiAgICB2YXIgaGVpZ2h0O1xuICAgIHZhciAkZWwgPSBzd2lwZXIuJGVsO1xuICAgIGlmICh0eXBlb2Ygc3dpcGVyLnBhcmFtcy53aWR0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHdpZHRoID0gc3dpcGVyLnBhcmFtcy53aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgd2lkdGggPSAkZWxbMF0uY2xpZW50V2lkdGg7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3dpcGVyLnBhcmFtcy5oZWlnaHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBoZWlnaHQgPSBzd2lwZXIucGFyYW1zLmhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVpZ2h0ID0gJGVsWzBdLmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgaWYgKCh3aWR0aCA9PT0gMCAmJiBzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHx8IChoZWlnaHQgPT09IDAgJiYgc3dpcGVyLmlzVmVydGljYWwoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdWJ0cmFjdCBwYWRkaW5nc1xuICAgIHdpZHRoID0gd2lkdGggLSBwYXJzZUludCgkZWwuY3NzKCdwYWRkaW5nLWxlZnQnKSwgMTApIC0gcGFyc2VJbnQoJGVsLmNzcygncGFkZGluZy1yaWdodCcpLCAxMCk7XG4gICAgaGVpZ2h0ID0gaGVpZ2h0IC0gcGFyc2VJbnQoJGVsLmNzcygncGFkZGluZy10b3AnKSwgMTApIC0gcGFyc2VJbnQoJGVsLmNzcygncGFkZGluZy1ib3R0b20nKSwgMTApO1xuXG4gICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBzaXplOiBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyB3aWR0aCA6IGhlaWdodCxcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsaWRlcyAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG5cbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgIHZhciBzd2lwZXJTaXplID0gc3dpcGVyLnNpemU7XG4gICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgdmFyIHdyb25nUlRMID0gc3dpcGVyLndyb25nUlRMO1xuICAgIHZhciBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBwYXJhbXMudmlydHVhbC5lbmFibGVkO1xuICAgIHZhciBwcmV2aW91c1NsaWRlc0xlbmd0aCA9IGlzVmlydHVhbCA/IHN3aXBlci52aXJ0dWFsLnNsaWRlcy5sZW5ndGggOiBzd2lwZXIuc2xpZGVzLmxlbmd0aDtcbiAgICB2YXIgc2xpZGVzID0gJHdyYXBwZXJFbC5jaGlsZHJlbigoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5zbGlkZUNsYXNzKSkpO1xuICAgIHZhciBzbGlkZXNMZW5ndGggPSBpc1ZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIDogc2xpZGVzLmxlbmd0aDtcbiAgICB2YXIgc25hcEdyaWQgPSBbXTtcbiAgICB2YXIgc2xpZGVzR3JpZCA9IFtdO1xuICAgIHZhciBzbGlkZXNTaXplc0dyaWQgPSBbXTtcblxuICAgIHZhciBvZmZzZXRCZWZvcmUgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QmVmb3JlO1xuICAgIGlmICh0eXBlb2Ygb2Zmc2V0QmVmb3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvZmZzZXRCZWZvcmUgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QmVmb3JlLmNhbGwoc3dpcGVyKTtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0QWZ0ZXIgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QWZ0ZXI7XG4gICAgaWYgKHR5cGVvZiBvZmZzZXRBZnRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2Zmc2V0QWZ0ZXIgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QWZ0ZXIuY2FsbChzd2lwZXIpO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1NuYXBHcmlkTGVuZ3RoID0gc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgICB2YXIgcHJldmlvdXNTbGlkZXNHcmlkTGVuZ3RoID0gc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcblxuICAgIHZhciBzcGFjZUJldHdlZW4gPSBwYXJhbXMuc3BhY2VCZXR3ZWVuO1xuICAgIHZhciBzbGlkZVBvc2l0aW9uID0gLW9mZnNldEJlZm9yZTtcbiAgICB2YXIgcHJldlNsaWRlU2l6ZSA9IDA7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBpZiAodHlwZW9mIHN3aXBlclNpemUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3BhY2VCZXR3ZWVuID09PSAnc3RyaW5nJyAmJiBzcGFjZUJldHdlZW4uaW5kZXhPZignJScpID49IDApIHtcbiAgICAgIHNwYWNlQmV0d2VlbiA9IChwYXJzZUZsb2F0KHNwYWNlQmV0d2Vlbi5yZXBsYWNlKCclJywgJycpKSAvIDEwMCkgKiBzd2lwZXJTaXplO1xuICAgIH1cblxuICAgIHN3aXBlci52aXJ0dWFsU2l6ZSA9IC1zcGFjZUJldHdlZW47XG5cbiAgICAvLyByZXNldCBtYXJnaW5zXG4gICAgaWYgKHJ0bCkgeyBzbGlkZXMuY3NzKHsgbWFyZ2luTGVmdDogJycsIG1hcmdpblRvcDogJycgfSk7IH1cbiAgICBlbHNlIHsgc2xpZGVzLmNzcyh7IG1hcmdpblJpZ2h0OiAnJywgbWFyZ2luQm90dG9tOiAnJyB9KTsgfVxuXG4gICAgdmFyIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3M7XG4gICAgaWYgKHBhcmFtcy5zbGlkZXNQZXJDb2x1bW4gPiAxKSB7XG4gICAgICBpZiAoTWF0aC5mbG9vcihzbGlkZXNMZW5ndGggLyBwYXJhbXMuc2xpZGVzUGVyQ29sdW1uKSA9PT0gc2xpZGVzTGVuZ3RoIC8gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJDb2x1bW4pIHtcbiAgICAgICAgc2xpZGVzTnVtYmVyRXZlblRvUm93cyA9IHNsaWRlc0xlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3MgPSBNYXRoLmNlaWwoc2xpZGVzTGVuZ3RoIC8gcGFyYW1zLnNsaWRlc1BlckNvbHVtbikgKiBwYXJhbXMuc2xpZGVzUGVyQ29sdW1uO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zbGlkZXNQZXJWaWV3ICE9PSAnYXV0bycgJiYgcGFyYW1zLnNsaWRlc1BlckNvbHVtbkZpbGwgPT09ICdyb3cnKSB7XG4gICAgICAgIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3MgPSBNYXRoLm1heChzbGlkZXNOdW1iZXJFdmVuVG9Sb3dzLCBwYXJhbXMuc2xpZGVzUGVyVmlldyAqIHBhcmFtcy5zbGlkZXNQZXJDb2x1bW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGMgc2xpZGVzXG4gICAgdmFyIHNsaWRlU2l6ZTtcbiAgICB2YXIgc2xpZGVzUGVyQ29sdW1uID0gcGFyYW1zLnNsaWRlc1BlckNvbHVtbjtcbiAgICB2YXIgc2xpZGVzUGVyUm93ID0gc2xpZGVzTnVtYmVyRXZlblRvUm93cyAvIHNsaWRlc1BlckNvbHVtbjtcbiAgICB2YXIgbnVtRnVsbENvbHVtbnMgPSBNYXRoLmZsb29yKHNsaWRlc0xlbmd0aCAvIHBhcmFtcy5zbGlkZXNQZXJDb2x1bW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpZGVzTGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHNsaWRlU2l6ZSA9IDA7XG4gICAgICB2YXIgc2xpZGUgPSBzbGlkZXMuZXEoaSk7XG4gICAgICBpZiAocGFyYW1zLnNsaWRlc1BlckNvbHVtbiA+IDEpIHtcbiAgICAgICAgLy8gU2V0IHNsaWRlcyBvcmRlclxuICAgICAgICB2YXIgbmV3U2xpZGVPcmRlckluZGV4ID0gKHZvaWQgMCk7XG4gICAgICAgIHZhciBjb2x1bW4gPSAodm9pZCAwKTtcbiAgICAgICAgdmFyIHJvdyA9ICh2b2lkIDApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHBhcmFtcy5zbGlkZXNQZXJDb2x1bW5GaWxsID09PSAnY29sdW1uJylcbiAgICAgICAgICB8fCAocGFyYW1zLnNsaWRlc1BlckNvbHVtbkZpbGwgPT09ICdyb3cnICYmIHBhcmFtcy5zbGlkZXNQZXJHcm91cCA+IDEpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChwYXJhbXMuc2xpZGVzUGVyQ29sdW1uRmlsbCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgICAgICAgIGNvbHVtbiA9IE1hdGguZmxvb3IoaSAvIHNsaWRlc1BlckNvbHVtbik7XG4gICAgICAgICAgICByb3cgPSBpIC0gKGNvbHVtbiAqIHNsaWRlc1BlckNvbHVtbik7XG4gICAgICAgICAgICBpZiAoY29sdW1uID4gbnVtRnVsbENvbHVtbnMgfHwgKGNvbHVtbiA9PT0gbnVtRnVsbENvbHVtbnMgJiYgcm93ID09PSBzbGlkZXNQZXJDb2x1bW4gLSAxKSkge1xuICAgICAgICAgICAgICByb3cgKz0gMTtcbiAgICAgICAgICAgICAgaWYgKHJvdyA+PSBzbGlkZXNQZXJDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICByb3cgPSAwO1xuICAgICAgICAgICAgICAgIGNvbHVtbiArPSAxO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBncm91cEluZGV4ID0gTWF0aC5mbG9vcihpIC8gcGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgICAgICAgICAgIHJvdyA9IE1hdGguZmxvb3IoaSAvIHBhcmFtcy5zbGlkZXNQZXJWaWV3KSAtIGdyb3VwSW5kZXggKiBwYXJhbXMuc2xpZGVzUGVyQ29sdW1uO1xuICAgICAgICAgICAgY29sdW1uID0gaSAtIHJvdyAqIHBhcmFtcy5zbGlkZXNQZXJWaWV3IC0gZ3JvdXBJbmRleCAqIHBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdTbGlkZU9yZGVySW5kZXggPSBjb2x1bW4gKyAoKHJvdyAqIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3MpIC8gc2xpZGVzUGVyQ29sdW1uKTtcbiAgICAgICAgICBzbGlkZVxuICAgICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAgICctd2Via2l0LWJveC1vcmRpbmFsLWdyb3VwJzogbmV3U2xpZGVPcmRlckluZGV4LFxuICAgICAgICAgICAgICAnLW1vei1ib3gtb3JkaW5hbC1ncm91cCc6IG5ld1NsaWRlT3JkZXJJbmRleCxcbiAgICAgICAgICAgICAgJy1tcy1mbGV4LW9yZGVyJzogbmV3U2xpZGVPcmRlckluZGV4LFxuICAgICAgICAgICAgICAnLXdlYmtpdC1vcmRlcic6IG5ld1NsaWRlT3JkZXJJbmRleCxcbiAgICAgICAgICAgICAgb3JkZXI6IG5ld1NsaWRlT3JkZXJJbmRleCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvdyA9IE1hdGguZmxvb3IoaSAvIHNsaWRlc1BlclJvdyk7XG4gICAgICAgICAgY29sdW1uID0gaSAtIChyb3cgKiBzbGlkZXNQZXJSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHNsaWRlXG4gICAgICAgICAgLmNzcyhcbiAgICAgICAgICAgIChcIm1hcmdpbi1cIiArIChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAndG9wJyA6ICdsZWZ0JykpLFxuICAgICAgICAgICAgKHJvdyAhPT0gMCAmJiBwYXJhbXMuc3BhY2VCZXR3ZWVuKSAmJiAoKChwYXJhbXMuc3BhY2VCZXR3ZWVuKSArIFwicHhcIikpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hdHRyKCdkYXRhLXN3aXBlci1jb2x1bW4nLCBjb2x1bW4pXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtc3dpcGVyLXJvdycsIHJvdyk7XG4gICAgICB9XG4gICAgICBpZiAoc2xpZGUuY3NzKCdkaXNwbGF5JykgPT09ICdub25lJykgeyBjb250aW51ZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICAgIGlmIChwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHZhciBzbGlkZVN0eWxlcyA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHNsaWRlWzBdLCBudWxsKTtcbiAgICAgICAgdmFyIGN1cnJlbnRUcmFuc2Zvcm0gPSBzbGlkZVswXS5zdHlsZS50cmFuc2Zvcm07XG4gICAgICAgIHZhciBjdXJyZW50V2ViS2l0VHJhbnNmb3JtID0gc2xpZGVbMF0uc3R5bGUud2Via2l0VHJhbnNmb3JtO1xuICAgICAgICBpZiAoY3VycmVudFRyYW5zZm9ybSkge1xuICAgICAgICAgIHNsaWRlWzBdLnN0eWxlLnRyYW5zZm9ybSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudFdlYktpdFRyYW5zZm9ybSkge1xuICAgICAgICAgIHNsaWRlWzBdLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3Rocykge1xuICAgICAgICAgIHNsaWRlU2l6ZSA9IHN3aXBlci5pc0hvcml6b250YWwoKVxuICAgICAgICAgICAgPyBzbGlkZS5vdXRlcldpZHRoKHRydWUpXG4gICAgICAgICAgICA6IHNsaWRlLm91dGVySGVpZ2h0KHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKSk7XG4gICAgICAgICAgICB2YXIgcGFkZGluZ0xlZnQgPSBwYXJzZUZsb2F0KHNsaWRlU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpKTtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nUmlnaHQgPSBwYXJzZUZsb2F0KHNsaWRlU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctcmlnaHQnKSk7XG4gICAgICAgICAgICB2YXIgbWFyZ2luTGVmdCA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLWxlZnQnKSk7XG4gICAgICAgICAgICB2YXIgbWFyZ2luUmlnaHQgPSBwYXJzZUZsb2F0KHNsaWRlU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1yaWdodCcpKTtcbiAgICAgICAgICAgIHZhciBib3hTaXppbmcgPSBzbGlkZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdib3gtc2l6aW5nJyk7XG4gICAgICAgICAgICBpZiAoYm94U2l6aW5nICYmIGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnICYmICFCcm93c2VyLmlzSUUpIHtcbiAgICAgICAgICAgICAgc2xpZGVTaXplID0gd2lkdGggKyBtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzbGlkZVNpemUgPSB3aWR0aCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgbWFyZ2luTGVmdCArIG1hcmdpblJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gcGFyc2VGbG9hdChzbGlkZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKSk7XG4gICAgICAgICAgICB2YXIgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG4gICAgICAgICAgICB2YXIgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1ib3R0b20nKSk7XG4gICAgICAgICAgICB2YXIgbWFyZ2luVG9wID0gcGFyc2VGbG9hdChzbGlkZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdtYXJnaW4tdG9wJykpO1xuICAgICAgICAgICAgdmFyIG1hcmdpbkJvdHRvbSA9IHBhcnNlRmxvYXQoc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLWJvdHRvbScpKTtcbiAgICAgICAgICAgIHZhciBib3hTaXppbmckMSA9IHNsaWRlU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2JveC1zaXppbmcnKTtcbiAgICAgICAgICAgIGlmIChib3hTaXppbmckMSAmJiBib3hTaXppbmckMSA9PT0gJ2JvcmRlci1ib3gnICYmICFCcm93c2VyLmlzSUUpIHtcbiAgICAgICAgICAgICAgc2xpZGVTaXplID0gaGVpZ2h0ICsgbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2xpZGVTaXplID0gaGVpZ2h0ICsgcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b20gKyBtYXJnaW5Ub3AgKyBtYXJnaW5Cb3R0b207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50VHJhbnNmb3JtKSB7XG4gICAgICAgICAgc2xpZGVbMF0uc3R5bGUudHJhbnNmb3JtID0gY3VycmVudFRyYW5zZm9ybTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudFdlYktpdFRyYW5zZm9ybSkge1xuICAgICAgICAgIHNsaWRlWzBdLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IGN1cnJlbnRXZWJLaXRUcmFuc2Zvcm07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5yb3VuZExlbmd0aHMpIHsgc2xpZGVTaXplID0gTWF0aC5mbG9vcihzbGlkZVNpemUpOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGlkZVNpemUgPSAoc3dpcGVyU2l6ZSAtICgocGFyYW1zLnNsaWRlc1BlclZpZXcgLSAxKSAqIHNwYWNlQmV0d2VlbikpIC8gcGFyYW1zLnNsaWRlc1BlclZpZXc7XG4gICAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSB7IHNsaWRlU2l6ZSA9IE1hdGguZmxvb3Ioc2xpZGVTaXplKTsgfVxuXG4gICAgICAgIGlmIChzbGlkZXNbaV0pIHtcbiAgICAgICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgICBzbGlkZXNbaV0uc3R5bGUud2lkdGggPSBzbGlkZVNpemUgKyBcInB4XCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNsaWRlc1tpXS5zdHlsZS5oZWlnaHQgPSBzbGlkZVNpemUgKyBcInB4XCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2xpZGVzW2ldKSB7XG4gICAgICAgIHNsaWRlc1tpXS5zd2lwZXJTbGlkZVNpemUgPSBzbGlkZVNpemU7XG4gICAgICB9XG4gICAgICBzbGlkZXNTaXplc0dyaWQucHVzaChzbGlkZVNpemUpO1xuXG5cbiAgICAgIGlmIChwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgICAgc2xpZGVQb3NpdGlvbiA9IHNsaWRlUG9zaXRpb24gKyAoc2xpZGVTaXplIC8gMikgKyAocHJldlNsaWRlU2l6ZSAvIDIpICsgc3BhY2VCZXR3ZWVuO1xuICAgICAgICBpZiAocHJldlNsaWRlU2l6ZSA9PT0gMCAmJiBpICE9PSAwKSB7IHNsaWRlUG9zaXRpb24gPSBzbGlkZVBvc2l0aW9uIC0gKHN3aXBlclNpemUgLyAyKSAtIHNwYWNlQmV0d2VlbjsgfVxuICAgICAgICBpZiAoaSA9PT0gMCkgeyBzbGlkZVBvc2l0aW9uID0gc2xpZGVQb3NpdGlvbiAtIChzd2lwZXJTaXplIC8gMikgLSBzcGFjZUJldHdlZW47IH1cbiAgICAgICAgaWYgKE1hdGguYWJzKHNsaWRlUG9zaXRpb24pIDwgMSAvIDEwMDApIHsgc2xpZGVQb3NpdGlvbiA9IDA7IH1cbiAgICAgICAgaWYgKHBhcmFtcy5yb3VuZExlbmd0aHMpIHsgc2xpZGVQb3NpdGlvbiA9IE1hdGguZmxvb3Ioc2xpZGVQb3NpdGlvbik7IH1cbiAgICAgICAgaWYgKChpbmRleCkgJSBwYXJhbXMuc2xpZGVzUGVyR3JvdXAgPT09IDApIHsgc25hcEdyaWQucHVzaChzbGlkZVBvc2l0aW9uKTsgfVxuICAgICAgICBzbGlkZXNHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3RocykgeyBzbGlkZVBvc2l0aW9uID0gTWF0aC5mbG9vcihzbGlkZVBvc2l0aW9uKTsgfVxuICAgICAgICBpZiAoKGluZGV4KSAlIHBhcmFtcy5zbGlkZXNQZXJHcm91cCA9PT0gMCkgeyBzbmFwR3JpZC5wdXNoKHNsaWRlUG9zaXRpb24pOyB9XG4gICAgICAgIHNsaWRlc0dyaWQucHVzaChzbGlkZVBvc2l0aW9uKTtcbiAgICAgICAgc2xpZGVQb3NpdGlvbiA9IHNsaWRlUG9zaXRpb24gKyBzbGlkZVNpemUgKyBzcGFjZUJldHdlZW47XG4gICAgICB9XG5cbiAgICAgIHN3aXBlci52aXJ0dWFsU2l6ZSArPSBzbGlkZVNpemUgKyBzcGFjZUJldHdlZW47XG5cbiAgICAgIHByZXZTbGlkZVNpemUgPSBzbGlkZVNpemU7XG5cbiAgICAgIGluZGV4ICs9IDE7XG4gICAgfVxuICAgIHN3aXBlci52aXJ0dWFsU2l6ZSA9IE1hdGgubWF4KHN3aXBlci52aXJ0dWFsU2l6ZSwgc3dpcGVyU2l6ZSkgKyBvZmZzZXRBZnRlcjtcbiAgICB2YXIgbmV3U2xpZGVzR3JpZDtcblxuICAgIGlmIChcbiAgICAgIHJ0bCAmJiB3cm9uZ1JUTCAmJiAocGFyYW1zLmVmZmVjdCA9PT0gJ3NsaWRlJyB8fCBwYXJhbXMuZWZmZWN0ID09PSAnY292ZXJmbG93JykpIHtcbiAgICAgICR3cmFwcGVyRWwuY3NzKHsgd2lkdGg6ICgoc3dpcGVyLnZpcnR1YWxTaXplICsgcGFyYW1zLnNwYWNlQmV0d2VlbikgKyBcInB4XCIpIH0pO1xuICAgIH1cbiAgICBpZiAoIVN1cHBvcnQuZmxleGJveCB8fCBwYXJhbXMuc2V0V3JhcHBlclNpemUpIHtcbiAgICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHsgJHdyYXBwZXJFbC5jc3MoeyB3aWR0aDogKChzd2lwZXIudmlydHVhbFNpemUgKyBwYXJhbXMuc3BhY2VCZXR3ZWVuKSArIFwicHhcIikgfSk7IH1cbiAgICAgIGVsc2UgeyAkd3JhcHBlckVsLmNzcyh7IGhlaWdodDogKChzd2lwZXIudmlydHVhbFNpemUgKyBwYXJhbXMuc3BhY2VCZXR3ZWVuKSArIFwicHhcIikgfSk7IH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNsaWRlc1BlckNvbHVtbiA+IDEpIHtcbiAgICAgIHN3aXBlci52aXJ0dWFsU2l6ZSA9IChzbGlkZVNpemUgKyBwYXJhbXMuc3BhY2VCZXR3ZWVuKSAqIHNsaWRlc051bWJlckV2ZW5Ub1Jvd3M7XG4gICAgICBzd2lwZXIudmlydHVhbFNpemUgPSBNYXRoLmNlaWwoc3dpcGVyLnZpcnR1YWxTaXplIC8gcGFyYW1zLnNsaWRlc1BlckNvbHVtbikgLSBwYXJhbXMuc3BhY2VCZXR3ZWVuO1xuICAgICAgaWYgKHN3aXBlci5pc0hvcml6b250YWwoKSkgeyAkd3JhcHBlckVsLmNzcyh7IHdpZHRoOiAoKHN3aXBlci52aXJ0dWFsU2l6ZSArIHBhcmFtcy5zcGFjZUJldHdlZW4pICsgXCJweFwiKSB9KTsgfVxuICAgICAgZWxzZSB7ICR3cmFwcGVyRWwuY3NzKHsgaGVpZ2h0OiAoKHN3aXBlci52aXJ0dWFsU2l6ZSArIHBhcmFtcy5zcGFjZUJldHdlZW4pICsgXCJweFwiKSB9KTsgfVxuICAgICAgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICBuZXdTbGlkZXNHcmlkID0gW107XG4gICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHNuYXBHcmlkLmxlbmd0aDsgaSQxICs9IDEpIHtcbiAgICAgICAgICB2YXIgc2xpZGVzR3JpZEl0ZW0gPSBzbmFwR3JpZFtpJDFdO1xuICAgICAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSB7IHNsaWRlc0dyaWRJdGVtID0gTWF0aC5mbG9vcihzbGlkZXNHcmlkSXRlbSk7IH1cbiAgICAgICAgICBpZiAoc25hcEdyaWRbaSQxXSA8IHN3aXBlci52aXJ0dWFsU2l6ZSArIHNuYXBHcmlkWzBdKSB7IG5ld1NsaWRlc0dyaWQucHVzaChzbGlkZXNHcmlkSXRlbSk7IH1cbiAgICAgICAgfVxuICAgICAgICBzbmFwR3JpZCA9IG5ld1NsaWRlc0dyaWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGxhc3QgZ3JpZCBlbGVtZW50cyBkZXBlbmRpbmcgb24gd2lkdGhcbiAgICBpZiAoIXBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgbmV3U2xpZGVzR3JpZCA9IFtdO1xuICAgICAgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgc25hcEdyaWQubGVuZ3RoOyBpJDIgKz0gMSkge1xuICAgICAgICB2YXIgc2xpZGVzR3JpZEl0ZW0kMSA9IHNuYXBHcmlkW2kkMl07XG4gICAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSB7IHNsaWRlc0dyaWRJdGVtJDEgPSBNYXRoLmZsb29yKHNsaWRlc0dyaWRJdGVtJDEpOyB9XG4gICAgICAgIGlmIChzbmFwR3JpZFtpJDJdIDw9IHN3aXBlci52aXJ0dWFsU2l6ZSAtIHN3aXBlclNpemUpIHtcbiAgICAgICAgICBuZXdTbGlkZXNHcmlkLnB1c2goc2xpZGVzR3JpZEl0ZW0kMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNuYXBHcmlkID0gbmV3U2xpZGVzR3JpZDtcbiAgICAgIGlmIChNYXRoLmZsb29yKHN3aXBlci52aXJ0dWFsU2l6ZSAtIHN3aXBlclNpemUpIC0gTWF0aC5mbG9vcihzbmFwR3JpZFtzbmFwR3JpZC5sZW5ndGggLSAxXSkgPiAxKSB7XG4gICAgICAgIHNuYXBHcmlkLnB1c2goc3dpcGVyLnZpcnR1YWxTaXplIC0gc3dpcGVyU2l6ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzbmFwR3JpZC5sZW5ndGggPT09IDApIHsgc25hcEdyaWQgPSBbMF07IH1cblxuICAgIGlmIChwYXJhbXMuc3BhY2VCZXR3ZWVuICE9PSAwKSB7XG4gICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgIGlmIChydGwpIHsgc2xpZGVzLmNzcyh7IG1hcmdpbkxlZnQ6IChzcGFjZUJldHdlZW4gKyBcInB4XCIpIH0pOyB9XG4gICAgICAgIGVsc2UgeyBzbGlkZXMuY3NzKHsgbWFyZ2luUmlnaHQ6IChzcGFjZUJldHdlZW4gKyBcInB4XCIpIH0pOyB9XG4gICAgICB9IGVsc2UgeyBzbGlkZXMuY3NzKHsgbWFyZ2luQm90dG9tOiAoc3BhY2VCZXR3ZWVuICsgXCJweFwiKSB9KTsgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY2VudGVySW5zdWZmaWNpZW50U2xpZGVzKSB7XG4gICAgICB2YXIgYWxsU2xpZGVzU2l6ZSA9IDA7XG4gICAgICBzbGlkZXNTaXplc0dyaWQuZm9yRWFjaChmdW5jdGlvbiAoc2xpZGVTaXplVmFsdWUpIHtcbiAgICAgICAgYWxsU2xpZGVzU2l6ZSArPSBzbGlkZVNpemVWYWx1ZSArIChwYXJhbXMuc3BhY2VCZXR3ZWVuID8gcGFyYW1zLnNwYWNlQmV0d2VlbiA6IDApO1xuICAgICAgfSk7XG4gICAgICBhbGxTbGlkZXNTaXplIC09IHBhcmFtcy5zcGFjZUJldHdlZW47XG4gICAgICBpZiAoYWxsU2xpZGVzU2l6ZSA8IHN3aXBlclNpemUpIHtcbiAgICAgICAgdmFyIGFsbFNsaWRlc09mZnNldCA9IChzd2lwZXJTaXplIC0gYWxsU2xpZGVzU2l6ZSkgLyAyO1xuICAgICAgICBzbmFwR3JpZC5mb3JFYWNoKGZ1bmN0aW9uIChzbmFwLCBzbmFwSW5kZXgpIHtcbiAgICAgICAgICBzbmFwR3JpZFtzbmFwSW5kZXhdID0gc25hcCAtIGFsbFNsaWRlc09mZnNldDtcbiAgICAgICAgfSk7XG4gICAgICAgIHNsaWRlc0dyaWQuZm9yRWFjaChmdW5jdGlvbiAoc25hcCwgc25hcEluZGV4KSB7XG4gICAgICAgICAgc2xpZGVzR3JpZFtzbmFwSW5kZXhdID0gc25hcCArIGFsbFNsaWRlc09mZnNldDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgc2xpZGVzOiBzbGlkZXMsXG4gICAgICBzbmFwR3JpZDogc25hcEdyaWQsXG4gICAgICBzbGlkZXNHcmlkOiBzbGlkZXNHcmlkLFxuICAgICAgc2xpZGVzU2l6ZXNHcmlkOiBzbGlkZXNTaXplc0dyaWQsXG4gICAgfSk7XG5cbiAgICBpZiAoc2xpZGVzTGVuZ3RoICE9PSBwcmV2aW91c1NsaWRlc0xlbmd0aCkge1xuICAgICAgc3dpcGVyLmVtaXQoJ3NsaWRlc0xlbmd0aENoYW5nZScpO1xuICAgIH1cbiAgICBpZiAoc25hcEdyaWQubGVuZ3RoICE9PSBwcmV2aW91c1NuYXBHcmlkTGVuZ3RoKSB7XG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93KSB7IHN3aXBlci5jaGVja092ZXJmbG93KCk7IH1cbiAgICAgIHN3aXBlci5lbWl0KCdzbmFwR3JpZExlbmd0aENoYW5nZScpO1xuICAgIH1cbiAgICBpZiAoc2xpZGVzR3JpZC5sZW5ndGggIT09IHByZXZpb3VzU2xpZGVzR3JpZExlbmd0aCkge1xuICAgICAgc3dpcGVyLmVtaXQoJ3NsaWRlc0dyaWRMZW5ndGhDaGFuZ2UnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MgfHwgcGFyYW1zLndhdGNoU2xpZGVzVmlzaWJpbGl0eSkge1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc09mZnNldCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUF1dG9IZWlnaHQgKHNwZWVkKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIGFjdGl2ZVNsaWRlcyA9IFtdO1xuICAgIHZhciBuZXdIZWlnaHQgPSAwO1xuICAgIHZhciBpO1xuICAgIGlmICh0eXBlb2Ygc3BlZWQgPT09ICdudW1iZXInKSB7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbihzcGVlZCk7XG4gICAgfSBlbHNlIGlmIChzcGVlZCA9PT0gdHJ1ZSkge1xuICAgICAgc3dpcGVyLnNldFRyYW5zaXRpb24oc3dpcGVyLnBhcmFtcy5zcGVlZCk7XG4gICAgfVxuICAgIC8vIEZpbmQgc2xpZGVzIGN1cnJlbnRseSBpbiB2aWV3XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gJ2F1dG8nICYmIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyA+IDEpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBNYXRoLmNlaWwoc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3KTsgaSArPSAxKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleCArIGk7XG4gICAgICAgIGlmIChpbmRleCA+IHN3aXBlci5zbGlkZXMubGVuZ3RoKSB7IGJyZWFrOyB9XG4gICAgICAgIGFjdGl2ZVNsaWRlcy5wdXNoKHN3aXBlci5zbGlkZXMuZXEoaW5kZXgpWzBdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZlU2xpZGVzLnB1c2goc3dpcGVyLnNsaWRlcy5lcShzd2lwZXIuYWN0aXZlSW5kZXgpWzBdKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIG5ldyBoZWlnaHQgZnJvbSBoaWdoZXN0IHNsaWRlIGluIHZpZXdcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWN0aXZlU2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGl2ZVNsaWRlc1tpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGhlaWdodCA9IGFjdGl2ZVNsaWRlc1tpXS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIG5ld0hlaWdodCA9IGhlaWdodCA+IG5ld0hlaWdodCA/IGhlaWdodCA6IG5ld0hlaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgSGVpZ2h0XG4gICAgaWYgKG5ld0hlaWdodCkgeyBzd2lwZXIuJHdyYXBwZXJFbC5jc3MoJ2hlaWdodCcsIChuZXdIZWlnaHQgKyBcInB4XCIpKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xpZGVzT2Zmc2V0ICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgc2xpZGVzID0gc3dpcGVyLnNsaWRlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgc2xpZGVzW2ldLnN3aXBlclNsaWRlT2Zmc2V0ID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gc2xpZGVzW2ldLm9mZnNldExlZnQgOiBzbGlkZXNbaV0ub2Zmc2V0VG9wO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsaWRlc1Byb2dyZXNzICh0cmFuc2xhdGUpIHtcbiAgICBpZiAoIHRyYW5zbGF0ZSA9PT0gdm9pZCAwICkgdHJhbnNsYXRlID0gKHRoaXMgJiYgdGhpcy50cmFuc2xhdGUpIHx8IDA7XG5cbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcblxuICAgIHZhciBzbGlkZXMgPSBzd2lwZXIuc2xpZGVzO1xuICAgIHZhciBydGwgPSBzd2lwZXIucnRsVHJhbnNsYXRlO1xuXG4gICAgaWYgKHNsaWRlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgaWYgKHR5cGVvZiBzbGlkZXNbMF0uc3dpcGVyU2xpZGVPZmZzZXQgPT09ICd1bmRlZmluZWQnKSB7IHN3aXBlci51cGRhdGVTbGlkZXNPZmZzZXQoKTsgfVxuXG4gICAgdmFyIG9mZnNldENlbnRlciA9IC10cmFuc2xhdGU7XG4gICAgaWYgKHJ0bCkgeyBvZmZzZXRDZW50ZXIgPSB0cmFuc2xhdGU7IH1cblxuICAgIC8vIFZpc2libGUgU2xpZGVzXG4gICAgc2xpZGVzLnJlbW92ZUNsYXNzKHBhcmFtcy5zbGlkZVZpc2libGVDbGFzcyk7XG5cbiAgICBzd2lwZXIudmlzaWJsZVNsaWRlc0luZGV4ZXMgPSBbXTtcbiAgICBzd2lwZXIudmlzaWJsZVNsaWRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGlkZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBzbGlkZSA9IHNsaWRlc1tpXTtcbiAgICAgIHZhciBzbGlkZVByb2dyZXNzID0gKFxuICAgICAgICAob2Zmc2V0Q2VudGVyICsgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcyA/IHN3aXBlci5taW5UcmFuc2xhdGUoKSA6IDApKSAtIHNsaWRlLnN3aXBlclNsaWRlT2Zmc2V0XG4gICAgICApIC8gKHNsaWRlLnN3aXBlclNsaWRlU2l6ZSArIHBhcmFtcy5zcGFjZUJldHdlZW4pO1xuICAgICAgaWYgKHBhcmFtcy53YXRjaFNsaWRlc1Zpc2liaWxpdHkpIHtcbiAgICAgICAgdmFyIHNsaWRlQmVmb3JlID0gLShvZmZzZXRDZW50ZXIgLSBzbGlkZS5zd2lwZXJTbGlkZU9mZnNldCk7XG4gICAgICAgIHZhciBzbGlkZUFmdGVyID0gc2xpZGVCZWZvcmUgKyBzd2lwZXIuc2xpZGVzU2l6ZXNHcmlkW2ldO1xuICAgICAgICB2YXIgaXNWaXNpYmxlID0gKHNsaWRlQmVmb3JlID49IDAgJiYgc2xpZGVCZWZvcmUgPCBzd2lwZXIuc2l6ZSAtIDEpXG4gICAgICAgICAgICAgICAgICB8fCAoc2xpZGVBZnRlciA+IDEgJiYgc2xpZGVBZnRlciA8PSBzd2lwZXIuc2l6ZSlcbiAgICAgICAgICAgICAgICAgIHx8IChzbGlkZUJlZm9yZSA8PSAwICYmIHNsaWRlQWZ0ZXIgPj0gc3dpcGVyLnNpemUpO1xuICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgc3dpcGVyLnZpc2libGVTbGlkZXMucHVzaChzbGlkZSk7XG4gICAgICAgICAgc3dpcGVyLnZpc2libGVTbGlkZXNJbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgc2xpZGVzLmVxKGkpLmFkZENsYXNzKHBhcmFtcy5zbGlkZVZpc2libGVDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNsaWRlLnByb2dyZXNzID0gcnRsID8gLXNsaWRlUHJvZ3Jlc3MgOiBzbGlkZVByb2dyZXNzO1xuICAgIH1cbiAgICBzd2lwZXIudmlzaWJsZVNsaWRlcyA9ICQoc3dpcGVyLnZpc2libGVTbGlkZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3MgKHRyYW5zbGF0ZSkge1xuICAgIGlmICggdHJhbnNsYXRlID09PSB2b2lkIDAgKSB0cmFuc2xhdGUgPSAodGhpcyAmJiB0aGlzLnRyYW5zbGF0ZSkgfHwgMDtcblxuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuXG4gICAgdmFyIHRyYW5zbGF0ZXNEaWZmID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICAgIHZhciBwcm9ncmVzcyA9IHN3aXBlci5wcm9ncmVzcztcbiAgICB2YXIgaXNCZWdpbm5pbmcgPSBzd2lwZXIuaXNCZWdpbm5pbmc7XG4gICAgdmFyIGlzRW5kID0gc3dpcGVyLmlzRW5kO1xuICAgIHZhciB3YXNCZWdpbm5pbmcgPSBpc0JlZ2lubmluZztcbiAgICB2YXIgd2FzRW5kID0gaXNFbmQ7XG4gICAgaWYgKHRyYW5zbGF0ZXNEaWZmID09PSAwKSB7XG4gICAgICBwcm9ncmVzcyA9IDA7XG4gICAgICBpc0JlZ2lubmluZyA9IHRydWU7XG4gICAgICBpc0VuZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyZXNzID0gKHRyYW5zbGF0ZSAtIHN3aXBlci5taW5UcmFuc2xhdGUoKSkgLyAodHJhbnNsYXRlc0RpZmYpO1xuICAgICAgaXNCZWdpbm5pbmcgPSBwcm9ncmVzcyA8PSAwO1xuICAgICAgaXNFbmQgPSBwcm9ncmVzcyA+PSAxO1xuICAgIH1cbiAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICBwcm9ncmVzczogcHJvZ3Jlc3MsXG4gICAgICBpc0JlZ2lubmluZzogaXNCZWdpbm5pbmcsXG4gICAgICBpc0VuZDogaXNFbmQsXG4gICAgfSk7XG5cbiAgICBpZiAocGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MgfHwgcGFyYW1zLndhdGNoU2xpZGVzVmlzaWJpbGl0eSkgeyBzd2lwZXIudXBkYXRlU2xpZGVzUHJvZ3Jlc3ModHJhbnNsYXRlKTsgfVxuXG4gICAgaWYgKGlzQmVnaW5uaW5nICYmICF3YXNCZWdpbm5pbmcpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdyZWFjaEJlZ2lubmluZyB0b0VkZ2UnKTtcbiAgICB9XG4gICAgaWYgKGlzRW5kICYmICF3YXNFbmQpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdyZWFjaEVuZCB0b0VkZ2UnKTtcbiAgICB9XG4gICAgaWYgKCh3YXNCZWdpbm5pbmcgJiYgIWlzQmVnaW5uaW5nKSB8fCAod2FzRW5kICYmICFpc0VuZCkpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdmcm9tRWRnZScpO1xuICAgIH1cblxuICAgIHN3aXBlci5lbWl0KCdwcm9ncmVzcycsIHByb2dyZXNzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsaWRlc0NsYXNzZXMgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuXG4gICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHJlYWxJbmRleCA9IHN3aXBlci5yZWFsSW5kZXg7XG4gICAgdmFyIGlzVmlydHVhbCA9IHN3aXBlci52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQ7XG5cbiAgICBzbGlkZXMucmVtb3ZlQ2xhc3MoKChwYXJhbXMuc2xpZGVBY3RpdmVDbGFzcykgKyBcIiBcIiArIChwYXJhbXMuc2xpZGVOZXh0Q2xhc3MpICsgXCIgXCIgKyAocGFyYW1zLnNsaWRlUHJldkNsYXNzKSArIFwiIFwiICsgKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZUFjdGl2ZUNsYXNzKSArIFwiIFwiICsgKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZU5leHRDbGFzcykgKyBcIiBcIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVQcmV2Q2xhc3MpKSk7XG5cbiAgICB2YXIgYWN0aXZlU2xpZGU7XG4gICAgaWYgKGlzVmlydHVhbCkge1xuICAgICAgYWN0aXZlU2xpZGUgPSBzd2lwZXIuJHdyYXBwZXJFbC5maW5kKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyBhY3RpdmVJbmRleCArIFwiXFxcIl1cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3RpdmVTbGlkZSA9IHNsaWRlcy5lcShhY3RpdmVJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlIGNsYXNzZXNcbiAgICBhY3RpdmVTbGlkZS5hZGRDbGFzcyhwYXJhbXMuc2xpZGVBY3RpdmVDbGFzcyk7XG5cbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIC8vIER1cGxpY2F0ZSB0byBhbGwgbG9vcGVkIHNsaWRlc1xuICAgICAgaWYgKGFjdGl2ZVNsaWRlLmhhc0NsYXNzKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZUNsYXNzKSkge1xuICAgICAgICAkd3JhcHBlckVsXG4gICAgICAgICAgLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIjpub3QoLlwiICsgKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZUNsYXNzKSArIFwiKVtkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyByZWFsSW5kZXggKyBcIlxcXCJdXCIpKVxuICAgICAgICAgIC5hZGRDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVBY3RpdmVDbGFzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkd3JhcHBlckVsXG4gICAgICAgICAgLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIi5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyByZWFsSW5kZXggKyBcIlxcXCJdXCIpKVxuICAgICAgICAgIC5hZGRDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVBY3RpdmVDbGFzcyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5leHQgU2xpZGVcbiAgICB2YXIgbmV4dFNsaWRlID0gYWN0aXZlU2xpZGUubmV4dEFsbCgoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpKSkuZXEoMCkuYWRkQ2xhc3MocGFyYW1zLnNsaWRlTmV4dENsYXNzKTtcbiAgICBpZiAocGFyYW1zLmxvb3AgJiYgbmV4dFNsaWRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbmV4dFNsaWRlID0gc2xpZGVzLmVxKDApO1xuICAgICAgbmV4dFNsaWRlLmFkZENsYXNzKHBhcmFtcy5zbGlkZU5leHRDbGFzcyk7XG4gICAgfVxuICAgIC8vIFByZXYgU2xpZGVcbiAgICB2YXIgcHJldlNsaWRlID0gYWN0aXZlU2xpZGUucHJldkFsbCgoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpKSkuZXEoMCkuYWRkQ2xhc3MocGFyYW1zLnNsaWRlUHJldkNsYXNzKTtcbiAgICBpZiAocGFyYW1zLmxvb3AgJiYgcHJldlNsaWRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcHJldlNsaWRlID0gc2xpZGVzLmVxKC0xKTtcbiAgICAgIHByZXZTbGlkZS5hZGRDbGFzcyhwYXJhbXMuc2xpZGVQcmV2Q2xhc3MpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIC8vIER1cGxpY2F0ZSB0byBhbGwgbG9vcGVkIHNsaWRlc1xuICAgICAgaWYgKG5leHRTbGlkZS5oYXNDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykpIHtcbiAgICAgICAgJHdyYXBwZXJFbFxuICAgICAgICAgIC5jaGlsZHJlbigoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpICsgXCI6bm90KC5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIilbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgKG5leHRTbGlkZS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpKSArIFwiXFxcIl1cIikpXG4gICAgICAgICAgLmFkZENsYXNzKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZU5leHRDbGFzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkd3JhcHBlckVsXG4gICAgICAgICAgLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIi5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyAobmV4dFNsaWRlLmF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JykpICsgXCJcXFwiXVwiKSlcbiAgICAgICAgICAuYWRkQ2xhc3MocGFyYW1zLnNsaWRlRHVwbGljYXRlTmV4dENsYXNzKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmV2U2xpZGUuaGFzQ2xhc3MocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKSB7XG4gICAgICAgICR3cmFwcGVyRWxcbiAgICAgICAgICAuY2hpbGRyZW4oKFwiLlwiICsgKHBhcmFtcy5zbGlkZUNsYXNzKSArIFwiOm5vdCguXCIgKyAocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCIpW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIChwcmV2U2xpZGUuYXR0cignZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKSkgKyBcIlxcXCJdXCIpKVxuICAgICAgICAgIC5hZGRDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVQcmV2Q2xhc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHdyYXBwZXJFbFxuICAgICAgICAgIC5jaGlsZHJlbigoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpICsgXCIuXCIgKyAocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgKHByZXZTbGlkZS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpKSArIFwiXFxcIl1cIikpXG4gICAgICAgICAgLmFkZENsYXNzKHBhcmFtcy5zbGlkZUR1cGxpY2F0ZVByZXZDbGFzcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQWN0aXZlSW5kZXggKG5ld0FjdGl2ZUluZGV4KSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHRyYW5zbGF0ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlIDogLXN3aXBlci50cmFuc2xhdGU7XG4gICAgdmFyIHNsaWRlc0dyaWQgPSBzd2lwZXIuc2xpZGVzR3JpZDtcbiAgICB2YXIgc25hcEdyaWQgPSBzd2lwZXIuc25hcEdyaWQ7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHByZXZpb3VzSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHByZXZpb3VzUmVhbEluZGV4ID0gc3dpcGVyLnJlYWxJbmRleDtcbiAgICB2YXIgcHJldmlvdXNTbmFwSW5kZXggPSBzd2lwZXIuc25hcEluZGV4O1xuICAgIHZhciBhY3RpdmVJbmRleCA9IG5ld0FjdGl2ZUluZGV4O1xuICAgIHZhciBzbmFwSW5kZXg7XG4gICAgaWYgKHR5cGVvZiBhY3RpdmVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpZGVzR3JpZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAodHlwZW9mIHNsaWRlc0dyaWRbaSArIDFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICh0cmFuc2xhdGUgPj0gc2xpZGVzR3JpZFtpXSAmJiB0cmFuc2xhdGUgPCBzbGlkZXNHcmlkW2kgKyAxXSAtICgoc2xpZGVzR3JpZFtpICsgMV0gLSBzbGlkZXNHcmlkW2ldKSAvIDIpKSB7XG4gICAgICAgICAgICBhY3RpdmVJbmRleCA9IGk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmFuc2xhdGUgPj0gc2xpZGVzR3JpZFtpXSAmJiB0cmFuc2xhdGUgPCBzbGlkZXNHcmlkW2kgKyAxXSkge1xuICAgICAgICAgICAgYWN0aXZlSW5kZXggPSBpICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlID49IHNsaWRlc0dyaWRbaV0pIHtcbiAgICAgICAgICBhY3RpdmVJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE5vcm1hbGl6ZSBzbGlkZUluZGV4XG4gICAgICBpZiAocGFyYW1zLm5vcm1hbGl6ZVNsaWRlSW5kZXgpIHtcbiAgICAgICAgaWYgKGFjdGl2ZUluZGV4IDwgMCB8fCB0eXBlb2YgYWN0aXZlSW5kZXggPT09ICd1bmRlZmluZWQnKSB7IGFjdGl2ZUluZGV4ID0gMDsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc25hcEdyaWQuaW5kZXhPZih0cmFuc2xhdGUpID49IDApIHtcbiAgICAgIHNuYXBJbmRleCA9IHNuYXBHcmlkLmluZGV4T2YodHJhbnNsYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hcEluZGV4ID0gTWF0aC5mbG9vcihhY3RpdmVJbmRleCAvIHBhcmFtcy5zbGlkZXNQZXJHcm91cCk7XG4gICAgfVxuICAgIGlmIChzbmFwSW5kZXggPj0gc25hcEdyaWQubGVuZ3RoKSB7IHNuYXBJbmRleCA9IHNuYXBHcmlkLmxlbmd0aCAtIDE7IH1cbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IHByZXZpb3VzSW5kZXgpIHtcbiAgICAgIGlmIChzbmFwSW5kZXggIT09IHByZXZpb3VzU25hcEluZGV4KSB7XG4gICAgICAgIHN3aXBlci5zbmFwSW5kZXggPSBzbmFwSW5kZXg7XG4gICAgICAgIHN3aXBlci5lbWl0KCdzbmFwSW5kZXhDaGFuZ2UnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgcmVhbCBpbmRleFxuICAgIHZhciByZWFsSW5kZXggPSBwYXJzZUludChzd2lwZXIuc2xpZGVzLmVxKGFjdGl2ZUluZGV4KS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpIHx8IGFjdGl2ZUluZGV4LCAxMCk7XG5cbiAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICBzbmFwSW5kZXg6IHNuYXBJbmRleCxcbiAgICAgIHJlYWxJbmRleDogcmVhbEluZGV4LFxuICAgICAgcHJldmlvdXNJbmRleDogcHJldmlvdXNJbmRleCxcbiAgICAgIGFjdGl2ZUluZGV4OiBhY3RpdmVJbmRleCxcbiAgICB9KTtcbiAgICBzd2lwZXIuZW1pdCgnYWN0aXZlSW5kZXhDaGFuZ2UnKTtcbiAgICBzd2lwZXIuZW1pdCgnc25hcEluZGV4Q2hhbmdlJyk7XG4gICAgaWYgKHByZXZpb3VzUmVhbEluZGV4ICE9PSByZWFsSW5kZXgpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdyZWFsSW5kZXhDaGFuZ2UnKTtcbiAgICB9XG4gICAgaWYgKHN3aXBlci5pbml0aWFsaXplZCB8fCBzd2lwZXIucnVuQ2FsbGJhY2tzT25Jbml0KSB7XG4gICAgICBzd2lwZXIuZW1pdCgnc2xpZGVDaGFuZ2UnKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVDbGlja2VkU2xpZGUgKGUpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgc2xpZGUgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykpKVswXTtcbiAgICB2YXIgc2xpZGVGb3VuZCA9IGZhbHNlO1xuICAgIGlmIChzbGlkZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzd2lwZXIuc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChzd2lwZXIuc2xpZGVzW2ldID09PSBzbGlkZSkgeyBzbGlkZUZvdW5kID0gdHJ1ZTsgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzbGlkZSAmJiBzbGlkZUZvdW5kKSB7XG4gICAgICBzd2lwZXIuY2xpY2tlZFNsaWRlID0gc2xpZGU7XG4gICAgICBpZiAoc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICAgICAgc3dpcGVyLmNsaWNrZWRJbmRleCA9IHBhcnNlSW50KCQoc2xpZGUpLmF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JyksIDEwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci5jbGlja2VkSW5kZXggPSAkKHNsaWRlKS5pbmRleCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2lwZXIuY2xpY2tlZFNsaWRlID0gdW5kZWZpbmVkO1xuICAgICAgc3dpcGVyLmNsaWNrZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5zbGlkZVRvQ2xpY2tlZFNsaWRlICYmIHN3aXBlci5jbGlja2VkSW5kZXggIT09IHVuZGVmaW5lZCAmJiBzd2lwZXIuY2xpY2tlZEluZGV4ICE9PSBzd2lwZXIuYWN0aXZlSW5kZXgpIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvQ2xpY2tlZFNsaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICB1cGRhdGVTaXplOiB1cGRhdGVTaXplLFxuICAgIHVwZGF0ZVNsaWRlczogdXBkYXRlU2xpZGVzLFxuICAgIHVwZGF0ZUF1dG9IZWlnaHQ6IHVwZGF0ZUF1dG9IZWlnaHQsXG4gICAgdXBkYXRlU2xpZGVzT2Zmc2V0OiB1cGRhdGVTbGlkZXNPZmZzZXQsXG4gICAgdXBkYXRlU2xpZGVzUHJvZ3Jlc3M6IHVwZGF0ZVNsaWRlc1Byb2dyZXNzLFxuICAgIHVwZGF0ZVByb2dyZXNzOiB1cGRhdGVQcm9ncmVzcyxcbiAgICB1cGRhdGVTbGlkZXNDbGFzc2VzOiB1cGRhdGVTbGlkZXNDbGFzc2VzLFxuICAgIHVwZGF0ZUFjdGl2ZUluZGV4OiB1cGRhdGVBY3RpdmVJbmRleCxcbiAgICB1cGRhdGVDbGlja2VkU2xpZGU6IHVwZGF0ZUNsaWNrZWRTbGlkZSxcbiAgfTtcblxuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGUgKGF4aXMpIHtcbiAgICBpZiAoIGF4aXMgPT09IHZvaWQgMCApIGF4aXMgPSB0aGlzLmlzSG9yaXpvbnRhbCgpID8gJ3gnIDogJ3knO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgcnRsID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZTtcbiAgICB2YXIgdHJhbnNsYXRlID0gc3dpcGVyLnRyYW5zbGF0ZTtcbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuXG4gICAgaWYgKHBhcmFtcy52aXJ0dWFsVHJhbnNsYXRlKSB7XG4gICAgICByZXR1cm4gcnRsID8gLXRyYW5zbGF0ZSA6IHRyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudFRyYW5zbGF0ZSA9IFV0aWxzLmdldFRyYW5zbGF0ZSgkd3JhcHBlckVsWzBdLCBheGlzKTtcbiAgICBpZiAocnRsKSB7IGN1cnJlbnRUcmFuc2xhdGUgPSAtY3VycmVudFRyYW5zbGF0ZTsgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRUcmFuc2xhdGUgfHwgMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSAodHJhbnNsYXRlLCBieUNvbnRyb2xsZXIpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcnRsID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZTtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgIHZhciBwcm9ncmVzcyA9IHN3aXBlci5wcm9ncmVzcztcbiAgICB2YXIgeCA9IDA7XG4gICAgdmFyIHkgPSAwO1xuICAgIHZhciB6ID0gMDtcblxuICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHggPSBydGwgPyAtdHJhbnNsYXRlIDogdHJhbnNsYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB5ID0gdHJhbnNsYXRlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSB7XG4gICAgICB4ID0gTWF0aC5mbG9vcih4KTtcbiAgICAgIHkgPSBNYXRoLmZsb29yKHkpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnZpcnR1YWxUcmFuc2xhdGUpIHtcbiAgICAgIGlmIChTdXBwb3J0LnRyYW5zZm9ybXMzZCkgeyAkd3JhcHBlckVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCBcIiArIHogKyBcInB4KVwiKSk7IH1cbiAgICAgIGVsc2UgeyAkd3JhcHBlckVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIikpOyB9XG4gICAgfVxuICAgIHN3aXBlci5wcmV2aW91c1RyYW5zbGF0ZSA9IHN3aXBlci50cmFuc2xhdGU7XG4gICAgc3dpcGVyLnRyYW5zbGF0ZSA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/IHggOiB5O1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB1cGRhdGUgcHJvZ3Jlc3NcbiAgICB2YXIgbmV3UHJvZ3Jlc3M7XG4gICAgdmFyIHRyYW5zbGF0ZXNEaWZmID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICAgIGlmICh0cmFuc2xhdGVzRGlmZiA9PT0gMCkge1xuICAgICAgbmV3UHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdQcm9ncmVzcyA9ICh0cmFuc2xhdGUgLSBzd2lwZXIubWluVHJhbnNsYXRlKCkpIC8gKHRyYW5zbGF0ZXNEaWZmKTtcbiAgICB9XG4gICAgaWYgKG5ld1Byb2dyZXNzICE9PSBwcm9ncmVzcykge1xuICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKHRyYW5zbGF0ZSk7XG4gICAgfVxuXG4gICAgc3dpcGVyLmVtaXQoJ3NldFRyYW5zbGF0ZScsIHN3aXBlci50cmFuc2xhdGUsIGJ5Q29udHJvbGxlcik7XG4gIH1cblxuICBmdW5jdGlvbiBtaW5UcmFuc2xhdGUgKCkge1xuICAgIHJldHVybiAoLXRoaXMuc25hcEdyaWRbMF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF4VHJhbnNsYXRlICgpIHtcbiAgICByZXR1cm4gKC10aGlzLnNuYXBHcmlkW3RoaXMuc25hcEdyaWQubGVuZ3RoIC0gMV0pO1xuICB9XG5cbiAgdmFyIHRyYW5zbGF0ZSA9IHtcbiAgICBnZXRUcmFuc2xhdGU6IGdldFRyYW5zbGF0ZSxcbiAgICBzZXRUcmFuc2xhdGU6IHNldFRyYW5zbGF0ZSxcbiAgICBtaW5UcmFuc2xhdGU6IG1pblRyYW5zbGF0ZSxcbiAgICBtYXhUcmFuc2xhdGU6IG1heFRyYW5zbGF0ZSxcbiAgfTtcblxuICBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uIChkdXJhdGlvbiwgYnlDb250cm9sbGVyKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG5cbiAgICBzd2lwZXIuJHdyYXBwZXJFbC50cmFuc2l0aW9uKGR1cmF0aW9uKTtcblxuICAgIHN3aXBlci5lbWl0KCdzZXRUcmFuc2l0aW9uJywgZHVyYXRpb24sIGJ5Q29udHJvbGxlcik7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2l0aW9uU3RhcnQgKHJ1bkNhbGxiYWNrcywgZGlyZWN0aW9uKSB7XG4gICAgaWYgKCBydW5DYWxsYmFja3MgPT09IHZvaWQgMCApIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG5cbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHByZXZpb3VzSW5kZXggPSBzd2lwZXIucHJldmlvdXNJbmRleDtcbiAgICBpZiAocGFyYW1zLmF1dG9IZWlnaHQpIHtcbiAgICAgIHN3aXBlci51cGRhdGVBdXRvSGVpZ2h0KCk7XG4gICAgfVxuXG4gICAgdmFyIGRpciA9IGRpcmVjdGlvbjtcbiAgICBpZiAoIWRpcikge1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID4gcHJldmlvdXNJbmRleCkgeyBkaXIgPSAnbmV4dCc7IH1cbiAgICAgIGVsc2UgaWYgKGFjdGl2ZUluZGV4IDwgcHJldmlvdXNJbmRleCkgeyBkaXIgPSAncHJldic7IH1cbiAgICAgIGVsc2UgeyBkaXIgPSAncmVzZXQnOyB9XG4gICAgfVxuXG4gICAgc3dpcGVyLmVtaXQoJ3RyYW5zaXRpb25TdGFydCcpO1xuXG4gICAgaWYgKHJ1bkNhbGxiYWNrcyAmJiBhY3RpdmVJbmRleCAhPT0gcHJldmlvdXNJbmRleCkge1xuICAgICAgaWYgKGRpciA9PT0gJ3Jlc2V0Jykge1xuICAgICAgICBzd2lwZXIuZW1pdCgnc2xpZGVSZXNldFRyYW5zaXRpb25TdGFydCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzd2lwZXIuZW1pdCgnc2xpZGVDaGFuZ2VUcmFuc2l0aW9uU3RhcnQnKTtcbiAgICAgIGlmIChkaXIgPT09ICduZXh0Jykge1xuICAgICAgICBzd2lwZXIuZW1pdCgnc2xpZGVOZXh0VHJhbnNpdGlvblN0YXJ0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2lwZXIuZW1pdCgnc2xpZGVQcmV2VHJhbnNpdGlvblN0YXJ0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNpdGlvbkVuZCQxIChydW5DYWxsYmFja3MsIGRpcmVjdGlvbikge1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIHZhciBwcmV2aW91c0luZGV4ID0gc3dpcGVyLnByZXZpb3VzSW5kZXg7XG4gICAgc3dpcGVyLmFuaW1hdGluZyA9IGZhbHNlO1xuICAgIHN3aXBlci5zZXRUcmFuc2l0aW9uKDApO1xuXG4gICAgdmFyIGRpciA9IGRpcmVjdGlvbjtcbiAgICBpZiAoIWRpcikge1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID4gcHJldmlvdXNJbmRleCkgeyBkaXIgPSAnbmV4dCc7IH1cbiAgICAgIGVsc2UgaWYgKGFjdGl2ZUluZGV4IDwgcHJldmlvdXNJbmRleCkgeyBkaXIgPSAncHJldic7IH1cbiAgICAgIGVsc2UgeyBkaXIgPSAncmVzZXQnOyB9XG4gICAgfVxuXG4gICAgc3dpcGVyLmVtaXQoJ3RyYW5zaXRpb25FbmQnKTtcblxuICAgIGlmIChydW5DYWxsYmFja3MgJiYgYWN0aXZlSW5kZXggIT09IHByZXZpb3VzSW5kZXgpIHtcbiAgICAgIGlmIChkaXIgPT09ICdyZXNldCcpIHtcbiAgICAgICAgc3dpcGVyLmVtaXQoJ3NsaWRlUmVzZXRUcmFuc2l0aW9uRW5kJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN3aXBlci5lbWl0KCdzbGlkZUNoYW5nZVRyYW5zaXRpb25FbmQnKTtcbiAgICAgIGlmIChkaXIgPT09ICduZXh0Jykge1xuICAgICAgICBzd2lwZXIuZW1pdCgnc2xpZGVOZXh0VHJhbnNpdGlvbkVuZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLmVtaXQoJ3NsaWRlUHJldlRyYW5zaXRpb25FbmQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdHJhbnNpdGlvbiQxID0ge1xuICAgIHNldFRyYW5zaXRpb246IHNldFRyYW5zaXRpb24sXG4gICAgdHJhbnNpdGlvblN0YXJ0OiB0cmFuc2l0aW9uU3RhcnQsXG4gICAgdHJhbnNpdGlvbkVuZDogdHJhbnNpdGlvbkVuZCQxLFxuICB9O1xuXG4gIGZ1bmN0aW9uIHNsaWRlVG8gKGluZGV4LCBzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCkge1xuICAgIGlmICggaW5kZXggPT09IHZvaWQgMCApIGluZGV4ID0gMDtcbiAgICBpZiAoIHNwZWVkID09PSB2b2lkIDAgKSBzcGVlZCA9IHRoaXMucGFyYW1zLnNwZWVkO1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHNsaWRlSW5kZXggPSBpbmRleDtcbiAgICBpZiAoc2xpZGVJbmRleCA8IDApIHsgc2xpZGVJbmRleCA9IDA7IH1cblxuICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuICAgIHZhciBzbmFwR3JpZCA9IHN3aXBlci5zbmFwR3JpZDtcbiAgICB2YXIgc2xpZGVzR3JpZCA9IHN3aXBlci5zbGlkZXNHcmlkO1xuICAgIHZhciBwcmV2aW91c0luZGV4ID0gc3dpcGVyLnByZXZpb3VzSW5kZXg7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIHZhciBydGwgPSBzd2lwZXIucnRsVHJhbnNsYXRlO1xuICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nICYmIHBhcmFtcy5wcmV2ZW50SW50ZXJhY3Rpb25PblRyYW5zaXRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgc25hcEluZGV4ID0gTWF0aC5mbG9vcihzbGlkZUluZGV4IC8gcGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgICBpZiAoc25hcEluZGV4ID49IHNuYXBHcmlkLmxlbmd0aCkgeyBzbmFwSW5kZXggPSBzbmFwR3JpZC5sZW5ndGggLSAxOyB9XG5cbiAgICBpZiAoKGFjdGl2ZUluZGV4IHx8IHBhcmFtcy5pbml0aWFsU2xpZGUgfHwgMCkgPT09IChwcmV2aW91c0luZGV4IHx8IDApICYmIHJ1bkNhbGxiYWNrcykge1xuICAgICAgc3dpcGVyLmVtaXQoJ2JlZm9yZVNsaWRlQ2hhbmdlU3RhcnQnKTtcbiAgICB9XG5cbiAgICB2YXIgdHJhbnNsYXRlID0gLXNuYXBHcmlkW3NuYXBJbmRleF07XG5cbiAgICAvLyBVcGRhdGUgcHJvZ3Jlc3NcbiAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3ModHJhbnNsYXRlKTtcblxuICAgIC8vIE5vcm1hbGl6ZSBzbGlkZUluZGV4XG4gICAgaWYgKHBhcmFtcy5ub3JtYWxpemVTbGlkZUluZGV4KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlc0dyaWQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKC1NYXRoLmZsb29yKHRyYW5zbGF0ZSAqIDEwMCkgPj0gTWF0aC5mbG9vcihzbGlkZXNHcmlkW2ldICogMTAwKSkge1xuICAgICAgICAgIHNsaWRlSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIERpcmVjdGlvbnMgbG9ja3NcbiAgICBpZiAoc3dpcGVyLmluaXRpYWxpemVkICYmIHNsaWRlSW5kZXggIT09IGFjdGl2ZUluZGV4KSB7XG4gICAgICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlTmV4dCAmJiB0cmFuc2xhdGUgPCBzd2lwZXIudHJhbnNsYXRlICYmIHRyYW5zbGF0ZSA8IHN3aXBlci5taW5UcmFuc2xhdGUoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlUHJldiAmJiB0cmFuc2xhdGUgPiBzd2lwZXIudHJhbnNsYXRlICYmIHRyYW5zbGF0ZSA+IHN3aXBlci5tYXhUcmFuc2xhdGUoKSkge1xuICAgICAgICBpZiAoKGFjdGl2ZUluZGV4IHx8IDApICE9PSBzbGlkZUluZGV4KSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkaXJlY3Rpb247XG4gICAgaWYgKHNsaWRlSW5kZXggPiBhY3RpdmVJbmRleCkgeyBkaXJlY3Rpb24gPSAnbmV4dCc7IH1cbiAgICBlbHNlIGlmIChzbGlkZUluZGV4IDwgYWN0aXZlSW5kZXgpIHsgZGlyZWN0aW9uID0gJ3ByZXYnOyB9XG4gICAgZWxzZSB7IGRpcmVjdGlvbiA9ICdyZXNldCc7IH1cblxuXG4gICAgLy8gVXBkYXRlIEluZGV4XG4gICAgaWYgKChydGwgJiYgLXRyYW5zbGF0ZSA9PT0gc3dpcGVyLnRyYW5zbGF0ZSkgfHwgKCFydGwgJiYgdHJhbnNsYXRlID09PSBzd2lwZXIudHJhbnNsYXRlKSkge1xuICAgICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KHNsaWRlSW5kZXgpO1xuICAgICAgLy8gVXBkYXRlIEhlaWdodFxuICAgICAgaWYgKHBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgIHN3aXBlci51cGRhdGVBdXRvSGVpZ2h0KCk7XG4gICAgICB9XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICAgICAgaWYgKHBhcmFtcy5lZmZlY3QgIT09ICdzbGlkZScpIHtcbiAgICAgICAgc3dpcGVyLnNldFRyYW5zbGF0ZSh0cmFuc2xhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKGRpcmVjdGlvbiAhPT0gJ3Jlc2V0Jykge1xuICAgICAgICBzd2lwZXIudHJhbnNpdGlvblN0YXJ0KHJ1bkNhbGxiYWNrcywgZGlyZWN0aW9uKTtcbiAgICAgICAgc3dpcGVyLnRyYW5zaXRpb25FbmQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzcGVlZCA9PT0gMCB8fCAhU3VwcG9ydC50cmFuc2l0aW9uKSB7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbigwKTtcbiAgICAgIHN3aXBlci5zZXRUcmFuc2xhdGUodHJhbnNsYXRlKTtcbiAgICAgIHN3aXBlci51cGRhdGVBY3RpdmVJbmRleChzbGlkZUluZGV4KTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgICBzd2lwZXIuZW1pdCgnYmVmb3JlVHJhbnNpdGlvblN0YXJ0Jywgc3BlZWQsIGludGVybmFsKTtcbiAgICAgIHN3aXBlci50cmFuc2l0aW9uU3RhcnQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pO1xuICAgICAgc3dpcGVyLnRyYW5zaXRpb25FbmQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbihzcGVlZCk7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKHRyYW5zbGF0ZSk7XG4gICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoc2xpZGVJbmRleCk7XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICAgICAgc3dpcGVyLmVtaXQoJ2JlZm9yZVRyYW5zaXRpb25TdGFydCcsIHNwZWVkLCBpbnRlcm5hbCk7XG4gICAgICBzd2lwZXIudHJhbnNpdGlvblN0YXJ0KHJ1bkNhbGxiYWNrcywgZGlyZWN0aW9uKTtcbiAgICAgIGlmICghc3dpcGVyLmFuaW1hdGluZykge1xuICAgICAgICBzd2lwZXIuYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQpIHtcbiAgICAgICAgICBzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kKGUpIHtcbiAgICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbFswXS5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKTtcbiAgICAgICAgICAgIHN3aXBlci4kd3JhcHBlckVsWzBdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCBzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kID0gbnVsbDtcbiAgICAgICAgICAgIGRlbGV0ZSBzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQ7XG4gICAgICAgICAgICBzd2lwZXIudHJhbnNpdGlvbkVuZChydW5DYWxsYmFja3MsIGRpcmVjdGlvbik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbFswXS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKTtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWxbMF0uYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0VHJhbnNpdGlvbkVuZCcsIHN3aXBlci5vblNsaWRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBzbGlkZVRvTG9vcCAoaW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKSB7XG4gICAgaWYgKCBpbmRleCA9PT0gdm9pZCAwICkgaW5kZXggPSAwO1xuICAgIGlmICggc3BlZWQgPT09IHZvaWQgMCApIHNwZWVkID0gdGhpcy5wYXJhbXMuc3BlZWQ7XG4gICAgaWYgKCBydW5DYWxsYmFja3MgPT09IHZvaWQgMCApIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG5cbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgbmV3SW5kZXggPSBpbmRleDtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICBuZXdJbmRleCArPSBzd2lwZXIubG9vcGVkU2xpZGVzO1xuICAgIH1cblxuICAgIHJldHVybiBzd2lwZXIuc2xpZGVUbyhuZXdJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9XG5cbiAgLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG4gIGZ1bmN0aW9uIHNsaWRlTmV4dCAoc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpIHtcbiAgICBpZiAoIHNwZWVkID09PSB2b2lkIDAgKSBzcGVlZCA9IHRoaXMucGFyYW1zLnNwZWVkO1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIGFuaW1hdGluZyA9IHN3aXBlci5hbmltYXRpbmc7XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBpZiAoYW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgc3dpcGVyLl9jbGllbnRMZWZ0ID0gc3dpcGVyLiR3cmFwcGVyRWxbMF0uY2xpZW50TGVmdDtcbiAgICAgIHJldHVybiBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuYWN0aXZlSW5kZXggKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXAsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCArIHBhcmFtcy5zbGlkZXNQZXJHcm91cCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9XG5cbiAgLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG4gIGZ1bmN0aW9uIHNsaWRlUHJldiAoc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpIHtcbiAgICBpZiAoIHNwZWVkID09PSB2b2lkIDAgKSBzcGVlZCA9IHRoaXMucGFyYW1zLnNwZWVkO1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIGFuaW1hdGluZyA9IHN3aXBlci5hbmltYXRpbmc7XG4gICAgdmFyIHNuYXBHcmlkID0gc3dpcGVyLnNuYXBHcmlkO1xuICAgIHZhciBzbGlkZXNHcmlkID0gc3dpcGVyLnNsaWRlc0dyaWQ7XG4gICAgdmFyIHJ0bFRyYW5zbGF0ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG5cbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIGlmIChhbmltYXRpbmcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICBzd2lwZXIubG9vcEZpeCgpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBzd2lwZXIuX2NsaWVudExlZnQgPSBzd2lwZXIuJHdyYXBwZXJFbFswXS5jbGllbnRMZWZ0O1xuICAgIH1cbiAgICB2YXIgdHJhbnNsYXRlID0gcnRsVHJhbnNsYXRlID8gc3dpcGVyLnRyYW5zbGF0ZSA6IC1zd2lwZXIudHJhbnNsYXRlO1xuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZSh2YWwpIHtcbiAgICAgIGlmICh2YWwgPCAwKSB7IHJldHVybiAtTWF0aC5mbG9vcihNYXRoLmFicyh2YWwpKTsgfVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsKTtcbiAgICB9XG4gICAgdmFyIG5vcm1hbGl6ZWRUcmFuc2xhdGUgPSBub3JtYWxpemUodHJhbnNsYXRlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNuYXBHcmlkID0gc25hcEdyaWQubWFwKGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG5vcm1hbGl6ZSh2YWwpOyB9KTtcbiAgICB2YXIgbm9ybWFsaXplZFNsaWRlc0dyaWQgPSBzbGlkZXNHcmlkLm1hcChmdW5jdGlvbiAodmFsKSB7IHJldHVybiBub3JtYWxpemUodmFsKTsgfSk7XG5cbiAgICB2YXIgY3VycmVudFNuYXAgPSBzbmFwR3JpZFtub3JtYWxpemVkU25hcEdyaWQuaW5kZXhPZihub3JtYWxpemVkVHJhbnNsYXRlKV07XG4gICAgdmFyIHByZXZTbmFwID0gc25hcEdyaWRbbm9ybWFsaXplZFNuYXBHcmlkLmluZGV4T2Yobm9ybWFsaXplZFRyYW5zbGF0ZSkgLSAxXTtcbiAgICB2YXIgcHJldkluZGV4O1xuICAgIGlmICh0eXBlb2YgcHJldlNuYXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwcmV2SW5kZXggPSBzbGlkZXNHcmlkLmluZGV4T2YocHJldlNuYXApO1xuICAgICAgaWYgKHByZXZJbmRleCA8IDApIHsgcHJldkluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4IC0gMTsgfVxuICAgIH1cbiAgICByZXR1cm4gc3dpcGVyLnNsaWRlVG8ocHJldkluZGV4LCBzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCk7XG4gIH1cblxuICAvKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIgKi9cbiAgZnVuY3Rpb24gc2xpZGVSZXNldCAoc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpIHtcbiAgICBpZiAoIHNwZWVkID09PSB2b2lkIDAgKSBzcGVlZCA9IHRoaXMucGFyYW1zLnNwZWVkO1xuICAgIGlmICggcnVuQ2FsbGJhY2tzID09PSB2b2lkIDAgKSBydW5DYWxsYmFja3MgPSB0cnVlO1xuXG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgcmV0dXJuIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9XG5cbiAgLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG4gIGZ1bmN0aW9uIHNsaWRlVG9DbG9zZXN0IChzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCkge1xuICAgIGlmICggc3BlZWQgPT09IHZvaWQgMCApIHNwZWVkID0gdGhpcy5wYXJhbXMuc3BlZWQ7XG4gICAgaWYgKCBydW5DYWxsYmFja3MgPT09IHZvaWQgMCApIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG5cbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgaW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHNuYXBJbmRleCA9IE1hdGguZmxvb3IoaW5kZXggLyBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcblxuICAgIGlmIChzbmFwSW5kZXggPCBzd2lwZXIuc25hcEdyaWQubGVuZ3RoIC0gMSkge1xuICAgICAgdmFyIHRyYW5zbGF0ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlIDogLXN3aXBlci50cmFuc2xhdGU7XG5cbiAgICAgIHZhciBjdXJyZW50U25hcCA9IHN3aXBlci5zbmFwR3JpZFtzbmFwSW5kZXhdO1xuICAgICAgdmFyIG5leHRTbmFwID0gc3dpcGVyLnNuYXBHcmlkW3NuYXBJbmRleCArIDFdO1xuXG4gICAgICBpZiAoKHRyYW5zbGF0ZSAtIGN1cnJlbnRTbmFwKSA+IChuZXh0U25hcCAtIGN1cnJlbnRTbmFwKSAvIDIpIHtcbiAgICAgICAgaW5kZXggPSBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzd2lwZXIuc2xpZGVUbyhpbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2xpZGVUb0NsaWNrZWRTbGlkZSAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcblxuICAgIHZhciBzbGlkZXNQZXJWaWV3ID0gcGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyA/IHN3aXBlci5zbGlkZXNQZXJWaWV3RHluYW1pYygpIDogcGFyYW1zLnNsaWRlc1BlclZpZXc7XG4gICAgdmFyIHNsaWRlVG9JbmRleCA9IHN3aXBlci5jbGlja2VkSW5kZXg7XG4gICAgdmFyIHJlYWxJbmRleDtcbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nKSB7IHJldHVybjsgfVxuICAgICAgcmVhbEluZGV4ID0gcGFyc2VJbnQoJChzd2lwZXIuY2xpY2tlZFNsaWRlKS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpLCAxMCk7XG4gICAgICBpZiAocGFyYW1zLmNlbnRlcmVkU2xpZGVzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoc2xpZGVUb0luZGV4IDwgc3dpcGVyLmxvb3BlZFNsaWRlcyAtIChzbGlkZXNQZXJWaWV3IC8gMikpXG4gICAgICAgICAgfHwgKHNsaWRlVG9JbmRleCA+IChzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIHN3aXBlci5sb29wZWRTbGlkZXMpICsgKHNsaWRlc1BlclZpZXcgLyAyKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgICAgICBzbGlkZVRvSW5kZXggPSAkd3JhcHBlckVsXG4gICAgICAgICAgICAuY2hpbGRyZW4oKFwiLlwiICsgKHBhcmFtcy5zbGlkZUNsYXNzKSArIFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIHJlYWxJbmRleCArIFwiXFxcIl06bm90KC5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIilcIikpXG4gICAgICAgICAgICAuZXEoMClcbiAgICAgICAgICAgIC5pbmRleCgpO1xuXG4gICAgICAgICAgVXRpbHMubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlVG8oc2xpZGVUb0luZGV4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUbyhzbGlkZVRvSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNsaWRlVG9JbmRleCA+IHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gc2xpZGVzUGVyVmlldykge1xuICAgICAgICBzd2lwZXIubG9vcEZpeCgpO1xuICAgICAgICBzbGlkZVRvSW5kZXggPSAkd3JhcHBlckVsXG4gICAgICAgICAgLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyByZWFsSW5kZXggKyBcIlxcXCJdOm5vdCguXCIgKyAocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCIpXCIpKVxuICAgICAgICAgIC5lcSgwKVxuICAgICAgICAgIC5pbmRleCgpO1xuXG4gICAgICAgIFV0aWxzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUbyhzbGlkZVRvSW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHNsaWRlVG9JbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHNsaWRlVG9JbmRleCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWRlID0ge1xuICAgIHNsaWRlVG86IHNsaWRlVG8sXG4gICAgc2xpZGVUb0xvb3A6IHNsaWRlVG9Mb29wLFxuICAgIHNsaWRlTmV4dDogc2xpZGVOZXh0LFxuICAgIHNsaWRlUHJldjogc2xpZGVQcmV2LFxuICAgIHNsaWRlUmVzZXQ6IHNsaWRlUmVzZXQsXG4gICAgc2xpZGVUb0Nsb3Nlc3Q6IHNsaWRlVG9DbG9zZXN0LFxuICAgIHNsaWRlVG9DbGlja2VkU2xpZGU6IHNsaWRlVG9DbGlja2VkU2xpZGUsXG4gIH07XG5cbiAgZnVuY3Rpb24gbG9vcENyZWF0ZSAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICAvLyBSZW1vdmUgZHVwbGljYXRlZCBzbGlkZXNcbiAgICAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykgKyBcIi5cIiArIChwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykpKS5yZW1vdmUoKTtcblxuICAgIHZhciBzbGlkZXMgPSAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykpKTtcblxuICAgIGlmIChwYXJhbXMubG9vcEZpbGxHcm91cFdpdGhCbGFuaykge1xuICAgICAgdmFyIGJsYW5rU2xpZGVzTnVtID0gcGFyYW1zLnNsaWRlc1Blckdyb3VwIC0gKHNsaWRlcy5sZW5ndGggJSBwYXJhbXMuc2xpZGVzUGVyR3JvdXApO1xuICAgICAgaWYgKGJsYW5rU2xpZGVzTnVtICE9PSBwYXJhbXMuc2xpZGVzUGVyR3JvdXApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibGFua1NsaWRlc051bTsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIGJsYW5rTm9kZSA9ICQoZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpKS5hZGRDbGFzcygoKHBhcmFtcy5zbGlkZUNsYXNzKSArIFwiIFwiICsgKHBhcmFtcy5zbGlkZUJsYW5rQ2xhc3MpKSk7XG4gICAgICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoYmxhbmtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBzbGlkZXMgPSAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChwYXJhbXMuc2xpZGVDbGFzcykpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyAmJiAhcGFyYW1zLmxvb3BlZFNsaWRlcykgeyBwYXJhbXMubG9vcGVkU2xpZGVzID0gc2xpZGVzLmxlbmd0aDsgfVxuXG4gICAgc3dpcGVyLmxvb3BlZFNsaWRlcyA9IHBhcnNlSW50KHBhcmFtcy5sb29wZWRTbGlkZXMgfHwgcGFyYW1zLnNsaWRlc1BlclZpZXcsIDEwKTtcbiAgICBzd2lwZXIubG9vcGVkU2xpZGVzICs9IHBhcmFtcy5sb29wQWRkaXRpb25hbFNsaWRlcztcbiAgICBpZiAoc3dpcGVyLmxvb3BlZFNsaWRlcyA+IHNsaWRlcy5sZW5ndGgpIHtcbiAgICAgIHN3aXBlci5sb29wZWRTbGlkZXMgPSBzbGlkZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciBwcmVwZW5kU2xpZGVzID0gW107XG4gICAgdmFyIGFwcGVuZFNsaWRlcyA9IFtdO1xuICAgIHNsaWRlcy5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWwpIHtcbiAgICAgIHZhciBzbGlkZSA9ICQoZWwpO1xuICAgICAgaWYgKGluZGV4IDwgc3dpcGVyLmxvb3BlZFNsaWRlcykgeyBhcHBlbmRTbGlkZXMucHVzaChlbCk7IH1cbiAgICAgIGlmIChpbmRleCA8IHNsaWRlcy5sZW5ndGggJiYgaW5kZXggPj0gc2xpZGVzLmxlbmd0aCAtIHN3aXBlci5sb29wZWRTbGlkZXMpIHsgcHJlcGVuZFNsaWRlcy5wdXNoKGVsKTsgfVxuICAgICAgc2xpZGUuYXR0cignZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnLCBpbmRleCk7XG4gICAgfSk7XG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgYXBwZW5kU2xpZGVzLmxlbmd0aDsgaSQxICs9IDEpIHtcbiAgICAgICR3cmFwcGVyRWwuYXBwZW5kKCQoYXBwZW5kU2xpZGVzW2kkMV0uY2xvbmVOb2RlKHRydWUpKS5hZGRDbGFzcyhwYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpJDIgPSBwcmVwZW5kU2xpZGVzLmxlbmd0aCAtIDE7IGkkMiA+PSAwOyBpJDIgLT0gMSkge1xuICAgICAgJHdyYXBwZXJFbC5wcmVwZW5kKCQocHJlcGVuZFNsaWRlc1tpJDJdLmNsb25lTm9kZSh0cnVlKSkuYWRkQ2xhc3MocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb29wRml4ICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgdmFyIGxvb3BlZFNsaWRlcyA9IHN3aXBlci5sb29wZWRTbGlkZXM7XG4gICAgdmFyIGFsbG93U2xpZGVQcmV2ID0gc3dpcGVyLmFsbG93U2xpZGVQcmV2O1xuICAgIHZhciBhbGxvd1NsaWRlTmV4dCA9IHN3aXBlci5hbGxvd1NsaWRlTmV4dDtcbiAgICB2YXIgc25hcEdyaWQgPSBzd2lwZXIuc25hcEdyaWQ7XG4gICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgdmFyIG5ld0luZGV4O1xuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IHRydWU7XG4gICAgc3dpcGVyLmFsbG93U2xpZGVOZXh0ID0gdHJ1ZTtcblxuICAgIHZhciBzbmFwVHJhbnNsYXRlID0gLXNuYXBHcmlkW2FjdGl2ZUluZGV4XTtcbiAgICB2YXIgZGlmZiA9IHNuYXBUcmFuc2xhdGUgLSBzd2lwZXIuZ2V0VHJhbnNsYXRlKCk7XG5cblxuICAgIC8vIEZpeCBGb3IgTmVnYXRpdmUgT3ZlcnNsaWRpbmdcbiAgICBpZiAoYWN0aXZlSW5kZXggPCBsb29wZWRTbGlkZXMpIHtcbiAgICAgIG5ld0luZGV4ID0gKHNsaWRlcy5sZW5ndGggLSAobG9vcGVkU2xpZGVzICogMykpICsgYWN0aXZlSW5kZXg7XG4gICAgICBuZXdJbmRleCArPSBsb29wZWRTbGlkZXM7XG4gICAgICB2YXIgc2xpZGVDaGFuZ2VkID0gc3dpcGVyLnNsaWRlVG8obmV3SW5kZXgsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIGlmIChzbGlkZUNoYW5nZWQgJiYgZGlmZiAhPT0gMCkge1xuICAgICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKChydGwgPyAtc3dpcGVyLnRyYW5zbGF0ZSA6IHN3aXBlci50cmFuc2xhdGUpIC0gZGlmZik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgocGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyAmJiBhY3RpdmVJbmRleCA+PSBsb29wZWRTbGlkZXMgKiAyKSB8fCAoYWN0aXZlSW5kZXggPj0gc2xpZGVzLmxlbmd0aCAtIGxvb3BlZFNsaWRlcykpIHtcbiAgICAgIC8vIEZpeCBGb3IgUG9zaXRpdmUgT3ZlcnNsaWRpbmdcbiAgICAgIG5ld0luZGV4ID0gLXNsaWRlcy5sZW5ndGggKyBhY3RpdmVJbmRleCArIGxvb3BlZFNsaWRlcztcbiAgICAgIG5ld0luZGV4ICs9IGxvb3BlZFNsaWRlcztcbiAgICAgIHZhciBzbGlkZUNoYW5nZWQkMSA9IHN3aXBlci5zbGlkZVRvKG5ld0luZGV4LCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICBpZiAoc2xpZGVDaGFuZ2VkJDEgJiYgZGlmZiAhPT0gMCkge1xuICAgICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKChydGwgPyAtc3dpcGVyLnRyYW5zbGF0ZSA6IHN3aXBlci50cmFuc2xhdGUpIC0gZGlmZik7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGFsbG93U2xpZGVQcmV2O1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGFsbG93U2xpZGVOZXh0O1xuICB9XG5cbiAgZnVuY3Rpb24gbG9vcERlc3Ryb3kgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciAkd3JhcHBlckVsID0gc3dpcGVyLiR3cmFwcGVyRWw7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgJHdyYXBwZXJFbC5jaGlsZHJlbigoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpICsgXCIuXCIgKyAocGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCIsLlwiICsgKHBhcmFtcy5zbGlkZUNsYXNzKSArIFwiLlwiICsgKHBhcmFtcy5zbGlkZUJsYW5rQ2xhc3MpKSkucmVtb3ZlKCk7XG4gICAgc2xpZGVzLnJlbW92ZUF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4Jyk7XG4gIH1cblxuICB2YXIgbG9vcCA9IHtcbiAgICBsb29wQ3JlYXRlOiBsb29wQ3JlYXRlLFxuICAgIGxvb3BGaXg6IGxvb3BGaXgsXG4gICAgbG9vcERlc3Ryb3k6IGxvb3BEZXN0cm95LFxuICB9O1xuXG4gIGZ1bmN0aW9uIHNldEdyYWJDdXJzb3IgKG1vdmluZykge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIGlmIChTdXBwb3J0LnRvdWNoIHx8ICFzd2lwZXIucGFyYW1zLnNpbXVsYXRlVG91Y2ggfHwgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzd2lwZXIuaXNMb2NrZWQpKSB7IHJldHVybjsgfVxuICAgIHZhciBlbCA9IHN3aXBlci5lbDtcbiAgICBlbC5zdHlsZS5jdXJzb3IgPSAnbW92ZSc7XG4gICAgZWwuc3R5bGUuY3Vyc29yID0gbW92aW5nID8gJy13ZWJraXQtZ3JhYmJpbmcnIDogJy13ZWJraXQtZ3JhYic7XG4gICAgZWwuc3R5bGUuY3Vyc29yID0gbW92aW5nID8gJy1tb3otZ3JhYmJpbicgOiAnLW1vei1ncmFiJztcbiAgICBlbC5zdHlsZS5jdXJzb3IgPSBtb3ZpbmcgPyAnZ3JhYmJpbmcnIDogJ2dyYWInO1xuICB9XG5cbiAgZnVuY3Rpb24gdW5zZXRHcmFiQ3Vyc29yICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoU3VwcG9ydC50b3VjaCB8fCAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93ICYmIHN3aXBlci5pc0xvY2tlZCkpIHsgcmV0dXJuOyB9XG4gICAgc3dpcGVyLmVsLnN0eWxlLmN1cnNvciA9ICcnO1xuICB9XG5cbiAgdmFyIGdyYWJDdXJzb3IgPSB7XG4gICAgc2V0R3JhYkN1cnNvcjogc2V0R3JhYkN1cnNvcixcbiAgICB1bnNldEdyYWJDdXJzb3I6IHVuc2V0R3JhYkN1cnNvcixcbiAgfTtcblxuICBmdW5jdGlvbiBhcHBlbmRTbGlkZSAoc2xpZGVzKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIHN3aXBlci5sb29wRGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNsaWRlcyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gc2xpZGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoc2xpZGVzW2ldKSB7ICR3cmFwcGVyRWwuYXBwZW5kKHNsaWRlc1tpXSk7IH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoc2xpZGVzKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBzd2lwZXIubG9vcENyZWF0ZSgpO1xuICAgIH1cbiAgICBpZiAoIShwYXJhbXMub2JzZXJ2ZXIgJiYgU3VwcG9ydC5vYnNlcnZlcikpIHtcbiAgICAgIHN3aXBlci51cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwZW5kU2xpZGUgKHNsaWRlcykge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuICAgIHZhciAkd3JhcHBlckVsID0gc3dpcGVyLiR3cmFwcGVyRWw7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuXG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBzd2lwZXIubG9vcERlc3Ryb3koKTtcbiAgICB9XG4gICAgdmFyIG5ld0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggKyAxO1xuICAgIGlmICh0eXBlb2Ygc2xpZGVzID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBzbGlkZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChzbGlkZXNbaV0pIHsgJHdyYXBwZXJFbC5wcmVwZW5kKHNsaWRlc1tpXSk7IH1cbiAgICAgIH1cbiAgICAgIG5ld0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggKyBzbGlkZXMubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICAkd3JhcHBlckVsLnByZXBlbmQoc2xpZGVzKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBzd2lwZXIubG9vcENyZWF0ZSgpO1xuICAgIH1cbiAgICBpZiAoIShwYXJhbXMub2JzZXJ2ZXIgJiYgU3VwcG9ydC5vYnNlcnZlcikpIHtcbiAgICAgIHN3aXBlci51cGRhdGUoKTtcbiAgICB9XG4gICAgc3dpcGVyLnNsaWRlVG8obmV3QWN0aXZlSW5kZXgsIDAsIGZhbHNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFNsaWRlIChpbmRleCwgc2xpZGVzKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdmFyIGFjdGl2ZUluZGV4QnVmZmVyID0gYWN0aXZlSW5kZXg7XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBhY3RpdmVJbmRleEJ1ZmZlciAtPSBzd2lwZXIubG9vcGVkU2xpZGVzO1xuICAgICAgc3dpcGVyLmxvb3BEZXN0cm95KCk7XG4gICAgICBzd2lwZXIuc2xpZGVzID0gJHdyYXBwZXJFbC5jaGlsZHJlbigoXCIuXCIgKyAocGFyYW1zLnNsaWRlQ2xhc3MpKSk7XG4gICAgfVxuICAgIHZhciBiYXNlTGVuZ3RoID0gc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gICAgaWYgKGluZGV4IDw9IDApIHtcbiAgICAgIHN3aXBlci5wcmVwZW5kU2xpZGUoc2xpZGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZGV4ID49IGJhc2VMZW5ndGgpIHtcbiAgICAgIHN3aXBlci5hcHBlbmRTbGlkZShzbGlkZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmV3QWN0aXZlSW5kZXggPSBhY3RpdmVJbmRleEJ1ZmZlciA+IGluZGV4ID8gYWN0aXZlSW5kZXhCdWZmZXIgKyAxIDogYWN0aXZlSW5kZXhCdWZmZXI7XG5cbiAgICB2YXIgc2xpZGVzQnVmZmVyID0gW107XG4gICAgZm9yICh2YXIgaSA9IGJhc2VMZW5ndGggLSAxOyBpID49IGluZGV4OyBpIC09IDEpIHtcbiAgICAgIHZhciBjdXJyZW50U2xpZGUgPSBzd2lwZXIuc2xpZGVzLmVxKGkpO1xuICAgICAgY3VycmVudFNsaWRlLnJlbW92ZSgpO1xuICAgICAgc2xpZGVzQnVmZmVyLnVuc2hpZnQoY3VycmVudFNsaWRlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNsaWRlcyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gc2xpZGVzKSB7XG4gICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBzbGlkZXMubGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgICAgICBpZiAoc2xpZGVzW2kkMV0pIHsgJHdyYXBwZXJFbC5hcHBlbmQoc2xpZGVzW2kkMV0pOyB9XG4gICAgICB9XG4gICAgICBuZXdBY3RpdmVJbmRleCA9IGFjdGl2ZUluZGV4QnVmZmVyID4gaW5kZXggPyBhY3RpdmVJbmRleEJ1ZmZlciArIHNsaWRlcy5sZW5ndGggOiBhY3RpdmVJbmRleEJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoc2xpZGVzKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCBzbGlkZXNCdWZmZXIubGVuZ3RoOyBpJDIgKz0gMSkge1xuICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoc2xpZGVzQnVmZmVyW2kkMl0pO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLmxvb3BDcmVhdGUoKTtcbiAgICB9XG4gICAgaWYgKCEocGFyYW1zLm9ic2VydmVyICYmIFN1cHBvcnQub2JzZXJ2ZXIpKSB7XG4gICAgICBzd2lwZXIudXBkYXRlKCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLnNsaWRlVG8obmV3QWN0aXZlSW5kZXggKyBzd2lwZXIubG9vcGVkU2xpZGVzLCAwLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKG5ld0FjdGl2ZUluZGV4LCAwLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlU2xpZGUgKHNsaWRlc0luZGV4ZXMpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgIHZhciBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcblxuICAgIHZhciBhY3RpdmVJbmRleEJ1ZmZlciA9IGFjdGl2ZUluZGV4O1xuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgYWN0aXZlSW5kZXhCdWZmZXIgLT0gc3dpcGVyLmxvb3BlZFNsaWRlcztcbiAgICAgIHN3aXBlci5sb29wRGVzdHJveSgpO1xuICAgICAgc3dpcGVyLnNsaWRlcyA9ICR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHBhcmFtcy5zbGlkZUNsYXNzKSkpO1xuICAgIH1cbiAgICB2YXIgbmV3QWN0aXZlSW5kZXggPSBhY3RpdmVJbmRleEJ1ZmZlcjtcbiAgICB2YXIgaW5kZXhUb1JlbW92ZTtcblxuICAgIGlmICh0eXBlb2Ygc2xpZGVzSW5kZXhlcyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gc2xpZGVzSW5kZXhlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGlkZXNJbmRleGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGluZGV4VG9SZW1vdmUgPSBzbGlkZXNJbmRleGVzW2ldO1xuICAgICAgICBpZiAoc3dpcGVyLnNsaWRlc1tpbmRleFRvUmVtb3ZlXSkgeyBzd2lwZXIuc2xpZGVzLmVxKGluZGV4VG9SZW1vdmUpLnJlbW92ZSgpOyB9XG4gICAgICAgIGlmIChpbmRleFRvUmVtb3ZlIDwgbmV3QWN0aXZlSW5kZXgpIHsgbmV3QWN0aXZlSW5kZXggLT0gMTsgfVxuICAgICAgfVxuICAgICAgbmV3QWN0aXZlSW5kZXggPSBNYXRoLm1heChuZXdBY3RpdmVJbmRleCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4VG9SZW1vdmUgPSBzbGlkZXNJbmRleGVzO1xuICAgICAgaWYgKHN3aXBlci5zbGlkZXNbaW5kZXhUb1JlbW92ZV0pIHsgc3dpcGVyLnNsaWRlcy5lcShpbmRleFRvUmVtb3ZlKS5yZW1vdmUoKTsgfVxuICAgICAgaWYgKGluZGV4VG9SZW1vdmUgPCBuZXdBY3RpdmVJbmRleCkgeyBuZXdBY3RpdmVJbmRleCAtPSAxOyB9XG4gICAgICBuZXdBY3RpdmVJbmRleCA9IE1hdGgubWF4KG5ld0FjdGl2ZUluZGV4LCAwKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgIHN3aXBlci5sb29wQ3JlYXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCEocGFyYW1zLm9ic2VydmVyICYmIFN1cHBvcnQub2JzZXJ2ZXIpKSB7XG4gICAgICBzd2lwZXIudXBkYXRlKCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLnNsaWRlVG8obmV3QWN0aXZlSW5kZXggKyBzd2lwZXIubG9vcGVkU2xpZGVzLCAwLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKG5ld0FjdGl2ZUluZGV4LCAwLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQWxsU2xpZGVzICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgIHZhciBzbGlkZXNJbmRleGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzd2lwZXIuc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBzbGlkZXNJbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICAgIHN3aXBlci5yZW1vdmVTbGlkZShzbGlkZXNJbmRleGVzKTtcbiAgfVxuXG4gIHZhciBtYW5pcHVsYXRpb24gPSB7XG4gICAgYXBwZW5kU2xpZGU6IGFwcGVuZFNsaWRlLFxuICAgIHByZXBlbmRTbGlkZTogcHJlcGVuZFNsaWRlLFxuICAgIGFkZFNsaWRlOiBhZGRTbGlkZSxcbiAgICByZW1vdmVTbGlkZTogcmVtb3ZlU2xpZGUsXG4gICAgcmVtb3ZlQWxsU2xpZGVzOiByZW1vdmVBbGxTbGlkZXMsXG4gIH07XG5cbiAgdmFyIERldmljZSA9IChmdW5jdGlvbiBEZXZpY2UoKSB7XG4gICAgdmFyIHVhID0gd2luLm5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICB2YXIgZGV2aWNlID0ge1xuICAgICAgaW9zOiBmYWxzZSxcbiAgICAgIGFuZHJvaWQ6IGZhbHNlLFxuICAgICAgYW5kcm9pZENocm9tZTogZmFsc2UsXG4gICAgICBkZXNrdG9wOiBmYWxzZSxcbiAgICAgIHdpbmRvd3M6IGZhbHNlLFxuICAgICAgaXBob25lOiBmYWxzZSxcbiAgICAgIGlwb2Q6IGZhbHNlLFxuICAgICAgaXBhZDogZmFsc2UsXG4gICAgICBjb3Jkb3ZhOiB3aW4uY29yZG92YSB8fCB3aW4ucGhvbmVnYXAsXG4gICAgICBwaG9uZWdhcDogd2luLmNvcmRvdmEgfHwgd2luLnBob25lZ2FwLFxuICAgIH07XG5cbiAgICB2YXIgd2luZG93cyA9IHVhLm1hdGNoKC8oV2luZG93cyBQaG9uZSk7P1tcXHNcXC9dKyhbXFxkLl0rKT8vKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIHZhciBhbmRyb2lkID0gdWEubWF0Y2goLyhBbmRyb2lkKTs/W1xcc1xcL10rKFtcXGQuXSspPy8pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgdmFyIGlwYWQgPSB1YS5tYXRjaCgvKGlQYWQpLipPU1xccyhbXFxkX10rKS8pO1xuICAgIHZhciBpcG9kID0gdWEubWF0Y2goLyhpUG9kKSguKk9TXFxzKFtcXGRfXSspKT8vKTtcbiAgICB2YXIgaXBob25lID0gIWlwYWQgJiYgdWEubWF0Y2goLyhpUGhvbmVcXHNPU3xpT1MpXFxzKFtcXGRfXSspLyk7XG5cblxuICAgIC8vIFdpbmRvd3NcbiAgICBpZiAod2luZG93cykge1xuICAgICAgZGV2aWNlLm9zID0gJ3dpbmRvd3MnO1xuICAgICAgZGV2aWNlLm9zVmVyc2lvbiA9IHdpbmRvd3NbMl07XG4gICAgICBkZXZpY2Uud2luZG93cyA9IHRydWU7XG4gICAgfVxuICAgIC8vIEFuZHJvaWRcbiAgICBpZiAoYW5kcm9pZCAmJiAhd2luZG93cykge1xuICAgICAgZGV2aWNlLm9zID0gJ2FuZHJvaWQnO1xuICAgICAgZGV2aWNlLm9zVmVyc2lvbiA9IGFuZHJvaWRbMl07XG4gICAgICBkZXZpY2UuYW5kcm9pZCA9IHRydWU7XG4gICAgICBkZXZpY2UuYW5kcm9pZENocm9tZSA9IHVhLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY2hyb21lJykgPj0gMDtcbiAgICB9XG4gICAgaWYgKGlwYWQgfHwgaXBob25lIHx8IGlwb2QpIHtcbiAgICAgIGRldmljZS5vcyA9ICdpb3MnO1xuICAgICAgZGV2aWNlLmlvcyA9IHRydWU7XG4gICAgfVxuICAgIC8vIGlPU1xuICAgIGlmIChpcGhvbmUgJiYgIWlwb2QpIHtcbiAgICAgIGRldmljZS5vc1ZlcnNpb24gPSBpcGhvbmVbMl0ucmVwbGFjZSgvXy9nLCAnLicpO1xuICAgICAgZGV2aWNlLmlwaG9uZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChpcGFkKSB7XG4gICAgICBkZXZpY2Uub3NWZXJzaW9uID0gaXBhZFsyXS5yZXBsYWNlKC9fL2csICcuJyk7XG4gICAgICBkZXZpY2UuaXBhZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChpcG9kKSB7XG4gICAgICBkZXZpY2Uub3NWZXJzaW9uID0gaXBvZFszXSA/IGlwb2RbM10ucmVwbGFjZSgvXy9nLCAnLicpIDogbnVsbDtcbiAgICAgIGRldmljZS5pcGhvbmUgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBpT1MgOCsgY2hhbmdlZCBVQVxuICAgIGlmIChkZXZpY2UuaW9zICYmIGRldmljZS5vc1ZlcnNpb24gJiYgdWEuaW5kZXhPZignVmVyc2lvbi8nKSA+PSAwKSB7XG4gICAgICBpZiAoZGV2aWNlLm9zVmVyc2lvbi5zcGxpdCgnLicpWzBdID09PSAnMTAnKSB7XG4gICAgICAgIGRldmljZS5vc1ZlcnNpb24gPSB1YS50b0xvd2VyQ2FzZSgpLnNwbGl0KCd2ZXJzaW9uLycpWzFdLnNwbGl0KCcgJylbMF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVza3RvcFxuICAgIGRldmljZS5kZXNrdG9wID0gIShkZXZpY2Uub3MgfHwgZGV2aWNlLmFuZHJvaWQgfHwgZGV2aWNlLndlYlZpZXcpO1xuXG4gICAgLy8gV2Vidmlld1xuICAgIGRldmljZS53ZWJWaWV3ID0gKGlwaG9uZSB8fCBpcGFkIHx8IGlwb2QpICYmIHVhLm1hdGNoKC8uKkFwcGxlV2ViS2l0KD8hLipTYWZhcmkpL2kpO1xuXG4gICAgLy8gTWluaW1hbCBVSVxuICAgIGlmIChkZXZpY2Uub3MgJiYgZGV2aWNlLm9zID09PSAnaW9zJykge1xuICAgICAgdmFyIG9zVmVyc2lvbkFyciA9IGRldmljZS5vc1ZlcnNpb24uc3BsaXQoJy4nKTtcbiAgICAgIHZhciBtZXRhVmlld3BvcnQgPSBkb2MucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidmlld3BvcnRcIl0nKTtcbiAgICAgIGRldmljZS5taW5pbWFsVWkgPSAhZGV2aWNlLndlYlZpZXdcbiAgICAgICAgJiYgKGlwb2QgfHwgaXBob25lKVxuICAgICAgICAmJiAob3NWZXJzaW9uQXJyWzBdICogMSA9PT0gNyA/IG9zVmVyc2lvbkFyclsxXSAqIDEgPj0gMSA6IG9zVmVyc2lvbkFyclswXSAqIDEgPiA3KVxuICAgICAgICAmJiBtZXRhVmlld3BvcnQgJiYgbWV0YVZpZXdwb3J0LmdldEF0dHJpYnV0ZSgnY29udGVudCcpLmluZGV4T2YoJ21pbmltYWwtdWknKSA+PSAwO1xuICAgIH1cblxuICAgIC8vIFBpeGVsIFJhdGlvXG4gICAgZGV2aWNlLnBpeGVsUmF0aW8gPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuXG4gICAgLy8gRXhwb3J0IG9iamVjdFxuICAgIHJldHVybiBkZXZpY2U7XG4gIH0oKSk7XG5cbiAgZnVuY3Rpb24gb25Ub3VjaFN0YXJ0IChldmVudCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBkYXRhID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YTtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgdG91Y2hlcyA9IHN3aXBlci50b3VjaGVzO1xuICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nICYmIHBhcmFtcy5wcmV2ZW50SW50ZXJhY3Rpb25PblRyYW5zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGUgPSBldmVudDtcbiAgICBpZiAoZS5vcmlnaW5hbEV2ZW50KSB7IGUgPSBlLm9yaWdpbmFsRXZlbnQ7IH1cbiAgICBkYXRhLmlzVG91Y2hFdmVudCA9IGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnO1xuICAgIGlmICghZGF0YS5pc1RvdWNoRXZlbnQgJiYgJ3doaWNoJyBpbiBlICYmIGUud2hpY2ggPT09IDMpIHsgcmV0dXJuOyB9XG4gICAgaWYgKCFkYXRhLmlzVG91Y2hFdmVudCAmJiAnYnV0dG9uJyBpbiBlICYmIGUuYnV0dG9uID4gMCkgeyByZXR1cm47IH1cbiAgICBpZiAoZGF0YS5pc1RvdWNoZWQgJiYgZGF0YS5pc01vdmVkKSB7IHJldHVybjsgfVxuICAgIGlmIChwYXJhbXMubm9Td2lwaW5nICYmICQoZS50YXJnZXQpLmNsb3Nlc3QocGFyYW1zLm5vU3dpcGluZ1NlbGVjdG9yID8gcGFyYW1zLm5vU3dpcGluZ1NlbGVjdG9yIDogKFwiLlwiICsgKHBhcmFtcy5ub1N3aXBpbmdDbGFzcykpKVswXSkge1xuICAgICAgc3dpcGVyLmFsbG93Q2xpY2sgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnN3aXBlSGFuZGxlcikge1xuICAgICAgaWYgKCEkKGUpLmNsb3Nlc3QocGFyYW1zLnN3aXBlSGFuZGxlcilbMF0pIHsgcmV0dXJuOyB9XG4gICAgfVxuXG4gICAgdG91Y2hlcy5jdXJyZW50WCA9IGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYIDogZS5wYWdlWDtcbiAgICB0b3VjaGVzLmN1cnJlbnRZID0gZS50eXBlID09PSAndG91Y2hzdGFydCcgPyBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVkgOiBlLnBhZ2VZO1xuICAgIHZhciBzdGFydFggPSB0b3VjaGVzLmN1cnJlbnRYO1xuICAgIHZhciBzdGFydFkgPSB0b3VjaGVzLmN1cnJlbnRZO1xuXG4gICAgLy8gRG8gTk9UIHN0YXJ0IGlmIGlPUyBlZGdlIHN3aXBlIGlzIGRldGVjdGVkLiBPdGhlcndpc2UgaU9TIGFwcCAoVUlXZWJWaWV3KSBjYW5ub3Qgc3dpcGUtdG8tZ28tYmFjayBhbnltb3JlXG5cbiAgICB2YXIgZWRnZVN3aXBlRGV0ZWN0aW9uID0gcGFyYW1zLmVkZ2VTd2lwZURldGVjdGlvbiB8fCBwYXJhbXMuaU9TRWRnZVN3aXBlRGV0ZWN0aW9uO1xuICAgIHZhciBlZGdlU3dpcGVUaHJlc2hvbGQgPSBwYXJhbXMuZWRnZVN3aXBlVGhyZXNob2xkIHx8IHBhcmFtcy5pT1NFZGdlU3dpcGVUaHJlc2hvbGQ7XG4gICAgaWYgKFxuICAgICAgZWRnZVN3aXBlRGV0ZWN0aW9uXG4gICAgICAmJiAoKHN0YXJ0WCA8PSBlZGdlU3dpcGVUaHJlc2hvbGQpXG4gICAgICB8fCAoc3RhcnRYID49IHdpbi5zY3JlZW4ud2lkdGggLSBlZGdlU3dpcGVUaHJlc2hvbGQpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIFV0aWxzLmV4dGVuZChkYXRhLCB7XG4gICAgICBpc1RvdWNoZWQ6IHRydWUsXG4gICAgICBpc01vdmVkOiBmYWxzZSxcbiAgICAgIGFsbG93VG91Y2hDYWxsYmFja3M6IHRydWUsXG4gICAgICBpc1Njcm9sbGluZzogdW5kZWZpbmVkLFxuICAgICAgc3RhcnRNb3Zpbmc6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHRvdWNoZXMuc3RhcnRYID0gc3RhcnRYO1xuICAgIHRvdWNoZXMuc3RhcnRZID0gc3RhcnRZO1xuICAgIGRhdGEudG91Y2hTdGFydFRpbWUgPSBVdGlscy5ub3coKTtcbiAgICBzd2lwZXIuYWxsb3dDbGljayA9IHRydWU7XG4gICAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcbiAgICBzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmFtcy50aHJlc2hvbGQgPiAwKSB7IGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlID0gZmFsc2U7IH1cbiAgICBpZiAoZS50eXBlICE9PSAndG91Y2hzdGFydCcpIHtcbiAgICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgICBpZiAoJChlLnRhcmdldCkuaXMoZGF0YS5mb3JtRWxlbWVudHMpKSB7IHByZXZlbnREZWZhdWx0ID0gZmFsc2U7IH1cbiAgICAgIGlmIChcbiAgICAgICAgZG9jLmFjdGl2ZUVsZW1lbnRcbiAgICAgICAgJiYgJChkb2MuYWN0aXZlRWxlbWVudCkuaXMoZGF0YS5mb3JtRWxlbWVudHMpXG4gICAgICAgICYmIGRvYy5hY3RpdmVFbGVtZW50ICE9PSBlLnRhcmdldFxuICAgICAgKSB7XG4gICAgICAgIGRvYy5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3VsZFByZXZlbnREZWZhdWx0ID0gcHJldmVudERlZmF1bHQgJiYgc3dpcGVyLmFsbG93VG91Y2hNb3ZlICYmIHBhcmFtcy50b3VjaFN0YXJ0UHJldmVudERlZmF1bHQ7XG4gICAgICBpZiAocGFyYW1zLnRvdWNoU3RhcnRGb3JjZVByZXZlbnREZWZhdWx0IHx8IHNob3VsZFByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ3RvdWNoU3RhcnQnLCBlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlIChldmVudCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBkYXRhID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YTtcbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgdG91Y2hlcyA9IHN3aXBlci50b3VjaGVzO1xuICAgIHZhciBydGwgPSBzd2lwZXIucnRsVHJhbnNsYXRlO1xuICAgIHZhciBlID0gZXZlbnQ7XG4gICAgaWYgKGUub3JpZ2luYWxFdmVudCkgeyBlID0gZS5vcmlnaW5hbEV2ZW50OyB9XG4gICAgaWYgKCFkYXRhLmlzVG91Y2hlZCkge1xuICAgICAgaWYgKGRhdGEuc3RhcnRNb3ZpbmcgJiYgZGF0YS5pc1Njcm9sbGluZykge1xuICAgICAgICBzd2lwZXIuZW1pdCgndG91Y2hNb3ZlT3Bwb3NpdGUnLCBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRhdGEuaXNUb3VjaEV2ZW50ICYmIGUudHlwZSA9PT0gJ21vdXNlbW92ZScpIHsgcmV0dXJuOyB9XG4gICAgdmFyIHBhZ2VYID0gZS50eXBlID09PSAndG91Y2htb3ZlJyA/IGUudGFyZ2V0VG91Y2hlc1swXS5wYWdlWCA6IGUucGFnZVg7XG4gICAgdmFyIHBhZ2VZID0gZS50eXBlID09PSAndG91Y2htb3ZlJyA/IGUudGFyZ2V0VG91Y2hlc1swXS5wYWdlWSA6IGUucGFnZVk7XG4gICAgaWYgKGUucHJldmVudGVkQnlOZXN0ZWRTd2lwZXIpIHtcbiAgICAgIHRvdWNoZXMuc3RhcnRYID0gcGFnZVg7XG4gICAgICB0b3VjaGVzLnN0YXJ0WSA9IHBhZ2VZO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXN3aXBlci5hbGxvd1RvdWNoTW92ZSkge1xuICAgICAgLy8gaXNNb3ZlZCA9IHRydWU7XG4gICAgICBzd2lwZXIuYWxsb3dDbGljayA9IGZhbHNlO1xuICAgICAgaWYgKGRhdGEuaXNUb3VjaGVkKSB7XG4gICAgICAgIFV0aWxzLmV4dGVuZCh0b3VjaGVzLCB7XG4gICAgICAgICAgc3RhcnRYOiBwYWdlWCxcbiAgICAgICAgICBzdGFydFk6IHBhZ2VZLFxuICAgICAgICAgIGN1cnJlbnRYOiBwYWdlWCxcbiAgICAgICAgICBjdXJyZW50WTogcGFnZVksXG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhLnRvdWNoU3RhcnRUaW1lID0gVXRpbHMubm93KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkYXRhLmlzVG91Y2hFdmVudCAmJiBwYXJhbXMudG91Y2hSZWxlYXNlT25FZGdlcyAmJiAhcGFyYW1zLmxvb3ApIHtcbiAgICAgIGlmIChzd2lwZXIuaXNWZXJ0aWNhbCgpKSB7XG4gICAgICAgIC8vIFZlcnRpY2FsXG4gICAgICAgIGlmIChcbiAgICAgICAgICAocGFnZVkgPCB0b3VjaGVzLnN0YXJ0WSAmJiBzd2lwZXIudHJhbnNsYXRlIDw9IHN3aXBlci5tYXhUcmFuc2xhdGUoKSlcbiAgICAgICAgICB8fCAocGFnZVkgPiB0b3VjaGVzLnN0YXJ0WSAmJiBzd2lwZXIudHJhbnNsYXRlID49IHN3aXBlci5taW5UcmFuc2xhdGUoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGF0YS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgICBkYXRhLmlzTW92ZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChwYWdlWCA8IHRvdWNoZXMuc3RhcnRYICYmIHN3aXBlci50cmFuc2xhdGUgPD0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpKVxuICAgICAgICB8fCAocGFnZVggPiB0b3VjaGVzLnN0YXJ0WCAmJiBzd2lwZXIudHJhbnNsYXRlID49IHN3aXBlci5taW5UcmFuc2xhdGUoKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLmlzVG91Y2hFdmVudCAmJiBkb2MuYWN0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKGUudGFyZ2V0ID09PSBkb2MuYWN0aXZlRWxlbWVudCAmJiAkKGUudGFyZ2V0KS5pcyhkYXRhLmZvcm1FbGVtZW50cykpIHtcbiAgICAgICAgZGF0YS5pc01vdmVkID0gdHJ1ZTtcbiAgICAgICAgc3dpcGVyLmFsbG93Q2xpY2sgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5hbGxvd1RvdWNoQ2FsbGJhY2tzKSB7XG4gICAgICBzd2lwZXIuZW1pdCgndG91Y2hNb3ZlJywgZSk7XG4gICAgfVxuICAgIGlmIChlLnRhcmdldFRvdWNoZXMgJiYgZS50YXJnZXRUb3VjaGVzLmxlbmd0aCA+IDEpIHsgcmV0dXJuOyB9XG5cbiAgICB0b3VjaGVzLmN1cnJlbnRYID0gcGFnZVg7XG4gICAgdG91Y2hlcy5jdXJyZW50WSA9IHBhZ2VZO1xuXG4gICAgdmFyIGRpZmZYID0gdG91Y2hlcy5jdXJyZW50WCAtIHRvdWNoZXMuc3RhcnRYO1xuICAgIHZhciBkaWZmWSA9IHRvdWNoZXMuY3VycmVudFkgLSB0b3VjaGVzLnN0YXJ0WTtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy50aHJlc2hvbGQgJiYgTWF0aC5zcXJ0KChNYXRoLnBvdyggZGlmZlgsIDIgKSkgKyAoTWF0aC5wb3coIGRpZmZZLCAyICkpKSA8IHN3aXBlci5wYXJhbXMudGhyZXNob2xkKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhLmlzU2Nyb2xsaW5nID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHRvdWNoQW5nbGU7XG4gICAgICBpZiAoKHN3aXBlci5pc0hvcml6b250YWwoKSAmJiB0b3VjaGVzLmN1cnJlbnRZID09PSB0b3VjaGVzLnN0YXJ0WSkgfHwgKHN3aXBlci5pc1ZlcnRpY2FsKCkgJiYgdG91Y2hlcy5jdXJyZW50WCA9PT0gdG91Y2hlcy5zdGFydFgpKSB7XG4gICAgICAgIGRhdGEuaXNTY3JvbGxpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBpZiAoKGRpZmZYICogZGlmZlgpICsgKGRpZmZZICogZGlmZlkpID49IDI1KSB7XG4gICAgICAgICAgdG91Y2hBbmdsZSA9IChNYXRoLmF0YW4yKE1hdGguYWJzKGRpZmZZKSwgTWF0aC5hYnMoZGlmZlgpKSAqIDE4MCkgLyBNYXRoLlBJO1xuICAgICAgICAgIGRhdGEuaXNTY3JvbGxpbmcgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyB0b3VjaEFuZ2xlID4gcGFyYW1zLnRvdWNoQW5nbGUgOiAoOTAgLSB0b3VjaEFuZ2xlID4gcGFyYW1zLnRvdWNoQW5nbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLmlzU2Nyb2xsaW5nKSB7XG4gICAgICBzd2lwZXIuZW1pdCgndG91Y2hNb3ZlT3Bwb3NpdGUnLCBlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLnN0YXJ0TW92aW5nID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHRvdWNoZXMuY3VycmVudFggIT09IHRvdWNoZXMuc3RhcnRYIHx8IHRvdWNoZXMuY3VycmVudFkgIT09IHRvdWNoZXMuc3RhcnRZKSB7XG4gICAgICAgIGRhdGEuc3RhcnRNb3ZpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5pc1Njcm9sbGluZykge1xuICAgICAgZGF0YS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFkYXRhLnN0YXJ0TW92aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXBlci5hbGxvd0NsaWNrID0gZmFsc2U7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChwYXJhbXMudG91Y2hNb3ZlU3RvcFByb3BhZ2F0aW9uICYmICFwYXJhbXMubmVzdGVkKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5pc01vdmVkKSB7XG4gICAgICBpZiAocGFyYW1zLmxvb3ApIHtcbiAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgIH1cbiAgICAgIGRhdGEuc3RhcnRUcmFuc2xhdGUgPSBzd2lwZXIuZ2V0VHJhbnNsYXRlKCk7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbigwKTtcbiAgICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nKSB7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLnRyaWdnZXIoJ3dlYmtpdFRyYW5zaXRpb25FbmQgdHJhbnNpdGlvbmVuZCcpO1xuICAgICAgfVxuICAgICAgZGF0YS5hbGxvd01vbWVudHVtQm91bmNlID0gZmFsc2U7XG4gICAgICAvLyBHcmFiIEN1cnNvclxuICAgICAgaWYgKHBhcmFtcy5ncmFiQ3Vyc29yICYmIChzd2lwZXIuYWxsb3dTbGlkZU5leHQgPT09IHRydWUgfHwgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID09PSB0cnVlKSkge1xuICAgICAgICBzd2lwZXIuc2V0R3JhYkN1cnNvcih0cnVlKTtcbiAgICAgIH1cbiAgICAgIHN3aXBlci5lbWl0KCdzbGlkZXJGaXJzdE1vdmUnLCBlKTtcbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ3NsaWRlck1vdmUnLCBlKTtcbiAgICBkYXRhLmlzTW92ZWQgPSB0cnVlO1xuXG4gICAgdmFyIGRpZmYgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBkaWZmWCA6IGRpZmZZO1xuICAgIHRvdWNoZXMuZGlmZiA9IGRpZmY7XG5cbiAgICBkaWZmICo9IHBhcmFtcy50b3VjaFJhdGlvO1xuICAgIGlmIChydGwpIHsgZGlmZiA9IC1kaWZmOyB9XG5cbiAgICBzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPSBkaWZmID4gMCA/ICdwcmV2JyA6ICduZXh0JztcbiAgICBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPSBkaWZmICsgZGF0YS5zdGFydFRyYW5zbGF0ZTtcblxuICAgIHZhciBkaXNhYmxlUGFyZW50U3dpcGVyID0gdHJ1ZTtcbiAgICB2YXIgcmVzaXN0YW5jZVJhdGlvID0gcGFyYW1zLnJlc2lzdGFuY2VSYXRpbztcbiAgICBpZiAocGFyYW1zLnRvdWNoUmVsZWFzZU9uRWRnZXMpIHtcbiAgICAgIHJlc2lzdGFuY2VSYXRpbyA9IDA7XG4gICAgfVxuICAgIGlmICgoZGlmZiA+IDAgJiYgZGF0YS5jdXJyZW50VHJhbnNsYXRlID4gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSkge1xuICAgICAgZGlzYWJsZVBhcmVudFN3aXBlciA9IGZhbHNlO1xuICAgICAgaWYgKHBhcmFtcy5yZXNpc3RhbmNlKSB7IGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IChzd2lwZXIubWluVHJhbnNsYXRlKCkgLSAxKSArIChNYXRoLnBvdyggKC1zd2lwZXIubWluVHJhbnNsYXRlKCkgKyBkYXRhLnN0YXJ0VHJhbnNsYXRlICsgZGlmZiksIHJlc2lzdGFuY2VSYXRpbyApKTsgfVxuICAgIH0gZWxzZSBpZiAoZGlmZiA8IDAgJiYgZGF0YS5jdXJyZW50VHJhbnNsYXRlIDwgc3dpcGVyLm1heFRyYW5zbGF0ZSgpKSB7XG4gICAgICBkaXNhYmxlUGFyZW50U3dpcGVyID0gZmFsc2U7XG4gICAgICBpZiAocGFyYW1zLnJlc2lzdGFuY2UpIHsgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gKHN3aXBlci5tYXhUcmFuc2xhdGUoKSArIDEpIC0gKE1hdGgucG93KCAoc3dpcGVyLm1heFRyYW5zbGF0ZSgpIC0gZGF0YS5zdGFydFRyYW5zbGF0ZSAtIGRpZmYpLCByZXNpc3RhbmNlUmF0aW8gKSk7IH1cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZVBhcmVudFN3aXBlcikge1xuICAgICAgZS5wcmV2ZW50ZWRCeU5lc3RlZFN3aXBlciA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gRGlyZWN0aW9ucyBsb2Nrc1xuICAgIGlmICghc3dpcGVyLmFsbG93U2xpZGVOZXh0ICYmIHN3aXBlci5zd2lwZURpcmVjdGlvbiA9PT0gJ25leHQnICYmIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA8IGRhdGEuc3RhcnRUcmFuc2xhdGUpIHtcbiAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IGRhdGEuc3RhcnRUcmFuc2xhdGU7XG4gICAgfVxuICAgIGlmICghc3dpcGVyLmFsbG93U2xpZGVQcmV2ICYmIHN3aXBlci5zd2lwZURpcmVjdGlvbiA9PT0gJ3ByZXYnICYmIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA+IGRhdGEuc3RhcnRUcmFuc2xhdGUpIHtcbiAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IGRhdGEuc3RhcnRUcmFuc2xhdGU7XG4gICAgfVxuXG5cbiAgICAvLyBUaHJlc2hvbGRcbiAgICBpZiAocGFyYW1zLnRocmVzaG9sZCA+IDApIHtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmKSA+IHBhcmFtcy50aHJlc2hvbGQgfHwgZGF0YS5hbGxvd1RocmVzaG9sZE1vdmUpIHtcbiAgICAgICAgaWYgKCFkYXRhLmFsbG93VGhyZXNob2xkTW92ZSkge1xuICAgICAgICAgIGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlID0gdHJ1ZTtcbiAgICAgICAgICB0b3VjaGVzLnN0YXJ0WCA9IHRvdWNoZXMuY3VycmVudFg7XG4gICAgICAgICAgdG91Y2hlcy5zdGFydFkgPSB0b3VjaGVzLmN1cnJlbnRZO1xuICAgICAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IGRhdGEuc3RhcnRUcmFuc2xhdGU7XG4gICAgICAgICAgdG91Y2hlcy5kaWZmID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gdG91Y2hlcy5jdXJyZW50WCAtIHRvdWNoZXMuc3RhcnRYIDogdG91Y2hlcy5jdXJyZW50WSAtIHRvdWNoZXMuc3RhcnRZO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmZvbGxvd0ZpbmdlcikgeyByZXR1cm47IH1cblxuICAgIC8vIFVwZGF0ZSBhY3RpdmUgaW5kZXggaW4gZnJlZSBtb2RlXG4gICAgaWYgKHBhcmFtcy5mcmVlTW9kZSB8fCBwYXJhbXMud2F0Y2hTbGlkZXNQcm9ncmVzcyB8fCBwYXJhbXMud2F0Y2hTbGlkZXNWaXNpYmlsaXR5KSB7XG4gICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZnJlZU1vZGUpIHtcbiAgICAgIC8vIFZlbG9jaXR5XG4gICAgICBpZiAoZGF0YS52ZWxvY2l0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkYXRhLnZlbG9jaXRpZXMucHVzaCh7XG4gICAgICAgICAgcG9zaXRpb246IHRvdWNoZXNbc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gJ3N0YXJ0WCcgOiAnc3RhcnRZJ10sXG4gICAgICAgICAgdGltZTogZGF0YS50b3VjaFN0YXJ0VGltZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkYXRhLnZlbG9jaXRpZXMucHVzaCh7XG4gICAgICAgIHBvc2l0aW9uOiB0b3VjaGVzW3N3aXBlci5pc0hvcml6b250YWwoKSA/ICdjdXJyZW50WCcgOiAnY3VycmVudFknXSxcbiAgICAgICAgdGltZTogVXRpbHMubm93KCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gVXBkYXRlIHByb2dyZXNzXG4gICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKGRhdGEuY3VycmVudFRyYW5zbGF0ZSk7XG4gICAgLy8gVXBkYXRlIHRyYW5zbGF0ZVxuICAgIHN3aXBlci5zZXRUcmFuc2xhdGUoZGF0YS5jdXJyZW50VHJhbnNsYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hFbmQgKGV2ZW50KSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIGRhdGEgPSBzd2lwZXIudG91Y2hFdmVudHNEYXRhO1xuXG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHRvdWNoZXMgPSBzd2lwZXIudG91Y2hlcztcbiAgICB2YXIgcnRsID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZTtcbiAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgIHZhciBzbGlkZXNHcmlkID0gc3dpcGVyLnNsaWRlc0dyaWQ7XG4gICAgdmFyIHNuYXBHcmlkID0gc3dpcGVyLnNuYXBHcmlkO1xuICAgIHZhciBlID0gZXZlbnQ7XG4gICAgaWYgKGUub3JpZ2luYWxFdmVudCkgeyBlID0gZS5vcmlnaW5hbEV2ZW50OyB9XG4gICAgaWYgKGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcykge1xuICAgICAgc3dpcGVyLmVtaXQoJ3RvdWNoRW5kJywgZSk7XG4gICAgfVxuICAgIGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcyA9IGZhbHNlO1xuICAgIGlmICghZGF0YS5pc1RvdWNoZWQpIHtcbiAgICAgIGlmIChkYXRhLmlzTW92ZWQgJiYgcGFyYW1zLmdyYWJDdXJzb3IpIHtcbiAgICAgICAgc3dpcGVyLnNldEdyYWJDdXJzb3IoZmFsc2UpO1xuICAgICAgfVxuICAgICAgZGF0YS5pc01vdmVkID0gZmFsc2U7XG4gICAgICBkYXRhLnN0YXJ0TW92aW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFJldHVybiBHcmFiIEN1cnNvclxuICAgIGlmIChwYXJhbXMuZ3JhYkN1cnNvciAmJiBkYXRhLmlzTW92ZWQgJiYgZGF0YS5pc1RvdWNoZWQgJiYgKHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9PT0gdHJ1ZSB8fCBzd2lwZXIuYWxsb3dTbGlkZVByZXYgPT09IHRydWUpKSB7XG4gICAgICBzd2lwZXIuc2V0R3JhYkN1cnNvcihmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gVGltZSBkaWZmXG4gICAgdmFyIHRvdWNoRW5kVGltZSA9IFV0aWxzLm5vdygpO1xuICAgIHZhciB0aW1lRGlmZiA9IHRvdWNoRW5kVGltZSAtIGRhdGEudG91Y2hTdGFydFRpbWU7XG5cbiAgICAvLyBUYXAsIGRvdWJsZVRhcCwgQ2xpY2tcbiAgICBpZiAoc3dpcGVyLmFsbG93Q2xpY2spIHtcbiAgICAgIHN3aXBlci51cGRhdGVDbGlja2VkU2xpZGUoZSk7XG4gICAgICBzd2lwZXIuZW1pdCgndGFwJywgZSk7XG4gICAgICBpZiAodGltZURpZmYgPCAzMDAgJiYgKHRvdWNoRW5kVGltZSAtIGRhdGEubGFzdENsaWNrVGltZSkgPiAzMDApIHtcbiAgICAgICAgaWYgKGRhdGEuY2xpY2tUaW1lb3V0KSB7IGNsZWFyVGltZW91dChkYXRhLmNsaWNrVGltZW91dCk7IH1cbiAgICAgICAgZGF0YS5jbGlja1RpbWVvdXQgPSBVdGlscy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzd2lwZXIuZW1pdCgnY2xpY2snLCBlKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lRGlmZiA8IDMwMCAmJiAodG91Y2hFbmRUaW1lIC0gZGF0YS5sYXN0Q2xpY2tUaW1lKSA8IDMwMCkge1xuICAgICAgICBpZiAoZGF0YS5jbGlja1RpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KGRhdGEuY2xpY2tUaW1lb3V0KTsgfVxuICAgICAgICBzd2lwZXIuZW1pdCgnZG91YmxlVGFwJywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGF0YS5sYXN0Q2xpY2tUaW1lID0gVXRpbHMubm93KCk7XG4gICAgVXRpbHMubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzd2lwZXIuZGVzdHJveWVkKSB7IHN3aXBlci5hbGxvd0NsaWNrID0gdHJ1ZTsgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFkYXRhLmlzVG91Y2hlZCB8fCAhZGF0YS5pc01vdmVkIHx8ICFzd2lwZXIuc3dpcGVEaXJlY3Rpb24gfHwgdG91Y2hlcy5kaWZmID09PSAwIHx8IGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9PT0gZGF0YS5zdGFydFRyYW5zbGF0ZSkge1xuICAgICAgZGF0YS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgIGRhdGEuaXNNb3ZlZCA9IGZhbHNlO1xuICAgICAgZGF0YS5zdGFydE1vdmluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhLmlzVG91Y2hlZCA9IGZhbHNlO1xuICAgIGRhdGEuaXNNb3ZlZCA9IGZhbHNlO1xuICAgIGRhdGEuc3RhcnRNb3ZpbmcgPSBmYWxzZTtcblxuICAgIHZhciBjdXJyZW50UG9zO1xuICAgIGlmIChwYXJhbXMuZm9sbG93RmluZ2VyKSB7XG4gICAgICBjdXJyZW50UG9zID0gcnRsID8gc3dpcGVyLnRyYW5zbGF0ZSA6IC1zd2lwZXIudHJhbnNsYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50UG9zID0gLWRhdGEuY3VycmVudFRyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZyZWVNb2RlKSB7XG4gICAgICBpZiAoY3VycmVudFBvcyA8IC1zd2lwZXIubWluVHJhbnNsYXRlKCkpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRQb3MgPiAtc3dpcGVyLm1heFRyYW5zbGF0ZSgpKSB7XG4gICAgICAgIGlmIChzd2lwZXIuc2xpZGVzLmxlbmd0aCA8IHNuYXBHcmlkLmxlbmd0aCkge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHNuYXBHcmlkLmxlbmd0aCAtIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLmZyZWVNb2RlTW9tZW50dW0pIHtcbiAgICAgICAgaWYgKGRhdGEudmVsb2NpdGllcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdmFyIGxhc3RNb3ZlRXZlbnQgPSBkYXRhLnZlbG9jaXRpZXMucG9wKCk7XG4gICAgICAgICAgdmFyIHZlbG9jaXR5RXZlbnQgPSBkYXRhLnZlbG9jaXRpZXMucG9wKCk7XG5cbiAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBsYXN0TW92ZUV2ZW50LnBvc2l0aW9uIC0gdmVsb2NpdHlFdmVudC5wb3NpdGlvbjtcbiAgICAgICAgICB2YXIgdGltZSA9IGxhc3RNb3ZlRXZlbnQudGltZSAtIHZlbG9jaXR5RXZlbnQudGltZTtcbiAgICAgICAgICBzd2lwZXIudmVsb2NpdHkgPSBkaXN0YW5jZSAvIHRpbWU7XG4gICAgICAgICAgc3dpcGVyLnZlbG9jaXR5IC89IDI7XG4gICAgICAgICAgaWYgKE1hdGguYWJzKHN3aXBlci52ZWxvY2l0eSkgPCBwYXJhbXMuZnJlZU1vZGVNaW5pbXVtVmVsb2NpdHkpIHtcbiAgICAgICAgICAgIHN3aXBlci52ZWxvY2l0eSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHRoaXMgaW1wbGllcyB0aGF0IHRoZSB1c2VyIHN0b3BwZWQgbW92aW5nIGEgZmluZ2VyIHRoZW4gcmVsZWFzZWQuXG4gICAgICAgICAgLy8gVGhlcmUgd291bGQgYmUgbm8gZXZlbnRzIHdpdGggZGlzdGFuY2UgemVybywgc28gdGhlIGxhc3QgZXZlbnQgaXMgc3RhbGUuXG4gICAgICAgICAgaWYgKHRpbWUgPiAxNTAgfHwgKFV0aWxzLm5vdygpIC0gbGFzdE1vdmVFdmVudC50aW1lKSA+IDMwMCkge1xuICAgICAgICAgICAgc3dpcGVyLnZlbG9jaXR5ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpcGVyLnZlbG9jaXR5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBzd2lwZXIudmVsb2NpdHkgKj0gcGFyYW1zLmZyZWVNb2RlTW9tZW50dW1WZWxvY2l0eVJhdGlvO1xuXG4gICAgICAgIGRhdGEudmVsb2NpdGllcy5sZW5ndGggPSAwO1xuICAgICAgICB2YXIgbW9tZW50dW1EdXJhdGlvbiA9IDEwMDAgKiBwYXJhbXMuZnJlZU1vZGVNb21lbnR1bVJhdGlvO1xuICAgICAgICB2YXIgbW9tZW50dW1EaXN0YW5jZSA9IHN3aXBlci52ZWxvY2l0eSAqIG1vbWVudHVtRHVyYXRpb247XG5cbiAgICAgICAgdmFyIG5ld1Bvc2l0aW9uID0gc3dpcGVyLnRyYW5zbGF0ZSArIG1vbWVudHVtRGlzdGFuY2U7XG4gICAgICAgIGlmIChydGwpIHsgbmV3UG9zaXRpb24gPSAtbmV3UG9zaXRpb247IH1cblxuICAgICAgICB2YXIgZG9Cb3VuY2UgPSBmYWxzZTtcbiAgICAgICAgdmFyIGFmdGVyQm91bmNlUG9zaXRpb247XG4gICAgICAgIHZhciBib3VuY2VBbW91bnQgPSBNYXRoLmFicyhzd2lwZXIudmVsb2NpdHkpICogMjAgKiBwYXJhbXMuZnJlZU1vZGVNb21lbnR1bUJvdW5jZVJhdGlvO1xuICAgICAgICB2YXIgbmVlZHNMb29wRml4O1xuICAgICAgICBpZiAobmV3UG9zaXRpb24gPCBzd2lwZXIubWF4VHJhbnNsYXRlKCkpIHtcbiAgICAgICAgICBpZiAocGFyYW1zLmZyZWVNb2RlTW9tZW50dW1Cb3VuY2UpIHtcbiAgICAgICAgICAgIGlmIChuZXdQb3NpdGlvbiArIHN3aXBlci5tYXhUcmFuc2xhdGUoKSA8IC1ib3VuY2VBbW91bnQpIHtcbiAgICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBib3VuY2VBbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZnRlckJvdW5jZVBvc2l0aW9uID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpO1xuICAgICAgICAgICAgZG9Cb3VuY2UgPSB0cnVlO1xuICAgICAgICAgICAgZGF0YS5hbGxvd01vbWVudHVtQm91bmNlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzd2lwZXIubWF4VHJhbnNsYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJhbXMubG9vcCAmJiBwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHsgbmVlZHNMb29wRml4ID0gdHJ1ZTsgfVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1Bvc2l0aW9uID4gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSB7XG4gICAgICAgICAgaWYgKHBhcmFtcy5mcmVlTW9kZU1vbWVudHVtQm91bmNlKSB7XG4gICAgICAgICAgICBpZiAobmV3UG9zaXRpb24gLSBzd2lwZXIubWluVHJhbnNsYXRlKCkgPiBib3VuY2VBbW91bnQpIHtcbiAgICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzd2lwZXIubWluVHJhbnNsYXRlKCkgKyBib3VuY2VBbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZnRlckJvdW5jZVBvc2l0aW9uID0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICAgICAgICAgICAgZG9Cb3VuY2UgPSB0cnVlO1xuICAgICAgICAgICAgZGF0YS5hbGxvd01vbWVudHVtQm91bmNlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzd2lwZXIubWluVHJhbnNsYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJhbXMubG9vcCAmJiBwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHsgbmVlZHNMb29wRml4ID0gdHJ1ZTsgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5mcmVlTW9kZVN0aWNreSkge1xuICAgICAgICAgIHZhciBuZXh0U2xpZGU7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzbmFwR3JpZC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgaWYgKHNuYXBHcmlkW2pdID4gLW5ld1Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgIG5leHRTbGlkZSA9IGo7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChNYXRoLmFicyhzbmFwR3JpZFtuZXh0U2xpZGVdIC0gbmV3UG9zaXRpb24pIDwgTWF0aC5hYnMoc25hcEdyaWRbbmV4dFNsaWRlIC0gMV0gLSBuZXdQb3NpdGlvbikgfHwgc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAnbmV4dCcpIHtcbiAgICAgICAgICAgIG5ld1Bvc2l0aW9uID0gc25hcEdyaWRbbmV4dFNsaWRlXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3UG9zaXRpb24gPSBzbmFwR3JpZFtuZXh0U2xpZGUgLSAxXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3UG9zaXRpb24gPSAtbmV3UG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZWRzTG9vcEZpeCkge1xuICAgICAgICAgIHN3aXBlci5vbmNlKCd0cmFuc2l0aW9uRW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaXggZHVyYXRpb25cbiAgICAgICAgaWYgKHN3aXBlci52ZWxvY2l0eSAhPT0gMCkge1xuICAgICAgICAgIGlmIChydGwpIHtcbiAgICAgICAgICAgIG1vbWVudHVtRHVyYXRpb24gPSBNYXRoLmFicygoLW5ld1Bvc2l0aW9uIC0gc3dpcGVyLnRyYW5zbGF0ZSkgLyBzd2lwZXIudmVsb2NpdHkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb21lbnR1bUR1cmF0aW9uID0gTWF0aC5hYnMoKG5ld1Bvc2l0aW9uIC0gc3dpcGVyLnRyYW5zbGF0ZSkgLyBzd2lwZXIudmVsb2NpdHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuZnJlZU1vZGVTdGlja3kpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUb0Nsb3Nlc3QoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyYW1zLmZyZWVNb2RlTW9tZW50dW1Cb3VuY2UgJiYgZG9Cb3VuY2UpIHtcbiAgICAgICAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3MoYWZ0ZXJCb3VuY2VQb3NpdGlvbik7XG4gICAgICAgICAgc3dpcGVyLnNldFRyYW5zaXRpb24obW9tZW50dW1EdXJhdGlvbik7XG4gICAgICAgICAgc3dpcGVyLnNldFRyYW5zbGF0ZShuZXdQb3NpdGlvbik7XG4gICAgICAgICAgc3dpcGVyLnRyYW5zaXRpb25TdGFydCh0cnVlLCBzd2lwZXIuc3dpcGVEaXJlY3Rpb24pO1xuICAgICAgICAgIHN3aXBlci5hbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICAgICR3cmFwcGVyRWwudHJhbnNpdGlvbkVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkIHx8ICFkYXRhLmFsbG93TW9tZW50dW1Cb3VuY2UpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBzd2lwZXIuZW1pdCgnbW9tZW50dW1Cb3VuY2UnKTtcblxuICAgICAgICAgICAgc3dpcGVyLnNldFRyYW5zaXRpb24ocGFyYW1zLnNwZWVkKTtcbiAgICAgICAgICAgIHN3aXBlci5zZXRUcmFuc2xhdGUoYWZ0ZXJCb3VuY2VQb3NpdGlvbik7XG4gICAgICAgICAgICAkd3JhcHBlckVsLnRyYW5zaXRpb25FbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgICBzd2lwZXIudHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3dpcGVyLnZlbG9jaXR5KSB7XG4gICAgICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKG5ld1Bvc2l0aW9uKTtcbiAgICAgICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbihtb21lbnR1bUR1cmF0aW9uKTtcbiAgICAgICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKG5ld1Bvc2l0aW9uKTtcbiAgICAgICAgICBzd2lwZXIudHJhbnNpdGlvblN0YXJ0KHRydWUsIHN3aXBlci5zd2lwZURpcmVjdGlvbik7XG4gICAgICAgICAgaWYgKCFzd2lwZXIuYW5pbWF0aW5nKSB7XG4gICAgICAgICAgICBzd2lwZXIuYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICR3cmFwcGVyRWwudHJhbnNpdGlvbkVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgIHN3aXBlci50cmFuc2l0aW9uRW5kKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKG5ld1Bvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXBlci51cGRhdGVBY3RpdmVJbmRleCgpO1xuICAgICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuZnJlZU1vZGVTdGlja3kpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG9DbG9zZXN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXJhbXMuZnJlZU1vZGVNb21lbnR1bSB8fCB0aW1lRGlmZiA+PSBwYXJhbXMubG9uZ1N3aXBlc01zKSB7XG4gICAgICAgIHN3aXBlci51cGRhdGVQcm9ncmVzcygpO1xuICAgICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGN1cnJlbnQgc2xpZGVcbiAgICB2YXIgc3RvcEluZGV4ID0gMDtcbiAgICB2YXIgZ3JvdXBTaXplID0gc3dpcGVyLnNsaWRlc1NpemVzR3JpZFswXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlc0dyaWQubGVuZ3RoOyBpICs9IHBhcmFtcy5zbGlkZXNQZXJHcm91cCkge1xuICAgICAgaWYgKHR5cGVvZiBzbGlkZXNHcmlkW2kgKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXBdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoY3VycmVudFBvcyA+PSBzbGlkZXNHcmlkW2ldICYmIGN1cnJlbnRQb3MgPCBzbGlkZXNHcmlkW2kgKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXBdKSB7XG4gICAgICAgICAgc3RvcEluZGV4ID0gaTtcbiAgICAgICAgICBncm91cFNpemUgPSBzbGlkZXNHcmlkW2kgKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXBdIC0gc2xpZGVzR3JpZFtpXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UG9zID49IHNsaWRlc0dyaWRbaV0pIHtcbiAgICAgICAgc3RvcEluZGV4ID0gaTtcbiAgICAgICAgZ3JvdXBTaXplID0gc2xpZGVzR3JpZFtzbGlkZXNHcmlkLmxlbmd0aCAtIDFdIC0gc2xpZGVzR3JpZFtzbGlkZXNHcmlkLmxlbmd0aCAtIDJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbmQgY3VycmVudCBzbGlkZSBzaXplXG4gICAgdmFyIHJhdGlvID0gKGN1cnJlbnRQb3MgLSBzbGlkZXNHcmlkW3N0b3BJbmRleF0pIC8gZ3JvdXBTaXplO1xuXG4gICAgaWYgKHRpbWVEaWZmID4gcGFyYW1zLmxvbmdTd2lwZXNNcykge1xuICAgICAgLy8gTG9uZyB0b3VjaGVzXG4gICAgICBpZiAoIXBhcmFtcy5sb25nU3dpcGVzKSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPT09ICduZXh0Jykge1xuICAgICAgICBpZiAocmF0aW8gPj0gcGFyYW1zLmxvbmdTd2lwZXNSYXRpbykgeyBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXggKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXApOyB9XG4gICAgICAgIGVsc2UgeyBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXgpOyB9XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAncHJldicpIHtcbiAgICAgICAgaWYgKHJhdGlvID4gKDEgLSBwYXJhbXMubG9uZ1N3aXBlc1JhdGlvKSkgeyBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXggKyBwYXJhbXMuc2xpZGVzUGVyR3JvdXApOyB9XG4gICAgICAgIGVsc2UgeyBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXgpOyB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNob3J0IHN3aXBlc1xuICAgICAgaWYgKCFwYXJhbXMuc2hvcnRTd2lwZXMpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5zd2lwZURpcmVjdGlvbiA9PT0gJ25leHQnKSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHN0b3BJbmRleCArIHBhcmFtcy5zbGlkZXNQZXJHcm91cCk7XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAncHJldicpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3RvcEluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvblJlc2l6ZSAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICB2YXIgZWwgPSBzd2lwZXIuZWw7XG5cbiAgICBpZiAoZWwgJiYgZWwub2Zmc2V0V2lkdGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAvLyBCcmVha3BvaW50c1xuICAgIGlmIChwYXJhbXMuYnJlYWtwb2ludHMpIHtcbiAgICAgIHN3aXBlci5zZXRCcmVha3BvaW50KCk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBsb2Nrc1xuICAgIHZhciBhbGxvd1NsaWRlTmV4dCA9IHN3aXBlci5hbGxvd1NsaWRlTmV4dDtcbiAgICB2YXIgYWxsb3dTbGlkZVByZXYgPSBzd2lwZXIuYWxsb3dTbGlkZVByZXY7XG4gICAgdmFyIHNuYXBHcmlkID0gc3dpcGVyLnNuYXBHcmlkO1xuXG4gICAgLy8gRGlzYWJsZSBsb2NrcyBvbiByZXNpemVcbiAgICBzd2lwZXIuYWxsb3dTbGlkZU5leHQgPSB0cnVlO1xuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IHRydWU7XG5cbiAgICBzd2lwZXIudXBkYXRlU2l6ZSgpO1xuICAgIHN3aXBlci51cGRhdGVTbGlkZXMoKTtcblxuICAgIGlmIChwYXJhbXMuZnJlZU1vZGUpIHtcbiAgICAgIHZhciBuZXdUcmFuc2xhdGUgPSBNYXRoLm1pbihNYXRoLm1heChzd2lwZXIudHJhbnNsYXRlLCBzd2lwZXIubWF4VHJhbnNsYXRlKCkpLCBzd2lwZXIubWluVHJhbnNsYXRlKCkpO1xuICAgICAgc3dpcGVyLnNldFRyYW5zbGF0ZShuZXdUcmFuc2xhdGUpO1xuICAgICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KCk7XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuXG4gICAgICBpZiAocGFyYW1zLmF1dG9IZWlnaHQpIHtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZUF1dG9IZWlnaHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgIGlmICgocGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyB8fCBwYXJhbXMuc2xpZGVzUGVyVmlldyA+IDEpICYmIHN3aXBlci5pc0VuZCAmJiAhc3dpcGVyLnBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIDEsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCwgMCwgZmFsc2UsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dpcGVyLmF1dG9wbGF5ICYmIHN3aXBlci5hdXRvcGxheS5ydW5uaW5nICYmIHN3aXBlci5hdXRvcGxheS5wYXVzZWQpIHtcbiAgICAgIHN3aXBlci5hdXRvcGxheS5ydW4oKTtcbiAgICB9XG4gICAgLy8gUmV0dXJuIGxvY2tzIGFmdGVyIHJlc2l6ZVxuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGFsbG93U2xpZGVQcmV2O1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGFsbG93U2xpZGVOZXh0O1xuXG4gICAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzbmFwR3JpZCAhPT0gc3dpcGVyLnNuYXBHcmlkKSB7XG4gICAgICBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ2xpY2sgKGUpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoIXN3aXBlci5hbGxvd0NsaWNrKSB7XG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5wcmV2ZW50Q2xpY2tzKSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMucHJldmVudENsaWNrc1Byb3BhZ2F0aW9uICYmIHN3aXBlci5hbmltYXRpbmcpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhdHRhY2hFdmVudHMoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHRvdWNoRXZlbnRzID0gc3dpcGVyLnRvdWNoRXZlbnRzO1xuICAgIHZhciBlbCA9IHN3aXBlci5lbDtcbiAgICB2YXIgd3JhcHBlckVsID0gc3dpcGVyLndyYXBwZXJFbDtcblxuICAgIHtcbiAgICAgIHN3aXBlci5vblRvdWNoU3RhcnQgPSBvblRvdWNoU3RhcnQuYmluZChzd2lwZXIpO1xuICAgICAgc3dpcGVyLm9uVG91Y2hNb3ZlID0gb25Ub3VjaE1vdmUuYmluZChzd2lwZXIpO1xuICAgICAgc3dpcGVyLm9uVG91Y2hFbmQgPSBvblRvdWNoRW5kLmJpbmQoc3dpcGVyKTtcbiAgICB9XG5cbiAgICBzd2lwZXIub25DbGljayA9IG9uQ2xpY2suYmluZChzd2lwZXIpO1xuXG4gICAgdmFyIHRhcmdldCA9IHBhcmFtcy50b3VjaEV2ZW50c1RhcmdldCA9PT0gJ2NvbnRhaW5lcicgPyBlbCA6IHdyYXBwZXJFbDtcbiAgICB2YXIgY2FwdHVyZSA9ICEhcGFyYW1zLm5lc3RlZDtcblxuICAgIC8vIFRvdWNoIEV2ZW50c1xuICAgIHtcbiAgICAgIGlmICghU3VwcG9ydC50b3VjaCAmJiAoU3VwcG9ydC5wb2ludGVyRXZlbnRzIHx8IFN1cHBvcnQucHJlZml4ZWRQb2ludGVyRXZlbnRzKSkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50cy5zdGFydCwgc3dpcGVyLm9uVG91Y2hTdGFydCwgZmFsc2UpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50cy5tb3ZlLCBzd2lwZXIub25Ub3VjaE1vdmUsIGNhcHR1cmUpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50cy5lbmQsIHN3aXBlci5vblRvdWNoRW5kLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoU3VwcG9ydC50b3VjaCkge1xuICAgICAgICAgIHZhciBwYXNzaXZlTGlzdGVuZXIgPSB0b3VjaEV2ZW50cy5zdGFydCA9PT0gJ3RvdWNoc3RhcnQnICYmIFN1cHBvcnQucGFzc2l2ZUxpc3RlbmVyICYmIHBhcmFtcy5wYXNzaXZlTGlzdGVuZXJzID8geyBwYXNzaXZlOiB0cnVlLCBjYXB0dXJlOiBmYWxzZSB9IDogZmFsc2U7XG4gICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHMuc3RhcnQsIHN3aXBlci5vblRvdWNoU3RhcnQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHMubW92ZSwgc3dpcGVyLm9uVG91Y2hNb3ZlLCBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciA/IHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGNhcHR1cmUgfSA6IGNhcHR1cmUpO1xuICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLmVuZCwgc3dpcGVyLm9uVG91Y2hFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwYXJhbXMuc2ltdWxhdGVUb3VjaCAmJiAhRGV2aWNlLmlvcyAmJiAhRGV2aWNlLmFuZHJvaWQpIHx8IChwYXJhbXMuc2ltdWxhdGVUb3VjaCAmJiAhU3VwcG9ydC50b3VjaCAmJiBEZXZpY2UuaW9zKSkge1xuICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBzd2lwZXIub25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG4gICAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN3aXBlci5vblRvdWNoTW92ZSwgY2FwdHVyZSk7XG4gICAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBzd2lwZXIub25Ub3VjaEVuZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBQcmV2ZW50IExpbmtzIENsaWNrc1xuICAgICAgaWYgKHBhcmFtcy5wcmV2ZW50Q2xpY2tzIHx8IHBhcmFtcy5wcmV2ZW50Q2xpY2tzUHJvcGFnYXRpb24pIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3dpcGVyLm9uQ2xpY2ssIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc2l6ZSBoYW5kbGVyXG4gICAgc3dpcGVyLm9uKChEZXZpY2UuaW9zIHx8IERldmljZS5hbmRyb2lkID8gJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZSBvYnNlcnZlclVwZGF0ZScgOiAncmVzaXplIG9ic2VydmVyVXBkYXRlJyksIG9uUmVzaXplLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRldGFjaEV2ZW50cygpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuICAgIHZhciB0b3VjaEV2ZW50cyA9IHN3aXBlci50b3VjaEV2ZW50cztcbiAgICB2YXIgZWwgPSBzd2lwZXIuZWw7XG4gICAgdmFyIHdyYXBwZXJFbCA9IHN3aXBlci53cmFwcGVyRWw7XG5cbiAgICB2YXIgdGFyZ2V0ID0gcGFyYW1zLnRvdWNoRXZlbnRzVGFyZ2V0ID09PSAnY29udGFpbmVyJyA/IGVsIDogd3JhcHBlckVsO1xuICAgIHZhciBjYXB0dXJlID0gISFwYXJhbXMubmVzdGVkO1xuXG4gICAgLy8gVG91Y2ggRXZlbnRzXG4gICAge1xuICAgICAgaWYgKCFTdXBwb3J0LnRvdWNoICYmIChTdXBwb3J0LnBvaW50ZXJFdmVudHMgfHwgU3VwcG9ydC5wcmVmaXhlZFBvaW50ZXJFdmVudHMpKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLnN0YXJ0LCBzd2lwZXIub25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLm1vdmUsIHN3aXBlci5vblRvdWNoTW92ZSwgY2FwdHVyZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLmVuZCwgc3dpcGVyLm9uVG91Y2hFbmQsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChTdXBwb3J0LnRvdWNoKSB7XG4gICAgICAgICAgdmFyIHBhc3NpdmVMaXN0ZW5lciA9IHRvdWNoRXZlbnRzLnN0YXJ0ID09PSAnb25Ub3VjaFN0YXJ0JyAmJiBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBwYXJhbXMucGFzc2l2ZUxpc3RlbmVycyA/IHsgcGFzc2l2ZTogdHJ1ZSwgY2FwdHVyZTogZmFsc2UgfSA6IGZhbHNlO1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLnN0YXJ0LCBzd2lwZXIub25Ub3VjaFN0YXJ0LCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzLm1vdmUsIHN3aXBlci5vblRvdWNoTW92ZSwgY2FwdHVyZSk7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHMuZW5kLCBzd2lwZXIub25Ub3VjaEVuZCwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHBhcmFtcy5zaW11bGF0ZVRvdWNoICYmICFEZXZpY2UuaW9zICYmICFEZXZpY2UuYW5kcm9pZCkgfHwgKHBhcmFtcy5zaW11bGF0ZVRvdWNoICYmICFTdXBwb3J0LnRvdWNoICYmIERldmljZS5pb3MpKSB7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHN3aXBlci5vblRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgc3dpcGVyLm9uVG91Y2hNb3ZlLCBjYXB0dXJlKTtcbiAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHN3aXBlci5vblRvdWNoRW5kLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFByZXZlbnQgTGlua3MgQ2xpY2tzXG4gICAgICBpZiAocGFyYW1zLnByZXZlbnRDbGlja3MgfHwgcGFyYW1zLnByZXZlbnRDbGlja3NQcm9wYWdhdGlvbikge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzd2lwZXIub25DbGljaywgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzaXplIGhhbmRsZXJcbiAgICBzd2lwZXIub2ZmKChEZXZpY2UuaW9zIHx8IERldmljZS5hbmRyb2lkID8gJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZSBvYnNlcnZlclVwZGF0ZScgOiAncmVzaXplIG9ic2VydmVyVXBkYXRlJyksIG9uUmVzaXplKTtcbiAgfVxuXG4gIHZhciBldmVudHMgPSB7XG4gICAgYXR0YWNoRXZlbnRzOiBhdHRhY2hFdmVudHMsXG4gICAgZGV0YWNoRXZlbnRzOiBkZXRhY2hFdmVudHMsXG4gIH07XG5cbiAgZnVuY3Rpb24gc2V0QnJlYWtwb2ludCAoKSB7XG4gICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIHZhciBpbml0aWFsaXplZCA9IHN3aXBlci5pbml0aWFsaXplZDtcbiAgICB2YXIgbG9vcGVkU2xpZGVzID0gc3dpcGVyLmxvb3BlZFNsaWRlczsgaWYgKCBsb29wZWRTbGlkZXMgPT09IHZvaWQgMCApIGxvb3BlZFNsaWRlcyA9IDA7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIGJyZWFrcG9pbnRzID0gcGFyYW1zLmJyZWFrcG9pbnRzO1xuICAgIGlmICghYnJlYWtwb2ludHMgfHwgKGJyZWFrcG9pbnRzICYmIE9iamVjdC5rZXlzKGJyZWFrcG9pbnRzKS5sZW5ndGggPT09IDApKSB7IHJldHVybjsgfVxuXG4gICAgLy8gU2V0IGJyZWFrcG9pbnQgZm9yIHdpbmRvdyB3aWR0aCBhbmQgdXBkYXRlIHBhcmFtZXRlcnNcbiAgICB2YXIgYnJlYWtwb2ludCA9IHN3aXBlci5nZXRCcmVha3BvaW50KGJyZWFrcG9pbnRzKTtcblxuICAgIGlmIChicmVha3BvaW50ICYmIHN3aXBlci5jdXJyZW50QnJlYWtwb2ludCAhPT0gYnJlYWtwb2ludCkge1xuICAgICAgdmFyIGJyZWFrcG9pbnRPbmx5UGFyYW1zID0gYnJlYWtwb2ludCBpbiBicmVha3BvaW50cyA/IGJyZWFrcG9pbnRzW2JyZWFrcG9pbnRdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGJyZWFrcG9pbnRPbmx5UGFyYW1zKSB7XG4gICAgICAgIFsnc2xpZGVzUGVyVmlldycsICdzcGFjZUJldHdlZW4nLCAnc2xpZGVzUGVyR3JvdXAnXS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgIHZhciBwYXJhbVZhbHVlID0gYnJlYWtwb2ludE9ubHlQYXJhbXNbcGFyYW1dO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1WYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgaWYgKHBhcmFtID09PSAnc2xpZGVzUGVyVmlldycgJiYgKHBhcmFtVmFsdWUgPT09ICdBVVRPJyB8fCBwYXJhbVZhbHVlID09PSAnYXV0bycpKSB7XG4gICAgICAgICAgICBicmVha3BvaW50T25seVBhcmFtc1twYXJhbV0gPSAnYXV0byc7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSA9PT0gJ3NsaWRlc1BlclZpZXcnKSB7XG4gICAgICAgICAgICBicmVha3BvaW50T25seVBhcmFtc1twYXJhbV0gPSBwYXJzZUZsb2F0KHBhcmFtVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVha3BvaW50T25seVBhcmFtc1twYXJhbV0gPSBwYXJzZUludChwYXJhbVZhbHVlLCAxMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJyZWFrcG9pbnRQYXJhbXMgPSBicmVha3BvaW50T25seVBhcmFtcyB8fCBzd2lwZXIub3JpZ2luYWxQYXJhbXM7XG4gICAgICB2YXIgZGlyZWN0aW9uQ2hhbmdlZCA9IGJyZWFrcG9pbnRQYXJhbXMuZGlyZWN0aW9uICYmIGJyZWFrcG9pbnRQYXJhbXMuZGlyZWN0aW9uICE9PSBwYXJhbXMuZGlyZWN0aW9uO1xuICAgICAgdmFyIG5lZWRzUmVMb29wID0gcGFyYW1zLmxvb3AgJiYgKGJyZWFrcG9pbnRQYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gcGFyYW1zLnNsaWRlc1BlclZpZXcgfHwgZGlyZWN0aW9uQ2hhbmdlZCk7XG5cbiAgICAgIGlmIChkaXJlY3Rpb25DaGFuZ2VkICYmIGluaXRpYWxpemVkKSB7XG4gICAgICAgIHN3aXBlci5jaGFuZ2VEaXJlY3Rpb24oKTtcbiAgICAgIH1cblxuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5wYXJhbXMsIGJyZWFrcG9pbnRQYXJhbXMpO1xuXG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGFsbG93VG91Y2hNb3ZlOiBzd2lwZXIucGFyYW1zLmFsbG93VG91Y2hNb3ZlLFxuICAgICAgICBhbGxvd1NsaWRlTmV4dDogc3dpcGVyLnBhcmFtcy5hbGxvd1NsaWRlTmV4dCxcbiAgICAgICAgYWxsb3dTbGlkZVByZXY6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZVByZXYsXG4gICAgICB9KTtcblxuICAgICAgc3dpcGVyLmN1cnJlbnRCcmVha3BvaW50ID0gYnJlYWtwb2ludDtcblxuICAgICAgaWYgKG5lZWRzUmVMb29wICYmIGluaXRpYWxpemVkKSB7XG4gICAgICAgIHN3aXBlci5sb29wRGVzdHJveSgpO1xuICAgICAgICBzd2lwZXIubG9vcENyZWF0ZSgpO1xuICAgICAgICBzd2lwZXIudXBkYXRlU2xpZGVzKCk7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKChhY3RpdmVJbmRleCAtIGxvb3BlZFNsaWRlcykgKyBzd2lwZXIubG9vcGVkU2xpZGVzLCAwLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHN3aXBlci5lbWl0KCdicmVha3BvaW50JywgYnJlYWtwb2ludFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QnJlYWtwb2ludCAoYnJlYWtwb2ludHMpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAvLyBHZXQgYnJlYWtwb2ludCBmb3Igd2luZG93IHdpZHRoXG4gICAgaWYgKCFicmVha3BvaW50cykgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgdmFyIGJyZWFrcG9pbnQgPSBmYWxzZTtcbiAgICB2YXIgcG9pbnRzID0gW107XG4gICAgT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLmZvckVhY2goZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICBwb2ludHMucHVzaChwb2ludCk7XG4gICAgfSk7XG4gICAgcG9pbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHBhcnNlSW50KGEsIDEwKSAtIHBhcnNlSW50KGIsIDEwKTsgfSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmJyZWFrcG9pbnRzSW52ZXJzZSkge1xuICAgICAgICBpZiAocG9pbnQgPD0gd2luLmlubmVyV2lkdGgpIHtcbiAgICAgICAgICBicmVha3BvaW50ID0gcG9pbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocG9pbnQgPj0gd2luLmlubmVyV2lkdGggJiYgIWJyZWFrcG9pbnQpIHtcbiAgICAgICAgYnJlYWtwb2ludCA9IHBvaW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnJlYWtwb2ludCB8fCAnbWF4JztcbiAgfVxuXG4gIHZhciBicmVha3BvaW50cyA9IHsgc2V0QnJlYWtwb2ludDogc2V0QnJlYWtwb2ludCwgZ2V0QnJlYWtwb2ludDogZ2V0QnJlYWtwb2ludCB9O1xuXG4gIGZ1bmN0aW9uIGFkZENsYXNzZXMgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciBjbGFzc05hbWVzID0gc3dpcGVyLmNsYXNzTmFtZXM7XG4gICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgdmFyIHJ0bCA9IHN3aXBlci5ydGw7XG4gICAgdmFyICRlbCA9IHN3aXBlci4kZWw7XG4gICAgdmFyIHN1ZmZpeGVzID0gW107XG5cbiAgICBzdWZmaXhlcy5wdXNoKCdpbml0aWFsaXplZCcpO1xuICAgIHN1ZmZpeGVzLnB1c2gocGFyYW1zLmRpcmVjdGlvbik7XG5cbiAgICBpZiAocGFyYW1zLmZyZWVNb2RlKSB7XG4gICAgICBzdWZmaXhlcy5wdXNoKCdmcmVlLW1vZGUnKTtcbiAgICB9XG4gICAgaWYgKCFTdXBwb3J0LmZsZXhib3gpIHtcbiAgICAgIHN1ZmZpeGVzLnB1c2goJ25vLWZsZXhib3gnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgICBzdWZmaXhlcy5wdXNoKCdhdXRvaGVpZ2h0Jyk7XG4gICAgfVxuICAgIGlmIChydGwpIHtcbiAgICAgIHN1ZmZpeGVzLnB1c2goJ3J0bCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnNsaWRlc1BlckNvbHVtbiA+IDEpIHtcbiAgICAgIHN1ZmZpeGVzLnB1c2goJ211bHRpcm93Jyk7XG4gICAgfVxuICAgIGlmIChEZXZpY2UuYW5kcm9pZCkge1xuICAgICAgc3VmZml4ZXMucHVzaCgnYW5kcm9pZCcpO1xuICAgIH1cbiAgICBpZiAoRGV2aWNlLmlvcykge1xuICAgICAgc3VmZml4ZXMucHVzaCgnaW9zJyk7XG4gICAgfVxuICAgIC8vIFdQOCBUb3VjaCBFdmVudHMgRml4XG4gICAgaWYgKChCcm93c2VyLmlzSUUgfHwgQnJvd3Nlci5pc0VkZ2UpICYmIChTdXBwb3J0LnBvaW50ZXJFdmVudHMgfHwgU3VwcG9ydC5wcmVmaXhlZFBvaW50ZXJFdmVudHMpKSB7XG4gICAgICBzdWZmaXhlcy5wdXNoKChcIndwOC1cIiArIChwYXJhbXMuZGlyZWN0aW9uKSkpO1xuICAgIH1cblxuICAgIHN1ZmZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHN1ZmZpeCkge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKHBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzICsgc3VmZml4KTtcbiAgICB9KTtcblxuICAgICRlbC5hZGRDbGFzcyhjbGFzc05hbWVzLmpvaW4oJyAnKSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVDbGFzc2VzICgpIHtcbiAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICB2YXIgY2xhc3NOYW1lcyA9IHN3aXBlci5jbGFzc05hbWVzO1xuXG4gICAgJGVsLnJlbW92ZUNsYXNzKGNsYXNzTmFtZXMuam9pbignICcpKTtcbiAgfVxuXG4gIHZhciBjbGFzc2VzID0geyBhZGRDbGFzc2VzOiBhZGRDbGFzc2VzLCByZW1vdmVDbGFzc2VzOiByZW1vdmVDbGFzc2VzIH07XG5cbiAgZnVuY3Rpb24gbG9hZEltYWdlIChpbWFnZUVsLCBzcmMsIHNyY3NldCwgc2l6ZXMsIGNoZWNrRm9yQ29tcGxldGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGltYWdlO1xuICAgIGZ1bmN0aW9uIG9uUmVhZHkoKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2soKTsgfVxuICAgIH1cbiAgICBpZiAoIWltYWdlRWwuY29tcGxldGUgfHwgIWNoZWNrRm9yQ29tcGxldGUpIHtcbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgaW1hZ2UgPSBuZXcgd2luLkltYWdlKCk7XG4gICAgICAgIGltYWdlLm9ubG9hZCA9IG9uUmVhZHk7XG4gICAgICAgIGltYWdlLm9uZXJyb3IgPSBvblJlYWR5O1xuICAgICAgICBpZiAoc2l6ZXMpIHtcbiAgICAgICAgICBpbWFnZS5zaXplcyA9IHNpemVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcmNzZXQpIHtcbiAgICAgICAgICBpbWFnZS5zcmNzZXQgPSBzcmNzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgIGltYWdlLnNyYyA9IHNyYztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25SZWFkeSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbWFnZSBhbHJlYWR5IGxvYWRlZC4uLlxuICAgICAgb25SZWFkeSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWxvYWRJbWFnZXMgKCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHN3aXBlci5pbWFnZXNUb0xvYWQgPSBzd2lwZXIuJGVsLmZpbmQoJ2ltZycpO1xuICAgIGZ1bmN0aW9uIG9uUmVhZHkoKSB7XG4gICAgICBpZiAodHlwZW9mIHN3aXBlciA9PT0gJ3VuZGVmaW5lZCcgfHwgc3dpcGVyID09PSBudWxsIHx8ICFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCkgeyByZXR1cm47IH1cbiAgICAgIGlmIChzd2lwZXIuaW1hZ2VzTG9hZGVkICE9PSB1bmRlZmluZWQpIHsgc3dpcGVyLmltYWdlc0xvYWRlZCArPSAxOyB9XG4gICAgICBpZiAoc3dpcGVyLmltYWdlc0xvYWRlZCA9PT0gc3dpcGVyLmltYWdlc1RvTG9hZC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMudXBkYXRlT25JbWFnZXNSZWFkeSkgeyBzd2lwZXIudXBkYXRlKCk7IH1cbiAgICAgICAgc3dpcGVyLmVtaXQoJ2ltYWdlc1JlYWR5Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3dpcGVyLmltYWdlc1RvTG9hZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGltYWdlRWwgPSBzd2lwZXIuaW1hZ2VzVG9Mb2FkW2ldO1xuICAgICAgc3dpcGVyLmxvYWRJbWFnZShcbiAgICAgICAgaW1hZ2VFbCxcbiAgICAgICAgaW1hZ2VFbC5jdXJyZW50U3JjIHx8IGltYWdlRWwuZ2V0QXR0cmlidXRlKCdzcmMnKSxcbiAgICAgICAgaW1hZ2VFbC5zcmNzZXQgfHwgaW1hZ2VFbC5nZXRBdHRyaWJ1dGUoJ3NyY3NldCcpLFxuICAgICAgICBpbWFnZUVsLnNpemVzIHx8IGltYWdlRWwuZ2V0QXR0cmlidXRlKCdzaXplcycpLFxuICAgICAgICB0cnVlLFxuICAgICAgICBvblJlYWR5XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbWFnZXMgPSB7XG4gICAgbG9hZEltYWdlOiBsb2FkSW1hZ2UsXG4gICAgcHJlbG9hZEltYWdlczogcHJlbG9hZEltYWdlcyxcbiAgfTtcblxuICBmdW5jdGlvbiBjaGVja092ZXJmbG93KCkge1xuICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgIHZhciB3YXNMb2NrZWQgPSBzd2lwZXIuaXNMb2NrZWQ7XG5cbiAgICBzd2lwZXIuaXNMb2NrZWQgPSBzd2lwZXIuc25hcEdyaWQubGVuZ3RoID09PSAxO1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9ICFzd2lwZXIuaXNMb2NrZWQ7XG4gICAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gIXN3aXBlci5pc0xvY2tlZDtcblxuICAgIC8vIGV2ZW50c1xuICAgIGlmICh3YXNMb2NrZWQgIT09IHN3aXBlci5pc0xvY2tlZCkgeyBzd2lwZXIuZW1pdChzd2lwZXIuaXNMb2NrZWQgPyAnbG9jaycgOiAndW5sb2NrJyk7IH1cblxuICAgIGlmICh3YXNMb2NrZWQgJiYgd2FzTG9ja2VkICE9PSBzd2lwZXIuaXNMb2NrZWQpIHtcbiAgICAgIHN3aXBlci5pc0VuZCA9IGZhbHNlO1xuICAgICAgc3dpcGVyLm5hdmlnYXRpb24udXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoZWNrT3ZlcmZsb3ckMSA9IHsgY2hlY2tPdmVyZmxvdzogY2hlY2tPdmVyZmxvdyB9O1xuXG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBpbml0OiB0cnVlLFxuICAgIGRpcmVjdGlvbjogJ2hvcml6b250YWwnLFxuICAgIHRvdWNoRXZlbnRzVGFyZ2V0OiAnY29udGFpbmVyJyxcbiAgICBpbml0aWFsU2xpZGU6IDAsXG4gICAgc3BlZWQ6IDMwMCxcbiAgICAvL1xuICAgIHByZXZlbnRJbnRlcmFjdGlvbk9uVHJhbnNpdGlvbjogZmFsc2UsXG5cbiAgICAvLyBUbyBzdXBwb3J0IGlPUydzIHN3aXBlLXRvLWdvLWJhY2sgZ2VzdHVyZSAod2hlbiBiZWluZyB1c2VkIGluLWFwcCwgd2l0aCBVSVdlYlZpZXcpLlxuICAgIGVkZ2VTd2lwZURldGVjdGlvbjogZmFsc2UsXG4gICAgZWRnZVN3aXBlVGhyZXNob2xkOiAyMCxcblxuICAgIC8vIEZyZWUgbW9kZVxuICAgIGZyZWVNb2RlOiBmYWxzZSxcbiAgICBmcmVlTW9kZU1vbWVudHVtOiB0cnVlLFxuICAgIGZyZWVNb2RlTW9tZW50dW1SYXRpbzogMSxcbiAgICBmcmVlTW9kZU1vbWVudHVtQm91bmNlOiB0cnVlLFxuICAgIGZyZWVNb2RlTW9tZW50dW1Cb3VuY2VSYXRpbzogMSxcbiAgICBmcmVlTW9kZU1vbWVudHVtVmVsb2NpdHlSYXRpbzogMSxcbiAgICBmcmVlTW9kZVN0aWNreTogZmFsc2UsXG4gICAgZnJlZU1vZGVNaW5pbXVtVmVsb2NpdHk6IDAuMDIsXG5cbiAgICAvLyBBdXRvaGVpZ2h0XG4gICAgYXV0b0hlaWdodDogZmFsc2UsXG5cbiAgICAvLyBTZXQgd3JhcHBlciB3aWR0aFxuICAgIHNldFdyYXBwZXJTaXplOiBmYWxzZSxcblxuICAgIC8vIFZpcnR1YWwgVHJhbnNsYXRlXG4gICAgdmlydHVhbFRyYW5zbGF0ZTogZmFsc2UsXG5cbiAgICAvLyBFZmZlY3RzXG4gICAgZWZmZWN0OiAnc2xpZGUnLCAvLyAnc2xpZGUnIG9yICdmYWRlJyBvciAnY3ViZScgb3IgJ2NvdmVyZmxvdycgb3IgJ2ZsaXAnXG5cbiAgICAvLyBCcmVha3BvaW50c1xuICAgIGJyZWFrcG9pbnRzOiB1bmRlZmluZWQsXG4gICAgYnJlYWtwb2ludHNJbnZlcnNlOiBmYWxzZSxcblxuICAgIC8vIFNsaWRlcyBncmlkXG4gICAgc3BhY2VCZXR3ZWVuOiAwLFxuICAgIHNsaWRlc1BlclZpZXc6IDEsXG4gICAgc2xpZGVzUGVyQ29sdW1uOiAxLFxuICAgIHNsaWRlc1BlckNvbHVtbkZpbGw6ICdjb2x1bW4nLFxuICAgIHNsaWRlc1Blckdyb3VwOiAxLFxuICAgIGNlbnRlcmVkU2xpZGVzOiBmYWxzZSxcbiAgICBzbGlkZXNPZmZzZXRCZWZvcmU6IDAsIC8vIGluIHB4XG4gICAgc2xpZGVzT2Zmc2V0QWZ0ZXI6IDAsIC8vIGluIHB4XG4gICAgbm9ybWFsaXplU2xpZGVJbmRleDogdHJ1ZSxcbiAgICBjZW50ZXJJbnN1ZmZpY2llbnRTbGlkZXM6IGZhbHNlLFxuXG4gICAgLy8gRGlzYWJsZSBzd2lwZXIgYW5kIGhpZGUgbmF2aWdhdGlvbiB3aGVuIGNvbnRhaW5lciBub3Qgb3ZlcmZsb3dcbiAgICB3YXRjaE92ZXJmbG93OiBmYWxzZSxcblxuICAgIC8vIFJvdW5kIGxlbmd0aFxuICAgIHJvdW5kTGVuZ3RoczogZmFsc2UsXG5cbiAgICAvLyBUb3VjaGVzXG4gICAgdG91Y2hSYXRpbzogMSxcbiAgICB0b3VjaEFuZ2xlOiA0NSxcbiAgICBzaW11bGF0ZVRvdWNoOiB0cnVlLFxuICAgIHNob3J0U3dpcGVzOiB0cnVlLFxuICAgIGxvbmdTd2lwZXM6IHRydWUsXG4gICAgbG9uZ1N3aXBlc1JhdGlvOiAwLjUsXG4gICAgbG9uZ1N3aXBlc01zOiAzMDAsXG4gICAgZm9sbG93RmluZ2VyOiB0cnVlLFxuICAgIGFsbG93VG91Y2hNb3ZlOiB0cnVlLFxuICAgIHRocmVzaG9sZDogMCxcbiAgICB0b3VjaE1vdmVTdG9wUHJvcGFnYXRpb246IHRydWUsXG4gICAgdG91Y2hTdGFydFByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgIHRvdWNoU3RhcnRGb3JjZVByZXZlbnREZWZhdWx0OiBmYWxzZSxcbiAgICB0b3VjaFJlbGVhc2VPbkVkZ2VzOiBmYWxzZSxcblxuICAgIC8vIFVuaXF1ZSBOYXZpZ2F0aW9uIEVsZW1lbnRzXG4gICAgdW5pcXVlTmF2RWxlbWVudHM6IHRydWUsXG5cbiAgICAvLyBSZXNpc3RhbmNlXG4gICAgcmVzaXN0YW5jZTogdHJ1ZSxcbiAgICByZXNpc3RhbmNlUmF0aW86IDAuODUsXG5cbiAgICAvLyBQcm9ncmVzc1xuICAgIHdhdGNoU2xpZGVzUHJvZ3Jlc3M6IGZhbHNlLFxuICAgIHdhdGNoU2xpZGVzVmlzaWJpbGl0eTogZmFsc2UsXG5cbiAgICAvLyBDdXJzb3JcbiAgICBncmFiQ3Vyc29yOiBmYWxzZSxcblxuICAgIC8vIENsaWNrc1xuICAgIHByZXZlbnRDbGlja3M6IHRydWUsXG4gICAgcHJldmVudENsaWNrc1Byb3BhZ2F0aW9uOiB0cnVlLFxuICAgIHNsaWRlVG9DbGlja2VkU2xpZGU6IGZhbHNlLFxuXG4gICAgLy8gSW1hZ2VzXG4gICAgcHJlbG9hZEltYWdlczogdHJ1ZSxcbiAgICB1cGRhdGVPbkltYWdlc1JlYWR5OiB0cnVlLFxuXG4gICAgLy8gbG9vcFxuICAgIGxvb3A6IGZhbHNlLFxuICAgIGxvb3BBZGRpdGlvbmFsU2xpZGVzOiAwLFxuICAgIGxvb3BlZFNsaWRlczogbnVsbCxcbiAgICBsb29wRmlsbEdyb3VwV2l0aEJsYW5rOiBmYWxzZSxcblxuICAgIC8vIFN3aXBpbmcvbm8gc3dpcGluZ1xuICAgIGFsbG93U2xpZGVQcmV2OiB0cnVlLFxuICAgIGFsbG93U2xpZGVOZXh0OiB0cnVlLFxuICAgIHN3aXBlSGFuZGxlcjogbnVsbCwgLy8gJy5zd2lwZS1oYW5kbGVyJyxcbiAgICBub1N3aXBpbmc6IHRydWUsXG4gICAgbm9Td2lwaW5nQ2xhc3M6ICdzd2lwZXItbm8tc3dpcGluZycsXG4gICAgbm9Td2lwaW5nU2VsZWN0b3I6IG51bGwsXG5cbiAgICAvLyBQYXNzaXZlIExpc3RlbmVyc1xuICAgIHBhc3NpdmVMaXN0ZW5lcnM6IHRydWUsXG5cbiAgICAvLyBOU1xuICAgIGNvbnRhaW5lck1vZGlmaWVyQ2xhc3M6ICdzd2lwZXItY29udGFpbmVyLScsIC8vIE5FV1xuICAgIHNsaWRlQ2xhc3M6ICdzd2lwZXItc2xpZGUnLFxuICAgIHNsaWRlQmxhbmtDbGFzczogJ3N3aXBlci1zbGlkZS1pbnZpc2libGUtYmxhbmsnLFxuICAgIHNsaWRlQWN0aXZlQ2xhc3M6ICdzd2lwZXItc2xpZGUtYWN0aXZlJyxcbiAgICBzbGlkZUR1cGxpY2F0ZUFjdGl2ZUNsYXNzOiAnc3dpcGVyLXNsaWRlLWR1cGxpY2F0ZS1hY3RpdmUnLFxuICAgIHNsaWRlVmlzaWJsZUNsYXNzOiAnc3dpcGVyLXNsaWRlLXZpc2libGUnLFxuICAgIHNsaWRlRHVwbGljYXRlQ2xhc3M6ICdzd2lwZXItc2xpZGUtZHVwbGljYXRlJyxcbiAgICBzbGlkZU5leHRDbGFzczogJ3N3aXBlci1zbGlkZS1uZXh0JyxcbiAgICBzbGlkZUR1cGxpY2F0ZU5leHRDbGFzczogJ3N3aXBlci1zbGlkZS1kdXBsaWNhdGUtbmV4dCcsXG4gICAgc2xpZGVQcmV2Q2xhc3M6ICdzd2lwZXItc2xpZGUtcHJldicsXG4gICAgc2xpZGVEdXBsaWNhdGVQcmV2Q2xhc3M6ICdzd2lwZXItc2xpZGUtZHVwbGljYXRlLXByZXYnLFxuICAgIHdyYXBwZXJDbGFzczogJ3N3aXBlci13cmFwcGVyJyxcblxuICAgIC8vIENhbGxiYWNrc1xuICAgIHJ1bkNhbGxiYWNrc09uSW5pdDogdHJ1ZSxcbiAgfTtcblxuICAvKiBlc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246IFwib2ZmXCIgKi9cblxuICB2YXIgcHJvdG90eXBlcyA9IHtcbiAgICB1cGRhdGU6IHVwZGF0ZSxcbiAgICB0cmFuc2xhdGU6IHRyYW5zbGF0ZSxcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uJDEsXG4gICAgc2xpZGU6IHNsaWRlLFxuICAgIGxvb3A6IGxvb3AsXG4gICAgZ3JhYkN1cnNvcjogZ3JhYkN1cnNvcixcbiAgICBtYW5pcHVsYXRpb246IG1hbmlwdWxhdGlvbixcbiAgICBldmVudHM6IGV2ZW50cyxcbiAgICBicmVha3BvaW50czogYnJlYWtwb2ludHMsXG4gICAgY2hlY2tPdmVyZmxvdzogY2hlY2tPdmVyZmxvdyQxLFxuICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgaW1hZ2VzOiBpbWFnZXMsXG4gIH07XG5cbiAgdmFyIGV4dGVuZGVkRGVmYXVsdHMgPSB7fTtcblxuICB2YXIgU3dpcGVyID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU3dpcGVyQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiBTd2lwZXIoKSB7XG4gICAgICB2YXIgYXNzaWduO1xuXG4gICAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcbiAgICAgIHZhciBlbDtcbiAgICAgIHZhciBwYXJhbXM7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgYXJnc1swXS5jb25zdHJ1Y3RvciAmJiBhcmdzWzBdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgcGFyYW1zID0gYXJnc1swXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIChhc3NpZ24gPSBhcmdzLCBlbCA9IGFzc2lnblswXSwgcGFyYW1zID0gYXNzaWduWzFdKTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFyYW1zKSB7IHBhcmFtcyA9IHt9OyB9XG5cbiAgICAgIHBhcmFtcyA9IFV0aWxzLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgICAgIGlmIChlbCAmJiAhcGFyYW1zLmVsKSB7IHBhcmFtcy5lbCA9IGVsOyB9XG5cbiAgICAgIFN3aXBlckNsYXNzLmNhbGwodGhpcywgcGFyYW1zKTtcblxuICAgICAgT2JqZWN0LmtleXMocHJvdG90eXBlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvdG90eXBlR3JvdXApIHtcbiAgICAgICAgT2JqZWN0LmtleXMocHJvdG90eXBlc1twcm90b3R5cGVHcm91cF0pLmZvckVhY2goZnVuY3Rpb24gKHByb3RvTWV0aG9kKSB7XG4gICAgICAgICAgaWYgKCFTd2lwZXIucHJvdG90eXBlW3Byb3RvTWV0aG9kXSkge1xuICAgICAgICAgICAgU3dpcGVyLnByb3RvdHlwZVtwcm90b01ldGhvZF0gPSBwcm90b3R5cGVzW3Byb3RvdHlwZUdyb3VwXVtwcm90b01ldGhvZF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTd2lwZXIgSW5zdGFuY2VcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBzd2lwZXIubW9kdWxlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc3dpcGVyLm1vZHVsZXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5rZXlzKHN3aXBlci5tb2R1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGVOYW1lKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBzd2lwZXIubW9kdWxlc1ttb2R1bGVOYW1lXTtcbiAgICAgICAgaWYgKG1vZHVsZS5wYXJhbXMpIHtcbiAgICAgICAgICB2YXIgbW9kdWxlUGFyYW1OYW1lID0gT2JqZWN0LmtleXMobW9kdWxlLnBhcmFtcylbMF07XG4gICAgICAgICAgdmFyIG1vZHVsZVBhcmFtcyA9IG1vZHVsZS5wYXJhbXNbbW9kdWxlUGFyYW1OYW1lXTtcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZVBhcmFtcyAhPT0gJ29iamVjdCcgfHwgbW9kdWxlUGFyYW1zID09PSBudWxsKSB7IHJldHVybjsgfVxuICAgICAgICAgIGlmICghKG1vZHVsZVBhcmFtTmFtZSBpbiBwYXJhbXMgJiYgJ2VuYWJsZWQnIGluIG1vZHVsZVBhcmFtcykpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgaWYgKHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdID09PSB0cnVlKSB7XG4gICAgICAgICAgICBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSA9IHsgZW5hYmxlZDogdHJ1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcGFyYW1zW21vZHVsZVBhcmFtTmFtZV0gPT09ICdvYmplY3QnXG4gICAgICAgICAgICAmJiAhKCdlbmFibGVkJyBpbiBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdKSB7IHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdID0geyBlbmFibGVkOiBmYWxzZSB9OyB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBFeHRlbmQgZGVmYXVsdHMgd2l0aCBtb2R1bGVzIHBhcmFtc1xuICAgICAgdmFyIHN3aXBlclBhcmFtcyA9IFV0aWxzLmV4dGVuZCh7fSwgZGVmYXVsdHMpO1xuICAgICAgc3dpcGVyLnVzZU1vZHVsZXNQYXJhbXMoc3dpcGVyUGFyYW1zKTtcblxuICAgICAgLy8gRXh0ZW5kIGRlZmF1bHRzIHdpdGggcGFzc2VkIHBhcmFtc1xuICAgICAgc3dpcGVyLnBhcmFtcyA9IFV0aWxzLmV4dGVuZCh7fSwgc3dpcGVyUGFyYW1zLCBleHRlbmRlZERlZmF1bHRzLCBwYXJhbXMpO1xuICAgICAgc3dpcGVyLm9yaWdpbmFsUGFyYW1zID0gVXRpbHMuZXh0ZW5kKHt9LCBzd2lwZXIucGFyYW1zKTtcbiAgICAgIHN3aXBlci5wYXNzZWRQYXJhbXMgPSBVdGlscy5leHRlbmQoe30sIHBhcmFtcyk7XG5cbiAgICAgIC8vIFNhdmUgRG9tIGxpYlxuICAgICAgc3dpcGVyLiQgPSAkO1xuXG4gICAgICAvLyBGaW5kIGVsXG4gICAgICB2YXIgJGVsID0gJChzd2lwZXIucGFyYW1zLmVsKTtcbiAgICAgIGVsID0gJGVsWzBdO1xuXG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICgkZWwubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgc3dpcGVycyA9IFtdO1xuICAgICAgICAkZWwuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGNvbnRhaW5lckVsKSB7XG4gICAgICAgICAgdmFyIG5ld1BhcmFtcyA9IFV0aWxzLmV4dGVuZCh7fSwgcGFyYW1zLCB7IGVsOiBjb250YWluZXJFbCB9KTtcbiAgICAgICAgICBzd2lwZXJzLnB1c2gobmV3IFN3aXBlcihuZXdQYXJhbXMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzd2lwZXJzO1xuICAgICAgfVxuXG4gICAgICBlbC5zd2lwZXIgPSBzd2lwZXI7XG4gICAgICAkZWwuZGF0YSgnc3dpcGVyJywgc3dpcGVyKTtcblxuICAgICAgLy8gRmluZCBXcmFwcGVyXG4gICAgICB2YXIgJHdyYXBwZXJFbCA9ICRlbC5jaGlsZHJlbigoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy53cmFwcGVyQ2xhc3MpKSk7XG5cbiAgICAgIC8vIEV4dGVuZCBTd2lwZXJcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgJGVsOiAkZWwsXG4gICAgICAgIGVsOiBlbCxcbiAgICAgICAgJHdyYXBwZXJFbDogJHdyYXBwZXJFbCxcbiAgICAgICAgd3JhcHBlckVsOiAkd3JhcHBlckVsWzBdLFxuXG4gICAgICAgIC8vIENsYXNzZXNcbiAgICAgICAgY2xhc3NOYW1lczogW10sXG5cbiAgICAgICAgLy8gU2xpZGVzXG4gICAgICAgIHNsaWRlczogJCgpLFxuICAgICAgICBzbGlkZXNHcmlkOiBbXSxcbiAgICAgICAgc25hcEdyaWQ6IFtdLFxuICAgICAgICBzbGlkZXNTaXplc0dyaWQ6IFtdLFxuXG4gICAgICAgIC8vIGlzRGlyZWN0aW9uXG4gICAgICAgIGlzSG9yaXpvbnRhbDogZnVuY3Rpb24gaXNIb3Jpem9udGFsKCkge1xuICAgICAgICAgIHJldHVybiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgICAgICB9LFxuICAgICAgICBpc1ZlcnRpY2FsOiBmdW5jdGlvbiBpc1ZlcnRpY2FsKCkge1xuICAgICAgICAgIHJldHVybiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgICAgfSxcbiAgICAgICAgLy8gUlRMXG4gICAgICAgIHJ0bDogKGVsLmRpci50b0xvd2VyQ2FzZSgpID09PSAncnRsJyB8fCAkZWwuY3NzKCdkaXJlY3Rpb24nKSA9PT0gJ3J0bCcpLFxuICAgICAgICBydGxUcmFuc2xhdGU6IHN3aXBlci5wYXJhbXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgJiYgKGVsLmRpci50b0xvd2VyQ2FzZSgpID09PSAncnRsJyB8fCAkZWwuY3NzKCdkaXJlY3Rpb24nKSA9PT0gJ3J0bCcpLFxuICAgICAgICB3cm9uZ1JUTDogJHdyYXBwZXJFbC5jc3MoJ2Rpc3BsYXknKSA9PT0gJy13ZWJraXQtYm94JyxcblxuICAgICAgICAvLyBJbmRleGVzXG4gICAgICAgIGFjdGl2ZUluZGV4OiAwLFxuICAgICAgICByZWFsSW5kZXg6IDAsXG5cbiAgICAgICAgLy9cbiAgICAgICAgaXNCZWdpbm5pbmc6IHRydWUsXG4gICAgICAgIGlzRW5kOiBmYWxzZSxcblxuICAgICAgICAvLyBQcm9wc1xuICAgICAgICB0cmFuc2xhdGU6IDAsXG4gICAgICAgIHByZXZpb3VzVHJhbnNsYXRlOiAwLFxuICAgICAgICBwcm9ncmVzczogMCxcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGFuaW1hdGluZzogZmFsc2UsXG5cbiAgICAgICAgLy8gTG9ja3NcbiAgICAgICAgYWxsb3dTbGlkZU5leHQ6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZU5leHQsXG4gICAgICAgIGFsbG93U2xpZGVQcmV2OiBzd2lwZXIucGFyYW1zLmFsbG93U2xpZGVQcmV2LFxuXG4gICAgICAgIC8vIFRvdWNoIEV2ZW50c1xuICAgICAgICB0b3VjaEV2ZW50czogKGZ1bmN0aW9uIHRvdWNoRXZlbnRzKCkge1xuICAgICAgICAgIHZhciB0b3VjaCA9IFsndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnXTtcbiAgICAgICAgICB2YXIgZGVza3RvcCA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJ107XG4gICAgICAgICAgaWYgKFN1cHBvcnQucG9pbnRlckV2ZW50cykge1xuICAgICAgICAgICAgZGVza3RvcCA9IFsncG9pbnRlcmRvd24nLCAncG9pbnRlcm1vdmUnLCAncG9pbnRlcnVwJ107XG4gICAgICAgICAgfSBlbHNlIGlmIChTdXBwb3J0LnByZWZpeGVkUG9pbnRlckV2ZW50cykge1xuICAgICAgICAgICAgZGVza3RvcCA9IFsnTVNQb2ludGVyRG93bicsICdNU1BvaW50ZXJNb3ZlJywgJ01TUG9pbnRlclVwJ107XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXBlci50b3VjaEV2ZW50c1RvdWNoID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHRvdWNoWzBdLFxuICAgICAgICAgICAgbW92ZTogdG91Y2hbMV0sXG4gICAgICAgICAgICBlbmQ6IHRvdWNoWzJdLFxuICAgICAgICAgIH07XG4gICAgICAgICAgc3dpcGVyLnRvdWNoRXZlbnRzRGVza3RvcCA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBkZXNrdG9wWzBdLFxuICAgICAgICAgICAgbW92ZTogZGVza3RvcFsxXSxcbiAgICAgICAgICAgIGVuZDogZGVza3RvcFsyXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBTdXBwb3J0LnRvdWNoIHx8ICFzd2lwZXIucGFyYW1zLnNpbXVsYXRlVG91Y2ggPyBzd2lwZXIudG91Y2hFdmVudHNUb3VjaCA6IHN3aXBlci50b3VjaEV2ZW50c0Rlc2t0b3A7XG4gICAgICAgIH0oKSksXG4gICAgICAgIHRvdWNoRXZlbnRzRGF0YToge1xuICAgICAgICAgIGlzVG91Y2hlZDogdW5kZWZpbmVkLFxuICAgICAgICAgIGlzTW92ZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBhbGxvd1RvdWNoQ2FsbGJhY2tzOiB1bmRlZmluZWQsXG4gICAgICAgICAgdG91Y2hTdGFydFRpbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBpc1Njcm9sbGluZzogdW5kZWZpbmVkLFxuICAgICAgICAgIGN1cnJlbnRUcmFuc2xhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydFRyYW5zbGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGFsbG93VGhyZXNob2xkTW92ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIC8vIEZvcm0gZWxlbWVudHMgdG8gbWF0Y2hcbiAgICAgICAgICBmb3JtRWxlbWVudHM6ICdpbnB1dCwgc2VsZWN0LCBvcHRpb24sIHRleHRhcmVhLCBidXR0b24sIHZpZGVvJyxcbiAgICAgICAgICAvLyBMYXN0IGNsaWNrIHRpbWVcbiAgICAgICAgICBsYXN0Q2xpY2tUaW1lOiBVdGlscy5ub3coKSxcbiAgICAgICAgICBjbGlja1RpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAvLyBWZWxvY2l0aWVzXG4gICAgICAgICAgdmVsb2NpdGllczogW10sXG4gICAgICAgICAgYWxsb3dNb21lbnR1bUJvdW5jZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGlzVG91Y2hFdmVudDogdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXJ0TW92aW5nOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gQ2xpY2tzXG4gICAgICAgIGFsbG93Q2xpY2s6IHRydWUsXG5cbiAgICAgICAgLy8gVG91Y2hlc1xuICAgICAgICBhbGxvd1RvdWNoTW92ZTogc3dpcGVyLnBhcmFtcy5hbGxvd1RvdWNoTW92ZSxcblxuICAgICAgICB0b3VjaGVzOiB7XG4gICAgICAgICAgc3RhcnRYOiAwLFxuICAgICAgICAgIHN0YXJ0WTogMCxcbiAgICAgICAgICBjdXJyZW50WDogMCxcbiAgICAgICAgICBjdXJyZW50WTogMCxcbiAgICAgICAgICBkaWZmOiAwLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEltYWdlc1xuICAgICAgICBpbWFnZXNUb0xvYWQ6IFtdLFxuICAgICAgICBpbWFnZXNMb2FkZWQ6IDAsXG5cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbnN0YWxsIE1vZHVsZXNcbiAgICAgIHN3aXBlci51c2VNb2R1bGVzKCk7XG5cbiAgICAgIC8vIEluaXRcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmluaXQpIHtcbiAgICAgICAgc3dpcGVyLmluaXQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGFwcCBpbnN0YW5jZVxuICAgICAgcmV0dXJuIHN3aXBlcjtcbiAgICB9XG5cbiAgICBpZiAoIFN3aXBlckNsYXNzICkgU3dpcGVyLl9fcHJvdG9fXyA9IFN3aXBlckNsYXNzO1xuICAgIFN3aXBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTd2lwZXJDbGFzcyAmJiBTd2lwZXJDbGFzcy5wcm90b3R5cGUgKTtcbiAgICBTd2lwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3dpcGVyO1xuXG4gICAgdmFyIHN0YXRpY0FjY2Vzc29ycyA9IHsgZXh0ZW5kZWREZWZhdWx0czogeyBjb25maWd1cmFibGU6IHRydWUgfSxkZWZhdWx0czogeyBjb25maWd1cmFibGU6IHRydWUgfSxDbGFzczogeyBjb25maWd1cmFibGU6IHRydWUgfSwkOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICBTd2lwZXIucHJvdG90eXBlLnNsaWRlc1BlclZpZXdEeW5hbWljID0gZnVuY3Rpb24gc2xpZGVzUGVyVmlld0R5bmFtaWMgKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICAgIHZhciBzbGlkZXMgPSBzd2lwZXIuc2xpZGVzO1xuICAgICAgdmFyIHNsaWRlc0dyaWQgPSBzd2lwZXIuc2xpZGVzR3JpZDtcbiAgICAgIHZhciBzd2lwZXJTaXplID0gc3dpcGVyLnNpemU7XG4gICAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgICB2YXIgc3B2ID0gMTtcbiAgICAgIGlmIChwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgICAgdmFyIHNsaWRlU2l6ZSA9IHNsaWRlc1thY3RpdmVJbmRleF0uc3dpcGVyU2xpZGVTaXplO1xuICAgICAgICB2YXIgYnJlYWtMb29wO1xuICAgICAgICBmb3IgKHZhciBpID0gYWN0aXZlSW5kZXggKyAxOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlc1tpXSAmJiAhYnJlYWtMb29wKSB7XG4gICAgICAgICAgICBzbGlkZVNpemUgKz0gc2xpZGVzW2ldLnN3aXBlclNsaWRlU2l6ZTtcbiAgICAgICAgICAgIHNwdiArPSAxO1xuICAgICAgICAgICAgaWYgKHNsaWRlU2l6ZSA+IHN3aXBlclNpemUpIHsgYnJlYWtMb29wID0gdHJ1ZTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpJDEgPSBhY3RpdmVJbmRleCAtIDE7IGkkMSA+PSAwOyBpJDEgLT0gMSkge1xuICAgICAgICAgIGlmIChzbGlkZXNbaSQxXSAmJiAhYnJlYWtMb29wKSB7XG4gICAgICAgICAgICBzbGlkZVNpemUgKz0gc2xpZGVzW2kkMV0uc3dpcGVyU2xpZGVTaXplO1xuICAgICAgICAgICAgc3B2ICs9IDE7XG4gICAgICAgICAgICBpZiAoc2xpZGVTaXplID4gc3dpcGVyU2l6ZSkgeyBicmVha0xvb3AgPSB0cnVlOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpJDIgPSBhY3RpdmVJbmRleCArIDE7IGkkMiA8IHNsaWRlcy5sZW5ndGg7IGkkMiArPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlc0dyaWRbaSQyXSAtIHNsaWRlc0dyaWRbYWN0aXZlSW5kZXhdIDwgc3dpcGVyU2l6ZSkge1xuICAgICAgICAgICAgc3B2ICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3B2O1xuICAgIH07XG5cbiAgICBTd2lwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgc25hcEdyaWQgPSBzd2lwZXIuc25hcEdyaWQ7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICAgIC8vIEJyZWFrcG9pbnRzXG4gICAgICBpZiAocGFyYW1zLmJyZWFrcG9pbnRzKSB7XG4gICAgICAgIHN3aXBlci5zZXRCcmVha3BvaW50KCk7XG4gICAgICB9XG4gICAgICBzd2lwZXIudXBkYXRlU2l6ZSgpO1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKCk7XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuXG4gICAgICBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICAgIHZhciB0cmFuc2xhdGVWYWx1ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlICogLTEgOiBzd2lwZXIudHJhbnNsYXRlO1xuICAgICAgICB2YXIgbmV3VHJhbnNsYXRlID0gTWF0aC5taW4oTWF0aC5tYXgodHJhbnNsYXRlVmFsdWUsIHN3aXBlci5tYXhUcmFuc2xhdGUoKSksIHN3aXBlci5taW5UcmFuc2xhdGUoKSk7XG4gICAgICAgIHN3aXBlci5zZXRUcmFuc2xhdGUobmV3VHJhbnNsYXRlKTtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KCk7XG4gICAgICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgICB9XG4gICAgICB2YXIgdHJhbnNsYXRlZDtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmZyZWVNb2RlKSB7XG4gICAgICAgIHNldFRyYW5zbGF0ZSgpO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgc3dpcGVyLnVwZGF0ZUF1dG9IZWlnaHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyB8fCBzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPiAxKSAmJiBzd2lwZXIuaXNFbmQgJiYgIXN3aXBlci5wYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgICAgICB0cmFuc2xhdGVkID0gc3dpcGVyLnNsaWRlVG8oc3dpcGVyLnNsaWRlcy5sZW5ndGggLSAxLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNsYXRlZCA9IHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCwgMCwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdHJhbnNsYXRlZCkge1xuICAgICAgICAgIHNldFRyYW5zbGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc25hcEdyaWQgIT09IHN3aXBlci5zbmFwR3JpZCkge1xuICAgICAgICBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgICAgfVxuICAgICAgc3dpcGVyLmVtaXQoJ3VwZGF0ZScpO1xuICAgIH07XG5cbiAgICBTd2lwZXIucHJvdG90eXBlLmNoYW5nZURpcmVjdGlvbiA9IGZ1bmN0aW9uIGNoYW5nZURpcmVjdGlvbiAobmV3RGlyZWN0aW9uLCBuZWVkVXBkYXRlKSB7XG4gICAgICBpZiAoIG5lZWRVcGRhdGUgPT09IHZvaWQgMCApIG5lZWRVcGRhdGUgPSB0cnVlO1xuXG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBjdXJyZW50RGlyZWN0aW9uID0gc3dpcGVyLnBhcmFtcy5kaXJlY3Rpb247XG4gICAgICBpZiAoIW5ld0RpcmVjdGlvbikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgbmV3RGlyZWN0aW9uID0gY3VycmVudERpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICAgIH1cbiAgICAgIGlmICgobmV3RGlyZWN0aW9uID09PSBjdXJyZW50RGlyZWN0aW9uKSB8fCAobmV3RGlyZWN0aW9uICE9PSAnaG9yaXpvbnRhbCcgJiYgbmV3RGlyZWN0aW9uICE9PSAndmVydGljYWwnKSkge1xuICAgICAgICByZXR1cm4gc3dpcGVyO1xuICAgICAgfVxuXG4gICAgICBzd2lwZXIuJGVsXG4gICAgICAgIC5yZW1vdmVDbGFzcygoXCJcIiArIChzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpICsgY3VycmVudERpcmVjdGlvbiArIFwiIHdwOC1cIiArIGN1cnJlbnREaXJlY3Rpb24pKVxuICAgICAgICAuYWRkQ2xhc3MoKFwiXCIgKyAoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSArIG5ld0RpcmVjdGlvbikpO1xuXG4gICAgICBpZiAoKEJyb3dzZXIuaXNJRSB8fCBCcm93c2VyLmlzRWRnZSkgJiYgKFN1cHBvcnQucG9pbnRlckV2ZW50cyB8fCBTdXBwb3J0LnByZWZpeGVkUG9pbnRlckV2ZW50cykpIHtcbiAgICAgICAgc3dpcGVyLiRlbC5hZGRDbGFzcygoKHN3aXBlci5wYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzcykgKyBcIndwOC1cIiArIG5ld0RpcmVjdGlvbikpO1xuICAgICAgfVxuXG4gICAgICBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9IG5ld0RpcmVjdGlvbjtcblxuICAgICAgc3dpcGVyLnNsaWRlcy5lYWNoKGZ1bmN0aW9uIChzbGlkZUluZGV4LCBzbGlkZUVsKSB7XG4gICAgICAgIGlmIChuZXdEaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgICBzbGlkZUVsLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2xpZGVFbC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHN3aXBlci5lbWl0KCdjaGFuZ2VEaXJlY3Rpb24nKTtcbiAgICAgIGlmIChuZWVkVXBkYXRlKSB7IHN3aXBlci51cGRhdGUoKTsgfVxuXG4gICAgICByZXR1cm4gc3dpcGVyO1xuICAgIH07XG5cbiAgICBTd2lwZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiBpbml0ICgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHN3aXBlci5pbml0aWFsaXplZCkgeyByZXR1cm47IH1cblxuICAgICAgc3dpcGVyLmVtaXQoJ2JlZm9yZUluaXQnKTtcblxuICAgICAgLy8gU2V0IGJyZWFrcG9pbnRcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmJyZWFrcG9pbnRzKSB7XG4gICAgICAgIHN3aXBlci5zZXRCcmVha3BvaW50KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBDbGFzc2VzXG4gICAgICBzd2lwZXIuYWRkQ2xhc3NlcygpO1xuXG4gICAgICAvLyBDcmVhdGUgbG9vcFxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgICBzd2lwZXIubG9vcENyZWF0ZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgc2l6ZVxuICAgICAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcblxuICAgICAgLy8gVXBkYXRlIHNsaWRlc1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuXG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93KSB7XG4gICAgICAgIHN3aXBlci5jaGVja092ZXJmbG93KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBHcmFiIEN1cnNvclxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZ3JhYkN1cnNvcikge1xuICAgICAgICBzd2lwZXIuc2V0R3JhYkN1cnNvcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5wcmVsb2FkSW1hZ2VzKSB7XG4gICAgICAgIHN3aXBlci5wcmVsb2FkSW1hZ2VzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNsaWRlIFRvIEluaXRpYWwgU2xpZGVcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLnBhcmFtcy5pbml0aWFsU2xpZGUgKyBzd2lwZXIubG9vcGVkU2xpZGVzLCAwLCBzd2lwZXIucGFyYW1zLnJ1bkNhbGxiYWNrc09uSW5pdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIucGFyYW1zLmluaXRpYWxTbGlkZSwgMCwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRhY2ggZXZlbnRzXG4gICAgICBzd2lwZXIuYXR0YWNoRXZlbnRzKCk7XG5cbiAgICAgIC8vIEluaXQgRmxhZ1xuICAgICAgc3dpcGVyLmluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgLy8gRW1pdFxuICAgICAgc3dpcGVyLmVtaXQoJ2luaXQnKTtcbiAgICB9O1xuXG4gICAgU3dpcGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoZGVsZXRlSW5zdGFuY2UsIGNsZWFuU3R5bGVzKSB7XG4gICAgICBpZiAoIGRlbGV0ZUluc3RhbmNlID09PSB2b2lkIDAgKSBkZWxldGVJbnN0YW5jZSA9IHRydWU7XG4gICAgICBpZiAoIGNsZWFuU3R5bGVzID09PSB2b2lkIDAgKSBjbGVhblN0eWxlcyA9IHRydWU7XG5cbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICAgIHZhciAkd3JhcHBlckVsID0gc3dpcGVyLiR3cmFwcGVyRWw7XG4gICAgICB2YXIgc2xpZGVzID0gc3dpcGVyLnNsaWRlcztcblxuICAgICAgaWYgKHR5cGVvZiBzd2lwZXIucGFyYW1zID09PSAndW5kZWZpbmVkJyB8fCBzd2lwZXIuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBzd2lwZXIuZW1pdCgnYmVmb3JlRGVzdHJveScpO1xuXG4gICAgICAvLyBJbml0IEZsYWdcbiAgICAgIHN3aXBlci5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAvLyBEZXRhY2ggZXZlbnRzXG4gICAgICBzd2lwZXIuZGV0YWNoRXZlbnRzKCk7XG5cbiAgICAgIC8vIERlc3Ryb3kgbG9vcFxuICAgICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICAgIHN3aXBlci5sb29wRGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhbnVwIHN0eWxlc1xuICAgICAgaWYgKGNsZWFuU3R5bGVzKSB7XG4gICAgICAgIHN3aXBlci5yZW1vdmVDbGFzc2VzKCk7XG4gICAgICAgICRlbC5yZW1vdmVBdHRyKCdzdHlsZScpO1xuICAgICAgICAkd3JhcHBlckVsLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XG4gICAgICAgIGlmIChzbGlkZXMgJiYgc2xpZGVzLmxlbmd0aCkge1xuICAgICAgICAgIHNsaWRlc1xuICAgICAgICAgICAgLnJlbW92ZUNsYXNzKFtcbiAgICAgICAgICAgICAgcGFyYW1zLnNsaWRlVmlzaWJsZUNsYXNzLFxuICAgICAgICAgICAgICBwYXJhbXMuc2xpZGVBY3RpdmVDbGFzcyxcbiAgICAgICAgICAgICAgcGFyYW1zLnNsaWRlTmV4dENsYXNzLFxuICAgICAgICAgICAgICBwYXJhbXMuc2xpZGVQcmV2Q2xhc3MgXS5qb2luKCcgJykpXG4gICAgICAgICAgICAucmVtb3ZlQXR0cignc3R5bGUnKVxuICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JylcbiAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLXN3aXBlci1jb2x1bW4nKVxuICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtc3dpcGVyLXJvdycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXBlci5lbWl0KCdkZXN0cm95Jyk7XG5cbiAgICAgIC8vIERldGFjaCBlbWl0dGVyIGV2ZW50c1xuICAgICAgT2JqZWN0LmtleXMoc3dpcGVyLmV2ZW50c0xpc3RlbmVycykuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgIHN3aXBlci5vZmYoZXZlbnROYW1lKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVsZXRlSW5zdGFuY2UgIT09IGZhbHNlKSB7XG4gICAgICAgIHN3aXBlci4kZWxbMF0uc3dpcGVyID0gbnVsbDtcbiAgICAgICAgc3dpcGVyLiRlbC5kYXRhKCdzd2lwZXInLCBudWxsKTtcbiAgICAgICAgVXRpbHMuZGVsZXRlUHJvcHMoc3dpcGVyKTtcbiAgICAgIH1cbiAgICAgIHN3aXBlci5kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgU3dpcGVyLmV4dGVuZERlZmF1bHRzID0gZnVuY3Rpb24gZXh0ZW5kRGVmYXVsdHMgKG5ld0RlZmF1bHRzKSB7XG4gICAgICBVdGlscy5leHRlbmQoZXh0ZW5kZWREZWZhdWx0cywgbmV3RGVmYXVsdHMpO1xuICAgIH07XG5cbiAgICBzdGF0aWNBY2Nlc3NvcnMuZXh0ZW5kZWREZWZhdWx0cy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZXh0ZW5kZWREZWZhdWx0cztcbiAgICB9O1xuXG4gICAgc3RhdGljQWNjZXNzb3JzLmRlZmF1bHRzLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9O1xuXG4gICAgc3RhdGljQWNjZXNzb3JzLkNsYXNzLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBTd2lwZXJDbGFzcztcbiAgICB9O1xuXG4gICAgc3RhdGljQWNjZXNzb3JzLiQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICQ7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTd2lwZXIsIHN0YXRpY0FjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIFN3aXBlcjtcbiAgfShTd2lwZXJDbGFzcykpO1xuXG4gIHZhciBEZXZpY2UkMSA9IHtcbiAgICBuYW1lOiAnZGV2aWNlJyxcbiAgICBwcm90bzoge1xuICAgICAgZGV2aWNlOiBEZXZpY2UsXG4gICAgfSxcbiAgICBzdGF0aWM6IHtcbiAgICAgIGRldmljZTogRGV2aWNlLFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIFN1cHBvcnQkMSA9IHtcbiAgICBuYW1lOiAnc3VwcG9ydCcsXG4gICAgcHJvdG86IHtcbiAgICAgIHN1cHBvcnQ6IFN1cHBvcnQsXG4gICAgfSxcbiAgICBzdGF0aWM6IHtcbiAgICAgIHN1cHBvcnQ6IFN1cHBvcnQsXG4gICAgfSxcbiAgfTtcblxuICB2YXIgQnJvd3NlciQxID0ge1xuICAgIG5hbWU6ICdicm93c2VyJyxcbiAgICBwcm90bzoge1xuICAgICAgYnJvd3NlcjogQnJvd3NlcixcbiAgICB9LFxuICAgIHN0YXRpYzoge1xuICAgICAgYnJvd3NlcjogQnJvd3NlcixcbiAgICB9LFxuICB9O1xuXG4gIHZhciBSZXNpemUgPSB7XG4gICAgbmFtZTogJ3Jlc2l6ZScsXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgcmVzaXplOiB7XG4gICAgICAgICAgcmVzaXplSGFuZGxlcjogZnVuY3Rpb24gcmVzaXplSGFuZGxlcigpIHtcbiAgICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5pbml0aWFsaXplZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdiZWZvcmVSZXNpemUnKTtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdyZXNpemUnKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9yaWVudGF0aW9uQ2hhbmdlSGFuZGxlcjogZnVuY3Rpb24gb3JpZW50YXRpb25DaGFuZ2VIYW5kbGVyKCkge1xuICAgICAgICAgICAgaWYgKCFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCB8fCAhc3dpcGVyLmluaXRpYWxpemVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3dpcGVyLmVtaXQoJ29yaWVudGF0aW9uY2hhbmdlJyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb246IHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICAvLyBFbWl0IHJlc2l6ZVxuICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3dpcGVyLnJlc2l6ZS5yZXNpemVIYW5kbGVyKTtcblxuICAgICAgICAvLyBFbWl0IG9yaWVudGF0aW9uY2hhbmdlXG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIHN3aXBlci5yZXNpemUub3JpZW50YXRpb25DaGFuZ2VIYW5kbGVyKTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHN3aXBlci5yZXNpemUucmVzaXplSGFuZGxlcik7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIHN3aXBlci5yZXNpemUub3JpZW50YXRpb25DaGFuZ2VIYW5kbGVyKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICB2YXIgT2JzZXJ2ZXIgPSB7XG4gICAgZnVuYzogd2luLk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luLldlYmtpdE11dGF0aW9uT2JzZXJ2ZXIsXG4gICAgYXR0YWNoOiBmdW5jdGlvbiBhdHRhY2godGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG5cbiAgICAgIHZhciBPYnNlcnZlckZ1bmMgPSBPYnNlcnZlci5mdW5jO1xuICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE9ic2VydmVyRnVuYyhmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICAgIC8vIFRoZSBvYnNlcnZlclVwZGF0ZSBldmVudCBzaG91bGQgb25seSBiZSB0cmlnZ2VyZWRcbiAgICAgICAgLy8gb25jZSBkZXNwaXRlIHRoZSBudW1iZXIgb2YgbXV0YXRpb25zLiAgQWRkaXRpb25hbFxuICAgICAgICAvLyB0cmlnZ2VycyBhcmUgcmVkdW5kYW50IGFuZCBhcmUgdmVyeSBjb3N0bHlcbiAgICAgICAgaWYgKG11dGF0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnb2JzZXJ2ZXJVcGRhdGUnLCBtdXRhdGlvbnNbMF0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb2JzZXJ2ZXJVcGRhdGUgPSBmdW5jdGlvbiBvYnNlcnZlclVwZGF0ZSgpIHtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnb2JzZXJ2ZXJVcGRhdGUnLCBtdXRhdGlvbnNbMF0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh3aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgd2luLnJlcXVlc3RBbmltYXRpb25GcmFtZShvYnNlcnZlclVwZGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luLnNldFRpbWVvdXQob2JzZXJ2ZXJVcGRhdGUsIDApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQsIHtcbiAgICAgICAgYXR0cmlidXRlczogdHlwZW9mIG9wdGlvbnMuYXR0cmlidXRlcyA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogb3B0aW9ucy5hdHRyaWJ1dGVzLFxuICAgICAgICBjaGlsZExpc3Q6IHR5cGVvZiBvcHRpb25zLmNoaWxkTGlzdCA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogb3B0aW9ucy5jaGlsZExpc3QsXG4gICAgICAgIGNoYXJhY3RlckRhdGE6IHR5cGVvZiBvcHRpb25zLmNoYXJhY3RlckRhdGEgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IG9wdGlvbnMuY2hhcmFjdGVyRGF0YSxcbiAgICAgIH0pO1xuXG4gICAgICBzd2lwZXIub2JzZXJ2ZXIub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFTdXBwb3J0Lm9ic2VydmVyIHx8ICFzd2lwZXIucGFyYW1zLm9ic2VydmVyKSB7IHJldHVybjsgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMub2JzZXJ2ZVBhcmVudHMpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lclBhcmVudHMgPSBzd2lwZXIuJGVsLnBhcmVudHMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250YWluZXJQYXJlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgc3dpcGVyLm9ic2VydmVyLmF0dGFjaChjb250YWluZXJQYXJlbnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gT2JzZXJ2ZSBjb250YWluZXJcbiAgICAgIHN3aXBlci5vYnNlcnZlci5hdHRhY2goc3dpcGVyLiRlbFswXSwgeyBjaGlsZExpc3Q6IHN3aXBlci5wYXJhbXMub2JzZXJ2ZVNsaWRlQ2hpbGRyZW4gfSk7XG5cbiAgICAgIC8vIE9ic2VydmUgd3JhcHBlclxuICAgICAgc3dpcGVyLm9ic2VydmVyLmF0dGFjaChzd2lwZXIuJHdyYXBwZXJFbFswXSwgeyBhdHRyaWJ1dGVzOiBmYWxzZSB9KTtcbiAgICB9LFxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHN3aXBlci5vYnNlcnZlci5vYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfSk7XG4gICAgICBzd2lwZXIub2JzZXJ2ZXIub2JzZXJ2ZXJzID0gW107XG4gICAgfSxcbiAgfTtcblxuICB2YXIgT2JzZXJ2ZXIkMSA9IHtcbiAgICBuYW1lOiAnb2JzZXJ2ZXInLFxuICAgIHBhcmFtczoge1xuICAgICAgb2JzZXJ2ZXI6IGZhbHNlLFxuICAgICAgb2JzZXJ2ZVBhcmVudHM6IGZhbHNlLFxuICAgICAgb2JzZXJ2ZVNsaWRlQ2hpbGRyZW46IGZhbHNlLFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgb2JzZXJ2ZXI6IHtcbiAgICAgICAgICBpbml0OiBPYnNlcnZlci5pbml0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBhdHRhY2g6IE9ic2VydmVyLmF0dGFjaC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgZGVzdHJveTogT2JzZXJ2ZXIuZGVzdHJveS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgb2JzZXJ2ZXJzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb246IHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIub2JzZXJ2ZXIuaW5pdCgpO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIub2JzZXJ2ZXIuZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBWaXJ0dWFsID0ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGZvcmNlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciByZWYgPSBzd2lwZXIucGFyYW1zO1xuICAgICAgdmFyIHNsaWRlc1BlclZpZXcgPSByZWYuc2xpZGVzUGVyVmlldztcbiAgICAgIHZhciBzbGlkZXNQZXJHcm91cCA9IHJlZi5zbGlkZXNQZXJHcm91cDtcbiAgICAgIHZhciBjZW50ZXJlZFNsaWRlcyA9IHJlZi5jZW50ZXJlZFNsaWRlcztcbiAgICAgIHZhciByZWYkMSA9IHN3aXBlci5wYXJhbXMudmlydHVhbDtcbiAgICAgIHZhciBhZGRTbGlkZXNCZWZvcmUgPSByZWYkMS5hZGRTbGlkZXNCZWZvcmU7XG4gICAgICB2YXIgYWRkU2xpZGVzQWZ0ZXIgPSByZWYkMS5hZGRTbGlkZXNBZnRlcjtcbiAgICAgIHZhciByZWYkMiA9IHN3aXBlci52aXJ0dWFsO1xuICAgICAgdmFyIHByZXZpb3VzRnJvbSA9IHJlZiQyLmZyb207XG4gICAgICB2YXIgcHJldmlvdXNUbyA9IHJlZiQyLnRvO1xuICAgICAgdmFyIHNsaWRlcyA9IHJlZiQyLnNsaWRlcztcbiAgICAgIHZhciBwcmV2aW91c1NsaWRlc0dyaWQgPSByZWYkMi5zbGlkZXNHcmlkO1xuICAgICAgdmFyIHJlbmRlclNsaWRlID0gcmVmJDIucmVuZGVyU2xpZGU7XG4gICAgICB2YXIgcHJldmlvdXNPZmZzZXQgPSByZWYkMi5vZmZzZXQ7XG4gICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgIHZhciBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleCB8fCAwO1xuXG4gICAgICB2YXIgb2Zmc2V0UHJvcDtcbiAgICAgIGlmIChzd2lwZXIucnRsVHJhbnNsYXRlKSB7IG9mZnNldFByb3AgPSAncmlnaHQnOyB9XG4gICAgICBlbHNlIHsgb2Zmc2V0UHJvcCA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/ICdsZWZ0JyA6ICd0b3AnOyB9XG5cbiAgICAgIHZhciBzbGlkZXNBZnRlcjtcbiAgICAgIHZhciBzbGlkZXNCZWZvcmU7XG4gICAgICBpZiAoY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgICAgc2xpZGVzQWZ0ZXIgPSBNYXRoLmZsb29yKHNsaWRlc1BlclZpZXcgLyAyKSArIHNsaWRlc1Blckdyb3VwICsgYWRkU2xpZGVzQmVmb3JlO1xuICAgICAgICBzbGlkZXNCZWZvcmUgPSBNYXRoLmZsb29yKHNsaWRlc1BlclZpZXcgLyAyKSArIHNsaWRlc1Blckdyb3VwICsgYWRkU2xpZGVzQWZ0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGlkZXNBZnRlciA9IHNsaWRlc1BlclZpZXcgKyAoc2xpZGVzUGVyR3JvdXAgLSAxKSArIGFkZFNsaWRlc0JlZm9yZTtcbiAgICAgICAgc2xpZGVzQmVmb3JlID0gc2xpZGVzUGVyR3JvdXAgKyBhZGRTbGlkZXNBZnRlcjtcbiAgICAgIH1cbiAgICAgIHZhciBmcm9tID0gTWF0aC5tYXgoKGFjdGl2ZUluZGV4IHx8IDApIC0gc2xpZGVzQmVmb3JlLCAwKTtcbiAgICAgIHZhciB0byA9IE1hdGgubWluKChhY3RpdmVJbmRleCB8fCAwKSArIHNsaWRlc0FmdGVyLCBzbGlkZXMubGVuZ3RoIC0gMSk7XG4gICAgICB2YXIgb2Zmc2V0ID0gKHN3aXBlci5zbGlkZXNHcmlkW2Zyb21dIHx8IDApIC0gKHN3aXBlci5zbGlkZXNHcmlkWzBdIHx8IDApO1xuXG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLnZpcnR1YWwsIHtcbiAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgdG86IHRvLFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgc2xpZGVzR3JpZDogc3dpcGVyLnNsaWRlc0dyaWQsXG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gb25SZW5kZXJlZCgpIHtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICAgICAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3MoKTtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgICAgaWYgKHN3aXBlci5sYXp5ICYmIHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkKSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2aW91c0Zyb20gPT09IGZyb20gJiYgcHJldmlvdXNUbyA9PT0gdG8gJiYgIWZvcmNlKSB7XG4gICAgICAgIGlmIChzd2lwZXIuc2xpZGVzR3JpZCAhPT0gcHJldmlvdXNTbGlkZXNHcmlkICYmIG9mZnNldCAhPT0gcHJldmlvdXNPZmZzZXQpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVzLmNzcyhvZmZzZXRQcm9wLCAob2Zmc2V0ICsgXCJweFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLnZpcnR1YWwucmVuZGVyRXh0ZXJuYWwpIHtcbiAgICAgICAgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLnJlbmRlckV4dGVybmFsLmNhbGwoc3dpcGVyLCB7XG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICB0bzogdG8sXG4gICAgICAgICAgc2xpZGVzOiAoZnVuY3Rpb24gZ2V0U2xpZGVzKCkge1xuICAgICAgICAgICAgdmFyIHNsaWRlc1RvUmVuZGVyID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZnJvbTsgaSA8PSB0bzsgaSArPSAxKSB7XG4gICAgICAgICAgICAgIHNsaWRlc1RvUmVuZGVyLnB1c2goc2xpZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzbGlkZXNUb1JlbmRlcjtcbiAgICAgICAgICB9KCkpLFxuICAgICAgICB9KTtcbiAgICAgICAgb25SZW5kZXJlZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgcHJlcGVuZEluZGV4ZXMgPSBbXTtcbiAgICAgIHZhciBhcHBlbmRJbmRleGVzID0gW107XG4gICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwuZmluZCgoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5zbGlkZUNsYXNzKSkpLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHByZXZpb3VzRnJvbTsgaSA8PSBwcmV2aW91c1RvOyBpICs9IDEpIHtcbiAgICAgICAgICBpZiAoaSA8IGZyb20gfHwgaSA+IHRvKSB7XG4gICAgICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5maW5kKChcIi5cIiArIChzd2lwZXIucGFyYW1zLnNsaWRlQ2xhc3MpICsgXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgaSArIFwiXFxcIl1cIikpLnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgc2xpZGVzLmxlbmd0aDsgaSQxICs9IDEpIHtcbiAgICAgICAgaWYgKGkkMSA+PSBmcm9tICYmIGkkMSA8PSB0bykge1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJldmlvdXNUbyA9PT0gJ3VuZGVmaW5lZCcgfHwgZm9yY2UpIHtcbiAgICAgICAgICAgIGFwcGVuZEluZGV4ZXMucHVzaChpJDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaSQxID4gcHJldmlvdXNUbykgeyBhcHBlbmRJbmRleGVzLnB1c2goaSQxKTsgfVxuICAgICAgICAgICAgaWYgKGkkMSA8IHByZXZpb3VzRnJvbSkgeyBwcmVwZW5kSW5kZXhlcy5wdXNoKGkkMSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFwcGVuZEluZGV4ZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwuYXBwZW5kKHJlbmRlclNsaWRlKHNsaWRlc1tpbmRleF0sIGluZGV4KSk7XG4gICAgICB9KTtcbiAgICAgIHByZXBlbmRJbmRleGVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIgLSBhOyB9KS5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5wcmVwZW5kKHJlbmRlclNsaWRlKHNsaWRlc1tpbmRleF0sIGluZGV4KSk7XG4gICAgICB9KTtcbiAgICAgIHN3aXBlci4kd3JhcHBlckVsLmNoaWxkcmVuKCcuc3dpcGVyLXNsaWRlJykuY3NzKG9mZnNldFByb3AsIChvZmZzZXQgKyBcInB4XCIpKTtcbiAgICAgIG9uUmVuZGVyZWQoKTtcbiAgICB9LFxuICAgIHJlbmRlclNsaWRlOiBmdW5jdGlvbiByZW5kZXJTbGlkZShzbGlkZSwgaW5kZXgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMudmlydHVhbDtcbiAgICAgIGlmIChwYXJhbXMuY2FjaGUgJiYgc3dpcGVyLnZpcnR1YWwuY2FjaGVbaW5kZXhdKSB7XG4gICAgICAgIHJldHVybiBzd2lwZXIudmlydHVhbC5jYWNoZVtpbmRleF07XG4gICAgICB9XG4gICAgICB2YXIgJHNsaWRlRWwgPSBwYXJhbXMucmVuZGVyU2xpZGVcbiAgICAgICAgPyAkKHBhcmFtcy5yZW5kZXJTbGlkZS5jYWxsKHN3aXBlciwgc2xpZGUsIGluZGV4KSlcbiAgICAgICAgOiAkKChcIjxkaXYgY2xhc3M9XFxcIlwiICsgKHN3aXBlci5wYXJhbXMuc2xpZGVDbGFzcykgKyBcIlxcXCIgZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgaW5kZXggKyBcIlxcXCI+XCIgKyBzbGlkZSArIFwiPC9kaXY+XCIpKTtcbiAgICAgIGlmICghJHNsaWRlRWwuYXR0cignZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKSkgeyAkc2xpZGVFbC5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcsIGluZGV4KTsgfVxuICAgICAgaWYgKHBhcmFtcy5jYWNoZSkgeyBzd2lwZXIudmlydHVhbC5jYWNoZVtpbmRleF0gPSAkc2xpZGVFbDsgfVxuICAgICAgcmV0dXJuICRzbGlkZUVsO1xuICAgIH0sXG4gICAgYXBwZW5kU2xpZGU6IGZ1bmN0aW9uIGFwcGVuZFNsaWRlKHNsaWRlcykge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAodHlwZW9mIHNsaWRlcyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gc2xpZGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlc1tpXSkgeyBzd2lwZXIudmlydHVhbC5zbGlkZXMucHVzaChzbGlkZXNbaV0pOyB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci52aXJ0dWFsLnNsaWRlcy5wdXNoKHNsaWRlcyk7XG4gICAgICB9XG4gICAgICBzd2lwZXIudmlydHVhbC51cGRhdGUodHJ1ZSk7XG4gICAgfSxcbiAgICBwcmVwZW5kU2xpZGU6IGZ1bmN0aW9uIHByZXBlbmRTbGlkZShzbGlkZXMpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgICAgdmFyIG5ld0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggKyAxO1xuICAgICAgdmFyIG51bWJlck9mTmV3U2xpZGVzID0gMTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2xpZGVzKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChzbGlkZXNbaV0pIHsgc3dpcGVyLnZpcnR1YWwuc2xpZGVzLnVuc2hpZnQoc2xpZGVzW2ldKTsgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggKyBzbGlkZXMubGVuZ3RoO1xuICAgICAgICBudW1iZXJPZk5ld1NsaWRlcyA9IHNsaWRlcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2lwZXIudmlydHVhbC5zbGlkZXMudW5zaGlmdChzbGlkZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudmlydHVhbC5jYWNoZSkge1xuICAgICAgICB2YXIgY2FjaGUgPSBzd2lwZXIudmlydHVhbC5jYWNoZTtcbiAgICAgICAgdmFyIG5ld0NhY2hlID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKGNhY2hlKS5mb3JFYWNoKGZ1bmN0aW9uIChjYWNoZWRJbmRleCkge1xuICAgICAgICAgIG5ld0NhY2hlW3BhcnNlSW50KGNhY2hlZEluZGV4LCAxMCkgKyBudW1iZXJPZk5ld1NsaWRlc10gPSBjYWNoZVtjYWNoZWRJbmRleF07XG4gICAgICAgIH0pO1xuICAgICAgICBzd2lwZXIudmlydHVhbC5jYWNoZSA9IG5ld0NhY2hlO1xuICAgICAgfVxuICAgICAgc3dpcGVyLnZpcnR1YWwudXBkYXRlKHRydWUpO1xuICAgICAgc3dpcGVyLnNsaWRlVG8obmV3QWN0aXZlSW5kZXgsIDApO1xuICAgIH0sXG4gICAgcmVtb3ZlU2xpZGU6IGZ1bmN0aW9uIHJlbW92ZVNsaWRlKHNsaWRlc0luZGV4ZXMpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBzbGlkZXNJbmRleGVzID09PSAndW5kZWZpbmVkJyB8fCBzbGlkZXNJbmRleGVzID09PSBudWxsKSB7IHJldHVybjsgfVxuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2xpZGVzSW5kZXhlcykpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHNsaWRlc0luZGV4ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgICBzd2lwZXIudmlydHVhbC5zbGlkZXMuc3BsaWNlKHNsaWRlc0luZGV4ZXNbaV0sIDEpO1xuICAgICAgICAgIGlmIChzd2lwZXIucGFyYW1zLnZpcnR1YWwuY2FjaGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzd2lwZXIudmlydHVhbC5jYWNoZVtzbGlkZXNJbmRleGVzW2ldXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNsaWRlc0luZGV4ZXNbaV0gPCBhY3RpdmVJbmRleCkgeyBhY3RpdmVJbmRleCAtPSAxOyB9XG4gICAgICAgICAgYWN0aXZlSW5kZXggPSBNYXRoLm1heChhY3RpdmVJbmRleCwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci52aXJ0dWFsLnNsaWRlcy5zcGxpY2Uoc2xpZGVzSW5kZXhlcywgMSk7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLnZpcnR1YWwuY2FjaGUpIHtcbiAgICAgICAgICBkZWxldGUgc3dpcGVyLnZpcnR1YWwuY2FjaGVbc2xpZGVzSW5kZXhlc107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNsaWRlc0luZGV4ZXMgPCBhY3RpdmVJbmRleCkgeyBhY3RpdmVJbmRleCAtPSAxOyB9XG4gICAgICAgIGFjdGl2ZUluZGV4ID0gTWF0aC5tYXgoYWN0aXZlSW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgc3dpcGVyLnZpcnR1YWwudXBkYXRlKHRydWUpO1xuICAgICAgc3dpcGVyLnNsaWRlVG8oYWN0aXZlSW5kZXgsIDApO1xuICAgIH0sXG4gICAgcmVtb3ZlQWxsU2xpZGVzOiBmdW5jdGlvbiByZW1vdmVBbGxTbGlkZXMoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHN3aXBlci52aXJ0dWFsLnNsaWRlcyA9IFtdO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudmlydHVhbC5jYWNoZSkge1xuICAgICAgICBzd2lwZXIudmlydHVhbC5jYWNoZSA9IHt9O1xuICAgICAgfVxuICAgICAgc3dpcGVyLnZpcnR1YWwudXBkYXRlKHRydWUpO1xuICAgICAgc3dpcGVyLnNsaWRlVG8oMCwgMCk7XG4gICAgfSxcbiAgfTtcblxuICB2YXIgVmlydHVhbCQxID0ge1xuICAgIG5hbWU6ICd2aXJ0dWFsJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHZpcnR1YWw6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHNsaWRlczogW10sXG4gICAgICAgIGNhY2hlOiB0cnVlLFxuICAgICAgICByZW5kZXJTbGlkZTogbnVsbCxcbiAgICAgICAgcmVuZGVyRXh0ZXJuYWw6IG51bGwsXG4gICAgICAgIGFkZFNsaWRlc0JlZm9yZTogMCxcbiAgICAgICAgYWRkU2xpZGVzQWZ0ZXI6IDAsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgdmlydHVhbDoge1xuICAgICAgICAgIHVwZGF0ZTogVmlydHVhbC51cGRhdGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGFwcGVuZFNsaWRlOiBWaXJ0dWFsLmFwcGVuZFNsaWRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBwcmVwZW5kU2xpZGU6IFZpcnR1YWwucHJlcGVuZFNsaWRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICByZW1vdmVTbGlkZTogVmlydHVhbC5yZW1vdmVTbGlkZS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgcmVtb3ZlQWxsU2xpZGVzOiBWaXJ0dWFsLnJlbW92ZUFsbFNsaWRlcy5iaW5kKHN3aXBlciksXG4gICAgICAgICAgcmVuZGVyU2xpZGU6IFZpcnR1YWwucmVuZGVyU2xpZGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIHNsaWRlczogc3dpcGVyLnBhcmFtcy52aXJ0dWFsLnNsaWRlcyxcbiAgICAgICAgICBjYWNoZToge30sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBiZWZvcmVJbml0OiBmdW5jdGlvbiBiZWZvcmVJbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmNsYXNzTmFtZXMucHVzaCgoKHN3aXBlci5wYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzcykgKyBcInZpcnR1YWxcIikpO1xuICAgICAgICB2YXIgb3ZlcndyaXRlUGFyYW1zID0ge1xuICAgICAgICAgIHdhdGNoU2xpZGVzUHJvZ3Jlc3M6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIucGFyYW1zLCBvdmVyd3JpdGVQYXJhbXMpO1xuICAgICAgICBVdGlscy5leHRlbmQoc3dpcGVyLm9yaWdpbmFsUGFyYW1zLCBvdmVyd3JpdGVQYXJhbXMpO1xuXG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5pbml0aWFsU2xpZGUpIHtcbiAgICAgICAgICBzd2lwZXIudmlydHVhbC51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gc2V0VHJhbnNsYXRlKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLnZpcnR1YWwudXBkYXRlKCk7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIEtleWJvYXJkID0ge1xuICAgIGhhbmRsZTogZnVuY3Rpb24gaGFuZGxlKGV2ZW50KSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBydGwgPSBzd2lwZXIucnRsVHJhbnNsYXRlO1xuICAgICAgdmFyIGUgPSBldmVudDtcbiAgICAgIGlmIChlLm9yaWdpbmFsRXZlbnQpIHsgZSA9IGUub3JpZ2luYWxFdmVudDsgfSAvLyBqcXVlcnkgZml4XG4gICAgICB2YXIga2MgPSBlLmtleUNvZGUgfHwgZS5jaGFyQ29kZTtcbiAgICAgIC8vIERpcmVjdGlvbnMgbG9ja3NcbiAgICAgIGlmICghc3dpcGVyLmFsbG93U2xpZGVOZXh0ICYmICgoc3dpcGVyLmlzSG9yaXpvbnRhbCgpICYmIGtjID09PSAzOSkgfHwgKHN3aXBlci5pc1ZlcnRpY2FsKCkgJiYga2MgPT09IDQwKSB8fCBrYyA9PT0gMzQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghc3dpcGVyLmFsbG93U2xpZGVQcmV2ICYmICgoc3dpcGVyLmlzSG9yaXpvbnRhbCgpICYmIGtjID09PSAzNykgfHwgKHN3aXBlci5pc1ZlcnRpY2FsKCkgJiYga2MgPT09IDM4KSB8fCBrYyA9PT0gMzMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChlLnNoaWZ0S2V5IHx8IGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLm1ldGFLZXkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChkb2MuYWN0aXZlRWxlbWVudCAmJiBkb2MuYWN0aXZlRWxlbWVudC5ub2RlTmFtZSAmJiAoZG9jLmFjdGl2ZUVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyB8fCBkb2MuYWN0aXZlRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGV4dGFyZWEnKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMua2V5Ym9hcmQub25seUluVmlld3BvcnQgJiYgKGtjID09PSAzMyB8fCBrYyA9PT0gMzQgfHwga2MgPT09IDM3IHx8IGtjID09PSAzOSB8fCBrYyA9PT0gMzggfHwga2MgPT09IDQwKSkge1xuICAgICAgICB2YXIgaW5WaWV3ID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIHRoYXQgc3dpcGVyIHNob3VsZCBiZSBpbnNpZGUgb2YgdmlzaWJsZSBhcmVhIG9mIHdpbmRvd1xuICAgICAgICBpZiAoc3dpcGVyLiRlbC5wYXJlbnRzKChcIi5cIiArIChzd2lwZXIucGFyYW1zLnNsaWRlQ2xhc3MpKSkubGVuZ3RoID4gMCAmJiBzd2lwZXIuJGVsLnBhcmVudHMoKFwiLlwiICsgKHN3aXBlci5wYXJhbXMuc2xpZGVBY3RpdmVDbGFzcykpKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3aW5kb3dXaWR0aCA9IHdpbi5pbm5lcldpZHRoO1xuICAgICAgICB2YXIgd2luZG93SGVpZ2h0ID0gd2luLmlubmVySGVpZ2h0O1xuICAgICAgICB2YXIgc3dpcGVyT2Zmc2V0ID0gc3dpcGVyLiRlbC5vZmZzZXQoKTtcbiAgICAgICAgaWYgKHJ0bCkgeyBzd2lwZXJPZmZzZXQubGVmdCAtPSBzd2lwZXIuJGVsWzBdLnNjcm9sbExlZnQ7IH1cbiAgICAgICAgdmFyIHN3aXBlckNvb3JkID0gW1xuICAgICAgICAgIFtzd2lwZXJPZmZzZXQubGVmdCwgc3dpcGVyT2Zmc2V0LnRvcF0sXG4gICAgICAgICAgW3N3aXBlck9mZnNldC5sZWZ0ICsgc3dpcGVyLndpZHRoLCBzd2lwZXJPZmZzZXQudG9wXSxcbiAgICAgICAgICBbc3dpcGVyT2Zmc2V0LmxlZnQsIHN3aXBlck9mZnNldC50b3AgKyBzd2lwZXIuaGVpZ2h0XSxcbiAgICAgICAgICBbc3dpcGVyT2Zmc2V0LmxlZnQgKyBzd2lwZXIud2lkdGgsIHN3aXBlck9mZnNldC50b3AgKyBzd2lwZXIuaGVpZ2h0XSBdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN3aXBlckNvb3JkLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIHBvaW50ID0gc3dpcGVyQ29vcmRbaV07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcG9pbnRbMF0gPj0gMCAmJiBwb2ludFswXSA8PSB3aW5kb3dXaWR0aFxuICAgICAgICAgICAgJiYgcG9pbnRbMV0gPj0gMCAmJiBwb2ludFsxXSA8PSB3aW5kb3dIZWlnaHRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGluVmlldyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaW5WaWV3KSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgaWYgKGtjID09PSAzMyB8fCBrYyA9PT0gMzQgfHwga2MgPT09IDM3IHx8IGtjID09PSAzOSkge1xuICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgICAgICAgIGVsc2UgeyBlLnJldHVyblZhbHVlID0gZmFsc2U7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKChrYyA9PT0gMzQgfHwga2MgPT09IDM5KSAmJiAhcnRsKSB8fCAoKGtjID09PSAzMyB8fCBrYyA9PT0gMzcpICYmIHJ0bCkpIHsgc3dpcGVyLnNsaWRlTmV4dCgpOyB9XG4gICAgICAgIGlmICgoKGtjID09PSAzMyB8fCBrYyA9PT0gMzcpICYmICFydGwpIHx8ICgoa2MgPT09IDM0IHx8IGtjID09PSAzOSkgJiYgcnRsKSkgeyBzd2lwZXIuc2xpZGVQcmV2KCk7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChrYyA9PT0gMzMgfHwga2MgPT09IDM0IHx8IGtjID09PSAzOCB8fCBrYyA9PT0gNDApIHtcbiAgICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICAgICAgICBlbHNlIHsgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtjID09PSAzNCB8fCBrYyA9PT0gNDApIHsgc3dpcGVyLnNsaWRlTmV4dCgpOyB9XG4gICAgICAgIGlmIChrYyA9PT0gMzMgfHwga2MgPT09IDM4KSB7IHN3aXBlci5zbGlkZVByZXYoKTsgfVxuICAgICAgfVxuICAgICAgc3dpcGVyLmVtaXQoJ2tleVByZXNzJywga2MpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGVuYWJsZTogZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoc3dpcGVyLmtleWJvYXJkLmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAkKGRvYykub24oJ2tleWRvd24nLCBzd2lwZXIua2V5Ym9hcmQuaGFuZGxlKTtcbiAgICAgIHN3aXBlci5rZXlib2FyZC5lbmFibGVkID0gdHJ1ZTtcbiAgICB9LFxuICAgIGRpc2FibGU6IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLmtleWJvYXJkLmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAkKGRvYykub2ZmKCdrZXlkb3duJywgc3dpcGVyLmtleWJvYXJkLmhhbmRsZSk7XG4gICAgICBzd2lwZXIua2V5Ym9hcmQuZW5hYmxlZCA9IGZhbHNlO1xuICAgIH0sXG4gIH07XG5cbiAgdmFyIEtleWJvYXJkJDEgPSB7XG4gICAgbmFtZTogJ2tleWJvYXJkJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGtleWJvYXJkOiB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBvbmx5SW5WaWV3cG9ydDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBrZXlib2FyZDoge1xuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGVuYWJsZTogS2V5Ym9hcmQuZW5hYmxlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBkaXNhYmxlOiBLZXlib2FyZC5kaXNhYmxlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBoYW5kbGU6IEtleWJvYXJkLmhhbmRsZS5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMua2V5Ym9hcmQuZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci5rZXlib2FyZC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLmtleWJvYXJkLmVuYWJsZWQpIHtcbiAgICAgICAgICBzd2lwZXIua2V5Ym9hcmQuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZCgpIHtcbiAgICB2YXIgZXZlbnROYW1lID0gJ29ud2hlZWwnO1xuICAgIHZhciBpc1N1cHBvcnRlZCA9IGV2ZW50TmFtZSBpbiBkb2M7XG5cbiAgICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBpZiAoIWlzU3VwcG9ydGVkXG4gICAgICAmJiBkb2MuaW1wbGVtZW50YXRpb25cbiAgICAgICYmIGRvYy5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlXG4gICAgICAvLyBhbHdheXMgcmV0dXJucyB0cnVlIGluIG5ld2VyIGJyb3dzZXJzIGFzIHBlciB0aGUgc3RhbmRhcmQuXG4gICAgICAvLyBAc2VlIGh0dHA6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZG9taW1wbGVtZW50YXRpb24taGFzZmVhdHVyZVxuICAgICAgJiYgZG9jLmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoJycsICcnKSAhPT0gdHJ1ZVxuICAgICkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSB3YXkgdG8gdGVzdCBzdXBwb3J0IGZvciB0aGUgYHdoZWVsYCBldmVudCBpbiBJRTkrLlxuICAgICAgaXNTdXBwb3J0ZWQgPSBkb2MuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgnRXZlbnRzLndoZWVsJywgJzMuMCcpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1N1cHBvcnRlZDtcbiAgfVxuICB2YXIgTW91c2V3aGVlbCA9IHtcbiAgICBsYXN0U2Nyb2xsVGltZTogVXRpbHMubm93KCksXG4gICAgZXZlbnQ6IChmdW5jdGlvbiBnZXRFdmVudCgpIHtcbiAgICAgIGlmICh3aW4ubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdmaXJlZm94JykgPiAtMSkgeyByZXR1cm4gJ0RPTU1vdXNlU2Nyb2xsJzsgfVxuICAgICAgcmV0dXJuIGlzRXZlbnRTdXBwb3J0ZWQoKSA/ICd3aGVlbCcgOiAnbW91c2V3aGVlbCc7XG4gICAgfSgpKSxcbiAgICBub3JtYWxpemU6IGZ1bmN0aW9uIG5vcm1hbGl6ZShlKSB7XG4gICAgICAvLyBSZWFzb25hYmxlIGRlZmF1bHRzXG4gICAgICB2YXIgUElYRUxfU1RFUCA9IDEwO1xuICAgICAgdmFyIExJTkVfSEVJR0hUID0gNDA7XG4gICAgICB2YXIgUEFHRV9IRUlHSFQgPSA4MDA7XG5cbiAgICAgIHZhciBzWCA9IDA7XG4gICAgICB2YXIgc1kgPSAwOyAvLyBzcGluWCwgc3BpbllcbiAgICAgIHZhciBwWCA9IDA7XG4gICAgICB2YXIgcFkgPSAwOyAvLyBwaXhlbFgsIHBpeGVsWVxuXG4gICAgICAvLyBMZWdhY3lcbiAgICAgIGlmICgnZGV0YWlsJyBpbiBlKSB7XG4gICAgICAgIHNZID0gZS5kZXRhaWw7XG4gICAgICB9XG4gICAgICBpZiAoJ3doZWVsRGVsdGEnIGluIGUpIHtcbiAgICAgICAgc1kgPSAtZS53aGVlbERlbHRhIC8gMTIwO1xuICAgICAgfVxuICAgICAgaWYgKCd3aGVlbERlbHRhWScgaW4gZSkge1xuICAgICAgICBzWSA9IC1lLndoZWVsRGVsdGFZIC8gMTIwO1xuICAgICAgfVxuICAgICAgaWYgKCd3aGVlbERlbHRhWCcgaW4gZSkge1xuICAgICAgICBzWCA9IC1lLndoZWVsRGVsdGFYIC8gMTIwO1xuICAgICAgfVxuXG4gICAgICAvLyBzaWRlIHNjcm9sbGluZyBvbiBGRiB3aXRoIERPTU1vdXNlU2Nyb2xsXG4gICAgICBpZiAoJ2F4aXMnIGluIGUgJiYgZS5heGlzID09PSBlLkhPUklaT05UQUxfQVhJUykge1xuICAgICAgICBzWCA9IHNZO1xuICAgICAgICBzWSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHBYID0gc1ggKiBQSVhFTF9TVEVQO1xuICAgICAgcFkgPSBzWSAqIFBJWEVMX1NURVA7XG5cbiAgICAgIGlmICgnZGVsdGFZJyBpbiBlKSB7XG4gICAgICAgIHBZID0gZS5kZWx0YVk7XG4gICAgICB9XG4gICAgICBpZiAoJ2RlbHRhWCcgaW4gZSkge1xuICAgICAgICBwWCA9IGUuZGVsdGFYO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHBYIHx8IHBZKSAmJiBlLmRlbHRhTW9kZSkge1xuICAgICAgICBpZiAoZS5kZWx0YU1vZGUgPT09IDEpIHsgLy8gZGVsdGEgaW4gTElORSB1bml0c1xuICAgICAgICAgIHBYICo9IExJTkVfSEVJR0hUO1xuICAgICAgICAgIHBZICo9IExJTkVfSEVJR0hUO1xuICAgICAgICB9IGVsc2UgeyAvLyBkZWx0YSBpbiBQQUdFIHVuaXRzXG4gICAgICAgICAgcFggKj0gUEFHRV9IRUlHSFQ7XG4gICAgICAgICAgcFkgKj0gUEFHRV9IRUlHSFQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmFsbC1iYWNrIGlmIHNwaW4gY2Fubm90IGJlIGRldGVybWluZWRcbiAgICAgIGlmIChwWCAmJiAhc1gpIHtcbiAgICAgICAgc1ggPSAocFggPCAxKSA/IC0xIDogMTtcbiAgICAgIH1cbiAgICAgIGlmIChwWSAmJiAhc1kpIHtcbiAgICAgICAgc1kgPSAocFkgPCAxKSA/IC0xIDogMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3Bpblg6IHNYLFxuICAgICAgICBzcGluWTogc1ksXG4gICAgICAgIHBpeGVsWDogcFgsXG4gICAgICAgIHBpeGVsWTogcFksXG4gICAgICB9O1xuICAgIH0sXG4gICAgaGFuZGxlTW91c2VFbnRlcjogZnVuY3Rpb24gaGFuZGxlTW91c2VFbnRlcigpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgc3dpcGVyLm1vdXNlRW50ZXJlZCA9IHRydWU7XG4gICAgfSxcbiAgICBoYW5kbGVNb3VzZUxlYXZlOiBmdW5jdGlvbiBoYW5kbGVNb3VzZUxlYXZlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBzd2lwZXIubW91c2VFbnRlcmVkID0gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGU6IGZ1bmN0aW9uIGhhbmRsZShldmVudCkge1xuICAgICAgdmFyIGUgPSBldmVudDtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMubW91c2V3aGVlbDtcblxuICAgICAgaWYgKCFzd2lwZXIubW91c2VFbnRlcmVkICYmICFwYXJhbXMucmVsZWFzZU9uRWRnZXMpIHsgcmV0dXJuIHRydWU7IH1cblxuICAgICAgaWYgKGUub3JpZ2luYWxFdmVudCkgeyBlID0gZS5vcmlnaW5hbEV2ZW50OyB9IC8vIGpxdWVyeSBmaXhcbiAgICAgIHZhciBkZWx0YSA9IDA7XG4gICAgICB2YXIgcnRsRmFjdG9yID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZSA/IC0xIDogMTtcblxuICAgICAgdmFyIGRhdGEgPSBNb3VzZXdoZWVsLm5vcm1hbGl6ZShlKTtcblxuICAgICAgaWYgKHBhcmFtcy5mb3JjZVRvQXhpcykge1xuICAgICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICAgaWYgKE1hdGguYWJzKGRhdGEucGl4ZWxYKSA+IE1hdGguYWJzKGRhdGEucGl4ZWxZKSkgeyBkZWx0YSA9IGRhdGEucGl4ZWxYICogcnRsRmFjdG9yOyB9XG4gICAgICAgICAgZWxzZSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGF0YS5waXhlbFkpID4gTWF0aC5hYnMoZGF0YS5waXhlbFgpKSB7IGRlbHRhID0gZGF0YS5waXhlbFk7IH1cbiAgICAgICAgZWxzZSB7IHJldHVybiB0cnVlOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWx0YSA9IE1hdGguYWJzKGRhdGEucGl4ZWxYKSA+IE1hdGguYWJzKGRhdGEucGl4ZWxZKSA/IC1kYXRhLnBpeGVsWCAqIHJ0bEZhY3RvciA6IC1kYXRhLnBpeGVsWTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbHRhID09PSAwKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgIGlmIChwYXJhbXMuaW52ZXJ0KSB7IGRlbHRhID0gLWRlbHRhOyB9XG5cbiAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5mcmVlTW9kZSkge1xuICAgICAgICBpZiAoVXRpbHMubm93KCkgLSBzd2lwZXIubW91c2V3aGVlbC5sYXN0U2Nyb2xsVGltZSA+IDYwKSB7XG4gICAgICAgICAgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgICAgICAgaWYgKCghc3dpcGVyLmlzRW5kIHx8IHN3aXBlci5wYXJhbXMubG9vcCkgJiYgIXN3aXBlci5hbmltYXRpbmcpIHtcbiAgICAgICAgICAgICAgc3dpcGVyLnNsaWRlTmV4dCgpO1xuICAgICAgICAgICAgICBzd2lwZXIuZW1pdCgnc2Nyb2xsJywgZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5yZWxlYXNlT25FZGdlcykgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoKCFzd2lwZXIuaXNCZWdpbm5pbmcgfHwgc3dpcGVyLnBhcmFtcy5sb29wKSAmJiAhc3dpcGVyLmFuaW1hdGluZykge1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlUHJldigpO1xuICAgICAgICAgICAgc3dpcGVyLmVtaXQoJ3Njcm9sbCcsIGUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnJlbGVhc2VPbkVkZ2VzKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIH1cbiAgICAgICAgc3dpcGVyLm1vdXNld2hlZWwubGFzdFNjcm9sbFRpbWUgPSAobmV3IHdpbi5EYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZyZWVtb2RlIG9yIHNjcm9sbENvbnRhaW5lcjpcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgICAgIHN3aXBlci5sb29wRml4KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvc2l0aW9uID0gc3dpcGVyLmdldFRyYW5zbGF0ZSgpICsgKGRlbHRhICogcGFyYW1zLnNlbnNpdGl2aXR5KTtcbiAgICAgICAgdmFyIHdhc0JlZ2lubmluZyA9IHN3aXBlci5pc0JlZ2lubmluZztcbiAgICAgICAgdmFyIHdhc0VuZCA9IHN3aXBlci5pc0VuZDtcblxuICAgICAgICBpZiAocG9zaXRpb24gPj0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSB7IHBvc2l0aW9uID0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpOyB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA8PSBzd2lwZXIubWF4VHJhbnNsYXRlKCkpIHsgcG9zaXRpb24gPSBzd2lwZXIubWF4VHJhbnNsYXRlKCk7IH1cblxuICAgICAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbigwKTtcbiAgICAgICAgc3dpcGVyLnNldFRyYW5zbGF0ZShwb3NpdGlvbik7XG4gICAgICAgIHN3aXBlci51cGRhdGVQcm9ncmVzcygpO1xuICAgICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcblxuICAgICAgICBpZiAoKCF3YXNCZWdpbm5pbmcgJiYgc3dpcGVyLmlzQmVnaW5uaW5nKSB8fCAoIXdhc0VuZCAmJiBzd2lwZXIuaXNFbmQpKSB7XG4gICAgICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmZyZWVNb2RlU3RpY2t5KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHN3aXBlci5tb3VzZXdoZWVsLnRpbWVvdXQpO1xuICAgICAgICAgIHN3aXBlci5tb3VzZXdoZWVsLnRpbWVvdXQgPSBVdGlscy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzd2lwZXIuc2xpZGVUb0Nsb3Nlc3QoKTtcbiAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgICAgc3dpcGVyLmVtaXQoJ3Njcm9sbCcsIGUpO1xuXG4gICAgICAgIC8vIFN0b3AgYXV0b3BsYXlcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkgJiYgc3dpcGVyLnBhcmFtcy5hdXRvcGxheURpc2FibGVPbkludGVyYWN0aW9uKSB7IHN3aXBlci5hdXRvcGxheS5zdG9wKCk7IH1cbiAgICAgICAgLy8gUmV0dXJuIHBhZ2Ugc2Nyb2xsIG9uIGVkZ2UgcG9zaXRpb25zXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpIHx8IHBvc2l0aW9uID09PSBzd2lwZXIubWF4VHJhbnNsYXRlKCkpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIH1cblxuICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9XG4gICAgICBlbHNlIHsgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOyB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBlbmFibGU6IGZ1bmN0aW9uIGVuYWJsZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFNb3VzZXdoZWVsLmV2ZW50KSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgaWYgKHN3aXBlci5tb3VzZXdoZWVsLmVuYWJsZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICB2YXIgdGFyZ2V0ID0gc3dpcGVyLiRlbDtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLm1vdXNld2hlZWwuZXZlbnRzVGFyZ2VkICE9PSAnY29udGFpbmVyJykge1xuICAgICAgICB0YXJnZXQgPSAkKHN3aXBlci5wYXJhbXMubW91c2V3aGVlbC5ldmVudHNUYXJnZWQpO1xuICAgICAgfVxuICAgICAgdGFyZ2V0Lm9uKCdtb3VzZWVudGVyJywgc3dpcGVyLm1vdXNld2hlZWwuaGFuZGxlTW91c2VFbnRlcik7XG4gICAgICB0YXJnZXQub24oJ21vdXNlbGVhdmUnLCBzd2lwZXIubW91c2V3aGVlbC5oYW5kbGVNb3VzZUxlYXZlKTtcbiAgICAgIHRhcmdldC5vbihNb3VzZXdoZWVsLmV2ZW50LCBzd2lwZXIubW91c2V3aGVlbC5oYW5kbGUpO1xuICAgICAgc3dpcGVyLm1vdXNld2hlZWwuZW5hYmxlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGRpc2FibGU6IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghTW91c2V3aGVlbC5ldmVudCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIGlmICghc3dpcGVyLm1vdXNld2hlZWwuZW5hYmxlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIHZhciB0YXJnZXQgPSBzd2lwZXIuJGVsO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMubW91c2V3aGVlbC5ldmVudHNUYXJnZWQgIT09ICdjb250YWluZXInKSB7XG4gICAgICAgIHRhcmdldCA9ICQoc3dpcGVyLnBhcmFtcy5tb3VzZXdoZWVsLmV2ZW50c1RhcmdlZCk7XG4gICAgICB9XG4gICAgICB0YXJnZXQub2ZmKE1vdXNld2hlZWwuZXZlbnQsIHN3aXBlci5tb3VzZXdoZWVsLmhhbmRsZSk7XG4gICAgICBzd2lwZXIubW91c2V3aGVlbC5lbmFibGVkID0gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9O1xuXG4gIHZhciBNb3VzZXdoZWVsJDEgPSB7XG4gICAgbmFtZTogJ21vdXNld2hlZWwnLFxuICAgIHBhcmFtczoge1xuICAgICAgbW91c2V3aGVlbDoge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmVsZWFzZU9uRWRnZXM6IGZhbHNlLFxuICAgICAgICBpbnZlcnQ6IGZhbHNlLFxuICAgICAgICBmb3JjZVRvQXhpczogZmFsc2UsXG4gICAgICAgIHNlbnNpdGl2aXR5OiAxLFxuICAgICAgICBldmVudHNUYXJnZWQ6ICdjb250YWluZXInLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIG1vdXNld2hlZWw6IHtcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICBlbmFibGU6IE1vdXNld2hlZWwuZW5hYmxlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBkaXNhYmxlOiBNb3VzZXdoZWVsLmRpc2FibGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGhhbmRsZTogTW91c2V3aGVlbC5oYW5kbGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGhhbmRsZU1vdXNlRW50ZXI6IE1vdXNld2hlZWwuaGFuZGxlTW91c2VFbnRlci5iaW5kKHN3aXBlciksXG4gICAgICAgICAgaGFuZGxlTW91c2VMZWF2ZTogTW91c2V3aGVlbC5oYW5kbGVNb3VzZUxlYXZlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBsYXN0U2Nyb2xsVGltZTogVXRpbHMubm93KCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubW91c2V3aGVlbC5lbmFibGVkKSB7IHN3aXBlci5tb3VzZXdoZWVsLmVuYWJsZSgpOyB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIubW91c2V3aGVlbC5lbmFibGVkKSB7IHN3aXBlci5tb3VzZXdoZWVsLmRpc2FibGUoKTsgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBOYXZpZ2F0aW9uID0ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgLy8gVXBkYXRlIE5hdmlnYXRpb24gQnV0dG9uc1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5uYXZpZ2F0aW9uO1xuXG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7IHJldHVybjsgfVxuICAgICAgdmFyIHJlZiA9IHN3aXBlci5uYXZpZ2F0aW9uO1xuICAgICAgdmFyICRuZXh0RWwgPSByZWYuJG5leHRFbDtcbiAgICAgIHZhciAkcHJldkVsID0gcmVmLiRwcmV2RWw7XG5cbiAgICAgIGlmICgkcHJldkVsICYmICRwcmV2RWwubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoc3dpcGVyLmlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgJHByZXZFbC5hZGRDbGFzcyhwYXJhbXMuZGlzYWJsZWRDbGFzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHByZXZFbC5yZW1vdmVDbGFzcyhwYXJhbXMuZGlzYWJsZWRDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgJHByZXZFbFtzd2lwZXIucGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc3dpcGVyLmlzTG9ja2VkID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyddKHBhcmFtcy5sb2NrQ2xhc3MpO1xuICAgICAgfVxuICAgICAgaWYgKCRuZXh0RWwgJiYgJG5leHRFbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChzd2lwZXIuaXNFbmQpIHtcbiAgICAgICAgICAkbmV4dEVsLmFkZENsYXNzKHBhcmFtcy5kaXNhYmxlZENsYXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkbmV4dEVsLnJlbW92ZUNsYXNzKHBhcmFtcy5kaXNhYmxlZENsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICAkbmV4dEVsW3N3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzd2lwZXIuaXNMb2NrZWQgPyAnYWRkQ2xhc3MnIDogJ3JlbW92ZUNsYXNzJ10ocGFyYW1zLmxvY2tDbGFzcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvblByZXZDbGljazogZnVuY3Rpb24gb25QcmV2Q2xpY2soZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoc3dpcGVyLmlzQmVnaW5uaW5nICYmICFzd2lwZXIucGFyYW1zLmxvb3ApIHsgcmV0dXJuOyB9XG4gICAgICBzd2lwZXIuc2xpZGVQcmV2KCk7XG4gICAgfSxcbiAgICBvbk5leHRDbGljazogZnVuY3Rpb24gb25OZXh0Q2xpY2soZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoc3dpcGVyLmlzRW5kICYmICFzd2lwZXIucGFyYW1zLmxvb3ApIHsgcmV0dXJuOyB9XG4gICAgICBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgfSxcbiAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5uYXZpZ2F0aW9uO1xuICAgICAgaWYgKCEocGFyYW1zLm5leHRFbCB8fCBwYXJhbXMucHJldkVsKSkgeyByZXR1cm47IH1cblxuICAgICAgdmFyICRuZXh0RWw7XG4gICAgICB2YXIgJHByZXZFbDtcbiAgICAgIGlmIChwYXJhbXMubmV4dEVsKSB7XG4gICAgICAgICRuZXh0RWwgPSAkKHBhcmFtcy5uZXh0RWwpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3dpcGVyLnBhcmFtcy51bmlxdWVOYXZFbGVtZW50c1xuICAgICAgICAgICYmIHR5cGVvZiBwYXJhbXMubmV4dEVsID09PSAnc3RyaW5nJ1xuICAgICAgICAgICYmICRuZXh0RWwubGVuZ3RoID4gMVxuICAgICAgICAgICYmIHN3aXBlci4kZWwuZmluZChwYXJhbXMubmV4dEVsKS5sZW5ndGggPT09IDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgJG5leHRFbCA9IHN3aXBlci4kZWwuZmluZChwYXJhbXMubmV4dEVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5wcmV2RWwpIHtcbiAgICAgICAgJHByZXZFbCA9ICQocGFyYW1zLnByZXZFbCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzd2lwZXIucGFyYW1zLnVuaXF1ZU5hdkVsZW1lbnRzXG4gICAgICAgICAgJiYgdHlwZW9mIHBhcmFtcy5wcmV2RWwgPT09ICdzdHJpbmcnXG4gICAgICAgICAgJiYgJHByZXZFbC5sZW5ndGggPiAxXG4gICAgICAgICAgJiYgc3dpcGVyLiRlbC5maW5kKHBhcmFtcy5wcmV2RWwpLmxlbmd0aCA9PT0gMVxuICAgICAgICApIHtcbiAgICAgICAgICAkcHJldkVsID0gc3dpcGVyLiRlbC5maW5kKHBhcmFtcy5wcmV2RWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgkbmV4dEVsICYmICRuZXh0RWwubGVuZ3RoID4gMCkge1xuICAgICAgICAkbmV4dEVsLm9uKCdjbGljaycsIHN3aXBlci5uYXZpZ2F0aW9uLm9uTmV4dENsaWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICgkcHJldkVsICYmICRwcmV2RWwubGVuZ3RoID4gMCkge1xuICAgICAgICAkcHJldkVsLm9uKCdjbGljaycsIHN3aXBlci5uYXZpZ2F0aW9uLm9uUHJldkNsaWNrKTtcbiAgICAgIH1cblxuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5uYXZpZ2F0aW9uLCB7XG4gICAgICAgICRuZXh0RWw6ICRuZXh0RWwsXG4gICAgICAgIG5leHRFbDogJG5leHRFbCAmJiAkbmV4dEVsWzBdLFxuICAgICAgICAkcHJldkVsOiAkcHJldkVsLFxuICAgICAgICBwcmV2RWw6ICRwcmV2RWwgJiYgJHByZXZFbFswXSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHJlZiA9IHN3aXBlci5uYXZpZ2F0aW9uO1xuICAgICAgdmFyICRuZXh0RWwgPSByZWYuJG5leHRFbDtcbiAgICAgIHZhciAkcHJldkVsID0gcmVmLiRwcmV2RWw7XG4gICAgICBpZiAoJG5leHRFbCAmJiAkbmV4dEVsLmxlbmd0aCkge1xuICAgICAgICAkbmV4dEVsLm9mZignY2xpY2snLCBzd2lwZXIubmF2aWdhdGlvbi5vbk5leHRDbGljayk7XG4gICAgICAgICRuZXh0RWwucmVtb3ZlQ2xhc3Moc3dpcGVyLnBhcmFtcy5uYXZpZ2F0aW9uLmRpc2FibGVkQ2xhc3MpO1xuICAgICAgfVxuICAgICAgaWYgKCRwcmV2RWwgJiYgJHByZXZFbC5sZW5ndGgpIHtcbiAgICAgICAgJHByZXZFbC5vZmYoJ2NsaWNrJywgc3dpcGVyLm5hdmlnYXRpb24ub25QcmV2Q2xpY2spO1xuICAgICAgICAkcHJldkVsLnJlbW92ZUNsYXNzKHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5kaXNhYmxlZENsYXNzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHZhciBOYXZpZ2F0aW9uJDEgPSB7XG4gICAgbmFtZTogJ25hdmlnYXRpb24nLFxuICAgIHBhcmFtczoge1xuICAgICAgbmF2aWdhdGlvbjoge1xuICAgICAgICBuZXh0RWw6IG51bGwsXG4gICAgICAgIHByZXZFbDogbnVsbCxcblxuICAgICAgICBoaWRlT25DbGljazogZmFsc2UsXG4gICAgICAgIGRpc2FibGVkQ2xhc3M6ICdzd2lwZXItYnV0dG9uLWRpc2FibGVkJyxcbiAgICAgICAgaGlkZGVuQ2xhc3M6ICdzd2lwZXItYnV0dG9uLWhpZGRlbicsXG4gICAgICAgIGxvY2tDbGFzczogJ3N3aXBlci1idXR0b24tbG9jaycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgbmF2aWdhdGlvbjoge1xuICAgICAgICAgIGluaXQ6IE5hdmlnYXRpb24uaW5pdC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgdXBkYXRlOiBOYXZpZ2F0aW9uLnVwZGF0ZS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgZGVzdHJveTogTmF2aWdhdGlvbi5kZXN0cm95LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBvbk5leHRDbGljazogTmF2aWdhdGlvbi5vbk5leHRDbGljay5iaW5kKHN3aXBlciksXG4gICAgICAgICAgb25QcmV2Q2xpY2s6IE5hdmlnYXRpb24ub25QcmV2Q2xpY2suYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5uYXZpZ2F0aW9uLmluaXQoKTtcbiAgICAgICAgc3dpcGVyLm5hdmlnYXRpb24udXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgdG9FZGdlOiBmdW5jdGlvbiB0b0VkZ2UoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIubmF2aWdhdGlvbi51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICBmcm9tRWRnZTogZnVuY3Rpb24gZnJvbUVkZ2UoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIubmF2aWdhdGlvbi51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgc3dpcGVyLm5hdmlnYXRpb24uZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICAgIGNsaWNrOiBmdW5jdGlvbiBjbGljayhlKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICB2YXIgcmVmID0gc3dpcGVyLm5hdmlnYXRpb247XG4gICAgICAgIHZhciAkbmV4dEVsID0gcmVmLiRuZXh0RWw7XG4gICAgICAgIHZhciAkcHJldkVsID0gcmVmLiRwcmV2RWw7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZU9uQ2xpY2tcbiAgICAgICAgICAmJiAhJChlLnRhcmdldCkuaXMoJHByZXZFbClcbiAgICAgICAgICAmJiAhJChlLnRhcmdldCkuaXMoJG5leHRFbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGlzSGlkZGVuO1xuICAgICAgICAgIGlmICgkbmV4dEVsKSB7XG4gICAgICAgICAgICBpc0hpZGRlbiA9ICRuZXh0RWwuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy5uYXZpZ2F0aW9uLmhpZGRlbkNsYXNzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCRwcmV2RWwpIHtcbiAgICAgICAgICAgIGlzSGlkZGVuID0gJHByZXZFbC5oYXNDbGFzcyhzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZGVuQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCduYXZpZ2F0aW9uU2hvdycsIHN3aXBlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCduYXZpZ2F0aW9uSGlkZScsIHN3aXBlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkbmV4dEVsKSB7XG4gICAgICAgICAgICAkbmV4dEVsLnRvZ2dsZUNsYXNzKHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5oaWRkZW5DbGFzcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkcHJldkVsKSB7XG4gICAgICAgICAgICAkcHJldkVsLnRvZ2dsZUNsYXNzKHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5oaWRkZW5DbGFzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIFBhZ2luYXRpb24gPSB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICAvLyBSZW5kZXIgfHwgVXBkYXRlIFBhZ2luYXRpb24gYnVsbGV0cy9pdGVtc1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcnRsID0gc3dpcGVyLnJ0bDtcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb247XG4gICAgICBpZiAoIXBhcmFtcy5lbCB8fCAhc3dpcGVyLnBhZ2luYXRpb24uZWwgfHwgIXN3aXBlci5wYWdpbmF0aW9uLiRlbCB8fCBzd2lwZXIucGFnaW5hdGlvbi4kZWwubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgICAgdmFyIHNsaWRlc0xlbmd0aCA9IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkID8gc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCA6IHN3aXBlci5zbGlkZXMubGVuZ3RoO1xuICAgICAgdmFyICRlbCA9IHN3aXBlci5wYWdpbmF0aW9uLiRlbDtcbiAgICAgIC8vIEN1cnJlbnQvVG90YWxcbiAgICAgIHZhciBjdXJyZW50O1xuICAgICAgdmFyIHRvdGFsID0gc3dpcGVyLnBhcmFtcy5sb29wID8gTWF0aC5jZWlsKChzbGlkZXNMZW5ndGggLSAoc3dpcGVyLmxvb3BlZFNsaWRlcyAqIDIpKSAvIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXApIDogc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgY3VycmVudCA9IE1hdGguY2VpbCgoc3dpcGVyLmFjdGl2ZUluZGV4IC0gc3dpcGVyLmxvb3BlZFNsaWRlcykgLyBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPiBzbGlkZXNMZW5ndGggLSAxIC0gKHN3aXBlci5sb29wZWRTbGlkZXMgKiAyKSkge1xuICAgICAgICAgIGN1cnJlbnQgLT0gKHNsaWRlc0xlbmd0aCAtIChzd2lwZXIubG9vcGVkU2xpZGVzICogMikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ID4gdG90YWwgLSAxKSB7IGN1cnJlbnQgLT0gdG90YWw7IH1cbiAgICAgICAgaWYgKGN1cnJlbnQgPCAwICYmIHN3aXBlci5wYXJhbXMucGFnaW5hdGlvblR5cGUgIT09ICdidWxsZXRzJykgeyBjdXJyZW50ID0gdG90YWwgKyBjdXJyZW50OyB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzd2lwZXIuc25hcEluZGV4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjdXJyZW50ID0gc3dpcGVyLnNuYXBJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQgPSBzd2lwZXIuYWN0aXZlSW5kZXggfHwgMDtcbiAgICAgIH1cbiAgICAgIC8vIFR5cGVzXG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJyAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzICYmIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgYnVsbGV0cyA9IHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHM7XG4gICAgICAgIHZhciBmaXJzdEluZGV4O1xuICAgICAgICB2YXIgbGFzdEluZGV4O1xuICAgICAgICB2YXIgbWlkSW5kZXg7XG4gICAgICAgIGlmIChwYXJhbXMuZHluYW1pY0J1bGxldHMpIHtcbiAgICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRTaXplID0gYnVsbGV0cy5lcSgwKVtzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnb3V0ZXJXaWR0aCcgOiAnb3V0ZXJIZWlnaHQnXSh0cnVlKTtcbiAgICAgICAgICAkZWwuY3NzKHN3aXBlci5pc0hvcml6b250YWwoKSA/ICd3aWR0aCcgOiAnaGVpZ2h0JywgKChzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRTaXplICogKHBhcmFtcy5keW5hbWljTWFpbkJ1bGxldHMgKyA0KSkgKyBcInB4XCIpKTtcbiAgICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cyA+IDEgJiYgc3dpcGVyLnByZXZpb3VzSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24uZHluYW1pY0J1bGxldEluZGV4ICs9IChjdXJyZW50IC0gc3dpcGVyLnByZXZpb3VzSW5kZXgpO1xuICAgICAgICAgICAgaWYgKHN3aXBlci5wYWdpbmF0aW9uLmR5bmFtaWNCdWxsZXRJbmRleCA+IChwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzIC0gMSkpIHtcbiAgICAgICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24uZHluYW1pY0J1bGxldEluZGV4ID0gcGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cyAtIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN3aXBlci5wYWdpbmF0aW9uLmR5bmFtaWNCdWxsZXRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24uZHluYW1pY0J1bGxldEluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZmlyc3RJbmRleCA9IGN1cnJlbnQgLSBzd2lwZXIucGFnaW5hdGlvbi5keW5hbWljQnVsbGV0SW5kZXg7XG4gICAgICAgICAgbGFzdEluZGV4ID0gZmlyc3RJbmRleCArIChNYXRoLm1pbihidWxsZXRzLmxlbmd0aCwgcGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cykgLSAxKTtcbiAgICAgICAgICBtaWRJbmRleCA9IChsYXN0SW5kZXggKyBmaXJzdEluZGV4KSAvIDI7XG4gICAgICAgIH1cbiAgICAgICAgYnVsbGV0cy5yZW1vdmVDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIiBcIiArIChwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpICsgXCItbmV4dCBcIiArIChwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpICsgXCItbmV4dC1uZXh0IFwiICsgKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1wcmV2IFwiICsgKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1wcmV2LXByZXYgXCIgKyAocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLW1haW5cIikpO1xuICAgICAgICBpZiAoJGVsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBidWxsZXRzLmVhY2goZnVuY3Rpb24gKGluZGV4LCBidWxsZXQpIHtcbiAgICAgICAgICAgIHZhciAkYnVsbGV0ID0gJChidWxsZXQpO1xuICAgICAgICAgICAgdmFyIGJ1bGxldEluZGV4ID0gJGJ1bGxldC5pbmRleCgpO1xuICAgICAgICAgICAgaWYgKGJ1bGxldEluZGV4ID09PSBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICRidWxsZXQuYWRkQ2xhc3MocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJhbXMuZHluYW1pY0J1bGxldHMpIHtcbiAgICAgICAgICAgICAgaWYgKGJ1bGxldEluZGV4ID49IGZpcnN0SW5kZXggJiYgYnVsbGV0SW5kZXggPD0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgJGJ1bGxldC5hZGRDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1tYWluXCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoYnVsbGV0SW5kZXggPT09IGZpcnN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAkYnVsbGV0XG4gICAgICAgICAgICAgICAgICAucHJldigpXG4gICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoKChwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpICsgXCItcHJldlwiKSlcbiAgICAgICAgICAgICAgICAgIC5wcmV2KClcbiAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1wcmV2LXByZXZcIikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChidWxsZXRJbmRleCA9PT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgJGJ1bGxldFxuICAgICAgICAgICAgICAgICAgLm5leHQoKVxuICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCgocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLW5leHRcIikpXG4gICAgICAgICAgICAgICAgICAubmV4dCgpXG4gICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoKChwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpICsgXCItbmV4dC1uZXh0XCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciAkYnVsbGV0ID0gYnVsbGV0cy5lcShjdXJyZW50KTtcbiAgICAgICAgICAkYnVsbGV0LmFkZENsYXNzKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgaWYgKHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICAgICAgdmFyICRmaXJzdERpc3BsYXllZEJ1bGxldCA9IGJ1bGxldHMuZXEoZmlyc3RJbmRleCk7XG4gICAgICAgICAgICB2YXIgJGxhc3REaXNwbGF5ZWRCdWxsZXQgPSBidWxsZXRzLmVxKGxhc3RJbmRleCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZmlyc3RJbmRleDsgaSA8PSBsYXN0SW5kZXg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICBidWxsZXRzLmVxKGkpLmFkZENsYXNzKCgocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLW1haW5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJGZpcnN0RGlzcGxheWVkQnVsbGV0XG4gICAgICAgICAgICAgIC5wcmV2KClcbiAgICAgICAgICAgICAgLmFkZENsYXNzKCgocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLXByZXZcIikpXG4gICAgICAgICAgICAgIC5wcmV2KClcbiAgICAgICAgICAgICAgLmFkZENsYXNzKCgocGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzKSArIFwiLXByZXYtcHJldlwiKSk7XG4gICAgICAgICAgICAkbGFzdERpc3BsYXllZEJ1bGxldFxuICAgICAgICAgICAgICAubmV4dCgpXG4gICAgICAgICAgICAgIC5hZGRDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1uZXh0XCIpKVxuICAgICAgICAgICAgICAubmV4dCgpXG4gICAgICAgICAgICAgIC5hZGRDbGFzcygoKHBhcmFtcy5idWxsZXRBY3RpdmVDbGFzcykgKyBcIi1uZXh0LW5leHRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNCdWxsZXRzKSB7XG4gICAgICAgICAgdmFyIGR5bmFtaWNCdWxsZXRzTGVuZ3RoID0gTWF0aC5taW4oYnVsbGV0cy5sZW5ndGgsIHBhcmFtcy5keW5hbWljTWFpbkJ1bGxldHMgKyA0KTtcbiAgICAgICAgICB2YXIgYnVsbGV0c09mZnNldCA9ICgoKHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldFNpemUgKiBkeW5hbWljQnVsbGV0c0xlbmd0aCkgLSAoc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0U2l6ZSkpIC8gMikgLSAobWlkSW5kZXggKiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRTaXplKTtcbiAgICAgICAgICB2YXIgb2Zmc2V0UHJvcCA9IHJ0bCA/ICdyaWdodCcgOiAnbGVmdCc7XG4gICAgICAgICAgYnVsbGV0cy5jc3Moc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gb2Zmc2V0UHJvcCA6ICd0b3AnLCAoYnVsbGV0c09mZnNldCArIFwicHhcIikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdmcmFjdGlvbicpIHtcbiAgICAgICAgJGVsLmZpbmQoKFwiLlwiICsgKHBhcmFtcy5jdXJyZW50Q2xhc3MpKSkudGV4dChwYXJhbXMuZm9ybWF0RnJhY3Rpb25DdXJyZW50KGN1cnJlbnQgKyAxKSk7XG4gICAgICAgICRlbC5maW5kKChcIi5cIiArIChwYXJhbXMudG90YWxDbGFzcykpKS50ZXh0KHBhcmFtcy5mb3JtYXRGcmFjdGlvblRvdGFsKHRvdGFsKSk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdwcm9ncmVzc2JhcicpIHtcbiAgICAgICAgdmFyIHByb2dyZXNzYmFyRGlyZWN0aW9uO1xuICAgICAgICBpZiAocGFyYW1zLnByb2dyZXNzYmFyT3Bwb3NpdGUpIHtcbiAgICAgICAgICBwcm9ncmVzc2JhckRpcmVjdGlvbiA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvZ3Jlc3NiYXJEaXJlY3Rpb24gPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY2FsZSA9IChjdXJyZW50ICsgMSkgLyB0b3RhbDtcbiAgICAgICAgdmFyIHNjYWxlWCA9IDE7XG4gICAgICAgIHZhciBzY2FsZVkgPSAxO1xuICAgICAgICBpZiAocHJvZ3Jlc3NiYXJEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgIHNjYWxlWCA9IHNjYWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjYWxlWSA9IHNjYWxlO1xuICAgICAgICB9XG4gICAgICAgICRlbC5maW5kKChcIi5cIiArIChwYXJhbXMucHJvZ3Jlc3NiYXJGaWxsQ2xhc3MpKSkudHJhbnNmb3JtKChcInRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZVgoXCIgKyBzY2FsZVggKyBcIikgc2NhbGVZKFwiICsgc2NhbGVZICsgXCIpXCIpKS50cmFuc2l0aW9uKHN3aXBlci5wYXJhbXMuc3BlZWQpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAnY3VzdG9tJyAmJiBwYXJhbXMucmVuZGVyQ3VzdG9tKSB7XG4gICAgICAgICRlbC5odG1sKHBhcmFtcy5yZW5kZXJDdXN0b20oc3dpcGVyLCBjdXJyZW50ICsgMSwgdG90YWwpKTtcbiAgICAgICAgc3dpcGVyLmVtaXQoJ3BhZ2luYXRpb25SZW5kZXInLCBzd2lwZXIsICRlbFswXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2lwZXIuZW1pdCgncGFnaW5hdGlvblVwZGF0ZScsIHN3aXBlciwgJGVsWzBdKTtcbiAgICAgIH1cbiAgICAgICRlbFtzd2lwZXIucGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc3dpcGVyLmlzTG9ja2VkID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyddKHBhcmFtcy5sb2NrQ2xhc3MpO1xuICAgIH0sXG4gICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAvLyBSZW5kZXIgQ29udGFpbmVyXG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb247XG4gICAgICBpZiAoIXBhcmFtcy5lbCB8fCAhc3dpcGVyLnBhZ2luYXRpb24uZWwgfHwgIXN3aXBlci5wYWdpbmF0aW9uLiRlbCB8fCBzd2lwZXIucGFnaW5hdGlvbi4kZWwubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgICAgdmFyIHNsaWRlc0xlbmd0aCA9IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkID8gc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCA6IHN3aXBlci5zbGlkZXMubGVuZ3RoO1xuXG4gICAgICB2YXIgJGVsID0gc3dpcGVyLnBhZ2luYXRpb24uJGVsO1xuICAgICAgdmFyIHBhZ2luYXRpb25IVE1MID0gJyc7XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJykge1xuICAgICAgICB2YXIgbnVtYmVyT2ZCdWxsZXRzID0gc3dpcGVyLnBhcmFtcy5sb29wID8gTWF0aC5jZWlsKChzbGlkZXNMZW5ndGggLSAoc3dpcGVyLmxvb3BlZFNsaWRlcyAqIDIpKSAvIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXApIDogc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkJ1bGxldHM7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChwYXJhbXMucmVuZGVyQnVsbGV0KSB7XG4gICAgICAgICAgICBwYWdpbmF0aW9uSFRNTCArPSBwYXJhbXMucmVuZGVyQnVsbGV0LmNhbGwoc3dpcGVyLCBpLCBwYXJhbXMuYnVsbGV0Q2xhc3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWdpbmF0aW9uSFRNTCArPSBcIjxcIiArIChwYXJhbXMuYnVsbGV0RWxlbWVudCkgKyBcIiBjbGFzcz1cXFwiXCIgKyAocGFyYW1zLmJ1bGxldENsYXNzKSArIFwiXFxcIj48L1wiICsgKHBhcmFtcy5idWxsZXRFbGVtZW50KSArIFwiPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAkZWwuaHRtbChwYWdpbmF0aW9uSFRNTCk7XG4gICAgICAgIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMgPSAkZWwuZmluZCgoXCIuXCIgKyAocGFyYW1zLmJ1bGxldENsYXNzKSkpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAnZnJhY3Rpb24nKSB7XG4gICAgICAgIGlmIChwYXJhbXMucmVuZGVyRnJhY3Rpb24pIHtcbiAgICAgICAgICBwYWdpbmF0aW9uSFRNTCA9IHBhcmFtcy5yZW5kZXJGcmFjdGlvbi5jYWxsKHN3aXBlciwgcGFyYW1zLmN1cnJlbnRDbGFzcywgcGFyYW1zLnRvdGFsQ2xhc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhZ2luYXRpb25IVE1MID0gXCI8c3BhbiBjbGFzcz1cXFwiXCIgKyAocGFyYW1zLmN1cnJlbnRDbGFzcykgKyBcIlxcXCI+PC9zcGFuPlwiXG4gICAgICAgICAgKyAnIC8gJ1xuICAgICAgICAgICsgXCI8c3BhbiBjbGFzcz1cXFwiXCIgKyAocGFyYW1zLnRvdGFsQ2xhc3MpICsgXCJcXFwiPjwvc3Bhbj5cIjtcbiAgICAgICAgfVxuICAgICAgICAkZWwuaHRtbChwYWdpbmF0aW9uSFRNTCk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdwcm9ncmVzc2JhcicpIHtcbiAgICAgICAgaWYgKHBhcmFtcy5yZW5kZXJQcm9ncmVzc2Jhcikge1xuICAgICAgICAgIHBhZ2luYXRpb25IVE1MID0gcGFyYW1zLnJlbmRlclByb2dyZXNzYmFyLmNhbGwoc3dpcGVyLCBwYXJhbXMucHJvZ3Jlc3NiYXJGaWxsQ2xhc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhZ2luYXRpb25IVE1MID0gXCI8c3BhbiBjbGFzcz1cXFwiXCIgKyAocGFyYW1zLnByb2dyZXNzYmFyRmlsbENsYXNzKSArIFwiXFxcIj48L3NwYW4+XCI7XG4gICAgICAgIH1cbiAgICAgICAgJGVsLmh0bWwocGFnaW5hdGlvbkhUTUwpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlICE9PSAnY3VzdG9tJykge1xuICAgICAgICBzd2lwZXIuZW1pdCgncGFnaW5hdGlvblJlbmRlcicsIHN3aXBlci5wYWdpbmF0aW9uLiRlbFswXSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgICAgaWYgKCFwYXJhbXMuZWwpIHsgcmV0dXJuOyB9XG5cbiAgICAgIHZhciAkZWwgPSAkKHBhcmFtcy5lbCk7XG4gICAgICBpZiAoJGVsLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgICAgaWYgKFxuICAgICAgICBzd2lwZXIucGFyYW1zLnVuaXF1ZU5hdkVsZW1lbnRzXG4gICAgICAgICYmIHR5cGVvZiBwYXJhbXMuZWwgPT09ICdzdHJpbmcnXG4gICAgICAgICYmICRlbC5sZW5ndGggPiAxXG4gICAgICAgICYmIHN3aXBlci4kZWwuZmluZChwYXJhbXMuZWwpLmxlbmd0aCA9PT0gMVxuICAgICAgKSB7XG4gICAgICAgICRlbCA9IHN3aXBlci4kZWwuZmluZChwYXJhbXMuZWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJyAmJiBwYXJhbXMuY2xpY2thYmxlKSB7XG4gICAgICAgICRlbC5hZGRDbGFzcyhwYXJhbXMuY2xpY2thYmxlQ2xhc3MpO1xuICAgICAgfVxuXG4gICAgICAkZWwuYWRkQ2xhc3MocGFyYW1zLm1vZGlmaWVyQ2xhc3MgKyBwYXJhbXMudHlwZSk7XG5cbiAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2J1bGxldHMnICYmIHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICAkZWwuYWRkQ2xhc3MoKFwiXCIgKyAocGFyYW1zLm1vZGlmaWVyQ2xhc3MpICsgKHBhcmFtcy50eXBlKSArIFwiLWR5bmFtaWNcIikpO1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5keW5hbWljQnVsbGV0SW5kZXggPSAwO1xuICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cyA8IDEpIHtcbiAgICAgICAgICBwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAncHJvZ3Jlc3NiYXInICYmIHBhcmFtcy5wcm9ncmVzc2Jhck9wcG9zaXRlKSB7XG4gICAgICAgICRlbC5hZGRDbGFzcyhwYXJhbXMucHJvZ3Jlc3NiYXJPcHBvc2l0ZUNsYXNzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5jbGlja2FibGUpIHtcbiAgICAgICAgJGVsLm9uKCdjbGljaycsIChcIi5cIiArIChwYXJhbXMuYnVsbGV0Q2xhc3MpKSwgZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHZhciBpbmRleCA9ICQodGhpcykuaW5kZXgoKSAqIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXA7XG4gICAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkgeyBpbmRleCArPSBzd2lwZXIubG9vcGVkU2xpZGVzOyB9XG4gICAgICAgICAgc3dpcGVyLnNsaWRlVG8oaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5wYWdpbmF0aW9uLCB7XG4gICAgICAgICRlbDogJGVsLFxuICAgICAgICBlbDogJGVsWzBdLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgICAgaWYgKCFwYXJhbXMuZWwgfHwgIXN3aXBlci5wYWdpbmF0aW9uLmVsIHx8ICFzd2lwZXIucGFnaW5hdGlvbi4kZWwgfHwgc3dpcGVyLnBhZ2luYXRpb24uJGVsLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICAgIHZhciAkZWwgPSBzd2lwZXIucGFnaW5hdGlvbi4kZWw7XG5cbiAgICAgICRlbC5yZW1vdmVDbGFzcyhwYXJhbXMuaGlkZGVuQ2xhc3MpO1xuICAgICAgJGVsLnJlbW92ZUNsYXNzKHBhcmFtcy5tb2RpZmllckNsYXNzICsgcGFyYW1zLnR5cGUpO1xuICAgICAgaWYgKHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMpIHsgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cy5yZW1vdmVDbGFzcyhwYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3MpOyB9XG4gICAgICBpZiAocGFyYW1zLmNsaWNrYWJsZSkge1xuICAgICAgICAkZWwub2ZmKCdjbGljaycsIChcIi5cIiArIChwYXJhbXMuYnVsbGV0Q2xhc3MpKSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICB2YXIgUGFnaW5hdGlvbiQxID0ge1xuICAgIG5hbWU6ICdwYWdpbmF0aW9uJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgZWw6IG51bGwsXG4gICAgICAgIGJ1bGxldEVsZW1lbnQ6ICdzcGFuJyxcbiAgICAgICAgY2xpY2thYmxlOiBmYWxzZSxcbiAgICAgICAgaGlkZU9uQ2xpY2s6IGZhbHNlLFxuICAgICAgICByZW5kZXJCdWxsZXQ6IG51bGwsXG4gICAgICAgIHJlbmRlclByb2dyZXNzYmFyOiBudWxsLFxuICAgICAgICByZW5kZXJGcmFjdGlvbjogbnVsbCxcbiAgICAgICAgcmVuZGVyQ3VzdG9tOiBudWxsLFxuICAgICAgICBwcm9ncmVzc2Jhck9wcG9zaXRlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogJ2J1bGxldHMnLCAvLyAnYnVsbGV0cycgb3IgJ3Byb2dyZXNzYmFyJyBvciAnZnJhY3Rpb24nIG9yICdjdXN0b20nXG4gICAgICAgIGR5bmFtaWNCdWxsZXRzOiBmYWxzZSxcbiAgICAgICAgZHluYW1pY01haW5CdWxsZXRzOiAxLFxuICAgICAgICBmb3JtYXRGcmFjdGlvbkN1cnJlbnQ6IGZ1bmN0aW9uIChudW1iZXIpIHsgcmV0dXJuIG51bWJlcjsgfSxcbiAgICAgICAgZm9ybWF0RnJhY3Rpb25Ub3RhbDogZnVuY3Rpb24gKG51bWJlcikgeyByZXR1cm4gbnVtYmVyOyB9LFxuICAgICAgICBidWxsZXRDbGFzczogJ3N3aXBlci1wYWdpbmF0aW9uLWJ1bGxldCcsXG4gICAgICAgIGJ1bGxldEFjdGl2ZUNsYXNzOiAnc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0LWFjdGl2ZScsXG4gICAgICAgIG1vZGlmaWVyQ2xhc3M6ICdzd2lwZXItcGFnaW5hdGlvbi0nLCAvLyBORVdcbiAgICAgICAgY3VycmVudENsYXNzOiAnc3dpcGVyLXBhZ2luYXRpb24tY3VycmVudCcsXG4gICAgICAgIHRvdGFsQ2xhc3M6ICdzd2lwZXItcGFnaW5hdGlvbi10b3RhbCcsXG4gICAgICAgIGhpZGRlbkNsYXNzOiAnc3dpcGVyLXBhZ2luYXRpb24taGlkZGVuJyxcbiAgICAgICAgcHJvZ3Jlc3NiYXJGaWxsQ2xhc3M6ICdzd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2Jhci1maWxsJyxcbiAgICAgICAgcHJvZ3Jlc3NiYXJPcHBvc2l0ZUNsYXNzOiAnc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3NiYXItb3Bwb3NpdGUnLFxuICAgICAgICBjbGlja2FibGVDbGFzczogJ3N3aXBlci1wYWdpbmF0aW9uLWNsaWNrYWJsZScsIC8vIE5FV1xuICAgICAgICBsb2NrQ2xhc3M6ICdzd2lwZXItcGFnaW5hdGlvbi1sb2NrJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgaW5pdDogUGFnaW5hdGlvbi5pbml0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICByZW5kZXI6IFBhZ2luYXRpb24ucmVuZGVyLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICB1cGRhdGU6IFBhZ2luYXRpb24udXBkYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBkZXN0cm95OiBQYWdpbmF0aW9uLmRlc3Ryb3kuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGR5bmFtaWNCdWxsZXRJbmRleDogMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb246IHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5pbml0KCk7XG4gICAgICAgIHN3aXBlci5wYWdpbmF0aW9uLnJlbmRlcigpO1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICBhY3RpdmVJbmRleENoYW5nZTogZnVuY3Rpb24gYWN0aXZlSW5kZXhDaGFuZ2UoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24udXBkYXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN3aXBlci5zbmFwSW5kZXggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzbmFwSW5kZXhDaGFuZ2U6IGZ1bmN0aW9uIHNuYXBJbmRleENoYW5nZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzbGlkZXNMZW5ndGhDaGFuZ2U6IGZ1bmN0aW9uIHNsaWRlc0xlbmd0aENoYW5nZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5yZW5kZXIoKTtcbiAgICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNuYXBHcmlkTGVuZ3RoQ2hhbmdlOiBmdW5jdGlvbiBzbmFwR3JpZExlbmd0aENoYW5nZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24ucmVuZGVyKCk7XG4gICAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgc3dpcGVyLnBhZ2luYXRpb24uZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICAgIGNsaWNrOiBmdW5jdGlvbiBjbGljayhlKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmVsXG4gICAgICAgICAgJiYgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmhpZGVPbkNsaWNrXG4gICAgICAgICAgJiYgc3dpcGVyLnBhZ2luYXRpb24uJGVsLmxlbmd0aCA+IDBcbiAgICAgICAgICAmJiAhJChlLnRhcmdldCkuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmJ1bGxldENsYXNzKVxuICAgICAgICApIHtcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBzd2lwZXIucGFnaW5hdGlvbi4kZWwuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmhpZGRlbkNsYXNzKTtcbiAgICAgICAgICBpZiAoaXNIaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdwYWdpbmF0aW9uU2hvdycsIHN3aXBlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdwYWdpbmF0aW9uSGlkZScsIHN3aXBlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXBlci5wYWdpbmF0aW9uLiRlbC50b2dnbGVDbGFzcyhzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uaGlkZGVuQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIFNjcm9sbGJhciA9IHtcbiAgICBzZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5lbCB8fCAhc3dpcGVyLnNjcm9sbGJhci5lbCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgICB2YXIgcHJvZ3Jlc3MgPSBzd2lwZXIucHJvZ3Jlc3M7XG4gICAgICB2YXIgZHJhZ1NpemUgPSBzY3JvbGxiYXIuZHJhZ1NpemU7XG4gICAgICB2YXIgdHJhY2tTaXplID0gc2Nyb2xsYmFyLnRyYWNrU2l6ZTtcbiAgICAgIHZhciAkZHJhZ0VsID0gc2Nyb2xsYmFyLiRkcmFnRWw7XG4gICAgICB2YXIgJGVsID0gc2Nyb2xsYmFyLiRlbDtcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnNjcm9sbGJhcjtcblxuICAgICAgdmFyIG5ld1NpemUgPSBkcmFnU2l6ZTtcbiAgICAgIHZhciBuZXdQb3MgPSAodHJhY2tTaXplIC0gZHJhZ1NpemUpICogcHJvZ3Jlc3M7XG4gICAgICBpZiAocnRsKSB7XG4gICAgICAgIG5ld1BvcyA9IC1uZXdQb3M7XG4gICAgICAgIGlmIChuZXdQb3MgPiAwKSB7XG4gICAgICAgICAgbmV3U2l6ZSA9IGRyYWdTaXplIC0gbmV3UG9zO1xuICAgICAgICAgIG5ld1BvcyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoLW5ld1BvcyArIGRyYWdTaXplID4gdHJhY2tTaXplKSB7XG4gICAgICAgICAgbmV3U2l6ZSA9IHRyYWNrU2l6ZSArIG5ld1BvcztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChuZXdQb3MgPCAwKSB7XG4gICAgICAgIG5ld1NpemUgPSBkcmFnU2l6ZSArIG5ld1BvcztcbiAgICAgICAgbmV3UG9zID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobmV3UG9zICsgZHJhZ1NpemUgPiB0cmFja1NpemUpIHtcbiAgICAgICAgbmV3U2l6ZSA9IHRyYWNrU2l6ZSAtIG5ld1BvcztcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgaWYgKFN1cHBvcnQudHJhbnNmb3JtczNkKSB7XG4gICAgICAgICAgJGRyYWdFbC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlM2QoXCIgKyBuZXdQb3MgKyBcInB4LCAwLCAwKVwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGRyYWdFbC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlWChcIiArIG5ld1BvcyArIFwicHgpXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAkZHJhZ0VsWzBdLnN0eWxlLndpZHRoID0gbmV3U2l6ZSArIFwicHhcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChTdXBwb3J0LnRyYW5zZm9ybXMzZCkge1xuICAgICAgICAgICRkcmFnRWwudHJhbnNmb3JtKChcInRyYW5zbGF0ZTNkKDBweCwgXCIgKyBuZXdQb3MgKyBcInB4LCAwKVwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGRyYWdFbC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlWShcIiArIG5ld1BvcyArIFwicHgpXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAkZHJhZ0VsWzBdLnN0eWxlLmhlaWdodCA9IG5ld1NpemUgKyBcInB4XCI7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmhpZGUpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHN3aXBlci5zY3JvbGxiYXIudGltZW91dCk7XG4gICAgICAgICRlbFswXS5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgICAgc3dpcGVyLnNjcm9sbGJhci50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgJGVsWzBdLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgICAgICRlbC50cmFuc2l0aW9uKDQwMCk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoIXN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmVsIHx8ICFzd2lwZXIuc2Nyb2xsYmFyLmVsKSB7IHJldHVybjsgfVxuICAgICAgc3dpcGVyLnNjcm9sbGJhci4kZHJhZ0VsLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgIH0sXG4gICAgdXBkYXRlU2l6ZTogZnVuY3Rpb24gdXBkYXRlU2l6ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5lbCB8fCAhc3dpcGVyLnNjcm9sbGJhci5lbCkgeyByZXR1cm47IH1cblxuICAgICAgdmFyIHNjcm9sbGJhciA9IHN3aXBlci5zY3JvbGxiYXI7XG4gICAgICB2YXIgJGRyYWdFbCA9IHNjcm9sbGJhci4kZHJhZ0VsO1xuICAgICAgdmFyICRlbCA9IHNjcm9sbGJhci4kZWw7XG5cbiAgICAgICRkcmFnRWxbMF0uc3R5bGUud2lkdGggPSAnJztcbiAgICAgICRkcmFnRWxbMF0uc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICB2YXIgdHJhY2tTaXplID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gJGVsWzBdLm9mZnNldFdpZHRoIDogJGVsWzBdLm9mZnNldEhlaWdodDtcblxuICAgICAgdmFyIGRpdmlkZXIgPSBzd2lwZXIuc2l6ZSAvIHN3aXBlci52aXJ0dWFsU2l6ZTtcbiAgICAgIHZhciBtb3ZlRGl2aWRlciA9IGRpdmlkZXIgKiAodHJhY2tTaXplIC8gc3dpcGVyLnNpemUpO1xuICAgICAgdmFyIGRyYWdTaXplO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmRyYWdTaXplID09PSAnYXV0bycpIHtcbiAgICAgICAgZHJhZ1NpemUgPSB0cmFja1NpemUgKiBkaXZpZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhZ1NpemUgPSBwYXJzZUludChzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5kcmFnU2l6ZSwgMTApO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgICRkcmFnRWxbMF0uc3R5bGUud2lkdGggPSBkcmFnU2l6ZSArIFwicHhcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRkcmFnRWxbMF0uc3R5bGUuaGVpZ2h0ID0gZHJhZ1NpemUgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXZpZGVyID49IDEpIHtcbiAgICAgICAgJGVsWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkZWxbMF0uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmhpZGUpIHtcbiAgICAgICAgJGVsWzBdLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgfVxuICAgICAgVXRpbHMuZXh0ZW5kKHNjcm9sbGJhciwge1xuICAgICAgICB0cmFja1NpemU6IHRyYWNrU2l6ZSxcbiAgICAgICAgZGl2aWRlcjogZGl2aWRlcixcbiAgICAgICAgbW92ZURpdmlkZXI6IG1vdmVEaXZpZGVyLFxuICAgICAgICBkcmFnU2l6ZTogZHJhZ1NpemUsXG4gICAgICB9KTtcbiAgICAgIHNjcm9sbGJhci4kZWxbc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93ICYmIHN3aXBlci5pc0xvY2tlZCA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXShzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5sb2NrQ2xhc3MpO1xuICAgIH0sXG4gICAgZ2V0UG9pbnRlclBvc2l0aW9uOiBmdW5jdGlvbiBnZXRQb2ludGVyUG9zaXRpb24oZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoc3dpcGVyLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICAgIHJldHVybiAoKGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PT0gJ3RvdWNobW92ZScpID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYIDogZS5wYWdlWCB8fCBlLmNsaWVudFgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICgoZS50eXBlID09PSAndG91Y2hzdGFydCcgfHwgZS50eXBlID09PSAndG91Y2htb3ZlJykgPyBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVkgOiBlLnBhZ2VZIHx8IGUuY2xpZW50WSk7XG4gICAgfSxcbiAgICBzZXREcmFnUG9zaXRpb246IGZ1bmN0aW9uIHNldERyYWdQb3NpdGlvbihlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgICB2YXIgJGVsID0gc2Nyb2xsYmFyLiRlbDtcbiAgICAgIHZhciBkcmFnU2l6ZSA9IHNjcm9sbGJhci5kcmFnU2l6ZTtcbiAgICAgIHZhciB0cmFja1NpemUgPSBzY3JvbGxiYXIudHJhY2tTaXplO1xuICAgICAgdmFyIGRyYWdTdGFydFBvcyA9IHNjcm9sbGJhci5kcmFnU3RhcnRQb3M7XG5cbiAgICAgIHZhciBwb3NpdGlvblJhdGlvO1xuICAgICAgcG9zaXRpb25SYXRpbyA9ICgoc2Nyb2xsYmFyLmdldFBvaW50ZXJQb3NpdGlvbihlKSkgLSAkZWwub2Zmc2V0KClbc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gJ2xlZnQnIDogJ3RvcCddXG4gICAgICAgIC0gKGRyYWdTdGFydFBvcyAhPT0gbnVsbCA/IGRyYWdTdGFydFBvcyA6IGRyYWdTaXplIC8gMikpIC8gKHRyYWNrU2l6ZSAtIGRyYWdTaXplKTtcbiAgICAgIHBvc2l0aW9uUmF0aW8gPSBNYXRoLm1heChNYXRoLm1pbihwb3NpdGlvblJhdGlvLCAxKSwgMCk7XG4gICAgICBpZiAocnRsKSB7XG4gICAgICAgIHBvc2l0aW9uUmF0aW8gPSAxIC0gcG9zaXRpb25SYXRpbztcbiAgICAgIH1cblxuICAgICAgdmFyIHBvc2l0aW9uID0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpICsgKChzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBzd2lwZXIubWluVHJhbnNsYXRlKCkpICogcG9zaXRpb25SYXRpbyk7XG5cbiAgICAgIHN3aXBlci51cGRhdGVQcm9ncmVzcyhwb3NpdGlvbik7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKHBvc2l0aW9uKTtcbiAgICAgIHN3aXBlci51cGRhdGVBY3RpdmVJbmRleCgpO1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICB9LFxuICAgIG9uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBvbkRyYWdTdGFydChlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnNjcm9sbGJhcjtcbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICAgIHZhciAkZWwgPSBzY3JvbGxiYXIuJGVsO1xuICAgICAgdmFyICRkcmFnRWwgPSBzY3JvbGxiYXIuJGRyYWdFbDtcbiAgICAgIHN3aXBlci5zY3JvbGxiYXIuaXNUb3VjaGVkID0gdHJ1ZTtcbiAgICAgIHN3aXBlci5zY3JvbGxiYXIuZHJhZ1N0YXJ0UG9zID0gKGUudGFyZ2V0ID09PSAkZHJhZ0VsWzBdIHx8IGUudGFyZ2V0ID09PSAkZHJhZ0VsKVxuICAgICAgICA/IHNjcm9sbGJhci5nZXRQb2ludGVyUG9zaXRpb24oZSkgLSBlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnbGVmdCcgOiAndG9wJ10gOiBudWxsO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgJHdyYXBwZXJFbC50cmFuc2l0aW9uKDEwMCk7XG4gICAgICAkZHJhZ0VsLnRyYW5zaXRpb24oMTAwKTtcbiAgICAgIHNjcm9sbGJhci5zZXREcmFnUG9zaXRpb24oZSk7XG5cbiAgICAgIGNsZWFyVGltZW91dChzd2lwZXIuc2Nyb2xsYmFyLmRyYWdUaW1lb3V0KTtcblxuICAgICAgJGVsLnRyYW5zaXRpb24oMCk7XG4gICAgICBpZiAocGFyYW1zLmhpZGUpIHtcbiAgICAgICAgJGVsLmNzcygnb3BhY2l0eScsIDEpO1xuICAgICAgfVxuICAgICAgc3dpcGVyLmVtaXQoJ3Njcm9sbGJhckRyYWdTdGFydCcsIGUpO1xuICAgIH0sXG4gICAgb25EcmFnTW92ZTogZnVuY3Rpb24gb25EcmFnTW92ZShlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyICR3cmFwcGVyRWwgPSBzd2lwZXIuJHdyYXBwZXJFbDtcbiAgICAgIHZhciAkZWwgPSBzY3JvbGxiYXIuJGVsO1xuICAgICAgdmFyICRkcmFnRWwgPSBzY3JvbGxiYXIuJGRyYWdFbDtcblxuICAgICAgaWYgKCFzd2lwZXIuc2Nyb2xsYmFyLmlzVG91Y2hlZCkgeyByZXR1cm47IH1cbiAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgICAgZWxzZSB7IGUucmV0dXJuVmFsdWUgPSBmYWxzZTsgfVxuICAgICAgc2Nyb2xsYmFyLnNldERyYWdQb3NpdGlvbihlKTtcbiAgICAgICR3cmFwcGVyRWwudHJhbnNpdGlvbigwKTtcbiAgICAgICRlbC50cmFuc2l0aW9uKDApO1xuICAgICAgJGRyYWdFbC50cmFuc2l0aW9uKDApO1xuICAgICAgc3dpcGVyLmVtaXQoJ3Njcm9sbGJhckRyYWdNb3ZlJywgZSk7XG4gICAgfSxcbiAgICBvbkRyYWdFbmQ6IGZ1bmN0aW9uIG9uRHJhZ0VuZChlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyO1xuICAgICAgdmFyIHNjcm9sbGJhciA9IHN3aXBlci5zY3JvbGxiYXI7XG4gICAgICB2YXIgJGVsID0gc2Nyb2xsYmFyLiRlbDtcblxuICAgICAgaWYgKCFzd2lwZXIuc2Nyb2xsYmFyLmlzVG91Y2hlZCkgeyByZXR1cm47IH1cbiAgICAgIHN3aXBlci5zY3JvbGxiYXIuaXNUb3VjaGVkID0gZmFsc2U7XG4gICAgICBpZiAocGFyYW1zLmhpZGUpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHN3aXBlci5zY3JvbGxiYXIuZHJhZ1RpbWVvdXQpO1xuICAgICAgICBzd2lwZXIuc2Nyb2xsYmFyLmRyYWdUaW1lb3V0ID0gVXRpbHMubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICRlbC5jc3MoJ29wYWNpdHknLCAwKTtcbiAgICAgICAgICAkZWwudHJhbnNpdGlvbig0MDApO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH1cbiAgICAgIHN3aXBlci5lbWl0KCdzY3JvbGxiYXJEcmFnRW5kJywgZSk7XG4gICAgICBpZiAocGFyYW1zLnNuYXBPblJlbGVhc2UpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG9DbG9zZXN0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBlbmFibGVEcmFnZ2FibGU6IGZ1bmN0aW9uIGVuYWJsZURyYWdnYWJsZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnNjcm9sbGJhci5lbCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBzY3JvbGxiYXIgPSBzd2lwZXIuc2Nyb2xsYmFyO1xuICAgICAgdmFyIHRvdWNoRXZlbnRzVG91Y2ggPSBzd2lwZXIudG91Y2hFdmVudHNUb3VjaDtcbiAgICAgIHZhciB0b3VjaEV2ZW50c0Rlc2t0b3AgPSBzd2lwZXIudG91Y2hFdmVudHNEZXNrdG9wO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgICB2YXIgJGVsID0gc2Nyb2xsYmFyLiRlbDtcbiAgICAgIHZhciB0YXJnZXQgPSAkZWxbMF07XG4gICAgICB2YXIgYWN0aXZlTGlzdGVuZXIgPSBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBwYXJhbXMucGFzc2l2ZUxpc3RlbmVycyA/IHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGZhbHNlIH0gOiBmYWxzZTtcbiAgICAgIHZhciBwYXNzaXZlTGlzdGVuZXIgPSBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBwYXJhbXMucGFzc2l2ZUxpc3RlbmVycyA/IHsgcGFzc2l2ZTogdHJ1ZSwgY2FwdHVyZTogZmFsc2UgfSA6IGZhbHNlO1xuICAgICAgaWYgKCFTdXBwb3J0LnRvdWNoKSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzRGVza3RvcC5zdGFydCwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdTdGFydCwgYWN0aXZlTGlzdGVuZXIpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50c0Rlc2t0b3AubW92ZSwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdNb3ZlLCBhY3RpdmVMaXN0ZW5lcik7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzRGVza3RvcC5lbmQsIHN3aXBlci5zY3JvbGxiYXIub25EcmFnRW5kLCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHNUb3VjaC5zdGFydCwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdTdGFydCwgYWN0aXZlTGlzdGVuZXIpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50c1RvdWNoLm1vdmUsIHN3aXBlci5zY3JvbGxiYXIub25EcmFnTW92ZSwgYWN0aXZlTGlzdGVuZXIpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50c1RvdWNoLmVuZCwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBkaXNhYmxlRHJhZ2dhYmxlOiBmdW5jdGlvbiBkaXNhYmxlRHJhZ2dhYmxlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoIXN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmVsKSB7IHJldHVybjsgfVxuICAgICAgdmFyIHNjcm9sbGJhciA9IHN3aXBlci5zY3JvbGxiYXI7XG4gICAgICB2YXIgdG91Y2hFdmVudHNUb3VjaCA9IHN3aXBlci50b3VjaEV2ZW50c1RvdWNoO1xuICAgICAgdmFyIHRvdWNoRXZlbnRzRGVza3RvcCA9IHN3aXBlci50b3VjaEV2ZW50c0Rlc2t0b3A7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgICAgIHZhciAkZWwgPSBzY3JvbGxiYXIuJGVsO1xuICAgICAgdmFyIHRhcmdldCA9ICRlbFswXTtcbiAgICAgIHZhciBhY3RpdmVMaXN0ZW5lciA9IFN1cHBvcnQucGFzc2l2ZUxpc3RlbmVyICYmIHBhcmFtcy5wYXNzaXZlTGlzdGVuZXJzID8geyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogZmFsc2UgfSA6IGZhbHNlO1xuICAgICAgdmFyIHBhc3NpdmVMaXN0ZW5lciA9IFN1cHBvcnQucGFzc2l2ZUxpc3RlbmVyICYmIHBhcmFtcy5wYXNzaXZlTGlzdGVuZXJzID8geyBwYXNzaXZlOiB0cnVlLCBjYXB0dXJlOiBmYWxzZSB9IDogZmFsc2U7XG4gICAgICBpZiAoIVN1cHBvcnQudG91Y2gpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHNEZXNrdG9wLnN0YXJ0LCBzd2lwZXIuc2Nyb2xsYmFyLm9uRHJhZ1N0YXJ0LCBhY3RpdmVMaXN0ZW5lcik7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzRGVza3RvcC5tb3ZlLCBzd2lwZXIuc2Nyb2xsYmFyLm9uRHJhZ01vdmUsIGFjdGl2ZUxpc3RlbmVyKTtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIodG91Y2hFdmVudHNEZXNrdG9wLmVuZCwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0b3VjaEV2ZW50c1RvdWNoLnN0YXJ0LCBzd2lwZXIuc2Nyb2xsYmFyLm9uRHJhZ1N0YXJ0LCBhY3RpdmVMaXN0ZW5lcik7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzVG91Y2gubW92ZSwgc3dpcGVyLnNjcm9sbGJhci5vbkRyYWdNb3ZlLCBhY3RpdmVMaXN0ZW5lcik7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoRXZlbnRzVG91Y2guZW5kLCBzd2lwZXIuc2Nyb2xsYmFyLm9uRHJhZ0VuZCwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5zY3JvbGxiYXIuZWwpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgc2Nyb2xsYmFyID0gc3dpcGVyLnNjcm9sbGJhcjtcbiAgICAgIHZhciAkc3dpcGVyRWwgPSBzd2lwZXIuJGVsO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyO1xuXG4gICAgICB2YXIgJGVsID0gJChwYXJhbXMuZWwpO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudW5pcXVlTmF2RWxlbWVudHMgJiYgdHlwZW9mIHBhcmFtcy5lbCA9PT0gJ3N0cmluZycgJiYgJGVsLmxlbmd0aCA+IDEgJiYgJHN3aXBlckVsLmZpbmQocGFyYW1zLmVsKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgJGVsID0gJHN3aXBlckVsLmZpbmQocGFyYW1zLmVsKTtcbiAgICAgIH1cblxuICAgICAgdmFyICRkcmFnRWwgPSAkZWwuZmluZCgoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5zY3JvbGxiYXIuZHJhZ0NsYXNzKSkpO1xuICAgICAgaWYgKCRkcmFnRWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICRkcmFnRWwgPSAkKChcIjxkaXYgY2xhc3M9XFxcIlwiICsgKHN3aXBlci5wYXJhbXMuc2Nyb2xsYmFyLmRyYWdDbGFzcykgKyBcIlxcXCI+PC9kaXY+XCIpKTtcbiAgICAgICAgJGVsLmFwcGVuZCgkZHJhZ0VsKTtcbiAgICAgIH1cblxuICAgICAgVXRpbHMuZXh0ZW5kKHNjcm9sbGJhciwge1xuICAgICAgICAkZWw6ICRlbCxcbiAgICAgICAgZWw6ICRlbFswXSxcbiAgICAgICAgJGRyYWdFbDogJGRyYWdFbCxcbiAgICAgICAgZHJhZ0VsOiAkZHJhZ0VsWzBdLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwYXJhbXMuZHJhZ2dhYmxlKSB7XG4gICAgICAgIHNjcm9sbGJhci5lbmFibGVEcmFnZ2FibGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHN3aXBlci5zY3JvbGxiYXIuZGlzYWJsZURyYWdnYWJsZSgpO1xuICAgIH0sXG4gIH07XG5cbiAgdmFyIFNjcm9sbGJhciQxID0ge1xuICAgIG5hbWU6ICdzY3JvbGxiYXInLFxuICAgIHBhcmFtczoge1xuICAgICAgc2Nyb2xsYmFyOiB7XG4gICAgICAgIGVsOiBudWxsLFxuICAgICAgICBkcmFnU2l6ZTogJ2F1dG8nLFxuICAgICAgICBoaWRlOiBmYWxzZSxcbiAgICAgICAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgICAgICAgc25hcE9uUmVsZWFzZTogdHJ1ZSxcbiAgICAgICAgbG9ja0NsYXNzOiAnc3dpcGVyLXNjcm9sbGJhci1sb2NrJyxcbiAgICAgICAgZHJhZ0NsYXNzOiAnc3dpcGVyLXNjcm9sbGJhci1kcmFnJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBzY3JvbGxiYXI6IHtcbiAgICAgICAgICBpbml0OiBTY3JvbGxiYXIuaW5pdC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgZGVzdHJveTogU2Nyb2xsYmFyLmRlc3Ryb3kuYmluZChzd2lwZXIpLFxuICAgICAgICAgIHVwZGF0ZVNpemU6IFNjcm9sbGJhci51cGRhdGVTaXplLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IFNjcm9sbGJhci5zZXRUcmFuc2xhdGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIHNldFRyYW5zaXRpb246IFNjcm9sbGJhci5zZXRUcmFuc2l0aW9uLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBlbmFibGVEcmFnZ2FibGU6IFNjcm9sbGJhci5lbmFibGVEcmFnZ2FibGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGRpc2FibGVEcmFnZ2FibGU6IFNjcm9sbGJhci5kaXNhYmxlRHJhZ2dhYmxlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXREcmFnUG9zaXRpb246IFNjcm9sbGJhci5zZXREcmFnUG9zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICAgIGdldFBvaW50ZXJQb3NpdGlvbjogU2Nyb2xsYmFyLmdldFBvaW50ZXJQb3NpdGlvbi5iaW5kKHN3aXBlciksXG4gICAgICAgICAgb25EcmFnU3RhcnQ6IFNjcm9sbGJhci5vbkRyYWdTdGFydC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgb25EcmFnTW92ZTogU2Nyb2xsYmFyLm9uRHJhZ01vdmUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIG9uRHJhZ0VuZDogU2Nyb2xsYmFyLm9uRHJhZ0VuZC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgaXNUb3VjaGVkOiBmYWxzZSxcbiAgICAgICAgICB0aW1lb3V0OiBudWxsLFxuICAgICAgICAgIGRyYWdUaW1lb3V0OiBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5zY3JvbGxiYXIuaW5pdCgpO1xuICAgICAgICBzd2lwZXIuc2Nyb2xsYmFyLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgc3dpcGVyLnNjcm9sbGJhci5zZXRUcmFuc2xhdGUoKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5zY3JvbGxiYXIudXBkYXRlU2l6ZSgpO1xuICAgICAgfSxcbiAgICAgIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgc3dpcGVyLnNjcm9sbGJhci51cGRhdGVTaXplKCk7XG4gICAgICB9LFxuICAgICAgb2JzZXJ2ZXJVcGRhdGU6IGZ1bmN0aW9uIG9ic2VydmVyVXBkYXRlKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgc3dpcGVyLnNjcm9sbGJhci51cGRhdGVTaXplKCk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBzd2lwZXIuc2Nyb2xsYmFyLnNldFRyYW5zbGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5zY3JvbGxiYXIuc2V0VHJhbnNpdGlvbihkdXJhdGlvbik7XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci5zY3JvbGxiYXIuZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBQYXJhbGxheCA9IHtcbiAgICBzZXRUcmFuc2Zvcm06IGZ1bmN0aW9uIHNldFRyYW5zZm9ybShlbCwgcHJvZ3Jlc3MpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGw7XG5cbiAgICAgIHZhciAkZWwgPSAkKGVsKTtcbiAgICAgIHZhciBydGxGYWN0b3IgPSBydGwgPyAtMSA6IDE7XG5cbiAgICAgIHZhciBwID0gJGVsLmF0dHIoJ2RhdGEtc3dpcGVyLXBhcmFsbGF4JykgfHwgJzAnO1xuICAgICAgdmFyIHggPSAkZWwuYXR0cignZGF0YS1zd2lwZXItcGFyYWxsYXgteCcpO1xuICAgICAgdmFyIHkgPSAkZWwuYXR0cignZGF0YS1zd2lwZXItcGFyYWxsYXgteScpO1xuICAgICAgdmFyIHNjYWxlID0gJGVsLmF0dHIoJ2RhdGEtc3dpcGVyLXBhcmFsbGF4LXNjYWxlJyk7XG4gICAgICB2YXIgb3BhY2l0eSA9ICRlbC5hdHRyKCdkYXRhLXN3aXBlci1wYXJhbGxheC1vcGFjaXR5Jyk7XG5cbiAgICAgIGlmICh4IHx8IHkpIHtcbiAgICAgICAgeCA9IHggfHwgJzAnO1xuICAgICAgICB5ID0geSB8fCAnMCc7XG4gICAgICB9IGVsc2UgaWYgKHN3aXBlci5pc0hvcml6b250YWwoKSkge1xuICAgICAgICB4ID0gcDtcbiAgICAgICAgeSA9ICcwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkgPSBwO1xuICAgICAgICB4ID0gJzAnO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHgpLmluZGV4T2YoJyUnKSA+PSAwKSB7XG4gICAgICAgIHggPSAocGFyc2VJbnQoeCwgMTApICogcHJvZ3Jlc3MgKiBydGxGYWN0b3IpICsgXCIlXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ID0gKHggKiBwcm9ncmVzcyAqIHJ0bEZhY3RvcikgKyBcInB4XCI7XG4gICAgICB9XG4gICAgICBpZiAoKHkpLmluZGV4T2YoJyUnKSA+PSAwKSB7XG4gICAgICAgIHkgPSAocGFyc2VJbnQoeSwgMTApICogcHJvZ3Jlc3MpICsgXCIlXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5ID0gKHkgKiBwcm9ncmVzcykgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb3BhY2l0eSAhPT0gJ3VuZGVmaW5lZCcgJiYgb3BhY2l0eSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgY3VycmVudE9wYWNpdHkgPSBvcGFjaXR5IC0gKChvcGFjaXR5IC0gMSkgKiAoMSAtIE1hdGguYWJzKHByb2dyZXNzKSkpO1xuICAgICAgICAkZWxbMF0uc3R5bGUub3BhY2l0eSA9IGN1cnJlbnRPcGFjaXR5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzY2FsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgc2NhbGUgPT09IG51bGwpIHtcbiAgICAgICAgJGVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcIiwgXCIgKyB5ICsgXCIsIDBweClcIikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTY2FsZSA9IHNjYWxlIC0gKChzY2FsZSAtIDEpICogKDEgLSBNYXRoLmFicyhwcm9ncmVzcykpKTtcbiAgICAgICAgJGVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcIiwgXCIgKyB5ICsgXCIsIDBweCkgc2NhbGUoXCIgKyBjdXJyZW50U2NhbGUgKyBcIilcIikpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciAkZWwgPSBzd2lwZXIuJGVsO1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICB2YXIgcHJvZ3Jlc3MgPSBzd2lwZXIucHJvZ3Jlc3M7XG4gICAgICB2YXIgc25hcEdyaWQgPSBzd2lwZXIuc25hcEdyaWQ7XG4gICAgICAkZWwuY2hpbGRyZW4oJ1tkYXRhLXN3aXBlci1wYXJhbGxheF0sIFtkYXRhLXN3aXBlci1wYXJhbGxheC14XSwgW2RhdGEtc3dpcGVyLXBhcmFsbGF4LXldLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgtb3BhY2l0eV0sIFtkYXRhLXN3aXBlci1wYXJhbGxheC1zY2FsZV0nKVxuICAgICAgICAuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsKSB7XG4gICAgICAgICAgc3dpcGVyLnBhcmFsbGF4LnNldFRyYW5zZm9ybShlbCwgcHJvZ3Jlc3MpO1xuICAgICAgICB9KTtcbiAgICAgIHNsaWRlcy5lYWNoKGZ1bmN0aW9uIChzbGlkZUluZGV4LCBzbGlkZUVsKSB7XG4gICAgICAgIHZhciBzbGlkZVByb2dyZXNzID0gc2xpZGVFbC5wcm9ncmVzcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXAgPiAxICYmIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gJ2F1dG8nKSB7XG4gICAgICAgICAgc2xpZGVQcm9ncmVzcyArPSBNYXRoLmNlaWwoc2xpZGVJbmRleCAvIDIpIC0gKHByb2dyZXNzICogKHNuYXBHcmlkLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBzbGlkZVByb2dyZXNzID0gTWF0aC5taW4oTWF0aC5tYXgoc2xpZGVQcm9ncmVzcywgLTEpLCAxKTtcbiAgICAgICAgJChzbGlkZUVsKS5maW5kKCdbZGF0YS1zd2lwZXItcGFyYWxsYXhdLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgteF0sIFtkYXRhLXN3aXBlci1wYXJhbGxheC15XSwgW2RhdGEtc3dpcGVyLXBhcmFsbGF4LW9wYWNpdHldLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgtc2NhbGVdJylcbiAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsKSB7XG4gICAgICAgICAgICBzd2lwZXIucGFyYWxsYXguc2V0VHJhbnNmb3JtKGVsLCBzbGlkZVByb2dyZXNzKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgaWYgKCBkdXJhdGlvbiA9PT0gdm9pZCAwICkgZHVyYXRpb24gPSB0aGlzLnBhcmFtcy5zcGVlZDtcblxuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICAgICRlbC5maW5kKCdbZGF0YS1zd2lwZXItcGFyYWxsYXhdLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgteF0sIFtkYXRhLXN3aXBlci1wYXJhbGxheC15XSwgW2RhdGEtc3dpcGVyLXBhcmFsbGF4LW9wYWNpdHldLCBbZGF0YS1zd2lwZXItcGFyYWxsYXgtc2NhbGVdJylcbiAgICAgICAgLmVhY2goZnVuY3Rpb24gKGluZGV4LCBwYXJhbGxheEVsKSB7XG4gICAgICAgICAgdmFyICRwYXJhbGxheEVsID0gJChwYXJhbGxheEVsKTtcbiAgICAgICAgICB2YXIgcGFyYWxsYXhEdXJhdGlvbiA9IHBhcnNlSW50KCRwYXJhbGxheEVsLmF0dHIoJ2RhdGEtc3dpcGVyLXBhcmFsbGF4LWR1cmF0aW9uJyksIDEwKSB8fCBkdXJhdGlvbjtcbiAgICAgICAgICBpZiAoZHVyYXRpb24gPT09IDApIHsgcGFyYWxsYXhEdXJhdGlvbiA9IDA7IH1cbiAgICAgICAgICAkcGFyYWxsYXhFbC50cmFuc2l0aW9uKHBhcmFsbGF4RHVyYXRpb24pO1xuICAgICAgICB9KTtcbiAgICB9LFxuICB9O1xuXG4gIHZhciBQYXJhbGxheCQxID0ge1xuICAgIG5hbWU6ICdwYXJhbGxheCcsXG4gICAgcGFyYW1zOiB7XG4gICAgICBwYXJhbGxheDoge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBwYXJhbGxheDoge1xuICAgICAgICAgIHNldFRyYW5zZm9ybTogUGFyYWxsYXguc2V0VHJhbnNmb3JtLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IFBhcmFsbGF4LnNldFRyYW5zbGF0ZS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgc2V0VHJhbnNpdGlvbjogUGFyYWxsYXguc2V0VHJhbnNpdGlvbi5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBiZWZvcmVJbml0OiBmdW5jdGlvbiBiZWZvcmVJbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnBhcmFsbGF4LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5wYXJhbXMud2F0Y2hTbGlkZXNQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIHN3aXBlci5vcmlnaW5hbFBhcmFtcy53YXRjaFNsaWRlc1Byb2dyZXNzID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnBhcmFsbGF4LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5wYXJhbGxheC5zZXRUcmFuc2xhdGUoKTtcbiAgICAgIH0sXG4gICAgICBzZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5wYXJhbGxheC5lbmFibGVkKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIucGFyYWxsYXguc2V0VHJhbnNsYXRlKCk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLnBhcmFsbGF4LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5wYXJhbGxheC5zZXRUcmFuc2l0aW9uKGR1cmF0aW9uKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICB2YXIgWm9vbSA9IHtcbiAgICAvLyBDYWxjIFNjYWxlIEZyb20gTXVsdGktdG91Y2hlc1xuICAgIGdldERpc3RhbmNlQmV0d2VlblRvdWNoZXM6IGZ1bmN0aW9uIGdldERpc3RhbmNlQmV0d2VlblRvdWNoZXMoZSkge1xuICAgICAgaWYgKGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggPCAyKSB7IHJldHVybiAxOyB9XG4gICAgICB2YXIgeDEgPSBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVg7XG4gICAgICB2YXIgeTEgPSBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVk7XG4gICAgICB2YXIgeDIgPSBlLnRhcmdldFRvdWNoZXNbMV0ucGFnZVg7XG4gICAgICB2YXIgeTIgPSBlLnRhcmdldFRvdWNoZXNbMV0ucGFnZVk7XG4gICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoKE1hdGgucG93KCAoeDIgLSB4MSksIDIgKSkgKyAoTWF0aC5wb3coICh5MiAtIHkxKSwgMiApKSk7XG4gICAgICByZXR1cm4gZGlzdGFuY2U7XG4gICAgfSxcbiAgICAvLyBFdmVudHNcbiAgICBvbkdlc3R1cmVTdGFydDogZnVuY3Rpb24gb25HZXN0dXJlU3RhcnQoZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy56b29tO1xuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIHZhciBnZXN0dXJlID0gem9vbS5nZXN0dXJlO1xuICAgICAgem9vbS5mYWtlR2VzdHVyZVRvdWNoZWQgPSBmYWxzZTtcbiAgICAgIHpvb20uZmFrZUdlc3R1cmVNb3ZlZCA9IGZhbHNlO1xuICAgICAgaWYgKCFTdXBwb3J0Lmdlc3R1cmVzKSB7XG4gICAgICAgIGlmIChlLnR5cGUgIT09ICd0b3VjaHN0YXJ0JyB8fCAoZS50eXBlID09PSAndG91Y2hzdGFydCcgJiYgZS50YXJnZXRUb3VjaGVzLmxlbmd0aCA8IDIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHpvb20uZmFrZUdlc3R1cmVUb3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgZ2VzdHVyZS5zY2FsZVN0YXJ0ID0gWm9vbS5nZXREaXN0YW5jZUJldHdlZW5Ub3VjaGVzKGUpO1xuICAgICAgfVxuICAgICAgaWYgKCFnZXN0dXJlLiRzbGlkZUVsIHx8ICFnZXN0dXJlLiRzbGlkZUVsLmxlbmd0aCkge1xuICAgICAgICBnZXN0dXJlLiRzbGlkZUVsID0gJChlLnRhcmdldCkuY2xvc2VzdCgnLnN3aXBlci1zbGlkZScpO1xuICAgICAgICBpZiAoZ2VzdHVyZS4kc2xpZGVFbC5sZW5ndGggPT09IDApIHsgZ2VzdHVyZS4kc2xpZGVFbCA9IHN3aXBlci5zbGlkZXMuZXEoc3dpcGVyLmFjdGl2ZUluZGV4KTsgfVxuICAgICAgICBnZXN0dXJlLiRpbWFnZUVsID0gZ2VzdHVyZS4kc2xpZGVFbC5maW5kKCdpbWcsIHN2ZywgY2FudmFzJyk7XG4gICAgICAgIGdlc3R1cmUuJGltYWdlV3JhcEVsID0gZ2VzdHVyZS4kaW1hZ2VFbC5wYXJlbnQoKFwiLlwiICsgKHBhcmFtcy5jb250YWluZXJDbGFzcykpKTtcbiAgICAgICAgZ2VzdHVyZS5tYXhSYXRpbyA9IGdlc3R1cmUuJGltYWdlV3JhcEVsLmF0dHIoJ2RhdGEtc3dpcGVyLXpvb20nKSB8fCBwYXJhbXMubWF4UmF0aW87XG4gICAgICAgIGlmIChnZXN0dXJlLiRpbWFnZVdyYXBFbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBnZXN0dXJlLiRpbWFnZUVsID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZ2VzdHVyZS4kaW1hZ2VFbC50cmFuc2l0aW9uKDApO1xuICAgICAgc3dpcGVyLnpvb20uaXNTY2FsaW5nID0gdHJ1ZTtcbiAgICB9LFxuICAgIG9uR2VzdHVyZUNoYW5nZTogZnVuY3Rpb24gb25HZXN0dXJlQ2hhbmdlKGUpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuem9vbTtcbiAgICAgIHZhciB6b29tID0gc3dpcGVyLnpvb207XG4gICAgICB2YXIgZ2VzdHVyZSA9IHpvb20uZ2VzdHVyZTtcbiAgICAgIGlmICghU3VwcG9ydC5nZXN0dXJlcykge1xuICAgICAgICBpZiAoZS50eXBlICE9PSAndG91Y2htb3ZlJyB8fCAoZS50eXBlID09PSAndG91Y2htb3ZlJyAmJiBlLnRhcmdldFRvdWNoZXMubGVuZ3RoIDwgMikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgem9vbS5mYWtlR2VzdHVyZU1vdmVkID0gdHJ1ZTtcbiAgICAgICAgZ2VzdHVyZS5zY2FsZU1vdmUgPSBab29tLmdldERpc3RhbmNlQmV0d2VlblRvdWNoZXMoZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgICBpZiAoU3VwcG9ydC5nZXN0dXJlcykge1xuICAgICAgICB6b29tLnNjYWxlID0gZS5zY2FsZSAqIHpvb20uY3VycmVudFNjYWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgem9vbS5zY2FsZSA9IChnZXN0dXJlLnNjYWxlTW92ZSAvIGdlc3R1cmUuc2NhbGVTdGFydCkgKiB6b29tLmN1cnJlbnRTY2FsZTtcbiAgICAgIH1cbiAgICAgIGlmICh6b29tLnNjYWxlID4gZ2VzdHVyZS5tYXhSYXRpbykge1xuICAgICAgICB6b29tLnNjYWxlID0gKGdlc3R1cmUubWF4UmF0aW8gLSAxKSArIChNYXRoLnBvdyggKCh6b29tLnNjYWxlIC0gZ2VzdHVyZS5tYXhSYXRpbykgKyAxKSwgMC41ICkpO1xuICAgICAgfVxuICAgICAgaWYgKHpvb20uc2NhbGUgPCBwYXJhbXMubWluUmF0aW8pIHtcbiAgICAgICAgem9vbS5zY2FsZSA9IChwYXJhbXMubWluUmF0aW8gKyAxKSAtIChNYXRoLnBvdyggKChwYXJhbXMubWluUmF0aW8gLSB6b29tLnNjYWxlKSArIDEpLCAwLjUgKSk7XG4gICAgICB9XG4gICAgICBnZXN0dXJlLiRpbWFnZUVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZCgwLDAsMCkgc2NhbGUoXCIgKyAoem9vbS5zY2FsZSkgKyBcIilcIikpO1xuICAgIH0sXG4gICAgb25HZXN0dXJlRW5kOiBmdW5jdGlvbiBvbkdlc3R1cmVFbmQoZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy56b29tO1xuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIHZhciBnZXN0dXJlID0gem9vbS5nZXN0dXJlO1xuICAgICAgaWYgKCFTdXBwb3J0Lmdlc3R1cmVzKSB7XG4gICAgICAgIGlmICghem9vbS5mYWtlR2VzdHVyZVRvdWNoZWQgfHwgIXpvb20uZmFrZUdlc3R1cmVNb3ZlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS50eXBlICE9PSAndG91Y2hlbmQnIHx8IChlLnR5cGUgPT09ICd0b3VjaGVuZCcgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPCAyICYmICFEZXZpY2UuYW5kcm9pZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgem9vbS5mYWtlR2VzdHVyZVRvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgem9vbS5mYWtlR2VzdHVyZU1vdmVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgICB6b29tLnNjYWxlID0gTWF0aC5tYXgoTWF0aC5taW4oem9vbS5zY2FsZSwgZ2VzdHVyZS5tYXhSYXRpbyksIHBhcmFtcy5taW5SYXRpbyk7XG4gICAgICBnZXN0dXJlLiRpbWFnZUVsLnRyYW5zaXRpb24oc3dpcGVyLnBhcmFtcy5zcGVlZCkudHJhbnNmb3JtKChcInRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZShcIiArICh6b29tLnNjYWxlKSArIFwiKVwiKSk7XG4gICAgICB6b29tLmN1cnJlbnRTY2FsZSA9IHpvb20uc2NhbGU7XG4gICAgICB6b29tLmlzU2NhbGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHpvb20uc2NhbGUgPT09IDEpIHsgZ2VzdHVyZS4kc2xpZGVFbCA9IHVuZGVmaW5lZDsgfVxuICAgIH0sXG4gICAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZSkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgem9vbSA9IHN3aXBlci56b29tO1xuICAgICAgdmFyIGdlc3R1cmUgPSB6b29tLmdlc3R1cmU7XG4gICAgICB2YXIgaW1hZ2UgPSB6b29tLmltYWdlO1xuICAgICAgaWYgKCFnZXN0dXJlLiRpbWFnZUVsIHx8IGdlc3R1cmUuJGltYWdlRWwubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgICAgaWYgKGltYWdlLmlzVG91Y2hlZCkgeyByZXR1cm47IH1cbiAgICAgIGlmIChEZXZpY2UuYW5kcm9pZCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICAgIGltYWdlLmlzVG91Y2hlZCA9IHRydWU7XG4gICAgICBpbWFnZS50b3VjaGVzU3RhcnQueCA9IGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYIDogZS5wYWdlWDtcbiAgICAgIGltYWdlLnRvdWNoZXNTdGFydC55ID0gZS50eXBlID09PSAndG91Y2hzdGFydCcgPyBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVkgOiBlLnBhZ2VZO1xuICAgIH0sXG4gICAgb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGUpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIHZhciBnZXN0dXJlID0gem9vbS5nZXN0dXJlO1xuICAgICAgdmFyIGltYWdlID0gem9vbS5pbWFnZTtcbiAgICAgIHZhciB2ZWxvY2l0eSA9IHpvb20udmVsb2NpdHk7XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgICBzd2lwZXIuYWxsb3dDbGljayA9IGZhbHNlO1xuICAgICAgaWYgKCFpbWFnZS5pc1RvdWNoZWQgfHwgIWdlc3R1cmUuJHNsaWRlRWwpIHsgcmV0dXJuOyB9XG5cbiAgICAgIGlmICghaW1hZ2UuaXNNb3ZlZCkge1xuICAgICAgICBpbWFnZS53aWR0aCA9IGdlc3R1cmUuJGltYWdlRWxbMF0ub2Zmc2V0V2lkdGg7XG4gICAgICAgIGltYWdlLmhlaWdodCA9IGdlc3R1cmUuJGltYWdlRWxbMF0ub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBpbWFnZS5zdGFydFggPSBVdGlscy5nZXRUcmFuc2xhdGUoZ2VzdHVyZS4kaW1hZ2VXcmFwRWxbMF0sICd4JykgfHwgMDtcbiAgICAgICAgaW1hZ2Uuc3RhcnRZID0gVXRpbHMuZ2V0VHJhbnNsYXRlKGdlc3R1cmUuJGltYWdlV3JhcEVsWzBdLCAneScpIHx8IDA7XG4gICAgICAgIGdlc3R1cmUuc2xpZGVXaWR0aCA9IGdlc3R1cmUuJHNsaWRlRWxbMF0ub2Zmc2V0V2lkdGg7XG4gICAgICAgIGdlc3R1cmUuc2xpZGVIZWlnaHQgPSBnZXN0dXJlLiRzbGlkZUVsWzBdLm9mZnNldEhlaWdodDtcbiAgICAgICAgZ2VzdHVyZS4kaW1hZ2VXcmFwRWwudHJhbnNpdGlvbigwKTtcbiAgICAgICAgaWYgKHN3aXBlci5ydGwpIHtcbiAgICAgICAgICBpbWFnZS5zdGFydFggPSAtaW1hZ2Uuc3RhcnRYO1xuICAgICAgICAgIGltYWdlLnN0YXJ0WSA9IC1pbWFnZS5zdGFydFk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERlZmluZSBpZiB3ZSBuZWVkIGltYWdlIGRyYWdcbiAgICAgIHZhciBzY2FsZWRXaWR0aCA9IGltYWdlLndpZHRoICogem9vbS5zY2FsZTtcbiAgICAgIHZhciBzY2FsZWRIZWlnaHQgPSBpbWFnZS5oZWlnaHQgKiB6b29tLnNjYWxlO1xuXG4gICAgICBpZiAoc2NhbGVkV2lkdGggPCBnZXN0dXJlLnNsaWRlV2lkdGggJiYgc2NhbGVkSGVpZ2h0IDwgZ2VzdHVyZS5zbGlkZUhlaWdodCkgeyByZXR1cm47IH1cblxuICAgICAgaW1hZ2UubWluWCA9IE1hdGgubWluKCgoZ2VzdHVyZS5zbGlkZVdpZHRoIC8gMikgLSAoc2NhbGVkV2lkdGggLyAyKSksIDApO1xuICAgICAgaW1hZ2UubWF4WCA9IC1pbWFnZS5taW5YO1xuICAgICAgaW1hZ2UubWluWSA9IE1hdGgubWluKCgoZ2VzdHVyZS5zbGlkZUhlaWdodCAvIDIpIC0gKHNjYWxlZEhlaWdodCAvIDIpKSwgMCk7XG4gICAgICBpbWFnZS5tYXhZID0gLWltYWdlLm1pblk7XG5cbiAgICAgIGltYWdlLnRvdWNoZXNDdXJyZW50LnggPSBlLnR5cGUgPT09ICd0b3VjaG1vdmUnID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYIDogZS5wYWdlWDtcbiAgICAgIGltYWdlLnRvdWNoZXNDdXJyZW50LnkgPSBlLnR5cGUgPT09ICd0b3VjaG1vdmUnID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VZIDogZS5wYWdlWTtcblxuICAgICAgaWYgKCFpbWFnZS5pc01vdmVkICYmICF6b29tLmlzU2NhbGluZykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3dpcGVyLmlzSG9yaXpvbnRhbCgpXG4gICAgICAgICAgJiYgKFxuICAgICAgICAgICAgKE1hdGguZmxvb3IoaW1hZ2UubWluWCkgPT09IE1hdGguZmxvb3IoaW1hZ2Uuc3RhcnRYKSAmJiBpbWFnZS50b3VjaGVzQ3VycmVudC54IDwgaW1hZ2UudG91Y2hlc1N0YXJ0LngpXG4gICAgICAgICAgICB8fCAoTWF0aC5mbG9vcihpbWFnZS5tYXhYKSA9PT0gTWF0aC5mbG9vcihpbWFnZS5zdGFydFgpICYmIGltYWdlLnRvdWNoZXNDdXJyZW50LnggPiBpbWFnZS50b3VjaGVzU3RhcnQueClcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGltYWdlLmlzVG91Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBpZiAoXG4gICAgICAgICAgIXN3aXBlci5pc0hvcml6b250YWwoKVxuICAgICAgICAgICYmIChcbiAgICAgICAgICAgIChNYXRoLmZsb29yKGltYWdlLm1pblkpID09PSBNYXRoLmZsb29yKGltYWdlLnN0YXJ0WSkgJiYgaW1hZ2UudG91Y2hlc0N1cnJlbnQueSA8IGltYWdlLnRvdWNoZXNTdGFydC55KVxuICAgICAgICAgICAgfHwgKE1hdGguZmxvb3IoaW1hZ2UubWF4WSkgPT09IE1hdGguZmxvb3IoaW1hZ2Uuc3RhcnRZKSAmJiBpbWFnZS50b3VjaGVzQ3VycmVudC55ID4gaW1hZ2UudG91Y2hlc1N0YXJ0LnkpXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBpbWFnZS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGltYWdlLmlzTW92ZWQgPSB0cnVlO1xuICAgICAgaW1hZ2UuY3VycmVudFggPSAoaW1hZ2UudG91Y2hlc0N1cnJlbnQueCAtIGltYWdlLnRvdWNoZXNTdGFydC54KSArIGltYWdlLnN0YXJ0WDtcbiAgICAgIGltYWdlLmN1cnJlbnRZID0gKGltYWdlLnRvdWNoZXNDdXJyZW50LnkgLSBpbWFnZS50b3VjaGVzU3RhcnQueSkgKyBpbWFnZS5zdGFydFk7XG5cbiAgICAgIGlmIChpbWFnZS5jdXJyZW50WCA8IGltYWdlLm1pblgpIHtcbiAgICAgICAgaW1hZ2UuY3VycmVudFggPSAoaW1hZ2UubWluWCArIDEpIC0gKE1hdGgucG93KCAoKGltYWdlLm1pblggLSBpbWFnZS5jdXJyZW50WCkgKyAxKSwgMC44ICkpO1xuICAgICAgfVxuICAgICAgaWYgKGltYWdlLmN1cnJlbnRYID4gaW1hZ2UubWF4WCkge1xuICAgICAgICBpbWFnZS5jdXJyZW50WCA9IChpbWFnZS5tYXhYIC0gMSkgKyAoTWF0aC5wb3coICgoaW1hZ2UuY3VycmVudFggLSBpbWFnZS5tYXhYKSArIDEpLCAwLjggKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZS5jdXJyZW50WSA8IGltYWdlLm1pblkpIHtcbiAgICAgICAgaW1hZ2UuY3VycmVudFkgPSAoaW1hZ2UubWluWSArIDEpIC0gKE1hdGgucG93KCAoKGltYWdlLm1pblkgLSBpbWFnZS5jdXJyZW50WSkgKyAxKSwgMC44ICkpO1xuICAgICAgfVxuICAgICAgaWYgKGltYWdlLmN1cnJlbnRZID4gaW1hZ2UubWF4WSkge1xuICAgICAgICBpbWFnZS5jdXJyZW50WSA9IChpbWFnZS5tYXhZIC0gMSkgKyAoTWF0aC5wb3coICgoaW1hZ2UuY3VycmVudFkgLSBpbWFnZS5tYXhZKSArIDEpLCAwLjggKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlbG9jaXR5XG4gICAgICBpZiAoIXZlbG9jaXR5LnByZXZQb3NpdGlvblgpIHsgdmVsb2NpdHkucHJldlBvc2l0aW9uWCA9IGltYWdlLnRvdWNoZXNDdXJyZW50Lng7IH1cbiAgICAgIGlmICghdmVsb2NpdHkucHJldlBvc2l0aW9uWSkgeyB2ZWxvY2l0eS5wcmV2UG9zaXRpb25ZID0gaW1hZ2UudG91Y2hlc0N1cnJlbnQueTsgfVxuICAgICAgaWYgKCF2ZWxvY2l0eS5wcmV2VGltZSkgeyB2ZWxvY2l0eS5wcmV2VGltZSA9IERhdGUubm93KCk7IH1cbiAgICAgIHZlbG9jaXR5LnggPSAoaW1hZ2UudG91Y2hlc0N1cnJlbnQueCAtIHZlbG9jaXR5LnByZXZQb3NpdGlvblgpIC8gKERhdGUubm93KCkgLSB2ZWxvY2l0eS5wcmV2VGltZSkgLyAyO1xuICAgICAgdmVsb2NpdHkueSA9IChpbWFnZS50b3VjaGVzQ3VycmVudC55IC0gdmVsb2NpdHkucHJldlBvc2l0aW9uWSkgLyAoRGF0ZS5ub3coKSAtIHZlbG9jaXR5LnByZXZUaW1lKSAvIDI7XG4gICAgICBpZiAoTWF0aC5hYnMoaW1hZ2UudG91Y2hlc0N1cnJlbnQueCAtIHZlbG9jaXR5LnByZXZQb3NpdGlvblgpIDwgMikgeyB2ZWxvY2l0eS54ID0gMDsgfVxuICAgICAgaWYgKE1hdGguYWJzKGltYWdlLnRvdWNoZXNDdXJyZW50LnkgLSB2ZWxvY2l0eS5wcmV2UG9zaXRpb25ZKSA8IDIpIHsgdmVsb2NpdHkueSA9IDA7IH1cbiAgICAgIHZlbG9jaXR5LnByZXZQb3NpdGlvblggPSBpbWFnZS50b3VjaGVzQ3VycmVudC54O1xuICAgICAgdmVsb2NpdHkucHJldlBvc2l0aW9uWSA9IGltYWdlLnRvdWNoZXNDdXJyZW50Lnk7XG4gICAgICB2ZWxvY2l0eS5wcmV2VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgIGdlc3R1cmUuJGltYWdlV3JhcEVsLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIChpbWFnZS5jdXJyZW50WCkgKyBcInB4LCBcIiArIChpbWFnZS5jdXJyZW50WSkgKyBcInB4LDApXCIpKTtcbiAgICB9LFxuICAgIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uIG9uVG91Y2hFbmQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciB6b29tID0gc3dpcGVyLnpvb207XG4gICAgICB2YXIgZ2VzdHVyZSA9IHpvb20uZ2VzdHVyZTtcbiAgICAgIHZhciBpbWFnZSA9IHpvb20uaW1hZ2U7XG4gICAgICB2YXIgdmVsb2NpdHkgPSB6b29tLnZlbG9jaXR5O1xuICAgICAgaWYgKCFnZXN0dXJlLiRpbWFnZUVsIHx8IGdlc3R1cmUuJGltYWdlRWwubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgICAgaWYgKCFpbWFnZS5pc1RvdWNoZWQgfHwgIWltYWdlLmlzTW92ZWQpIHtcbiAgICAgICAgaW1hZ2UuaXNUb3VjaGVkID0gZmFsc2U7XG4gICAgICAgIGltYWdlLmlzTW92ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW1hZ2UuaXNUb3VjaGVkID0gZmFsc2U7XG4gICAgICBpbWFnZS5pc01vdmVkID0gZmFsc2U7XG4gICAgICB2YXIgbW9tZW50dW1EdXJhdGlvblggPSAzMDA7XG4gICAgICB2YXIgbW9tZW50dW1EdXJhdGlvblkgPSAzMDA7XG4gICAgICB2YXIgbW9tZW50dW1EaXN0YW5jZVggPSB2ZWxvY2l0eS54ICogbW9tZW50dW1EdXJhdGlvblg7XG4gICAgICB2YXIgbmV3UG9zaXRpb25YID0gaW1hZ2UuY3VycmVudFggKyBtb21lbnR1bURpc3RhbmNlWDtcbiAgICAgIHZhciBtb21lbnR1bURpc3RhbmNlWSA9IHZlbG9jaXR5LnkgKiBtb21lbnR1bUR1cmF0aW9uWTtcbiAgICAgIHZhciBuZXdQb3NpdGlvblkgPSBpbWFnZS5jdXJyZW50WSArIG1vbWVudHVtRGlzdGFuY2VZO1xuXG4gICAgICAvLyBGaXggZHVyYXRpb25cbiAgICAgIGlmICh2ZWxvY2l0eS54ICE9PSAwKSB7IG1vbWVudHVtRHVyYXRpb25YID0gTWF0aC5hYnMoKG5ld1Bvc2l0aW9uWCAtIGltYWdlLmN1cnJlbnRYKSAvIHZlbG9jaXR5LngpOyB9XG4gICAgICBpZiAodmVsb2NpdHkueSAhPT0gMCkgeyBtb21lbnR1bUR1cmF0aW9uWSA9IE1hdGguYWJzKChuZXdQb3NpdGlvblkgLSBpbWFnZS5jdXJyZW50WSkgLyB2ZWxvY2l0eS55KTsgfVxuICAgICAgdmFyIG1vbWVudHVtRHVyYXRpb24gPSBNYXRoLm1heChtb21lbnR1bUR1cmF0aW9uWCwgbW9tZW50dW1EdXJhdGlvblkpO1xuXG4gICAgICBpbWFnZS5jdXJyZW50WCA9IG5ld1Bvc2l0aW9uWDtcbiAgICAgIGltYWdlLmN1cnJlbnRZID0gbmV3UG9zaXRpb25ZO1xuXG4gICAgICAvLyBEZWZpbmUgaWYgd2UgbmVlZCBpbWFnZSBkcmFnXG4gICAgICB2YXIgc2NhbGVkV2lkdGggPSBpbWFnZS53aWR0aCAqIHpvb20uc2NhbGU7XG4gICAgICB2YXIgc2NhbGVkSGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0ICogem9vbS5zY2FsZTtcbiAgICAgIGltYWdlLm1pblggPSBNYXRoLm1pbigoKGdlc3R1cmUuc2xpZGVXaWR0aCAvIDIpIC0gKHNjYWxlZFdpZHRoIC8gMikpLCAwKTtcbiAgICAgIGltYWdlLm1heFggPSAtaW1hZ2UubWluWDtcbiAgICAgIGltYWdlLm1pblkgPSBNYXRoLm1pbigoKGdlc3R1cmUuc2xpZGVIZWlnaHQgLyAyKSAtIChzY2FsZWRIZWlnaHQgLyAyKSksIDApO1xuICAgICAgaW1hZ2UubWF4WSA9IC1pbWFnZS5taW5ZO1xuICAgICAgaW1hZ2UuY3VycmVudFggPSBNYXRoLm1heChNYXRoLm1pbihpbWFnZS5jdXJyZW50WCwgaW1hZ2UubWF4WCksIGltYWdlLm1pblgpO1xuICAgICAgaW1hZ2UuY3VycmVudFkgPSBNYXRoLm1heChNYXRoLm1pbihpbWFnZS5jdXJyZW50WSwgaW1hZ2UubWF4WSksIGltYWdlLm1pblkpO1xuXG4gICAgICBnZXN0dXJlLiRpbWFnZVdyYXBFbC50cmFuc2l0aW9uKG1vbWVudHVtRHVyYXRpb24pLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIChpbWFnZS5jdXJyZW50WCkgKyBcInB4LCBcIiArIChpbWFnZS5jdXJyZW50WSkgKyBcInB4LDApXCIpKTtcbiAgICB9LFxuICAgIG9uVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gb25UcmFuc2l0aW9uRW5kKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgem9vbSA9IHN3aXBlci56b29tO1xuICAgICAgdmFyIGdlc3R1cmUgPSB6b29tLmdlc3R1cmU7XG4gICAgICBpZiAoZ2VzdHVyZS4kc2xpZGVFbCAmJiBzd2lwZXIucHJldmlvdXNJbmRleCAhPT0gc3dpcGVyLmFjdGl2ZUluZGV4KSB7XG4gICAgICAgIGdlc3R1cmUuJGltYWdlRWwudHJhbnNmb3JtKCd0cmFuc2xhdGUzZCgwLDAsMCkgc2NhbGUoMSknKTtcbiAgICAgICAgZ2VzdHVyZS4kaW1hZ2VXcmFwRWwudHJhbnNmb3JtKCd0cmFuc2xhdGUzZCgwLDAsMCknKTtcblxuICAgICAgICB6b29tLnNjYWxlID0gMTtcbiAgICAgICAgem9vbS5jdXJyZW50U2NhbGUgPSAxO1xuXG4gICAgICAgIGdlc3R1cmUuJHNsaWRlRWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIGdlc3R1cmUuJGltYWdlRWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIGdlc3R1cmUuJGltYWdlV3JhcEVsID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0sXG4gICAgLy8gVG9nZ2xlIFpvb21cbiAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZShlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciB6b29tID0gc3dpcGVyLnpvb207XG5cbiAgICAgIGlmICh6b29tLnNjYWxlICYmIHpvb20uc2NhbGUgIT09IDEpIHtcbiAgICAgICAgLy8gWm9vbSBPdXRcbiAgICAgICAgem9vbS5vdXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFpvb20gSW5cbiAgICAgICAgem9vbS5pbihlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluOiBmdW5jdGlvbiBpbiQxKGUpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuXG4gICAgICB2YXIgem9vbSA9IHN3aXBlci56b29tO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuem9vbTtcbiAgICAgIHZhciBnZXN0dXJlID0gem9vbS5nZXN0dXJlO1xuICAgICAgdmFyIGltYWdlID0gem9vbS5pbWFnZTtcblxuICAgICAgaWYgKCFnZXN0dXJlLiRzbGlkZUVsKSB7XG4gICAgICAgIGdlc3R1cmUuJHNsaWRlRWwgPSBzd2lwZXIuY2xpY2tlZFNsaWRlID8gJChzd2lwZXIuY2xpY2tlZFNsaWRlKSA6IHN3aXBlci5zbGlkZXMuZXEoc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgZ2VzdHVyZS4kaW1hZ2VFbCA9IGdlc3R1cmUuJHNsaWRlRWwuZmluZCgnaW1nLCBzdmcsIGNhbnZhcycpO1xuICAgICAgICBnZXN0dXJlLiRpbWFnZVdyYXBFbCA9IGdlc3R1cmUuJGltYWdlRWwucGFyZW50KChcIi5cIiArIChwYXJhbXMuY29udGFpbmVyQ2xhc3MpKSk7XG4gICAgICB9XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAgIGdlc3R1cmUuJHNsaWRlRWwuYWRkQ2xhc3MoKFwiXCIgKyAocGFyYW1zLnpvb21lZFNsaWRlQ2xhc3MpKSk7XG5cbiAgICAgIHZhciB0b3VjaFg7XG4gICAgICB2YXIgdG91Y2hZO1xuICAgICAgdmFyIG9mZnNldFg7XG4gICAgICB2YXIgb2Zmc2V0WTtcbiAgICAgIHZhciBkaWZmWDtcbiAgICAgIHZhciBkaWZmWTtcbiAgICAgIHZhciB0cmFuc2xhdGVYO1xuICAgICAgdmFyIHRyYW5zbGF0ZVk7XG4gICAgICB2YXIgaW1hZ2VXaWR0aDtcbiAgICAgIHZhciBpbWFnZUhlaWdodDtcbiAgICAgIHZhciBzY2FsZWRXaWR0aDtcbiAgICAgIHZhciBzY2FsZWRIZWlnaHQ7XG4gICAgICB2YXIgdHJhbnNsYXRlTWluWDtcbiAgICAgIHZhciB0cmFuc2xhdGVNaW5ZO1xuICAgICAgdmFyIHRyYW5zbGF0ZU1heFg7XG4gICAgICB2YXIgdHJhbnNsYXRlTWF4WTtcbiAgICAgIHZhciBzbGlkZVdpZHRoO1xuICAgICAgdmFyIHNsaWRlSGVpZ2h0O1xuXG4gICAgICBpZiAodHlwZW9mIGltYWdlLnRvdWNoZXNTdGFydC54ID09PSAndW5kZWZpbmVkJyAmJiBlKSB7XG4gICAgICAgIHRvdWNoWCA9IGUudHlwZSA9PT0gJ3RvdWNoZW5kJyA/IGUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVggOiBlLnBhZ2VYO1xuICAgICAgICB0b3VjaFkgPSBlLnR5cGUgPT09ICd0b3VjaGVuZCcgPyBlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZIDogZS5wYWdlWTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdWNoWCA9IGltYWdlLnRvdWNoZXNTdGFydC54O1xuICAgICAgICB0b3VjaFkgPSBpbWFnZS50b3VjaGVzU3RhcnQueTtcbiAgICAgIH1cblxuICAgICAgem9vbS5zY2FsZSA9IGdlc3R1cmUuJGltYWdlV3JhcEVsLmF0dHIoJ2RhdGEtc3dpcGVyLXpvb20nKSB8fCBwYXJhbXMubWF4UmF0aW87XG4gICAgICB6b29tLmN1cnJlbnRTY2FsZSA9IGdlc3R1cmUuJGltYWdlV3JhcEVsLmF0dHIoJ2RhdGEtc3dpcGVyLXpvb20nKSB8fCBwYXJhbXMubWF4UmF0aW87XG4gICAgICBpZiAoZSkge1xuICAgICAgICBzbGlkZVdpZHRoID0gZ2VzdHVyZS4kc2xpZGVFbFswXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgc2xpZGVIZWlnaHQgPSBnZXN0dXJlLiRzbGlkZUVsWzBdLm9mZnNldEhlaWdodDtcbiAgICAgICAgb2Zmc2V0WCA9IGdlc3R1cmUuJHNsaWRlRWwub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgb2Zmc2V0WSA9IGdlc3R1cmUuJHNsaWRlRWwub2Zmc2V0KCkudG9wO1xuICAgICAgICBkaWZmWCA9IChvZmZzZXRYICsgKHNsaWRlV2lkdGggLyAyKSkgLSB0b3VjaFg7XG4gICAgICAgIGRpZmZZID0gKG9mZnNldFkgKyAoc2xpZGVIZWlnaHQgLyAyKSkgLSB0b3VjaFk7XG5cbiAgICAgICAgaW1hZ2VXaWR0aCA9IGdlc3R1cmUuJGltYWdlRWxbMF0ub2Zmc2V0V2lkdGg7XG4gICAgICAgIGltYWdlSGVpZ2h0ID0gZ2VzdHVyZS4kaW1hZ2VFbFswXS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHNjYWxlZFdpZHRoID0gaW1hZ2VXaWR0aCAqIHpvb20uc2NhbGU7XG4gICAgICAgIHNjYWxlZEhlaWdodCA9IGltYWdlSGVpZ2h0ICogem9vbS5zY2FsZTtcblxuICAgICAgICB0cmFuc2xhdGVNaW5YID0gTWF0aC5taW4oKChzbGlkZVdpZHRoIC8gMikgLSAoc2NhbGVkV2lkdGggLyAyKSksIDApO1xuICAgICAgICB0cmFuc2xhdGVNaW5ZID0gTWF0aC5taW4oKChzbGlkZUhlaWdodCAvIDIpIC0gKHNjYWxlZEhlaWdodCAvIDIpKSwgMCk7XG4gICAgICAgIHRyYW5zbGF0ZU1heFggPSAtdHJhbnNsYXRlTWluWDtcbiAgICAgICAgdHJhbnNsYXRlTWF4WSA9IC10cmFuc2xhdGVNaW5ZO1xuXG4gICAgICAgIHRyYW5zbGF0ZVggPSBkaWZmWCAqIHpvb20uc2NhbGU7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSBkaWZmWSAqIHpvb20uc2NhbGU7XG5cbiAgICAgICAgaWYgKHRyYW5zbGF0ZVggPCB0cmFuc2xhdGVNaW5YKSB7XG4gICAgICAgICAgdHJhbnNsYXRlWCA9IHRyYW5zbGF0ZU1pblg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zbGF0ZVggPiB0cmFuc2xhdGVNYXhYKSB7XG4gICAgICAgICAgdHJhbnNsYXRlWCA9IHRyYW5zbGF0ZU1heFg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhbnNsYXRlWSA8IHRyYW5zbGF0ZU1pblkpIHtcbiAgICAgICAgICB0cmFuc2xhdGVZID0gdHJhbnNsYXRlTWluWTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNsYXRlWSA+IHRyYW5zbGF0ZU1heFkpIHtcbiAgICAgICAgICB0cmFuc2xhdGVZID0gdHJhbnNsYXRlTWF4WTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNsYXRlWCA9IDA7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSAwO1xuICAgICAgfVxuICAgICAgZ2VzdHVyZS4kaW1hZ2VXcmFwRWwudHJhbnNpdGlvbigzMDApLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZChcIiArIHRyYW5zbGF0ZVggKyBcInB4LCBcIiArIHRyYW5zbGF0ZVkgKyBcInB4LDApXCIpKTtcbiAgICAgIGdlc3R1cmUuJGltYWdlRWwudHJhbnNpdGlvbigzMDApLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZCgwLDAsMCkgc2NhbGUoXCIgKyAoem9vbS5zY2FsZSkgKyBcIilcIikpO1xuICAgIH0sXG4gICAgb3V0OiBmdW5jdGlvbiBvdXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnpvb207XG4gICAgICB2YXIgZ2VzdHVyZSA9IHpvb20uZ2VzdHVyZTtcblxuICAgICAgaWYgKCFnZXN0dXJlLiRzbGlkZUVsKSB7XG4gICAgICAgIGdlc3R1cmUuJHNsaWRlRWwgPSBzd2lwZXIuY2xpY2tlZFNsaWRlID8gJChzd2lwZXIuY2xpY2tlZFNsaWRlKSA6IHN3aXBlci5zbGlkZXMuZXEoc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgZ2VzdHVyZS4kaW1hZ2VFbCA9IGdlc3R1cmUuJHNsaWRlRWwuZmluZCgnaW1nLCBzdmcsIGNhbnZhcycpO1xuICAgICAgICBnZXN0dXJlLiRpbWFnZVdyYXBFbCA9IGdlc3R1cmUuJGltYWdlRWwucGFyZW50KChcIi5cIiArIChwYXJhbXMuY29udGFpbmVyQ2xhc3MpKSk7XG4gICAgICB9XG4gICAgICBpZiAoIWdlc3R1cmUuJGltYWdlRWwgfHwgZ2VzdHVyZS4kaW1hZ2VFbC5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAgIHpvb20uc2NhbGUgPSAxO1xuICAgICAgem9vbS5jdXJyZW50U2NhbGUgPSAxO1xuICAgICAgZ2VzdHVyZS4kaW1hZ2VXcmFwRWwudHJhbnNpdGlvbigzMDApLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoMCwwLDApJyk7XG4gICAgICBnZXN0dXJlLiRpbWFnZUVsLnRyYW5zaXRpb24oMzAwKS50cmFuc2Zvcm0oJ3RyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZSgxKScpO1xuICAgICAgZ2VzdHVyZS4kc2xpZGVFbC5yZW1vdmVDbGFzcygoXCJcIiArIChwYXJhbXMuem9vbWVkU2xpZGVDbGFzcykpKTtcbiAgICAgIGdlc3R1cmUuJHNsaWRlRWwgPSB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICAvLyBBdHRhY2gvRGV0YWNoIEV2ZW50c1xuICAgIGVuYWJsZTogZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgem9vbSA9IHN3aXBlci56b29tO1xuICAgICAgaWYgKHpvb20uZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgIHpvb20uZW5hYmxlZCA9IHRydWU7XG5cbiAgICAgIHZhciBwYXNzaXZlTGlzdGVuZXIgPSBzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQgPT09ICd0b3VjaHN0YXJ0JyAmJiBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBzd2lwZXIucGFyYW1zLnBhc3NpdmVMaXN0ZW5lcnMgPyB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmU6IGZhbHNlIH0gOiBmYWxzZTtcblxuICAgICAgLy8gU2NhbGUgaW1hZ2VcbiAgICAgIGlmIChTdXBwb3J0Lmdlc3R1cmVzKSB7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9uKCdnZXN0dXJlc3RhcnQnLCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlU3RhcnQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9uKCdnZXN0dXJlY2hhbmdlJywgJy5zd2lwZXItc2xpZGUnLCB6b29tLm9uR2VzdHVyZUNoYW5nZSwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwub24oJ2dlc3R1cmVlbmQnLCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlRW5kLCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIGlmIChzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5vbihzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQsICcuc3dpcGVyLXNsaWRlJywgem9vbS5vbkdlc3R1cmVTdGFydCwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwub24oc3dpcGVyLnRvdWNoRXZlbnRzLm1vdmUsICcuc3dpcGVyLXNsaWRlJywgem9vbS5vbkdlc3R1cmVDaGFuZ2UsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9uKHN3aXBlci50b3VjaEV2ZW50cy5lbmQsICcuc3dpcGVyLXNsaWRlJywgem9vbS5vbkdlc3R1cmVFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vdmUgaW1hZ2VcbiAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9uKHN3aXBlci50b3VjaEV2ZW50cy5tb3ZlLCAoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy56b29tLmNvbnRhaW5lckNsYXNzKSksIHpvb20ub25Ub3VjaE1vdmUpO1xuICAgIH0sXG4gICAgZGlzYWJsZTogZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICAgIGlmICghem9vbS5lbmFibGVkKSB7IHJldHVybjsgfVxuXG4gICAgICBzd2lwZXIuem9vbS5lbmFibGVkID0gZmFsc2U7XG5cbiAgICAgIHZhciBwYXNzaXZlTGlzdGVuZXIgPSBzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQgPT09ICd0b3VjaHN0YXJ0JyAmJiBTdXBwb3J0LnBhc3NpdmVMaXN0ZW5lciAmJiBzd2lwZXIucGFyYW1zLnBhc3NpdmVMaXN0ZW5lcnMgPyB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmU6IGZhbHNlIH0gOiBmYWxzZTtcblxuICAgICAgLy8gU2NhbGUgaW1hZ2VcbiAgICAgIGlmIChTdXBwb3J0Lmdlc3R1cmVzKSB7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9mZignZ2VzdHVyZXN0YXJ0JywgJy5zd2lwZXItc2xpZGUnLCB6b29tLm9uR2VzdHVyZVN0YXJ0LCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5vZmYoJ2dlc3R1cmVjaGFuZ2UnLCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlQ2hhbmdlLCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5vZmYoJ2dlc3R1cmVlbmQnLCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlRW5kLCBwYXNzaXZlTGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIGlmIChzd2lwZXIudG91Y2hFdmVudHMuc3RhcnQgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbC5vZmYoc3dpcGVyLnRvdWNoRXZlbnRzLnN0YXJ0LCAnLnN3aXBlci1zbGlkZScsIHpvb20ub25HZXN0dXJlU3RhcnQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9mZihzd2lwZXIudG91Y2hFdmVudHMubW92ZSwgJy5zd2lwZXItc2xpZGUnLCB6b29tLm9uR2VzdHVyZUNoYW5nZSwgcGFzc2l2ZUxpc3RlbmVyKTtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWwub2ZmKHN3aXBlci50b3VjaEV2ZW50cy5lbmQsICcuc3dpcGVyLXNsaWRlJywgem9vbS5vbkdlc3R1cmVFbmQsIHBhc3NpdmVMaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIE1vdmUgaW1hZ2VcbiAgICAgIHN3aXBlci4kd3JhcHBlckVsLm9mZihzd2lwZXIudG91Y2hFdmVudHMubW92ZSwgKFwiLlwiICsgKHN3aXBlci5wYXJhbXMuem9vbS5jb250YWluZXJDbGFzcykpLCB6b29tLm9uVG91Y2hNb3ZlKTtcbiAgICB9LFxuICB9O1xuXG4gIHZhciBab29tJDEgPSB7XG4gICAgbmFtZTogJ3pvb20nLFxuICAgIHBhcmFtczoge1xuICAgICAgem9vbToge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbWF4UmF0aW86IDMsXG4gICAgICAgIG1pblJhdGlvOiAxLFxuICAgICAgICB0b2dnbGU6IHRydWUsXG4gICAgICAgIGNvbnRhaW5lckNsYXNzOiAnc3dpcGVyLXpvb20tY29udGFpbmVyJyxcbiAgICAgICAgem9vbWVkU2xpZGVDbGFzczogJ3N3aXBlci1zbGlkZS16b29tZWQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgem9vbSA9IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICBjdXJyZW50U2NhbGU6IDEsXG4gICAgICAgIGlzU2NhbGluZzogZmFsc2UsXG4gICAgICAgIGdlc3R1cmU6IHtcbiAgICAgICAgICAkc2xpZGVFbDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNsaWRlV2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzbGlkZUhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgICRpbWFnZUVsOiB1bmRlZmluZWQsXG4gICAgICAgICAgJGltYWdlV3JhcEVsOiB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4UmF0aW86IDMsXG4gICAgICAgIH0sXG4gICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgaXNUb3VjaGVkOiB1bmRlZmluZWQsXG4gICAgICAgICAgaXNNb3ZlZDogdW5kZWZpbmVkLFxuICAgICAgICAgIGN1cnJlbnRYOiB1bmRlZmluZWQsXG4gICAgICAgICAgY3VycmVudFk6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtaW5YOiB1bmRlZmluZWQsXG4gICAgICAgICAgbWluWTogdW5kZWZpbmVkLFxuICAgICAgICAgIG1heFg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtYXhZOiB1bmRlZmluZWQsXG4gICAgICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydFg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydFk6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0b3VjaGVzU3RhcnQ6IHt9LFxuICAgICAgICAgIHRvdWNoZXNDdXJyZW50OiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgdmVsb2NpdHk6IHtcbiAgICAgICAgICB4OiB1bmRlZmluZWQsXG4gICAgICAgICAgeTogdW5kZWZpbmVkLFxuICAgICAgICAgIHByZXZQb3NpdGlvblg6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwcmV2UG9zaXRpb25ZOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJldlRpbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgICgnb25HZXN0dXJlU3RhcnQgb25HZXN0dXJlQ2hhbmdlIG9uR2VzdHVyZUVuZCBvblRvdWNoU3RhcnQgb25Ub3VjaE1vdmUgb25Ub3VjaEVuZCBvblRyYW5zaXRpb25FbmQgdG9nZ2xlIGVuYWJsZSBkaXNhYmxlIGluIG91dCcpLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xuICAgICAgICB6b29tW21ldGhvZE5hbWVdID0gWm9vbVttZXRob2ROYW1lXS5iaW5kKHN3aXBlcik7XG4gICAgICB9KTtcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc2NhbGUgPSAxO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN3aXBlci56b29tLCAnc2NhbGUnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBzY2FsZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgICAgICBpZiAoc2NhbGUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgaW1hZ2VFbCA9IHN3aXBlci56b29tLmdlc3R1cmUuJGltYWdlRWwgPyBzd2lwZXIuem9vbS5nZXN0dXJlLiRpbWFnZUVsWzBdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIHNsaWRlRWwgPSBzd2lwZXIuem9vbS5nZXN0dXJlLiRzbGlkZUVsID8gc3dpcGVyLnpvb20uZ2VzdHVyZS4kc2xpZGVFbFswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCd6b29tQ2hhbmdlJywgdmFsdWUsIGltYWdlRWwsIHNsaWRlRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzY2FsZSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLnpvb20uZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci56b29tLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHN3aXBlci56b29tLmRpc2FibGUoKTtcbiAgICAgIH0sXG4gICAgICB0b3VjaFN0YXJ0OiBmdW5jdGlvbiB0b3VjaFN0YXJ0KGUpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnpvb20uZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLnpvb20ub25Ub3VjaFN0YXJ0KGUpO1xuICAgICAgfSxcbiAgICAgIHRvdWNoRW5kOiBmdW5jdGlvbiB0b3VjaEVuZChlKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci56b29tLmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci56b29tLm9uVG91Y2hFbmQoZSk7XG4gICAgICB9LFxuICAgICAgZG91YmxlVGFwOiBmdW5jdGlvbiBkb3VibGVUYXAoZSkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuem9vbS5lbmFibGVkICYmIHN3aXBlci56b29tLmVuYWJsZWQgJiYgc3dpcGVyLnBhcmFtcy56b29tLnRvZ2dsZSkge1xuICAgICAgICAgIHN3aXBlci56b29tLnRvZ2dsZShlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRyYW5zaXRpb25FbmQ6IGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnpvb20uZW5hYmxlZCAmJiBzd2lwZXIucGFyYW1zLnpvb20uZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci56b29tLm9uVHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIExhenkgPSB7XG4gICAgbG9hZEluU2xpZGU6IGZ1bmN0aW9uIGxvYWRJblNsaWRlKGluZGV4LCBsb2FkSW5EdXBsaWNhdGUpIHtcbiAgICAgIGlmICggbG9hZEluRHVwbGljYXRlID09PSB2b2lkIDAgKSBsb2FkSW5EdXBsaWNhdGUgPSB0cnVlO1xuXG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLmxhenk7XG4gICAgICBpZiAodHlwZW9mIGluZGV4ID09PSAndW5kZWZpbmVkJykgeyByZXR1cm47IH1cbiAgICAgIGlmIChzd2lwZXIuc2xpZGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcblxuICAgICAgdmFyICRzbGlkZUVsID0gaXNWaXJ0dWFsXG4gICAgICAgID8gc3dpcGVyLiR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHN3aXBlci5wYXJhbXMuc2xpZGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyBpbmRleCArIFwiXFxcIl1cIikpXG4gICAgICAgIDogc3dpcGVyLnNsaWRlcy5lcShpbmRleCk7XG5cbiAgICAgIHZhciAkaW1hZ2VzID0gJHNsaWRlRWwuZmluZCgoXCIuXCIgKyAocGFyYW1zLmVsZW1lbnRDbGFzcykgKyBcIjpub3QoLlwiICsgKHBhcmFtcy5sb2FkZWRDbGFzcykgKyBcIik6bm90KC5cIiArIChwYXJhbXMubG9hZGluZ0NsYXNzKSArIFwiKVwiKSk7XG4gICAgICBpZiAoJHNsaWRlRWwuaGFzQ2xhc3MocGFyYW1zLmVsZW1lbnRDbGFzcykgJiYgISRzbGlkZUVsLmhhc0NsYXNzKHBhcmFtcy5sb2FkZWRDbGFzcykgJiYgISRzbGlkZUVsLmhhc0NsYXNzKHBhcmFtcy5sb2FkaW5nQ2xhc3MpKSB7XG4gICAgICAgICRpbWFnZXMgPSAkaW1hZ2VzLmFkZCgkc2xpZGVFbFswXSk7XG4gICAgICB9XG4gICAgICBpZiAoJGltYWdlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAgICRpbWFnZXMuZWFjaChmdW5jdGlvbiAoaW1hZ2VJbmRleCwgaW1hZ2VFbCkge1xuICAgICAgICB2YXIgJGltYWdlRWwgPSAkKGltYWdlRWwpO1xuICAgICAgICAkaW1hZ2VFbC5hZGRDbGFzcyhwYXJhbXMubG9hZGluZ0NsYXNzKTtcblxuICAgICAgICB2YXIgYmFja2dyb3VuZCA9ICRpbWFnZUVsLmF0dHIoJ2RhdGEtYmFja2dyb3VuZCcpO1xuICAgICAgICB2YXIgc3JjID0gJGltYWdlRWwuYXR0cignZGF0YS1zcmMnKTtcbiAgICAgICAgdmFyIHNyY3NldCA9ICRpbWFnZUVsLmF0dHIoJ2RhdGEtc3Jjc2V0Jyk7XG4gICAgICAgIHZhciBzaXplcyA9ICRpbWFnZUVsLmF0dHIoJ2RhdGEtc2l6ZXMnKTtcblxuICAgICAgICBzd2lwZXIubG9hZEltYWdlKCRpbWFnZUVsWzBdLCAoc3JjIHx8IGJhY2tncm91bmQpLCBzcmNzZXQsIHNpemVzLCBmYWxzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3dpcGVyID09PSAndW5kZWZpbmVkJyB8fCBzd2lwZXIgPT09IG51bGwgfHwgIXN3aXBlciB8fCAoc3dpcGVyICYmICFzd2lwZXIucGFyYW1zKSB8fCBzd2lwZXIuZGVzdHJveWVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIGlmIChiYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAkaW1hZ2VFbC5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCAoXCJ1cmwoXFxcIlwiICsgYmFja2dyb3VuZCArIFwiXFxcIilcIikpO1xuICAgICAgICAgICAgJGltYWdlRWwucmVtb3ZlQXR0cignZGF0YS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzcmNzZXQpIHtcbiAgICAgICAgICAgICAgJGltYWdlRWwuYXR0cignc3Jjc2V0Jywgc3Jjc2V0KTtcbiAgICAgICAgICAgICAgJGltYWdlRWwucmVtb3ZlQXR0cignZGF0YS1zcmNzZXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaXplcykge1xuICAgICAgICAgICAgICAkaW1hZ2VFbC5hdHRyKCdzaXplcycsIHNpemVzKTtcbiAgICAgICAgICAgICAgJGltYWdlRWwucmVtb3ZlQXR0cignZGF0YS1zaXplcycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgICAgICAkaW1hZ2VFbC5hdHRyKCdzcmMnLCBzcmMpO1xuICAgICAgICAgICAgICAkaW1hZ2VFbC5yZW1vdmVBdHRyKCdkYXRhLXNyYycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgICRpbWFnZUVsLmFkZENsYXNzKHBhcmFtcy5sb2FkZWRDbGFzcykucmVtb3ZlQ2xhc3MocGFyYW1zLmxvYWRpbmdDbGFzcyk7XG4gICAgICAgICAgJHNsaWRlRWwuZmluZCgoXCIuXCIgKyAocGFyYW1zLnByZWxvYWRlckNsYXNzKSkpLnJlbW92ZSgpO1xuICAgICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3AgJiYgbG9hZEluRHVwbGljYXRlKSB7XG4gICAgICAgICAgICB2YXIgc2xpZGVPcmlnaW5hbEluZGV4ID0gJHNsaWRlRWwuYXR0cignZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKTtcbiAgICAgICAgICAgIGlmICgkc2xpZGVFbC5oYXNDbGFzcyhzd2lwZXIucGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKSB7XG4gICAgICAgICAgICAgIHZhciBvcmlnaW5hbFNsaWRlID0gc3dpcGVyLiR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIHNsaWRlT3JpZ2luYWxJbmRleCArIFwiXFxcIl06bm90KC5cIiArIChzd2lwZXIucGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgc3dpcGVyLmxhenkubG9hZEluU2xpZGUob3JpZ2luYWxTbGlkZS5pbmRleCgpLCBmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlZFNsaWRlID0gc3dpcGVyLiR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHN3aXBlci5wYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykgKyBcIltkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cXFwiXCIgKyBzbGlkZU9yaWdpbmFsSW5kZXggKyBcIlxcXCJdXCIpKTtcbiAgICAgICAgICAgICAgc3dpcGVyLmxhenkubG9hZEluU2xpZGUoZHVwbGljYXRlZFNsaWRlLmluZGV4KCksIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpcGVyLmVtaXQoJ2xhenlJbWFnZVJlYWR5JywgJHNsaWRlRWxbMF0sICRpbWFnZUVsWzBdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3dpcGVyLmVtaXQoJ2xhenlJbWFnZUxvYWQnLCAkc2xpZGVFbFswXSwgJGltYWdlRWxbMF0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBsb2FkOiBmdW5jdGlvbiBsb2FkKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgICAgdmFyIHN3aXBlclBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gICAgICB2YXIgc2xpZGVzID0gc3dpcGVyLnNsaWRlcztcbiAgICAgIHZhciBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICAgIHZhciBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBzd2lwZXJQYXJhbXMudmlydHVhbC5lbmFibGVkO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlclBhcmFtcy5sYXp5O1xuXG4gICAgICB2YXIgc2xpZGVzUGVyVmlldyA9IHN3aXBlclBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgICAgaWYgKHNsaWRlc1BlclZpZXcgPT09ICdhdXRvJykge1xuICAgICAgICBzbGlkZXNQZXJWaWV3ID0gMDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2xpZGVFeGlzdChpbmRleCkge1xuICAgICAgICBpZiAoaXNWaXJ0dWFsKSB7XG4gICAgICAgICAgaWYgKCR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHN3aXBlclBhcmFtcy5zbGlkZUNsYXNzKSArIFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIGluZGV4ICsgXCJcXFwiXVwiKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2xpZGVzW2luZGV4XSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBzbGlkZUluZGV4KHNsaWRlRWwpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbCkge1xuICAgICAgICAgIHJldHVybiAkKHNsaWRlRWwpLmF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQoc2xpZGVFbCkuaW5kZXgoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzd2lwZXIubGF6eS5pbml0aWFsSW1hZ2VMb2FkZWQpIHsgc3dpcGVyLmxhenkuaW5pdGlhbEltYWdlTG9hZGVkID0gdHJ1ZTsgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hTbGlkZXNWaXNpYmlsaXR5KSB7XG4gICAgICAgICR3cmFwcGVyRWwuY2hpbGRyZW4oKFwiLlwiICsgKHN3aXBlclBhcmFtcy5zbGlkZVZpc2libGVDbGFzcykpKS5lYWNoKGZ1bmN0aW9uIChlbEluZGV4LCBzbGlkZUVsKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gaXNWaXJ0dWFsID8gJChzbGlkZUVsKS5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpIDogJChzbGlkZUVsKS5pbmRleCgpO1xuICAgICAgICAgIHN3aXBlci5sYXp5LmxvYWRJblNsaWRlKGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHNsaWRlc1BlclZpZXcgPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBhY3RpdmVJbmRleDsgaSA8IGFjdGl2ZUluZGV4ICsgc2xpZGVzUGVyVmlldzsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlRXhpc3QoaSkpIHsgc3dpcGVyLmxhenkubG9hZEluU2xpZGUoaSk7IH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLmxhenkubG9hZEluU2xpZGUoYWN0aXZlSW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5sb2FkUHJldk5leHQpIHtcbiAgICAgICAgaWYgKHNsaWRlc1BlclZpZXcgPiAxIHx8IChwYXJhbXMubG9hZFByZXZOZXh0QW1vdW50ICYmIHBhcmFtcy5sb2FkUHJldk5leHRBbW91bnQgPiAxKSkge1xuICAgICAgICAgIHZhciBhbW91bnQgPSBwYXJhbXMubG9hZFByZXZOZXh0QW1vdW50O1xuICAgICAgICAgIHZhciBzcHYgPSBzbGlkZXNQZXJWaWV3O1xuICAgICAgICAgIHZhciBtYXhJbmRleCA9IE1hdGgubWluKGFjdGl2ZUluZGV4ICsgc3B2ICsgTWF0aC5tYXgoYW1vdW50LCBzcHYpLCBzbGlkZXMubGVuZ3RoKTtcbiAgICAgICAgICB2YXIgbWluSW5kZXggPSBNYXRoLm1heChhY3RpdmVJbmRleCAtIE1hdGgubWF4KHNwdiwgYW1vdW50KSwgMCk7XG4gICAgICAgICAgLy8gTmV4dCBTbGlkZXNcbiAgICAgICAgICBmb3IgKHZhciBpJDEgPSBhY3RpdmVJbmRleCArIHNsaWRlc1BlclZpZXc7IGkkMSA8IG1heEluZGV4OyBpJDEgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHNsaWRlRXhpc3QoaSQxKSkgeyBzd2lwZXIubGF6eS5sb2FkSW5TbGlkZShpJDEpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFByZXYgU2xpZGVzXG4gICAgICAgICAgZm9yICh2YXIgaSQyID0gbWluSW5kZXg7IGkkMiA8IGFjdGl2ZUluZGV4OyBpJDIgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHNsaWRlRXhpc3QoaSQyKSkgeyBzd2lwZXIubGF6eS5sb2FkSW5TbGlkZShpJDIpOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBuZXh0U2xpZGUgPSAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChzd2lwZXJQYXJhbXMuc2xpZGVOZXh0Q2xhc3MpKSk7XG4gICAgICAgICAgaWYgKG5leHRTbGlkZS5sZW5ndGggPiAwKSB7IHN3aXBlci5sYXp5LmxvYWRJblNsaWRlKHNsaWRlSW5kZXgobmV4dFNsaWRlKSk7IH1cblxuICAgICAgICAgIHZhciBwcmV2U2xpZGUgPSAkd3JhcHBlckVsLmNoaWxkcmVuKChcIi5cIiArIChzd2lwZXJQYXJhbXMuc2xpZGVQcmV2Q2xhc3MpKSk7XG4gICAgICAgICAgaWYgKHByZXZTbGlkZS5sZW5ndGggPiAwKSB7IHN3aXBlci5sYXp5LmxvYWRJblNsaWRlKHNsaWRlSW5kZXgocHJldlNsaWRlKSk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgdmFyIExhenkkMSA9IHtcbiAgICBuYW1lOiAnbGF6eScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBsYXp5OiB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBsb2FkUHJldk5leHQ6IGZhbHNlLFxuICAgICAgICBsb2FkUHJldk5leHRBbW91bnQ6IDEsXG4gICAgICAgIGxvYWRPblRyYW5zaXRpb25TdGFydDogZmFsc2UsXG5cbiAgICAgICAgZWxlbWVudENsYXNzOiAnc3dpcGVyLWxhenknLFxuICAgICAgICBsb2FkaW5nQ2xhc3M6ICdzd2lwZXItbGF6eS1sb2FkaW5nJyxcbiAgICAgICAgbG9hZGVkQ2xhc3M6ICdzd2lwZXItbGF6eS1sb2FkZWQnLFxuICAgICAgICBwcmVsb2FkZXJDbGFzczogJ3N3aXBlci1sYXp5LXByZWxvYWRlcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgbGF6eToge1xuICAgICAgICAgIGluaXRpYWxJbWFnZUxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgbG9hZDogTGF6eS5sb2FkLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBsb2FkSW5TbGlkZTogTGF6eS5sb2FkSW5TbGlkZS5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBiZWZvcmVJbml0OiBmdW5jdGlvbiBiZWZvcmVJbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkICYmIHN3aXBlci5wYXJhbXMucHJlbG9hZEltYWdlcykge1xuICAgICAgICAgIHN3aXBlci5wYXJhbXMucHJlbG9hZEltYWdlcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxhenkuZW5hYmxlZCAmJiAhc3dpcGVyLnBhcmFtcy5sb29wICYmIHN3aXBlci5wYXJhbXMuaW5pdGlhbFNsaWRlID09PSAwKSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2Nyb2xsOiBmdW5jdGlvbiBzY3JvbGwoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5mcmVlTW9kZSAmJiAhc3dpcGVyLnBhcmFtcy5mcmVlTW9kZVN0aWNreSkge1xuICAgICAgICAgIHN3aXBlci5sYXp5LmxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkKSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2Nyb2xsYmFyRHJhZ01vdmU6IGZ1bmN0aW9uIHNjcm9sbGJhckRyYWdNb3ZlKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkKSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJhbnNpdGlvblN0YXJ0OiBmdW5jdGlvbiB0cmFuc2l0aW9uU3RhcnQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sYXp5LmVuYWJsZWQpIHtcbiAgICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sYXp5LmxvYWRPblRyYW5zaXRpb25TdGFydCB8fCAoIXN3aXBlci5wYXJhbXMubGF6eS5sb2FkT25UcmFuc2l0aW9uU3RhcnQgJiYgIXN3aXBlci5sYXp5LmluaXRpYWxJbWFnZUxvYWRlZCkpIHtcbiAgICAgICAgICAgIHN3aXBlci5sYXp5LmxvYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0cmFuc2l0aW9uRW5kOiBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMubGF6eS5lbmFibGVkICYmICFzd2lwZXIucGFyYW1zLmxhenkubG9hZE9uVHJhbnNpdGlvblN0YXJ0KSB7XG4gICAgICAgICAgc3dpcGVyLmxhenkubG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcImVycm9yXCIsIHsgXCJhbGxvd1wiOiBbXCI+PlwiXSB9XSAqL1xuXG4gIHZhciBDb250cm9sbGVyID0ge1xuICAgIExpbmVhclNwbGluZTogZnVuY3Rpb24gTGluZWFyU3BsaW5lKHgsIHkpIHtcbiAgICAgIHZhciBiaW5hcnlTZWFyY2ggPSAoZnVuY3Rpb24gc2VhcmNoKCkge1xuICAgICAgICB2YXIgbWF4SW5kZXg7XG4gICAgICAgIHZhciBtaW5JbmRleDtcbiAgICAgICAgdmFyIGd1ZXNzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFycmF5LCB2YWwpIHtcbiAgICAgICAgICBtaW5JbmRleCA9IC0xO1xuICAgICAgICAgIG1heEluZGV4ID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChtYXhJbmRleCAtIG1pbkluZGV4ID4gMSkge1xuICAgICAgICAgICAgZ3Vlc3MgPSBtYXhJbmRleCArIG1pbkluZGV4ID4+IDE7XG4gICAgICAgICAgICBpZiAoYXJyYXlbZ3Vlc3NdIDw9IHZhbCkge1xuICAgICAgICAgICAgICBtaW5JbmRleCA9IGd1ZXNzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWF4SW5kZXggPSBndWVzcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1heEluZGV4O1xuICAgICAgICB9O1xuICAgICAgfSgpKTtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgICAgdGhpcy5sYXN0SW5kZXggPSB4Lmxlbmd0aCAtIDE7XG4gICAgICAvLyBHaXZlbiBhbiB4IHZhbHVlICh4MiksIHJldHVybiB0aGUgZXhwZWN0ZWQgeTIgdmFsdWU6XG4gICAgICAvLyAoeDEseTEpIGlzIHRoZSBrbm93biBwb2ludCBiZWZvcmUgZ2l2ZW4gdmFsdWUsXG4gICAgICAvLyAoeDMseTMpIGlzIHRoZSBrbm93biBwb2ludCBhZnRlciBnaXZlbiB2YWx1ZS5cbiAgICAgIHZhciBpMTtcbiAgICAgIHZhciBpMztcblxuICAgICAgdGhpcy5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uIGludGVycG9sYXRlKHgyKSB7XG4gICAgICAgIGlmICgheDIpIHsgcmV0dXJuIDA7IH1cblxuICAgICAgICAvLyBHZXQgdGhlIGluZGV4ZXMgb2YgeDEgYW5kIHgzICh0aGUgYXJyYXkgaW5kZXhlcyBiZWZvcmUgYW5kIGFmdGVyIGdpdmVuIHgyKTpcbiAgICAgICAgaTMgPSBiaW5hcnlTZWFyY2godGhpcy54LCB4Mik7XG4gICAgICAgIGkxID0gaTMgLSAxO1xuXG4gICAgICAgIC8vIFdlIGhhdmUgb3VyIGluZGV4ZXMgaTEgJiBpMywgc28gd2UgY2FuIGNhbGN1bGF0ZSBhbHJlYWR5OlxuICAgICAgICAvLyB5MiA6PSAoKHgy4oiSeDEpIMOXICh5M+KIknkxKSkgw7cgKHgz4oiSeDEpICsgeTFcbiAgICAgICAgcmV0dXJuICgoKHgyIC0gdGhpcy54W2kxXSkgKiAodGhpcy55W2kzXSAtIHRoaXMueVtpMV0pKSAvICh0aGlzLnhbaTNdIC0gdGhpcy54W2kxXSkpICsgdGhpcy55W2kxXTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8vIHh4eDogZm9yIG5vdyBpIHdpbGwganVzdCBzYXZlIG9uZSBzcGxpbmUgZnVuY3Rpb24gdG8gdG9cbiAgICBnZXRJbnRlcnBvbGF0ZUZ1bmN0aW9uOiBmdW5jdGlvbiBnZXRJbnRlcnBvbGF0ZUZ1bmN0aW9uKGMpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIuY29udHJvbGxlci5zcGxpbmUpIHtcbiAgICAgICAgc3dpcGVyLmNvbnRyb2xsZXIuc3BsaW5lID0gc3dpcGVyLnBhcmFtcy5sb29wXG4gICAgICAgICAgPyBuZXcgQ29udHJvbGxlci5MaW5lYXJTcGxpbmUoc3dpcGVyLnNsaWRlc0dyaWQsIGMuc2xpZGVzR3JpZClcbiAgICAgICAgICA6IG5ldyBDb250cm9sbGVyLkxpbmVhclNwbGluZShzd2lwZXIuc25hcEdyaWQsIGMuc25hcEdyaWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoc2V0VHJhbnNsYXRlJDEsIGJ5Q29udHJvbGxlcikge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgY29udHJvbGxlZCA9IHN3aXBlci5jb250cm9sbGVyLmNvbnRyb2w7XG4gICAgICB2YXIgbXVsdGlwbGllcjtcbiAgICAgIHZhciBjb250cm9sbGVkVHJhbnNsYXRlO1xuICAgICAgZnVuY3Rpb24gc2V0Q29udHJvbGxlZFRyYW5zbGF0ZShjKSB7XG4gICAgICAgIC8vIHRoaXMgd2lsbCBjcmVhdGUgYW4gSW50ZXJwb2xhdGUgZnVuY3Rpb24gYmFzZWQgb24gdGhlIHNuYXBHcmlkc1xuICAgICAgICAvLyB4IGlzIHRoZSBHcmlkIG9mIHRoZSBzY3JvbGxlZCBzY3JvbGxlciBhbmQgeSB3aWxsIGJlIHRoZSBjb250cm9sbGVkIHNjcm9sbGVyXG4gICAgICAgIC8vIGl0IG1ha2VzIHNlbnNlIHRvIGNyZWF0ZSB0aGlzIG9ubHkgb25jZSBhbmQgcmVjYWxsIGl0IGZvciB0aGUgaW50ZXJwb2xhdGlvblxuICAgICAgICAvLyB0aGUgZnVuY3Rpb24gZG9lcyBhIGxvdCBvZiB2YWx1ZSBjYWNoaW5nIGZvciBwZXJmb3JtYW5jZVxuICAgICAgICB2YXIgdHJhbnNsYXRlID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZSA/IC1zd2lwZXIudHJhbnNsYXRlIDogc3dpcGVyLnRyYW5zbGF0ZTtcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuY29udHJvbGxlci5ieSA9PT0gJ3NsaWRlJykge1xuICAgICAgICAgIHN3aXBlci5jb250cm9sbGVyLmdldEludGVycG9sYXRlRnVuY3Rpb24oYyk7XG4gICAgICAgICAgLy8gaSBhbSBub3Qgc3VyZSB3aHkgdGhlIHZhbHVlcyBoYXZlIHRvIGJlIG11bHRpcGxpY2F0ZWQgdGhpcyB3YXksIHRyaWVkIHRvIGludmVydCB0aGUgc25hcEdyaWRcbiAgICAgICAgICAvLyBidXQgaXQgZGlkIG5vdCB3b3JrIG91dFxuICAgICAgICAgIGNvbnRyb2xsZWRUcmFuc2xhdGUgPSAtc3dpcGVyLmNvbnRyb2xsZXIuc3BsaW5lLmludGVycG9sYXRlKC10cmFuc2xhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250cm9sbGVkVHJhbnNsYXRlIHx8IHN3aXBlci5wYXJhbXMuY29udHJvbGxlci5ieSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgICAgICBtdWx0aXBsaWVyID0gKGMubWF4VHJhbnNsYXRlKCkgLSBjLm1pblRyYW5zbGF0ZSgpKSAvIChzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBzd2lwZXIubWluVHJhbnNsYXRlKCkpO1xuICAgICAgICAgIGNvbnRyb2xsZWRUcmFuc2xhdGUgPSAoKHRyYW5zbGF0ZSAtIHN3aXBlci5taW5UcmFuc2xhdGUoKSkgKiBtdWx0aXBsaWVyKSArIGMubWluVHJhbnNsYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5jb250cm9sbGVyLmludmVyc2UpIHtcbiAgICAgICAgICBjb250cm9sbGVkVHJhbnNsYXRlID0gYy5tYXhUcmFuc2xhdGUoKSAtIGNvbnRyb2xsZWRUcmFuc2xhdGU7XG4gICAgICAgIH1cbiAgICAgICAgYy51cGRhdGVQcm9ncmVzcyhjb250cm9sbGVkVHJhbnNsYXRlKTtcbiAgICAgICAgYy5zZXRUcmFuc2xhdGUoY29udHJvbGxlZFRyYW5zbGF0ZSwgc3dpcGVyKTtcbiAgICAgICAgYy51cGRhdGVBY3RpdmVJbmRleCgpO1xuICAgICAgICBjLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xsZWQpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udHJvbGxlZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChjb250cm9sbGVkW2ldICE9PSBieUNvbnRyb2xsZXIgJiYgY29udHJvbGxlZFtpXSBpbnN0YW5jZW9mIFN3aXBlcikge1xuICAgICAgICAgICAgc2V0Q29udHJvbGxlZFRyYW5zbGF0ZShjb250cm9sbGVkW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbGxlZCBpbnN0YW5jZW9mIFN3aXBlciAmJiBieUNvbnRyb2xsZXIgIT09IGNvbnRyb2xsZWQpIHtcbiAgICAgICAgc2V0Q29udHJvbGxlZFRyYW5zbGF0ZShjb250cm9sbGVkKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24sIGJ5Q29udHJvbGxlcikge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgY29udHJvbGxlZCA9IHN3aXBlci5jb250cm9sbGVyLmNvbnRyb2w7XG4gICAgICB2YXIgaTtcbiAgICAgIGZ1bmN0aW9uIHNldENvbnRyb2xsZWRUcmFuc2l0aW9uKGMpIHtcbiAgICAgICAgYy5zZXRUcmFuc2l0aW9uKGR1cmF0aW9uLCBzd2lwZXIpO1xuICAgICAgICBpZiAoZHVyYXRpb24gIT09IDApIHtcbiAgICAgICAgICBjLnRyYW5zaXRpb25TdGFydCgpO1xuICAgICAgICAgIGlmIChjLnBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICBVdGlscy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGMudXBkYXRlQXV0b0hlaWdodCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGMuJHdyYXBwZXJFbC50cmFuc2l0aW9uRW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghY29udHJvbGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmIChjLnBhcmFtcy5sb29wICYmIHN3aXBlci5wYXJhbXMuY29udHJvbGxlci5ieSA9PT0gJ3NsaWRlJykge1xuICAgICAgICAgICAgICBjLmxvb3BGaXgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGMudHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250cm9sbGVkKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udHJvbGxlZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChjb250cm9sbGVkW2ldICE9PSBieUNvbnRyb2xsZXIgJiYgY29udHJvbGxlZFtpXSBpbnN0YW5jZW9mIFN3aXBlcikge1xuICAgICAgICAgICAgc2V0Q29udHJvbGxlZFRyYW5zaXRpb24oY29udHJvbGxlZFtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZWQgaW5zdGFuY2VvZiBTd2lwZXIgJiYgYnlDb250cm9sbGVyICE9PSBjb250cm9sbGVkKSB7XG4gICAgICAgIHNldENvbnRyb2xsZWRUcmFuc2l0aW9uKGNvbnRyb2xsZWQpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG4gIHZhciBDb250cm9sbGVyJDEgPSB7XG4gICAgbmFtZTogJ2NvbnRyb2xsZXInLFxuICAgIHBhcmFtczoge1xuICAgICAgY29udHJvbGxlcjoge1xuICAgICAgICBjb250cm9sOiB1bmRlZmluZWQsXG4gICAgICAgIGludmVyc2U6IGZhbHNlLFxuICAgICAgICBieTogJ3NsaWRlJywgLy8gb3IgJ2NvbnRhaW5lcidcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBjb250cm9sbGVyOiB7XG4gICAgICAgICAgY29udHJvbDogc3dpcGVyLnBhcmFtcy5jb250cm9sbGVyLmNvbnRyb2wsXG4gICAgICAgICAgZ2V0SW50ZXJwb2xhdGVGdW5jdGlvbjogQ29udHJvbGxlci5nZXRJbnRlcnBvbGF0ZUZ1bmN0aW9uLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IENvbnRyb2xsZXIuc2V0VHJhbnNsYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uOiBDb250cm9sbGVyLnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmIChzd2lwZXIuY29udHJvbGxlci5zcGxpbmUpIHtcbiAgICAgICAgICBzd2lwZXIuY29udHJvbGxlci5zcGxpbmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIHN3aXBlci5jb250cm9sbGVyLnNwbGluZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIuY29udHJvbGxlci5jb250cm9sKSB7IHJldHVybjsgfVxuICAgICAgICBpZiAoc3dpcGVyLmNvbnRyb2xsZXIuc3BsaW5lKSB7XG4gICAgICAgICAgc3dpcGVyLmNvbnRyb2xsZXIuc3BsaW5lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBzd2lwZXIuY29udHJvbGxlci5zcGxpbmU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvYnNlcnZlclVwZGF0ZTogZnVuY3Rpb24gb2JzZXJ2ZXJVcGRhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmIChzd2lwZXIuY29udHJvbGxlci5zcGxpbmUpIHtcbiAgICAgICAgICBzd2lwZXIuY29udHJvbGxlci5zcGxpbmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIHN3aXBlci5jb250cm9sbGVyLnNwbGluZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gc2V0VHJhbnNsYXRlKHRyYW5zbGF0ZSwgYnlDb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5jb250cm9sbGVyLnNldFRyYW5zbGF0ZSh0cmFuc2xhdGUsIGJ5Q29udHJvbGxlcik7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbiwgYnlDb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5jb250cm9sbGVyLnNldFRyYW5zaXRpb24oZHVyYXRpb24sIGJ5Q29udHJvbGxlcik7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIGExMXkgPSB7XG4gICAgbWFrZUVsRm9jdXNhYmxlOiBmdW5jdGlvbiBtYWtlRWxGb2N1c2FibGUoJGVsKSB7XG4gICAgICAkZWwuYXR0cigndGFiSW5kZXgnLCAnMCcpO1xuICAgICAgcmV0dXJuICRlbDtcbiAgICB9LFxuICAgIGFkZEVsUm9sZTogZnVuY3Rpb24gYWRkRWxSb2xlKCRlbCwgcm9sZSkge1xuICAgICAgJGVsLmF0dHIoJ3JvbGUnLCByb2xlKTtcbiAgICAgIHJldHVybiAkZWw7XG4gICAgfSxcbiAgICBhZGRFbExhYmVsOiBmdW5jdGlvbiBhZGRFbExhYmVsKCRlbCwgbGFiZWwpIHtcbiAgICAgICRlbC5hdHRyKCdhcmlhLWxhYmVsJywgbGFiZWwpO1xuICAgICAgcmV0dXJuICRlbDtcbiAgICB9LFxuICAgIGRpc2FibGVFbDogZnVuY3Rpb24gZGlzYWJsZUVsKCRlbCkge1xuICAgICAgJGVsLmF0dHIoJ2FyaWEtZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgIHJldHVybiAkZWw7XG4gICAgfSxcbiAgICBlbmFibGVFbDogZnVuY3Rpb24gZW5hYmxlRWwoJGVsKSB7XG4gICAgICAkZWwuYXR0cignYXJpYS1kaXNhYmxlZCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiAkZWw7XG4gICAgfSxcbiAgICBvbkVudGVyS2V5OiBmdW5jdGlvbiBvbkVudGVyS2V5KGUpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuYTExeTtcbiAgICAgIGlmIChlLmtleUNvZGUgIT09IDEzKSB7IHJldHVybjsgfVxuICAgICAgdmFyICR0YXJnZXRFbCA9ICQoZS50YXJnZXQpO1xuICAgICAgaWYgKHN3aXBlci5uYXZpZ2F0aW9uICYmIHN3aXBlci5uYXZpZ2F0aW9uLiRuZXh0RWwgJiYgJHRhcmdldEVsLmlzKHN3aXBlci5uYXZpZ2F0aW9uLiRuZXh0RWwpKSB7XG4gICAgICAgIGlmICghKHN3aXBlci5pc0VuZCAmJiAhc3dpcGVyLnBhcmFtcy5sb29wKSkge1xuICAgICAgICAgIHN3aXBlci5zbGlkZU5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dpcGVyLmlzRW5kKSB7XG4gICAgICAgICAgc3dpcGVyLmExMXkubm90aWZ5KHBhcmFtcy5sYXN0U2xpZGVNZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5ub3RpZnkocGFyYW1zLm5leHRTbGlkZU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLm5hdmlnYXRpb24gJiYgc3dpcGVyLm5hdmlnYXRpb24uJHByZXZFbCAmJiAkdGFyZ2V0RWwuaXMoc3dpcGVyLm5hdmlnYXRpb24uJHByZXZFbCkpIHtcbiAgICAgICAgaWYgKCEoc3dpcGVyLmlzQmVnaW5uaW5nICYmICFzd2lwZXIucGFyYW1zLmxvb3ApKSB7XG4gICAgICAgICAgc3dpcGVyLnNsaWRlUHJldigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzd2lwZXIuaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5ub3RpZnkocGFyYW1zLmZpcnN0U2xpZGVNZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5ub3RpZnkocGFyYW1zLnByZXZTbGlkZU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLnBhZ2luYXRpb24gJiYgJHRhcmdldEVsLmlzKChcIi5cIiArIChzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uYnVsbGV0Q2xhc3MpKSkpIHtcbiAgICAgICAgJHRhcmdldEVsWzBdLmNsaWNrKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeShtZXNzYWdlKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBub3RpZmljYXRpb24gPSBzd2lwZXIuYTExeS5saXZlUmVnaW9uO1xuICAgICAgaWYgKG5vdGlmaWNhdGlvbi5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgICBub3RpZmljYXRpb24uaHRtbCgnJyk7XG4gICAgICBub3RpZmljYXRpb24uaHRtbChtZXNzYWdlKTtcbiAgICB9LFxuICAgIHVwZGF0ZU5hdmlnYXRpb246IGZ1bmN0aW9uIHVwZGF0ZU5hdmlnYXRpb24oKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkgeyByZXR1cm47IH1cbiAgICAgIHZhciByZWYgPSBzd2lwZXIubmF2aWdhdGlvbjtcbiAgICAgIHZhciAkbmV4dEVsID0gcmVmLiRuZXh0RWw7XG4gICAgICB2YXIgJHByZXZFbCA9IHJlZi4kcHJldkVsO1xuXG4gICAgICBpZiAoJHByZXZFbCAmJiAkcHJldkVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHN3aXBlci5pc0JlZ2lubmluZykge1xuICAgICAgICAgIHN3aXBlci5hMTF5LmRpc2FibGVFbCgkcHJldkVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5lbmFibGVFbCgkcHJldkVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCRuZXh0RWwgJiYgJG5leHRFbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChzd2lwZXIuaXNFbmQpIHtcbiAgICAgICAgICBzd2lwZXIuYTExeS5kaXNhYmxlRWwoJG5leHRFbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpcGVyLmExMXkuZW5hYmxlRWwoJG5leHRFbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZVBhZ2luYXRpb246IGZ1bmN0aW9uIHVwZGF0ZVBhZ2luYXRpb24oKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLmExMXk7XG4gICAgICBpZiAoc3dpcGVyLnBhZ2luYXRpb24gJiYgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmNsaWNrYWJsZSAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzICYmIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMubGVuZ3RoKSB7XG4gICAgICAgIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMuZWFjaChmdW5jdGlvbiAoYnVsbGV0SW5kZXgsIGJ1bGxldEVsKSB7XG4gICAgICAgICAgdmFyICRidWxsZXRFbCA9ICQoYnVsbGV0RWwpO1xuICAgICAgICAgIHN3aXBlci5hMTF5Lm1ha2VFbEZvY3VzYWJsZSgkYnVsbGV0RWwpO1xuICAgICAgICAgIHN3aXBlci5hMTF5LmFkZEVsUm9sZSgkYnVsbGV0RWwsICdidXR0b24nKTtcbiAgICAgICAgICBzd2lwZXIuYTExeS5hZGRFbExhYmVsKCRidWxsZXRFbCwgcGFyYW1zLnBhZ2luYXRpb25CdWxsZXRNZXNzYWdlLnJlcGxhY2UoL3t7aW5kZXh9fS8sICRidWxsZXRFbC5pbmRleCgpICsgMSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcblxuICAgICAgc3dpcGVyLiRlbC5hcHBlbmQoc3dpcGVyLmExMXkubGl2ZVJlZ2lvbik7XG5cbiAgICAgIC8vIE5hdmlnYXRpb25cbiAgICAgIHZhciBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLmExMXk7XG4gICAgICB2YXIgJG5leHRFbDtcbiAgICAgIHZhciAkcHJldkVsO1xuICAgICAgaWYgKHN3aXBlci5uYXZpZ2F0aW9uICYmIHN3aXBlci5uYXZpZ2F0aW9uLiRuZXh0RWwpIHtcbiAgICAgICAgJG5leHRFbCA9IHN3aXBlci5uYXZpZ2F0aW9uLiRuZXh0RWw7XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLm5hdmlnYXRpb24gJiYgc3dpcGVyLm5hdmlnYXRpb24uJHByZXZFbCkge1xuICAgICAgICAkcHJldkVsID0gc3dpcGVyLm5hdmlnYXRpb24uJHByZXZFbDtcbiAgICAgIH1cbiAgICAgIGlmICgkbmV4dEVsKSB7XG4gICAgICAgIHN3aXBlci5hMTF5Lm1ha2VFbEZvY3VzYWJsZSgkbmV4dEVsKTtcbiAgICAgICAgc3dpcGVyLmExMXkuYWRkRWxSb2xlKCRuZXh0RWwsICdidXR0b24nKTtcbiAgICAgICAgc3dpcGVyLmExMXkuYWRkRWxMYWJlbCgkbmV4dEVsLCBwYXJhbXMubmV4dFNsaWRlTWVzc2FnZSk7XG4gICAgICAgICRuZXh0RWwub24oJ2tleWRvd24nLCBzd2lwZXIuYTExeS5vbkVudGVyS2V5KTtcbiAgICAgIH1cbiAgICAgIGlmICgkcHJldkVsKSB7XG4gICAgICAgIHN3aXBlci5hMTF5Lm1ha2VFbEZvY3VzYWJsZSgkcHJldkVsKTtcbiAgICAgICAgc3dpcGVyLmExMXkuYWRkRWxSb2xlKCRwcmV2RWwsICdidXR0b24nKTtcbiAgICAgICAgc3dpcGVyLmExMXkuYWRkRWxMYWJlbCgkcHJldkVsLCBwYXJhbXMucHJldlNsaWRlTWVzc2FnZSk7XG4gICAgICAgICRwcmV2RWwub24oJ2tleWRvd24nLCBzd2lwZXIuYTExeS5vbkVudGVyS2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFnaW5hdGlvblxuICAgICAgaWYgKHN3aXBlci5wYWdpbmF0aW9uICYmIHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5jbGlja2FibGUgJiYgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cyAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzLmxlbmd0aCkge1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi4kZWwub24oJ2tleWRvd24nLCAoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmJ1bGxldENsYXNzKSksIHN3aXBlci5hMTF5Lm9uRW50ZXJLZXkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHN3aXBlci5hMTF5LmxpdmVSZWdpb24gJiYgc3dpcGVyLmExMXkubGl2ZVJlZ2lvbi5sZW5ndGggPiAwKSB7IHN3aXBlci5hMTF5LmxpdmVSZWdpb24ucmVtb3ZlKCk7IH1cblxuICAgICAgdmFyICRuZXh0RWw7XG4gICAgICB2YXIgJHByZXZFbDtcbiAgICAgIGlmIChzd2lwZXIubmF2aWdhdGlvbiAmJiBzd2lwZXIubmF2aWdhdGlvbi4kbmV4dEVsKSB7XG4gICAgICAgICRuZXh0RWwgPSBzd2lwZXIubmF2aWdhdGlvbi4kbmV4dEVsO1xuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5uYXZpZ2F0aW9uICYmIHN3aXBlci5uYXZpZ2F0aW9uLiRwcmV2RWwpIHtcbiAgICAgICAgJHByZXZFbCA9IHN3aXBlci5uYXZpZ2F0aW9uLiRwcmV2RWw7XG4gICAgICB9XG4gICAgICBpZiAoJG5leHRFbCkge1xuICAgICAgICAkbmV4dEVsLm9mZigna2V5ZG93bicsIHN3aXBlci5hMTF5Lm9uRW50ZXJLZXkpO1xuICAgICAgfVxuICAgICAgaWYgKCRwcmV2RWwpIHtcbiAgICAgICAgJHByZXZFbC5vZmYoJ2tleWRvd24nLCBzd2lwZXIuYTExeS5vbkVudGVyS2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFnaW5hdGlvblxuICAgICAgaWYgKHN3aXBlci5wYWdpbmF0aW9uICYmIHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5jbGlja2FibGUgJiYgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cyAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzLmxlbmd0aCkge1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi4kZWwub2ZmKCdrZXlkb3duJywgKFwiLlwiICsgKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5idWxsZXRDbGFzcykpLCBzd2lwZXIuYTExeS5vbkVudGVyS2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICB2YXIgQTExeSA9IHtcbiAgICBuYW1lOiAnYTExeScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBhMTF5OiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIG5vdGlmaWNhdGlvbkNsYXNzOiAnc3dpcGVyLW5vdGlmaWNhdGlvbicsXG4gICAgICAgIHByZXZTbGlkZU1lc3NhZ2U6ICdQcmV2aW91cyBzbGlkZScsXG4gICAgICAgIG5leHRTbGlkZU1lc3NhZ2U6ICdOZXh0IHNsaWRlJyxcbiAgICAgICAgZmlyc3RTbGlkZU1lc3NhZ2U6ICdUaGlzIGlzIHRoZSBmaXJzdCBzbGlkZScsXG4gICAgICAgIGxhc3RTbGlkZU1lc3NhZ2U6ICdUaGlzIGlzIHRoZSBsYXN0IHNsaWRlJyxcbiAgICAgICAgcGFnaW5hdGlvbkJ1bGxldE1lc3NhZ2U6ICdHbyB0byBzbGlkZSB7e2luZGV4fX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGExMXk6IHtcbiAgICAgICAgICBsaXZlUmVnaW9uOiAkKChcIjxzcGFuIGNsYXNzPVxcXCJcIiArIChzd2lwZXIucGFyYW1zLmExMXkubm90aWZpY2F0aW9uQ2xhc3MpICsgXCJcXFwiIGFyaWEtbGl2ZT1cXFwiYXNzZXJ0aXZlXFxcIiBhcmlhLWF0b21pYz1cXFwidHJ1ZVxcXCI+PC9zcGFuPlwiKSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5rZXlzKGExMXkpLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgc3dpcGVyLmExMXlbbWV0aG9kTmFtZV0gPSBhMTF5W21ldGhvZE5hbWVdLmJpbmQoc3dpcGVyKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb246IHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5wYXJhbXMuYTExeS5lbmFibGVkKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuYTExeS5pbml0KCk7XG4gICAgICAgIHN3aXBlci5hMTF5LnVwZGF0ZU5hdmlnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICB0b0VkZ2U6IGZ1bmN0aW9uIHRvRWRnZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5hMTF5LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5hMTF5LnVwZGF0ZU5hdmlnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBmcm9tRWRnZTogZnVuY3Rpb24gZnJvbUVkZ2UoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci5wYXJhbXMuYTExeS5lbmFibGVkKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuYTExeS51cGRhdGVOYXZpZ2F0aW9uKCk7XG4gICAgICB9LFxuICAgICAgcGFnaW5hdGlvblVwZGF0ZTogZnVuY3Rpb24gcGFnaW5hdGlvblVwZGF0ZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5hMTF5LmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5hMTF5LnVwZGF0ZVBhZ2luYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLmExMXkuZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmExMXkuZGVzdHJveSgpO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBIaXN0b3J5ID0ge1xuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5oaXN0b3J5KSB7IHJldHVybjsgfVxuICAgICAgaWYgKCF3aW4uaGlzdG9yeSB8fCAhd2luLmhpc3RvcnkucHVzaFN0YXRlKSB7XG4gICAgICAgIHN3aXBlci5wYXJhbXMuaGlzdG9yeS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHN3aXBlci5wYXJhbXMuaGFzaE5hdmlnYXRpb24uZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBoaXN0b3J5ID0gc3dpcGVyLmhpc3Rvcnk7XG4gICAgICBoaXN0b3J5LmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIGhpc3RvcnkucGF0aHMgPSBIaXN0b3J5LmdldFBhdGhWYWx1ZXMoKTtcbiAgICAgIGlmICghaGlzdG9yeS5wYXRocy5rZXkgJiYgIWhpc3RvcnkucGF0aHMudmFsdWUpIHsgcmV0dXJuOyB9XG4gICAgICBoaXN0b3J5LnNjcm9sbFRvU2xpZGUoMCwgaGlzdG9yeS5wYXRocy52YWx1ZSwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQpO1xuICAgICAgaWYgKCFzd2lwZXIucGFyYW1zLmhpc3RvcnkucmVwbGFjZVN0YXRlKSB7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIHN3aXBlci5oaXN0b3J5LnNldEhpc3RvcnlQb3BTdGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoIXN3aXBlci5wYXJhbXMuaGlzdG9yeS5yZXBsYWNlU3RhdGUpIHtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgc3dpcGVyLmhpc3Rvcnkuc2V0SGlzdG9yeVBvcFN0YXRlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldEhpc3RvcnlQb3BTdGF0ZTogZnVuY3Rpb24gc2V0SGlzdG9yeVBvcFN0YXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBzd2lwZXIuaGlzdG9yeS5wYXRocyA9IEhpc3RvcnkuZ2V0UGF0aFZhbHVlcygpO1xuICAgICAgc3dpcGVyLmhpc3Rvcnkuc2Nyb2xsVG9TbGlkZShzd2lwZXIucGFyYW1zLnNwZWVkLCBzd2lwZXIuaGlzdG9yeS5wYXRocy52YWx1ZSwgZmFsc2UpO1xuICAgIH0sXG4gICAgZ2V0UGF0aFZhbHVlczogZnVuY3Rpb24gZ2V0UGF0aFZhbHVlcygpIHtcbiAgICAgIHZhciBwYXRoQXJyYXkgPSB3aW4ubG9jYXRpb24ucGF0aG5hbWUuc2xpY2UoMSkuc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHBhcnQpIHsgcmV0dXJuIHBhcnQgIT09ICcnOyB9KTtcbiAgICAgIHZhciB0b3RhbCA9IHBhdGhBcnJheS5sZW5ndGg7XG4gICAgICB2YXIga2V5ID0gcGF0aEFycmF5W3RvdGFsIC0gMl07XG4gICAgICB2YXIgdmFsdWUgPSBwYXRoQXJyYXlbdG90YWwgLSAxXTtcbiAgICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfTtcbiAgICB9LFxuICAgIHNldEhpc3Rvcnk6IGZ1bmN0aW9uIHNldEhpc3Rvcnkoa2V5LCBpbmRleCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAoIXN3aXBlci5oaXN0b3J5LmluaXRpYWxpemVkIHx8ICFzd2lwZXIucGFyYW1zLmhpc3RvcnkuZW5hYmxlZCkgeyByZXR1cm47IH1cbiAgICAgIHZhciBzbGlkZSA9IHN3aXBlci5zbGlkZXMuZXEoaW5kZXgpO1xuICAgICAgdmFyIHZhbHVlID0gSGlzdG9yeS5zbHVnaWZ5KHNsaWRlLmF0dHIoJ2RhdGEtaGlzdG9yeScpKTtcbiAgICAgIGlmICghd2luLmxvY2F0aW9uLnBhdGhuYW1lLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdmFsdWUgPSBrZXkgKyBcIi9cIiArIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IHdpbi5oaXN0b3J5LnN0YXRlO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAmJiBjdXJyZW50U3RhdGUudmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmhpc3RvcnkucmVwbGFjZVN0YXRlKSB7XG4gICAgICAgIHdpbi5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IHZhbHVlOiB2YWx1ZSB9LCBudWxsLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW4uaGlzdG9yeS5wdXNoU3RhdGUoeyB2YWx1ZTogdmFsdWUgfSwgbnVsbCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2x1Z2lmeTogZnVuY3Rpb24gc2x1Z2lmeSh0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpXG4gICAgICAgIC5yZXBsYWNlKC9cXHMrL2csICctJylcbiAgICAgICAgLnJlcGxhY2UoL1teXFx3LV0rL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvLS0rL2csICctJylcbiAgICAgICAgLnJlcGxhY2UoL14tKy8sICcnKVxuICAgICAgICAucmVwbGFjZSgvLSskLywgJycpO1xuICAgIH0sXG4gICAgc2Nyb2xsVG9TbGlkZTogZnVuY3Rpb24gc2Nyb2xsVG9TbGlkZShzcGVlZCwgdmFsdWUsIHJ1bkNhbGxiYWNrcykge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHN3aXBlci5zbGlkZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICB2YXIgc2xpZGUgPSBzd2lwZXIuc2xpZGVzLmVxKGkpO1xuICAgICAgICAgIHZhciBzbGlkZUhpc3RvcnkgPSBIaXN0b3J5LnNsdWdpZnkoc2xpZGUuYXR0cignZGF0YS1oaXN0b3J5JykpO1xuICAgICAgICAgIGlmIChzbGlkZUhpc3RvcnkgPT09IHZhbHVlICYmICFzbGlkZS5oYXNDbGFzcyhzd2lwZXIucGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBzbGlkZS5pbmRleCgpO1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlVG8oaW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oMCwgc3BlZWQsIHJ1bkNhbGxiYWNrcyk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICB2YXIgSGlzdG9yeSQxID0ge1xuICAgIG5hbWU6ICdoaXN0b3J5JyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHJlcGxhY2VTdGF0ZTogZmFsc2UsXG4gICAgICAgIGtleTogJ3NsaWRlcycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGluaXQ6IEhpc3RvcnkuaW5pdC5iaW5kKHN3aXBlciksXG4gICAgICAgICAgc2V0SGlzdG9yeTogSGlzdG9yeS5zZXRIaXN0b3J5LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRIaXN0b3J5UG9wU3RhdGU6IEhpc3Rvcnkuc2V0SGlzdG9yeVBvcFN0YXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzY3JvbGxUb1NsaWRlOiBIaXN0b3J5LnNjcm9sbFRvU2xpZGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIGRlc3Ryb3k6IEhpc3RvcnkuZGVzdHJveS5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuaGlzdG9yeS5lbmFibGVkKSB7XG4gICAgICAgICAgc3dpcGVyLmhpc3RvcnkuaW5pdCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmhpc3RvcnkuZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci5oaXN0b3J5LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRyYW5zaXRpb25FbmQ6IGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLmhpc3RvcnkuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICBzd2lwZXIuaGlzdG9yeS5zZXRIaXN0b3J5KHN3aXBlci5wYXJhbXMuaGlzdG9yeS5rZXksIHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICB2YXIgSGFzaE5hdmlnYXRpb24gPSB7XG4gICAgb25IYXNoQ2FuZ2U6IGZ1bmN0aW9uIG9uSGFzaENhbmdlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgbmV3SGFzaCA9IGRvYy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICB2YXIgYWN0aXZlU2xpZGVIYXNoID0gc3dpcGVyLnNsaWRlcy5lcShzd2lwZXIuYWN0aXZlSW5kZXgpLmF0dHIoJ2RhdGEtaGFzaCcpO1xuICAgICAgaWYgKG5ld0hhc2ggIT09IGFjdGl2ZVNsaWRlSGFzaCkge1xuICAgICAgICB2YXIgbmV3SW5kZXggPSBzd2lwZXIuJHdyYXBwZXJFbC5jaGlsZHJlbigoXCIuXCIgKyAoc3dpcGVyLnBhcmFtcy5zbGlkZUNsYXNzKSArIFwiW2RhdGEtaGFzaD1cXFwiXCIgKyBuZXdIYXNoICsgXCJcXFwiXVwiKSkuaW5kZXgoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKG5ld0luZGV4KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldEhhc2g6IGZ1bmN0aW9uIHNldEhhc2goKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLmhhc2hOYXZpZ2F0aW9uLmluaXRpYWxpemVkIHx8ICFzd2lwZXIucGFyYW1zLmhhc2hOYXZpZ2F0aW9uLmVuYWJsZWQpIHsgcmV0dXJuOyB9XG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5oYXNoTmF2aWdhdGlvbi5yZXBsYWNlU3RhdGUgJiYgd2luLmhpc3RvcnkgJiYgd2luLmhpc3RvcnkucmVwbGFjZVN0YXRlKSB7XG4gICAgICAgIHdpbi5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBudWxsLCAoKFwiI1wiICsgKHN3aXBlci5zbGlkZXMuZXEoc3dpcGVyLmFjdGl2ZUluZGV4KS5hdHRyKCdkYXRhLWhhc2gnKSkpIHx8ICcnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc2xpZGUgPSBzd2lwZXIuc2xpZGVzLmVxKHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgICAgIHZhciBoYXNoID0gc2xpZGUuYXR0cignZGF0YS1oYXNoJykgfHwgc2xpZGUuYXR0cignZGF0YS1oaXN0b3J5Jyk7XG4gICAgICAgIGRvYy5sb2NhdGlvbi5oYXNoID0gaGFzaCB8fCAnJztcbiAgICAgIH1cbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICghc3dpcGVyLnBhcmFtcy5oYXNoTmF2aWdhdGlvbi5lbmFibGVkIHx8IChzd2lwZXIucGFyYW1zLmhpc3RvcnkgJiYgc3dpcGVyLnBhcmFtcy5oaXN0b3J5LmVuYWJsZWQpKSB7IHJldHVybjsgfVxuICAgICAgc3dpcGVyLmhhc2hOYXZpZ2F0aW9uLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHZhciBoYXNoID0gZG9jLmxvY2F0aW9uLmhhc2gucmVwbGFjZSgnIycsICcnKTtcbiAgICAgIGlmIChoYXNoKSB7XG4gICAgICAgIHZhciBzcGVlZCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBzd2lwZXIuc2xpZGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIHNsaWRlID0gc3dpcGVyLnNsaWRlcy5lcShpKTtcbiAgICAgICAgICB2YXIgc2xpZGVIYXNoID0gc2xpZGUuYXR0cignZGF0YS1oYXNoJykgfHwgc2xpZGUuYXR0cignZGF0YS1oaXN0b3J5Jyk7XG4gICAgICAgICAgaWYgKHNsaWRlSGFzaCA9PT0gaGFzaCAmJiAhc2xpZGUuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy5zbGlkZUR1cGxpY2F0ZUNsYXNzKSkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gc2xpZGUuaW5kZXgoKTtcbiAgICAgICAgICAgIHN3aXBlci5zbGlkZVRvKGluZGV4LCBzcGVlZCwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuaGFzaE5hdmlnYXRpb24ud2F0Y2hTdGF0ZSkge1xuICAgICAgICAkKHdpbikub24oJ2hhc2hjaGFuZ2UnLCBzd2lwZXIuaGFzaE5hdmlnYXRpb24ub25IYXNoQ2FuZ2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuaGFzaE5hdmlnYXRpb24ud2F0Y2hTdGF0ZSkge1xuICAgICAgICAkKHdpbikub2ZmKCdoYXNoY2hhbmdlJywgc3dpcGVyLmhhc2hOYXZpZ2F0aW9uLm9uSGFzaENhbmdlKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICB2YXIgSGFzaE5hdmlnYXRpb24kMSA9IHtcbiAgICBuYW1lOiAnaGFzaC1uYXZpZ2F0aW9uJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGhhc2hOYXZpZ2F0aW9uOiB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICByZXBsYWNlU3RhdGU6IGZhbHNlLFxuICAgICAgICB3YXRjaFN0YXRlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlciwge1xuICAgICAgICBoYXNoTmF2aWdhdGlvbjoge1xuICAgICAgICAgIGluaXRpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgICBpbml0OiBIYXNoTmF2aWdhdGlvbi5pbml0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBkZXN0cm95OiBIYXNoTmF2aWdhdGlvbi5kZXN0cm95LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRIYXNoOiBIYXNoTmF2aWdhdGlvbi5zZXRIYXNoLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBvbkhhc2hDYW5nZTogSGFzaE5hdmlnYXRpb24ub25IYXNoQ2FuZ2UuYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmhhc2hOYXZpZ2F0aW9uLmVuYWJsZWQpIHtcbiAgICAgICAgICBzd2lwZXIuaGFzaE5hdmlnYXRpb24uaW5pdCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmhhc2hOYXZpZ2F0aW9uLmVuYWJsZWQpIHtcbiAgICAgICAgICBzd2lwZXIuaGFzaE5hdmlnYXRpb24uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gdHJhbnNpdGlvbkVuZCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIuaGFzaE5hdmlnYXRpb24uaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICBzd2lwZXIuaGFzaE5hdmlnYXRpb24uc2V0SGFzaCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgLyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiBcIm9mZlwiICovXG5cbiAgdmFyIEF1dG9wbGF5ID0ge1xuICAgIHJ1bjogZnVuY3Rpb24gcnVuKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJGFjdGl2ZVNsaWRlRWwgPSBzd2lwZXIuc2xpZGVzLmVxKHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgICB2YXIgZGVsYXkgPSBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5O1xuICAgICAgaWYgKCRhY3RpdmVTbGlkZUVsLmF0dHIoJ2RhdGEtc3dpcGVyLWF1dG9wbGF5JykpIHtcbiAgICAgICAgZGVsYXkgPSAkYWN0aXZlU2xpZGVFbC5hdHRyKCdkYXRhLXN3aXBlci1hdXRvcGxheScpIHx8IHN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZGVsYXk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQpO1xuICAgICAgc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQgPSBVdGlscy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmF1dG9wbGF5LnJldmVyc2VEaXJlY3Rpb24pIHtcbiAgICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICAgICAgICBzd2lwZXIubG9vcEZpeCgpO1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlUHJldihzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdhdXRvcGxheScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN3aXBlci5pc0JlZ2lubmluZykge1xuICAgICAgICAgICAgc3dpcGVyLnNsaWRlUHJldihzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCdhdXRvcGxheScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN3aXBlci5wYXJhbXMuYXV0b3BsYXkuc3RvcE9uTGFzdFNsaWRlKSB7XG4gICAgICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIDEsIHN3aXBlci5wYXJhbXMuc3BlZWQsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgc3dpcGVyLmVtaXQoJ2F1dG9wbGF5Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgICAgIHN3aXBlci5sb29wRml4KCk7XG4gICAgICAgICAgc3dpcGVyLnNsaWRlTmV4dChzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnYXV0b3BsYXknKTtcbiAgICAgICAgfSBlbHNlIGlmICghc3dpcGVyLmlzRW5kKSB7XG4gICAgICAgICAgc3dpcGVyLnNsaWRlTmV4dChzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnYXV0b3BsYXknKTtcbiAgICAgICAgfSBlbHNlIGlmICghc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5zdG9wT25MYXN0U2xpZGUpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUbygwLCBzd2lwZXIucGFyYW1zLnNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBzd2lwZXIuZW1pdCgnYXV0b3BsYXknKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuYXV0b3BsYXkuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9LCBkZWxheSk7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIGlmICh0eXBlb2Ygc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQgIT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgaWYgKHN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcgPSB0cnVlO1xuICAgICAgc3dpcGVyLmVtaXQoJ2F1dG9wbGF5U3RhcnQnKTtcbiAgICAgIHN3aXBlci5hdXRvcGxheS5ydW4oKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIuYXV0b3BsYXkucnVubmluZykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIGlmICh0eXBlb2Ygc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICBpZiAoc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHN3aXBlci5hdXRvcGxheS50aW1lb3V0KTtcbiAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBzd2lwZXIuYXV0b3BsYXkucnVubmluZyA9IGZhbHNlO1xuICAgICAgc3dpcGVyLmVtaXQoJ2F1dG9wbGF5U3RvcCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBwYXVzZTogZnVuY3Rpb24gcGF1c2Uoc3BlZWQpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgaWYgKCFzd2lwZXIuYXV0b3BsYXkucnVubmluZykgeyByZXR1cm47IH1cbiAgICAgIGlmIChzd2lwZXIuYXV0b3BsYXkucGF1c2VkKSB7IHJldHVybjsgfVxuICAgICAgaWYgKHN3aXBlci5hdXRvcGxheS50aW1lb3V0KSB7IGNsZWFyVGltZW91dChzd2lwZXIuYXV0b3BsYXkudGltZW91dCk7IH1cbiAgICAgIHN3aXBlci5hdXRvcGxheS5wYXVzZWQgPSB0cnVlO1xuICAgICAgaWYgKHNwZWVkID09PSAwIHx8ICFzd2lwZXIucGFyYW1zLmF1dG9wbGF5LndhaXRGb3JUcmFuc2l0aW9uKSB7XG4gICAgICAgIHN3aXBlci5hdXRvcGxheS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnJ1bigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWxbMF0uYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHN3aXBlci5hdXRvcGxheS5vblRyYW5zaXRpb25FbmQpO1xuICAgICAgICBzd2lwZXIuJHdyYXBwZXJFbFswXS5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgc3dpcGVyLmF1dG9wbGF5Lm9uVHJhbnNpdGlvbkVuZCk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICB2YXIgQXV0b3BsYXkkMSA9IHtcbiAgICBuYW1lOiAnYXV0b3BsYXknLFxuICAgIHBhcmFtczoge1xuICAgICAgYXV0b3BsYXk6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIGRlbGF5OiAzMDAwLFxuICAgICAgICB3YWl0Rm9yVHJhbnNpdGlvbjogdHJ1ZSxcbiAgICAgICAgZGlzYWJsZU9uSW50ZXJhY3Rpb246IHRydWUsXG4gICAgICAgIHN0b3BPbkxhc3RTbGlkZTogZmFsc2UsXG4gICAgICAgIHJldmVyc2VEaXJlY3Rpb246IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGF1dG9wbGF5OiB7XG4gICAgICAgICAgcnVubmluZzogZmFsc2UsXG4gICAgICAgICAgcGF1c2VkOiBmYWxzZSxcbiAgICAgICAgICBydW46IEF1dG9wbGF5LnJ1bi5iaW5kKHN3aXBlciksXG4gICAgICAgICAgc3RhcnQ6IEF1dG9wbGF5LnN0YXJ0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzdG9wOiBBdXRvcGxheS5zdG9wLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBwYXVzZTogQXV0b3BsYXkucGF1c2UuYmluZChzd2lwZXIpLFxuICAgICAgICAgIG9uVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gb25UcmFuc2l0aW9uRW5kKGUpIHtcbiAgICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci4kd3JhcHBlckVsKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWxbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHN3aXBlci5hdXRvcGxheS5vblRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgc3dpcGVyLiR3cmFwcGVyRWxbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2Via2l0VHJhbnNpdGlvbkVuZCcsIHN3aXBlci5hdXRvcGxheS5vblRyYW5zaXRpb25FbmQpO1xuICAgICAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnBhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFzd2lwZXIuYXV0b3BsYXkucnVubmluZykge1xuICAgICAgICAgICAgICBzd2lwZXIuYXV0b3BsYXkuc3RvcCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZW5hYmxlZCkge1xuICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYmVmb3JlVHJhbnNpdGlvblN0YXJ0OiBmdW5jdGlvbiBiZWZvcmVUcmFuc2l0aW9uU3RhcnQoc3BlZWQsIGludGVybmFsKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHtcbiAgICAgICAgICBpZiAoaW50ZXJuYWwgfHwgIXN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZGlzYWJsZU9uSW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5wYXVzZShzcGVlZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2xpZGVyRmlyc3RNb3ZlOiBmdW5jdGlvbiBzbGlkZXJGaXJzdE1vdmUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHtcbiAgICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5kaXNhYmxlT25JbnRlcmFjdGlvbikge1xuICAgICAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnN0b3AoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpcGVyLmF1dG9wbGF5LnBhdXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIuYXV0b3BsYXkucnVubmluZykge1xuICAgICAgICAgIHN3aXBlci5hdXRvcGxheS5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICB2YXIgRmFkZSA9IHtcbiAgICBzZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgJHNsaWRlRWwgPSBzd2lwZXIuc2xpZGVzLmVxKGkpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gJHNsaWRlRWxbMF0uc3dpcGVyU2xpZGVPZmZzZXQ7XG4gICAgICAgIHZhciB0eCA9IC1vZmZzZXQ7XG4gICAgICAgIGlmICghc3dpcGVyLnBhcmFtcy52aXJ0dWFsVHJhbnNsYXRlKSB7IHR4IC09IHN3aXBlci50cmFuc2xhdGU7IH1cbiAgICAgICAgdmFyIHR5ID0gMDtcbiAgICAgICAgaWYgKCFzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICB0eSA9IHR4O1xuICAgICAgICAgIHR4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2xpZGVPcGFjaXR5ID0gc3dpcGVyLnBhcmFtcy5mYWRlRWZmZWN0LmNyb3NzRmFkZVxuICAgICAgICAgID8gTWF0aC5tYXgoMSAtIE1hdGguYWJzKCRzbGlkZUVsWzBdLnByb2dyZXNzKSwgMClcbiAgICAgICAgICA6IDEgKyBNYXRoLm1pbihNYXRoLm1heCgkc2xpZGVFbFswXS5wcm9ncmVzcywgLTEpLCAwKTtcbiAgICAgICAgJHNsaWRlRWxcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IHNsaWRlT3BhY2l0eSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlM2QoXCIgKyB0eCArIFwicHgsIFwiICsgdHkgKyBcInB4LCAwcHgpXCIpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24pIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgICAgc2xpZGVzLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudmlydHVhbFRyYW5zbGF0ZSAmJiBkdXJhdGlvbiAhPT0gMCkge1xuICAgICAgICB2YXIgZXZlbnRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgc2xpZGVzLnRyYW5zaXRpb25FbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChldmVudFRyaWdnZXJlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIGV2ZW50VHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgICBzd2lwZXIuYW5pbWF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgdmFyIHRyaWdnZXJFdmVudHMgPSBbJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCAndHJhbnNpdGlvbmVuZCddO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpZ2dlckV2ZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgJHdyYXBwZXJFbC50cmlnZ2VyKHRyaWdnZXJFdmVudHNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICB2YXIgRWZmZWN0RmFkZSA9IHtcbiAgICBuYW1lOiAnZWZmZWN0LWZhZGUnLFxuICAgIHBhcmFtczoge1xuICAgICAgZmFkZUVmZmVjdDoge1xuICAgICAgICBjcm9zc0ZhZGU6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGZhZGVFZmZlY3Q6IHtcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IEZhZGUuc2V0VHJhbnNsYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uOiBGYWRlLnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgYmVmb3JlSW5pdDogZnVuY3Rpb24gYmVmb3JlSW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2ZhZGUnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY2xhc3NOYW1lcy5wdXNoKCgoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSArIFwiZmFkZVwiKSk7XG4gICAgICAgIHZhciBvdmVyd3JpdGVQYXJhbXMgPSB7XG4gICAgICAgICAgc2xpZGVzUGVyVmlldzogMSxcbiAgICAgICAgICBzbGlkZXNQZXJDb2x1bW46IDEsXG4gICAgICAgICAgc2xpZGVzUGVyR3JvdXA6IDEsXG4gICAgICAgICAgd2F0Y2hTbGlkZXNQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICBzcGFjZUJldHdlZW46IDAsXG4gICAgICAgICAgdmlydHVhbFRyYW5zbGF0ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5wYXJhbXMsIG92ZXJ3cml0ZVBhcmFtcyk7XG4gICAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIub3JpZ2luYWxQYXJhbXMsIG92ZXJ3cml0ZVBhcmFtcyk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5lZmZlY3QgIT09ICdmYWRlJykgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmZhZGVFZmZlY3Quc2V0VHJhbnNsYXRlKCk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZWZmZWN0ICE9PSAnZmFkZScpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5mYWRlRWZmZWN0LnNldFRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBDdWJlID0ge1xuICAgIHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gc2V0VHJhbnNsYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICAgIHZhciAkd3JhcHBlckVsID0gc3dpcGVyLiR3cmFwcGVyRWw7XG4gICAgICB2YXIgc2xpZGVzID0gc3dpcGVyLnNsaWRlcztcbiAgICAgIHZhciBzd2lwZXJXaWR0aCA9IHN3aXBlci53aWR0aDtcbiAgICAgIHZhciBzd2lwZXJIZWlnaHQgPSBzd2lwZXIuaGVpZ2h0O1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgICB2YXIgc3dpcGVyU2l6ZSA9IHN3aXBlci5zaXplO1xuICAgICAgdmFyIHBhcmFtcyA9IHN3aXBlci5wYXJhbXMuY3ViZUVmZmVjdDtcbiAgICAgIHZhciBpc0hvcml6b250YWwgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCk7XG4gICAgICB2YXIgaXNWaXJ0dWFsID0gc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQ7XG4gICAgICB2YXIgd3JhcHBlclJvdGF0ZSA9IDA7XG4gICAgICB2YXIgJGN1YmVTaGFkb3dFbDtcbiAgICAgIGlmIChwYXJhbXMuc2hhZG93KSB7XG4gICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAkY3ViZVNoYWRvd0VsID0gJHdyYXBwZXJFbC5maW5kKCcuc3dpcGVyLWN1YmUtc2hhZG93Jyk7XG4gICAgICAgICAgaWYgKCRjdWJlU2hhZG93RWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAkY3ViZVNoYWRvd0VsID0gJCgnPGRpdiBjbGFzcz1cInN3aXBlci1jdWJlLXNoYWRvd1wiPjwvZGl2PicpO1xuICAgICAgICAgICAgJHdyYXBwZXJFbC5hcHBlbmQoJGN1YmVTaGFkb3dFbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgICRjdWJlU2hhZG93RWwuY3NzKHsgaGVpZ2h0OiAoc3dpcGVyV2lkdGggKyBcInB4XCIpIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRjdWJlU2hhZG93RWwgPSAkZWwuZmluZCgnLnN3aXBlci1jdWJlLXNoYWRvdycpO1xuICAgICAgICAgIGlmICgkY3ViZVNoYWRvd0VsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgJGN1YmVTaGFkb3dFbCA9ICQoJzxkaXYgY2xhc3M9XCJzd2lwZXItY3ViZS1zaGFkb3dcIj48L2Rpdj4nKTtcbiAgICAgICAgICAgICRlbC5hcHBlbmQoJGN1YmVTaGFkb3dFbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgJHNsaWRlRWwgPSBzbGlkZXMuZXEoaSk7XG4gICAgICAgIHZhciBzbGlkZUluZGV4ID0gaTtcbiAgICAgICAgaWYgKGlzVmlydHVhbCkge1xuICAgICAgICAgIHNsaWRlSW5kZXggPSBwYXJzZUludCgkc2xpZGVFbC5hdHRyKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNsaWRlQW5nbGUgPSBzbGlkZUluZGV4ICogOTA7XG4gICAgICAgIHZhciByb3VuZCA9IE1hdGguZmxvb3Ioc2xpZGVBbmdsZSAvIDM2MCk7XG4gICAgICAgIGlmIChydGwpIHtcbiAgICAgICAgICBzbGlkZUFuZ2xlID0gLXNsaWRlQW5nbGU7XG4gICAgICAgICAgcm91bmQgPSBNYXRoLmZsb29yKC1zbGlkZUFuZ2xlIC8gMzYwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBNYXRoLm1heChNYXRoLm1pbigkc2xpZGVFbFswXS5wcm9ncmVzcywgMSksIC0xKTtcbiAgICAgICAgdmFyIHR4ID0gMDtcbiAgICAgICAgdmFyIHR5ID0gMDtcbiAgICAgICAgdmFyIHR6ID0gMDtcbiAgICAgICAgaWYgKHNsaWRlSW5kZXggJSA0ID09PSAwKSB7XG4gICAgICAgICAgdHggPSAtcm91bmQgKiA0ICogc3dpcGVyU2l6ZTtcbiAgICAgICAgICB0eiA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoKHNsaWRlSW5kZXggLSAxKSAlIDQgPT09IDApIHtcbiAgICAgICAgICB0eCA9IDA7XG4gICAgICAgICAgdHogPSAtcm91bmQgKiA0ICogc3dpcGVyU2l6ZTtcbiAgICAgICAgfSBlbHNlIGlmICgoc2xpZGVJbmRleCAtIDIpICUgNCA9PT0gMCkge1xuICAgICAgICAgIHR4ID0gc3dpcGVyU2l6ZSArIChyb3VuZCAqIDQgKiBzd2lwZXJTaXplKTtcbiAgICAgICAgICB0eiA9IHN3aXBlclNpemU7XG4gICAgICAgIH0gZWxzZSBpZiAoKHNsaWRlSW5kZXggLSAzKSAlIDQgPT09IDApIHtcbiAgICAgICAgICB0eCA9IC1zd2lwZXJTaXplO1xuICAgICAgICAgIHR6ID0gKDMgKiBzd2lwZXJTaXplKSArIChzd2lwZXJTaXplICogNCAqIHJvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnRsKSB7XG4gICAgICAgICAgdHggPSAtdHg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgIHR5ID0gdHg7XG4gICAgICAgICAgdHggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IFwicm90YXRlWChcIiArIChpc0hvcml6b250YWwgPyAwIDogLXNsaWRlQW5nbGUpICsgXCJkZWcpIHJvdGF0ZVkoXCIgKyAoaXNIb3Jpem9udGFsID8gc2xpZGVBbmdsZSA6IDApICsgXCJkZWcpIHRyYW5zbGF0ZTNkKFwiICsgdHggKyBcInB4LCBcIiArIHR5ICsgXCJweCwgXCIgKyB0eiArIFwicHgpXCI7XG4gICAgICAgIGlmIChwcm9ncmVzcyA8PSAxICYmIHByb2dyZXNzID4gLTEpIHtcbiAgICAgICAgICB3cmFwcGVyUm90YXRlID0gKHNsaWRlSW5kZXggKiA5MCkgKyAocHJvZ3Jlc3MgKiA5MCk7XG4gICAgICAgICAgaWYgKHJ0bCkgeyB3cmFwcGVyUm90YXRlID0gKC1zbGlkZUluZGV4ICogOTApIC0gKHByb2dyZXNzICogOTApOyB9XG4gICAgICAgIH1cbiAgICAgICAgJHNsaWRlRWwudHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGlmIChwYXJhbXMuc2xpZGVTaGFkb3dzKSB7XG4gICAgICAgICAgLy8gU2V0IHNoYWRvd3NcbiAgICAgICAgICB2YXIgc2hhZG93QmVmb3JlID0gaXNIb3Jpem9udGFsID8gJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCcpIDogJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wJyk7XG4gICAgICAgICAgdmFyIHNoYWRvd0FmdGVyID0gaXNIb3Jpem9udGFsID8gJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctcmlnaHQnKSA6ICRzbGlkZUVsLmZpbmQoJy5zd2lwZXItc2xpZGUtc2hhZG93LWJvdHRvbScpO1xuICAgICAgICAgIGlmIChzaGFkb3dCZWZvcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzaGFkb3dCZWZvcmUgPSAkKChcIjxkaXYgY2xhc3M9XFxcInN3aXBlci1zbGlkZS1zaGFkb3ctXCIgKyAoaXNIb3Jpem9udGFsID8gJ2xlZnQnIDogJ3RvcCcpICsgXCJcXFwiPjwvZGl2PlwiKSk7XG4gICAgICAgICAgICAkc2xpZGVFbC5hcHBlbmQoc2hhZG93QmVmb3JlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNoYWRvd0FmdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgc2hhZG93QWZ0ZXIgPSAkKChcIjxkaXYgY2xhc3M9XFxcInN3aXBlci1zbGlkZS1zaGFkb3ctXCIgKyAoaXNIb3Jpem9udGFsID8gJ3JpZ2h0JyA6ICdib3R0b20nKSArIFwiXFxcIj48L2Rpdj5cIikpO1xuICAgICAgICAgICAgJHNsaWRlRWwuYXBwZW5kKHNoYWRvd0FmdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNoYWRvd0JlZm9yZS5sZW5ndGgpIHsgc2hhZG93QmVmb3JlWzBdLnN0eWxlLm9wYWNpdHkgPSBNYXRoLm1heCgtcHJvZ3Jlc3MsIDApOyB9XG4gICAgICAgICAgaWYgKHNoYWRvd0FmdGVyLmxlbmd0aCkgeyBzaGFkb3dBZnRlclswXS5zdHlsZS5vcGFjaXR5ID0gTWF0aC5tYXgocHJvZ3Jlc3MsIDApOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICR3cmFwcGVyRWwuY3NzKHtcbiAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbic6IChcIjUwJSA1MCUgLVwiICsgKHN3aXBlclNpemUgLyAyKSArIFwicHhcIiksXG4gICAgICAgICctbW96LXRyYW5zZm9ybS1vcmlnaW4nOiAoXCI1MCUgNTAlIC1cIiArIChzd2lwZXJTaXplIC8gMikgKyBcInB4XCIpLFxuICAgICAgICAnLW1zLXRyYW5zZm9ybS1vcmlnaW4nOiAoXCI1MCUgNTAlIC1cIiArIChzd2lwZXJTaXplIC8gMikgKyBcInB4XCIpLFxuICAgICAgICAndHJhbnNmb3JtLW9yaWdpbic6IChcIjUwJSA1MCUgLVwiICsgKHN3aXBlclNpemUgLyAyKSArIFwicHhcIiksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHBhcmFtcy5zaGFkb3cpIHtcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICRjdWJlU2hhZG93RWwudHJhbnNmb3JtKChcInRyYW5zbGF0ZTNkKDBweCwgXCIgKyAoKHN3aXBlcldpZHRoIC8gMikgKyBwYXJhbXMuc2hhZG93T2Zmc2V0KSArIFwicHgsIFwiICsgKC1zd2lwZXJXaWR0aCAvIDIpICsgXCJweCkgcm90YXRlWCg5MGRlZykgcm90YXRlWigwZGVnKSBzY2FsZShcIiArIChwYXJhbXMuc2hhZG93U2NhbGUpICsgXCIpXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc2hhZG93QW5nbGUgPSBNYXRoLmFicyh3cmFwcGVyUm90YXRlKSAtIChNYXRoLmZsb29yKE1hdGguYWJzKHdyYXBwZXJSb3RhdGUpIC8gOTApICogOTApO1xuICAgICAgICAgIHZhciBtdWx0aXBsaWVyID0gMS41IC0gKFxuICAgICAgICAgICAgKE1hdGguc2luKChzaGFkb3dBbmdsZSAqIDIgKiBNYXRoLlBJKSAvIDM2MCkgLyAyKVxuICAgICAgICAgICAgKyAoTWF0aC5jb3MoKHNoYWRvd0FuZ2xlICogMiAqIE1hdGguUEkpIC8gMzYwKSAvIDIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YXIgc2NhbGUxID0gcGFyYW1zLnNoYWRvd1NjYWxlO1xuICAgICAgICAgIHZhciBzY2FsZTIgPSBwYXJhbXMuc2hhZG93U2NhbGUgLyBtdWx0aXBsaWVyO1xuICAgICAgICAgIHZhciBvZmZzZXQgPSBwYXJhbXMuc2hhZG93T2Zmc2V0O1xuICAgICAgICAgICRjdWJlU2hhZG93RWwudHJhbnNmb3JtKChcInNjYWxlM2QoXCIgKyBzY2FsZTEgKyBcIiwgMSwgXCIgKyBzY2FsZTIgKyBcIikgdHJhbnNsYXRlM2QoMHB4LCBcIiArICgoc3dpcGVySGVpZ2h0IC8gMikgKyBvZmZzZXQpICsgXCJweCwgXCIgKyAoLXN3aXBlckhlaWdodCAvIDIgLyBzY2FsZTIpICsgXCJweCkgcm90YXRlWCgtOTBkZWcpXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHpGYWN0b3IgPSAoQnJvd3Nlci5pc1NhZmFyaSB8fCBCcm93c2VyLmlzVWlXZWJWaWV3KSA/ICgtc3dpcGVyU2l6ZSAvIDIpIDogMDtcbiAgICAgICR3cmFwcGVyRWxcbiAgICAgICAgLnRyYW5zZm9ybSgoXCJ0cmFuc2xhdGUzZCgwcHgsMCxcIiArIHpGYWN0b3IgKyBcInB4KSByb3RhdGVYKFwiICsgKHN3aXBlci5pc0hvcml6b250YWwoKSA/IDAgOiB3cmFwcGVyUm90YXRlKSArIFwiZGVnKSByb3RhdGVZKFwiICsgKHN3aXBlci5pc0hvcml6b250YWwoKSA/IC13cmFwcGVyUm90YXRlIDogMCkgKyBcImRlZylcIikpO1xuICAgIH0sXG4gICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgJGVsID0gc3dpcGVyLiRlbDtcbiAgICAgIHZhciBzbGlkZXMgPSBzd2lwZXIuc2xpZGVzO1xuICAgICAgc2xpZGVzXG4gICAgICAgIC50cmFuc2l0aW9uKGR1cmF0aW9uKVxuICAgICAgICAuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0JylcbiAgICAgICAgLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuY3ViZUVmZmVjdC5zaGFkb3cgJiYgIXN3aXBlci5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAkZWwuZmluZCgnLnN3aXBlci1jdWJlLXNoYWRvdycpLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgdmFyIEVmZmVjdEN1YmUgPSB7XG4gICAgbmFtZTogJ2VmZmVjdC1jdWJlJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGN1YmVFZmZlY3Q6IHtcbiAgICAgICAgc2xpZGVTaGFkb3dzOiB0cnVlLFxuICAgICAgICBzaGFkb3c6IHRydWUsXG4gICAgICAgIHNoYWRvd09mZnNldDogMjAsXG4gICAgICAgIHNoYWRvd1NjYWxlOiAwLjk0LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGN1YmVFZmZlY3Q6IHtcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IEN1YmUuc2V0VHJhbnNsYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uOiBDdWJlLnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgYmVmb3JlSW5pdDogZnVuY3Rpb24gYmVmb3JlSW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2N1YmUnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY2xhc3NOYW1lcy5wdXNoKCgoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSArIFwiY3ViZVwiKSk7XG4gICAgICAgIHN3aXBlci5jbGFzc05hbWVzLnB1c2goKChzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpICsgXCIzZFwiKSk7XG4gICAgICAgIHZhciBvdmVyd3JpdGVQYXJhbXMgPSB7XG4gICAgICAgICAgc2xpZGVzUGVyVmlldzogMSxcbiAgICAgICAgICBzbGlkZXNQZXJDb2x1bW46IDEsXG4gICAgICAgICAgc2xpZGVzUGVyR3JvdXA6IDEsXG4gICAgICAgICAgd2F0Y2hTbGlkZXNQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICByZXNpc3RhbmNlUmF0aW86IDAsXG4gICAgICAgICAgc3BhY2VCZXR3ZWVuOiAwLFxuICAgICAgICAgIGNlbnRlcmVkU2xpZGVzOiBmYWxzZSxcbiAgICAgICAgICB2aXJ0dWFsVHJhbnNsYXRlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBVdGlscy5leHRlbmQoc3dpcGVyLnBhcmFtcywgb3ZlcndyaXRlUGFyYW1zKTtcbiAgICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5vcmlnaW5hbFBhcmFtcywgb3ZlcndyaXRlUGFyYW1zKTtcbiAgICAgIH0sXG4gICAgICBzZXRUcmFuc2xhdGU6IGZ1bmN0aW9uIHNldFRyYW5zbGF0ZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2N1YmUnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY3ViZUVmZmVjdC5zZXRUcmFuc2xhdGUoKTtcbiAgICAgIH0sXG4gICAgICBzZXRUcmFuc2l0aW9uOiBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5lZmZlY3QgIT09ICdjdWJlJykgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmN1YmVFZmZlY3Quc2V0VHJhbnNpdGlvbihkdXJhdGlvbik7XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgdmFyIEZsaXAgPSB7XG4gICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBzbGlkZXMgPSBzd2lwZXIuc2xpZGVzO1xuICAgICAgdmFyIHJ0bCA9IHN3aXBlci5ydGxUcmFuc2xhdGU7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgJHNsaWRlRWwgPSBzbGlkZXMuZXEoaSk7XG4gICAgICAgIHZhciBwcm9ncmVzcyA9ICRzbGlkZUVsWzBdLnByb2dyZXNzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5mbGlwRWZmZWN0LmxpbWl0Um90YXRpb24pIHtcbiAgICAgICAgICBwcm9ncmVzcyA9IE1hdGgubWF4KE1hdGgubWluKCRzbGlkZUVsWzBdLnByb2dyZXNzLCAxKSwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvZmZzZXQgPSAkc2xpZGVFbFswXS5zd2lwZXJTbGlkZU9mZnNldDtcbiAgICAgICAgdmFyIHJvdGF0ZSA9IC0xODAgKiBwcm9ncmVzcztcbiAgICAgICAgdmFyIHJvdGF0ZVkgPSByb3RhdGU7XG4gICAgICAgIHZhciByb3RhdGVYID0gMDtcbiAgICAgICAgdmFyIHR4ID0gLW9mZnNldDtcbiAgICAgICAgdmFyIHR5ID0gMDtcbiAgICAgICAgaWYgKCFzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgICAgICB0eSA9IHR4O1xuICAgICAgICAgIHR4ID0gMDtcbiAgICAgICAgICByb3RhdGVYID0gLXJvdGF0ZVk7XG4gICAgICAgICAgcm90YXRlWSA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAocnRsKSB7XG4gICAgICAgICAgcm90YXRlWSA9IC1yb3RhdGVZO1xuICAgICAgICB9XG5cbiAgICAgICAgJHNsaWRlRWxbMF0uc3R5bGUuekluZGV4ID0gLU1hdGguYWJzKE1hdGgucm91bmQocHJvZ3Jlc3MpKSArIHNsaWRlcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZmxpcEVmZmVjdC5zbGlkZVNoYWRvd3MpIHtcbiAgICAgICAgICAvLyBTZXQgc2hhZG93c1xuICAgICAgICAgIHZhciBzaGFkb3dCZWZvcmUgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAkc2xpZGVFbC5maW5kKCcuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0JykgOiAkc2xpZGVFbC5maW5kKCcuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3AnKTtcbiAgICAgICAgICB2YXIgc2hhZG93QWZ0ZXIgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAkc2xpZGVFbC5maW5kKCcuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCcpIDogJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tJyk7XG4gICAgICAgICAgaWYgKHNoYWRvd0JlZm9yZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNoYWRvd0JlZm9yZSA9ICQoKFwiPGRpdiBjbGFzcz1cXFwic3dpcGVyLXNsaWRlLXNoYWRvdy1cIiArIChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnbGVmdCcgOiAndG9wJykgKyBcIlxcXCI+PC9kaXY+XCIpKTtcbiAgICAgICAgICAgICRzbGlkZUVsLmFwcGVuZChzaGFkb3dCZWZvcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hhZG93QWZ0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzaGFkb3dBZnRlciA9ICQoKFwiPGRpdiBjbGFzcz1cXFwic3dpcGVyLXNsaWRlLXNoYWRvdy1cIiArIChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAncmlnaHQnIDogJ2JvdHRvbScpICsgXCJcXFwiPjwvZGl2PlwiKSk7XG4gICAgICAgICAgICAkc2xpZGVFbC5hcHBlbmQoc2hhZG93QWZ0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hhZG93QmVmb3JlLmxlbmd0aCkgeyBzaGFkb3dCZWZvcmVbMF0uc3R5bGUub3BhY2l0eSA9IE1hdGgubWF4KC1wcm9ncmVzcywgMCk7IH1cbiAgICAgICAgICBpZiAoc2hhZG93QWZ0ZXIubGVuZ3RoKSB7IHNoYWRvd0FmdGVyWzBdLnN0eWxlLm9wYWNpdHkgPSBNYXRoLm1heChwcm9ncmVzcywgMCk7IH1cbiAgICAgICAgfVxuICAgICAgICAkc2xpZGVFbFxuICAgICAgICAgIC50cmFuc2Zvcm0oKFwidHJhbnNsYXRlM2QoXCIgKyB0eCArIFwicHgsIFwiICsgdHkgKyBcInB4LCAwcHgpIHJvdGF0ZVgoXCIgKyByb3RhdGVYICsgXCJkZWcpIHJvdGF0ZVkoXCIgKyByb3RhdGVZICsgXCJkZWcpXCIpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24pIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICB2YXIgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgICAgc2xpZGVzXG4gICAgICAgIC50cmFuc2l0aW9uKGR1cmF0aW9uKVxuICAgICAgICAuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0JylcbiAgICAgICAgLnRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMudmlydHVhbFRyYW5zbGF0ZSAmJiBkdXJhdGlvbiAhPT0gMCkge1xuICAgICAgICB2YXIgZXZlbnRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHNsaWRlcy5lcShhY3RpdmVJbmRleCkudHJhbnNpdGlvbkVuZChmdW5jdGlvbiBvblRyYW5zaXRpb25FbmQoKSB7XG4gICAgICAgICAgaWYgKGV2ZW50VHJpZ2dlcmVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgLy8gaWYgKCEkKHRoaXMpLmhhc0NsYXNzKHN3aXBlci5wYXJhbXMuc2xpZGVBY3RpdmVDbGFzcykpIHJldHVybjtcbiAgICAgICAgICBldmVudFRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgICAgc3dpcGVyLmFuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHZhciB0cmlnZ2VyRXZlbnRzID0gWyd3ZWJraXRUcmFuc2l0aW9uRW5kJywgJ3RyYW5zaXRpb25lbmQnXTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaWdnZXJFdmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICR3cmFwcGVyRWwudHJpZ2dlcih0cmlnZ2VyRXZlbnRzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgdmFyIEVmZmVjdEZsaXAgPSB7XG4gICAgbmFtZTogJ2VmZmVjdC1mbGlwJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGZsaXBFZmZlY3Q6IHtcbiAgICAgICAgc2xpZGVTaGFkb3dzOiB0cnVlLFxuICAgICAgICBsaW1pdFJvdGF0aW9uOiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGZsaXBFZmZlY3Q6IHtcbiAgICAgICAgICBzZXRUcmFuc2xhdGU6IEZsaXAuc2V0VHJhbnNsYXRlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uOiBGbGlwLnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgYmVmb3JlSW5pdDogZnVuY3Rpb24gYmVmb3JlSW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2ZsaXAnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY2xhc3NOYW1lcy5wdXNoKCgoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSArIFwiZmxpcFwiKSk7XG4gICAgICAgIHN3aXBlci5jbGFzc05hbWVzLnB1c2goKChzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpICsgXCIzZFwiKSk7XG4gICAgICAgIHZhciBvdmVyd3JpdGVQYXJhbXMgPSB7XG4gICAgICAgICAgc2xpZGVzUGVyVmlldzogMSxcbiAgICAgICAgICBzbGlkZXNQZXJDb2x1bW46IDEsXG4gICAgICAgICAgc2xpZGVzUGVyR3JvdXA6IDEsXG4gICAgICAgICAgd2F0Y2hTbGlkZXNQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICBzcGFjZUJldHdlZW46IDAsXG4gICAgICAgICAgdmlydHVhbFRyYW5zbGF0ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci5wYXJhbXMsIG92ZXJ3cml0ZVBhcmFtcyk7XG4gICAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIub3JpZ2luYWxQYXJhbXMsIG92ZXJ3cml0ZVBhcmFtcyk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5lZmZlY3QgIT09ICdmbGlwJykgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmZsaXBFZmZlY3Quc2V0VHJhbnNsYXRlKCk7XG4gICAgICB9LFxuICAgICAgc2V0VHJhbnNpdGlvbjogZnVuY3Rpb24gc2V0VHJhbnNpdGlvbihkdXJhdGlvbikge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZWZmZWN0ICE9PSAnZmxpcCcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci5mbGlwRWZmZWN0LnNldFRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBDb3ZlcmZsb3cgPSB7XG4gICAgc2V0VHJhbnNsYXRlOiBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHZhciBzd2lwZXJXaWR0aCA9IHN3aXBlci53aWR0aDtcbiAgICAgIHZhciBzd2lwZXJIZWlnaHQgPSBzd2lwZXIuaGVpZ2h0O1xuICAgICAgdmFyIHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gICAgICB2YXIgJHdyYXBwZXJFbCA9IHN3aXBlci4kd3JhcHBlckVsO1xuICAgICAgdmFyIHNsaWRlc1NpemVzR3JpZCA9IHN3aXBlci5zbGlkZXNTaXplc0dyaWQ7XG4gICAgICB2YXIgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5jb3ZlcmZsb3dFZmZlY3Q7XG4gICAgICB2YXIgaXNIb3Jpem9udGFsID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpO1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IHN3aXBlci50cmFuc2xhdGU7XG4gICAgICB2YXIgY2VudGVyID0gaXNIb3Jpem9udGFsID8gLXRyYW5zZm9ybSArIChzd2lwZXJXaWR0aCAvIDIpIDogLXRyYW5zZm9ybSArIChzd2lwZXJIZWlnaHQgLyAyKTtcbiAgICAgIHZhciByb3RhdGUgPSBpc0hvcml6b250YWwgPyBwYXJhbXMucm90YXRlIDogLXBhcmFtcy5yb3RhdGU7XG4gICAgICB2YXIgdHJhbnNsYXRlID0gcGFyYW1zLmRlcHRoO1xuICAgICAgLy8gRWFjaCBzbGlkZSBvZmZzZXQgZnJvbSBjZW50ZXJcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBzbGlkZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyICRzbGlkZUVsID0gc2xpZGVzLmVxKGkpO1xuICAgICAgICB2YXIgc2xpZGVTaXplID0gc2xpZGVzU2l6ZXNHcmlkW2ldO1xuICAgICAgICB2YXIgc2xpZGVPZmZzZXQgPSAkc2xpZGVFbFswXS5zd2lwZXJTbGlkZU9mZnNldDtcbiAgICAgICAgdmFyIG9mZnNldE11bHRpcGxpZXIgPSAoKGNlbnRlciAtIHNsaWRlT2Zmc2V0IC0gKHNsaWRlU2l6ZSAvIDIpKSAvIHNsaWRlU2l6ZSkgKiBwYXJhbXMubW9kaWZpZXI7XG5cbiAgICAgICAgdmFyIHJvdGF0ZVkgPSBpc0hvcml6b250YWwgPyByb3RhdGUgKiBvZmZzZXRNdWx0aXBsaWVyIDogMDtcbiAgICAgICAgdmFyIHJvdGF0ZVggPSBpc0hvcml6b250YWwgPyAwIDogcm90YXRlICogb2Zmc2V0TXVsdGlwbGllcjtcbiAgICAgICAgLy8gdmFyIHJvdGF0ZVogPSAwXG4gICAgICAgIHZhciB0cmFuc2xhdGVaID0gLXRyYW5zbGF0ZSAqIE1hdGguYWJzKG9mZnNldE11bHRpcGxpZXIpO1xuXG4gICAgICAgIHZhciB0cmFuc2xhdGVZID0gaXNIb3Jpem9udGFsID8gMCA6IHBhcmFtcy5zdHJldGNoICogKG9mZnNldE11bHRpcGxpZXIpO1xuICAgICAgICB2YXIgdHJhbnNsYXRlWCA9IGlzSG9yaXpvbnRhbCA/IHBhcmFtcy5zdHJldGNoICogKG9mZnNldE11bHRpcGxpZXIpIDogMDtcblxuICAgICAgICAvLyBGaXggZm9yIHVsdHJhIHNtYWxsIHZhbHVlc1xuICAgICAgICBpZiAoTWF0aC5hYnModHJhbnNsYXRlWCkgPCAwLjAwMSkgeyB0cmFuc2xhdGVYID0gMDsgfVxuICAgICAgICBpZiAoTWF0aC5hYnModHJhbnNsYXRlWSkgPCAwLjAwMSkgeyB0cmFuc2xhdGVZID0gMDsgfVxuICAgICAgICBpZiAoTWF0aC5hYnModHJhbnNsYXRlWikgPCAwLjAwMSkgeyB0cmFuc2xhdGVaID0gMDsgfVxuICAgICAgICBpZiAoTWF0aC5hYnMocm90YXRlWSkgPCAwLjAwMSkgeyByb3RhdGVZID0gMDsgfVxuICAgICAgICBpZiAoTWF0aC5hYnMocm90YXRlWCkgPCAwLjAwMSkgeyByb3RhdGVYID0gMDsgfVxuXG4gICAgICAgIHZhciBzbGlkZVRyYW5zZm9ybSA9IFwidHJhbnNsYXRlM2QoXCIgKyB0cmFuc2xhdGVYICsgXCJweCxcIiArIHRyYW5zbGF0ZVkgKyBcInB4LFwiICsgdHJhbnNsYXRlWiArIFwicHgpICByb3RhdGVYKFwiICsgcm90YXRlWCArIFwiZGVnKSByb3RhdGVZKFwiICsgcm90YXRlWSArIFwiZGVnKVwiO1xuXG4gICAgICAgICRzbGlkZUVsLnRyYW5zZm9ybShzbGlkZVRyYW5zZm9ybSk7XG4gICAgICAgICRzbGlkZUVsWzBdLnN0eWxlLnpJbmRleCA9IC1NYXRoLmFicyhNYXRoLnJvdW5kKG9mZnNldE11bHRpcGxpZXIpKSArIDE7XG4gICAgICAgIGlmIChwYXJhbXMuc2xpZGVTaGFkb3dzKSB7XG4gICAgICAgICAgLy8gU2V0IHNoYWRvd3NcbiAgICAgICAgICB2YXIgJHNoYWRvd0JlZm9yZUVsID0gaXNIb3Jpem9udGFsID8gJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctbGVmdCcpIDogJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wJyk7XG4gICAgICAgICAgdmFyICRzaGFkb3dBZnRlckVsID0gaXNIb3Jpem9udGFsID8gJHNsaWRlRWwuZmluZCgnLnN3aXBlci1zbGlkZS1zaGFkb3ctcmlnaHQnKSA6ICRzbGlkZUVsLmZpbmQoJy5zd2lwZXItc2xpZGUtc2hhZG93LWJvdHRvbScpO1xuICAgICAgICAgIGlmICgkc2hhZG93QmVmb3JlRWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAkc2hhZG93QmVmb3JlRWwgPSAkKChcIjxkaXYgY2xhc3M9XFxcInN3aXBlci1zbGlkZS1zaGFkb3ctXCIgKyAoaXNIb3Jpem9udGFsID8gJ2xlZnQnIDogJ3RvcCcpICsgXCJcXFwiPjwvZGl2PlwiKSk7XG4gICAgICAgICAgICAkc2xpZGVFbC5hcHBlbmQoJHNoYWRvd0JlZm9yZUVsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRzaGFkb3dBZnRlckVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgJHNoYWRvd0FmdGVyRWwgPSAkKChcIjxkaXYgY2xhc3M9XFxcInN3aXBlci1zbGlkZS1zaGFkb3ctXCIgKyAoaXNIb3Jpem9udGFsID8gJ3JpZ2h0JyA6ICdib3R0b20nKSArIFwiXFxcIj48L2Rpdj5cIikpO1xuICAgICAgICAgICAgJHNsaWRlRWwuYXBwZW5kKCRzaGFkb3dBZnRlckVsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRzaGFkb3dCZWZvcmVFbC5sZW5ndGgpIHsgJHNoYWRvd0JlZm9yZUVsWzBdLnN0eWxlLm9wYWNpdHkgPSBvZmZzZXRNdWx0aXBsaWVyID4gMCA/IG9mZnNldE11bHRpcGxpZXIgOiAwOyB9XG4gICAgICAgICAgaWYgKCRzaGFkb3dBZnRlckVsLmxlbmd0aCkgeyAkc2hhZG93QWZ0ZXJFbFswXS5zdHlsZS5vcGFjaXR5ID0gKC1vZmZzZXRNdWx0aXBsaWVyKSA+IDAgPyAtb2Zmc2V0TXVsdGlwbGllciA6IDA7IH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgY29ycmVjdCBwZXJzcGVjdGl2ZSBmb3IgSUUxMFxuICAgICAgaWYgKFN1cHBvcnQucG9pbnRlckV2ZW50cyB8fCBTdXBwb3J0LnByZWZpeGVkUG9pbnRlckV2ZW50cykge1xuICAgICAgICB2YXIgd3MgPSAkd3JhcHBlckVsWzBdLnN0eWxlO1xuICAgICAgICB3cy5wZXJzcGVjdGl2ZU9yaWdpbiA9IGNlbnRlciArIFwicHggNTAlXCI7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXRUcmFuc2l0aW9uOiBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uKGR1cmF0aW9uKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIHN3aXBlci5zbGlkZXNcbiAgICAgICAgLnRyYW5zaXRpb24oZHVyYXRpb24pXG4gICAgICAgIC5maW5kKCcuc3dpcGVyLXNsaWRlLXNoYWRvdy10b3AsIC5zd2lwZXItc2xpZGUtc2hhZG93LXJpZ2h0LCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1ib3R0b20sIC5zd2lwZXItc2xpZGUtc2hhZG93LWxlZnQnKVxuICAgICAgICAudHJhbnNpdGlvbihkdXJhdGlvbik7XG4gICAgfSxcbiAgfTtcblxuICB2YXIgRWZmZWN0Q292ZXJmbG93ID0ge1xuICAgIG5hbWU6ICdlZmZlY3QtY292ZXJmbG93JyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGNvdmVyZmxvd0VmZmVjdDoge1xuICAgICAgICByb3RhdGU6IDUwLFxuICAgICAgICBzdHJldGNoOiAwLFxuICAgICAgICBkZXB0aDogMTAwLFxuICAgICAgICBtb2RpZmllcjogMSxcbiAgICAgICAgc2xpZGVTaGFkb3dzOiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICBVdGlscy5leHRlbmQoc3dpcGVyLCB7XG4gICAgICAgIGNvdmVyZmxvd0VmZmVjdDoge1xuICAgICAgICAgIHNldFRyYW5zbGF0ZTogQ292ZXJmbG93LnNldFRyYW5zbGF0ZS5iaW5kKHN3aXBlciksXG4gICAgICAgICAgc2V0VHJhbnNpdGlvbjogQ292ZXJmbG93LnNldFRyYW5zaXRpb24uYmluZChzd2lwZXIpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbjoge1xuICAgICAgYmVmb3JlSW5pdDogZnVuY3Rpb24gYmVmb3JlSW5pdCgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmIChzd2lwZXIucGFyYW1zLmVmZmVjdCAhPT0gJ2NvdmVyZmxvdycpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgc3dpcGVyLmNsYXNzTmFtZXMucHVzaCgoKHN3aXBlci5wYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzcykgKyBcImNvdmVyZmxvd1wiKSk7XG4gICAgICAgIHN3aXBlci5jbGFzc05hbWVzLnB1c2goKChzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpICsgXCIzZFwiKSk7XG5cbiAgICAgICAgc3dpcGVyLnBhcmFtcy53YXRjaFNsaWRlc1Byb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgc3dpcGVyLm9yaWdpbmFsUGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gc2V0VHJhbnNsYXRlKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZWZmZWN0ICE9PSAnY292ZXJmbG93JykgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLmNvdmVyZmxvd0VmZmVjdC5zZXRUcmFuc2xhdGUoKTtcbiAgICAgIH0sXG4gICAgICBzZXRUcmFuc2l0aW9uOiBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoc3dpcGVyLnBhcmFtcy5lZmZlY3QgIT09ICdjb3ZlcmZsb3cnKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIuY292ZXJmbG93RWZmZWN0LnNldFRyYW5zaXRpb24oZHVyYXRpb24pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHZhciBUaHVtYnMgPSB7XG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHJlZiA9IHN3aXBlci5wYXJhbXM7XG4gICAgICB2YXIgdGh1bWJzUGFyYW1zID0gcmVmLnRodW1icztcbiAgICAgIHZhciBTd2lwZXJDbGFzcyA9IHN3aXBlci5jb25zdHJ1Y3RvcjtcbiAgICAgIGlmICh0aHVtYnNQYXJhbXMuc3dpcGVyIGluc3RhbmNlb2YgU3dpcGVyQ2xhc3MpIHtcbiAgICAgICAgc3dpcGVyLnRodW1icy5zd2lwZXIgPSB0aHVtYnNQYXJhbXMuc3dpcGVyO1xuICAgICAgICBVdGlscy5leHRlbmQoc3dpcGVyLnRodW1icy5zd2lwZXIub3JpZ2luYWxQYXJhbXMsIHtcbiAgICAgICAgICB3YXRjaFNsaWRlc1Byb2dyZXNzOiB0cnVlLFxuICAgICAgICAgIHNsaWRlVG9DbGlja2VkU2xpZGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgVXRpbHMuZXh0ZW5kKHN3aXBlci50aHVtYnMuc3dpcGVyLnBhcmFtcywge1xuICAgICAgICAgIHdhdGNoU2xpZGVzUHJvZ3Jlc3M6IHRydWUsXG4gICAgICAgICAgc2xpZGVUb0NsaWNrZWRTbGlkZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChVdGlscy5pc09iamVjdCh0aHVtYnNQYXJhbXMuc3dpcGVyKSkge1xuICAgICAgICBzd2lwZXIudGh1bWJzLnN3aXBlciA9IG5ldyBTd2lwZXJDbGFzcyhVdGlscy5leHRlbmQoe30sIHRodW1ic1BhcmFtcy5zd2lwZXIsIHtcbiAgICAgICAgICB3YXRjaFNsaWRlc1Zpc2liaWxpdHk6IHRydWUsXG4gICAgICAgICAgd2F0Y2hTbGlkZXNQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICBzbGlkZVRvQ2xpY2tlZFNsaWRlOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgICAgICBzd2lwZXIudGh1bWJzLnN3aXBlckNyZWF0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3dpcGVyLnRodW1icy5zd2lwZXIuJGVsLmFkZENsYXNzKHN3aXBlci5wYXJhbXMudGh1bWJzLnRodW1ic0NvbnRhaW5lckNsYXNzKTtcbiAgICAgIHN3aXBlci50aHVtYnMuc3dpcGVyLm9uKCd0YXAnLCBzd2lwZXIudGh1bWJzLm9uVGh1bWJDbGljayk7XG4gICAgfSxcbiAgICBvblRodW1iQ2xpY2s6IGZ1bmN0aW9uIG9uVGh1bWJDbGljaygpIHtcbiAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgdmFyIHRodW1ic1N3aXBlciA9IHN3aXBlci50aHVtYnMuc3dpcGVyO1xuICAgICAgaWYgKCF0aHVtYnNTd2lwZXIpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgY2xpY2tlZEluZGV4ID0gdGh1bWJzU3dpcGVyLmNsaWNrZWRJbmRleDtcbiAgICAgIHZhciBjbGlja2VkU2xpZGUgPSB0aHVtYnNTd2lwZXIuY2xpY2tlZFNsaWRlO1xuICAgICAgaWYgKGNsaWNrZWRTbGlkZSAmJiAkKGNsaWNrZWRTbGlkZSkuaGFzQ2xhc3Moc3dpcGVyLnBhcmFtcy50aHVtYnMuc2xpZGVUaHVtYkFjdGl2ZUNsYXNzKSkgeyByZXR1cm47IH1cbiAgICAgIGlmICh0eXBlb2YgY2xpY2tlZEluZGV4ID09PSAndW5kZWZpbmVkJyB8fCBjbGlja2VkSW5kZXggPT09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgICB2YXIgc2xpZGVUb0luZGV4O1xuICAgICAgaWYgKHRodW1ic1N3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgICBzbGlkZVRvSW5kZXggPSBwYXJzZUludCgkKHRodW1ic1N3aXBlci5jbGlja2VkU2xpZGUpLmF0dHIoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JyksIDEwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNsaWRlVG9JbmRleCA9IGNsaWNrZWRJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICAgICAgaWYgKHN3aXBlci5zbGlkZXMuZXEoY3VycmVudEluZGV4KS5oYXNDbGFzcyhzd2lwZXIucGFyYW1zLnNsaWRlRHVwbGljYXRlQ2xhc3MpKSB7XG4gICAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICBzd2lwZXIuX2NsaWVudExlZnQgPSBzd2lwZXIuJHdyYXBwZXJFbFswXS5jbGllbnRMZWZ0O1xuICAgICAgICAgIGN1cnJlbnRJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldkluZGV4ID0gc3dpcGVyLnNsaWRlcy5lcShjdXJyZW50SW5kZXgpLnByZXZBbGwoKFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIHNsaWRlVG9JbmRleCArIFwiXFxcIl1cIikpLmVxKDApLmluZGV4KCk7XG4gICAgICAgIHZhciBuZXh0SW5kZXggPSBzd2lwZXIuc2xpZGVzLmVxKGN1cnJlbnRJbmRleCkubmV4dEFsbCgoXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgc2xpZGVUb0luZGV4ICsgXCJcXFwiXVwiKSkuZXEoMCkuaW5kZXgoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcmV2SW5kZXggPT09ICd1bmRlZmluZWQnKSB7IHNsaWRlVG9JbmRleCA9IG5leHRJbmRleDsgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbmV4dEluZGV4ID09PSAndW5kZWZpbmVkJykgeyBzbGlkZVRvSW5kZXggPSBwcmV2SW5kZXg7IH1cbiAgICAgICAgZWxzZSBpZiAobmV4dEluZGV4IC0gY3VycmVudEluZGV4IDwgY3VycmVudEluZGV4IC0gcHJldkluZGV4KSB7IHNsaWRlVG9JbmRleCA9IG5leHRJbmRleDsgfVxuICAgICAgICBlbHNlIHsgc2xpZGVUb0luZGV4ID0gcHJldkluZGV4OyB9XG4gICAgICB9XG4gICAgICBzd2lwZXIuc2xpZGVUbyhzbGlkZVRvSW5kZXgpO1xuICAgIH0sXG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoaW5pdGlhbCkge1xuICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICB2YXIgdGh1bWJzU3dpcGVyID0gc3dpcGVyLnRodW1icy5zd2lwZXI7XG4gICAgICBpZiAoIXRodW1ic1N3aXBlcikgeyByZXR1cm47IH1cblxuICAgICAgdmFyIHNsaWRlc1BlclZpZXcgPSB0aHVtYnNTd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJ1xuICAgICAgICA/IHRodW1ic1N3aXBlci5zbGlkZXNQZXJWaWV3RHluYW1pYygpXG4gICAgICAgIDogdGh1bWJzU3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuXG4gICAgICBpZiAoc3dpcGVyLnJlYWxJbmRleCAhPT0gdGh1bWJzU3dpcGVyLnJlYWxJbmRleCkge1xuICAgICAgICB2YXIgY3VycmVudFRodW1ic0luZGV4ID0gdGh1bWJzU3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgICAgICB2YXIgbmV3VGh1bWJzSW5kZXg7XG4gICAgICAgIGlmICh0aHVtYnNTd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgICAgICBpZiAodGh1bWJzU3dpcGVyLnNsaWRlcy5lcShjdXJyZW50VGh1bWJzSW5kZXgpLmhhc0NsYXNzKHRodW1ic1N3aXBlci5wYXJhbXMuc2xpZGVEdXBsaWNhdGVDbGFzcykpIHtcbiAgICAgICAgICAgIHRodW1ic1N3aXBlci5sb29wRml4KCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRodW1ic1N3aXBlci5fY2xpZW50TGVmdCA9IHRodW1ic1N3aXBlci4kd3JhcHBlckVsWzBdLmNsaWVudExlZnQ7XG4gICAgICAgICAgICBjdXJyZW50VGh1bWJzSW5kZXggPSB0aHVtYnNTd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZpbmQgYWN0dWFsIHRodW1icyBpbmRleCB0byBzbGlkZSB0b1xuICAgICAgICAgIHZhciBwcmV2VGh1bWJzSW5kZXggPSB0aHVtYnNTd2lwZXIuc2xpZGVzLmVxKGN1cnJlbnRUaHVtYnNJbmRleCkucHJldkFsbCgoXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgKHN3aXBlci5yZWFsSW5kZXgpICsgXCJcXFwiXVwiKSkuZXEoMCkuaW5kZXgoKTtcbiAgICAgICAgICB2YXIgbmV4dFRodW1ic0luZGV4ID0gdGh1bWJzU3dpcGVyLnNsaWRlcy5lcShjdXJyZW50VGh1bWJzSW5kZXgpLm5leHRBbGwoKFwiW2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4PVxcXCJcIiArIChzd2lwZXIucmVhbEluZGV4KSArIFwiXFxcIl1cIikpLmVxKDApLmluZGV4KCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwcmV2VGh1bWJzSW5kZXggPT09ICd1bmRlZmluZWQnKSB7IG5ld1RodW1ic0luZGV4ID0gbmV4dFRodW1ic0luZGV4OyB9XG4gICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG5leHRUaHVtYnNJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHsgbmV3VGh1bWJzSW5kZXggPSBwcmV2VGh1bWJzSW5kZXg7IH1cbiAgICAgICAgICBlbHNlIGlmIChuZXh0VGh1bWJzSW5kZXggLSBjdXJyZW50VGh1bWJzSW5kZXggPT09IGN1cnJlbnRUaHVtYnNJbmRleCAtIHByZXZUaHVtYnNJbmRleCkgeyBuZXdUaHVtYnNJbmRleCA9IGN1cnJlbnRUaHVtYnNJbmRleDsgfVxuICAgICAgICAgIGVsc2UgaWYgKG5leHRUaHVtYnNJbmRleCAtIGN1cnJlbnRUaHVtYnNJbmRleCA8IGN1cnJlbnRUaHVtYnNJbmRleCAtIHByZXZUaHVtYnNJbmRleCkgeyBuZXdUaHVtYnNJbmRleCA9IG5leHRUaHVtYnNJbmRleDsgfVxuICAgICAgICAgIGVsc2UgeyBuZXdUaHVtYnNJbmRleCA9IHByZXZUaHVtYnNJbmRleDsgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1RodW1ic0luZGV4ID0gc3dpcGVyLnJlYWxJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGh1bWJzU3dpcGVyLnZpc2libGVTbGlkZXNJbmRleGVzICYmIHRodW1ic1N3aXBlci52aXNpYmxlU2xpZGVzSW5kZXhlcy5pbmRleE9mKG5ld1RodW1ic0luZGV4KSA8IDApIHtcbiAgICAgICAgICBpZiAodGh1bWJzU3dpcGVyLnBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICAgICAgaWYgKG5ld1RodW1ic0luZGV4ID4gY3VycmVudFRodW1ic0luZGV4KSB7XG4gICAgICAgICAgICAgIG5ld1RodW1ic0luZGV4ID0gbmV3VGh1bWJzSW5kZXggLSBNYXRoLmZsb29yKHNsaWRlc1BlclZpZXcgLyAyKSArIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZXdUaHVtYnNJbmRleCA9IG5ld1RodW1ic0luZGV4ICsgTWF0aC5mbG9vcihzbGlkZXNQZXJWaWV3IC8gMikgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobmV3VGh1bWJzSW5kZXggPiBjdXJyZW50VGh1bWJzSW5kZXgpIHtcbiAgICAgICAgICAgIG5ld1RodW1ic0luZGV4ID0gbmV3VGh1bWJzSW5kZXggLSBzbGlkZXNQZXJWaWV3ICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGh1bWJzU3dpcGVyLnNsaWRlVG8obmV3VGh1bWJzSW5kZXgsIGluaXRpYWwgPyAwIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBY3RpdmF0ZSB0aHVtYnNcbiAgICAgIHZhciB0aHVtYnNUb0FjdGl2YXRlID0gMTtcbiAgICAgIHZhciB0aHVtYkFjdGl2ZUNsYXNzID0gc3dpcGVyLnBhcmFtcy50aHVtYnMuc2xpZGVUaHVtYkFjdGl2ZUNsYXNzO1xuXG4gICAgICBpZiAoc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3ID4gMSAmJiAhc3dpcGVyLnBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICB0aHVtYnNUb0FjdGl2YXRlID0gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgICAgfVxuXG4gICAgICB0aHVtYnNTd2lwZXIuc2xpZGVzLnJlbW92ZUNsYXNzKHRodW1iQWN0aXZlQ2xhc3MpO1xuICAgICAgaWYgKHRodW1ic1N3aXBlci5wYXJhbXMubG9vcCB8fCB0aHVtYnNTd2lwZXIucGFyYW1zLnZpcnR1YWwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aHVtYnNUb0FjdGl2YXRlOyBpICs9IDEpIHtcbiAgICAgICAgICB0aHVtYnNTd2lwZXIuJHdyYXBwZXJFbC5jaGlsZHJlbigoXCJbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XFxcIlwiICsgKHN3aXBlci5yZWFsSW5kZXggKyBpKSArIFwiXFxcIl1cIikpLmFkZENsYXNzKHRodW1iQWN0aXZlQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCB0aHVtYnNUb0FjdGl2YXRlOyBpJDEgKz0gMSkge1xuICAgICAgICAgIHRodW1ic1N3aXBlci5zbGlkZXMuZXEoc3dpcGVyLnJlYWxJbmRleCArIGkkMSkuYWRkQ2xhc3ModGh1bWJBY3RpdmVDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICB2YXIgVGh1bWJzJDEgPSB7XG4gICAgbmFtZTogJ3RodW1icycsXG4gICAgcGFyYW1zOiB7XG4gICAgICB0aHVtYnM6IHtcbiAgICAgICAgc3dpcGVyOiBudWxsLFxuICAgICAgICBzbGlkZVRodW1iQWN0aXZlQ2xhc3M6ICdzd2lwZXItc2xpZGUtdGh1bWItYWN0aXZlJyxcbiAgICAgICAgdGh1bWJzQ29udGFpbmVyQ2xhc3M6ICdzd2lwZXItY29udGFpbmVyLXRodW1icycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgIFV0aWxzLmV4dGVuZChzd2lwZXIsIHtcbiAgICAgICAgdGh1bWJzOiB7XG4gICAgICAgICAgc3dpcGVyOiBudWxsLFxuICAgICAgICAgIGluaXQ6IFRodW1icy5pbml0LmJpbmQoc3dpcGVyKSxcbiAgICAgICAgICB1cGRhdGU6IFRodW1icy51cGRhdGUuYmluZChzd2lwZXIpLFxuICAgICAgICAgIG9uVGh1bWJDbGljazogVGh1bWJzLm9uVGh1bWJDbGljay5iaW5kKHN3aXBlciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiB7XG4gICAgICBiZWZvcmVJbml0OiBmdW5jdGlvbiBiZWZvcmVJbml0KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgdmFyIHJlZiA9IHN3aXBlci5wYXJhbXM7XG4gICAgICAgIHZhciB0aHVtYnMgPSByZWYudGh1bWJzO1xuICAgICAgICBpZiAoIXRodW1icyB8fCAhdGh1bWJzLnN3aXBlcikgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLnRodW1icy5pbml0KCk7XG4gICAgICAgIHN3aXBlci50aHVtYnMudXBkYXRlKHRydWUpO1xuICAgICAgfSxcbiAgICAgIHNsaWRlQ2hhbmdlOiBmdW5jdGlvbiBzbGlkZUNoYW5nZSgpIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIGlmICghc3dpcGVyLnRodW1icy5zd2lwZXIpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN3aXBlci50aHVtYnMudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci50aHVtYnMuc3dpcGVyKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIudGh1bWJzLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgaWYgKCFzd2lwZXIudGh1bWJzLnN3aXBlcikgeyByZXR1cm47IH1cbiAgICAgICAgc3dpcGVyLnRodW1icy51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICBvYnNlcnZlclVwZGF0ZTogZnVuY3Rpb24gb2JzZXJ2ZXJVcGRhdGUoKSB7XG4gICAgICAgIHZhciBzd2lwZXIgPSB0aGlzO1xuICAgICAgICBpZiAoIXN3aXBlci50aHVtYnMuc3dpcGVyKSB7IHJldHVybjsgfVxuICAgICAgICBzd2lwZXIudGh1bWJzLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIHNldFRyYW5zaXRpb246IGZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIHN3aXBlciA9IHRoaXM7XG4gICAgICAgIHZhciB0aHVtYnNTd2lwZXIgPSBzd2lwZXIudGh1bWJzLnN3aXBlcjtcbiAgICAgICAgaWYgKCF0aHVtYnNTd2lwZXIpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRodW1ic1N3aXBlci5zZXRUcmFuc2l0aW9uKGR1cmF0aW9uKTtcbiAgICAgIH0sXG4gICAgICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuICAgICAgICB2YXIgc3dpcGVyID0gdGhpcztcbiAgICAgICAgdmFyIHRodW1ic1N3aXBlciA9IHN3aXBlci50aHVtYnMuc3dpcGVyO1xuICAgICAgICBpZiAoIXRodW1ic1N3aXBlcikgeyByZXR1cm47IH1cbiAgICAgICAgaWYgKHN3aXBlci50aHVtYnMuc3dpcGVyQ3JlYXRlZCAmJiB0aHVtYnNTd2lwZXIpIHtcbiAgICAgICAgICB0aHVtYnNTd2lwZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gU3dpcGVyIENsYXNzXG5cbiAgdmFyIGNvbXBvbmVudHMgPSBbXG4gICAgRGV2aWNlJDEsXG4gICAgU3VwcG9ydCQxLFxuICAgIEJyb3dzZXIkMSxcbiAgICBSZXNpemUsXG4gICAgT2JzZXJ2ZXIkMSxcbiAgICBWaXJ0dWFsJDEsXG4gICAgS2V5Ym9hcmQkMSxcbiAgICBNb3VzZXdoZWVsJDEsXG4gICAgTmF2aWdhdGlvbiQxLFxuICAgIFBhZ2luYXRpb24kMSxcbiAgICBTY3JvbGxiYXIkMSxcbiAgICBQYXJhbGxheCQxLFxuICAgIFpvb20kMSxcbiAgICBMYXp5JDEsXG4gICAgQ29udHJvbGxlciQxLFxuICAgIEExMXksXG4gICAgSGlzdG9yeSQxLFxuICAgIEhhc2hOYXZpZ2F0aW9uJDEsXG4gICAgQXV0b3BsYXkkMSxcbiAgICBFZmZlY3RGYWRlLFxuICAgIEVmZmVjdEN1YmUsXG4gICAgRWZmZWN0RmxpcCxcbiAgICBFZmZlY3RDb3ZlcmZsb3csXG4gICAgVGh1bWJzJDFcbiAgXTtcblxuICBpZiAodHlwZW9mIFN3aXBlci51c2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgU3dpcGVyLnVzZSA9IFN3aXBlci5DbGFzcy51c2U7XG4gICAgU3dpcGVyLmluc3RhbGxNb2R1bGUgPSBTd2lwZXIuQ2xhc3MuaW5zdGFsbE1vZHVsZTtcbiAgfVxuXG4gIFN3aXBlci51c2UoY29tcG9uZW50cyk7XG5cbiAgcmV0dXJuIFN3aXBlcjtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_swiper@4.5.1@swiper/dist/js/swiper.js\n");

/***/ }),

/***/ "./node_modules/_tsml@1.0.1@tsml/tsml.js":
/*!***********************************************!*\
  !*** ./node_modules/_tsml@1.0.1@tsml/tsml.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("function clean (s) {\n  return s.replace(/\\n\\r?\\s*/g, '')\n}\n\n\nmodule.exports = function tsml (sa) {\n  var s = ''\n    , i = 0\n\n  for (; i < arguments.length; i++)\n    s += clean(sa[i]) + (arguments[i + 1] || '')\n\n  return s\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3RzbWxAMS4wLjFAdHNtbC90c21sLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL190c21sQDEuMC4xQHRzbWwvdHNtbC5qcz8xZjkwIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGNsZWFuIChzKSB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1xcblxccj9cXHMqL2csICcnKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHNtbCAoc2EpIHtcbiAgdmFyIHMgPSAnJ1xuICAgICwgaSA9IDBcblxuICBmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICBzICs9IGNsZWFuKHNhW2ldKSArIChhcmd1bWVudHNbaSArIDFdIHx8ICcnKVxuXG4gIHJldHVybiBzXG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_tsml@1.0.1@tsml/tsml.js\n");

/***/ }),

/***/ "./node_modules/_ua-device@0.1.10@ua-device/index.js":
/*!***********************************************************!*\
  !*** ./node_modules/_ua-device@0.1.10@ua-device/index.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__(/*! ./lib/ua-device.js */ \"./node_modules/_ua-device@0.1.10@ua-device/lib/ua-device.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3VhLWRldmljZUAwLjEuMTBAdWEtZGV2aWNlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL191YS1kZXZpY2VAMC4xLjEwQHVhLWRldmljZS9pbmRleC5qcz83MDkwIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvdWEtZGV2aWNlLmpzJyk7Il0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_ua-device@0.1.10@ua-device/index.js\n");

/***/ }),

/***/ "./node_modules/_ua-device@0.1.10@ua-device/lib/ua-device.js":
/*!*******************************************************************!*\
  !*** ./node_modules/_ua-device@0.1.10@ua-device/lib/ua-device.js ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var UA = __webpack_require__(/*! ./useragent-base */ \"./node_modules/_ua-device@0.1.10@ua-device/lib/useragent-base.js\");\nmodule.exports = function (ua) {\n    var uaData = new UA(ua);\n    var match;\n    var tmpMatch;\n    // handle mobile device\n    if (uaData.device.type === 'mobile' || uaData.device.type === 'tablet') {\n\n        // get manufacturer through the key words\n        if (match = ua.match(/(ZTE|Samsung|Motorola|HTC|Coolpad|Huawei|Lenovo|LG|Sony Ericsson|Oppo|TCL|Vivo|Sony|Meizu|Nokia)/i)) {\n            uaData.device.manufacturer = match[1];\n            if (uaData.device.model && uaData.device.model.indexOf(match[1]) >= 0) {\n                uaData.device.model = uaData.device.model.replace(match[1], '');\n            }\n        }\n        // handle Apple\n        // 苹果就这3种iPod iPad iPhone\n        if (match = ua.match(/(iPod|iPad|iPhone)/i)) {\n            uaData.device.manufacturer = 'Apple';\n            uaData.device.model = match[1];\n        }\n        // handle Samsung\n        // 特殊型号可能以xxx-开头 或者直接空格接型号 兼容build结尾或直接)结尾\n        // Galaxy nexus才是三星 nexus是google手机\n        // 三星手机类型:galaxy xxx|SM-xxx|GT-xxx|SCH-xxx|SGH-xxx|SPH-xxx|SHW-xxx  若这些均未匹配到,则启用在中关村在线爬取到的机型白名单进行判断\n        else if (match = ua.match(/[-\\s](Galaxy[\\s-_]nexus|Galaxy[\\s-_]\\w*[\\s-_]\\w*|Galaxy[\\s-_]\\w*|SM-\\w*|GT-\\w*|s[cgp]h-\\w*|shw-\\w*|ATIV|i9070|omnia|s7568|A3000|A3009|A5000|A5009|A7000|A7009|A8000|C101|C1116|C1158|E400|E500F|E7000|E7009|G3139D|G3502|G3502i|G3508|G3508J|G3508i|G3509|G3509i|G3558|G3559|G3568V|G3586V|G3589W|G3606|G3608|G3609|G3812|G388F|G5108|G5108Q|G5109|G5306W|G5308W|G5309W|G550|G600|G7106|G7108|G7108V|G7109|G7200|G720NO|G7508Q|G7509|G8508S|G8509V|G9006V|G9006W|G9008V|G9008W|G9009D|G9009W|G9198|G9200|G9208|G9209|G9250|G9280|I535|I679|I739|I8190N|I8262|I879|I879E|I889|I9000|I9060|I9082|I9082C|I9082i|I9100|I9100G|I9108|I9128|I9128E|I9128i|I9152|I9152P|I9158|I9158P|I9158V|I9168|I9168i|I9190|I9192|I9195|I9195I|I9200|I9208|I9220|I9228|I9260|I9268|I9300|I9300i|I9305|I9308|I9308i|I939|I939D|I939i|I9500|I9502|I9505|I9507V|I9508|I9508V|I959|J100|J110|J5008|J7008|N7100|N7102|N7105|N7108|N7108D|N719|N750|N7505|N7506V|N7508V|N7509V|N900|N9002|N9005|N9006|N9008|N9008S|N9008V|N9009|N9100|N9106W|N9108V|N9109W|N9150|N916|N9200|P709|P709E|P729|S6358|S7278|S7278U|S7562C|S7562i|S7898i|b9388)[\\s\\)]/i)) {\n            uaData.device.manufacturer = 'Samsung';\n            // 解决移动联通等不同发行版导致的机型不同问题\n            // 特征:[A-Z]+[0-9]+[A-Z]*, 例如 G9006 G9006V 其实应该是G9006 另外三星只保留3位\n            uaData.device.model = match[1].replace(/Galaxy S VI/i, 'Galaxy S6')\n                .replace(/Galaxy S V/i, 'Galaxy S5')\n                .replace(/Galaxy S IV/i, 'Galaxy S4')\n                .replace(/Galaxy s III/i, 'Galaxy S3')\n                .replace(/Galaxy S II/i, 'Galaxy S2')\n                .replace(/Galaxy S I/i, 'Galaxy S1')\n                .replace(/([a-z]+[0-9]{3})[0-9]?[a-z]*/i, '$1');\n        }\n        // 针对三星已经匹配出的数据做处理\n        else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'samsung' && uaData.device.model) {\n            uaData.device.model = uaData.device.model.replace(/Galaxy S VI/i, 'Galaxy S6')\n                .replace(/Galaxy S V/i, 'Galaxy S5')\n                .replace(/Galaxy S IV/i, 'Galaxy S4')\n                .replace(/Galaxy s III/i, 'Galaxy S3')\n                .replace(/Galaxy S II/i, 'Galaxy S2')\n                .replace(/Galaxy S I/i, 'Galaxy S1')\n                .replace(/([a-z]+[0-9]{3})[0-9]?[a-z]*/i, '$1');\n        }\n        // handle Huawei\n        // 兼容build结尾或直接)结尾\n        // 华为机型特征:Huawei[\\s-_](\\w*[-_]?\\w*)  或者以 7D-  ALE-  CHE-等开头\n        else if (match = ua.match(/(Huawei[\\s-_](\\w*[-_]?\\w*)|\\s(7D-\\w*|ALE-\\w*|ATH-\\w*|CHE-\\w*|CHM-\\w*|Che1-\\w*|Che2-\\w*|D2-\\w*|G616-\\w*|G620S-\\w*|G621-\\w*|G660-\\w*|G750-\\w*|GRA-\\w*|Hol-\\w*|MT2-\\w*|MT7-\\w*|PE-\\w*|PLK-\\w*|SC-\\w*|SCL-\\w*|H60-\\w*|H30-\\w*)[\\s\\)])/i)) {\n            uaData.device.manufacturer = 'Huawei';\n            if (match[2]) {\n                uaData.device.model = match[2];\n            }\n            else if (match[3]) {\n                uaData.device.model = match[3];\n            }\n            // 解决移动联通等不同发行版导致的机型不同问题\n            // 特征:xxx-[A-Z][0-9]+ 例如  H30-L01  H30-L00  H30-L20  都应该是 H30-L\n            // h30-l  h30-h  h30-t 都是H30\n            if (match = uaData.device.model.match(/(\\w*)[\\s-_]+[a-z0-9]+/i)) {\n                uaData.device.model = match[1];\n            }\n        }\n        // handle Xiaomi\n        // 兼容build结尾或直接)结尾 以及特殊的HM处理方案(build/hm2013011)\n        // xiaomi手机类型: mi m1 m2 m3 hm 开头\n        // hongmi有特殊判断build/hm2015011\n        else if (match = ua.match(/;\\s(mi|m1|m2|m3|m4|hm)(\\s*\\w*)[\\s\\)]/i)) {\n            if (tmpMatch = ua.match(/(meitu|MediaPad)/i)) {\n                // 美图手机名字冒充小米 比如 meitu m4 mizhi\n                uaData.device.manufacturer = tmpMatch[1];\n                uaData.device.model = '';\n            }\n            // 若匹配出的 match[2]没空格 会出现很多例如 mizi mizhi miha 但也会出现mi3 minote之类 特殊处理下\n            else if (match[2].length > 0 && !((/\\s/).test(match[2]))) {\n                if (tmpMatch = match[2].match(/(\\d)/i)) {\n                    uaData.device.model = match[1] + '-' + tmpMatch[1];\n                }\n            }\n            else {\n                uaData.device.manufacturer = 'Xiaomi';\n                if (match[2] && match[2].length > 0) {\n                    match[2] = match[2].replace(/\\s/, '');\n                    uaData.device.model = (match[1].substr(match[1].length - 2) + '-' + match[2]).replace(/m(\\d)-/i, 'MI-$1');\n                }\n                else {\n                    uaData.device.model = (match[1].substr(match[1].length - 2)).replace(/m(\\d)/i, 'MI-$1');\n                }\n\n                // 解决移动联通等不同发行版导致的机型不同问题\n                // 特征:mi-3c,例如mi-4LTE mi-4 其实应该是 mi-4\n                if (/(mi|hm)(-\\d)/i.test(uaData.device.model)) {\n                    // 看看是不是 MI-3S  MI-4S....\n                    if (match = uaData.device.model.match(/(mi|hm)(-\\ds)/i)) {\n                        uaData.device.model = match[1] + match[2];\n                    }\n                    // 防止 MI-20150XX等滥竽充数成为MI-2\n                    else if (match = uaData.device.model.match(/(mi|hm)(-\\d{2})/i)) {\n                        uaData.device.model = match[1];\n                    }\n                    // 将mi-3c mi-3a mi-3w等合为mi-3\n                    else if (match = uaData.device.model.match(/(mi|hm)(-\\d)[A-Z]/i)) {\n                        uaData.device.model = match[1] + match[2];\n                    }\n                }\n                // 去除 mi-4g这样的东西\n                if (match = uaData.device.model.match(/(mi|hm)(-\\dg)/i)) {\n                    uaData.device.model = match[1];\n                }\n            }\n        }\n        else if (/build\\/HM\\d{0,7}\\)/i.test(ua)) {\n            uaData.device.manufacturer = 'Xiaomi';\n            uaData.device.model = 'HM';\n        }\n        else if (match = ua.match(/redmi\\s?(\\d+)?/i)) {\n            uaData.device.manufacturer = 'Xiaomi';\n            uaData.device.model = 'HM-' + match[1];\n        }\n        else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'xiaomi' && uaData.device.model) {\n            // 针对通过base库判断出数据时命名风格不同。特殊处理适配如下\n            if (match = uaData.device.model.match(/mi-one/i)) {\n                uaData.device.model = 'MI-1';\n            }\n            // mi 2\n            else if (match = uaData.device.model.match(/mi-two/i)) {\n                uaData.device.model = 'MI-2';\n            }\n            // 20150xxx2014501\n            else if (match = uaData.device.model.match(/\\d{6}/i)) {\n                uaData.device.model = '';\n            }\n            else if (match = uaData.device.model.match(/redmi/i)) {\n                uaData.device.model = uaData.device.model.toUpperCase().replace(/redmi/i, 'HM');\n            }\n            // m1 m2 m3 写法不标准 另外判断是否是 m1-s\n            else if (match = uaData.device.model.match(/(m\\d)[\\s-_](s?)/i)) {\n                uaData.device.model = match[1].replace(/m/, 'MI-') + match[2];\n            }\n            // mi-2w  mi-3w 等格式化为mi-2  mi-3\n            else if (match = uaData.device.model.match(/(hm|mi)[\\s-_](\\d?)[a-rt-z]/i)) {\n                if (tmpMatch = uaData.device.model.match(/(mi|hm)[\\s-_](note|pad)(\\d?s?)/i)) {\n                    uaData.device.model = tmpMatch[1] + '-' + tmpMatch[2] + tmpMatch[3];\n                }\n                else {\n                    uaData.device.model = match[2] ? match[1] + '-' + match[2] : match[1];\n                }\n            }\n            // 处理hm\n            else if (match = uaData.device.model.match(/hm/i)) {\n                // 判断是不是 hm-201xxx充数\n                if (match = uaData.device.model.match(/(hm)[\\s-_](\\d{2})/i)) {\n                    uaData.device.model = 'HM';\n                }\n                // 判断是不是 hm-2s hm-1s\n                else if (match = uaData.device.model.match(/(hm)[\\s-_](\\ds)/i)) {\n                    uaData.device.model = 'HM-' + match[2];\n                }\n                else if (match = uaData.device.model.match(/(hm)[\\s-_](\\d)[a-z]/i)) {\n                    uaData.device.model = 'HM-' + match[2];\n                }\n                else {\n                    uaData.device.model = 'HM';\n                }\n                // 过滤类似 2g 3g等数据\n                if (/hm-\\dg/.test(uaData.device.model)) {\n                    uaData.device.model = 'HM';\n                }\n            }\n        }\n        // handle Vivo\n        // 兼容build结尾或直接)结尾\n        // vivo机型特征: Vivo[\\s-_](\\w*)  或者以 E1  S11t  S7t 等开头\n        else if (match = ua.match(/(vivo[\\s-_](\\w*)|\\s(E1\\w?|E3\\w?|E5\\w?|V1\\w?|V2\\w?|S11\\w?|S12\\w?|S1\\w?|S3\\w?|S6\\w?|S7\\w?|S9\\w?|X1\\w?|X3\\w?|X520\\w?|X5\\w?|X5Max|X5Max+|X5Pro|X5SL|X710F|X710L|Xplay|Xshot|Xpaly3S|Y11\\w?|Y11i\\w?|Y11i\\w?|Y13\\w?|Y15\\w?|Y17\\w?|Y18\\w?|Y19\\w?|Y1\\w?|Y20\\w?|Y22\\w?|Y22i\\w?|Y23\\w?|Y27\\w?|Y28\\w?|Y29\\w?|Y33\\w?|Y37\\w?|Y3\\w?|Y613\\w?|Y622\\w?|Y627\\w?|Y913\\w?|Y923\\w?|Y927\\w?|Y928\\w?|Y929\\w?|Y937\\w?)[\\s\\)])/i)) {\n            uaData.device.manufacturer = 'Vivo';\n            uaData.device.model = match[1];\n            // 首先剔除 viv-  vivo-  bbg- 等打头的内容\n            uaData.device.model = uaData.device.model.replace(/(viv[\\s-_]|vivo[\\s-_]|bbg[\\s-_])/i, '');\n            // 解决移动联通等不同发行版导致的机型不同问题\n            // 特征:[A-Z][0-9]+[A-Z] 例如  X5F X5L X5M X5iL 都应该是 X5\n            if (match = uaData.device.model.match(/([a-z]+[0-9]+)i?[a-z]?[\\s-_]?/i)) {\n                uaData.device.model = match[1];\n            }\n        }\n        // handle Oppo\n        else if (match = ua.match(/(Oppo[\\s-_](\\w*)|\\s(1100|1105|1107|3000|3005|3007|6607|A100|A103|A105|A105K|A109|A109K|A11|A113|A115|A115K|A121|A125|A127|A129|A201|A203|A209|A31|A31c|A31t|A31u|A51kc|A520|A613|A615|A617|E21W|Find|Mirror|N5110|N5117|N5207|N5209|R2010|R2017|R6007|R7005|R7007|R7c|R7t|R8000|R8007|R801|R805|R807|R809T|R8107|R8109|R811|R811W|R813T|R815T|R815W|R817|R819T|R8200|R8205|R8207|R821T|R823T|R827T|R830|R830S|R831S|R831T|R833T|R850|Real|T703|U2S|U521|U525|U529|U539|U701|U701T|U705T|U705W|X9000|X9007|X903|X905|X9070|X9077|X909|Z101|R829T)[\\s\\)])/i)) {\n            uaData.device.manufacturer = 'Oppo';\n            if (match[2]) {\n                uaData.device.model = match[2];\n            }\n            else if (match[3]) {\n                uaData.device.model = match[3];\n            }\n            // 解决移动联通等不同发行版导致的机型不同问题\n            // 特征:[A-Z][0-9]+[A-Z] 例如  A31c A31s 都应该是 A31\n            // 对 Plus 做特殊处理\n            if (match = uaData.device.model.match(/([a-z]+[0-9]+)-?(plus)/i)) {\n                uaData.device.model = match[1] + '-' + match[2];\n            }\n            else if (match = uaData.device.model.match(/(\\w*-?[a-z]+[0-9]+)/i)) {\n                uaData.device.model = match[1];\n            }\n        }\n        else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'oppo' && uaData.device.model) {\n            // 针对base库的数据做数据格式化处理\n            // 解决移动联通等不同发行版导致的机型不同问题\n            // 特征:[A-Z][0-9]+[A-Z] 例如  A31c A31s 都应该是 A31\n            // 对 Plus 做特殊处理\n            if (match = uaData.device.model.match(/([a-z]+[0-9]+)-?(plus)/i)) {\n                uaData.device.model = match[1] + '-' + match[2];\n            }\n            else if (match = uaData.device.model.match(/(\\w*-?[a-z]+[0-9]+)/i)) {\n                uaData.device.model = match[1];\n            }\n        }\n        // handle Lenovo\n        // 兼容build结尾或直接)结尾 兼容Lenovo-xxx/xxx以及Leveno xxx build等\n        else if (match = ua.match(/(Lenovo[\\s-_](\\w*[-_]?\\w*)|\\s(A3580|A3860|A5500|A5600|A5860|A7600|A806|A800|A808T|A808T-I|A936|A938t|A788t|K30-E|K30-T|K30-W|K50-T3s|K50-T5|K80M|K910|K910e|K920|S90-e|S90-t|S90-u|S968T|X2-CU|X2-TO|Z90-3|Z90-7)[\\s\\)])/i)) {\n            uaData.device.manufacturer = 'Lenovo';\n            if (match[2]) {\n                uaData.device.model = match[2];\n            }\n            else if (match[3]) {\n                uaData.device.model = match[3];\n            }\n            // 解决移动联通等不同发行版导致的机型不同问题\n            // 特征:[A-Z][0-9]+[A-Z] 例如  A360t A360 都应该是 A360\n            if (match = uaData.device.model.match(/([a-z]+[0-9]+)/i)) {\n                uaData.device.model = match[1];\n            }\n        }\n        // handle coolpad\n        else if (match = ua.match(/(Coolpad[\\s-_](\\w*)|\\s(7295C|7298A|7620L|8908|8085|8970L|9190L|Y80D)[\\s\\)])/i)) {\n            uaData.device.manufacturer = 'Coolpad';\n            if (match[2]) {\n                uaData.device.model = match[2];\n            }\n            else if (match[3]) {\n                uaData.device.model = match[3];\n            }\n\n            // 解决移动联通等不同发行版导致的机型不同问题\n            // 特征:[A-Z][0-9]+[A-Z] 例如  8297-t01 8297-c01 8297w 都应该是 8297\n            if (match = uaData.device.model.match(/([a-z]?[0-9]+)/i)) {\n                uaData.device.model = match[1];\n            }\n        }\n        else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'coolpad' && uaData.device.model) {\n            // base 库适配\n            // 解决移动联通等不同发行版导致的机型不同问题\n            // 特征:[A-Z][0-9]+[A-Z] 例如  8297-t01 8297-c01 8297w 都应该是 8297\n            if (match = uaData.device.model.match(/([a-z]?[0-9]+)/i)) {\n                uaData.device.model = match[1];\n            }\n        }\n        // handle meizu\n        else if (match = ua.match(/\\s(mx\\d*\\w*|mz-(\\w*))\\s(\\w*)\\s*\\w*\\s*build/i)) {\n            uaData.device.manufacturer = 'Meizu';\n            var tmpModel = match[2] ? match[2] : match[1];\n            if (match[3]) {\n                uaData.device.model = tmpModel + '-' + match[3];\n            }\n            else {\n                uaData.device.model = tmpModel + '';\n            }\n        }\n        else if (match = ua.match(/M463C|M35\\d/i)) {\n            uaData.device.manufacturer = 'Meizu';\n            uaData.device.model = match[1];\n        }\n        // handle htc\n        else if (match = ua.match(/(Htc[-_\\s](\\w*)|\\s(601e|606w|608t|609d|610t|6160|619d|620G|626d|626s|626t|626w|709d|801e|802d|802t|802w|809D|816d|816e|816t|816v|816w|826d|826s|826t|826w|828w|901e|919d|A310e|A50AML|A510e|A620d|A620e|A620t|A810e|A9191|Aero|C620d|C620e|C620t|D316d|D516d|D516t|D516w|D820mt|D820mu|D820t|D820ts|D820u|D820us|E9pt|E9pw|E9sw|E9t|HD7S|M8Et|M8Sd|M8St|M8Sw|M8d|M8e|M8s|M8si|M8t|M8w|M9W|M9ew|Phablet|S510b|S510e|S610d|S710d|S710e|S720e|S720t|T327t|T328d|T328t|T328w|T329d|T329t|T329w|T528d|T528t|T528w|T8698|WF5w|X315e|X710e|X715e|X720d|X920e|Z560e|Z710e|Z710t|Z715e)[\\s\\)])/)) {\n            uaData.device.manufacturer = 'Htc';\n            uaData.device.model = match[1];\n        }\n        // handle Gionee\n        else if (match = ua.match(/(Gionee[\\s-_](\\w*)|\\s(GN\\d+\\w*)[\\s\\)])/i)) {\n            uaData.device.manufacturer = 'Gionee';\n            if (match[2]) {\n                uaData.device.model = match[2];\n            }\n            else if (match[3]) {\n                uaData.device.model = match[3];\n            }\n        }\n        // handle LG\n        else if (match = ua.match(/(LG[-_](\\w*)|\\s(D728|D729|D802|D855|D856|D857|D858|D859|E985T|F100L|F460|H778|H818|H819|P895|VW820)[\\s\\)])/i)) {\n            uaData.device.manufacturer = 'Lg';\n            if (match[2]) {\n                uaData.device.model = match[2];\n            }\n            else if (match[3]) {\n                uaData.device.model = match[3];\n            }\n        }\n        // handle tcl\n        else if (match = ua.match(/(Tcl[\\s-_](\\w*)|\\s(H916T|P588L|P618L|P620M|P728M)[\\s\\)])/)) {\n            uaData.device.manufacturer = 'Tcl';\n            uaData.device.model = match[1];\n        }\n        // ZTE\n        else if (match = ua.match(/(V9180|N918)/i)) {\n            uaData.device.manufacturer = 'Zte';\n            uaData.device.model = match[1];\n        }\n        else if (uaData.device.manufacturer && uaData.device.manufacturer.toLowerCase() === 'zte' && uaData.device.model) {\n            // base 库适配\n            // 解决移动联通等不同发行版导致的机型不同问题\n            // 特征:[A-Z][0-9]+[A-Z] 例如  Q505T Q505u 都应该是 Q505\n            if (match = uaData.device.model.match(/([a-z]?[0-9]+)/i)) {\n                uaData.device.model = match[1];\n            }\n        }\n        // UIMI\n        else if (match = ua.match(/(UIMI\\w*|umi\\w*)[\\s-_](\\w*)\\s*\\w*\\s*build/i)) {\n            uaData.device.manufacturer = 'Uimi';\n            if (match[2]) {\n                uaData.device.model = match[1] + '-' + match[2];\n            }\n            else {\n                uaData.device.model = match[1] + '';\n            }\n        }\n        // eton\n        else if (match = ua.match(/eton[\\s-_](\\w*)/i)) {\n            uaData.device.manufacturer = 'Eton';\n            uaData.device.model = match[1];\n        }\n        // Smartisan\n        else if (match = ua.match(/(SM705|SM701|YQ601|YQ603)/i)) {\n            uaData.device.manufacturer = 'Smartisan';\n            uaData.device.model = ({\n                SM705: 'T1',\n                SM701: 'T1',\n                YQ601: 'U1',\n                YQ603: 'U1'\n            })[match[1]] || match[1];\n        }\n        // handle Asus\n        else if (match = ua.match(/(Asus[\\s-_](\\w*)|\\s(A500CG|A500KL|A501CG|A600CG|PF400CG|PF500KL|T001|X002|X003|ZC500TG|ZE550ML|ZE551ML)[\\s\\)])/i)) {\n            uaData.device.manufacturer = 'Asus';\n            if (match[2]) {\n                uaData.device.model = match[2];\n            }\n            else if (match[3]) {\n                uaData.device.model = match[3];\n            }\n        }\n        // handle nubia\n        else if (match = ua.match(/(Nubia[-_\\s](\\w*)|(NX501|NX505J|NX506J|NX507J|NX503A|nx\\d+\\w*)[\\s\\)])/i)) {\n            uaData.device.manufacturer = 'Nubia';\n            if (match[2]) {\n                uaData.device.model = match[2];\n            }\n            else if (match[3]) {\n                uaData.device.model = match[3];\n            }\n        }\n        // handle haier\n        else if (match = ua.match(/(HT-\\w*)|Haier[\\s-_](\\w*-?\\w*)/i)) {\n            uaData.device.manufacturer = 'Haier';\n            if (match[1]) {\n                uaData.device.model = match[1];\n            }\n            else if (match[2]) {\n                uaData.device.model = match[2];\n            }\n        }\n        // tianyu\n        else if (match = ua.match(/K-Touch[\\s-_](tou\\s?ch\\s?(\\d)|\\w*)/i)) {\n            uaData.device.manufacturer = 'K-Touch';\n            if (match[2]) {\n                uaData.device.model = 'Ktouch' + match[2];\n            }\n            else {\n                uaData.device.model = match[1];\n            }\n        }\n\n        // DOOV\n        else if (match = ua.match(/Doov[\\s-_](\\w*)/i)) {\n            uaData.device.manufacturer = 'Doov';\n            uaData.device.model = match[1];\n        }\n        // coobee\n        else if (/koobee/i.test(ua)) {\n            uaData.device.manufacturer = 'koobee';\n        }\n\n        // sony\n        else if (/C69/i.test(ua)) {\n            uaData.device.manufacturer = 'Sony';\n        }\n\n        // haojixing\n        else if (/N787|N818S/i.test(ua)) {\n            uaData.device.manufacturer = 'Haojixing';\n        }\n\n        // haisense\n        else if (match = ua.match(/(hs-|Hisense[\\s-_])(\\w*)/i)) {\n            uaData.device.manufacturer = 'Hisense';\n            uaData.device.model = match[2];\n        }\n\n        // format the style of manufacturer\n        if (uaData.device.manufacturer) {\n            uaData.device.manufacturer = uaData.device.manufacturer.substr(0, 1).toUpperCase() + uaData.device.manufacturer.substr(1).toLowerCase();\n        }\n        // format the style of model\n        if (uaData.device.model) {\n            uaData.device.model = uaData.device.model.toUpperCase().replace(/-+|_+|\\s+/g, ' ');\n            uaData.device.model = uaData.device.model.match(/\\s*(\\w*\\s*\\w*)/)[1].replace(/\\s+/, '-');\n\n            // 针对三星、华为做去重的特殊处理\n            if (uaData.device.manufacturer === 'Samsung') {\n                uaData.device.model = ({\n                    'SCH-I95': 'GT-I950',\n                    'SCH-I93': 'GT-I930',\n                    'SCH-I86': 'GT-I855',\n                    'SCH-N71': 'GT-N710',\n                    'SCH-I73': 'GT-S789',\n                    'SCH-P70': 'GT-I915'\n                })[uaData.device.model] || uaData.device.model;\n            }\n            else if (uaData.device.manufacturer === 'Huawei') {\n                uaData.device.model = ({\n                    CHE1: 'CHE',\n                    CHE2: 'CHE',\n                    G620S: 'G621',\n                    C8817D: 'G621'\n                })[uaData.device.model] || uaData.device.model;\n            }\n        }\n\n        // 针对xiaomi 的部分数据没有格式化成功,格式化1次\n        if (uaData.device.manufacturer && uaData.device.manufacturer === 'Xiaomi') {\n            if (match = uaData.device.model.match(/(hm|mi)-(note)/i)) {\n                uaData.device.model = match[1] + '-' + match[2];\n            }\n            else if (match = uaData.device.model.match(/(hm|mi)-(\\ds?)/i)) {\n                uaData.device.model = match[1] + '-' + match[2];\n            }\n            else if (match = uaData.device.model.match(/(hm|mi)-(\\d)[a-rt-z]/i)) {\n                uaData.device.model = match[1] + '-' + match[2];\n            }\n        }\n    }\n    // handle browser\n    // if (!uaData.browser.name) {\n    // ua = ua.toLowerCase();\n    if (uaData.device.type === 'desktop') {\n        /*\n         * 360 security Explorer\n         */\n        if (match = /360se(?:[ \\/]([\\w.]+))?/i.exec(ua)) {\n            uaData.browser.name = '360 security Explorer';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n        /**\n         * the world\n         */\n        else if (match = /the world(?:[ \\/]([\\w.]+))?/i.exec(ua)) {\n            uaData.browser.name = 'the world';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n        /**\n         * tencenttraveler\n         */\n        else if (match = /tencenttraveler ([\\w.]+)/i.exec(ua)) {\n            uaData.browser.name = 'tencenttraveler';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n        /**\n         * LBBROWSER\n         */\n        else if (match = /LBBROWSER/i.exec(ua)) {\n            uaData.browser.name = 'LBBROWSER';\n        }\n    }\n    else if (uaData.device.type === 'mobile' || uaData.device.type === 'tablet') {\n        /**\n         * BaiduHD\n         */\n        if (match = /BaiduHD\\s+([\\w.]+)/i.exec(ua)) {\n            uaData.browser.name = 'BaiduHD';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n        /**\n         * 360 Browser\n         */\n        else if (match = /360.s*aphone\\s*browser\\s*\\(version\\s*([\\w.]+)\\)/i.exec(ua)) {\n            uaData.browser.name = '360 Browser';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n        /**\n         * Baidu Browser\n         */\n        else if (match = /flyflow\\/([\\w.]+)/i.exec(ua)) {\n            uaData.browser.name = 'Baidu Browser';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n\n        /**\n         * Baidu HD\n         */\n        else if (match = /baiduhd ([\\w.]+)/i.exec(ua)) {\n            uaData.browser.name = 'Baidu HD';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n\n        /**\n         * baidubrowser\n         */\n        else if (match = /baidubrowser\\/([\\d\\.]+)\\s/i.exec(ua)) {\n            uaData.browser.name = 'baidubrowser';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n\n        /**\n         * LieBaoFast\n         */\n        else if (match = /LieBaoFast\\/([\\w.]+)/i.exec(ua)) {\n            uaData.browser.name = 'LieBao Fast';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n\n        /**\n         * LieBao\n         */\n        else if (match = /LieBao\\/([\\w.]+)/i.exec(ua)) {\n            uaData.browser.name = 'LieBao';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n\n        /**\n         * SOUGOU\n         */\n        else if (match = /Sogou\\w+\\/([0-9\\.]+)/i.exec(ua)) {\n            uaData.browser.name = 'SogouMobileBrowser';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n\n        /**\n         * 百度国际\n         */\n        else if (match = /bdbrowser\\w+\\/([0-9\\.]+)/i.exec(ua)) {\n            uaData.browser.name = '百度国际';\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n\n        /**\n         * Android Chrome Browser\n         */\n        else if (uaData.os.name === 'Android' && /safari/i.test(ua) && (match = /chrome\\/([0-9\\.]+)/i.exec(ua))) {\n            if (tmpMatch = ua.match(/\\s+(\\w+Browser)\\/?([\\d\\.]*)/)) {\n                uaData.browser.name = tmpMatch[1];\n                if (tmpMatch[2]) {\n                    uaData.browser.version = {original: tmpMatch[2]};\n                } else {\n                    uaData.browser.version = {original: match[1]};\n                }\n            } else {\n                uaData.browser.name = 'Android Chrome';\n                uaData.browser.version = {original: match[1]};\n            }\n        }\n\n        /**\n         * Android Google Browser\n         */\n        else if (uaData.os.name === 'Android' && /safari/i.test(ua) && (match = /version\\/([0-9\\.]+)/i.exec(ua))) {\n            if (tmpMatch = ua.match(/\\s+(\\w+Browser)\\/?([\\d\\.]*)/)) {\n                uaData.browser.name = tmpMatch[1];\n                if (tmpMatch[2]) {\n                    uaData.browser.version = {original: tmpMatch[2]};\n                } else {\n                    uaData.browser.version = {original: match[1]};\n                }\n            } else {\n                uaData.browser.name = 'Android Browser';\n                uaData.browser.version = {original: match[1]};\n            }\n        }\n\n        /**\n         * 'Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206' belongs to Safari\n         */\n        else if (/(ipad|iphone).* applewebkit\\/.* mobile/i.test(ua)) {\n            uaData.browser.name = 'Safari';\n        }\n    }\n    if (match = ua.match(/baiduboxapp\\/?([\\d\\.]*)/i)) {\n        uaData.browser.name = '百度框';\n        if (match[1]) {\n            uaData.browser.version = {\n                original: match[1]\n            };\n        }\n        // uaData.browser.name = 'baidu box';\n    }\n    else if (/BaiduLightAppRuntime/i.test(ua)) {\n        uaData.browser.name = '轻应用runtime';\n        // uaData.browser.name = 'qing runtime';\n    }\n    else if (/Weibo/i.test(ua)) {\n        uaData.browser.name = '微博';\n        // uaData.browser.name = 'weibo';\n    }\n    else if (/MQQ/i.test(ua)) {\n        uaData.browser.name = '手机QQ';\n        // uaData.browser.name = 'mobile qq';\n    }\n    else if (/hao123/i.test(ua)) {\n        uaData.browser.name = 'hao123';\n    }\n    // }\n    if (match = /MicroMessenger\\/([\\w.]+)/i.exec(ua)) {\n        uaData.browser.name = '微信';\n        var tmpVersion = (match[1]).replace(/_/g, '.');\n        tmpMatch = /(\\d+\\.\\d+\\.\\d+\\.\\d+)/.exec(tmpVersion);\n        if(tmpMatch) {\n            tmpVersion = tmpMatch[1];\n        }\n        uaData.browser.version = {\n            original: tmpVersion\n        };\n    }\n    if (match = /UCBrowser\\/([\\w.]+)/i.exec(ua)) {\n        uaData.browser.name = 'UC Browser';\n        uaData.browser.version = {\n            original: match[1]\n        };\n    }\n    if (match = /OPR\\/([\\w.]+)/i.exec(ua)) {\n        uaData.browser.name = 'Opera';\n        uaData.browser.version = {\n            original: match[1]\n        };\n    } else if (match = /OPiOS\\/([\\w.]+)/i.exec(ua)) {\n        uaData.browser.name = 'Opera';\n        uaData.browser.version = {\n            original: match[1]\n        };\n    }\n    // IE 11\n    else if (/Trident\\/7/i.test(ua) && /rv:11/i.test(ua)) {\n        uaData.browser.name = 'Internet Explorer';\n        uaData.browser.version = {\n            major: '11',\n            original: '11'\n        };\n    }\n    // Microsoft Edge\n    else if (/Edge\\/12/i.test(ua) && /Windows Phone|Windows NT/i.test(ua)) {\n        uaData.browser.name = 'Microsoft Edge';\n        uaData.browser.version = {\n            major: '12',\n            original: '12'\n        };\n    }\n    // miui browser\n    else if (match = /miuibrowser\\/([\\w.]+)/i.exec(ua)) {\n        uaData.browser.name = 'miui browser';\n        uaData.browser.version = {\n            original: match[1]\n        };\n    }\n    // Safari\n    if (!uaData.browser.name) {\n        if (match = /Safari\\/([\\w.]+)/i.exec(ua) && /Version/i.test(ua)) {\n            uaData.browser.name = 'Safari';\n        }\n    }\n    if (uaData.browser.name && !uaData.browser.version) {\n        if (match = /Version\\/([\\w.]+)/i.exec(ua)) {\n            uaData.browser.version =  {\n                original: match[1]\n            };\n        }\n    }\n\n    // if (uaData.os.name === 'Windows' && uaData.os.version) {\n    //  // Windows 8.1\n    //  if (uaData.os.version.alias === 'NT 6.3') {\n    //      uaData.os.version.alias = '8.1';\n    //  }\n    // }\n    // handle os\n    if (uaData.os.name === 'Windows' || /Windows/i.test(ua)) {\n        uaData.os.name = 'Windows';\n        if (/NT 6.3/i.test(ua)) {\n            uaData.os.version = {\n                alias: '8.1',\n                original: '8.1'\n            };\n        }\n        else if (/NT 6.4/i.test(ua) || /NT 10.0/i.test(ua)) {\n            uaData.os.version = {\n                alias: '10',\n                original: '10'\n            };\n        }\n    }\n    else if (uaData.os.name === 'Mac OS X') {\n        uaData.os.name = 'Mac OS X';\n        if (match = /Mac OS X[\\s\\_\\-\\/](\\d+[\\.\\-\\_]\\d+[\\.\\-\\_]?\\d*)/i.exec(ua)) {\n            uaData.os.version = {\n                alias: match[1].replace(/_/g, '.'),\n                original: match[1].replace(/_/g, '.')\n            };\n        }\n        else {\n            uaData.os.version = {\n                alias: '',\n                original: ''\n            };\n        }\n    }\n    else if (/Android/i.test(uaData.os.name)) {\n        if (match = ua.match(/Android[\\s\\_\\-\\/i686]?[\\s\\_\\-\\/](\\d+[\\.\\-\\_]\\d+[\\.\\-\\_]?\\d*)/i)) {\n            uaData.os.version = {\n                alias: match[1],\n                original: match[1]\n            };\n        }\n    }\n    return uaData;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3VhLWRldmljZUAwLjEuMTBAdWEtZGV2aWNlL2xpYi91YS1kZXZpY2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3VhLWRldmljZUAwLjEuMTBAdWEtZGV2aWNlL2xpYi91YS1kZXZpY2UuanM/Zjk2NiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgVUEgPSByZXF1aXJlKCcuL3VzZXJhZ2VudC1iYXNlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1YSkge1xuICAgIHZhciB1YURhdGEgPSBuZXcgVUEodWEpO1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgdG1wTWF0Y2g7XG4gICAgLy8gaGFuZGxlIG1vYmlsZSBkZXZpY2VcbiAgICBpZiAodWFEYXRhLmRldmljZS50eXBlID09PSAnbW9iaWxlJyB8fCB1YURhdGEuZGV2aWNlLnR5cGUgPT09ICd0YWJsZXQnKSB7XG5cbiAgICAgICAgLy8gZ2V0IG1hbnVmYWN0dXJlciB0aHJvdWdoIHRoZSBrZXkgd29yZHNcbiAgICAgICAgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhaVEV8U2Ftc3VuZ3xNb3Rvcm9sYXxIVEN8Q29vbHBhZHxIdWF3ZWl8TGVub3ZvfExHfFNvbnkgRXJpY3Nzb258T3Bwb3xUQ0x8Vml2b3xTb255fE1laXp1fE5va2lhKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIGlmICh1YURhdGEuZGV2aWNlLm1vZGVsICYmIHVhRGF0YS5kZXZpY2UubW9kZWwuaW5kZXhPZihtYXRjaFsxXSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSB1YURhdGEuZGV2aWNlLm1vZGVsLnJlcGxhY2UobWF0Y2hbMV0sICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgQXBwbGVcbiAgICAgICAgLy8g6Iu55p6c5bCx6L+ZM+enjWlQb2QgaVBhZCBpUGhvbmVcbiAgICAgICAgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhpUG9kfGlQYWR8aVBob25lKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnQXBwbGUnO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBTYW1zdW5nXG4gICAgICAgIC8vIOeJueauiuWei+WPt+WPr+iDveS7pXh4eC3lvIDlpLQg5oiW6ICF55u05o6l56m65qC85o6l5Z6L5Y+3IOWFvOWuuWJ1aWxk57uT5bC+5oiW55u05o6lKee7k+WwvlxuICAgICAgICAvLyBHYWxheHkgbmV4dXPmiY3mmK/kuInmmJ8gbmV4dXPmmK9nb29nbGXmiYvmnLpcbiAgICAgICAgLy8g5LiJ5pif5omL5py657G75Z6L77yaZ2FsYXh5IHh4eHxTTS14eHh8R1QteHh4fFNDSC14eHh8U0dILXh4eHxTUEgteHh4fFNIVy14eHggIOiLpei/meS6m+Wdh+acquWMuemFjeWIsO+8jOWImeWQr+eUqOWcqOS4reWFs+adkeWcqOe6v+eIrOWPluWIsOeahOacuuWei+eZveWQjeWNlei/m+ihjOWIpOaWrVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC9bLVxcc10oR2FsYXh5W1xccy1fXW5leHVzfEdhbGF4eVtcXHMtX11cXHcqW1xccy1fXVxcdyp8R2FsYXh5W1xccy1fXVxcdyp8U00tXFx3KnxHVC1cXHcqfHNbY2dwXWgtXFx3KnxzaHctXFx3KnxBVElWfGk5MDcwfG9tbmlhfHM3NTY4fEEzMDAwfEEzMDA5fEE1MDAwfEE1MDA5fEE3MDAwfEE3MDA5fEE4MDAwfEMxMDF8QzExMTZ8QzExNTh8RTQwMHxFNTAwRnxFNzAwMHxFNzAwOXxHMzEzOUR8RzM1MDJ8RzM1MDJpfEczNTA4fEczNTA4SnxHMzUwOGl8RzM1MDl8RzM1MDlpfEczNTU4fEczNTU5fEczNTY4VnxHMzU4NlZ8RzM1ODlXfEczNjA2fEczNjA4fEczNjA5fEczODEyfEczODhGfEc1MTA4fEc1MTA4UXxHNTEwOXxHNTMwNld8RzUzMDhXfEc1MzA5V3xHNTUwfEc2MDB8RzcxMDZ8RzcxMDh8RzcxMDhWfEc3MTA5fEc3MjAwfEc3MjBOT3xHNzUwOFF8Rzc1MDl8Rzg1MDhTfEc4NTA5VnxHOTAwNlZ8RzkwMDZXfEc5MDA4VnxHOTAwOFd8RzkwMDlEfEc5MDA5V3xHOTE5OHxHOTIwMHxHOTIwOHxHOTIwOXxHOTI1MHxHOTI4MHxJNTM1fEk2Nzl8STczOXxJODE5ME58STgyNjJ8STg3OXxJODc5RXxJODg5fEk5MDAwfEk5MDYwfEk5MDgyfEk5MDgyQ3xJOTA4Mml8STkxMDB8STkxMDBHfEk5MTA4fEk5MTI4fEk5MTI4RXxJOTEyOGl8STkxNTJ8STkxNTJQfEk5MTU4fEk5MTU4UHxJOTE1OFZ8STkxNjh8STkxNjhpfEk5MTkwfEk5MTkyfEk5MTk1fEk5MTk1SXxJOTIwMHxJOTIwOHxJOTIyMHxJOTIyOHxJOTI2MHxJOTI2OHxJOTMwMHxJOTMwMGl8STkzMDV8STkzMDh8STkzMDhpfEk5Mzl8STkzOUR8STkzOWl8STk1MDB8STk1MDJ8STk1MDV8STk1MDdWfEk5NTA4fEk5NTA4VnxJOTU5fEoxMDB8SjExMHxKNTAwOHxKNzAwOHxONzEwMHxONzEwMnxONzEwNXxONzEwOHxONzEwOER8TjcxOXxONzUwfE43NTA1fE43NTA2VnxONzUwOFZ8Tjc1MDlWfE45MDB8TjkwMDJ8TjkwMDV8TjkwMDZ8TjkwMDh8TjkwMDhTfE45MDA4VnxOOTAwOXxOOTEwMHxOOTEwNld8TjkxMDhWfE45MTA5V3xOOTE1MHxOOTE2fE45MjAwfFA3MDl8UDcwOUV8UDcyOXxTNjM1OHxTNzI3OHxTNzI3OFV8Uzc1NjJDfFM3NTYyaXxTNzg5OGl8YjkzODgpW1xcc1xcKV0vaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1NhbXN1bmcnO1xuICAgICAgICAgICAgLy8g6Kej5Yaz56e75Yqo6IGU6YCa562J5LiN5ZCM5Y+R6KGM54mI5a+86Ie055qE5py65Z6L5LiN5ZCM6Zeu6aKYXG4gICAgICAgICAgICAvLyDnibnlvoHvvJpbQS1aXStbMC05XStbQS1aXSosIOS+i+WmgiBHOTAwNiBHOTAwNlYg5YW25a6e5bqU6K+l5pivRzkwMDYg5Y+m5aSW5LiJ5pif5Y+q5L+d55WZM+S9jVxuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdLnJlcGxhY2UoL0dhbGF4eSBTIFZJL2ksICdHYWxheHkgUzYnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBWL2ksICdHYWxheHkgUzUnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBJVi9pLCAnR2FsYXh5IFM0JylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvR2FsYXh5IHMgSUlJL2ksICdHYWxheHkgUzMnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBJSS9pLCAnR2FsYXh5IFMyJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvR2FsYXh5IFMgSS9pLCAnR2FsYXh5IFMxJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFthLXpdK1swLTldezN9KVswLTldP1thLXpdKi9pLCAnJDEnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDpkojlr7nkuInmmJ/lt7Lnu4/ljLnphY3lh7rnmoTmlbDmja7lgZrlpITnkIZcbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIudG9Mb3dlckNhc2UoKSA9PT0gJ3NhbXN1bmcnICYmIHVhRGF0YS5kZXZpY2UubW9kZWwpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSB1YURhdGEuZGV2aWNlLm1vZGVsLnJlcGxhY2UoL0dhbGF4eSBTIFZJL2ksICdHYWxheHkgUzYnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBWL2ksICdHYWxheHkgUzUnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBJVi9pLCAnR2FsYXh5IFM0JylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvR2FsYXh5IHMgSUlJL2ksICdHYWxheHkgUzMnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9HYWxheHkgUyBJSS9pLCAnR2FsYXh5IFMyJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvR2FsYXh5IFMgSS9pLCAnR2FsYXh5IFMxJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFthLXpdK1swLTldezN9KVswLTldP1thLXpdKi9pLCAnJDEnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgSHVhd2VpXG4gICAgICAgIC8vIOWFvOWuuWJ1aWxk57uT5bC+5oiW55u05o6lKee7k+WwvlxuICAgICAgICAvLyDljY7kuLrmnLrlnovnibnlvoHvvJpIdWF3ZWlbXFxzLV9dKFxcdypbLV9dP1xcdyopICDmiJbogIXku6UgN0QtICBBTEUtICBDSEUt562J5byA5aS0XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhIdWF3ZWlbXFxzLV9dKFxcdypbLV9dP1xcdyopfFxccyg3RC1cXHcqfEFMRS1cXHcqfEFUSC1cXHcqfENIRS1cXHcqfENITS1cXHcqfENoZTEtXFx3KnxDaGUyLVxcdyp8RDItXFx3KnxHNjE2LVxcdyp8RzYyMFMtXFx3KnxHNjIxLVxcdyp8RzY2MC1cXHcqfEc3NTAtXFx3KnxHUkEtXFx3KnxIb2wtXFx3KnxNVDItXFx3KnxNVDctXFx3KnxQRS1cXHcqfFBMSy1cXHcqfFNDLVxcdyp8U0NMLVxcdyp8SDYwLVxcdyp8SDMwLVxcdyopW1xcc1xcKV0pL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdIdWF3ZWknO1xuICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbM107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDop6PlhrPnp7vliqjogZTpgJrnrYnkuI3lkIzlj5HooYzniYjlr7zoh7TnmoTmnLrlnovkuI3lkIzpl67pophcbiAgICAgICAgICAgIC8vIOeJueW+ge+8mnh4eC1bQS1aXVswLTldKyDkvovlpoIgIEgzMC1MMDEgIEgzMC1MMDAgIEgzMC1MMjAgIOmDveW6lOivpeaYryBIMzAtTFxuICAgICAgICAgICAgLy8gaDMwLWwgIGgzMC1oICBoMzAtdCDpg73mmK9IMzBcbiAgICAgICAgICAgIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhcXHcqKVtcXHMtX10rW2EtejAtOV0rL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBYaWFvbWlcbiAgICAgICAgLy8g5YW85a65YnVpbGTnu5PlsL7miJbnm7TmjqUp57uT5bC+IOS7peWPiueJueauiueahEhN5aSE55CG5pa55qGIKGJ1aWxkL2htMjAxMzAxMSlcbiAgICAgICAgLy8geGlhb21p5omL5py657G75Z6LOiBtaSBtMSBtMiBtMyBobSDlvIDlpLRcbiAgICAgICAgLy8gaG9uZ21p5pyJ54m55q6K5Yik5patYnVpbGQvaG0yMDE1MDExXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLztcXHMobWl8bTF8bTJ8bTN8bTR8aG0pKFxccypcXHcqKVtcXHNcXCldL2kpKSB7XG4gICAgICAgICAgICBpZiAodG1wTWF0Y2ggPSB1YS5tYXRjaCgvKG1laXR1fE1lZGlhUGFkKS9pKSkge1xuICAgICAgICAgICAgICAgIC8vIOe+juWbvuaJi+acuuWQjeWtl+WGkuWFheWwj+exsyDmr5TlpoIgbWVpdHUgbTQgbWl6aGlcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9IHRtcE1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOiLpeWMuemFjeWHuueahCBtYXRjaFsyXeayoeepuuagvCDkvJrlh7rnjrDlvojlpJrkvovlpoIgbWl6aSBtaXpoaSBtaWhhIOS9huS5n+S8muWHuueOsG1pMyBtaW5vdGXkuYvnsbsg54m55q6K5aSE55CG5LiLXG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFsyXS5sZW5ndGggPiAwICYmICEoKC9cXHMvKS50ZXN0KG1hdGNoWzJdKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodG1wTWF0Y2ggPSBtYXRjaFsyXS5tYXRjaCgvKFxcZCkvaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdICsgJy0nICsgdG1wTWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnWGlhb21pJztcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMl0gJiYgbWF0Y2hbMl0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSA9IG1hdGNoWzJdLnJlcGxhY2UoL1xccy8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IChtYXRjaFsxXS5zdWJzdHIobWF0Y2hbMV0ubGVuZ3RoIC0gMikgKyAnLScgKyBtYXRjaFsyXSkucmVwbGFjZSgvbShcXGQpLS9pLCAnTUktJDEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAobWF0Y2hbMV0uc3Vic3RyKG1hdGNoWzFdLmxlbmd0aCAtIDIpKS5yZXBsYWNlKC9tKFxcZCkvaSwgJ01JLSQxJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8g6Kej5Yaz56e75Yqo6IGU6YCa562J5LiN5ZCM5Y+R6KGM54mI5a+86Ie055qE5py65Z6L5LiN5ZCM6Zeu6aKYXG4gICAgICAgICAgICAgICAgLy8g54m55b6B77yabWktM2Ms5L6L5aaCbWktNExURSBtaS00IOWFtuWunuW6lOivpeaYryBtaS00XG4gICAgICAgICAgICAgICAgaWYgKC8obWl8aG0pKC1cXGQpL2kudGVzdCh1YURhdGEuZGV2aWNlLm1vZGVsKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDnnIvnnIvmmK/kuI3mmK8gTUktM1MgIE1JLTRTLi4uLlxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8obWl8aG0pKC1cXGRzKS9pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdICsgbWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8g6Ziy5q2iIE1JLTIwMTUwWFjnrYnmu6Xnq73lhYXmlbDmiJDkuLpNSS0yXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKG1pfGhtKSgtXFxkezJ9KS9pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIOWwhm1pLTNjIG1pLTNhIG1pLTN3562J5ZCI5Li6bWktM1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhtaXxobSkoLVxcZClbQS1aXS9pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdICsgbWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5Y676ZmkIG1pLTRn6L+Z5qC355qE5Lic6KW/XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKG1pfGhtKSgtXFxkZykvaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgvYnVpbGRcXC9ITVxcZHswLDd9XFwpL2kudGVzdCh1YSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1hpYW9taSc7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gJ0hNJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC9yZWRtaVxccz8oXFxkKyk/L2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdYaWFvbWknO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICdITS0nICsgbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIudG9Mb3dlckNhc2UoKSA9PT0gJ3hpYW9taScgJiYgdWFEYXRhLmRldmljZS5tb2RlbCkge1xuICAgICAgICAgICAgLy8g6ZKI5a+56YCa6L+HYmFzZeW6k+WIpOaWreWHuuaVsOaNruaXtuWRveWQjemjjuagvOS4jeWQjOOAgueJueauiuWkhOeQhumAgumFjeWmguS4i1xuICAgICAgICAgICAgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvbWktb25lL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICdNSS0xJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG1pIDJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvbWktdHdvL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICdNSS0yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDIwMTUweHh4MjAxNDUwMVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC9cXGR7Nn0vaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goL3JlZG1pL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IHVhRGF0YS5kZXZpY2UubW9kZWwudG9VcHBlckNhc2UoKS5yZXBsYWNlKC9yZWRtaS9pLCAnSE0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG0xIG0yIG0zIOWGmeazleS4jeagh+WHhiDlj6blpJbliKTmlq3mmK/lkKbmmK8gbTEtc1xuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8obVxcZClbXFxzLV9dKHM/KS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXS5yZXBsYWNlKC9tLywgJ01JLScpICsgbWF0Y2hbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBtaS0ydyAgbWktM3cg562J5qC85byP5YyW5Li6bWktMiAgbWktM1xuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oaG18bWkpW1xccy1fXShcXGQ/KVthLXJ0LXpdL2kpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRtcE1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKG1pfGhtKVtcXHMtX10obm90ZXxwYWQpKFxcZD9zPykvaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IHRtcE1hdGNoWzFdICsgJy0nICsgdG1wTWF0Y2hbMl0gKyB0bXBNYXRjaFszXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXSA/IG1hdGNoWzFdICsgJy0nICsgbWF0Y2hbMl0gOiBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlpITnkIZobVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC9obS9pKSkge1xuICAgICAgICAgICAgICAgIC8vIOWIpOaWreaYr+S4jeaYryBobS0yMDF4eHjlhYXmlbBcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oaG0pW1xccy1fXShcXGR7Mn0pL2kpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnSE0nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDliKTmlq3mmK/kuI3mmK8gaG0tMnMgaG0tMXNcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhobSlbXFxzLV9dKFxcZHMpL2kpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnSE0tJyArIG1hdGNoWzJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhobSlbXFxzLV9dKFxcZClbYS16XS9pKSkge1xuICAgICAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gJ0hNLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnSE0nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDov4fmu6TnsbvkvLwgMmcgM2fnrYnmlbDmja5cbiAgICAgICAgICAgICAgICBpZiAoL2htLVxcZGcvLnRlc3QodWFEYXRhLmRldmljZS5tb2RlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICdITSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBWaXZvXG4gICAgICAgIC8vIOWFvOWuuWJ1aWxk57uT5bC+5oiW55u05o6lKee7k+WwvlxuICAgICAgICAvLyB2aXZv5py65Z6L54m55b6BOiBWaXZvW1xccy1fXShcXHcqKSAg5oiW6ICF5LulIEUxICBTMTF0ICBTN3Qg562J5byA5aS0XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyh2aXZvW1xccy1fXShcXHcqKXxcXHMoRTFcXHc/fEUzXFx3P3xFNVxcdz98VjFcXHc/fFYyXFx3P3xTMTFcXHc/fFMxMlxcdz98UzFcXHc/fFMzXFx3P3xTNlxcdz98UzdcXHc/fFM5XFx3P3xYMVxcdz98WDNcXHc/fFg1MjBcXHc/fFg1XFx3P3xYNU1heHxYNU1heCt8WDVQcm98WDVTTHxYNzEwRnxYNzEwTHxYcGxheXxYc2hvdHxYcGFseTNTfFkxMVxcdz98WTExaVxcdz98WTExaVxcdz98WTEzXFx3P3xZMTVcXHc/fFkxN1xcdz98WTE4XFx3P3xZMTlcXHc/fFkxXFx3P3xZMjBcXHc/fFkyMlxcdz98WTIyaVxcdz98WTIzXFx3P3xZMjdcXHc/fFkyOFxcdz98WTI5XFx3P3xZMzNcXHc/fFkzN1xcdz98WTNcXHc/fFk2MTNcXHc/fFk2MjJcXHc/fFk2MjdcXHc/fFk5MTNcXHc/fFk5MjNcXHc/fFk5MjdcXHc/fFk5MjhcXHc/fFk5MjlcXHc/fFk5MzdcXHc/KVtcXHNcXCldKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnVml2byc7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAvLyDpppblhYjliZTpmaQgdml2LSAgdml2by0gIGJiZy0g562J5omT5aS055qE5YaF5a65XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gdWFEYXRhLmRldmljZS5tb2RlbC5yZXBsYWNlKC8odml2W1xccy1fXXx2aXZvW1xccy1fXXxiYmdbXFxzLV9dKS9pLCAnJyk7XG4gICAgICAgICAgICAvLyDop6PlhrPnp7vliqjogZTpgJrnrYnkuI3lkIzlj5HooYzniYjlr7zoh7TnmoTmnLrlnovkuI3lkIzpl67pophcbiAgICAgICAgICAgIC8vIOeJueW+ge+8mltBLVpdWzAtOV0rW0EtWl0g5L6L5aaCICBYNUYgWDVMIFg1TSBYNWlMIOmDveW6lOivpeaYryBYNVxuICAgICAgICAgICAgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKFthLXpdK1swLTldKylpP1thLXpdP1tcXHMtX10/L2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBPcHBvXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhPcHBvW1xccy1fXShcXHcqKXxcXHMoMTEwMHwxMTA1fDExMDd8MzAwMHwzMDA1fDMwMDd8NjYwN3xBMTAwfEExMDN8QTEwNXxBMTA1S3xBMTA5fEExMDlLfEExMXxBMTEzfEExMTV8QTExNUt8QTEyMXxBMTI1fEExMjd8QTEyOXxBMjAxfEEyMDN8QTIwOXxBMzF8QTMxY3xBMzF0fEEzMXV8QTUxa2N8QTUyMHxBNjEzfEE2MTV8QTYxN3xFMjFXfEZpbmR8TWlycm9yfE41MTEwfE41MTE3fE41MjA3fE41MjA5fFIyMDEwfFIyMDE3fFI2MDA3fFI3MDA1fFI3MDA3fFI3Y3xSN3R8UjgwMDB8UjgwMDd8UjgwMXxSODA1fFI4MDd8UjgwOVR8UjgxMDd8UjgxMDl8UjgxMXxSODExV3xSODEzVHxSODE1VHxSODE1V3xSODE3fFI4MTlUfFI4MjAwfFI4MjA1fFI4MjA3fFI4MjFUfFI4MjNUfFI4MjdUfFI4MzB8UjgzMFN8UjgzMVN8UjgzMVR8UjgzM1R8Ujg1MHxSZWFsfFQ3MDN8VTJTfFU1MjF8VTUyNXxVNTI5fFU1Mzl8VTcwMXxVNzAxVHxVNzA1VHxVNzA1V3xYOTAwMHxYOTAwN3xYOTAzfFg5MDV8WDkwNzB8WDkwNzd8WDkwOXxaMTAxfFI4MjlUKVtcXHNcXCldKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnT3Bwbyc7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIEEzMWMgQTMxcyDpg73lupTor6XmmK8gQTMxXG4gICAgICAgICAgICAvLyDlr7kgUGx1cyDlgZrnibnmrorlpITnkIZcbiAgICAgICAgICAgIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhbYS16XStbMC05XSspLT8ocGx1cykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV0gKyAnLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKFxcdyotP1thLXpdK1swLTldKykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIudG9Mb3dlckNhc2UoKSA9PT0gJ29wcG8nICYmIHVhRGF0YS5kZXZpY2UubW9kZWwpIHtcbiAgICAgICAgICAgIC8vIOmSiOWvuWJhc2XlupPnmoTmlbDmja7lgZrmlbDmja7moLzlvI/ljJblpITnkIZcbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIEEzMWMgQTMxcyDpg73lupTor6XmmK8gQTMxXG4gICAgICAgICAgICAvLyDlr7kgUGx1cyDlgZrnibnmrorlpITnkIZcbiAgICAgICAgICAgIGlmIChtYXRjaCA9IHVhRGF0YS5kZXZpY2UubW9kZWwubWF0Y2goLyhbYS16XStbMC05XSspLT8ocGx1cykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV0gKyAnLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKFxcdyotP1thLXpdK1swLTldKykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIExlbm92b1xuICAgICAgICAvLyDlhbzlrrlidWlsZOe7k+WwvuaIluebtOaOpSnnu5PlsL4g5YW85a65TGVub3ZvLXh4eC94eHjku6Xlj4pMZXZlbm8geHh4IGJ1aWxk562JXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhMZW5vdm9bXFxzLV9dKFxcdypbLV9dP1xcdyopfFxccyhBMzU4MHxBMzg2MHxBNTUwMHxBNTYwMHxBNTg2MHxBNzYwMHxBODA2fEE4MDB8QTgwOFR8QTgwOFQtSXxBOTM2fEE5Mzh0fEE3ODh0fEszMC1FfEszMC1UfEszMC1XfEs1MC1UM3N8SzUwLVQ1fEs4ME18SzkxMHxLOTEwZXxLOTIwfFM5MC1lfFM5MC10fFM5MC11fFM5NjhUfFgyLUNVfFgyLVRPfFo5MC0zfFo5MC03KVtcXHNcXCldKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTGVub3ZvJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6Kej5Yaz56e75Yqo6IGU6YCa562J5LiN5ZCM5Y+R6KGM54mI5a+86Ie055qE5py65Z6L5LiN5ZCM6Zeu6aKYXG4gICAgICAgICAgICAvLyDnibnlvoHvvJpbQS1aXVswLTldK1tBLVpdIOS+i+WmgiAgQTM2MHQgQTM2MCDpg73lupTor6XmmK8gQTM2MFxuICAgICAgICAgICAgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKFthLXpdK1swLTldKykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIGNvb2xwYWRcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKENvb2xwYWRbXFxzLV9dKFxcdyopfFxccyg3Mjk1Q3w3Mjk4QXw3NjIwTHw4OTA4fDgwODV8ODk3MEx8OTE5MEx8WTgwRClbXFxzXFwpXSkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0Nvb2xwYWQnO1xuICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbM107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIDgyOTctdDAxIDgyOTctYzAxIDgyOTd3IOmDveW6lOivpeaYryA4Mjk3XG4gICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oW2Etel0/WzAtOV0rKS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciAmJiB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlci50b0xvd2VyQ2FzZSgpID09PSAnY29vbHBhZCcgJiYgdWFEYXRhLmRldmljZS5tb2RlbCkge1xuICAgICAgICAgICAgLy8gYmFzZSDlupPpgILphY1cbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIDgyOTctdDAxIDgyOTctYzAxIDgyOTd3IOmDveW6lOivpeaYryA4Mjk3XG4gICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oW2Etel0/WzAtOV0rKS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgbWVpenVcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvXFxzKG14XFxkKlxcdyp8bXotKFxcdyopKVxccyhcXHcqKVxccypcXHcqXFxzKmJ1aWxkL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdNZWl6dSc7XG4gICAgICAgICAgICB2YXIgdG1wTW9kZWwgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbWF0Y2hbMV07XG4gICAgICAgICAgICBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gdG1wTW9kZWwgKyAnLScgKyBtYXRjaFszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSB0bXBNb2RlbCArICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goL000NjNDfE0zNVxcZC9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTWVpenUnO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBodGNcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKEh0Y1stX1xcc10oXFx3Kil8XFxzKDYwMWV8NjA2d3w2MDh0fDYwOWR8NjEwdHw2MTYwfDYxOWR8NjIwR3w2MjZkfDYyNnN8NjI2dHw2MjZ3fDcwOWR8ODAxZXw4MDJkfDgwMnR8ODAyd3w4MDlEfDgxNmR8ODE2ZXw4MTZ0fDgxNnZ8ODE2d3w4MjZkfDgyNnN8ODI2dHw4MjZ3fDgyOHd8OTAxZXw5MTlkfEEzMTBlfEE1MEFNTHxBNTEwZXxBNjIwZHxBNjIwZXxBNjIwdHxBODEwZXxBOTE5MXxBZXJvfEM2MjBkfEM2MjBlfEM2MjB0fEQzMTZkfEQ1MTZkfEQ1MTZ0fEQ1MTZ3fEQ4MjBtdHxEODIwbXV8RDgyMHR8RDgyMHRzfEQ4MjB1fEQ4MjB1c3xFOXB0fEU5cHd8RTlzd3xFOXR8SEQ3U3xNOEV0fE04U2R8TThTdHxNOFN3fE04ZHxNOGV8TThzfE04c2l8TTh0fE04d3xNOVd8TTlld3xQaGFibGV0fFM1MTBifFM1MTBlfFM2MTBkfFM3MTBkfFM3MTBlfFM3MjBlfFM3MjB0fFQzMjd0fFQzMjhkfFQzMjh0fFQzMjh3fFQzMjlkfFQzMjl0fFQzMjl3fFQ1MjhkfFQ1Mjh0fFQ1Mjh3fFQ4Njk4fFdGNXd8WDMxNWV8WDcxMGV8WDcxNWV8WDcyMGR8WDkyMGV8WjU2MGV8WjcxMGV8WjcxMHR8WjcxNWUpW1xcc1xcKV0pLykpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0h0Yyc7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIEdpb25lZVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oR2lvbmVlW1xccy1fXShcXHcqKXxcXHMoR05cXGQrXFx3KilbXFxzXFwpXSkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0dpb25lZSc7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgTEdcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKExHWy1fXShcXHcqKXxcXHMoRDcyOHxENzI5fEQ4MDJ8RDg1NXxEODU2fEQ4NTd8RDg1OHxEODU5fEU5ODVUfEYxMDBMfEY0NjB8SDc3OHxIODE4fEg4MTl8UDg5NXxWVzgyMClbXFxzXFwpXSkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0xnJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSB0Y2xcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKFRjbFtcXHMtX10oXFx3Kil8XFxzKEg5MTZUfFA1ODhMfFA2MThMfFA2MjBNfFA3MjhNKVtcXHNcXCldKS8pKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdUY2wnO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpURVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oVjkxODB8TjkxOCkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1p0ZSc7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIudG9Mb3dlckNhc2UoKSA9PT0gJ3p0ZScgJiYgdWFEYXRhLmRldmljZS5tb2RlbCkge1xuICAgICAgICAgICAgLy8gYmFzZSDlupPpgILphY1cbiAgICAgICAgICAgIC8vIOino+WGs+enu+WKqOiBlOmAmuetieS4jeWQjOWPkeihjOeJiOWvvOiHtOeahOacuuWei+S4jeWQjOmXrumimFxuICAgICAgICAgICAgLy8g54m55b6B77yaW0EtWl1bMC05XStbQS1aXSDkvovlpoIgIFE1MDVUIFE1MDV1IOmDveW6lOivpeaYryBRNTA1XG4gICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oW2Etel0/WzAtOV0rKS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVSU1JXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWEubWF0Y2goLyhVSU1JXFx3Knx1bWlcXHcqKVtcXHMtX10oXFx3KilcXHMqXFx3KlxccypidWlsZC9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnVWltaSc7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV0gKyAnLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXSArICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGV0b25cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvZXRvbltcXHMtX10oXFx3KikvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0V0b24nO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNtYXJ0aXNhblxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oU003MDV8U003MDF8WVE2MDF8WVE2MDMpL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTbWFydGlzYW4nO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9ICh7XG4gICAgICAgICAgICAgICAgU003MDU6ICdUMScsXG4gICAgICAgICAgICAgICAgU003MDE6ICdUMScsXG4gICAgICAgICAgICAgICAgWVE2MDE6ICdVMScsXG4gICAgICAgICAgICAgICAgWVE2MDM6ICdVMSdcbiAgICAgICAgICAgIH0pW21hdGNoWzFdXSB8fCBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgQXN1c1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oQXN1c1tcXHMtX10oXFx3Kil8XFxzKEE1MDBDR3xBNTAwS0x8QTUwMUNHfEE2MDBDR3xQRjQwMENHfFBGNTAwS0x8VDAwMXxYMDAyfFgwMDN8WkM1MDBUR3xaRTU1ME1MfFpFNTUxTUwpW1xcc1xcKV0pL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdBc3VzJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBudWJpYVxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oTnViaWFbLV9cXHNdKFxcdyopfChOWDUwMXxOWDUwNUp8Tlg1MDZKfE5YNTA3SnxOWDUwM0F8bnhcXGQrXFx3KilbXFxzXFwpXSkvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ051YmlhJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSBoYWllclxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC8oSFQtXFx3Kil8SGFpZXJbXFxzLV9dKFxcdyotP1xcdyopL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdIYWllcic7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aWFueXVcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvSy1Ub3VjaFtcXHMtX10odG91XFxzP2NoXFxzPyhcXGQpfFxcdyopL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdLLVRvdWNoJztcbiAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSAnS3RvdWNoJyArIG1hdGNoWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRE9PVlxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHVhLm1hdGNoKC9Eb292W1xccy1fXShcXHcqKS9pKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnRG9vdic7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29vYmVlXG4gICAgICAgIGVsc2UgaWYgKC9rb29iZWUvaS50ZXN0KHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPSAna29vYmVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNvbnlcbiAgICAgICAgZWxzZSBpZiAoL0M2OS9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTb255JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhb2ppeGluZ1xuICAgICAgICBlbHNlIGlmICgvTjc4N3xOODE4Uy9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdIYW9qaXhpbmcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFpc2Vuc2VcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YS5tYXRjaCgvKGhzLXxIaXNlbnNlW1xccy1fXSkoXFx3KikvaSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0hpc2Vuc2UnO1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzJdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm9ybWF0IHRoZSBzdHlsZSBvZiBtYW51ZmFjdHVyZXJcbiAgICAgICAgaWYgKHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyKSB7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9IHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyLnN1YnN0cigwLCAxKS50b1VwcGVyQ2FzZSgpICsgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZm9ybWF0IHRoZSBzdHlsZSBvZiBtb2RlbFxuICAgICAgICBpZiAodWFEYXRhLmRldmljZS5tb2RlbCkge1xuICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IHVhRGF0YS5kZXZpY2UubW9kZWwudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tK3xfK3xcXHMrL2csICcgJyk7XG4gICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvXFxzKihcXHcqXFxzKlxcdyopLylbMV0ucmVwbGFjZSgvXFxzKy8sICctJyk7XG5cbiAgICAgICAgICAgIC8vIOmSiOWvueS4ieaYn+OAgeWNjuS4uuWBmuWOu+mHjeeahOeJueauiuWkhOeQhlxuICAgICAgICAgICAgaWYgKHVhRGF0YS5kZXZpY2UubWFudWZhY3R1cmVyID09PSAnU2Ftc3VuZycpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gKHtcbiAgICAgICAgICAgICAgICAgICAgJ1NDSC1JOTUnOiAnR1QtSTk1MCcsXG4gICAgICAgICAgICAgICAgICAgICdTQ0gtSTkzJzogJ0dULUk5MzAnLFxuICAgICAgICAgICAgICAgICAgICAnU0NILUk4Nic6ICdHVC1JODU1JyxcbiAgICAgICAgICAgICAgICAgICAgJ1NDSC1ONzEnOiAnR1QtTjcxMCcsXG4gICAgICAgICAgICAgICAgICAgICdTQ0gtSTczJzogJ0dULVM3ODknLFxuICAgICAgICAgICAgICAgICAgICAnU0NILVA3MCc6ICdHVC1JOTE1J1xuICAgICAgICAgICAgICAgIH0pW3VhRGF0YS5kZXZpY2UubW9kZWxdIHx8IHVhRGF0YS5kZXZpY2UubW9kZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1YURhdGEuZGV2aWNlLm1hbnVmYWN0dXJlciA9PT0gJ0h1YXdlaScpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gKHtcbiAgICAgICAgICAgICAgICAgICAgQ0hFMTogJ0NIRScsXG4gICAgICAgICAgICAgICAgICAgIENIRTI6ICdDSEUnLFxuICAgICAgICAgICAgICAgICAgICBHNjIwUzogJ0c2MjEnLFxuICAgICAgICAgICAgICAgICAgICBDODgxN0Q6ICdHNjIxJ1xuICAgICAgICAgICAgICAgIH0pW3VhRGF0YS5kZXZpY2UubW9kZWxdIHx8IHVhRGF0YS5kZXZpY2UubW9kZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDpkojlr7l4aWFvbWkg55qE6YOo5YiG5pWw5o2u5rKh5pyJ5qC85byP5YyW5oiQ5Yqf77yM5qC85byP5YyWMeasoVxuICAgICAgICBpZiAodWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdWFEYXRhLmRldmljZS5tYW51ZmFjdHVyZXIgPT09ICdYaWFvbWknKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oaG18bWkpLShub3RlKS9pKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXSArICctJyArIG1hdGNoWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB1YURhdGEuZGV2aWNlLm1vZGVsLm1hdGNoKC8oaG18bWkpLShcXGRzPykvaSkpIHtcbiAgICAgICAgICAgICAgICB1YURhdGEuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV0gKyAnLScgKyBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdWFEYXRhLmRldmljZS5tb2RlbC5tYXRjaCgvKGhtfG1pKS0oXFxkKVthLXJ0LXpdL2kpKSB7XG4gICAgICAgICAgICAgICAgdWFEYXRhLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdICsgJy0nICsgbWF0Y2hbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaGFuZGxlIGJyb3dzZXJcbiAgICAvLyBpZiAoIXVhRGF0YS5icm93c2VyLm5hbWUpIHtcbiAgICAvLyB1YSA9IHVhLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHVhRGF0YS5kZXZpY2UudHlwZSA9PT0gJ2Rlc2t0b3AnKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIDM2MCBzZWN1cml0eSBFeHBsb3JlclxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG1hdGNoID0gLzM2MHNlKD86WyBcXC9dKFtcXHcuXSspKT8vaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICczNjAgc2VjdXJpdHkgRXhwbG9yZXInO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSB3b3JsZFxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvdGhlIHdvcmxkKD86WyBcXC9dKFtcXHcuXSspKT8vaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICd0aGUgd29ybGQnO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRlbmNlbnR0cmF2ZWxlclxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvdGVuY2VudHRyYXZlbGVyIChbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ3RlbmNlbnR0cmF2ZWxlcic7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBtYXRjaFsxXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogTEJCUk9XU0VSXG4gICAgICAgICAqL1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IC9MQkJST1dTRVIvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdMQkJST1dTRVInO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHVhRGF0YS5kZXZpY2UudHlwZSA9PT0gJ21vYmlsZScgfHwgdWFEYXRhLmRldmljZS50eXBlID09PSAndGFibGV0Jykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQmFpZHVIRFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG1hdGNoID0gL0JhaWR1SERcXHMrKFtcXHcuXSspL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnQmFpZHVIRCc7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBtYXRjaFsxXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogMzYwIEJyb3dzZXJcbiAgICAgICAgICovXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gLzM2MC5zKmFwaG9uZVxccypicm93c2VyXFxzKlxcKHZlcnNpb25cXHMqKFtcXHcuXSspXFwpL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnMzYwIEJyb3dzZXInO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJhaWR1IEJyb3dzZXJcbiAgICAgICAgICovXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gL2ZseWZsb3dcXC8oW1xcdy5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdCYWlkdSBCcm93c2VyJztcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJhaWR1IEhEXG4gICAgICAgICAqL1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IC9iYWlkdWhkIChbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ0JhaWR1IEhEJztcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGJhaWR1YnJvd3NlclxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvYmFpZHVicm93c2VyXFwvKFtcXGRcXC5dKylcXHMvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdiYWlkdWJyb3dzZXInO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTGllQmFvRmFzdFxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvTGllQmFvRmFzdFxcLyhbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ0xpZUJhbyBGYXN0JztcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpZUJhb1xuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvTGllQmFvXFwvKFtcXHcuXSspL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnTGllQmFvJztcbiAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNPVUdPVVxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvU29nb3VcXHcrXFwvKFswLTlcXC5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdTb2dvdU1vYmlsZUJyb3dzZXInO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICog55m+5bqm5Zu96ZmFXG4gICAgICAgICAqL1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IC9iZGJyb3dzZXJcXHcrXFwvKFswLTlcXC5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICfnmb7luqblm73pmYUnO1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQW5kcm9pZCBDaHJvbWUgQnJvd3NlclxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAodWFEYXRhLm9zLm5hbWUgPT09ICdBbmRyb2lkJyAmJiAvc2FmYXJpL2kudGVzdCh1YSkgJiYgKG1hdGNoID0gL2Nocm9tZVxcLyhbMC05XFwuXSspL2kuZXhlYyh1YSkpKSB7XG4gICAgICAgICAgICBpZiAodG1wTWF0Y2ggPSB1YS5tYXRjaCgvXFxzKyhcXHcrQnJvd3NlcilcXC8/KFtcXGRcXC5dKikvKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSB0bXBNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtvcmlnaW5hbDogdG1wTWF0Y2hbMl19O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7b3JpZ2luYWw6IG1hdGNoWzFdfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnQW5kcm9pZCBDaHJvbWUnO1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7b3JpZ2luYWw6IG1hdGNoWzFdfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbmRyb2lkIEdvb2dsZSBCcm93c2VyXG4gICAgICAgICAqL1xuICAgICAgICBlbHNlIGlmICh1YURhdGEub3MubmFtZSA9PT0gJ0FuZHJvaWQnICYmIC9zYWZhcmkvaS50ZXN0KHVhKSAmJiAobWF0Y2ggPSAvdmVyc2lvblxcLyhbMC05XFwuXSspL2kuZXhlYyh1YSkpKSB7XG4gICAgICAgICAgICBpZiAodG1wTWF0Y2ggPSB1YS5tYXRjaCgvXFxzKyhcXHcrQnJvd3NlcilcXC8/KFtcXGRcXC5dKikvKSkge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSB0bXBNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtvcmlnaW5hbDogdG1wTWF0Y2hbMl19O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7b3JpZ2luYWw6IG1hdGNoWzFdfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnQW5kcm9pZCBCcm93c2VyJztcbiAgICAgICAgICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge29yaWdpbmFsOiBtYXRjaFsxXX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgNV8xXzEgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNTM0LjQ2IChLSFRNTCwgbGlrZSBHZWNrbykgTW9iaWxlLzlCMjA2JyBiZWxvbmdzIHRvIFNhZmFyaVxuICAgICAgICAgKi9cbiAgICAgICAgZWxzZSBpZiAoLyhpcGFkfGlwaG9uZSkuKiBhcHBsZXdlYmtpdFxcLy4qIG1vYmlsZS9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ1NhZmFyaSc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hdGNoID0gdWEubWF0Y2goL2JhaWR1Ym94YXBwXFwvPyhbXFxkXFwuXSopL2kpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAn55m+5bqm5qGGJztcbiAgICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBtYXRjaFsxXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ2JhaWR1IGJveCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKC9CYWlkdUxpZ2h0QXBwUnVudGltZS9pLnRlc3QodWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAn6L275bqU55SocnVudGltZSc7XG4gICAgICAgIC8vIHVhRGF0YS5icm93c2VyLm5hbWUgPSAncWluZyBydW50aW1lJztcbiAgICB9XG4gICAgZWxzZSBpZiAoL1dlaWJvL2kudGVzdCh1YSkpIHtcbiAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICflvq7ljZonO1xuICAgICAgICAvLyB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ3dlaWJvJztcbiAgICB9XG4gICAgZWxzZSBpZiAoL01RUS9pLnRlc3QodWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAn5omL5py6UVEnO1xuICAgICAgICAvLyB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ21vYmlsZSBxcSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKC9oYW8xMjMvaS50ZXN0KHVhKSkge1xuICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ2hhbzEyMyc7XG4gICAgfVxuICAgIC8vIH1cbiAgICBpZiAobWF0Y2ggPSAvTWljcm9NZXNzZW5nZXJcXC8oW1xcdy5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ+W+ruS/oSc7XG4gICAgICAgIHZhciB0bXBWZXJzaW9uID0gKG1hdGNoWzFdKS5yZXBsYWNlKC9fL2csICcuJyk7XG4gICAgICAgIHRtcE1hdGNoID0gLyhcXGQrXFwuXFxkK1xcLlxcZCtcXC5cXGQrKS8uZXhlYyh0bXBWZXJzaW9uKTtcbiAgICAgICAgaWYodG1wTWF0Y2gpIHtcbiAgICAgICAgICAgIHRtcFZlcnNpb24gPSB0bXBNYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luYWw6IHRtcFZlcnNpb25cbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoID0gL1VDQnJvd3NlclxcLyhbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnVUMgQnJvd3Nlcic7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoID0gL09QUlxcLyhbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnT3BlcmEnO1xuICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChtYXRjaCA9IC9PUGlPU1xcLyhbXFx3Ll0rKS9pLmV4ZWModWEpKSB7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLm5hbWUgPSAnT3BlcmEnO1xuICAgICAgICB1YURhdGEuYnJvd3Nlci52ZXJzaW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIElFIDExXG4gICAgZWxzZSBpZiAoL1RyaWRlbnRcXC83L2kudGVzdCh1YSkgJiYgL3J2OjExL2kudGVzdCh1YSkpIHtcbiAgICAgICAgdWFEYXRhLmJyb3dzZXIubmFtZSA9ICdJbnRlcm5ldCBFeHBsb3Jlcic7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICBtYWpvcjogJzExJyxcbiAgICAgICAgICAgIG9yaWdpbmFsOiAnMTEnXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIE1pY3Jvc29mdCBFZGdlXG4gICAgZWxzZSBpZiAoL0VkZ2VcXC8xMi9pLnRlc3QodWEpICYmIC9XaW5kb3dzIFBob25lfFdpbmRvd3MgTlQvaS50ZXN0KHVhKSkge1xuICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ01pY3Jvc29mdCBFZGdlJztcbiAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgIG1ham9yOiAnMTInLFxuICAgICAgICAgICAgb3JpZ2luYWw6ICcxMidcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gbWl1aSBicm93c2VyXG4gICAgZWxzZSBpZiAobWF0Y2ggPSAvbWl1aWJyb3dzZXJcXC8oW1xcdy5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ21pdWkgYnJvd3Nlcic7XG4gICAgICAgIHVhRGF0YS5icm93c2VyLnZlcnNpb24gPSB7XG4gICAgICAgICAgICBvcmlnaW5hbDogbWF0Y2hbMV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gU2FmYXJpXG4gICAgaWYgKCF1YURhdGEuYnJvd3Nlci5uYW1lKSB7XG4gICAgICAgIGlmIChtYXRjaCA9IC9TYWZhcmlcXC8oW1xcdy5dKykvaS5leGVjKHVhKSAmJiAvVmVyc2lvbi9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEuYnJvd3Nlci5uYW1lID0gJ1NhZmFyaSc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVhRGF0YS5icm93c2VyLm5hbWUgJiYgIXVhRGF0YS5icm93c2VyLnZlcnNpb24pIHtcbiAgICAgICAgaWYgKG1hdGNoID0gL1ZlcnNpb25cXC8oW1xcdy5dKykvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgdWFEYXRhLmJyb3dzZXIudmVyc2lvbiA9ICB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgKHVhRGF0YS5vcy5uYW1lID09PSAnV2luZG93cycgJiYgdWFEYXRhLm9zLnZlcnNpb24pIHtcbiAgICAvLyAgLy8gV2luZG93cyA4LjFcbiAgICAvLyAgaWYgKHVhRGF0YS5vcy52ZXJzaW9uLmFsaWFzID09PSAnTlQgNi4zJykge1xuICAgIC8vICAgICAgdWFEYXRhLm9zLnZlcnNpb24uYWxpYXMgPSAnOC4xJztcbiAgICAvLyAgfVxuICAgIC8vIH1cbiAgICAvLyBoYW5kbGUgb3NcbiAgICBpZiAodWFEYXRhLm9zLm5hbWUgPT09ICdXaW5kb3dzJyB8fCAvV2luZG93cy9pLnRlc3QodWEpKSB7XG4gICAgICAgIHVhRGF0YS5vcy5uYW1lID0gJ1dpbmRvd3MnO1xuICAgICAgICBpZiAoL05UIDYuMy9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogJzguMScsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6ICc4LjEnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9OVCA2LjQvaS50ZXN0KHVhKSB8fCAvTlQgMTAuMC9pLnRlc3QodWEpKSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogJzEwJyxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbDogJzEwJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh1YURhdGEub3MubmFtZSA9PT0gJ01hYyBPUyBYJykge1xuICAgICAgICB1YURhdGEub3MubmFtZSA9ICdNYWMgT1MgWCc7XG4gICAgICAgIGlmIChtYXRjaCA9IC9NYWMgT1MgWFtcXHNcXF9cXC1cXC9dKFxcZCtbXFwuXFwtXFxfXVxcZCtbXFwuXFwtXFxfXT9cXGQqKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogbWF0Y2hbMV0ucmVwbGFjZSgvXy9nLCAnLicpLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBtYXRjaFsxXS5yZXBsYWNlKC9fL2csICcuJylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogJycsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKC9BbmRyb2lkL2kudGVzdCh1YURhdGEub3MubmFtZSkpIHtcbiAgICAgICAgaWYgKG1hdGNoID0gdWEubWF0Y2goL0FuZHJvaWRbXFxzXFxfXFwtXFwvaTY4Nl0/W1xcc1xcX1xcLVxcL10oXFxkK1tcXC5cXC1cXF9dXFxkK1tcXC5cXC1cXF9dP1xcZCopL2kpKSB7XG4gICAgICAgICAgICB1YURhdGEub3MudmVyc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBhbGlhczogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IG1hdGNoWzFdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1YURhdGE7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_ua-device@0.1.10@ua-device/lib/ua-device.js\n");

/***/ }),

/***/ "./node_modules/_ua-device@0.1.10@ua-device/lib/useragent-base.js":
/*!************************************************************************!*\
  !*** ./node_modules/_ua-device@0.1.10@ua-device/lib/useragent-base.js ***!
  \************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = (function () {\n    var STRINGS_SAMSUNG = 'Samsung',\n        STRINGS_SHARP = 'Sharp',\n        STRINGS_SONY_ERICSSON = 'Sony Ericsson',\n        STRINGS_MOTOROLA = 'Motorola',\n        STRINGS_LG = 'LG',\n        STRINGS_HUAWEI = 'Huawei',\n        STRINGS_HTC = 'HTC',\n        STRINGS_COOLPAD = 'Coolpad',\n        STRINGS_ASUS = 'Asus',\n        STRINGS_ACER = 'Acer';\n    var STRINGS_BASED = ' based device';\n\n    var TOUCHWIZ_MODELS = {\n        'SAMSUNG': {\n            'GT-S3370C': [STRINGS_SAMSUNG, 'Corby 3G'],\n            'GT-S3650': [STRINGS_SAMSUNG, 'Corby'],\n            'GT-S3653': [STRINGS_SAMSUNG, 'Corby'],\n            'GT-S3850': [STRINGS_SAMSUNG, 'Corby II'],\n            'GT-S5230': [STRINGS_SAMSUNG, 'Star'],\n            'GT-S5230W': [STRINGS_SAMSUNG, 'Star'],\n            'GT-S5233': [STRINGS_SAMSUNG, 'Star'],\n            'GT-S5260': [STRINGS_SAMSUNG, 'Star II'],\n            'GT-S5560': [STRINGS_SAMSUNG, 'Marvel'],\n            'GT-S5620': [STRINGS_SAMSUNG, 'Monte'],\n            'GT-S7550': [STRINGS_SAMSUNG, 'Blue Earth'],\n            'GT-S8000': [STRINGS_SAMSUNG, 'Jet'],\n            'GT-S8003': [STRINGS_SAMSUNG, 'Jet'],\n            'SGH-F480': [STRINGS_SAMSUNG, 'Tocco'],\n            'SGH-T528g': [STRINGS_SAMSUNG, 'Straight Talk'],\n            'GT-B3410': [STRINGS_SAMSUNG, 'Star Qwerty'],\n            'GT-B5310': [STRINGS_SAMSUNG, 'Corby Pro'],\n            'GT-B7722': [STRINGS_SAMSUNG, 'Star Duos'],\n            'GT-C6712': [STRINGS_SAMSUNG, 'Star II Duos']\n        }\n    }\n\n    var BADA_MODELS = {\n        'SAMSUNG': {\n            'GT- S5250': [STRINGS_SAMSUNG, 'Wave 525'],\n            'GT-S5250': [STRINGS_SAMSUNG, 'Wave 525'],\n            'GT-S5253': [STRINGS_SAMSUNG, 'Wave 525'],\n            'GT-S5330': [STRINGS_SAMSUNG, 'Wave 533'],\n            'GT-S5380': [STRINGS_SAMSUNG, 'Wave Y'],\n            'GT-S5380D': [STRINGS_SAMSUNG, 'Wave Y'],\n            'GT-S5380K': [STRINGS_SAMSUNG, 'Wave Y'],\n            'GT-S5750E': [STRINGS_SAMSUNG, 'Wave 575'],\n            'GT-S5753E': [STRINGS_SAMSUNG, 'Wave 575'],\n            'GT-S7230B': [STRINGS_SAMSUNG, 'Wave 723'],\n            'GT-S7230E': [STRINGS_SAMSUNG, 'Wave 723'],\n            'GT-S7233E': [STRINGS_SAMSUNG, 'Wave 723'],\n            'GT-S7250': [STRINGS_SAMSUNG, 'Wave M'],\n            'GT-S7250D': [STRINGS_SAMSUNG, 'Wave M'],\n            'GT-S8500': [STRINGS_SAMSUNG, 'Wave'],\n            'GT-S8500C': [STRINGS_SAMSUNG, 'Wave'],\n            'GT-S8500R': [STRINGS_SAMSUNG, 'Wave'],\n            'GT-S8500T': [STRINGS_SAMSUNG, 'Wave'],\n            'GT-S8530': [STRINGS_SAMSUNG, 'Wave II'],\n            'GT-S8600': [STRINGS_SAMSUNG, 'Wave 3'],\n            'SHW-M410': [STRINGS_SAMSUNG, 'Wave 3']\n        }\n    }\n\n    var TIZEN_MODELS = {\n        'SAMSUNG': {\n            'GT-I9500': [STRINGS_SAMSUNG, 'GT-I9500']\n        }\n    }\n\n    var BREW_MODELS = {\n        'Coolpad D508': [STRINGS_COOLPAD, 'D508'],\n        'Coolpad E600': [STRINGS_COOLPAD, 'E600'],\n        'SCH-F839': [STRINGS_SAMSUNG, 'SCH-F839']\n    }\n\n    var WINDOWS_MOBILE_MODELS = {\n        'DX900': [STRINGS_ACER, 'Tempo DX900'],\n        'F900': [STRINGS_ACER, 'Tempo F900'],\n        'Coolpad F800': [STRINGS_COOLPAD, 'F800'],\n        'garmin-asus-Nuvifone-M10': ['Garmin-Asus', 'Nuvifone M10'],\n        'HP iPAQ 510': ['HP', 'iPAQ 510'],\n        'HD mini T5555': [STRINGS_HTC, 'HD mini'],\n        'HTC HD mini': [STRINGS_HTC, 'HD mini'],\n        'HTC HD mini T5555': [STRINGS_HTC, 'HD mini'],\n        'HTC HD2': [STRINGS_HTC, 'HD2'],\n        'HTC HD2 T8585': [STRINGS_HTC, 'HD2'],\n        'HD2 T8585': [STRINGS_HTC, 'HD2'],\n        'T-Mobile LEO': [STRINGS_HTC, 'HD2'],\n        'dopodT5588': [STRINGS_HTC, 'Hengshan'],\n        'HTC Mega-T3333': [STRINGS_HTC, 'Mega'],\n        'HTC Snap S521': [STRINGS_HTC, 'Snap'],\n        'HTC Touch2 T3320': [STRINGS_HTC, 'Touch 2'],\n        'HTC Touch2 T3333': [STRINGS_HTC, 'Touch 2'],\n        'HTC Touch2 T3335': [STRINGS_HTC, 'Touch 2'],\n        'HTC P3700': [STRINGS_HTC, 'Touch Diamond'],\n        'HTC Touch Diamond2 T5353': [STRINGS_HTC, 'Touch Diamond 2'],\n        'HTC Touch HD T8282': [STRINGS_HTC, 'Touch HD'],\n        'HTC Touch HD T8283': [STRINGS_HTC, 'Touch HD'],\n        'HTC Touch HD2 T8585': [STRINGS_HTC, 'Touch HD2'],\n        'HTC Touch Pro2 T7373': [STRINGS_HTC, 'Touch Pro 2'],\n        'T7380': [STRINGS_HTC, 'Touch Pro 2'],\n        'HTC TyTN II': [STRINGS_HTC, 'TyTN II'],\n        'GT-B7300': [STRINGS_SAMSUNG, 'Omnia Lite'],\n        'GT-B7610': [STRINGS_SAMSUNG, 'Omnia Pro'],\n        'GT-i8000': [STRINGS_SAMSUNG, 'Omnia 2'],\n        'GT-I8000': [STRINGS_SAMSUNG, 'Omnia 2'],\n        'GT-I8000U': [STRINGS_SAMSUNG, 'Omnia 2'],\n        'M1i': [STRINGS_SONY_ERICSSON, 'M1i Aspen']\n    }\n\n    var WINDOWS_PHONE_MODELS = {\n        'Acer': {\n            'Allegro': [STRINGS_ACER, 'Allegro'],\n            'M310': [STRINGS_ACER, 'Allegro']\n        },\n\n        'Asus': {\n            'Galaxy6': [STRINGS_ASUS, 'Galaxy 6']\n        },\n\n        'DELL': {\n            'Venue Pro': ['Dell', 'Venue Pro']\n        },\n\n        'FujitsuToshibaMobileCommun': {\n            'IS12T': ['Fujitsu Toshiba', 'IS12T']\n        },\n\n        'HTC': {\n            '7 Mozart': [STRINGS_HTC, '7 Mozart'],\n            '7 Mozart T8698': [STRINGS_HTC, '7 Mozart'],\n            'T8697': [STRINGS_HTC, '7 Mozart'],\n            'T8698': [STRINGS_HTC, '7 Mozart'],\n            'PD67100': [STRINGS_HTC, '7 Mozart'],\n            'Mozart T8698': [STRINGS_HTC, '7 Mozart'],\n            'Mozart': [STRINGS_HTC, '7 Mozart'],\n            'USCCHTC-PC93100': [STRINGS_HTC, 'Arrive'],\n            'Gold': [STRINGS_HTC, 'Gold '],\n            'HD2': [STRINGS_HTC, 'HD2'],\n            'HD7': [STRINGS_HTC, 'HD7'],\n            'HD7 T9292': [STRINGS_HTC, 'HD7'],\n            'T9295': [STRINGS_HTC, 'HD7'],\n            'T9296': [STRINGS_HTC, 'HD7'],\n            'HD7 Infinity': [STRINGS_HTC, 'HD7'],\n            'T7575': [STRINGS_HTC, '7 Pro'],\n            '7 Pro T7576': [STRINGS_HTC, '7 Pro'],\n            'mwp6985': [STRINGS_HTC, 'Trophy'],\n            '7 Trophy T8686': [STRINGS_HTC, 'Trophy'],\n            '7 Trophy': [STRINGS_HTC, 'Trophy'],\n            'PC40100': [STRINGS_HTC, 'Trophy'],\n            'Touch-IT Trophy': [STRINGS_HTC, 'Trophy'],\n            'Radar': [STRINGS_HTC, 'Radar'],\n            'Radar 4G': [STRINGS_HTC, 'Radar'],\n            'Radar C110e': [STRINGS_HTC, 'Radar'],\n            'Mazaa': [STRINGS_HTC, 'Mazaa'],\n            'Mondrian': [STRINGS_HTC, 'Mondrian'],\n            'Schubert': [STRINGS_HTC, 'Schubert'],\n            '7 Schubert T9292': [STRINGS_HTC, 'Schubert'],\n            'Spark': [STRINGS_HTC, 'Spark'],\n            'T8788': [STRINGS_HTC, 'Surround'],\n            'TITAN X310e': [STRINGS_HTC, 'Titan'],\n            'X310e': [STRINGS_HTC, 'Titan'],\n            'PI39100': [STRINGS_HTC, 'Titan'],\n            'PI86100': [STRINGS_HTC, 'Titan II'],\n            'Ultimate': [STRINGS_HTC, 'Ultimate']\n        },\n\n        'LG': {\n            'GW910': [STRINGS_LG, 'Optimus 7'],\n            'LG E-900': [STRINGS_LG, 'Optimus 7 E900'],\n            'LG-E900': [STRINGS_LG, 'Optimus 7 E900'],\n            'LG-E900h': [STRINGS_LG, 'Optimus 7 E900'],\n            'LG-C900': [STRINGS_LG, 'Optimus 7Q'],\n            'LG-C900B': [STRINGS_LG, 'Quantum'],\n            'LG-C900k': [STRINGS_LG, 'Quantum']\n        },\n\n        'nokia': {\n            'SeaRay': ['Nokia', 'Lumia 800'],\n            '800C': ['Nokia', 'Lumia 800']\n        },\n\n        'NOKIA': {\n            '710': ['Nokia', 'Lumia 710'],\n            'Nokia 710': ['Nokia', 'Lumia 710'],\n            'Lumia 710': ['Nokia', 'Lumia 710'],\n            'Lumia 719': ['Nokia', 'Lumia 719'],\n            'Lumia 800': ['Nokia', 'Lumia 800'],\n            '800': ['Nokia', 'Lumia 800'],\n            'Lumia 900': ['Nokia', 'Lumia 900'],\n            'XXX': ['Nokia', 'prototype']\n        },\n\n        'SAMSUNG': {\n            'GT-I8350': [STRINGS_SAMSUNG, 'Omnia W'],\n            'GT-I8350T': [STRINGS_SAMSUNG, 'Omnia W'],\n            'SGH-i677': [STRINGS_SAMSUNG, 'Focus Flash'],\n            'SGH-i707': [STRINGS_SAMSUNG, 'Taylor'],\n            'SGH-i917': [STRINGS_SAMSUNG, 'Omnia 7'],\n            'SGH-I917': [STRINGS_SAMSUNG, 'Omnia 7'],\n            'SGH-i917.': [STRINGS_SAMSUNG, 'Focus'],\n            'SGH-i917R': [STRINGS_SAMSUNG, 'Focus'],\n            'SGH-i937': [STRINGS_SAMSUNG, 'Focus S'],\n            'OMNIA7': [STRINGS_SAMSUNG, 'Omnia 7'],\n            'OMINA7': [STRINGS_SAMSUNG, 'Omnia 7'],\n            'Taylor': [STRINGS_SAMSUNG, 'Taylor']\n        },\n\n        'TOSHIBA': {\n            'TSUNAGI': ['Toshiba', 'Tsunagi']\n        }\n    };\n\n    var ANDROID_MODELS = {\n        'Android': [null, null],\n        'google sdk': [null, null],\n        'sdk': [null, null],\n        'generic': [null, null],\n        'generic x86': [null, null],\n        'amd brazos': ['AMD', 'Fusionbased device'],\n        'Amlogic M1 reference board': ['Amlogic', 'M1 reference board'],\n        'AML8726M': ['Amlogic', 'AML8726-Mbased device'],\n        'vexpress a9': ['ARM', 'Versatile Express development platform'],\n        'bcm7231': ['Broadcom', 'BCM7231based device', 'television'],\n        'bcm7425': ['Broadcom', 'BCM7425based device', 'television'],\n        'bcm7429': ['Broadcom', 'BCM7429based device', 'television'],\n        'imx50 rdp': ['Freescale', 'i.MX50based device'],\n        'imx51 bbg': ['Freescale', 'i.MX51based device'],\n        'imx53 loco': ['Freescale', 'i.MX53based device'],\n        'imx53 mp204f3': ['Freescale', 'i.MX53based device'],\n        'imx53 smd': ['Freescale', 'i.MX53based device'],\n        'imx53 yeagle': ['Freescale', 'i.MX53based device'],\n        'imx6q': ['Freescale', 'i.MX6Qbased device'],\n        'ODROID-A': ['Hardkernel', 'ODROID-A developer tablet', 'tablet'],\n        'mfld dv10': ['Intel', 'Medfieldbased device'],\n        'mfld dv20': ['Intel', 'Medfieldbased device'],\n        'mfld lw00': ['Intel', 'Medfieldbased device'],\n        'mfld pr2': ['Intel', 'Medfieldbased device'],\n        'mfld pr3': ['Intel', 'Medfieldbased device'],\n        'berlin bg2': ['Marvell', 'Armada 1000based device', 'television'],\n        'MStar Amber3': ['MStar', 'Amber3based device'],\n        'Konka Amber3': ['MStar', 'Amber3based device'],\n        'mt5396': ['Mediatek', 'MT5396based device', 'television'],\n        'bird75v2': ['Mediatek', 'MT6575based device'],\n        'eagle75v1 2': ['Mediatek', 'MT6575based device'],\n        'MBX DVBT reference board (c03ref)': ['MXB', 'DVBT reference board', 'television'],\n        'NS2816': ['Nufront', 'NuSmart 2816based device'],\n        'Ventana': ['nVidia', 'Tegra Ventana development kit'],\n        'Cardhu': ['nVidia', 'Tegra 3based device'],\n        'Panda': ['Pandaboard', 'Development Kit'],\n        'pandaboard': ['Pandaboard', 'Development Kit'],\n        'PandaBoard': ['Pandaboard', 'Development Kit'],\n        'MSM': ['Qualcomm', 'Snapdragonbased device'],\n        'msm7227 ffa': ['Qualcomm', 'Snapdragon S1based device'],\n        'msm7627 surf': ['Qualcomm', 'Snapdragon S1based device'],\n        'msm7627a': ['Qualcomm', 'Snapdragon S1based device'],\n        'msm7627a sku1': ['Qualcomm', 'Snapdragon S1based device'],\n        'msm7627a sku3': ['Qualcomm', 'Snapdragon S1based device'],\n        'msm7630 fusion': ['Qualcomm', 'Snapdragon S2based device'],\n        'msm7630 surf': ['Qualcomm', 'Snapdragon S2based device'],\n        'msm8660 cougar': ['Qualcomm', 'Snapdragon S3based device'],\n        'msm8660 surf': ['Qualcomm', 'Snapdragon S3based device'],\n        'msm8960': ['Qualcomm', 'Snapdragon S4based device'],\n        'rk2808sdk': ['Rockchip', 'RK2808based device'],\n        'RK2818': ['Rockchip', 'RK2818based device'],\n        'rk2818sdk': ['Rockchip', 'RK2818based device'],\n        'Android-for-Rockchip-2818': ['Rockchip', 'RK2818based device'],\n        'rk29sdk': ['Rockchip', 'RK29based device'],\n        'Rk29sdk': ['Rockchip', 'RK29based device'],\n        'rk30sdk': ['Rockchip', 'RK30based device'],\n        's3c6410': ['Samsung', 'S3C6410based device'],\n        'smdk6410': ['Samsung', 'S3C6410based device'],\n        'SMDKC110': ['Samsung', 'Exynos 3110based device'],\n        'SMDKV210': ['Samsung', 'Exynos 4210based device'],\n        'S5PV210': ['Samsung', 'Exynos 4210based device'],\n        'sec smdkc210': ['Samsung', 'Exynos 4210based device'],\n        'SMDK4x12': ['Samsung', 'Exynos 4212 or 4412based device'],\n        'smp86xx': ['Sigma', 'SMP86xxbased device', 'television'],\n        'sv8860': ['Skyviia', 'SV8860based device', 'television'],\n        'ste u8500': ['ST Ericsson', 'Novathor U8500based device'],\n        'Telechips M801 Evaluation Board': ['Telechips', 'M801based device', 'television'],\n        'Telechips TCC8900 Evaluation Board': ['Telechips', 'TCC8900based device', 'television'],\n        'TCC8920 STB EV': ['Telechips', 'TCC8920based device', 'television'],\n        'OMAP': ['Texas Instruments', 'OMAPbased device'],\n        'OMAP SS': ['Texas Instruments', 'OMAPbased device'],\n        'LogicPD Zoom2': ['Texas Instruments', 'OMAPbased device'],\n        'omap3evm': ['Texas Instruments', 'OMAP3based device'],\n        'Omap5sevm': ['Texas Instruments', 'OMAP5based device'],\n        'pnx8473 kiryung': ['Trident', 'PNX8473based device', 'television'],\n        'crespo': ['Google', 'Nexus S'],\n        'Crespo': ['Google', 'Nexus S'],\n        'Crespo4G': ['Google', 'Nexus S'],\n        'Passion': ['Google', 'Nexus One'],\n        'Bravo': ['HTC', 'Desire'],\n        'dream': ['HTC', 'Dream'],\n        'Vogue': ['HTC', 'Touch'],\n        'Vendor Optimus': ['LG', 'Optimus'],\n        'Stingray': ['Motorola', 'XOOM', 'tablet'],\n        'Wingray': ['Motorola', 'XOOM', 'tablet'],\n        'maguro': ['Samsung', 'Galaxy Nexus'],\n        'Maguro': ['Samsung', 'Galaxy Nexus'],\n        'Toro-VZW': ['Samsung', 'Galaxy Nexus'],\n        'blaze': ['Texas Instruments', 'Blaze Tablet', 'tablet'],\n        'Blaze': ['Texas Instruments', 'Blaze Tablet', 'tablet'],\n        'Blaze Tablet': ['Texas Instruments', 'Blaze Tablet', 'tablet'],\n        'BlueStacks': ['BlueStacks', 'App Player', 'desktop'],\n        'youwave custom': ['Youwave', 'Android on PC', 'desktop'],\n        'A100': ['Acer', 'Iconia Tab A100', 'tablet'],\n        'A101': ['Acer', 'Iconia Tab A101', 'tablet'],\n        'A200': ['Acer', 'Iconia Tab A200', 'tablet'],\n        'A500': ['Acer', 'Iconia Tab A500', 'tablet'],\n        'A501': ['Acer', 'Iconia Tab A501', 'tablet'],\n        'A510': ['Acer', 'Iconia Tab A510', 'tablet'],\n        'A511': ['Acer', 'Iconia Tab A511', 'tablet'],\n        'A700': ['Acer', 'Iconia Tab A700', 'tablet'],\n        'Acer A800': ['Acer', 'Iconia Tab A800', 'tablet'],\n        'E110': ['Acer', 'beTouch E110'],\n        'E120': ['Acer', 'beTouch E120'],\n        'E130': ['Acer', 'beTouch E130'],\n        'E140': ['Acer', 'beTouch E140'],\n        'E210': ['Acer', 'beTouch E210'],\n        'E310': ['Acer', 'Liquid mini'],\n        'E320': ['Acer', 'Liquid Express'],\n        'E330': ['Acer', 'Liquid Glow'],\n        'E400': ['Acer', 'beTouch E400'],\n        'G100W': ['Acer', 'G100W'],\n        'S100': ['Acer', 'Liquid'],\n        'S110': ['Acer', 'Stream'],\n        'S120': ['Acer', 'Liquid mt'],\n        'S300': ['Acer', 'Iconia Smart'],\n        'S500': ['Acer', 'CloudMobile'],\n        'TD600': ['Acer', 'beTouch TD600'],\n        'Liquid': ['Acer', 'Liquid'],\n        'Liquid E': ['Acer', 'Liquid E'],\n        'Liquid Mt': ['Acer', 'Liquid mt'],\n        'Liquid MT': ['Acer', 'Liquid mt'],\n        'Liquid Metal': ['Acer', 'Liquid mt'],\n        'Stream': ['Acer', 'Stream'],\n        'N700': ['aigo', 'N700', 'tablet'],\n        'M801': ['aigo', 'M801', 'tablet'],\n        'Novo7': ['Ainovo', 'Novo7', 'tablet'],\n        'Novo7 Aurora': ['Ainovo', 'Novo7 Aurora', 'tablet'],\n        'Novo7 Advanced': ['Ainovo', 'Novo7 Advanced', 'tablet'],\n        'Novo7 Advanced2': ['Ainovo', 'Novo7 Advanced 2', 'tablet'],\n        'Novo7 Basic': ['Ainovo', 'Novo7 Basic', 'tablet'],\n        'Novo7 ELF': ['Ainovo', 'Novo7 Elf', 'tablet'],\n        'Novo7 PALADIN': ['Ainovo', 'Novo7 Paladin', 'tablet'],\n        'Novo8 Advanced': ['Ainovo', 'Novo8 Advanced', 'tablet'],\n        'one touch 890': ['Alcatel', 'One Touch 890'],\n        'one touch 890D': ['Alcatel', 'One Touch 890'],\n        'one touch 891': ['Alcatel', 'One Touch 891'],\n        'ONE TOUCH 903': ['Alcatel', 'One Touch 903SHV-E170K'],\n        'one touch 906': ['Alcatel', 'One Touch 906'],\n        'one touch 908': ['Alcatel', 'One Touch 908'],\n        'one touch 908F': ['Alcatel', 'One Touch 908'],\n        'one touch 908S': ['Alcatel', 'One Touch 908'],\n        'one touch 910': ['Alcatel', 'One Touch 910'],\n        'one touch 918': ['Alcatel', 'One Touch 918'],\n        'one touch 918D': ['Alcatel', 'One Touch 918'],\n        'ONE TOUCH 918D': ['Alcatel', 'One Touch 918'],\n        'one touch 918M': ['Alcatel', 'One Touch 918'],\n        'one touch 918N': ['Alcatel', 'One Touch 918'],\n        'one touch 980': ['Alcatel', 'One Touch 980'],\n        'one touch 980A': ['Alcatel', 'One Touch 980'],\n        'one touch 981A': ['Alcatel', 'One Touch 981'],\n        'one touch 986': ['Alcatel', 'One Touch 986'],\n        'one touch 990': ['Alcatel', 'One Touch 990'],\n        'one touch 990A': ['Alcatel', 'One Touch 990'],\n        'one touch 991': ['Alcatel', 'One Touch 991'],\n        'one touch 991D': ['Alcatel', 'One Touch 991'],\n        'ONE TOUCH 993': ['Alcatel', 'One Touch 993'],\n        'one touch 995': ['Alcatel', 'One Touch 995'],\n        'Telenor OneTouch': ['Alcatel', 'One Touch 990'],\n        'OT 918': ['Alcatel', 'One Touch 918'],\n        'Venture': ['Alcatel', 'Venture'],\n        'Allwinner A10': ['AllWinner', 'A10', 'tablet'],\n        '97FC': ['AllWinner', 'A10 97FC', 'tablet'],\n        'Kindle Fire': ['Amazon', 'Kindle Fire', 'tablet'],\n        'Amazon Kindle Fire': ['Amazon', 'Kindle Fire', 'tablet'],\n        'AMD120': ['AnyDATA', 'AnyTAB AMD120', 'tablet'],\n        'MW0811': ['AOC', 'Breeze MW0811', 'tablet'],\n        'MW0821 V2.0': ['AOC', 'Breeze MW0821', 'tablet'],\n        'MW0922': ['AOC', 'Breeze MW0922', 'tablet'],\n        'Apanda A60': ['Apanda', 'A60'],\n        'apanda-A60': ['Apanda', 'A60'],\n        'A80KSC': ['Archos', 'Arnova 8', 'tablet'],\n        'AN7CG2': ['Archos', 'Arnova 7', 'tablet'],\n        'A101B': ['Archos', 'Arnova 10', 'tablet'],\n        'AN10BG2DT': ['Archos', 'Arnova 10 B', 'tablet'],\n        'AN10G2': ['Archos', 'Arnova 10 G2', 'tablet'],\n        'A32': ['Archos', '32', 'media'],\n        'A35DE': ['Archos', '35 Smart Home Phone'],\n        'A43': ['Archos', '43', 'media'],\n        'Archos5': ['Archos', '5', 'media'],\n        'A70H': ['Archos', '7', 'tablet'],\n        'A70HB': ['Archos', '7', 'tablet'],\n        'A70BHT': ['Archos', '7', 'tablet'],\n        'A70CHT': ['Archos', '7C', 'tablet'],\n        'A70S': ['Archos', '70', 'tablet'],\n        'A7EB': ['Archos', '70B', 'tablet'],\n        'ARCHOS 70it2': ['Archos', '70 IT 2', 'tablet'],\n        'ARCHOS 80G9': ['Archos', '80 G9', 'tablet'],\n        'ARCHOS 101G9': ['Archos', '101 G9', 'tablet'],\n        'A101IT': ['Archos', '101 IT', 'tablet'],\n        'ASTRI': ['ASTRI', 'e-reader', 'ereader'],\n        'eeepc': ['Asus', 'Eee Pc'],\n        'asus laptop': ['Asus', 'Eee Pc'],\n        'ME171': ['Asus', 'Eee Pad MeMO', 'tablet'],\n        'Slider SL101': ['Asus', 'Eee Pad Slider', 'tablet'],\n        'EPAD': ['Asus', 'Eee Pad Transformer', 'tablet'],\n        'TF101': ['Asus', 'Eee Pad Transformer', 'tablet'],\n        'Transformer TF101': ['Asus', 'Eee Pad Transformer', 'tablet'],\n        'Transformer TF101G': ['Asus', 'Eee Pad Transformer', 'tablet'],\n        'TF201': ['Asus', 'Eee Pad Transformer Prime', 'tablet'],\n        'Transformer Prime TF201': ['Asus', 'Eee Pad Transformer Prime', 'tablet'],\n        'Transformer Prime': ['Asus', 'Eee Pad Transformer Prime', 'tablet'],\n        'Transformer Pad TF300T': ['Asus', 'Transformer Pad 300', 'tablet'],\n        'ASUS Transformer TF300T': ['Asus', 'Transformer Pad 300', 'tablet'],\n        'ASUS Transformer Pad TF300T': ['Asus', 'Transformer Pad 300', 'tablet'],\n        'ASUS Transformer Pad TF300TG': ['Asus', 'Transformer Pad 300', 'tablet'],\n        'ASUS Transformer Pad TF700T': ['Asus', 'Transformer Pad Infinity 700', 'tablet'],\n        'ASUS Transformer Pad TF700K': ['Asus', 'Transformer Pad Infinity 700', 'tablet'],\n        'ASUS Transformer TF700K': ['Asus', 'Transformer Pad Infinity 700', 'tablet'],\n        'PadFone': ['Asus', 'Padfone', 'tablet'],\n        'OMS TTD': ['Asus', 'Eee Pc T10'],\n        'ASUS T20': ['Asus', 'Eee Pc T20'],\n        'ETBW11AA': ['Asus', 'Tough'],\n        'AUX V900': ['AUX', 'V900'],\n        'M910A': ['AUX', 'M910'],\n        'PICOpad-QGN': ['Axioo', 'Picopad QGN', 'tablet'],\n        'NOOK': ['Barnes & Noble', 'NOOK', 'ereader'],\n        'NookColor': ['Barnes & Noble', 'NOOK Color', 'ereader'],\n        'NOOK BNRV200': ['Barnes & Noble', 'NOOK Color', 'ereader'],\n        'NOOK BNRV300': ['Barnes & Noble', 'NOOK Color', 'ereader'],\n        'NookTablet': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n        'Nook Tablet': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n        'NOOK BNTV250': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n        'NOOK BNTV250A': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n        'BNTV250': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n        'BNTV250A': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n        'NOOK Slate': ['Barnes & Noble', 'NOOK Tablet', 'ereader'],\n        'BenWee 5100': ['BenWee', '5100'],\n        'CA907AAC0G': ['Besta', 'CA907AAC0G'],\n        'BM999': ['Bmorn', 'BM999', 'tablet'],\n        'V11': ['Bmorn', 'V11', 'tablet'],\n        'V99': ['Bmorn', 'V99', 'tablet'],\n        'bq DaVinci': ['bq', 'DaVinci', 'tablet'],\n        'CT704': ['Carrefour', 'CT704', 'tablet'],\n        'CT1002': ['Carrefour', 'CT1002', 'tablet'],\n        'Camangi-Mangrove7': ['Camangi', 'Mangrove 7', 'tablet'],\n        'WS171': ['Camangi', 'WebStation', 'tablet'],\n        'IS11CA': ['Casio', 'GzOne IS11CA'],\n        'C771': ['Casio', 'GzOne Commando'],\n        'CAT NOVA': ['Cat', 'NOVA', 'tablet'],\n        'ARMM3V': ['chinaleap', 'ARMM3V', 'tablet'],\n        'CIUS-7': ['Cisco', 'Cius', 'tablet'],\n        'CIUS-7-AT': ['Cisco', 'Cius', 'tablet'],\n        'CSL Spice MI300': ['CSL', 'Spice MI300'],\n        'CSL-MI410': ['CSL', 'Spice MI410'],\n        'MID1024': ['Coby', 'Kyros MID1024', 'tablet'],\n        'MID1125': ['Coby', 'Kyros MID1125', 'tablet'],\n        'MID1126': ['Coby', 'Kyros MID1126', 'tablet'],\n        'MID7010': ['Coby', 'Kyros MID7010', 'tablet'],\n        'MID7012': ['Coby', 'Kyros MID7012', 'tablet'],\n        'MID7015': ['Coby', 'Kyros MID7015', 'tablet'],\n        'MID7015A': ['Coby', 'Kyros MID7015', 'tablet'],\n        'MID7016': ['Coby', 'Kyros MID7016', 'tablet'],\n        'MID7020': ['Coby', 'Kyros MID7020', 'tablet'],\n        'MID7022': ['Coby', 'Kyros MID7022', 'tablet'],\n        'MID7024': ['Coby', 'Kyros MID7024', 'tablet'],\n        'MID7025': ['Coby', 'Kyros MID7025', 'tablet'],\n        'MID7127': ['Coby', 'Kyros MID7127', 'tablet'],\n        'MID8024': ['Coby', 'Kyros MID8024', 'tablet'],\n        'MID8125': ['Coby', 'Kyros MID8125', 'tablet'],\n        'MID8127': ['Coby', 'Kyros MID8127', 'tablet'],\n        'Z71': ['Commtiva', 'Z71'],\n        'V-T100': ['Commtiva', 'V-T100'],\n        'FIH-FB0': ['Commtiva', 'HD700'],\n        'Coolpad D510': ['Coolpad', 'D510'],\n        'Coolpad 8020': ['Coolpad', '8020'],\n        'D530': ['Coolpad', 'D530'],\n        'Coolpad D530': ['Coolpad', 'D530'],\n        'D539': ['Coolpad', 'D539'],\n        'Coolpad D539': ['Coolpad', 'D539'],\n        'E239': ['Coolpad', 'E239'],\n        'Coolpad E239': ['Coolpad', 'E239'],\n        'Coolpad N930': ['Coolpad', 'N930'],\n        'N930': ['Coolpad', 'N930'],\n        'Coolpad W706': ['Coolpad', 'W706'],\n        'Coolpad W706+': ['Coolpad', 'W706'],\n        'Coolpad W708': ['Coolpad', 'W708'],\n        'W711': ['Coolpad', 'W711'],\n        'Coolpad 5010': ['Coolpad', '5010'],\n        'Coolpad 5210': ['Coolpad', '5210'],\n        'Coolpad 5820': ['Coolpad', '5820'],\n        '5832': ['Coolpad', '5832'],\n        'Coolpad 5832': ['Coolpad', '5832'],\n        '5855': ['Coolpad', '5855'],\n        'Coolpad 5860': ['Coolpad', '5860'],\n        'Coolpad 5860+': ['Coolpad', '5860'],\n        'Coolpad 5860s': ['Coolpad', '5860'],\n        '5860': ['Coolpad', '5860'],\n        '5860A': ['Coolpad', '5860'],\n        'Coolpad 5870': ['Coolpad', '5870'],\n        '5870': ['Coolpad', '5870'],\n        'Coolpad 7005': ['Coolpad', '7005'],\n        '7260': ['Coolpad', '7260'],\n        'Coolpad 7019': ['Coolpad', '7019'],\n        'Coolpad 7260': ['Coolpad', '7260'],\n        'Coolpad 8013': ['Coolpad', '8013'],\n        'Coolpad 8809': ['Coolpad', '8809'],\n        'Coolpad 8810': ['Coolpad', '8810'],\n        '8810': ['Coolpad', '8810'],\n        '8150': ['Coolpad', '8150'],\n        'Coolpad 8150D': ['Coolpad', '8150'],\n\n        'Coolpad 8811': ['Coolpad', '8811'],\n        'Coolpad 9900': ['Coolpad', '9900'],\n        'Coolpad 8050': ['Coolpad', '8050'],\n        'ZiiO7': ['Creative', 'ZiiO 7', 'tablet'],\n        'ZiiLABS ZiiO7': ['Creative', 'ZiiO 7', 'tablet'],\n        'ZiiLABS ZiiO10 ': ['Creative', 'ZiiO 10', 'tablet'],\n        'CUBE K8GT A': ['Cube', 'K8GT A', 'tablet'],\n        'CUBE K8GT B': ['Cube', 'K8GT B', 'tablet'],\n        'K8GT C': ['Cube', 'K8GT C', 'tablet'],\n        'K8GT H': ['Cube', 'K8GT H', 'tablet'],\n        'CUBE K8GT H': ['Cube', 'K8GT H', 'tablet'],\n        'K8GT W': ['Cube', 'K8GT W', 'tablet'],\n        'CUBE U8GT': ['Cube', 'U8GT', 'tablet'],\n        'CUBE U9GT': ['Cube', 'U9GT', 'tablet'],\n        'CUBE U9GT 2': ['Cube', 'U9GT 2', 'tablet'],\n        'Cube U9GT2': ['Cube', 'U9GT 2', 'tablet'],\n        'U9GT': ['Cube', 'U9GT', 'tablet'],\n        'U9GT2 From moage.com': ['Cube', 'U9GT 2', 'tablet'],\n        'N90 From moage.com': ['Cube', 'U9GT 2', 'tablet'],\n        'U9GT S': ['Cube', 'U9GT S', 'tablet'],\n        'U9GT S A': ['Cube', 'U9GT SA', 'tablet'],\n        'U9GTS A': ['Cube', 'U9GT SA', 'tablet'],\n        'U10GT 2': ['Cube', 'U10GT 2', 'tablet'],\n        'U10GT S': ['Cube', 'U10GT S', 'tablet'],\n        'U30GT-H': ['Cube', 'U30GT H', 'tablet'],\n        'CUBE Q7PRO': ['Cube', 'Q7 Pro', 'tablet'],\n        'CUBE Q7PRO J': ['Cube', 'Q7 Pro', 'tablet'],\n        'Cydle M7 (v0005.04.03.12.ko)': ['Cydle', 'M7 MultiPAD', 'tablet'],\n        'Dell Aero': ['Dell', 'Aero'],\n        'Dell M01M': ['Dell', 'Mini 5', 'tablet'],\n        'Dell Streak': ['Dell', 'Streak', 'tablet'],\n        '001DL': ['Dell', 'Streak', 'tablet'],\n        '101DL': ['Dell', 'Streak Pro', 'tablet'],\n        'GS01': ['Dell', 'Streak Pro', 'tablet'],\n        'Dell Streak Pro': ['Dell', 'Streak Pro', 'tablet'],\n        'streak7': ['Dell', 'Streak 7', 'tablet'],\n        'Dell Streak 7': ['Dell', 'Streak 7', 'tablet'],\n        'Dell Streak 10 Pro': ['Dell', 'Streak 10 Pro', 'tablet'],\n        'Dell V04B': ['Dell', 'Streak V04B', 'tablet'],\n        'Dell Venue': ['Dell', 'Venue'],\n        'Dell XCD35': ['Dell', 'XCD35'],\n        'XCD35': ['Dell', 'XCD35'],\n        'iDx7': ['Digma', 'iDx7', 'tablet'],\n        'iDx10': ['Digma', 'iDx10', 'tablet'],\n        'iDx10 3G': ['Digma', 'iDx10', 'tablet'],\n        'DM009SH': ['Disney Mobile', 'DM009SH'],\n        'DM010SH': ['Disney Mobile', 'DM010SH'],\n        'DM012SH': ['Disney Mobile', 'DM012SH'],\n        'F-08D': ['Disney Mobile', 'F-08D'],\n        'P-05D': ['Disney Mobile', 'P-05D'],\n        'Tablet-P27': ['DracoTek', 'P27 Tablet', 'tablet'],\n        'edgejr': ['EnTourage', 'Pocket eDGe', 'tablet'],\n        'l97D': ['EPad', 'l97D', 'tablet'],\n        'M4301': ['Eston', 'MID M4301', 'media'],\n        'P10AN': ['Exper', 'Easypad P10AN', 'tablet'],\n        'FIH-F0X': ['FIH', 'F0X'],\n        'Fly IQ260': ['Fly', 'IQ260 BlackBird'],\n        'ISW11F': ['Fujitsu', 'Arrows Z'],\n        'ISW13F': ['Fujitsu', 'Arrows Z'],\n        'IS12F': ['Fujitsu', 'Arrows ES'],\n        'F-01D': ['Fujitsu', 'Arrows Tab LTE', 'tablet'],\n        'F-03D': ['Fujitsu', 'Arrows Kiss'],\n        'F-05D': ['Fujitsu', 'Arrows X LTE'],\n        'F-07D': ['Fujitsu', 'Arrows \\u00c3\\ufffd\\u00c2\\u00bc'],\n        'F-10D': ['Fujitsu', 'Arrows X F-10D'],\n        'F-12C': ['Fujitsu', 'Globetrotter'],\n        'f12arc': ['Fujitsu', 'F12arc'],\n        'M532': ['Fujitsu', 'Stylistic M532', 'tablet'],\n        'Garminfone': ['Garmin-Asus', 'Garminfone'],\n        'Garmin-Asus A10': ['Garmin-Asus', 'Nuvifone A10'],\n        'Garmin-Asus A50': ['Garmin-Asus', 'Nuvifone A50'],\n        'TPA60W': ['Gateway', 'TPA60W', 'tablet'],\n        'Geeksphone ZERO': ['Geeksphone', 'ZERO'],\n        'gemei G2': ['Gemei', 'G2', 'tablet'],\n        'Gemei G2': ['Gemei', 'G2', 'tablet'],\n        'gemei G3': ['Gemei', 'G3', 'tablet'],\n        'Gemei G9': ['Gemei', 'G9', 'tablet'],\n        'GSmart G1317D': ['Gigabyte', 'GSmart G1317D'],\n        'Gigabyte TB100': ['Gigabyte', 'TB100', 'tablet'],\n        'GN100': ['Gionee', 'GN100'],\n        'GN105': ['Gionee', 'GN105'],\n        'GN106': ['Gionee', 'GN106'],\n        'GN200': ['Gionee', 'GN200'],\n        'GN205': ['Gionee', 'GN205'],\n        'GN700W': ['Gionee', 'GN700W'],\n        'GN708W': ['Gionee', 'GN708W'],\n        'Google Ion': ['Google', 'Ion'],\n        'Nexus One': ['Google', 'Nexus One'],\n        'NexusOne': ['Google', 'Nexus One'],\n        'HTC Nexus One': ['Google', 'Nexus One'],\n        'Nexus S': ['Google', 'Nexus S'],\n        'Google Nexus S': ['Google', 'Nexus S'],\n        'Nexus S 4G': ['Google', 'Nexus S 4G'],\n        'Dooderbutt-4.0.3-v1': ['Google', 'Nexus S 4G'],\n        'Nexus 7': ['Google', 'Nexus 7', 'tablet'],\n        'Haier HW-W910': ['Haier', 'HW-W910'],\n        'SN10T1': ['HANNspree', 'HANNSpad SN10T1', 'tablet'],\n        'SN10T2': ['HANNspree', 'HANNSpad SN10T2', 'tablet'],\n        'HannsComb': ['HANNspree', 'HANNSpad', 'tablet'],\n        'X1': ['HCL', 'ME X1', 'tablet'],\n        'MID Serails': ['Herotab', 'C8', 'tablet'],\n        'MID Serials': ['Herotab', 'C8', 'tablet'],\n        'COSMO DUO': ['Hiscreen', 'Cosmo DUO', 'tablet'],\n        'HS-U8': ['Hisense', 'U8'],\n        'HS-T92': ['Hisense', 'T92'],\n        'HS-E860': ['Hisense', 'E860'],\n        'HS-E910': ['Hisense', 'E910'],\n        'HS-E926': ['Hisense', 'E926'],\n\n        'HS-EG900': ['Hisense', 'EG900'],\n        'HS-ET919': ['Hisense', 'ET919'],\n        'EG968B': ['Hisense', 'EG968B'],\n        'HKPHONE H8-3G': ['HKPhone', 'H8 3G'],\n        'HOSIN U2': ['Hosin', 'U2'],\n        'Touchpad': ['HP', 'TouchPad', 'tablet'],\n        'HP Touchpad': ['HP', 'TouchPad', 'tablet'],\n        'cm tenderloin': ['HP', 'TouchPad', 'tablet'],\n        'aokp tenderloin': ['HP', 'TouchPad', 'tablet'],\n        'HTC Amaze 4G': ['HTC', 'Amaze 4G'],\n        'HTC Ruby': ['HTC', 'Amaze 4G'],\n        'HTC Amaze 4G(Ruby)': ['HTC', 'Amaze 4G'],\n        'Amaze 4G': ['HTC', 'Amaze 4G'],\n        'HTC Aria': ['HTC', 'Aria'],\n        'HTC Aria A6380': ['HTC', 'Aria'],\n        'HTC Liberty A6380': ['HTC', 'Aria'],\n        'HTC Liberty': ['HTC', 'Aria'],\n        'HTC A6366': ['HTC', 'Aria'],\n        'HTC Bee': ['HTC', 'Bee'],\n        'HTC ChaCha': ['HTC', 'ChaCha'],\n        'HTC ChaCha A810e': ['HTC', 'ChaCha'],\n        'HTC ChaChaCha A810e': ['HTC', 'ChaCha'],\n        'HTC A810e': ['HTC', 'ChaCha'],\n        'HTC A9188': ['HTC', 'Tianxi'],\n        'HTC Bravo': ['HTC', 'Desire'],\n        'HTC Desire': ['HTC', 'Desire'],\n        'HTC Desire A8181': ['HTC', 'Desire'],\n        'HTC Desire A8183': ['HTC', 'Desire'],\n        'HTC Desire Beats A8181': ['HTC', 'Desire'],\n        'HTC Desire CDMA': ['HTC', 'Desire'],\n        'HTC Desire SMS': ['HTC', 'Desire'],\n        'HTC Desire S.M.S': ['HTC', 'Desire'],\n        'HTC Desire C': ['HTC', 'Desire C'],\n        'HTC DesireHD': ['HTC', 'Desire HD'],\n        'HTC DesireHD A9191': ['HTC', 'Desire HD'],\n        'HTC DesireHD A9192': ['HTC', 'Desire HD'],\n        'HTC Desire HD A9191': ['HTC', 'Desire HD'],\n        'HTC A9191': ['HTC', 'Desire HD'],\n        'HTC A9191 for AT&T': ['HTC', 'Desire HD'],\n        'HTC A9192': ['HTC', 'Desire HD'],\n        'HTC Desire HD': ['HTC', 'Desire HD'],\n        'HTC Desire HD with Beats Audio': ['HTC', 'Desire HD'],\n        'HTC Desire S': ['HTC', 'Desire S'],\n        'HTC DesireS': ['HTC', 'Desire S'],\n        'HTC DesiresS': ['HTC', 'Desire S'],\n        'HTC DesireS S510e': ['HTC', 'Desire S'],\n        'HTC DesireS S510b': ['HTC', 'Desire S'],\n        'HTC Desire S S510e': ['HTC', 'Desire S'],\n        'HTC S510e': ['HTC', 'Desire S'],\n        'HTC Desire Saga': ['HTC', 'Desire S'],\n        'HTC Desire V': ['HTC', 'Desire V'],\n        'HTC T328w': ['HTC', 'Desire V'],\n        'HTC Desire VC': ['HTC', 'Desire VC'],\n        'HTC T328d': ['HTC', 'Desire VC'],\n        'HTC T328t': ['HTC', 'Desire VT'],\n        'HTC Desire Z': ['HTC', 'Desire Z'],\n        'HTC DesireZ': ['HTC', 'Desire Z'],\n        'HTC DesireZ A7272': ['HTC', 'Desire Z'],\n        'HTC Desire Z A7272': ['HTC', 'Desire Z'],\n        'HTC Vision': ['HTC', 'Desire Z'],\n        'HTC A7275': ['HTC', 'Desire Z'],\n        'HTC Dream': ['HTC', 'Dream'],\n        'HTC S710d': ['HTC', 'Droid Incredible 2'],\n        'HTC Incredible 2': ['HTC', 'Droid Incredible 2'],\n        'HTC X515d': ['HTC', 'EVO 3D'],\n        'HTC X515m': ['HTC', 'EVO 3D'],\n        'HTC X515C': ['HTC', 'EVO 3D'],\n        'HTC Evo 3D': ['HTC', 'EVO 3D'],\n        'HTC EVO 3D': ['HTC', 'EVO 3D'],\n        'HTC EVO 3D GSM': ['HTC', 'EVO 3D'],\n        'HTC EVO 3D X515a': ['HTC', 'EVO 3D'],\n        'HTC EVO 3D GSM X515m': ['HTC', 'EVO 3D'],\n        'HTC EVO 3D X515m': ['HTC', 'EVO 3D'],\n        'HTC EVO 3D X515M': ['HTC', 'EVO 3D'],\n        'HTC EVO3D X515a': ['HTC', 'EVO 3D'],\n        'HTC EVO3D X515m': ['HTC', 'EVO 3D'],\n        'HTC Evo 3D X515m': ['HTC', 'EVO 3D'],\n        'HTC Evo 3D with Beats Audio X515m': ['HTC', 'EVO 3D'],\n        'HTC Evo 4G': ['HTC', 'EVO 4G'],\n        'HTC EVO 4G': ['HTC', 'EVO 4G'],\n        'HTC X515E': ['HTC', 'EVO 4G+'],\n        'HTC EVO 4G+ For Sprint': ['HTC', 'EVO 4G+'],\n        'HTC EVO 4G++ For Sprint': ['HTC', 'EVO 4G+'],\n        'HTC C715c': ['HTC', 'EVO Design 4G'],\n        'HTC Design 4G': ['HTC', 'EVO Design 4G'],\n        'HTC EVO design 4G': ['HTC', 'EVO Design 4G'],\n        'HTC EVO Design 4G': ['HTC', 'EVO Design 4G'],\n        'HTC Evo Shift': ['HTC', 'EVO Shift'],\n        'HTC EVO Shift 4G': ['HTC', 'EVO Shift'],\n        'HTC A310e': ['HTC', 'Explorer'],\n        'HTC Explorer': ['HTC', 'Explorer'],\n        'HTC Explorer A310b': ['HTC', 'Explorer'],\n        'HTC Explorer A310e': ['HTC', 'Explorer'],\n        'HTC P510e': ['HTC', 'Flyer', 'tablet'],\n        'HTC Flyer': ['HTC', 'Flyer', 'tablet'],\n        'HTC Flyer P510e': ['HTC', 'Flyer', 'tablet'],\n        'HTC Flyer P512': ['HTC', 'Flyer', 'tablet'],\n        'HTC Flyer P512 NA': ['HTC', 'Flyer', 'tablet'],\n        'HTC P515E': ['HTC', 'Flyer 4G', 'tablet'],\n        'HTC Gratia A6380': ['HTC', 'Gratia'],\n        'HTC HD': ['HTC', 'HD'],\n        'HTC HD2': ['HTC', 'HD2'],\n        'HTC HD2 T8585': ['HTC', 'HD2'],\n        'HTC HD2(Leo)': ['HTC', 'HD2'],\n        'HTC HD7': ['HTC', 'HD7'],\n        'HTC T9299+': ['HTC', 'HD7'],\n        'HTC HD7 for Sprint': ['HTC', 'HD7'],\n        'HTC HD7 4G T9299 For AT&T': ['HTC', 'HD7'],\n        'HTC HD7 4G T9299+ For AT&T': ['HTC', 'HD7'],\n        'HTC T9299+ For AT&T': ['HTC', 'HD7'],\n        'HTC HD7S T9399+': ['HTC', 'HD7s'],\n        'HTC HD7S T9899+': ['HTC', 'HD7s'],\n        'HTC T9899+ For AT&T': ['HTC', 'HD7s'],\n        'VitMod ExtraLite 1.6.5.fullodex for HTC HD7 Pro': ['HTC', 'HD7 Pro'],\n        'HTC Hero': ['HTC', 'Hero'],\n        'HTC HERO': ['HTC', 'Hero'],\n        'HTC Hero CDMA': ['HTC', 'Hero'],\n        'HTC HERO CDMA': ['HTC', 'Hero'],\n        'HTC HERO200': ['HTC', 'Hero 200'],\n        'HTC Hero S': ['HTC', 'Hero S'],\n        'HTC IMAGIO': ['HTC', 'Imagio'],\n        'HTC Incredible': ['HTC', 'Incredible'],\n        'HTC Incredible S710E': ['HTC', 'Incredible S'],\n        'HTC S710e': ['HTC', 'Incredible S'],\n        'HTC Incredible S': ['HTC', 'Incredible S'],\n        'HTC Incredible S S710e': ['HTC', 'Incredible S'],\n        'HTC Incredible S s710e': ['HTC', 'Incredible S'],\n        'HTC IncredibleS S710e': ['HTC', 'Incredible S'],\n        'HTC Incredible S with Beats Audio': ['HTC', 'Incredible S'],\n        'HTC Vivo': ['HTC', 'Incredible S'],\n        'HTC Innovation': ['HTC', 'Innovation'],\n        'HTC Inspire 4G': ['HTC', 'Inspire 4G'],\n        'HTC HD7 Inspire 4G For Vodafone': ['HTC', 'Inspire 4G'],\n        'HTC P715a': ['HTC', 'Jetstream', 'tablet'],\n        'HTC Legend': ['HTC', 'Legend'],\n        'HTC Magic': ['HTC', 'Magic'],\n        'HTC Sapphire': ['HTC', 'Magic'],\n        'HTC Lexikon': ['HTC', 'Merge'],\n        'HTC One S': ['HTC', 'One S'],\n        'HTC Z520e': ['HTC', 'One S'],\n        'HTC One V': ['HTC', 'One V'],\n        'HTC T320e': ['HTC', 'One V'],\n        'HTC One X': ['HTC', 'One X'],\n        'HTC S720e': ['HTC', 'One X'],\n        'HTC Endeavour-LS': ['HTC', 'One X'],\n        'HTC One XL': ['HTC', 'One XL'],\n        'HTC X710a': ['HTC', 'Raider 4G'],\n        'HTC Raider': ['HTC', 'Raider 4G'],\n        'HTC Raider X710e': ['HTC', 'Raider 4G'],\n        'HTC Raider X710s': ['HTC', 'Raider 4G'],\n        'HTC Raider 4G X710e': ['HTC', 'Raider 4G'],\n        'HTC PH39100': ['HTC', 'Raider 4G'],\n        'HTC Holiday': ['HTC', 'Raider 4G'],\n        'HTC Velocity 4G X710s': ['HTC', 'Raider 4G'],\n        'HTC Rezound': ['HTC', 'Rezound'],\n        'HTC Rhyme S510b': ['HTC', 'Rhyme'],\n        'HTC S510b': ['HTC', 'Rhyme'],\n        'HTC Bliss': ['HTC', 'Rhyme'],\n        'HTC Bliss S510b': ['HTC', 'Rhyme'],\n        'HTC Salsa C510e': ['HTC', 'Salsa'],\n        'HTC C510e': ['HTC', 'Salsa'],\n        'HTC Z710a': ['HTC', 'Sensation'],\n        'HTC Z710e': ['HTC', 'Sensation'],\n        'HTC Z710t': ['HTC', 'Sensation'],\n        'HTC Sensation': ['HTC', 'Sensation'],\n        'HTC Sensation Z710': ['HTC', 'Sensation'],\n        'HTC Sensation Z710a': ['HTC', 'Sensation'],\n        'HTC Sensation Z710e': ['HTC', 'Sensation'],\n        'HTC Sensation Z710E': ['HTC', 'Sensation'],\n        'HTC Sensation Z710e For AT&T': ['HTC', 'Sensation'],\n        'HTC Sensation Z710e with Beats Audio': ['HTC', 'Sensation'],\n        'HTC Sensation with Beats Audio Z710e': ['HTC', 'Sensation'],\n        'HTC Sensation with Beats Audio': ['HTC', 'Sensation'],\n        'HTC Sensation Taste': ['HTC', 'Sensation'],\n        'HTC Pyramid': ['HTC', 'Sensation'],\n        'HTC Pyramid Z710a': ['HTC', 'Sensation'],\n        'HTC Pyramid Z710e': ['HTC', 'Sensation'],\n        'HTC Sensation 4G': ['HTC', 'Sensation'],\n        'HTC Sensation 4G with Beats Audio': ['HTC', 'Sensation'],\n        'HTC Sensation G14': ['HTC', 'Sensation'],\n        'HTC Sensation G14 for AT&T': ['HTC', 'Sensation'],\n        'HTC G14 sensation': ['HTC', 'Sensation'],\n        'HTC Z715e': ['HTC', 'Sensation XE'],\n        'HTC Sensation Z715e': ['HTC', 'Sensation XE'],\n        'HTC SensationXE Beats': ['HTC', 'Sensation XE'],\n        'HTC SensationXE Beats Z715a': ['HTC', 'Sensation XE'],\n        'HTC SensationXE Beats Z715e': ['HTC', 'Sensation XE'],\n        'HTC Sensation XE': ['HTC', 'Sensation XE'],\n        'HTC Sensation XE Z715e': ['HTC', 'Sensation XE'],\n        'HTC SensationXE Z715e': ['HTC', 'Sensation XE'],\n        'HTC Sensation XE Beats': ['HTC', 'Sensation XE'],\n        'HTC SensationXE with Beats Audio': ['HTC', 'Sensation XE'],\n        'HTC Sensation XE with Beats Audio': ['HTC', 'Sensation XE'],\n        'HTC Sensation XE with Beats Audio Z715a': ['HTC', 'Sensation XE'],\n        'HTC Sensation Juredroid XE Beats Audio': ['HTC', 'Sensation XE'],\n        'HTC Sensation XE with Beats Audio Z715e': ['HTC', 'Sensation XE'],\n        'HTC Sensation XE With Beats Audio Z715e': ['HTC', 'Sensation XE'],\n        'HTC Sensation 4G XE with Beats Audio': ['HTC', 'Sensation XE'],\n        'HTC Sensation with Beats Audio Z715e': ['HTC', 'Sensation XE'],\n        'HTC X315E': ['HTC', 'Sensation XL'],\n        'HTC SensationXL Beats X315b': ['HTC', 'Sensation XL'],\n        'HTC SensationXL Beats X315e': ['HTC', 'Sensation XL'],\n        'HTC Sensation XL with Beats Audio X315b': ['HTC', 'Sensation XL'],\n        'HTC Sensation XL with Beats Audio X315e': ['HTC', 'Sensation XL'],\n        'HTC Runnymede': ['HTC', 'Sensation XL'],\n        'HTC G21': ['HTC', 'Sensation XL'],\n        'HTC PH06130': ['HTC', 'Status'],\n        'HTC Status': ['HTC', 'Status'],\n        'HTC Tattoo': ['HTC', 'Tattoo'],\n        'HTC TATTOO A3288': ['HTC', 'Tattoo'],\n        'HTC click': ['HTC', 'Tattoo'],\n        'HTC X310e': ['HTC', 'Titan'],\n        'HTC T7373': ['HTC', 'Touch Pro II'],\n        'HTC ThunderBolt': ['HTC', 'ThunderBolt'],\n        'HTC Mecha': ['HTC', 'ThunderBolt'],\n        'HTC Velocity 4G': ['HTC', 'Velocity 4G'],\n        'HTC Wildfire': ['HTC', 'Wildfire'],\n        'HTC Wildfire A3333': ['HTC', 'Wildfire'],\n        'HTC A3366': ['HTC', 'Wildfire'],\n        'HTC A3380': ['HTC', 'Wildfire'],\n        'HTC WildfireS': ['HTC', 'Wildfire S'],\n        'HTC Wildfire S': ['HTC', 'Wildfire S'],\n        'Htc Wildfire s': ['HTC', 'Wildfire S'],\n        'HTC Wildfire S A510e': ['HTC', 'Wildfire S'],\n        'HTC Wildfire S A510b': ['HTC', 'Wildfire S'],\n        'HTC WildfireS A510e': ['HTC', 'Wildfire S'],\n        'HTC WildfireS A510b': ['HTC', 'Wildfire S'],\n        'htc wildfire s a510e': ['HTC', 'Wildfire S'],\n        'HTC Wildfire S A515c': ['HTC', 'Wildfire S'],\n        'HTC A510a': ['HTC', 'Wildfire S'],\n        'HTC A510e': ['HTC', 'Wildfire S'],\n        'HTC A510c': ['HTC', 'Wildfire S'],\n        'HTCX06HT': ['HTC', 'Desire'],\n        'HTC A6390': ['HTC', 'A6390'],\n        'HTC A8180': ['HTC', 'A8180'],\n        'HTC PG762': ['HTC', 'PG762'],\n        'HTC S715e': ['HTC', 'S715e'],\n        'HTC S720t': ['HTC', 'S720t'],\n        'HTC Z510d': ['HTC', 'Z510d'],\n        'HTC Z560e': ['HTC', 'Z560e'],\n        'HTC VLE U': ['HTC', 'One S'],\n        'HTC VLE#U': ['HTC', 'One S'],\n        'HTC VIE U': ['HTC', 'One S'],\n        'HTC EVA UL': ['HTC', 'One V'],\n        'HTC ENR U': ['HTC', 'One X'],\n        'ENR U': ['HTC', 'One X'],\n        'EndeavorU': ['HTC', 'One X'],\n        'Liberty': ['HTC', 'Aria'],\n        'Desire': ['HTC', 'Desire'],\n        'Desire A8181': ['HTC', 'Desire'],\n        'desire hd': ['HTC', 'Desire HD'],\n        'Desire HD': ['HTC', 'Desire HD'],\n        'Dedire HD': ['HTC', 'Desire HD'],\n        'Desire Hd (ace)': ['HTC', 'Desire HD'],\n        'Desire S': ['HTC', 'Desire S'],\n        'DesireS': ['HTC', 'Desire S'],\n        'Desire Saga': ['HTC', 'Desire S'],\n        'Desire Z': ['HTC', 'Desire Z'],\n        'Dream': ['HTC', 'Dream'],\n        'Droid Incredible': ['HTC', 'Droid Incredible'],\n        'EVO': ['HTC', 'EVO'],\n        'Evo HD2': ['HTC', 'EVO HD'],\n        'Evo 3D Beats X515m': ['HTC', 'EVO 3D'],\n        'Evo 3D GSM': ['HTC', 'EVO 3D'],\n        'EVO 3D X515m': ['HTC', 'EVO 3D'],\n        'EVO3D X515m': ['HTC', 'EVO 3D'],\n        'Evo 4G': ['HTC', 'EVO 4G'],\n        'EVO 4G': ['HTC', 'EVO 4G'],\n        'photon': ['HTC', 'HD mini'],\n        'GinDream\\/GinMagic': ['HTC', 'Dream'],\n        'HD2': ['HTC', 'HD2'],\n        'HD7  Pro': ['HTC', 'HD7 Pro'],\n        'Hero': ['HTC', 'Hero'],\n        'HERO CDMA': ['HTC', 'Hero'],\n        'HERO200': ['HTC', 'Hero 200'],\n        'Incredible': ['HTC', 'Droid Incredible'],\n        'Incredible 2': ['HTC', 'Droid Incredible 2'],\n        'Incredible S': ['HTC', 'Incredible S'],\n        'IncredibleS S710e': ['HTC', 'Incredible S'],\n        'IncredibleS': ['HTC', 'Incredible S'],\n        'Inspire HD': ['HTC', 'Inspire 4G'],\n        'Inspire 4G': ['HTC', 'Inspire 4G'],\n        'Legend': ['HTC', 'Legend'],\n        'NexusHD2': ['HTC', 'HD2'],\n        'Nexus HD2': ['HTC', 'HD2'],\n        'Docomo HT-03A': ['HTC', 'Magic'],\n        'MIUI.us Sensation 4G': ['HTC', 'Sensation 4G'],\n        'SiRF Dream': ['HTC', 'Dream'],\n        'Pyramid': ['HTC', 'Sensation'],\n        'Sensation': ['HTC', 'Sensation'],\n        'Sensation Z710e': ['HTC', 'Sensation'],\n        'Sensation 4G': ['HTC', 'Sensation'],\n        'Sensation 4g': ['HTC', 'Sensation'],\n        'TripNiCE Pyramid': ['HTC', 'Sensation'],\n        'SensationXE Beats Z715e': ['HTC', 'Sensation XE'],\n        'SensationXL Beats X315e': ['HTC', 'Sensation XL'],\n        'Click': ['HTC', 'Tattoo'],\n        'Wildfire': ['HTC', 'Wildfire'],\n        'Wildfire S': ['HTC', 'Wildfire S'],\n        'Wildfire S A510e': ['HTC', 'Wildfire S'],\n        'Sprint APX515CKT': ['HTC', 'EVO 3D'],\n        'Sprint APA9292KT': ['HTC', 'EVO 4G'],\n        'Sprint APA7373KT': ['HTC', 'EVO Shift 4G'],\n        'Sprint APC715CKT': ['HTC', 'EVO Design 4G'],\n        'A3380': ['HTC', 'Wildfire'],\n        'A6277': ['HTC', 'Hero'],\n        'a7272': ['HTC', 'Desire Z'],\n        'A7272+(HTC DesireZ)': ['HTC', 'Desire Z'],\n        'S31HT': ['HTC', 'Aria'],\n        'S710d': ['HTC', 'Droid Incredible 2'],\n        'S710D': ['HTC', 'Droid Incredible 2'],\n        'X06HT': ['HTC', 'Desire'],\n        '001HT': ['HTC', 'Desire HD'],\n        'X325a': ['HTC', 'One X'],\n        'Z520m': ['HTC', 'One S'],\n        'Z710': ['HTC', 'Sensation'],\n        'Z710e': ['HTC', 'Sensation'],\n        'T9199h': ['HTC', 'T9199h'],\n        'HTC S610d': ['HTC', 'S610d'],\n        'ADR6200': ['HTC', 'Droid Eris'],\n        'ADR6300': ['HTC', 'Droid Incredible'],\n        'ADR6325VW': ['HTC', 'Merge'],\n        'ADR6330VW': ['HTC', 'Rhyme'],\n        'ADR6350': ['HTC', 'Droid Incredible 2'],\n        'ADR6400L': ['HTC', 'Thunderbolt 4G'],\n        'ADR6400L 4G': ['HTC', 'Thunderbolt 4G'],\n        'ADR6410LVW 4G': ['HTC', 'Fireball'],\n        'ADR6425LVW': ['HTC', 'Rezound'],\n        'ADR6425LVW 4G': ['HTC', 'Rezound'],\n        'Coquettish Red': ['HTC', 'Rezound'],\n        'PB99400': ['HTC', 'Droid Incredible'],\n        'pcdadr6350': ['HTC', 'Droid Incredible 2'],\n        'PC36100': ['HTC', 'EVO 4G'],\n        'PG06100': ['HTC', 'EVO Shift 4G'],\n        'PG41200': ['HTC', 'EVO View 4G', 'tablet'],\n        'PG86100': ['HTC', 'EVO 3D'],\n        'PG8610000': ['HTC', 'EVO 3D'],\n        'PH44100': ['HTC', 'EVO Design 4G'],\n        'PJ83100': ['HTC', 'One X'],\n        'ISW11HT': ['HTC', 'EVO 4G'],\n        'ISW12HT': ['HTC', 'EVO 3D'],\n        'ISW13HT': ['HTC', 'J'],\n        'USCCADR6275US Carrier ID 45': ['HTC', 'Desire'],\n        'USCCADR6285US': ['HTC', 'Hero S'],\n        'USCCADR6325US Carrier ID 45': ['HTC', 'Merge'],\n        'MediaPad': ['Huawei', 'MediaPad', 'tablet'],\n        'Huawei MediaPad': ['Huawei', 'MediaPad', 'tablet'],\n        'HUAWEI MediaPad': ['Huawei', 'MediaPad', 'tablet'],\n        'Huawei S7-312u': ['Huawei', 'MediaPad', 'tablet'],\n        'MediaPad 10 FHD': ['Huawei', 'MediaPad', 'tablet'],\n        'Huawei C8500': ['Huawei', 'C8500'],\n        'Huawei C8500S': ['Huawei', 'C8500'],\n        'Huawei C8600': ['Huawei', 'C8600'],\n        'Huawei C8650': ['Huawei', 'C8650'],\n        'Huawei C8650+': ['Huawei', 'C8650'],\n        'Huawei C8800': ['Huawei', 'IDEOS X5'],\n        'Huawei C8810': ['Huawei', 'Ascend G300'],\n        'Huawei C8812': ['Huawei', 'Ascend C8812'],\n        'Huawei C8812E': ['Huawei', 'Ascend C8812'],\n        'Huawei C8825D': ['Huawei', 'Ascend C8825D'],\n        'Huawei C8860E': ['Huawei', 'Honor'],\n        'Huawei M835': ['Huawei', 'M835'],\n        'Huawei M860': ['Huawei', 'Ascend'],\n        'Huawei M921': ['Huawei', 'M921'],\n        'Huawei S8520': ['Huawei', 'S8520'],\n        'Huawei S8600': ['Huawei', 'S8600'],\n        'Huawei T8300': ['Huawei', 'T8300'],\n        'Huawei T8600': ['Huawei', 'T8600'],\n        'Huawei T8830': ['Huawei', 'T8830'],\n        'T8830': ['Huawei', 'T8830'],\n        'T8620': ['Huawei', 'T8620'],\n        'Huawei T8828': ['Huawei', 'T8828'],\n        'Huawei U8220': ['Huawei', 'U8220'],\n        'Huawei u8500': ['Huawei', 'IDEOS X2'],\n        'Huawei U8815': ['Huawei', 'Ascend G300'],\n        'Huawei U8825D': ['Huawei', 'Ascend G330D'],\n        'Huawei U8850': ['Huawei', 'Vision'],\n        'Huawei U8652': ['Huawei', 'Sonic'],\n        'Huawei U8800-51': ['Huawei', 'IDEOS X5'],\n        'Huawei U8818': ['Huawei', 'Ascend G300'],\n        'Huawei U9000': ['Huawei', 'Ascend X'],\n        'Huawei IDEOS U8500': ['Huawei', 'IDEOS X2'],\n        'Huawei IDEOS U8650': ['Huawei', 'Sonic'],\n        'Huawei IDEOS X3': ['Huawei', 'IDEOS X3'],\n        'Huawei Ideos X5': ['Huawei', 'IDEOS X5'],\n        'Huawei Ideos X5 1.12.9(ret4rt)': ['Huawei', 'IDEOS X5'],\n        'Huawei SONIC': ['Huawei', 'Sonic'],\n        'Huawei 8100-9': ['Huawei', 'U8100'],\n        'FUSIONideos': ['Huawei', 'IDEOS'],\n        'Gnappo Ideos': ['Huawei', 'IDEOS'],\n        'Ideos': ['Huawei', 'IDEOS'],\n        'IDEOS X5': ['Huawei', 'IDEOS X5'],\n        'Ideos S7': ['Huawei', 'IDEOS S7', 'tablet'],\n        'IDEOS S7': ['Huawei', 'IDEOS S7', 'tablet'],\n        'IDEOS S7 Slim': ['Huawei', 'IDEOS S7', 'tablet'],\n        'Huawei S7': ['Huawei', 'IDEOS S7', 'tablet'],\n        'SONIC': ['Huawei', 'Sonic'],\n        'Kyivstar Aqua': ['Huawei', 'Sonic'],\n        'Lucky Ultra Sonic U8650': ['Huawei', 'Sonic'],\n        'Turkcell T20': ['Huawei', 'Sonic'],\n        'MTC 950': ['Huawei', 'U8160'],\n        'MTC 955': ['Huawei', 'Sonic'],\n        'MTC Evo': ['Huawei', 'C8500'],\n        'MTC Android': ['Huawei', 'U8110'],\n        'S31HW': ['Huawei', 'Pocket WiFi S'],\n        'S41HW': ['Huawei', 'Pocket WiFi S II'],\n        '007HW': ['Huawei', 'Vision'],\n        'UM840': ['Huawei', 'Evolution'],\n        'M860': ['Huawei', 'Ascend'],\n        'M865': ['Huawei', 'Ascend II'],\n        'M886': ['Huawei', 'Glory'],\n        'C8150': ['Huawei', 'IDEOS'],\n        'c8500': ['Huawei', 'C8500'],\n        'C8500': ['Huawei', 'C8500'],\n        'C8500S': ['Huawei', 'C8500'],\n        'C8600': ['Huawei', 'C8600'],\n        'c8650': ['Huawei', 'C8650'],\n        'C8650': ['Huawei', 'C8650'],\n        'c8800': ['Huawei', 'C8800'],\n        'C8800': ['Huawei', 'C8800'],\n        'c8810': ['Huawei', 'Ascend G300C'],\n        'C8812': ['Huawei', 'Ascend C8812'],\n        'S8600': ['Huawei', 'S8600'],\n        'U8100': ['Huawei', 'U8100'],\n        'U8110': ['Huawei', 'U8110'],\n        'u8120': ['Huawei', 'U8120'],\n        'U8120': ['Huawei', 'U8120'],\n        'U8180': ['Huawei', 'IDEOS X1'],\n        'U8220': ['Huawei', 'Pulse'],\n        'U8300': ['Huawei', 'U8300'],\n        'U8350': ['Huawei', 'Boulder'],\n        'U8150': ['Huawei', 'IDEOS'],\n        'U8160': ['Huawei', 'U8160'],\n        'U8500': ['Huawei', 'IDEOS X2'],\n        'U8500 HiQQ': ['Huawei', 'U8500 HiQQ Edition'],\n        'U8510': ['Huawei', 'IDEOS X3'],\n        'u8650': ['Huawei', 'Sonic'],\n        'U8650': ['Huawei', 'Sonic'],\n        'U8650-1': ['Huawei', 'Sonic'],\n        'U8660': ['Huawei', 'Sonic'],\n        'u8800': ['Huawei', 'IDEOS X5'],\n        'U8800': ['Huawei', 'IDEOS X5'],\n        'U8800+': ['Huawei', 'IDEOS X5'],\n        'U8800X': ['Huawei', 'IDEOS X5'],\n        'U8800pro': ['Huawei', 'IDEOS X5 Pro'],\n        'U8800PRO': ['Huawei', 'IDEOS X5 Pro'],\n        'U8800Pro': ['Huawei', 'IDEOS X5 Pro'],\n        'u8800pro': ['Huawei', 'IDEOS X5 Pro'],\n        'U8800 Pro': ['Huawei', 'IDEOS X5 Pro'],\n        'U8818': ['Huawei', 'Ascend G300'],\n        'U8850': ['Huawei', 'Vision'],\n        'u8860': ['Huawei', 'Honor'],\n        'U8860': ['Huawei', 'Honor'],\n        'U9000': ['Huawei', 'Ascend X'],\n        'U9200': ['Huawei', 'Ascend P1'],\n        'U9200-1': ['Huawei', 'Ascend P1'],\n        'U9500': ['Huawei', 'Ascend D1'],\n        'U9501L': ['Huawei', 'Ascend D LTE'],\n        'U9510': ['Huawei', 'Ascend D quad'],\n        'U9510E': ['Huawei', 'Ascend D quad'],\n        'Comet': ['Huawei', 'Comet'],\n        'GS02': ['Huawei', 'Honor'],\n        'GS03': ['Huawei', 'Ascend P1'],\n        'DroniX-0.5': ['Huawei', 'U8180'],\n        'MTS-SP101': ['Huawei', 'C8511'],\n        'TSP21': ['Huawei', 'U8110'],\n        'HYUNDAI H6': ['Hyundai', 'Storm H6'],\n        'iBall Slide i7011': ['iBall', 'Slide i7011'],\n        'NetTAB RUNE': ['IconBit', 'NetTab Rune', 'tablet'],\n        'D70W': ['Icoo', 'D70W', 'tablet'],\n        'D80': ['Icoo', 'D80', 'tablet'],\n        'INFOBAR A01': ['iida', 'INFOBAR A01'],\n        'M009F': ['Infotmic', 'M009F'],\n        'AZ210A': ['Intel', 'AZ210A'],\n        'AZ210B': ['Intel', 'AZ210B'],\n        'AZ510': ['Intel', 'AZ510'],\n        'greenridge': ['Intel', 'Green Ridge', 'tablet'],\n        'INQ Cloud Touch': ['INQ', 'Cloud Touch'],\n        'ILT-MX100': ['iRiver', 'Tab', 'tablet'],\n        'IVIO_DE38': ['Ivio', 'DE38'],\n        'JY-G2': ['Jiayu', 'G2'],\n        'JXD S601WIFI': ['JXD', 'S601 WIFI', 'media'],\n        'A2': ['KakaTech', 'A2'],\n        'D91': ['KK', 'D91', 'tablet'],\n        'K080': ['Kobo', 'K080', 'ereader'],\n        'A106': ['koobee', 'A160'],\n        'KPT A9': ['KPT', 'A9'],\n        'EV-S100': ['Kttech', 'Take EV-S100'],\n        'KM-S120': ['Kttech', 'Take 2 KM-S120'],\n        'KM-S200': ['TAKE', 'Janus KM-S200'],\n        'KM-S220': ['Kttech', 'Take Tachy KM-S220'],\n        'Kyobo mirasol eReader': ['Kyobo', 'eReader', 'ereader'],\n        'ISW11K': ['Kyocera', 'Digno'],\n        'JC-KSP8000': ['Kyocera', 'Echo'],\n        'KSP8000': ['Kyocera', 'Echo'],\n        'Zio': ['Kyocera', 'Zio'],\n        'C5155': ['Kyocera', 'C5155'],\n        'C5170': ['Kyocera', 'C5170'],\n        'M9300': ['Kyocera', 'M9300'],\n        'E800': ['K-Touch', 'E800'],\n        'W606': ['K-Touch', 'W606'],\n        'K-Touch T619': ['K-Touch', 'T619'],\n        'K-Touch W619': ['K-Touch', 'W619'],\n        'K-Touch W650': ['K-Touch', 'W650'],\n        'W700': ['K-Touch', 'W700'],\n        'W800': ['K-Touch', 'W800'],\n        'W806': ['K-Touch', 'W806'],\n        'W808': ['K-Touch', 'W808'],\n        'W810': ['K-Touch', 'W810'],\n        'X900': ['Lava', 'XOLO X900'],\n        'Lenovo A798t': ['Lenovo', 'A798t'],\n        'LENOVO-Lenovo-A288t': ['Lenovo', 'LePhone A288'],\n        'ThinkPad Tablet': ['Lenovo', 'ThinkPad Tablet', 'tablet'],\n        'K1': ['Lenovo', 'IdeaPad K1', 'tablet'],\n        'Ideapad S10-3T': ['Lenovo', 'IdeaPad S10-3T', 'tablet'],\n        'S2005A-H': ['Lenovo', 'S2005A'],\n        'IdeaTab S2007A-D': ['Lenovo', 'IdeaTab S2007A', 'tablet'],\n        'IdeaTabV2007A': ['Lenovo', 'IdeaTab V2007A', 'tablet'],\n        'IdeaTabV2007A-D-I': ['Lenovo', 'IdeaTab V2007A', 'tablet'],\n        'IdeaTabV2010A': ['Lenovo', 'IdeaTab V2010A', 'tablet'],\n        'IdeaTab A2107A-H': ['Lenovo', 'IdeaTab V2107A', 'tablet'],\n        'A1 07': ['Lenovo', 'LePad', 'tablet'],\n        'lepad 001b': ['Lenovo', 'LePad', 'tablet'],\n        'lepad 001n': ['Lenovo', 'LePad', 'tablet'],\n        '3GC101': ['Lenovo', 'LePhone 3GC101'],\n        'Lenovo 3GC101': ['Lenovo', 'LePhone 3GC101'],\n        '3GW100': ['Lenovo', 'LePhone 3GW100'],\n        'Lenovo 3GW100': ['Lenovo', 'LePhone 3GW100'],\n        '3GW101': ['Lenovo', 'LePhone 3GW101'],\n        'Lenovo 3GW101': ['Lenovo', 'LePhone 3GW101'],\n        'Lephone 3GW101': ['Lenovo', 'LePhone 3GW101'],\n        'Lenovo A1-32AB0': ['Lenovo', 'LePhone A1-32AB0'],\n        'Lenovo S1-37AH0': ['Lenovo', 'LePhone S1-37AH0'],\n        'S1 37AHO': ['Lenovo', 'LePhone S1-37AH0'],\n        'Lenovo S2-38AH0': ['Lenovo', 'LePhone S2-38AH0'],\n        'Lenovo S2-38AT0': ['Lenovo', 'LePhone S2-38AT0'],\n        'Lenovo A288t': ['Lenovo', 'LePhone A288'],\n        'Lenovo A366t': ['Lenovo', 'LePhone A366'],\n        'Lenovo A390e': ['Lenovo', 'LePhone A390'],\n        'Lenovo A500': ['Lenovo', 'LePhone A500'],\n        'Lenovo A520': ['Lenovo', 'LePhone A520'],\n        'Lenovo A560e': ['Lenovo', 'A560'],\n        'Lenovo A668t': ['Lenovo', 'LePhone A668'],\n        'Lenovo A698t': ['Lenovo', 'LePhone A698'],\n        'Lenovo A750': ['Lenovo', 'LePhone A750'],\n        'Lenovo A780': ['Lenovo', 'LePhone A780'],\n        'Lenovo A789': ['Lenovo', 'LePhone A789'],\n        'Lenovo A790e': ['Lenovo', 'LePhone A790'],\n        'Lenovo P70': ['Lenovo', 'LePhone P70'],\n        'Lenovo P700': ['Lenovo', 'LePhone P700'],\n        'Lenovo S850e': ['Lenovo', 'S850'],\n        'Lenovo S880': ['Lenovo', 'S880'],\n        'Lenovo K860': ['Lenovo', 'K860'],\n        'A30t': ['Lenovo', 'A30t'],\n        'Lenovo A60': ['Lenovo', 'A60'],\n        'Lenovo A65': ['Lenovo', 'A65'],\n        'Lenovo A66t': ['Lenovo', 'A66t'],\n        'Lenovo A68e': ['Lenovo', 'A68e'],\n        'Lenovo K800': ['Lenovo', 'K800'],\n        'IDEA TV T100': ['Lenovo', 'IDEA TV', 'television'],\n        'IDEA TV K91': ['Lenovo', 'IDEA TV', 'television'],\n        'TC970': ['Le Pan', 'TC970', 'tablet'],\n        'LePanII': ['Le Pan', 'II', 'tablet'],\n        'LG-C555': ['LG', 'Optimus Chat'],\n        'LG-C555-parrot': ['LG', 'Optimus Chat'],\n        'LG-C660h': ['LG', 'Optimus Pro'],\n        'LG-C729': ['LG', 'DoublePlay'],\n        'LG-C800G': ['LG', 'Eclypse'],\n        'LG-CX670': ['LG', 'Optimus 3G'],\n        'LG-E400': ['LG', 'Optimus L3'],\n        'LG-E400f': ['LG', 'Optimus L3'],\n        'LG-E510': ['LG', 'Optimus Hub'],\n        'LG-E510f': ['LG', 'Optimus Hub'],\n        'LG-E510g': ['LG', 'Optimus Hub'],\n        'LG-E610': ['LG', 'Optimus L5'],\n        'LG-E612': ['LG', 'Optimus L5'],\n        'LG-E612g': ['LG', 'Optimus L5'],\n        'LG-E615F': ['LG', 'E615'],\n        'LG-E617G': ['LG', 'E617'],\n        'LG-E720': ['LG', 'Optimus Chic'],\n        'LG-E720b': ['LG', 'Optimus Chic'],\n        'LG-E730': ['LG', 'Optimus Sol'],\n        'LG-E970': ['LG', 'Shine'],\n        'LG-F100L': ['LG', 'Optimus Vu'],\n        'LG-F100S': ['LG', 'Optimus Vu'],\n        'LG-F120K': ['LG', 'Optimus LTE Tag'],\n        'LG-F120L': ['LG', 'Optimus LTE Tag'],\n        'LG-F120S': ['LG', 'Optimus LTE Tag'],\n        'LG-F160K': ['LG', 'Optimus LTE II'],\n        'LG-F160L': ['LG', 'Optimus LTE II'],\n        'LG-F160S': ['LG', 'Optimus LTE II'],\n        'LG-F180L': ['LG', 'F180L'],\n        'LG-GT540': ['LG', 'Optimus'],\n        'LG-GT540f': ['LG', 'Optimus'],\n        'LG-GT540 Swift': ['LG', 'Optimus'],\n        'LG-GW620': ['LG', 'GW620'],\n        'LG-KH5200': ['LG', 'Andro-1'],\n        'LG-KU3700': ['LG', 'Optimus One'],\n        'LG-KU5400': ['LG', 'PRADA 3.0'],\n        'LG-KU5900': ['LG', 'Optimus Black'],\n        'LG-L40G': ['LG', 'L40G'],\n        'LG-LG855': ['LG', 'Marquee'],\n        'LG-LS670': ['LG', 'Optimus S'],\n        'LG-LS696': ['LG', 'Optimus Elite'],\n        'LG-LS840': ['LG', 'Viper 4G'],\n        'LG-LS855': ['LG', 'Marquee'],\n        'LG-LS860': ['LG', '\\'Cayenne\\''],\n        'LG-LS970': ['LG', '\\'Eclipse\\''],\n        'LG-LU3000': ['LG', 'Optimus Mach'],\n        'LG-LU3100': ['LG', 'Optimus Chic'],\n        'LG-LU3700': ['LG', 'Optimus One'],\n        'LG-LU5400': ['LG', 'PRADA 3.0'],\n        'LG-LU6200': ['LG', 'Optimus Q2'],\n        'LG-lu6200': ['LG', 'Optimus Q2'],\n        'LG-LU6500': ['LG', 'Optimus Note'],\n        'LG-LU6800': ['LG', 'Optimus Big'],\n        'LG-LU8300': ['LG', 'Optimus Pad LTE'],\n        'LG-LW690': ['LG', 'Optimus C'],\n        'LG-LW770': ['LG', 'LW770'],\n        'LG-MS690': ['LG', 'Optimus M'],\n        'LG-MS770': ['LG', 'MS770'],\n        'LG-MS840': ['LG', 'Connect 4G'],\n        'LG-MS910': ['LG', 'Esteem'],\n        'LG-MS695': ['LG', 'Optimus M+'],\n        'LG P350': ['LG', 'Optimus Me'],\n        'LG-P350': ['LG', 'Optimus Me'],\n        'LG-P350f': ['LG', 'Optimus Me'],\n        'LG-P350g': ['LG', 'Optimus Me'],\n        'LG-P355': ['LG', 'P355'],\n        'LG-P500': ['LG', 'Optimus One'],\n        'LG-P500h': ['LG', 'Optimus One'],\n        'LG-P500h-parrot': ['LG', 'Optimus One'],\n        'LG-P503': ['LG', 'Optimus One'],\n        'LG-P504': ['LG', 'Optimus One'],\n        'LG-P505': ['LG', 'Phoenix'],\n        'LG-P505R': ['LG', 'Phoenix'],\n        'LG-P506': ['LG', 'Thrive'],\n        'LG-P509': ['LG', 'Optimus T'],\n        'LG-P690': ['LG', 'Optimus Net'],\n        'LG-P693': ['LG', 'P693'],\n        'LG-P698': ['LG', 'Optimus Net'],\n        'LG-P698f': ['LG', 'Optimus Net'],\n        'LG-P700': ['LG', 'Optimus L7'],\n        'LG-P705': ['LG', 'Optimus L7'],\n        'LG-P705f': ['LG', 'Optimus L7'],\n        'LG-P705g': ['LG', 'Optimus L7'],\n        'LG-P708g': ['LG', 'P708'],\n        'LG-P720': ['LG', 'Optimus Chic'],\n        'LG-P720h': ['LG', 'Optimus Chic'],\n        'LG-P725': ['LG', 'Optimus 3D Max'],\n        'LG-P760': ['LG', 'P760'],\n        'LG-P769': ['LG', 'P769'],\n        'LG-P860': ['LG', 'P860'],\n        'LG-P870': ['LG', 'P870'],\n        'LG-P870F': ['LG', 'P870'],\n        'LG-P880': ['LG', 'X3'],\n        'LG-P880g': ['LG', 'X3'],\n        'LG-P895': ['LG', 'P895'],\n        'LG-P920': ['LG', 'Optimus 3D'],\n        'LG-P920h': ['LG', 'Optimus 3D'],\n        'LG-P925': ['LG', 'Thrill'],\n        'LG-P925g': ['LG', 'Thrill'],\n        'LG-P930': ['LG', 'Nitro HD'],\n        'LG-P936': ['LG', 'Optimus LTE'],\n        'LG-P940': ['LG', 'PRADA 3.0'],\n        'LG-P970': ['LG', 'Optimus Black'],\n        'LG-P970h': ['LG', 'Optimus Black'],\n        'LG-P990': ['LG', 'Optimus 2X Speed'],\n        'LG-P990h': ['LG', 'Optimus 2X Speed'],\n        'LG-P990hN': ['LG', 'Optimus 2X Speed'],\n        'LG-P990H': ['LG', 'Optimus 2X Speed'],\n        'LG-P993': ['LG', 'Optimus 2X'],\n        'LG-SU540': ['LG', 'PRADA 3.0'],\n        'LG-SU640': ['LG', 'Optimus LTE'],\n        'LG-SU660': ['LG', 'Optimus 2X'],\n        'LG-SU760': ['LG', 'Optimus 3D'],\n        'LG-SU760-Kust': ['LG', 'Optimus 3D'],\n        'LG-SU870': ['LG', 'Optimus 3D Cube'],\n        'LG-SU880': ['LG', 'Optimus EX'],\n        'LG-US670': ['LG', 'Optimus U'],\n        'LG-US730': ['LG', 'US730'],\n        'LG-V900': ['LG', 'Optimus Pad', 'tablet'],\n        'LG-V905R': ['LG', 'Optimus G-Slate', 'tablet'],\n        'LG-V909': ['LG', 'Optimus G-Slate', 'tablet'],\n        'LG-VM670': ['LG', 'Optimus V'],\n        'LG-VM696': ['LG', 'Optimus Elite'],\n        'LG-VM701': ['LG', 'Optimus Slider'],\n        'LG-VS660': ['LG', 'Vortex'],\n        'LG-VS700': ['LG', 'Enlighten'],\n        'LG-VS740': ['LG', 'Ally'],\n        'LG-VS840': ['LG', 'Connect 4G'],\n        'LG-VS910': ['LG', 'Revolution'],\n        'lgp-970': ['LG', 'Optimus Black'],\n        'E900': ['LG', 'Optimus 7'],\n        'GT540': ['LG', 'Optimus GT540'],\n        'GW620': ['LG', 'GW620'],\n        'KU9500': ['LG', 'Optimus Z'],\n        'LGC660': ['LG', 'Optimus Pro'],\n        'LGL45C': ['LG', 'Optimus Net'],\n        'LGL55C': ['LG', 'Optimus Q'],\n        'LU2300': ['LG', 'Optimus Q'],\n        'LS670': ['LG', 'Optimus S'],\n        'P940': ['LG', 'PRADA 3.0'],\n        'P990': ['LG', 'Optimus 2X Speed'],\n        'USCC-US730': ['LG', 'US730'],\n        'USCC-US760': ['LG', 'Genesis'],\n        'VM670': ['LG', 'Optimus V'],\n        'VS840 4G': ['LG', 'Connect 4G'],\n        'VS900-4G': ['LG', 'VS900'],\n        'VS910 4G': ['LG', 'Revolution 4G'],\n        'VS920 4G': ['LG', 'Spectrum 4G'],\n        'VS930 4G': ['LG', 'VS930'],\n        'VS950 4G': ['LG', 'VS950'],\n        'L-01D': ['LG', 'Optimus LTE'],\n        'L-02D': ['LG', 'PRADA phone'],\n        'L-04C': ['LG', 'Optimus Chat'],\n        'L-05D': ['LG', 'Optimus it'],\n        'L-06C': ['LG', 'Optimus Pad', 'tablet'],\n        'L-06D': ['LG', 'Optimus Vu'],\n        'L-07C': ['LG', 'Optimus Bright'],\n        'LG-Eve': ['LG', 'Eve'],\n        'LG-Optimus One P500': ['LG', 'Optimus One'],\n        'LG-Optimus 2X': ['LG', 'Optimus 2X'],\n        'LG-GT540 Optimus': ['LG', 'Optimus'],\n        'LG-Optimus Black': ['LG', 'Optimus Black'],\n        'Ally': ['LG', 'Ally'],\n        'Optimus': ['LG', 'Optimus'],\n        'Optimus Me': ['LG', 'Optimus Me'],\n        'optimus me p350': ['LG', 'Optimus Me'],\n        'Optimus 2X': ['LG', 'Optimus 2X'],\n        'Optimus 2x': ['LG', 'Optimus 2X'],\n        'IS11LG': ['LG', 'Optimus X'],\n        'Vortex': ['LG', 'Vortex'],\n        'LDK-ICK v1.4': ['LG', 'Esteem'],\n        'T6': ['Malata', 'Zpad T6', 'tablet'],\n        'Malata SMBA1002': ['Malata', 'Tablet SMB-A1002', 'tablet'],\n        'STM712HCZ': ['Mediacom', 'SmartPad 712c', 'tablet'],\n        'STM803HC': ['Mediacom', 'SmartPad 810c', 'tablet'],\n        'Mediacom 810C': ['Mediacom', 'SmartPad 810c', 'tablet'],\n        'Smartpad810c': ['Mediacom', 'SmartPad 810c', 'tablet'],\n        'SmartPad810c': ['Mediacom', 'SmartPad 810c', 'tablet'],\n        'MP810C': ['Mediacom', 'SmartPad 810c', 'tablet'],\n        'MP907C': ['Mediacom', 'SmartPad 907c', 'tablet'],\n        'MTK6516': ['Mediatek', 'MTK6516'],\n        'LIFETAB S9512': ['Medion', 'Lifetab S9512', 'tablet'],\n        'LIFETAB P9514': ['Medion', 'Lifetab P9514', 'tablet'],\n        'MD LIFETAB P9516': ['Medion', 'Lifetab P9516', 'tablet'],\n        'MEDION LIFE P4310': ['Medion', 'Life P4310'],\n        'M8': ['Meizu', 'M8'],\n        'M9': ['Meizu', 'M9'],\n        'M040': ['Meizu', 'M040'],\n        'M9-unlocked': ['Meizu', 'M9'],\n        'meizu m9': ['Meizu', 'M9'],\n        'MEIZU M9': ['Meizu', 'M9'],\n        'MEIZU MX': ['Meizu', 'MX'],\n        'M030': ['Meizu', 'MX M030'],\n        'M031': ['Meizu', 'MX M031'],\n        'M032': ['Meizu', 'MX M032'],\n        'Slidepad': ['Memup', 'Slidepad', 'tablet'],\n        'A45': ['Micromax', 'A45 Punk'],\n        'Micromax A50': ['Micromax', 'A50 Ninja'],\n        'Micromax A60': ['Micromax', 'Andro A60'],\n        'Micromax A70': ['Micromax', 'Andro A70'],\n        'P300(Funbook)': ['Micromax', 'Funbook P300', 'tablet'],\n        'AT735': ['Moinstone', 'AT735', 'tablet'],\n        'A853': ['Motorola', 'Milestone'],\n        'A953': ['Motorola', 'Milestone 2'],\n        'A1680': ['Motorola', 'MOTO A1680'],\n        'ET1': ['Motorola', 'ET1 Enterprise Tablet', 'tablet'],\n        'MB200': ['Motorola', 'CLIQ'],\n        'MB300': ['Motorola', 'BACKFLIP'],\n        'MB501': ['Motorola', 'CLIQ XT'],\n        'MB502': ['Motorola', 'CHARM'],\n        'MB511': ['Motorola', 'FLIPOUT'],\n        'MB520': ['Motorola', 'BRAVO'],\n        'MB525': ['Motorola', 'DEFY'],\n        'MB525+': ['Motorola', 'DEFY'],\n        'MB525 for me': ['Motorola', 'DEFY'],\n        'MB526': ['Motorola', 'DEFY+'],\n        'MB611': ['Motorola', 'CLIQ 2'],\n        'MB612': ['Motorola', 'XPRT'],\n        'MB632': ['Motorola', 'PRO+'],\n        'MB855': ['Motorola', 'PHOTON 4G'],\n        'MB860': ['Motorola', 'ATRIX'],\n        'MB861': ['Motorola', 'ATRIX'],\n        'mb861': ['Motorola', 'ATRIX'],\n        'MB865': ['Motorola', 'ATRIX 2'],\n        'MB870': ['Motorola', 'Droid X2'],\n        'MB886': ['Motorola', 'DINARA'],\n        'ME501': ['Motorola', 'CLIQ XT'],\n        'ME511': ['Motorola', 'FLIPOUT'],\n        'me525': ['Motorola', 'MOTO ME525'],\n        'Me525': ['Motorola', 'MOTO ME525'],\n        'ME525': ['Motorola', 'MOTO ME525'],\n        'ME525+': ['Motorola', 'MOTO ME525'],\n        'ME600': ['Motorola', 'BACKFLIP'],\n        'ME632': ['Motorola', 'PRO+'],\n        'ME722': ['Motorola', 'Milestone 2'],\n        'ME811': ['Motorola', 'Droid X'],\n        'ME860': ['Motorola', 'ATRIX'],\n        'ME863': ['Motorola', 'Milestone 3'],\n        'ME865': ['Motorola', 'ATRIX 2'],\n        'MT620': ['Motorola', 'MOTO MT620'],\n        'MT620t': ['Motorola', 'MOTO MT620'],\n        'MT716': ['Motorola', 'MOTO MT716'],\n        'MT810': ['Motorola', 'MOTO MT810'],\n        'MT870': ['Motorola', 'MOTO MT870'],\n        'MT917': ['Motorola', 'MT917'],\n        'MZ505': ['Motorola', 'XOOM Family Edition', 'tablet'],\n        'MZ600': ['Motorola', 'XOOM 4G LTE', 'tablet'],\n        'MZ601': ['Motorola', 'XOOM 3G', 'tablet'],\n        'MZ602': ['Motorola', 'XOOM 4G LTE', 'tablet'],\n        'MZ603': ['Motorola', 'XOOM 3G', 'tablet'],\n        'MZ604': ['Motorola', 'XOOM WiFi', 'tablet'],\n        'MZ605': ['Motorola', 'XOOM 3G', 'tablet'],\n        'MZ606': ['Motorola', 'XOOM WiFi', 'tablet'],\n        'MZ607': ['Motorola', 'XOOM 2 WiFi Media Edition', 'tablet'],\n        'MZ609': ['Motorola', 'Droid XYBOARD 8.2', 'tablet'],\n        'MZ609 4G': ['Motorola', 'Droid XYBOARD 8.2', 'tablet'],\n        'MZ615': ['Motorola', 'XOOM 2 WiFi', 'tablet'],\n        'MZ617': ['Motorola', 'Droid XYBOARD 10.1', 'tablet'],\n        'MZ617 4G': ['Motorola', 'Droid XYBOARD 10.1', 'tablet'],\n        'WX435': ['Motorola', 'TRIUMPH WX435'],\n        'WX445': ['Motorola', 'CITRUS WX445'],\n        'XT300': ['Motorola', 'SPICE'],\n        'XT301': ['Motorola', 'MOTO XT301'],\n        'XT311': ['Motorola', 'FIRE'],\n        'XT316': ['Motorola', 'MOTO XT316'],\n        'XT319': ['Motorola', 'MOTO XT319'],\n        'XT390': ['Motorola', 'MOTO XT390'],\n        'XT320': ['Motorola', 'DEFY Mini'],\n        'XT321': ['Motorola', 'DEFY Mini'],\n        'XT500': ['Motorola', 'MOTO XT500'],\n        'xt-500': ['Motorola', 'MOTO XT500'],\n        'XT502': ['Motorola', 'QUENCH XT5'],\n        'XT530': ['Motorola', 'FIRE XT'],\n        'XT531': ['Motorola', 'FIRE XT'],\n        'XT532': ['Motorola', 'XT532'],\n        'XT535': ['Motorola', 'DEFY'],\n        'XT550': ['Motorola', 'XT550'],\n        'XT556': ['Motorola', 'XT556'],\n        'XT603': ['Motorola', 'ADMIRAL'],\n        'XT610': ['Motorola', 'Droid Pro'],\n        'XT615': ['Motorola', 'MOTO XT615'],\n        'XT626': ['Motorola', 'MOTO XT626'],\n        'XT681': ['Motorola', 'MOTO XT681'],\n        'XT682': ['Motorola', 'Droid 3'],\n        'XT685': ['Motorola', 'MOTO XT685'],\n        'XT687': ['Motorola', 'ATRIX TV'],\n        'XT701': ['Motorola', 'XT701'],\n        'XT702': ['Motorola', 'MOTO XT702'],\n        'XT711': ['Motorola', 'MOTO XT711'],\n        'XT720': ['Motorola', 'Milestone'],\n        'XT875': ['Motorola', 'Droid Bionic'],\n        'XT800': ['Motorola', 'MOTO XT800'],\n        'XT800+': ['Motorola', 'MOTO XT800'],\n        'XT800W': ['Motorola', 'MOTO Glam'],\n        'XT806': ['Motorola', 'MOTO XT806'],\n        'XT860': ['Motorola', 'Milestone 3'],\n        'XT862': ['Motorola', 'Droid 3'],\n        'XT882': ['Motorola', 'MOTO XT882'],\n        'XT883': ['Motorola', 'Milestone 3'],\n        'XT889': ['Motorola', 'XT889'],\n        'XT897': ['Motorola', 'Droid 4'],\n        'XT901': ['Motorola', 'RAZR'],\n        'XT910': ['Motorola', 'RAZR'],\n        'XT910K': ['Motorola', 'RAZR'],\n        'XT910S': ['Motorola', 'RAZR'],\n        'XT910 4G': ['Motorola', 'RAZR'],\n        'XT912': ['Motorola', 'Droid RAZR'],\n        'XT923': ['Motorola', 'Droid RAZR HD'],\n        'XT925': ['Motorola', 'Droid RAZR HD'],\n        'XT926': ['Motorola', 'Droid RAZR'],\n        'XT926 4G': ['Motorola', 'Droid RAZR'],\n        'XT928': ['Motorola', 'XT928'],\n        'Atrix 2': ['Motorola', 'ATRIX 2'],\n        'Atrix 4g': ['Motorola', 'ATRIX 4G'],\n        'Atrix 4G': ['Motorola', 'ATRIX 4G'],\n        'Atrix 4G ME860': ['Motorola', 'ATRIX 4G'],\n        'CLIQ': ['Motorola', 'CLIQ'],\n        'CLIQ XT': ['Motorola', 'CLIQ XT'],\n        'CLIQ2': ['Motorola', 'CLIQ 2'],\n        'Corvair': ['Motorola', 'Corvair', 'tablet'],\n        'DEFY': ['Motorola', 'DEFY'],\n        'Defy+': ['Motorola', 'DEFY+'],\n        'Defy Plus': ['Motorola', 'DEFY+'],\n        'Devour': ['Motorola', 'Devour'],\n        'Dext': ['Motorola', 'Dext'],\n        'Droid': ['Motorola', 'Droid'],\n        'DROID': ['Motorola', 'Droid'],\n        'DROID2': ['Motorola', 'Droid 2'],\n        'DROID2 GLOBAL': ['Motorola', 'Droid 2'],\n        'DROID2 Global': ['Motorola', 'Droid 2'],\n        'Droid2Global': ['Motorola', 'Droid 2'],\n        'DROID 2': ['Motorola', 'Droid 2'],\n        'DROID3': ['Motorola', 'Droid 3'],\n        'DROID4': ['Motorola', 'Droid 4'],\n        'DROID4 4G': ['Motorola', 'Droid 4'],\n        'DROID Pro': ['Motorola', 'Droid Pro'],\n        'DROID BIONIC': ['Motorola', 'Droid Bionic'],\n        'DROID BIONIC 4G': ['Motorola', 'Droid Bionic'],\n        'DROID BIONIC XT875 4G': ['Motorola', 'Droid Bionic'],\n        'DROIDRAZR': ['Motorola', 'Droid RAZR'],\n        'Droid Razr': ['Motorola', 'Droid RAZR'],\n        'DROID RAZR': ['Motorola', 'Droid RAZR'],\n        'DROID RAZR 4G': ['Motorola', 'Droid RAZR'],\n        'DROID SPYDER': ['Motorola', 'Droid RAZR'],\n        'DROID RAZR HD': ['Motorola', 'Droid RAZR HD'],\n        'DROID RAZR HD 4G': ['Motorola', 'Droid RAZR HD'],\n        'DroidX': ['Motorola', 'Droid X'],\n        'DROIDX': ['Motorola', 'Droid X'],\n        'droid x': ['Motorola', 'Droid X'],\n        'Droid X': ['Motorola', 'Droid X'],\n        'DROID X': ['Motorola', 'Droid X'],\n        'DROID X2': ['Motorola', 'Droid X2'],\n        'Electrify': ['Motorola', 'Electrify'],\n        'Milestone XT720': ['Motorola', 'Milestone'],\n        'Milestone Xt720': ['Motorola', 'Milestone'],\n        'Milestone': ['Motorola', 'Milestone'],\n        'A853 Milestone': ['Motorola', 'Milestone'],\n        'Milestone X': ['Motorola', 'Milestone X'],\n        'Milestone X2': ['Motorola', 'Milestone X2'],\n        'MotoroiX': ['Motorola', 'Droid X'],\n        'Moto Backflip': ['Motorola', 'BACKFLIP'],\n        'RAZR': ['Motorola', 'RAZR'],\n        'Triumph': ['Motorola', 'TRIUMPH'],\n        'Opus One': ['Motorola', 'i1'],\n        'Photon': ['Motorola', 'PHOTON'],\n        'Photon 4G': ['Motorola', 'PHOTON 4G'],\n        'XOOM': ['Motorola', 'XOOM', 'tablet'],\n        'Xoom': ['Motorola', 'XOOM', 'tablet'],\n        'XOOM 2': ['Motorola', 'XOOM 2', 'tablet'],\n        'XOOM 2 ME': ['Motorola', 'XOOM 2', 'tablet'],\n        'XOOM MZ606': ['Motorola', 'XOOM WiFi', 'tablet'],\n        'ISW11M': ['Motorola', 'PHOTON'],\n        'IS12M': ['Motorola', 'RAZR'],\n        'MOTWX435KT': ['Motorola', 'TRIUMPH'],\n        'X3-Ice MIUI XT720 Memorila Classics': ['Motorola', 'Milestone'],\n        'NABI-A': ['Nabi', 'Kids tablet', 'tablet'],\n        'Newpad': ['Newsmy', 'Newpad', 'tablet'],\n        'Newpad-K97': ['Newsmy', 'Newpad K97', 'tablet'],\n        'Newpad P9': ['Newsmy', 'Newpad P9', 'tablet'],\n        'M-PAD N8': ['Newsmy', 'M-pad N8', 'tablet'],\n        'LT-NA7': ['NEC', 'LT-NA7'],\n        'N-01D': ['NEC', 'MEDIAS PP N-01D'],\n        'N-04C': ['NEC', 'MEDIAS N-04C'],\n        'N-04D': ['NEC', 'MEDIAS LTE N-04D'],\n        'N-05D': ['NEC', 'MEDIAS ES N-05D'],\n        'N-06C': ['NEC', 'MEDIAS WP N-06C'],\n        'N-06D': ['NEC', 'MEDIAS Tab N-06D', 'tablet'],\n        'N-07D': ['NEC', 'MEDIAS X N-07D'],\n        '101N': ['NEC', 'MEDIAS CH Softbank 101N'],\n        'IS11N': ['NEC', 'MEDIAS BR IS11N'],\n        'Nexian NX-A890': ['Nexian', 'Journey'],\n        'NX-A891': ['Nexian', 'Ultra Journey'],\n        'M726HC': ['Nextbook', 'Premium 7', 'ereader'],\n        'NXM726HN': ['Nextbook', 'Premium 7', 'ereader'],\n        'NXM803HD': ['Nextbook', 'Premium 8', 'ereader'],\n        'DATAM803HC': ['Nextbook', 'Premium 8', 'ereader'],\n        'NXM901': ['Nextbook', 'Next 3', 'ereader'],\n        'NGM Vanity Smart': ['NGM', 'Vanity Smart'],\n        'Nokia N9': ['Nokia', 'N9'],\n        'Nokia N900': ['Nokia', 'N900'],\n        'Lumia800': ['Nokia', 'Lumia 800'],\n        'Lumia 900': ['Nokia', 'Lumia 900'],\n        'Notion Ink ADAM': ['Notion Ink', 'ADAM', 'tablet'],\n        'P4D SIRIUS': ['Nvsbl', 'P4D SIRIUS', 'tablet'],\n        'P4D Sirius': ['Nvsbl', 'P4D SIRIUS', 'tablet'],\n        'EFM710A': ['Oblio', 'Mint 7x', 'tablet'],\n        'ODYS-Xpress': ['Odys', 'Xpress', 'tablet'],\n        'Olivetti Olipad 100': ['Olivetti', 'Olipad 100', 'tablet'],\n        'OP110': ['Olivetti', 'Olipad 110', 'tablet'],\n        'ONDA MID': ['Onda', 'MID', 'tablet'],\n        'VX580A': ['Onda', 'VX580A', 'tablet'],\n        'VX610A': ['Onda', 'VX610A', 'tablet'],\n        'TQ150': ['Onda', 'TQ150'],\n        'N2T': ['ONN', 'N2T', 'tablet'],\n        'Renesas': ['Opad', 'Renesas', 'tablet'],\n        'renesas emev': ['Opad', 'Renesas', 'tablet'],\n        'X903': ['Oppo', 'Find Me X903'],\n        'X905': ['Oppo', 'Find 3 X905'],\n        'R805': ['Oppo', 'R805'],\n        'R801': ['Oppo', 'R801'],\n        'R811': ['Oppo', 'R811'],\n        'X909': ['Oppo', 'X909'],\n        'OPPOR801': ['Oppo', 'R801'],\n        'OPPOX905': ['Oppo', 'Find 3 X905'],\n        'OPPOX907': ['Oppo', 'Find 3 X907'],\n        'X907': ['Oppo', 'Find 3 X907'],\n        'X9015': ['Oppo', 'Find X9015'],\n        'OPPOX9017': ['Oppo', 'Finder X9017'],\n        'OPPOU701': ['Oppo', 'OPPOU701'],\n        'OPPOR807': ['Oppo', 'Real R807'],\n        'OPPOR805': ['Oppo', 'Real R805'],\n        'R807': ['Oppo', 'Real R807'],\n        'OPPOT703': ['Oppo', 'T703'],\n        'P-01D': ['Panasonic', 'P-01D'],\n        'P-02D': ['Panasonic', 'Lumix Phone'],\n        'P-04D': ['Panasonic', 'Eluga'],\n        'P-07C': ['Panasonic', 'P-07C'],\n        'dL1': ['Panasonic', 'Eluga dL1'],\n        '101P': ['Panasonic', 'Lumix Phone'],\n        'JT-H580VT': ['Panasonic', 'BizPad 7', 'tablet'],\n        'JT-H581VT': ['Panasonic', 'BizPad 10', 'tablet'],\n        'FZ-A1A': ['Panasonic', 'Toughpad', 'tablet'],\n        'pandigital9hr': ['Pandigital', '9HR', 'tablet'],\n        'pandigital9hr2': ['Pandigital', '9HR2', 'tablet'],\n        'pandigitalopc1': ['Pandigital', 'OPC1', 'tablet'],\n        'pandigitalopp1': ['Pandigital', 'OPP1', 'tablet'],\n        'pandigitalp1hr': ['Pandigital', 'p1hr', 'tablet'],\n        'IM-A600S': ['Pantech', 'SIRIUS \\u00c3\\ufffd\\u00c2\\u00b1'],\n        'IM-A630K': ['Pantech', 'SKY Izar'],\n        'IM-A690L': ['Pantech', 'SKY'],\n        'IM-A690S': ['Pantech', 'SKY'],\n        'IM-A710K': ['Pantech', 'SKY Vega Xpress'],\n        'IM-A720L': ['Pantech', 'SKY Vega Xpress'],\n        'IM-A725L': ['Pantech', 'SKY Vega X+'],\n        'IM-A730s': ['Pantech', 'SKY Vega S'],\n        'IM-A730S': ['Pantech', 'SKY Vega S'],\n        'IM-A750K': ['Pantech', 'SKY Mirach A'],\n        'IM-A760S': ['Pantech', 'SKY Vega Racer'],\n        'IM-A770K': ['Pantech', 'SKY Vega Racer'],\n        'IM-A780L': ['Pantech', 'SKY Vega Racer'],\n        'IM-A800S': ['Pantech', 'SKY Vega LTE'],\n        'IM-A810K': ['Pantech', 'SKY Vega LTE M'],\n        'IM-A810S': ['Pantech', 'SKY Vega LTE M'],\n        'IM-A820L': ['Pantech', 'SKY Vega LTE EX'],\n        'IM-A830K': ['Pantech', 'SKY Vega Racer 2'],\n        'IM-A830L': ['Pantech', 'SKY Vega Racer 2'],\n        'IM-A830S': ['Pantech', 'SKY Vega Racer 2'],\n        'IM-A840S': ['Pantech', 'SKY Vega S5'],\n        'IM-A850K': ['Pantech', 'IM-A850K'],\n        'IM-T100K': ['Pantech', 'SKY Vega No. 5', 'tablet'],\n        'IS06': ['Pantech', 'SIRIUS \\u00c3\\ufffd\\u00c2\\u00b1'],\n        'ADR8995': ['Pantech', 'Breakout'],\n        'ADR8995 4G': ['Pantech', 'Breakout'],\n        'ADR910L 4G': ['Pantech', 'ADR910L'],\n        'PantechP4100': ['Pantech', 'Element', 'tablet'],\n        'PantechP8000': ['Pantech', 'Crossover'],\n        'PantechP8010': ['Pantech', 'P8010'],\n        'PantechP9060': ['Pantech', 'Pocket'],\n        'PantechP9070': ['Pantech', 'Burst'],\n        'SKY IM-A600S': ['Pantech', 'SIRIUS \\u00c3\\ufffd\\u00c2\\u00b1'],\n        'SKY IM-A630K': ['Pantech', 'SKY Izar'],\n        'SKY IM-A650S': ['Pantech', 'SKY Vega'],\n        'IS11PT': ['Pantech', 'Mirach IS11PT'],\n        'PAT712W': ['Perfeo', 'PAT712W', 'tablet'],\n        'X7G': ['Pearl', 'Touchlet X7G', 'tablet'],\n        'FWS810': ['PHICOMM', 'FWS810'],\n        'Philips PI5000': ['Philips', 'PI5000', 'tablet'],\n        'PI7000': ['Philips', 'PI7000', 'tablet'],\n        'Philips W626': ['Philips', 'W626'],\n        'Philips W632': ['Philips', 'W632'],\n        'MOMO': ['Ployer', 'MOMO', 'tablet'],\n        'MOMO15': ['Ployer', 'MOMO15', 'tablet'],\n        'PocketBook A7': ['PocketBook', 'A7', 'tablet'],\n        'PocketBook A10': ['PocketBook', 'A10', 'tablet'],\n        'Mobii 7': ['Point Of View', 'Mobii 7', 'tablet'],\n        'PMP3384BRU': ['Prestigio', 'Multipad 3384', 'tablet'],\n        'TB07FTA': ['Positivo', 'TB07FTA', 'tablet'],\n        'QW TB-1207': ['Qware', 'Pro3', 'tablet'],\n        'W6HD ICS': ['Ramos', 'W6HD', 'tablet'],\n        'w10': ['Ramos', 'W10', 'tablet'],\n        'W10': ['Ramos', 'W10', 'tablet'],\n        'w10 v2.0': ['Ramos', 'W10 v2.0', 'tablet'],\n        'W10 V2.0': ['Ramos', 'W10 v2.0', 'tablet'],\n        'T11AD': ['Ramos', 'T11AD', 'tablet'],\n        'T11AD.FE': ['Ramos', 'T11AD', 'tablet'],\n        'PlayBook': ['RIM', 'BlackBerry PlayBook', 'tablet'],\n        'RBK-490': ['Ritmix', 'RBK-490', 'tablet'],\n        'A8HD': ['Saayi', 'Dropad A8HD', 'tablet'],\n        'GT-S7568': ['Samsung', 'S7568'],\n        'Galaxy Nexus': ['Samsung', 'Galaxy Nexus'],\n        'GT-B5330': ['Samsung', 'GT-B5330'],\n        'GT-B5510': ['Samsung', 'Galaxy Y Pro'],\n        'GT-B5510B': ['Samsung', 'Galaxy Y Pro'],\n        'GT-B5510L': ['Samsung', 'Galaxy Y Pro'],\n        'GT-B5512': ['Samsung', 'Galaxy Y Pro Duos'],\n        'GT-B7510': ['Samsung', 'Galaxy Pro'],\n        'GT-B7510L': ['Samsung', 'Galaxy Pro'],\n        'GT-I5500': ['Samsung', 'Galaxy 5'],\n        'GT-I5500B': ['Samsung', 'Galaxy 5'],\n        'GT-I5500L': ['Samsung', 'Galaxy 5'],\n        'GT-I5500M': ['Samsung', 'Galaxy 5'],\n        'GT-I5500-MR3': ['Samsung', 'Galaxy 5'],\n        'GT-I5503': ['Samsung', 'Galaxy 5'],\n        'GT-I5508': ['Samsung', 'Galaxy 5'],\n        'GT-I5510': ['Samsung', 'Galaxy 551'],\n        'GT-I5510L': ['Samsung', 'Galaxy 551'],\n        'GT-I5510M': ['Samsung', 'Galaxy 551'],\n        'GT-I5510T': ['Samsung', 'Galaxy 551'],\n        'GT-I5700': ['Samsung', 'Galaxy Spica'],\n        'GT-I5700L': ['Samsung', 'Galaxy Spica'],\n        'GT-I5800': ['Samsung', 'Galaxy Apollo'],\n        'GT-I5800D': ['Samsung', 'Galaxy Apollo'],\n        'GT-I5800L': ['Samsung', 'Galaxy Apollo'],\n        'GT-I5801': ['Samsung', 'Galaxy Apollo'],\n        'GT-I6500U': ['Samsung', 'Saturn'],\n        'GT-I8000': ['Samsung', 'Omnia 2'],\n        'GT-I8150': ['Samsung', 'Galaxy W'],\n        'GT-I8150B': ['Samsung', 'Galaxy W'],\n        'GT-I8160': ['Samsung', 'Galaxy Ace 2'],\n        'GT-I8160L': ['Samsung', 'Galaxy Ace 2'],\n        'GT-I8160P': ['Samsung', 'Galaxy Ace 2'],\n        'GT-I8320': ['Samsung', 'H1'],\n        'GT-I8520': ['Samsung', 'Galaxy Beam'],\n        'GT-I8530': ['Samsung', 'Galaxy Beam'],\n        'GT-I8250': ['Samsung', 'Galaxy Beam'],\n        'GT-i9000': ['Samsung', 'Galaxy S'],\n        'GT-I9000': ['Samsung', 'Galaxy S'],\n        'GT-I9000B': ['Samsung', 'Galaxy S'],\n        'GT-I9000M': ['Samsung', 'Galaxy S Vibrant'],\n        'GT-I9000T': ['Samsung', 'Galaxy S'],\n        'GT-I9001': ['Samsung', 'Galaxy S Plus'],\n        'GT-I9003': ['Samsung', 'Galaxy SL'],\n        'GT-I9003L': ['Samsung', 'Galaxy SL'],\n        'GT-I9008': ['Samsung', 'Galaxy S'],\n        'GT-I9008L': ['Samsung', 'Galaxy S'],\n        'GT-I9010': ['Samsung', 'Galaxy S Giorgio Armani'],\n        'GT-I9018': ['Samsung', 'Galaxy GT-I9018'],\n        'GT-I9070': ['Samsung', 'Galaxy S Advance'],\n        'GT-I9070P': ['Samsung', 'Galaxy S Advance'],\n        'GT-I9082': ['Samsung', 'Galaxy Grand DUOS'],\n        'GT-I9088': ['Samsung', 'Galaxy S'],\n        'GT-i9100': ['Samsung', 'Galaxy S II'],\n        'GT-I9100': ['Samsung', 'Galaxy S II'],\n        'GT-I9100G': ['Samsung', 'Galaxy S II'],\n        'GT-I9100M': ['Samsung', 'Galaxy S II'],\n        'GT-I9100T': ['Samsung', 'Galaxy S II'],\n        'GT-I9100P': ['Samsung', 'Galaxy S II'],\n        'GT-I9103': ['Samsung', 'Galaxy R'],\n        'GT-I9108': ['Samsung', 'Galaxy S II'],\n        'GT-I9210': ['Samsung', 'Galaxy S II LTE'],\n        'GT-I9210T': ['Samsung', 'Galaxy S II LTE'],\n        'GT-I9220': ['Samsung', 'Galaxy Note'],\n        'GT-I9228': ['Samsung', 'Galaxy Note'],\n        'GT-I9250': ['Samsung', 'Galaxy Nexus'],\n        'GT-I9250 EUR XX': ['Samsung', 'Galaxy Nexus'],\n        'GT-I9260': ['Samsung', 'Galaxy Premier'],\n        'GT-I9300': ['Samsung', 'Galaxy S III'],\n        'GT-I9300T': ['Samsung', 'Galaxy S III'],\n        'GT-I9303T': ['Samsung', 'Galaxy S III'],\n        'GT-I9308': ['Samsung', 'Galaxy S III'],\n        'GT-I9500': ['Samsung', 'Galaxy GT-I9500'],\n        'GT-I9800': ['Samsung', 'Galaxy GT-I9800'],\n        'GT-N7000': ['Samsung', 'Galaxy Note'],\n        'GT-N7000B': ['Samsung', 'Galaxy Note'],\n        'GT-N7100': ['Samsung', 'Galaxy Note II'],\n        'GT-N7102': ['Samsung', 'Galaxy Note II'],\n        'GT-N8000': ['Samsung', 'Galaxy Note 10.1'],\n        'GT-N8010': ['Samsung', 'Galaxy Note 10.1'],\n        'GT-P1000': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'GT-P1000L': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'GT-P1000M': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'GT-P1000N': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'GT-P1000T': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'GT-P1000 Tablet': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'GT-P1010': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'GT-P3100': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n        'GT-P3100B': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n        'GT-P3110': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n        'GT-P3113': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n        'GT-P5100': ['Samsung', 'Galaxy Tab 2 (10.1)', 'tablet'],\n        'GT-P5110': ['Samsung', 'Galaxy Tab 2 (10.1)', 'tablet'],\n        'GT-P5113': ['Samsung', 'Galaxy Tab 2 (10.1)', 'tablet'],\n        'GT-P6200': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n        'GT-P6200L': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n        'GT-P6201': ['Samsung', 'Galaxy Tab 7.0 Plus N', 'tablet'],\n        'GT-P6210': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n        'GT-P6211': ['Samsung', 'Galaxy Tab 7.0 Plus N', 'tablet'],\n        'GT-P6800': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n        'GT-P6810': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n        'GT-P7100': ['Samsung', 'Galaxy Tab 10.1V', 'tablet'],\n        'GT-P7300': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'GT-P7300B': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'GT-P7310': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'GT-P7320': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'GT-P7320T': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'GT-P7500': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'GT-P7500D': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'GT-P7500R': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'GT-P7500V': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'GT-P7501': ['Samsung', 'Galaxy Tab 10.1N', 'tablet'],\n        'GT-P7510': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'GT-P7511': ['Samsung', 'Galaxy Tab 10.1N', 'tablet'],\n        'GT-S5300': ['Samsung', 'Galaxy Pocket'],\n        'GT-S5360': ['Samsung', 'Galaxy Y'],\n        'GT-S5360B': ['Samsung', 'Galaxy Y'],\n        'GT-S5360L': ['Samsung', 'Galaxy Y'],\n        'GT-S5363': ['Samsung', 'Galaxy Y'],\n        'GT-S5367': ['Samsung', 'Galaxy Y TV'],\n        'GT-S5368': ['Samsung', 'GT-S5368'],\n        'GT-S5369': ['Samsung', 'Galaxy Y'],\n        'GT-S5570': ['Samsung', 'Galaxy Mini'],\n        'GT-S5570B': ['Samsung', 'Galaxy Mini'],\n        'GT-S5570I': ['Samsung', 'Galaxy Mini'],\n        'GT-S5570L': ['Samsung', 'Galaxy Mini'],\n        'GT-S5578': ['Samsung', 'Galaxy Mini'],\n        'GT-S5660': ['Samsung', 'Galaxy Gio'],\n        'GT-S5660M': ['Samsung', 'Galaxy Gio'],\n        'GT-S5660V': ['Samsung', 'Galaxy Gio'],\n        'GT-S5670': ['Samsung', 'Galaxy Fit'],\n        'GT-S5670B': ['Samsung', 'Galaxy Fit'],\n        'GT-S5670L': ['Samsung', 'Galaxy Fit'],\n        'GT-S5690': ['Samsung', 'Galaxy Xcover'],\n        'GT-S5690L': ['Samsung', 'Galaxy Xcover'],\n        'GT-S5820': ['Samsung', 'Galaxy Ace'],\n        'GT-S5830': ['Samsung', 'Galaxy Ace'],\n        'GT-S5830B': ['Samsung', 'Galaxy Ace'],\n        'GT-S5830C': ['Samsung', 'Galaxy Ace'],\n        'GT-S5830D': ['Samsung', 'Galaxy Ace'],\n        'GT-S5830D-parrot': ['Samsung', 'Galaxy Ace'],\n        'GT-S5830i': ['Samsung', 'Galaxy Ace'],\n        'GT-S5830L': ['Samsung', 'Galaxy Ace'],\n        'GT-S5830M': ['Samsung', 'Galaxy Ace'],\n        'GT-S5830T': ['Samsung', 'Galaxy Ace'],\n        'GT-S5838': ['Samsung', 'Galaxy Ace'],\n        'GT-S5839i': ['Samsung', 'Galaxy Ace'],\n        'GT-S6102': ['Samsung', 'Galaxy Y Duos'],\n        'GT-S6102B': ['Samsung', 'Galaxy Y Duos'],\n        'GT-S6500': ['Samsung', 'Galaxy Mini 2'],\n        'GT-S6500D': ['Samsung', 'Galaxy Mini 2'],\n        'GT-S6702': ['Samsung', 'GT-S6702'],\n        'GT-S6802': ['Samsung', 'Galaxy Ace Duos'],\n        'GT-S7500': ['Samsung', 'Galaxy Ace Plus'],\n        'GT-S7500L': ['Samsung', 'Galaxy Ace Plus'],\n        'GT-S7500W': ['Samsung', 'Galaxy Ace Plus'],\n        'GT-T959': ['Samsung', 'Galaxy S Vibrant'],\n        'SCH-i509': ['Samsung', 'Galaxy Y'],\n        'SCH-i559': ['Samsung', 'Galaxy Pop'],\n        'SCH-i569': ['Samsung', 'Galaxy Gio'],\n        'SCH-i579': ['Samsung', 'Galaxy Ace'],\n        'SCH-i589': ['Samsung', 'Galaxy Ace Duos'],\n        'SCH-i705 4G': ['Samsung', 'Galaxy Tab 2 (7.0)', 'tablet'],\n        'SCH-i809': ['Samsung', 'SCH-i809'],\n        'SCH-i889': ['Samsung', 'Galaxy Note'],\n        'SCH-i909': ['Samsung', 'Galaxy S'],\n        'SCH-i919': ['Samsung', 'SCH-i919'],\n        'SCH-i929': ['Samsung', 'SCH-i929'],\n        'SCH-I100': ['Samsung', 'Gem'],\n        'SCH-I110': ['Samsung', 'Illusion'],\n        'SCH-I400': ['Samsung', 'Continuum'],\n        'SCH-I405': ['Samsung', 'Stratosphere'],\n        'SCH-I405 4G': ['Samsung', 'Stratosphere'],\n        'SCH-I500': ['Samsung', 'Fascinate'],\n        'SCH-I510': ['Samsung', 'Stealth V'],\n        'SCH-I510 4G': ['Samsung', 'Droid Charge'],\n        'SCH-I515': ['Samsung', 'Galaxy Nexus'],\n        'SCH-I535': ['Samsung', 'Galaxy S III'],\n        'SCH-I535 4G': ['Samsung', 'Galaxy S III'],\n        'SCH-I619': ['Samsung', 'SCH-I619'],\n        'SCH-I699': ['Samsung', 'SCH-I699'],\n        'SCH-I779': ['Samsung', 'SCH-I779'],\n        'SCH-I800': ['Samsung', 'Galaxy Tab 7.0', 'tablet'],\n        'SCH-I815': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n        'SCH-I815 4G': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n        'SCH-I905': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'SCH-I905 4G': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'SCH-I909': ['Samsung', 'Galaxy S'],\n        'SCH-I915': ['Samsung', 'SCH-I915'],\n        'SCH-I939': ['Samsung', 'Galaxy S III'],\n        'SCH-M828C': ['Samsung', 'Galaxy Precedent'],\n        'SCH-M828Carray(9096483449)': ['Samsung', 'Galaxy Precedent'],\n        'SCH-R530U': ['Samsung', 'Galaxy S III'],\n        'SCH-R680': ['Samsung', 'Repp'],\n        'SCH-R720': ['Samsung', 'Admire'],\n        'SCH-R730': ['Samsung', 'Transfix'],\n        'SCH-R760': ['Samsung', 'Galaxy S II'],\n        'SCH-R820': ['Samsung', 'SCH-R820'],\n        'SCH-R880': ['Samsung', 'Acclaim'],\n        'SCH-R910': ['Samsung', 'Galaxy Indulge 4G'],\n        'SCH-R915': ['Samsung', 'Galaxy Indulge'],\n        'SCH-R920': ['Samsung', 'Galaxy Attain 4G'],\n        'SCH-R930': ['Samsung', 'Galaxy S Aviator'],\n        'SCH-R940': ['Samsung', 'Galaxy S Lightray'],\n        'SCH-S720C': ['Samsung', 'Galaxy Proclaim'],\n        'SCH-S735C': ['Samsung', 'SCH-S735'],\n        'SCH-W899': ['Samsung', 'SCH-W899'],\n        'SCH-W999': ['Samsung', 'SCH-W999'],\n        'SGH-I547': ['Samsung', 'SGH-I547'],\n        'SGH-I717': ['Samsung', 'Galaxy Note'],\n        'SGH-I717D': ['Samsung', 'Galaxy Note'],\n        'SGH-I717M': ['Samsung', 'Galaxy Note'],\n        'SGH-I717R': ['Samsung', 'Galaxy Note'],\n        'SGH-I727': ['Samsung', 'Galaxy S II Skyrocket'],\n        'SGH-i727R': ['Samsung', 'Galaxy S II'],\n        'SGH-I727R': ['Samsung', 'Galaxy S II'],\n        'SGH-I747': ['Samsung', 'Galaxy S III'],\n        'SGH-I747M': ['Samsung', 'Galaxy S III'],\n        'SGH-I748': ['Samsung', 'Galaxy S III'],\n        'SGH-I757': ['Samsung', 'Galaxy S II Skyrocket HD'],\n        'SGH-I777': ['Samsung', 'Galaxy S II'],\n        'SGH-I9777': ['Samsung', 'Galaxy S II'],\n        'SGH-I896': ['Samsung', 'Captivate'],\n        'SGH-I897': ['Samsung', 'Captivate'],\n        'SGH-I927': ['Samsung', 'Captivate Glide'],\n        'SGH-I927R': ['Samsung', 'Captivate Glide'],\n        'SGH-I957': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'SGH-I957D': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'SGH-I957M': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'SGH-I957R': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'SGH-I987': ['Samsung', 'Galaxy Tab 7.0', 'tablet'],\n        'SGH-I997': ['Samsung', 'Infuse 4G'],\n        'SGH-I997R': ['Samsung', 'Infuse 4G'],\n        'SGH-I9000': ['Samsung', 'Galaxy S'],\n        'SGH-S730G': ['Samsung', 'SGH-S730'],\n        'SGH-T499': ['Samsung', 'Dart'],\n        'SGH-T499V': ['Samsung', 'Galaxy Mini'],\n        'SGH-T499Y': ['Samsung', 'Galaxy Mini'],\n        'SGH-T589': ['Samsung', 'Gravity Smart'],\n        'SGH-T589R': ['Samsung', 'Gravity Smart'],\n        'SGH-T679': ['Samsung', 'Exhibit II 4G'],\n        'SGH-T679M': ['Samsung', 'Exhibit II 4G'],\n        'SGH-T759': ['Samsung', 'Exhibit 4G'],\n        'SGH-T769': ['Samsung', 'Galaxy S Blaze 4G'],\n        'SGH-T839': ['Samsung', 'T-Mobile Sidekick'],\n        'SGH-T849': ['Samsung', 'Galaxy Tab 7.0', 'tablet'],\n        'SGH-T859': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'SGH-T869': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n        'SGH-T879': ['Samsung', 'Galaxy Note'],\n        'SGH-T959': ['Samsung', 'Vibrant'],\n        'SGH-T959D': ['Samsung', 'Galaxy S Fascinate 3G+'],\n        'SGH-T959P': ['Samsung', 'Galaxy S Fascinate 4G'],\n        'SGH-T959V': ['Samsung', 'Galaxy S 4G'],\n        'SGH-T989': ['Samsung', 'Galaxy S II'],\n        'SGH-T989D': ['Samsung', 'Galaxy S II X'],\n        'SGH-T999': ['Samsung', 'Galaxy S Blaze 4G'],\n        'SGH-T999V': ['Samsung', 'Galaxy S Blaze 4G'],\n        'SHV-E120K': ['Samsung', 'Galaxy S II HD LTE'],\n        'SHV-E120L': ['Samsung', 'Galaxy S II HD LTE'],\n        'SHV-E120S': ['Samsung', 'Galaxy S II HD LTE'],\n        'SHV-E110S': ['Samsung', 'Galaxy S II LTE'],\n        'SHV-E140S': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'SHV-E150S': ['Samsung', 'Galaxy Tab 7.7', 'tablet'],\n        'SHV-E160K': ['Samsung', 'Galaxy Note'],\n        'SHV-E160L': ['Samsung', 'Galaxy Note LTE'],\n        'SHV-E160S': ['Samsung', 'Galaxy Note LTE'],\n        'SHV-E170K': ['Samsung', 'SHV-E170K'],\n        'SHV-E170L': ['Samsung', 'SHV-E170L'],\n        'SHV-E210K': ['Samsung', 'Galaxy S III'],\n        'SHV-E210L': ['Samsung', 'Galaxy S III'],\n        'SHV-E210S': ['Samsung', 'Galaxy S III'],\n        'SHW-M100S': ['Samsung', 'Galaxy A'],\n        'SHW-M110S': ['Samsung', 'Galaxy S'],\n        'SHW-M130L': ['Samsung', 'Galaxy U'],\n        'SHW-M130K': ['Samsung', 'Galaxy K'],\n        'SHW-M180K': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'SHW-M180L': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'SHW-M180S': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'SHW-M180W': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'SHW-M185S': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'SHW-M190S': ['Samsung', 'Galaxy S Hoppin'],\n        'SHW-M220L': ['Samsung', 'Galaxy Neo'],\n        'SHW-M240S': ['Samsung', 'Galaxy Ace'],\n        'SHW-M250K': ['Samsung', 'Galaxy S II'],\n        'SHW-M250L': ['Samsung', 'Galaxy S II'],\n        'SHW-M250S': ['Samsung', 'Galaxy S II'],\n        'SHW-M300W': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'SHW-M305W': ['Samsung', 'Galaxy Tab 8.9', 'tablet'],\n        'SHW-M340S': ['Samsung', 'Galaxy M Style'],\n        'SHW-M380K': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'SHW-M380S': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'SHW-M380W': ['Samsung', 'Galaxy Tab 10.1', 'tablet'],\n        'SHW-M440S': ['Samsung', 'Galaxy S III'],\n        'SMT-i9100': ['Samsung', 'SMT-I9100', 'tablet'],\n        'SPH-D600': ['Samsung', 'Conquer 4G'],\n        'SPH-D700': ['Samsung', 'Epic 4G'],\n        'SPH-D705': ['Samsung', 'Epic 4G 2'],\n        'SPH-D710': ['Samsung', 'Epic 4G Touch'],\n        'SPH-L700': ['Samsung', 'Galaxy Nexus'],\n        'SPH-L710': ['Samsung', 'Galaxy S III'],\n        'SPH-M820': ['Samsung', 'Galaxy Prevail'],\n        'SPH-M820-BST': ['Samsung', 'Galaxy Prevail'],\n        'SPH-M580': ['Samsung', 'Replenish'],\n        'SPH-M900': ['Samsung', 'Moment'],\n        'SPH-M910': ['Samsung', 'Intercept'],\n        'SPH-M920': ['Samsung', 'Transform'],\n        'SPH-M930': ['Samsung', 'Transform Ultra'],\n        'SPH-M930BST': ['Samsung', 'Transform Ultra'],\n        'SPH-P100': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'YP-GB1': ['Samsung', 'Galaxy Player', 'media'],\n        'YP-GB70': ['Samsung', 'Galaxy Player 70', 'media'],\n        'YP-GB70D': ['Samsung', 'Galaxy Player 70 Plus', 'media'],\n        'YP-GS1': ['Samsung', 'Galaxy S WiFi 3.6', 'media'],\n        'YP-G1': ['Samsung', 'Galaxy S WiFi 4.0', 'media'],\n        'YP-GI1': ['Samsung', 'Galaxy S WiFi 4.2', 'media'],\n        'YP-G50': ['Samsung', 'Galaxy Player', 'media'],\n        'YP-G70': ['Samsung', 'Galaxy S WiFi 5.0', 'media'],\n        'GT9100': ['Samsung', 'Galaxy S II'],\n        'I897': ['Samsung', 'Captivate'],\n        'I7500': ['Samsung', 'Galaxy'],\n        'I9000': ['Samsung', 'Galaxy S'],\n        'T959': ['Samsung', 'Galaxy S Vibrant'],\n        'Captivate-I897': ['Samsung', 'Captivate'],\n        'Galaxy': ['Samsung', 'Galaxy'],\n        'Galaxy Note': ['Samsung', 'Galaxy Note'],\n        'GalaxyS': ['Samsung', 'Galaxy S'],\n        'Galaxy S II': ['Samsung', 'Galaxy S II'],\n        'Galaxy X': ['Samsung', 'Galaxy X'],\n        'Galaxy Spica': ['Samsung', 'Galaxy Spica'],\n        'GALAXY Tab': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'GALAXY NEXUS': ['Samsung', 'Galaxy Nexus'],\n        'Vibrantmtd': ['Samsung', 'Vibrant'],\n        'SC-01C': ['Samsung', 'Galaxy Tab', 'tablet'],\n        'SC-01D': ['Samsung', 'Galaxy Tab 10.1 LTE', 'tablet'],\n        'SC-02B': ['Samsung', 'Galaxy S'],\n        'SC-02C': ['Samsung', 'Galaxy S II'],\n        'SC-02D': ['Samsung', 'Galaxy Tab 7.0 Plus', 'tablet'],\n        'SC-03D': ['Samsung', 'Galaxy S II LTE'],\n        'SC-04D': ['Samsung', 'Galaxy Nexus'],\n        'SC-05D': ['Samsung', 'Galaxy Note LTE'],\n        'SC-06D': ['Samsung', 'Galaxy S III'],\n        'ISW11SC': ['Samsung', 'Galaxy S II WiMAX'],\n        'GT-S7562': ['Samsung', 'GT-S7562'],\n        'GT-S7562i': ['Samsung', 'GT-S7562i'],\n        'A01SH': ['Sharp', 'A01SH'],\n        'IS01': ['Sharp', 'IS01'],\n        'IS03': ['Sharp', 'IS03'],\n        'IS05': ['Sharp', 'IS05'],\n        'IS11SH': ['Sharp', 'Aquos IS11SH'],\n        'IS12SH': ['Sharp', 'Aquos IS12SH'],\n        'IS13SH': ['Sharp', 'Aquos IS13SH'],\n        'IS14SH': ['Sharp', 'Aquos IS14SH'],\n        'ISW16SH': ['Sharp', 'Aquos ISW16SH'],\n        'EB-W51GJ': ['Sharp', 'EB-W51GJ'],\n        'SBM003SH': ['Sharp', 'Galapagos'],\n        'SBM005SH': ['Sharp', 'Galapagos'],\n        'SBM006SH': ['Sharp', 'Aquos'],\n        'SBM007SH': ['Sharp', 'Aquos 007SH'],\n        'SBM009SH': ['Sharp', 'Aquos 009SH'],\n        'SBM102SH': ['Sharp', 'Aquos 102SH'],\n        'SBM103SH': ['Sharp', 'Aquos 103SH'],\n        'SBM104SH': ['Sharp', 'Aquos 104SH'],\n        'SBM107SH': ['Sharp', 'Aquos 107SH'],\n        'SBM107SHB': ['Sharp', 'Aquos 107SH'],\n        'SH-01D': ['Sharp', 'Aquos SH-01D'],\n        'SH-02D': ['Sharp', 'Aquos slider SH-02D'],\n        'SH-03C': ['Sharp', 'Lynx 3D'],\n        'SH-06D': ['Sharp', 'Aquos SH-06D'],\n        'SH-09D': ['Sharp', 'Aquos Zeta SH-09D'],\n        'SH-10B': ['Sharp', 'Lynx'],\n        'SH-12C': ['Sharp', 'Aquos'],\n        'SH-13C': ['Sharp', 'Aquos f SH-13C'],\n        'SH80F': ['Sharp', 'Aquos SH80F'],\n        'SH72x8U': ['Sharp', 'SH72x8U'],\n        'SH8118U': ['Sharp', 'SH8118U'],\n        'SH8128U': ['Sharp', 'SH8128U'],\n        'SH8158U': ['Sharp', 'SH8158U'],\n        'SH8188U': ['Sharp', 'SH8188U'],\n        'SH8268U': ['Sharp', 'SH8268U'],\n        'INFOBAR C01': ['Sharp', 'INFOBAR C01'],\n        'SPX-5': ['Simvalley', 'SPX-5'],\n        'SPX-5 3G': ['Simvalley', 'SPX-5 3G'],\n        'SmartQ G7': ['SmartQ', 'G7', 'tablet'],\n        'SmartQT7': ['SmartQ', 'T7', 'tablet'],\n        'SmartQT10': ['SmartQ', 'T10', 'tablet'],\n        'SmartQT15': ['SmartQ', 'T15', 'tablet'],\n        'SmartQT19': ['SmartQ', 'T19', 'tablet'],\n        'SmartQT20': ['SmartQ', 'T20', 'tablet'],\n        'OMS1 6': ['Sony Ericsson', 'A8i'],\n        'E10a': ['Sony Ericsson', 'Xperia X10 Mini'],\n        'E10i': ['Sony Ericsson', 'Xperia X10 Mini'],\n        'E10iv': ['Sony Ericsson', 'Xperia X10 Mini'],\n        'E15': ['Sony Ericsson', 'Xperia X8'],\n        'E15a': ['Sony Ericsson', 'Xperia X8'],\n        'E15i': ['Sony Ericsson', 'Xperia X8'],\n        'E15iv': ['Sony Ericsson', 'Xperia X8'],\n        'E15i-o': ['Sony Ericsson', 'Xperia X8'],\n        'E16i': ['Sony Ericsson', 'W8 Walkman'],\n        'LT11i': ['Sony Ericsson', 'Xperia Neo V'],\n        'LT15': ['Sony Ericsson', 'Xperia Arc'],\n        'LT15a': ['Sony Ericsson', 'Xperia Arc'],\n        'LT15i': ['Sony Ericsson', 'Xperia Arc'],\n        'LT15iv': ['Sony Ericsson', 'Xperia Arc'],\n        'LT15i-o': ['Sony Ericsson', 'Xperia Arc'],\n        'LT18a': ['Sony Ericsson', 'Xperia Arc S'],\n        'LT18i': ['Sony Ericsson', 'Xperia Arc S'],\n        'LT18iv': ['Sony Ericsson', 'Xperia Arc S'],\n        'LT18i-o': ['Sony Ericsson', 'Xperia Arc S'],\n        'LT22i': ['Sony', 'Xperia P'],\n        'LT26i': ['Sony', 'Xperia S'],\n        'LT26ii': ['Sony', 'Xperia S'],\n        'LT26i-o': ['Sony', 'Xperia S'],\n        'LT28at': ['Sony', 'Xperia Ion'],\n        'LT28h': ['Sony', 'Xperia Ion'],\n        'LT28i': ['Sony', 'Xperia Ion'],\n        'LT29i': ['Sony', 'Xperia GX'],\n        'SonyLT29i': ['Sony', 'Xperia GX'],\n        'SonyLT30a': ['Sony', 'Xperia Mint'],\n        'SonyLT30p': ['Sony', 'Xperia Mint'],\n        'MK16a': ['Sony Ericsson', 'Xperia Pro'],\n        'MK16i': ['Sony Ericsson', 'Xperia Pro'],\n        'MT11a': ['Sony Ericsson', 'Xperia Neo V'],\n        'MT11i': ['Sony Ericsson', 'Xperia Neo V'],\n        'MT11iv': ['Sony Ericsson', 'Xperia Neo V'],\n        'MT11i-o': ['Sony Ericsson', 'Xperia Neo V'],\n        'MT15a': ['Sony Ericsson', 'Xperia Neo'],\n        'MT15i': ['Sony Ericsson', 'Xperia Neo'],\n        'MT15iv': ['Sony Ericsson', 'Xperia Neo'],\n        'MT15i-o': ['Sony Ericsson', 'Xperia Neo'],\n        'MT25i': ['Sony', 'Xperia Neo L'],\n        'MT27i': ['Sony', 'Xperia Sola'],\n        'R800a': ['Sony Ericsson', 'Xperia Play'],\n        'R800i': ['Sony Ericsson', 'Xperia Play'],\n        'R800iv': ['Sony Ericsson', 'Xperia Play'],\n        'R800at': ['Sony Ericsson', 'Xperia Play'],\n        'R800x': ['Sony Ericsson', 'Xperia Play'],\n        'SK17a': ['Sony Ericsson', 'Xperia Mini Pro'],\n        'SK17i': ['Sony Ericsson', 'Xperia Mini Pro'],\n        'SK17iv': ['Sony Ericsson', 'Xperia Mini Pro'],\n        'SK17i-o': ['Sony Ericsson', 'Xperia Mini Pro'],\n        'ST15a': ['Sony Ericsson', 'Xperia Mini'],\n        'ST15i': ['Sony Ericsson', 'Xperia Mini'],\n        'ST17a': ['Sony Ericsson', 'Xperia Active'],\n        'ST17i': ['Sony Ericsson', 'Xperia Active'],\n        'ST18a': ['Sony Ericsson', 'Xperia Ray'],\n        'ST18i': ['Sony Ericsson', 'Xperia Ray'],\n        'ST18iv': ['Sony Ericsson', 'Xperia Ray'],\n        'ST18av': ['Sony Ericsson', 'Xperia Ray'],\n        'SonyST21': ['Sony', '\\'Tapioca\\''],\n        'SonyST21i': ['Sony', '\\'Tapioca\\''],\n        'SonyST21a2': ['Sony', '\\'Tapioca\\''],\n        'ST21': ['Sony', '\\'Tapioca\\''],\n        'ST21i': ['Sony', '\\'Tapioca\\''],\n        'SonyST23i': ['Sony', '\\'Tapioca DS\\''],\n        'ST25i': ['Sony', 'Xperia U'],\n        'ST27i': ['Sony', 'Xperia Go'],\n        'U20a': ['Sony Ericsson', 'Xperia X10 Mini Pro'],\n        'U20i': ['Sony Ericsson', 'Xperia X10 Mini Pro'],\n        'U20iv': ['Sony Ericsson', 'Xperia X10 Mini Pro'],\n        'WT13i': ['Sony Ericsson', 'Mix Walkman'],\n        'WT18i': ['Sony Ericsson', 'Walkman'],\n        'WT19a': ['Sony Ericsson', 'Live with Walkman'],\n        'WT19i': ['Sony Ericsson', 'Live with Walkman'],\n        'WT19iv': ['Sony Ericsson', 'Live with Walkman'],\n        'X8': ['Sony Ericsson', 'Xperia X8'],\n        'X10': ['Sony Ericsson', 'Xperia X10'],\n        'X10a': ['Sony Ericsson', 'Xperia X10'],\n        'X10i': ['Sony Ericsson', 'Xperia X10'],\n        'X10iv': ['Sony Ericsson', 'Xperia X10'],\n        'X10S': ['Sony Ericsson', 'Xperia X10'],\n        'X10mini': ['Sony Ericsson', 'Xperia X10 Mini'],\n        'X10 Mini': ['Sony Ericsson', 'Xperia X10 Mini'],\n        'X10 Mini Pro': ['Sony Ericsson', 'Xperia X10 Mini Pro'],\n        'Z1i': ['Sony Ericsson', 'Xperia Play'],\n        'S51SE': ['Sony Ericsson', 'Xperia Mini'],\n        'IS11S': ['Sony Ericsson', 'Xperia Acro'],\n        'IS12S': ['Sony Ericsson', 'Xperia Acro HD'],\n        'SO-01B': ['Sony Ericsson', 'Xperia X10'],\n        'SO-01C': ['Sony Ericsson', 'Xperia Arc'],\n        'SO-01D': ['Sony Ericsson', 'Xperia Play'],\n        'SO-02C': ['Sony Ericsson', 'Xperia Acro'],\n        'SO-02D': ['Sony Ericsson', 'Xperia NX'],\n        'SO-03C': ['Sony Ericsson', 'Xperia Ray'],\n        'SO-03D': ['Sony Ericsson', 'Xperia Acro HD'],\n        'SO-04D': ['Sony', 'Xperia GX'],\n        'SO-05D': ['Sony', 'Xperia SX'],\n        'XPERIA X8': ['Sony Ericsson', 'Xperia X8'],\n        'Xperia X8': ['Sony Ericsson', 'Xperia X8'],\n        'Xperia X10': ['Sony Ericsson', 'Xperia X10'],\n        'Xperia ray': ['Sony Ericsson', 'Xperia Ray'],\n        'Xperia Ray': ['Sony Ericsson', 'Xperia Ray'],\n        'Xperia Arc': ['Sony Ericsson', 'Xperia Arc'],\n        'Xperia Mini': ['Sony Ericsson', 'Xperia Mini'],\n        'Xperia neo': ['Sony Ericsson', 'Xperia Neo'],\n        'Xperia Neo': ['Sony Ericsson', 'Xperia Neo'],\n        'XPERIA NEO': ['Sony Ericsson', 'Xperia Neo'],\n        'Xperia NeoV': ['Sony Ericsson', 'Xperia Neo V'],\n        'Xperia Neo V': ['Sony Ericsson', 'Xperia Neo V'],\n        'Xperia Play': ['Sony Ericsson', 'Xperia Play'],\n        'Sony Ericsson Xperia X1': ['Sony Ericsson', 'Xperia X1'],\n        'SonyHayabusa': ['Sony', 'Xperia Ion'],\n        'Hayabusa': ['Sony', 'Xperia Ion'],\n        'nozomi': ['Sony', 'Xperia S'],\n        'Sony Tablet P': ['Sony', 'Tablet P', 'tablet'],\n        'Sony Tablet S': ['Sony', 'Tablet S', 'tablet'],\n        'NWZ-Z1000Series': ['Sony', 'Walkman Z', 'media'],\n        'NW-Z1000Series': ['Sony', 'Walkman Z', 'media'],\n        'Spice Mi280': ['Spice', 'Mi-280'],\n        'Spice Mi300': ['Spice', 'Mi-300'],\n        'Spice Mi-310': ['Spice', 'Mi-310'],\n        'Spice Mi-425': ['Spice', 'Mi-425'],\n        'SPICE Mi-720': ['Spice', 'Mi-720'],\n        'A7272+': ['Star', 'A7272+'],\n        'e1109 v73 gq1002 ctp': ['Star', 'X18i'],\n        'TS1004T': ['Surf 3Q', 'TS1004T', 'tablet'],\n        'SYTABEX7-2': ['Sylvania', 'SYTABEX7', 'tablet'],\n        'TCL A860': ['TCL', 'A860'],\n        'TCL A906': ['TCL', 'A906'],\n        'TCL A909': ['TCL', 'A909'],\n        'TCL A919': ['TCL', 'A919'],\n        'TCL A990': ['TCL', 'A990'],\n        'TCL A996': ['TCL', 'A996'],\n        'TCL A998': ['TCL', 'A998'],\n        'TCL GENESEE E708': ['TCL', 'Genesee E708'],\n        'A10t(5DM3)': ['Teclast', 'A10T', 'tablet'],\n        'P72': ['Teclast', 'P72', 'tablet'],\n        'P76TI': ['Teclast', 'P76Ti', 'tablet'],\n        'P81HD': ['Teclast', 'P81HD', 'tablet'],\n        'P85(R8A1)': ['Teclast', 'P85', 'tablet'],\n        'T720 SE': ['Teclast', 'T720', 'tablet'],\n        'T760 from moage.com': ['Teclast', 'T760', 'tablet'],\n        'tegav2': ['Tegatech', 'TEGA v2', 'tablet'],\n        'TM-7025': ['teXet', 'TM-7025', 'tablet'],\n        'MoFing': ['Thomson', 'MoFing', 'tablet'],\n        'Ultimate10': ['Tomtec', 'Ultimate10', 'tablet'],\n        'Thl V7': ['THL', 'V7'],\n        'ThL V7': ['THL', 'V7'],\n        'ThL V8': ['THL', 'V8'],\n        'ThL V9': ['THL', 'V9'],\n        'ThL V11': ['THL', 'V11'],\n        'TSB CLOUD COMPANION;TOSHIBA AC AND AZ': ['Toshiba', 'Dynabook AZ', 'desktop'],\n        'TOSHIBA AC AND AZ': ['Toshiba', 'Dynabook AZ', 'desktop'],\n        'TOSHIBA FOLIO AND A': ['Toshiba', 'Folio 100', 'tablet'],\n        'T-01C': ['Toshiba', 'Regza T-01C'],\n        'T-01D': ['Toshiba', 'Regza T-01D'],\n        'IS04': ['Toshiba', 'Regza IS04'],\n        'IS11T': ['Toshiba', 'Regza IS11T'],\n        'AT1S0': ['Toshiba', 'Regza AT1S0'],\n        'Tostab03': ['Toshiba', 'Regza AT100', 'tablet'],\n        'AT100': ['Toshiba', 'Regza AT100', 'tablet'],\n        'AT200': ['Toshiba', 'Regza AT200', 'tablet'],\n        'AT470': ['Toshiba', 'Regza AT470', 'tablet'],\n        'AT570': ['Toshiba', 'Regza AT570', 'tablet'],\n        'AT830': ['Toshiba', 'Regza AT830', 'tablet'],\n        'Folio 100': ['Toshiba', 'Folio 100', 'tablet'],\n        'folio100': ['Toshiba', 'Folio 100', 'tablet'],\n        'THRiVE': ['Toshiba', 'THRiVE', 'tablet'],\n        'Fantastic T3': ['TWM', 'Fantastic T3'],\n        'M70014': ['United Star Technology', 'M70014', 'tablet'],\n        'PS47': ['Velocity Micro', 'Cruz PS47', 'tablet'],\n        'T301': ['Velocity Micro', 'Cruz T301', 'tablet'],\n        'Vibo-A688': ['FIH', 'Vibo A688'],\n        'Videocon-V7500': ['Videocon', 'V7500'],\n        'GTablet': ['ViewSonic', 'gTablet', 'tablet'],\n        'GtabComb': ['ViewSonic', 'gTablet', 'tablet'],\n        'TeamDRH ICS for GTablet': ['ViewSonic', 'gTablet', 'tablet'],\n        'ViewPad7': ['ViewSonic', 'ViewPad 7', 'tablet'],\n        'ViewPad 10e': ['ViewSonic', 'ViewPad 10e', 'tablet'],\n        'VTAB1008': ['Vizio', 'VTAB1008', 'tablet'],\n        'VTAB3010': ['Vizio', 'VTAB3010', 'tablet'],\n        'VOTO W5300': ['VOTO', 'W5300'],\n        'xPAD-70': ['WayteQ', 'xPAD-70', 'tablet'],\n        'xTAB-70': ['WayteQ', 'xTAB-70', 'tablet'],\n        'WellcoM-A99': ['WellcoM', 'A99'],\n        'N12': ['Window', 'N12', 'tablet'],\n        'N12R': ['Window', 'N12R', 'tablet'],\n        'N50': ['Window', 'N50', 'tablet'],\n        'N50DT': ['Window', 'N50DT', 'tablet'],\n        'N50GT': ['Window', 'N50GT', 'tablet'],\n        'N50GT A': ['Window', 'N50GT-A', 'tablet'],\n        'N70': ['Window', 'N70', 'tablet'],\n        'N70 DUAL CORE': ['Window', 'N70 Dual Core', 'tablet'],\n        'N80': ['Window', 'N80', 'tablet'],\n        'N90': ['Window', 'N90', 'tablet'],\n        'N90 DUAL CORE2 V12': ['Window', 'N90 Dual Core', 'tablet'],\n        'N612': ['Wishway', 'N612'],\n        'AT-AS43D': ['Wolfgang', 'AT-AS43D'],\n        'M12': ['Wopad', 'M12', 'tablet'],\n        'WM8650': ['WonderMedia', 'WM8650', 'tablet'],\n        'MI-ONE': ['Xiaomi', 'MI-ONE'],\n        'MI-ONE C1': ['Xiaomi', 'MI-ONE C1'],\n        'MI-ONE Plus': ['Xiaomi', 'MI-ONE Plus'],\n        'MI 1S': ['Xiaomi', 'MI-ONE Plus'],\n        'MI 1SC': ['Xiaomi', 'MI-ONE 1SC'],\n        'mione plus': ['Xiaomi', 'MI-ONE Plus'],\n        'MI-TWO': ['Xiaomi', 'MI-TWO'],\n        'MI 2': ['Xiaomi', 'MI-TWO'],\n        'MI 2S': ['Xiaomi', 'MI-TWO Plus'],\n        'MI 2SC': ['Xiaomi', 'MI-TWO Plus'],\n        'Q07CL01': ['XVision', 'Q07', 'tablet'],\n        'N6': ['Yarvik', '210 Tablet', 'tablet'],\n        'EMR1879': ['Yidong', 'EMR1879', 'tablet'],\n        'yusun W702': ['Yusun', 'W702'],\n        'YX-YUSUN E80': ['Yusun', 'E80'],\n        'zt180': ['Zenithink', 'ZT-180', 'tablet'],\n        'Jaguar7': ['ZiiLabs', 'Jaguar 7', 'tablet'],\n        'Ziss Ranger HD': ['Ziss', 'Ranger HD'],\n        'ZTE Libra': ['ZTE', 'Libra'],\n        'ZTE-T T9': ['ZTE', 'Light Tab T9', 'tablet'],\n        'V9': ['ZTE', 'Light Tab V9', 'tablet'],\n        'V9e+': ['ZTE', 'Light Tab 2', 'tablet'],\n        'V9A': ['ZTE', 'Light Tab 2', 'tablet'],\n        'Light Tab 2W': ['ZTE', 'Light Tab 2', 'tablet'],\n        'Light Tab 2': ['ZTE', 'Light Tab 2', 'tablet'],\n        'V9C': ['ZTE', 'Light Tab 3', 'tablet'],\n        'V55': ['ZTE', 'Optik', 'tablet'],\n        'Acqua': ['ZTE', 'Acqua'],\n        'Blade': ['ZTE', 'Blade'],\n        'Blade-V880': ['ZTE', 'Blade'],\n        'ZTE-U V880': ['ZTE', 'Blade'],\n        'Blade-opda': ['ZTE', 'Blade'],\n        'ZTE-BLADE': ['ZTE', 'Blade'],\n        'ZTE Blade': ['ZTE', 'Blade'],\n        'ZTE V880': ['ZTE', 'Blade'],\n        'ZTE-U(V)880+': ['ZTE', 'Blade'],\n        'V880': ['ZTE', 'Blade'],\n        'a5': ['ZTE', 'Blade'],\n        'Blade2': ['ZTE', 'Blade 2'],\n        'Blade S': ['ZTE', 'Blade S'],\n        'X500': ['ZTE', 'Score'],\n        'ZTE-X500': ['ZTE', 'Score'],\n        'Skate': ['ZTE', 'Skate'],\n        'ZTE Skate': ['ZTE', 'Skate'],\n        'ZTE-Skate': ['ZTE', 'Skate'],\n        'ZTE-SKATE': ['ZTE', 'Skate'],\n        'ZTE-V960': ['ZTE', 'Skate'],\n        'ZTE-U V960': ['ZTE', 'Skate'],\n        'ZTE Racer': ['ZTE', 'Racer'],\n        'ZTE-RACER': ['ZTE', 'Racer'],\n        'MTC 916': ['ZTE', 'Racer'],\n        'Racer': ['ZTE', 'Racer'],\n        'RacerII': ['ZTE', 'Racer 2'],\n        'RACERII': ['ZTE', 'Racer 2'],\n        'ZTE Roamer': ['ZTE', 'Roamer'],\n        'N860': ['ZTE', 'Warp'],\n        'N880': ['ZTE', 'Blade'],\n        'ZTE-T U802': ['ZTE', 'T-U802'],\n        'ZTE-T U806': ['ZTE', 'T-U806'],\n        'ZTE-T U812': ['ZTE', 'T-U812'],\n        'ZTE-T U830': ['ZTE', 'T-U830'],\n        'ZTE-T U880': ['ZTE', 'T-U880'],\n        'ZTE T U880': ['ZTE', 'T-U880'],\n        'ZTE-TU880': ['ZTE', 'T-U880'],\n        'ZTE-TU900': ['ZTE', 'T-U900'],\n        'ZTE-T U960': ['ZTE', 'T-U960'],\n        'ZTE-TU960s': ['ZTE', 'T-U960'],\n        'ZTE-T U960s': ['ZTE', 'T-U960'],\n        'ZTE U N720': ['ZTE', 'U-N720'],\n        'ZTE-U V856': ['ZTE', 'U-V856'],\n        'ZTE-U V857': ['ZTE', 'U-V857'],\n        'ZTE-U V881': ['ZTE', 'U-V881'],\n        'ZTE-U X850': ['ZTE', 'U-X850'],\n        'ZTE-U X876': ['ZTE', 'U-X876'],\n        'ZTE-X876': ['ZTE', 'U-X876'],\n        'ZTE-C R750': ['ZTE', 'C-R750'],\n        'ZTE-C N600': ['ZTE', 'C-N600'],\n        'ZTE-C N600+': ['ZTE', 'C-N600'],\n        'ZTE-C N606': ['ZTE', 'C-N606'],\n        'ZTE-C N700': ['ZTE', 'C-N700'],\n        'ZTE-C N760': ['ZTE', 'C-N760'],\n        'ZTE-C N880': ['ZTE', 'C-N880'],\n        'ZTE-C N880S': ['ZTE', 'C-N880'],\n        'ZTE-C N880s': ['ZTE', 'C-N880'],\n        'ZTE-C X500': ['ZTE', 'C-X500'],\n        'ZTE-C X920': ['ZTE', 'C-X920'],\n        'ZXY-ZTE-C X920': ['ZTE', 'C-X920'],\n        'ZTE GV821': ['ZTE', 'G-V821'],\n        'ZTE N880E': ['ZTE', 'N880E'],\n        'ZTE-N880E': ['ZTE', 'N880E'],\n        'MIUI N880S': ['ZTE', 'N880S'],\n        'ZTE N882E': ['ZTE', 'N882E'],\n        'ZTE N855D': ['ZTE', 'N855D'],\n        'ZTE-N910': ['ZTE', 'N910'],\n        'E810': ['ZTE', 'E810'],\n        'u880': ['ZTE', 'U880'],\n        'ZTE U880E': ['ZTE', 'U880E'],\n        'U880': ['ZTE', 'U880'],\n        'ZTE U970': ['ZTE', 'U970'],\n        'ZTE V768': ['ZTE', 'V768'],\n        'ZTE-V856': ['ZTE', 'V856'],\n        'ZTE V877b': ['ZTE', 'V877'],\n        'ZTE V889D': ['ZTE', 'V889'],\n        'ZTE-Z990': ['ZTE', 'Z990'],\n        'ZTEU790': ['ZTE', 'U790'],\n        '003Z': ['ZTE', 'Softbank 003Z'],\n        '008Z': ['ZTE', 'Softbank 008Z'],\n        '009Z': ['ZTE', 'Softbank Star7'],\n        'i-mobile i691': ['i-Mobile', 'i691'],\n        'i-mobile i695': ['i-Mobile', 'i695'],\n        'i-mobile i858': ['i-Mobile', 'i858'],\n        'i-mobile 3G 8500': ['i-Mobile', '3G 8500'],\n        'i-mobile I-Note': ['i-Mobile', 'i-Note', 'tablet'],\n        'Optimus Boston': ['Optimus', 'Boston'],\n        'Optimus San Francisco': ['Optimus', 'San Francisco'],\n        'Optimus Monte Carlo': ['Optimus', 'Monte Carlo'],\n        'Orange Boston': ['Orange', 'Boston'],\n        'Orange Monte Carlo': ['Orange', 'Monte Carlo'],\n        'San Francisco': ['Orange', 'San Francisco'],\n        'San Francisco for Orange': ['Orange', 'San Francisco'],\n        'Orange San Francisco': ['Orange', 'San Francisco'],\n        'MOVE': ['T-Mobile', 'MOVE'],\n        'T-Mobile G1': ['T-Mobile', 'G1'],\n        'T-Mobile G2': ['T-Mobile', 'G2'],\n        'T-Mobile G2 Touch': ['T-Mobile', 'G2'],\n        'LG-P999': ['T-Mobile', 'G2x'],\n        'LG-E739': ['T-Mobile', 'myTouch'],\n        'T-Mobile myTouch 3G': ['T-Mobile', 'myTouch 3G'],\n        'T-Mobile myTouch 3G Slide': ['T-Mobile', 'myTouch 3G Slide'],\n        'T-Mobile Espresso': ['T-Mobile', 'myTouch 3G Slide'],\n        'HTC myTouch 3G Slide': ['T-Mobile', 'myTouch 3G Slide'],\n        'T-Mobile myTouch 4G': ['T-Mobile', 'myTouch 4G'],\n        'HTC Glacier': ['T-Mobile', 'myTouch 4G'],\n        'HTC Panache': ['T-Mobile', 'myTouch 4G'],\n        'myTouch4G': ['T-Mobile', 'myTouch 4G'],\n        'My Touch 4G': ['T-Mobile', 'myTouch 4G'],\n        'HTC Mytouch 4G': ['T-Mobile', 'myTouch 4G'],\n        'HTC My Touch 4G': ['T-Mobile', 'myTouch 4G'],\n        'HTC mytouch4g': ['T-Mobile', 'myTouch 4G'],\n        'HTC myTouch 4G Slide': ['T-Mobile', 'myTouch 4G Slide'],\n        'myTouch 4G Slide': ['T-Mobile', 'myTouch 4G Slide'],\n        'T-Mobile myTouch Q': ['T-Mobile', 'myTouch Q'],\n        'LG-C800': ['T-Mobile', 'myTouch Q'],\n        'Pulse Mini': ['T-Mobile', 'Pulse Mini'],\n        'Vodafone 845': ['Vodafone', '845 Nova'],\n        'Vodafone 858': ['Vodafone', '858 Smart'],\n        'Vodafone 945': ['Vodafone', '945'],\n        'Vodafone Smart II': ['Vodafone', 'Smart II'],\n        'SmartTab10': ['Vodafone', 'SmartTab 10', 'tablet'],\n        'SCH-N719': ['Samsung', 'Galaxy Note II'],\n        'Coolpad 8190': ['Coolpad', '8190'],\n        'U705T': ['Oppo', 'Ulike2'],\n        'Coolpad 8020+': ['Coolpad', '8020'],\n        'Huawei Y310-5000': ['Huawei', 'Y310'],\n        'GT-S7572': ['Samsung', 'Galaxy Trend Duos II'],\n        'Lenovo A278t': ['Lenovo', 'A278t'],\n        'Lenovo A690': ['Lenovo', 'A690'],\n        'GT-I8262D': ['Samsung', 'LePhone I8262D'],\n        'Lenovo A278t': ['Lenovo', 'A278t'],\n        'MI 2C': ['Xiaomi', 'MI-TWO'],\n        'Coolpad 8070': ['Coolpad', '8070'],\n        'R813T': ['Oppo', 'R813T'],\n        'ZTE U930': ['ZTE', 'U930'],\n        'Lenovo A360': ['Lenovo', 'LePhone A360'],\n        'SCH-N719': ['Samsung', 'Galaxy Note II'],\n        'Coolpad 8010': ['Coolpad', '8010'],\n        'LENOVO-Lenovo-A288t': ['Lenovo', 'A288t'],\n        'U701T': ['Oppo', 'U701T'],\n        'ZTEU795': ['Coolpad', 'U795'],\n        'Haier-HT-I617': ['Haier', 'I617'],\n        'ZTEU880s': ['ZTE', 'T-U880'],\n        'GT-S6352': ['Samsung', 'GT-S6352'],\n        'GT-S7568': ['Samsung', 'GT-S7568'],\n        'K-Touch T619+': ['K-Touch', 'T619'],\n        'MI 2A': ['Xiaomi', 'MI-TWO A'],\n        'GT-N7108': ['Samsung', 'Galaxy Note II'],\n        'K-Touch T621': ['K-Touch', 'T621'],\n        'LENOVO-Lenovo-A298t': ['Lenovo', 'A298'],\n        'Coolpad 8150': ['Coolpad', '8150'],\n        '5860S': ['Coolpad', '5860'],\n        'ZTEU807': ['ZTE', 'U807'],\n        'SCH-I739': ['Samsung', 'SCH-I739'],\n        'SCH-I829': ['Samsung', 'SCH-I829'],\n        'HS-E830': ['Hisense', 'E830'],\n        'HS-E920': ['Hisense', 'E920'],\n        'Lenovo S720': ['Lenovo', 'S720'],\n        'MI 2C': ['Xiaomi', 'MI-TWO'],\n        'OPPO R813T': ['Oppo', 'R813'],\n        'SCH-I879': ['Samsung', 'Galaxy Note'],\n        'GT-S6102E': ['Samsung', 'Galaxy Y Duos']\n    }\n\n    var BLACKBERRY_MODELS = {\n        '9600': 'Bold',\n        '9650': 'Bold',\n        '9700': 'Bold',\n        '9780': 'Bold',\n        '9790': 'Bold',\n        '9900': 'Bold',\n        '9930': 'Bold',\n        '8300': 'Curve',\n        '8310': 'Curve',\n        '8320': 'Curve',\n        '8330': 'Curve',\n        '8350i': 'Curve',\n        '8520': 'Curve',\n        '8530': 'Curve',\n        '8900': 'Curve',\n        '9220': 'Curve',\n        '9300': 'Curve',\n        '9330': 'Curve',\n        '9350': 'Curve',\n        '9360': 'Curve',\n        '9370': 'Curve',\n        '9380': 'Curve',\n        '8100': 'Pearl',\n        '8110': 'Pearl',\n        '8120': 'Pearl',\n        '8130': 'Pearl',\n        '8220': 'Pearl',\n        '8230': 'Pearl',\n        '9100': 'Pearl',\n        '9105': 'Pearl',\n        '9530': 'Storm',\n        '9550': 'Storm',\n        '9670': 'Style',\n        '9800': 'Torch',\n        '9810': 'Torch',\n        '9850': 'Torch',\n        '9860': 'Torch',\n        '9630': 'Tour',\n        '9981': 'Porsche P'\n    };\n\n\n    var Version = function () {\n        this.initialize.apply(this, Array.prototype.slice.call(arguments))\n    };\n    Version.prototype = {\n        initialize: function (v) {\n            this.original = v.value || null;\n            this.alias = v.alias || null;\n            \n        }\n    }\n\n    var Detected = function () {\n        this.initialize.apply(this, arguments)\n    };\n    Detected.prototype = {\n        initialize: function (ua, options) {\n            this.options = {\n                useFeatures: options && options.useFeatures || false,\n                detectCamouflage: options && options.detectCamouflage || true\n            }\n\n            this.browser = {\n                'stock': true,\n                'hidden': false,\n                'channel': ''\n            };\n            this.engine = {};\n            this.os = {};\n            this.device = {\n                'type': 'desktop',\n                'identified': false\n            };\n\n            this.camouflage = false;\n            this.features = [];\n            this.detect(ua);\n        },\n\n        detect: function (ua) {\n\n            /****************************************************\n             *      Unix\n             */\n\n            if (ua.match('Unix')) {\n                this.os.name = 'Unix';\n            }\n\n            /****************************************************\n             *      FreeBSD\n             */\n\n            if (ua.match('FreeBSD')) {\n                this.os.name = 'FreeBSD';\n            }\n\n            /****************************************************\n             *      OpenBSD\n             */\n\n            if (ua.match('OpenBSD')) {\n                this.os.name = 'OpenBSD';\n            }\n\n            /****************************************************\n             *      NetBSD\n             */\n\n            if (ua.match('NetBSD')) {\n                this.os.name = 'NetBSD';\n            }\n\n            /****************************************************\n             *      SunOS\n             */\n\n            if (ua.match('SunOS')) {\n                this.os.name = 'Solaris';\n            }\n\n            /****************************************************\n             *      Linux\n             */\n\n            if (ua.match('Linux')) {\n                this.os.name = 'Linux';\n\n                if (ua.match('CentOS')) {\n                    this.os.name = 'CentOS';\n                    if (match = /CentOS\\/[0-9\\.\\-]+el([0-9_]+)/.exec(ua)) {\n                        this.os.version = new Version({\n                            value: match[1].replace(/_/g, '.')\n                        });\n                    }\n                }\n\n                if (ua.match('Debian')) {\n                    this.os.name = 'Debian';\n                }\n\n                if (ua.match('Fedora')) {\n                    this.os.name = 'Fedora';\n                    if (match = /Fedora\\/[0-9\\.\\-]+fc([0-9]+)/.exec(ua)) {\n                        this.os.version = new Version({\n                            value: match[1]\n                        });\n                    }\n                }\n\n                if (ua.match('Gentoo')) {\n                    this.os.name = 'Gentoo';\n                }\n\n                if (ua.match('Kubuntu')) {\n                    this.os.name = 'Kubuntu';\n                }\n\n                if (ua.match('Mandriva Linux')) {\n                    this.os.name = 'Mandriva';\n                    if (match = /Mandriva Linux\\/[0-9\\.\\-]+mdv([0-9]+)/.exec(ua)) {\n                        this.os.version = new Version({\n                            value: match[1]\n                        });\n                    }\n                }\n\n                if (ua.match('Mageia')) {\n                    this.os.name = 'Mageia';\n                    if (match = /Mageia\\/[0-9\\.\\-]+mga([0-9]+)/.exec(ua)) {\n                        this.os.version = new Version({\n                            value: match[1]\n                        });\n                    }\n                }\n\n                if (ua.match('Red Hat')) {\n                    this.os.name = 'Red Hat';\n                    if (match = /Red Hat[^\\/]*\\/[0-9\\.\\-]+el([0-9_]+)/.exec(ua)) {\n                        this.os.version = new Version({\n                            value: match[1].replace(/_/g, '.')\n                        });\n                    }\n                }\n\n                if (ua.match('Slackware')) {\n                    this.os.name = 'Slackware';\n                }\n\n                if (ua.match('SUSE')) {\n                    this.os.name = 'SUSE';\n                }\n\n                if (ua.match('Turbolinux')) {\n                    this.os.name = 'Turbolinux';\n                }\n\n                if (ua.match('Ubuntu')) {\n                    this.os.name = 'Ubuntu';\n                    if (match = /Ubuntu\\/([0-9.]*)/.exec(ua)) {\n                        this.os.version = new Version({\n                            value: match[1]\n                        });\n                    }\n                }\n            }\n\n            /****************************************************\n             *      iOS\n             */\n\n            if (ua.match('iPhone( Simulator)?;') || ua.match('iPad;') || ua.match('iPod;') || ua.match(/iPhone\\s*\\d*s?[cp]?;/i)) {\n                this.os.name = 'iOS';\n                this.os.version = new Version({\n                    value: '1.0'\n                });\n\n                if (match = /OS (.*) like Mac OS X/.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1].replace(/_/g, '.')\n                    });\n                }\n\n                if (ua.match('iPhone Simulator;')) {\n                    this.device.type = 'emulator';\n                } else if (ua.match('iPod;')) {\n                    this.device.type = 'media';\n                    this.device.manufacturer = 'Apple';\n                    this.device.model = 'iPod Touch';\n                } else if (ua.match('iPhone;') || ua.match(/iPhone\\s*\\d*s?[cp]?;/i)) {\n                    this.device.type = 'mobile';\n                    this.device.manufacturer = 'Apple';\n                    this.device.model = 'iPhone';\n                } else {\n                    this.device.type = 'tablet';\n                    this.device.manufacturer = 'Apple';\n                    this.device.model = 'iPad';\n                }\n\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      MacOS X\n             */\n\n            else if (ua.match('Mac OS X')) {\n                this.os.name = 'Mac OS X';\n\n                if (match = /Mac OS X (10[0-9\\._]*)/.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1].replace(/_/g, '.')\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Windows\n             */\n\n            if (ua.match('Windows')) {\n                this.os.name = 'Windows';\n\n                if (match = /Windows NT ([0-9]\\.[0-9])/.exec(ua)) {\n                    this.os.version = parseVersion(match[1]);\n\n                    switch (match[1]) {\n                        case '6.2':\n                            this.os.version = new Version({\n                                value: match[1],\n                                alias: '8'\n                            });\n                            break;\n                        case '6.1':\n                            this.os.version = new Version({\n                                value: match[1],\n                                alias: '7'\n                            });\n                            break;\n                        case '6.0':\n                            this.os.version = new Version({\n                                value: match[1],\n                                alias: 'Vista'\n                            });\n                            break;\n                        case '5.2':\n                            this.os.version = new Version({\n                                value: match[1],\n                                alias: 'Server 2003'\n                            });\n                            break;\n                        case '5.1':\n                            this.os.version = new Version({\n                                value: match[1],\n                                alias: 'XP'\n                            });\n                            break;\n                        case '5.0':\n                            this.os.version = new Version({\n                                value: match[1],\n                                alias: '2000'\n                            });\n                            break;\n                        default:\n                            this.os.version = new Version({\n                                value: match[1],\n                                alias: 'NT ' + this.os.version\n                            });\n                    }\n                }\n\n                if (ua.match('Windows 95') || ua.match('Win95') || ua.match('Win 9x 4.00')) {\n                    this.os.version = new Version({\n                        value: '4.0',\n                        alias: '95'\n                    });\n                }\n\n                if (ua.match('Windows 98') || ua.match('Win98') || ua.match('Win 9x 4.10')) {\n                    this.os.version = new Version({\n                        value: '4.1',\n                        alias: '98'\n                    });\n                }\n\n                if (ua.match('Windows ME') || ua.match('WinME') || ua.match('Win 9x 4.90')) {\n                    this.os.version = new Version({\n                        value: '4.9',\n                        alias: 'ME'\n                    });\n                }\n\n                if (ua.match('Windows XP') || ua.match('WinXP')) {\n                    this.os.name = new Version({\n                        value: '5.1',\n                        alias: 'XP'\n                    });\n                }\n\n                if (ua.match('WP7')) {\n                    this.os.name = 'Windows Phone';\n                    this.os.version = new Version({\n                        value: '7.0',\n                        details: 2\n                    });\n                    this.device.type = 'mobile';\n                    this.browser.mode = 'desktop';\n                }\n\n                if (ua.match('Windows CE') || ua.match('WinCE') || ua.match('WindowsCE')) {\n                    if (ua.match(' IEMobile')) {\n                        this.os.name = 'Windows Mobile';\n\n                        if (ua.match(' IEMobile 8')) {\n                            this.os.version = new Version({\n                                value: '6.5',\n                                details: 2\n                            });\n                        }\n\n                        if (ua.match(' IEMobile 7')) {\n                            this.os.version = new Version({\n                                value: '6.1',\n                                details: 2\n                            });\n                        }\n\n                        if (ua.match(' IEMobile 6')) {\n                            this.os.version = new Version({\n                                value: '6.0',\n                                details: 2\n                            });\n                        }\n                    } else {\n                        this.os.name = 'Windows CE';\n\n                        if (match = /WindowsCEOS\\/([0-9.]*)/.exec(ua)) {\n                            this.os.version = new Version({\n                                value: match[1],\n                                details: 2\n                            });\n                        }\n\n                        if (match = /Windows CE ([0-9.]*)/.exec(ua)) {\n                            this.os.version = new Version({\n                                value: match[1],\n                                details: 2\n                            });\n                        }\n                    }\n\n                    this.device.type = 'mobile';\n                }\n\n                if (ua.match('Windows Mobile')) {\n                    this.os.name = 'Windows Mobile';\n                    this.device.type = 'mobile';\n                }\n\n                if (match = /WindowsMobile\\/([0-9.]*)/.exec(ua)) {\n                    this.os.name = 'Windows Mobile';\n                    this.os.version = new Version({\n                        value: match[1],\n                        details: 2\n                    });\n                    this.device.type = 'mobile';\n                }\n\n                if (ua.match('Windows Phone [0-9]')) {\n                    this.os.name = 'Windows Mobile';\n                    this.os.version = new Version({\n                        value: ua.match(/Windows Phone ([0-9.]*)/)[1],\n                        details: 2\n                    });\n                    this.device.type = 'mobile';\n                }\n\n                if (ua.match('Windows Phone OS')) {\n                    this.os.name = 'Windows Phone';\n                    this.os.version = new Version({\n                        value: ua.match(/Windows Phone OS ([0-9.]*)/)[1],\n                        details: 2\n                    });\n\n                    if (this.os.version < 7) {\n                        this.os.name = 'Windows Mobile';\n                    }\n\n                    if (match = /IEMobile\\/[^;]+; ([^;]+); ([^;]+)[;|\\)]/.exec(ua)) {\n                        this.device.manufacturer = match[1];\n                        this.device.model = match[2];\n                    }\n\n                    this.device.type = 'mobile';\n\n                    var manufacturer = this.device.manufacturer;\n                    var model = cleanupModel(this.device.model);\n\n                    if (typeof WINDOWS_PHONE_MODELS[manufacturer] !== 'undefined' && typeof WINDOWS_PHONE_MODELS[manufacturer][model] !== 'undefined') {\n                        this.device.manufacturer = WINDOWS_PHONE_MODELS[manufacturer][model][0];\n                        this.device.model = WINDOWS_PHONE_MODELS[manufacturer][model][1];\n                        this.device.identified = true;\n                    }\n\n                    if (manufacturer === 'Microsoft' && model === 'XDeviceEmulator') {\n                        this.device.manufacturer = null;\n                        this.device.model = null;\n                        this.device.type = 'emulator';\n                        this.device.identified = true;\n                    }\n                }\n            }\n\n            /****************************************************\n             *      Android\n             */\n            if (ua.match('Android')) {\n                this.os.name = 'Android';\n                this.os.version = null;\n\n                if (match = /Android(?: )?(?:AllPhone_|CyanogenMod_)?(?:\\/)?v?([0-9.]+)/.exec(ua.replace('-update', '.'))) {\n                    this.os.version = new Version({\n                        value: match[1],\n                        details: 3\n                    })\n                }\n\n                if (ua.match('Android Eclair')) {\n                    this.os.version = new Version({\n                        value: '2.0',\n                        details: 3\n                    });\n                }\n\n                this.device.type = 'mobile';\n                if (this.os.version >= 3) this.device.type = 'tablet';\n                if (this.os.version >= 4 && ua.match('Mobile')) this.device.type = 'mobile';\n\n                if (match = /Eclair; (?:[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?) Build\\/([^\\/]*)\\//.exec(ua)) {\n                    this.device.model = match[1];\n                } else if (match = /; ([^;]*[^;\\s])\\s+Build/.exec(ua)) {\n                    this.device.model = match[1];\n                } else if (match = /[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?; ([^;]*[^;\\s]);\\s+Build/.exec(ua)) {\n                    this.device.model = match[1];\n                } else if (match = /\\(([^;]+);U;Android\\/[^;]+;[0-9]+\\*[0-9]+;CTC\\/2.0\\)/.exec(ua)) {\n                    this.device.model = match[1];\n                } else if (match = /;\\s?([^;]+);\\s?[0-9]+\\*[0-9]+;\\s?CTC\\/2.0/.exec(ua)) {\n                    this.device.model = match[1];\n                } else if (match = /zh-cn;\\s*(.*?)(\\/|build)/i.exec(ua)) {\n                    this.device.model = match[1];\n                } else if (match = /Android [^;]+; (?:[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?; )?([^)]+)\\)/.exec(ua)) {\n                    if (!ua.match(/[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?/)) {\n                        this.device.model = match[1];\n                    }\n                } else if (match = /^(.+?)\\/\\S+/i.exec(ua)) {\n                    this.device.model = match[1];\n                }\n\n\n                /* Sometimes we get a model name that starts with Android, in that case it is a mismatch and we should ignore it */\n                if (this.device.model && this.device.model.substring(0, 7) === 'Android') {\n                    this.device.model = null;\n                }\n\n                if (this.device.model) {\n                    var model = cleanupModel(this.device.model);\n\n                    if (typeof ANDROID_MODELS[model] !== 'undefined') {\n                        this.device.manufacturer = ANDROID_MODELS[model][0];\n                        this.device.model = ANDROID_MODELS[model][1];\n                        if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n                        this.device.identified = true;\n                    }\n\n                    if (model === 'Emulator' || model === 'x86 Emulator' || model === 'x86 VirtualBox' || model === 'vm') {\n                        this.device.manufacturer = null;\n                        this.device.model = null;\n                        this.device.type = 'emulator';\n                        this.device.identified = true;\n                    }\n                }\n\n                if (ua.match('HP eStation')) {\n                    this.device.manufacturer = 'HP';\n                    this.device.model = 'eStation';\n                    this.device.type = 'tablet';\n                    this.device.identified = true;\n                }\n                if (ua.match('Pre\\/1.0')) {\n                    this.device.manufacturer = 'Palm';\n                    this.device.model = 'Pre';\n                    this.device.identified = true;\n                }\n                if (ua.match('Pre\\/1.1')) {\n                    this.device.manufacturer = 'Palm';\n                    this.device.model = 'Pre Plus';\n                    this.device.identified = true;\n                }\n                if (ua.match('Pre\\/1.2')) {\n                    this.device.manufacturer = 'Palm';\n                    this.device.model = 'Pre 2';\n                    this.device.identified = true;\n                }\n                if (ua.match('Pre\\/3.0')) {\n                    this.device.manufacturer = 'HP';\n                    this.device.model = 'Pre 3';\n                    this.device.identified = true;\n                }\n                if (ua.match('Pixi\\/1.0')) {\n                    this.device.manufacturer = 'Palm';\n                    this.device.model = 'Pixi';\n                    this.device.identified = true;\n                }\n                if (ua.match('Pixi\\/1.1')) {\n                    this.device.manufacturer = 'Palm';\n                    this.device.model = 'Pixi Plus';\n                    this.device.identified = true;\n                }\n                if (ua.match('P160UN?A?\\/1.0')) {\n                    this.device.manufacturer = 'HP';\n                    this.device.model = 'Veer';\n                    this.device.identified = true;\n                }\n            }\n\n            /****************************************************\n             *      Google TV\n             */\n\n            if (ua.match('GoogleTV')) {\n                this.os.name = 'Google TV';\n\n                if (ua.match('Chrome/5.')) {\n                    this.os.version = new Version({\n                        value: '1'\n                    });\n                }\n\n                if (ua.match('Chrome/11.')) {\n                    this.os.version = new Version({\n                        value: '2'\n                    });\n                }\n\n                this.device.type = 'television';\n            }\n\n            /****************************************************\n             *      WoPhone\n             */\n\n            if (ua.match('WoPhone')) {\n                this.os.name = 'WoPhone';\n\n                if (match = /WoPhone\\/([0-9\\.]*)/.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                this.device.type = 'mobile';\n            }\n\n            /****************************************************\n             *      BlackBerry\n             */\n\n            if (ua.match('BlackBerry')) {\n                this.os.name = 'BlackBerry OS';\n\n                if (!ua.match('Opera')) {\n                    if (match = /BlackBerry([0-9]*)\\/([0-9.]*)/.exec(ua)) {\n                        this.device.model = match[1];\n                        this.os.version = new Version({\n                            value: match[2],\n                            details: 2\n                        });\n                    }\n\n                    if (match = /; BlackBerry ([0-9]*);/.exec(ua)) {\n                        this.device.model = match[1];\n                    }\n\n                    if (match = /Version\\/([0-9.]*)/.exec(ua)) {\n                        this.os.version = new Version({\n                            value: match[1],\n                            details: 2\n                        });\n                    }\n\n                    if (this.os.version >= 10) {\n                        this.os.name = 'BlackBerry';\n                    }\n\n                    if (typeof this.device.model !== 'undefined') {\n                        if (typeof BLACKBERRY_MODELS[this.device.model] !== 'undefined') {\n                            this.device.model = 'BlackBerry ' + BLACKBERRY_MODELS[this.device.model] + ' ' + this.device.model;\n                        } else {\n                            this.device.model = 'BlackBerry ' + this.device.model;\n                        }\n                    } else {\n                        this.device.model = 'BlackBerry';\n                    }\n                } else {\n                    this.device.model = 'BlackBerry';\n                }\n\n                this.device.manufacturer = 'RIM';\n                this.device.type = 'mobile';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      BlackBerry PlayBook\n             */\n\n            if (ua.match('RIM Tablet OS')) {\n                this.os.name = 'BlackBerry Tablet OS';\n                this.os.version = new Version({\n                    value: ua.match(/RIM Tablet OS ([0-9.]*)/)[1],\n                    details: 2\n                });\n\n                this.device.manufacturer = 'RIM';\n                this.device.model = 'BlackBerry PlayBook';\n                this.device.type = 'tablet';\n                this.device.identified = true;\n            } else if (ua.match('PlayBook')) {\n                if (match = /Version\\/(10[0-9.]*)/.exec(ua)) {\n                    this.os.name = 'BlackBerry';\n                    this.os.version = new Version({\n                        value: match[1],\n                        details: 2\n                    });\n\n                    this.device.manufacturer = 'RIM';\n                    this.device.model = 'BlackBerry PlayBook';\n                    this.device.type = 'tablet';\n                    this.device.identified = true;\n                }\n            }\n\n\n            /****************************************************\n             *      WebOS\n             */\n\n            if (ua.match('(?:web|hpw)OS')) {\n                this.os.name = 'webOS';\n                this.os.version = new Version({\n                    value: ua.match(/(?:web|hpw)OS\\/([0-9.]*)/)[1]\n                });\n\n                if (ua.match('tablet')) this.device.type = 'tablet';\n                else this.device.type = 'mobile';\n\n                this.device.manufacturer = ua.match('hpwOS') ? 'HP' : 'Palm';\n                if (ua.match('Pre\\/1.0')) this.device.model = 'Pre';\n                if (ua.match('Pre\\/1.1')) this.device.model = 'Pre Plus';\n                if (ua.match('Pre\\/1.2')) this.device.model = 'Pre2';\n                if (ua.match('Pre\\/3.0')) this.device.model = 'Pre3';\n                if (ua.match('Pixi\\/1.0')) this.device.model = 'Pixi';\n                if (ua.match('Pixi\\/1.1')) this.device.model = 'Pixi Plus';\n                if (ua.match('P160UN?A?\\/1.0')) this.device.model = 'Veer';\n                if (ua.match('TouchPad\\/1.0')) this.device.model = 'TouchPad';\n\n                if (ua.match('Emulator\\/') || ua.match('Desktop\\/')) {\n                    this.device.type = 'emulator';\n                    this.device.manufacturer = null;\n                    this.device.model = null;\n                }\n\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      S60\n             */\n\n            if (ua.match('Symbian') || ua.match('Series[ ]?60') || ua.match('S60')) {\n                this.os.name = 'Series60';\n\n                if (ua.match('SymbianOS/9.1') && !ua.match('Series60')) {\n                    this.os.version = new Version({\n                        value: '3.0'\n                    });\n                }\n\n                if (match = /Series60\\/([0-9.]*)/.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                if (match = /Nokia([^\\/;]+)[\\/|;]/.exec(ua)) {\n                    if (match[1] !== 'Browser') {\n                        this.device.manufacturer = 'Nokia';\n                        this.device.model = match[1];\n                        this.device.identified = true;\n                    }\n                }\n\n                if (match = /Vertu([^\\/;]+)[\\/|;]/.exec(ua)) {\n                    this.device.manufacturer = 'Vertu';\n                    this.device.model = match[1];\n                    this.device.identified = true;\n                }\n\n                if (match = /Symbian; U; ([^;]+); [a-z][a-z]\\-[a-z][a-z]/i.exec(ua)) {\n                    this.device.manufacturer = 'Nokia';\n                    this.device.model = match[1];\n                    this.device.identified = true;\n                }\n\n                if (match = /Samsung\\/([^;]*);/.exec(ua)) {\n                    this.device.manufacturer = STRINGS_SAMSUNG;\n                    this.device.model = match[1];\n                    this.device.identified = true;\n                }\n\n                this.device.type = 'mobile';\n            }\n\n            /****************************************************\n             *      S40\n             */\n\n            if (ua.match('Series40')) {\n                this.os.name = 'Series40';\n\n                if (match = /Nokia([^\\/]+)\\//.exec(ua)) {\n                    this.device.manufacturer = 'Nokia';\n                    this.device.model = match[1];\n                    this.device.identified = true;\n                }\n\n                this.device.type = 'mobile';\n            }\n\n            /****************************************************\n             *      MeeGo\n             */\n\n            if (ua.match('MeeGo')) {\n                this.os.name = 'MeeGo';\n                this.device.type = 'mobile';\n\n                if (match = /Nokia([^\\)]+)\\)/.exec(ua)) {\n                    this.device.manufacturer = 'Nokia';\n                    this.device.model = match[1];\n                    this.device.identified = true;\n                }\n            }\n\n            /****************************************************\n             *      Maemo\n             */\n\n            if (ua.match('Maemo')) {\n                this.os.name = 'Maemo';\n                this.device.type = 'mobile';\n\n                if (match = /(N[0-9]+)/.exec(ua)) {\n                    this.device.manufacturer = 'Nokia';\n                    this.device.model = match[1];\n                    this.device.identified = true;\n                }\n            }\n\n            /****************************************************\n             *      Tizen\n             */\n\n            if (ua.match('Tizen')) {\n                this.os.name = 'Tizen';\n\n                if (match = /Tizen[\\/ ]([0-9.]*)/.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                this.device.type = 'mobile';\n\n                if (match = /\\(([^;]+); ([^\\/]+)\\//.exec(ua)) {\n                    if (match[1] !== 'Linux') {\n                        this.device.manufacturer = match[1];\n                        this.device.model = match[2];\n\n                        if (typeof TIZEN_MODELS[this.device.manufacturer] !== 'undefined' && typeof TIZEN_MODELS[this.device.manufacturer][this.device.model] !== 'undefined') {\n                            var manufacturer = this.device.manufacturer;\n                            var model = cleanupModel(this.device.model);\n\n                            this.device.manufacturer = TIZEN_MODELS[manufacturer][model][0];\n                            this.device.model = TIZEN_MODELS[manufacturer][model][1];\n                            this.device.identified = true;\n                        }\n                    }\n                }\n            }\n\n            /****************************************************\n             *      Bada\n             */\n\n            if (ua.match('[b|B]ada')) {\n                this.os.name = 'Bada';\n\n                if (match = /[b|B]ada\\/([0-9.]*)/.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                this.device.type = 'mobile';\n\n                if (match = /\\(([^;]+); ([^\\/]+)\\//.exec(ua)) {\n                    this.device.manufacturer = match[1];\n                    this.device.model = cleanupModel(match[2]);\n                }\n\n                if (typeof BADA_MODELS[this.device.manufacturer] !== 'undefined' && typeof BADA_MODELS[this.device.manufacturer][this.device.model] !== 'undefined') {\n                    var manufacturer = this.device.manufacturer;\n                    var model = cleanupModel(this.device.model);\n\n                    this.device.manufacturer = BADA_MODELS[manufacturer][model][0];\n                    this.device.model = BADA_MODELS[manufacturer][model][1];\n                    this.device.identified = true;\n                }\n            }\n\n            /****************************************************\n             *      Brew\n             */\n\n            if (ua.match(/BREW/i) || ua.match('BMP; U')) {\n                this.os.name = 'Brew';\n                this.device.type = 'mobile';\n\n                if (match = /BREW; U; ([0-9.]*)/i.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                } else if (match = /;BREW\\/([0-9.]*)/i.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n\n                if (match = /\\(([^;]+);U;REX\\/[^;]+;BREW\\/[^;]+;(?:.*;)?[0-9]+\\*[0-9]+;CTC\\/2.0\\)/.exec(ua)) {\n                    this.device.model = match[1];\n                }\n\n                if (this.device.model) {\n                    var model = cleanupModel(this.device.model);\n\n                    if (typeof BREW_MODELS[model] !== 'undefined') {\n                        this.device.manufacturer = BREW_MODELS[model][0];\n                        this.device.model = BREW_MODELS[model][1];\n                        this.device.identified = true;\n                    }\n                }\n            }\n\n            /****************************************************\n             *      MTK\n             */\n\n            if (ua.match(/\\(MTK;/)) {\n                this.os.name = 'MTK';\n                this.device.type = 'mobile';\n            }\n\n            /****************************************************\n             *      CrOS\n             */\n\n            if (ua.match('CrOS')) {\n                this.os.name = 'Chrome OS';\n                this.device.type = 'desktop';\n            }\n\n            /****************************************************\n             *      Joli OS\n             */\n\n            if (ua.match('Joli OS')) {\n                this.os.name = 'Joli OS';\n                this.device.type = 'desktop';\n\n                if (match = /Joli OS\\/([0-9.]*)/i.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Haiku\n             */\n\n            if (ua.match('Haiku')) {\n                this.os.name = 'Haiku';\n                this.device.type = 'desktop';\n            }\n\n            /****************************************************\n             *      QNX\n             */\n\n            if (ua.match('QNX')) {\n                this.os.name = 'QNX';\n                this.device.type = 'mobile';\n            }\n\n            /****************************************************\n             *      OS/2 Warp\n             */\n\n            if (ua.match('OS\\/2; Warp')) {\n                this.os.name = 'OS/2 Warp';\n                this.device.type = 'desktop';\n\n                if (match = /OS\\/2; Warp ([0-9.]*)/i.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Grid OS\n             */\n\n            if (ua.match('Grid OS')) {\n                this.os.name = 'Grid OS';\n                this.device.type = 'tablet';\n\n                if (match = /Grid OS ([0-9.]*)/i.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      AmigaOS\n             */\n\n            if (ua.match(/AmigaOS/i)) {\n                this.os.name = 'AmigaOS';\n                this.device.type = 'desktop';\n\n                if (match = /AmigaOS ([0-9.]*)/i.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n            }\n\n            /****************************************************\n             *      MorphOS\n             */\n\n            if (ua.match(/MorphOS/i)) {\n                this.os.name = 'MorphOS';\n                this.device.type = 'desktop';\n\n                if (match = /MorphOS ([0-9.]*)/i.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n            }\n\n            /****************************************************\n             *      Kindle\n             */\n\n            if (ua.match('Kindle') && !ua.match('Fire')) {\n                this.os.name = '';\n\n                this.device.manufacturer = 'Amazon';\n                this.device.model = 'Kindle';\n                this.device.type = 'ereader';\n\n                if (ua.match('Kindle\\/2.0')) this.device.model = 'Kindle 2';\n                if (ua.match('Kindle\\/3.0')) this.device.model = 'Kindle 3 or later';\n\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      NOOK\n             */\n\n            if (ua.match('nook browser')) {\n                this.os.name = 'Android';\n\n                this.device.manufacturer = 'Barnes & Noble';\n                this.device.model = 'NOOK';\n                this.device.type = 'ereader';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      Bookeen\n             */\n\n            if (ua.match('bookeen\\/cybook')) {\n                this.os.name = '';\n\n                this.device.manufacturer = 'Bookeen';\n                this.device.model = 'Cybook';\n                this.device.type = 'ereader';\n\n                if (ua.match('Orizon')) {\n                    this.device.model = 'Cybook Orizon';\n                }\n\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      Sony Reader\n             */\n\n            if (ua.match('EBRD1101')) {\n                this.os.name = '';\n\n                this.device.manufacturer = 'Sony';\n                this.device.model = 'Reader';\n                this.device.type = 'ereader';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      iRiver\n             */\n\n            if (ua.match('Iriver ;')) {\n                this.os.name = '';\n\n                this.device.manufacturer = 'iRiver';\n                this.device.model = 'Story';\n                this.device.type = 'ereader';\n\n                if (ua.match('EB07')) {\n                    this.device.model = 'Story HD EB07';\n                }\n\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      Nintendo\n             *\n             *      Opera/9.30 (Nintendo Wii; U; ; 3642; en)\n             *      Opera/9.30 (Nintendo Wii; U; ; 2047-7; en)\n             *      Opera/9.50 (Nintendo DSi; Opera/507; U; en-US)\n             *      Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7455.US\n             *      Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7455.EU\n             */\n\n            if (ua.match('Nintendo Wii')) {\n                this.os.name = '';\n\n                this.device.manufacturer = 'Nintendo';\n                this.device.model = 'Wii';\n                this.device.type = 'gaming';\n                this.device.identified = true;\n            }\n\n            if (ua.match('Nintendo DSi')) {\n                this.os.name = '';\n\n                this.device.manufacturer = 'Nintendo';\n                this.device.model = 'DSi';\n                this.device.type = 'gaming';\n                this.device.identified = true;\n            }\n\n            if (ua.match('Nintendo 3DS')) {\n                this.os.name = '';\n\n                this.device.manufacturer = 'Nintendo';\n                this.device.model = '3DS';\n                this.device.type = 'gaming';\n\n                if (match = /Version\\/([0-9.]*)/.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                this.device.identified = true;\n            }\n\n\n            if (ua.match('PlayStation Portable')) {\n                this.os.name = '';\n\n                this.device.manufacturer = 'Sony';\n                this.device.model = 'Playstation Portable';\n                this.device.type = 'gaming';\n                this.device.identified = true;\n            }\n\n            if (ua.match('PlayStation Vita')) {\n                this.os.name = '';\n\n                if (match = /PlayStation Vita ([0-9.]*)/.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                this.device.manufacturer = 'Sony';\n                this.device.model = 'PlayStation Vita';\n                this.device.type = 'gaming';\n                this.device.identified = true;\n            }\n\n            if (ua.match(/PlayStation 3/i)) {\n                this.os.name = '';\n\n                if (match = /PLAYSTATION 3;? ([0-9.]*)/.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                this.device.manufacturer = 'Sony';\n                this.device.model = 'Playstation 3';\n                this.device.type = 'gaming';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      Panasonic Smart Viera\n             *\n             *      Mozilla/5.0 (FreeBSD; U; Viera; ja-JP) AppleWebKit/535.1 (KHTML, like Gecko) Viera/1.2.4 Chrome/14.0.835.202 Safari/535.1\n             */\n\n            if (ua.match('Viera')) {\n                this.os.name = '';\n                this.device.manufacturer = 'Panasonic';\n                this.device.model = 'Smart Viera';\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n\n            /****************************************************\n             *      Sharp AQUOS TV\n             *\n             *      Mozilla/5.0 (DTV) AppleWebKit/531.2  (KHTML, like Gecko) AQUOSBrowser/1.0 (US00DTV;V;0001;0001)\n             *      Mozilla/5.0 (DTV) AppleWebKit/531.2+ (KHTML, like Gecko) Espial/6.0.4 AQUOSBrowser/1.0 (CH00DTV;V;0001;0001)\n             *      Opera/9.80 (Linux armv6l; U; en) Presto/2.8.115 Version/11.10 AQUOS-AS/1.0 LC-40LE835X\n             */\n\n            if (ua.match('AQUOSBrowser') || ua.match('AQUOS-AS')) {\n                this.os.name = '';\n                this.device.manufacturer = STRINGS_SHARP;\n                this.device.model = 'Aquos TV';\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n\n            /****************************************************\n             *      Samsung Smart TV\n             *\n             *      Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV; Maple2012) AppleWebKit/534.7 (KHTML, like Gecko) SmartTV Safari/534.7\n             *      Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV) AppleWebKit/531.2+ (KHTML, like Gecko) WebBrowser/1.0 SmartTV Safari/531.2+\n             */\n\n            if (ua.match('SMART-TV')) {\n                this.os.name = '';\n                this.device.manufacturer = STRINGS_SAMSUNG;\n                this.device.model = 'Smart TV';\n                this.device.type = 'television';\n                this.device.identified = true;\n\n                if (match = /Maple([0-9]*)/.exec(ua)) {\n                    this.device.model += ' ' + match[1];\n                }\n            }\n\n            /****************************************************\n             *      Sony Internet TV\n             *\n             *      Opera/9.80 (Linux armv7l; U; InettvBrowser/2.2(00014A;SonyDTV115;0002;0100) KDL-46EX640; CC/USA; en) Presto/2.8.115 Version/11.10\n             *      Opera/9.80 (Linux armv7l; U; InettvBrowser/2.2(00014A;SonyDTV115;0002;0100) KDL-40EX640; CC/USA; en) Presto/2.10.250 Version/11.60\n             *      Opera/9.80 (Linux armv7l; U; InettvBrowser/2.2(00014A;SonyDTV115;0002;0100) N/A; CC/USA; en) Presto/2.8.115 Version/11.10\n             *      Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) ; CC/JPN; en) Presto/2.9.167 Version/11.50\n             *      Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) AZ2CVT2; CC/CAN; en) Presto/2.7.61 Version/11.00\n             *      Opera/9.80 (Linux armv6l; Opera TV Store/4207; U; (SonyBDP/BDV11); en) Presto/2.9.167 Version/11.50\n             *      Opera/9.80 (Linux armv6l ; U; (SonyBDP/BDV11); en) Presto/2.6.33 Version/10.60\n             *      Opera/9.80 (Linux armv6l; U; (SonyBDP/BDV11); en) Presto/2.8.115 Version/11.10\n             */\n\n            if (ua.match('SonyDTV|SonyBDP|SonyCEBrowser')) {\n                this.os.name = '';\n                this.device.manufacturer = 'Sony';\n                this.device.model = 'Internet TV';\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      Philips Net TV\n             *\n             *      Opera/9.70 (Linux armv6l ; U; CE-HTML/1.0 NETTV/2.0.2; en) Presto/2.2.1\n             *      Opera/9.80 (Linux armv6l ; U; CE-HTML/1.0 NETTV/3.0.1;; en) Presto/2.6.33 Version/10.60\n             *      Opera/9.80 (Linux mips; U; CE-HTML/1.0 NETTV/3.0.1; PHILIPS-AVM-2012; en) Presto/2.9.167 Version/11.50\n             *      Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.6.33 Version/10.70\n             *      Opera/9.80 (Linux i686; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.9.167 Version/11.50\n             */\n\n            if (ua.match('NETTV\\/')) {\n                this.os.name = '';\n                this.device.manufacturer = 'Philips';\n                this.device.model = 'Net TV';\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      LG NetCast TV\n             *\n             *      Mozilla/5.0 (DirectFB; Linux armv7l) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+ LG Browser/5.00.00(+mouse+3D+SCREEN+TUNER; LGE; GLOBAL-PLAT4; 03.09.22; 0x00000001;); LG NetCast.TV-2012\n             *      Mozilla/5.0 (DirectFB; Linux armv7l) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+ LG Browser/5.00.00(+SCREEN+TUNER; LGE; GLOBAL-PLAT4; 01.00.00; 0x00000001;); LG NetCast.TV-2012\n             *      Mozilla/5.0 (DirectFB; U; Linux armv6l; en) AppleWebKit/531.2  (KHTML, like Gecko) Safari/531.2  LG Browser/4.1.4( BDP; LGE; Media/BD660; 6970; abc;); LG NetCast.Media-2011\n             *      Mozilla/5.0 (DirectFB; U; Linux 7631; en) AppleWebKit/531.2  (KHTML, like Gecko) Safari/531.2  LG Browser/4.1.4( NO_NUM; LGE; Media/SP520; ST.3.97.409.F; 0x00000001;); LG NetCast.Media-2011\n             *      Mozilla/5.0 (DirectFB; U; Linux 7630; en) AppleWebKit/531.2  (KHTML, like Gecko) Safari/531.2  LG Browser/4.1.4( 3D BDP NO_NUM; LGE; Media/ST600; LG NetCast.Media-2011\n             *      (LGSmartTV/1.0) AppleWebKit/534.23 OBIGO-T10/2.0\n             */\n\n            if (match = /LG NetCast\\.(?:TV|Media)-([0-9]*)/.exec(ua)) {\n                this.os.name = '';\n                this.device.manufacturer = STRINGS_LG;\n                this.device.model = 'NetCast TV ' + match[1];\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n            if (match = /LGSmartTV/.exec(ua)) {\n                this.os.name = '';\n                this.device.manufacturer = STRINGS_LG;\n                this.device.model = 'Smart TV';\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      Toshiba Smart TV\n             *\n             *      Mozilla/5.0 (Linux mipsel; U; HbbTV/1.1.1 (; TOSHIBA; DTV_RL953; 56.7.66.7; t12; ) ; ToshibaTP/1.3.0 (+VIDEO_MP4+VIDEO_X_MS_ASF+AUDIO_MPEG+AUDIO_MP4+DRM+NATIVELAUNCH) ; en) AppleWebKit/534.1 (KHTML, like Gecko)\n             *      Mozilla/5.0 (DTV; TSBNetTV/T32013713.0203.7DD; TVwithVideoPlayer; like Gecko) NetFront/4.1 DTVNetBrowser/2.2 (000039;T32013713;0203;7DD) InettvBrowser/2.2 (000039;T32013713;0203;7DD)\n             *      Mozilla/5.0 (Linux mipsel; U; HbbTV/1.1.1 (; TOSHIBA; 40PX200; 0.7.3.0.; t12; ) ; Toshiba_TP/1.3.0 (+VIDEO_MP4+AUDIO_MPEG+AUDIO_MP4+VIDEO_X_MS_ASF+OFFLINEAPP) ; en) AppleWebKit/534.1 (KHTML, like Gec\n             */\n\n            if (ua.match('Toshiba_?TP\\/') || ua.match('TSBNetTV\\/')) {\n                this.os.name = '';\n                this.device.manufacturer = 'Toshiba';\n                this.device.model = 'Smart TV';\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      MachBlue XT\n             */\n\n            if (match = /mbxtWebKit\\/([0-9.]*)/.exec(ua)) {\n                this.os.name = '';\n                this.browser.name = 'MachBlue XT'\n                this.browser.version = new Version({\n                    value: match[1],\n                    details: 2\n                });\n                this.device.type = 'television';\n            }\n\n            /****************************************************\n             *      ADB\n             */\n\n            if (match = /\\(ADB; ([^\\)]+)\\)/.exec(ua)) {\n                this.os.name = '';\n                this.device.manufacturer = 'ADB';\n                this.device.model = (match[1] !== 'Unknown' ? match[1].replace('ADB', '') + ' ' : '') + 'IPTV receiver';\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      MStar\n             */\n\n            if (ua.match(/Mstar;OWB/)) {\n                this.os.name = '';\n                this.device.manufacturer = 'MStar';\n                this.device.model = 'PVR';\n                this.device.type = 'television';\n                this.device.identified = true;\n\n                this.browser.name = 'Origyn Web Browser';\n            }\n\n            /****************************************************\n             *      TechniSat\n             */\n\n            if (match = /\\TechniSat ([^;]+);/.exec(ua)) {\n                this.os.name = '';\n                this.device.manufacturer = 'TechniSat';\n                this.device.model = match[1];\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      Technicolor\n             */\n\n            if (match = /\\Technicolor_([^;]+);/.exec(ua)) {\n                this.os.name = '';\n                this.device.manufacturer = 'Technicolor';\n                this.device.model = match[1];\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      Winbox Evo2\n             */\n\n            if (match = /Winbox Evo2/.exec(ua)) {\n                this.os.name = '';\n                this.device.manufacturer = 'Winbox';\n                this.device.model = 'Evo2';\n                this.device.type = 'television';\n                this.device.identified = true;\n            }\n\n            /****************************************************\n             *      Roku\n             */\n\n            if (match = /^Roku\\/DVP-([0-9]+)/.exec(ua)) {\n                this.device.manufacturer = 'Roku';\n                this.device.type = 'television';\n\n                switch (match[1]) {\n                    case '2000':\n                        this.device.model = 'HD';\n                        break;\n                    case '2050':\n                        this.device.model = 'XD';\n                        break;\n                    case '2100':\n                        this.device.model = 'XDS';\n                        break;\n                    case '2400':\n                        this.device.model = 'LT';\n                        break;\n                    case '3000':\n                        this.device.model = '2 HD';\n                        break;\n                    case '3050':\n                        this.device.model = '2 XD';\n                        break;\n                    case '3100':\n                        this.device.model = '2 XS';\n                        break;\n                }\n\n                this.device.identified = true;\n            }\n\n            if (match = /HbbTV\\/1.1.1 \\([^;]*;\\s*([^;]*)\\s*;\\s*([^;]*)\\s*;/.exec(ua)) {\n                var vendorName = match[1].trim();\n                var modelName = match[2].trim();\n\n                if (!this.device.manufacturer && vendorName !== '' && vendorName !== 'vendorName') {\n                    switch (vendorName) {\n                        case 'LGE':\n                            this.device.manufacturer = 'LG';\n                            break;\n                        case 'TOSHIBA':\n                            this.device.manufacturer = 'Toshiba';\n                            break;\n                        case 'smart':\n                            this.device.manufacturer = 'Smart';\n                            break;\n                        case 'tv2n':\n                            this.device.manufacturer = 'TV2N';\n                            break;\n                        default:\n                            this.device.manufacturer = vendorName;\n                    }\n\n                    if (!this.device.model && modelName !== '' && modelName !== 'modelName') {\n                        switch (modelName) {\n                            case 'GLOBAL_PLAT3':\n                                this.device.model = 'NetCast TV';\n                                break;\n                            case 'SmartTV2012':\n                                this.device.model = 'Smart TV 2012';\n                                break;\n                            case 'videoweb':\n                                this.device.model = 'Videoweb';\n                                break;\n                            default:\n                                this.device.model = modelName;\n                        }\n\n                        if (vendorName === 'Humax') {\n                            this.device.model = this.device.model.toUpperCase();\n                        }\n\n                        this.device.identified = true;\n                        this.os.name = '';\n                    }\n                }\n\n                this.device.type = 'television';\n            }\n\n            /****************************************************\n             *      Detect type based on common identifiers\n             */\n\n            if (ua.match('InettvBrowser')) {\n                this.device.type = 'television';\n            }\n\n            if (ua.match('MIDP')) {\n                this.device.type = 'mobile';\n            }\n\n            /****************************************************\n             *      Try to detect any devices based on common\n             *      locations of model ids\n             */\n\n            if (!this.device.model && !this.device.manufacturer) {\n                var candidates = [];\n\n                if (!ua.match(/^(Mozilla|Opera)/)) if (match = /^(?:MQQBrowser\\/[0-9\\.]+\\/)?([^\\s]+)/.exec(ua)) {\n                    match[1] = match[1].replace(/_TD$/, '');\n                    match[1] = match[1].replace(/_CMCC$/, '');\n                    match[1] = match[1].replace(/[_ ]Mozilla$/, '');\n                    match[1] = match[1].replace(/ Linux$/, '');\n                    match[1] = match[1].replace(/ Opera$/, '');\n                    match[1] = match[1].replace(/\\/[0-9].*$/, '');\n\n                    candidates.push(match[1]);\n                }\n\n                if (match = /[0-9]+x[0-9]+; ([^;]+)/.exec(ua)) {\n                    candidates.push(match[1]);\n                }\n\n                if (match = /[0-9]+X[0-9]+ ([^;\\/\\(\\)]+)/.exec(ua)) {\n                    candidates.push(match[1]);\n                }\n\n                if (match = /Windows NT 5.1; ([^;]+); Windows Phone/.exec(ua)) {\n                    candidates.push(match[1]);\n                }\n\n                if (match = /\\) PPC; (?:[0-9]+x[0-9]+; )?([^;\\/\\(\\)]+)/.exec(ua)) {\n                    candidates.push(match[1]);\n                }\n\n                if (match = /\\(([^;]+); U; Windows Mobile/.exec(ua)) {\n                    candidates.push(match[1]);\n                }\n\n                if (match = /Vodafone\\/1.0\\/([^\\/]+)/.exec(ua)) {\n                    candidates.push(match[1]);\n                }\n\n                if (match = /\\ ([^\\s]+)$/.exec(ua)) {\n                    candidates.push(match[1]);\n                }\n\n                for (var i = 0; i < candidates.length; i++) {\n\n                    if (!this.device.model && !this.device.manufacturer) {\n                        var model = cleanupModel(candidates[i]);\n                        var result = false;\n\n                        if (this.os.name === 'Android') {\n                            if (typeof ANDROID_MODELS[model] !== 'undefined') {\n                                this.device.manufacturer = ANDROID_MODELS[model][0];\n                                this.device.model = ANDROID_MODELS[model][1];\n                                if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n                                this.device.identified = true;\n\n                                result = true;\n                            }\n                        }\n\n                        if (!this.os.name || this.os.name === 'Windows' || this.os.name === 'Windows Mobile' || this.os.name === 'Windows CE') {\n                            if (typeof WINDOWS_MOBILE_MODELS[model] !== 'undefined') {\n                                this.device.manufacturer = WINDOWS_MOBILE_MODELS[model][0];\n                                this.device.model = WINDOWS_MOBILE_MODELS[model][1];\n                                this.device.type = 'mobile';\n                                this.device.identified = true;\n\n                                if (this.os.name !== 'Windows Mobile') {\n                                    this.os.name = 'Windows Mobile';\n                                    this.os.version = null;\n                                }\n\n                                result = true;\n                            }\n                        }\n                    }\n\n                    if (!result) {\n                        if (match = /^GIONEE-([^\\s]+)/.exec(candidates[i])) {\n                            this.device.manufacturer = 'Gionee';\n                            this.device.model = cleanupModel(match[1]);\n                            this.device.type = 'mobile';\n                            this.device.identified = true;\n                        }\n\n                        if (match = /^HTC_?([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n                            this.device.manufacturer = STRINGS_HTC;\n                            this.device.model = cleanupModel(match[1]);\n                            this.device.type = 'mobile';\n                            this.device.identified = true;\n                        }\n\n                        if (match = /^HUAWEI-([^\\/]*)/.exec(candidates[i])) {\n                            this.device.manufacturer = STRINGS_HUAWEI;\n                            this.device.model = cleanupModel(match[1]);\n                            this.device.type = 'mobile';\n                            this.device.identified = true;\n                        }\n\n                        if (match = /(?:^|\\()LGE?(?:\\/|-|_|\\s)([^\\s]*)/.exec(candidates[i])) {\n                            this.device.manufacturer = STRINGS_LG;\n                            this.device.model = cleanupModel(match[1]);\n                            this.device.type = 'mobile';\n                            this.device.identified = true;\n                        }\n\n                        if (match = /^MOT-([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n                            this.device.manufacturer = STRINGS_MOTOROLA;\n                            this.device.model = cleanupModel(match[1]);\n                            this.device.type = 'mobile';\n                            this.device.identified = true;\n                        }\n\n                        if (match = /^Motorola_([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n                            this.device.manufacturer = STRINGS_MOTOROLA;\n                            this.device.model = cleanupModel(match[1]);\n                            this.device.type = 'mobile';\n                            this.device.identified = true;\n                        }\n\n                        if (match = /^Nokia([^\\/]+)(?:\\/|$)/.exec(candidates[i])) {\n                            this.device.manufacturer = 'Nokia';\n                            this.device.model = cleanupModel(match[1]);\n                            this.device.type = 'mobile';\n                            this.device.identified = true;\n\n                            if (!this.os.name) {\n                                this.os.name = 'Series40';\n                            }\n                        }\n\n                        if (match = /^SonyEricsson([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n                            this.device.manufacturer = STRINGS_SONY_ERICSSON;\n                            this.device.model = cleanupModel(match[1]);\n                            this.device.type = 'mobile';\n                            this.device.identified = true;\n                        }\n\n                        if (match = /^SAMSUNG-([^\\/_]+)(?:\\/|_|$)/.exec(candidates[i])) {\n                            this.device.manufacturer = STRINGS_SAMSUNG;\n                            this.device.model = cleanupModel(match[1]);\n                            this.device.type = 'mobile';\n\n                            if (this.os.name === 'Bada') {\n                                var manufacturer = 'SAMSUNG';\n                                var model = cleanupModel(this.device.model);\n\n                                if (typeof BADA_MODELS[manufacturer] !== 'undefined' && typeof BADA_MODELS[manufacturer][model] !== 'undefined') {\n                                    this.device.manufacturer = BADA_MODELS[manufacturer][model][0];\n                                    this.device.model = BADA_MODELS[manufacturer][model][1];\n                                    this.device.identified = true;\n                                }\n                            } else if (match = /Jasmine\\/([0-9.]*)/.exec(ua)) {\n                                var version = match[1];\n                                var manufacturer = 'SAMSUNG';\n                                var model = cleanupModel(this.device.model);\n\n                                if (typeof TOUCHWIZ_MODELS[manufacturer] !== 'undefined' && typeof TOUCHWIZ_MODELS[manufacturer][model] !== 'undefined') {\n                                    this.device.manufacturer = TOUCHWIZ_MODELS[manufacturer][model][0];\n                                    this.device.model = TOUCHWIZ_MODELS[manufacturer][model][1];\n                                    this.device.identified = true;\n\n                                    this.os.name = 'Touchwiz';\n                                    this.os.version = new Version({\n                                        value: '2.0'\n                                    });\n                                }\n                            } else if (match = /Dolfin\\/([0-9.]*)/.exec(ua)) {\n                                var version = match[1];\n                                var manufacturer = 'SAMSUNG';\n                                var model = cleanupModel(this.device.model);\n\n                                if (typeof BADA_MODELS[manufacturer] !== 'undefined' && typeof BADA_MODELS[manufacturer][model] !== 'undefined') {\n                                    this.device.manufacturer = BADA_MODELS[manufacturer][model][0];\n                                    this.device.model = BADA_MODELS[manufacturer][model][1];\n                                    this.device.identified = true;\n\n                                    this.os.name = 'Bada';\n\n                                    switch (version) {\n                                        case '2.0':\n                                            this.os.version = new Version({\n                                                value: '1.0'\n                                            });\n                                            break;\n                                        case '2.2':\n                                            this.os.version = new Version({\n                                                value: '1.2'\n                                            });\n                                            break;\n                                        case '3.0':\n                                            this.os.version = new Version({\n                                                value: '2.0'\n                                            });\n                                            break;\n                                    }\n                                }\n\n                                if (typeof TOUCHWIZ_MODELS[manufacturer] !== 'undefined' && typeof TOUCHWIZ_MODELS[manufacturer][model] !== 'undefined') {\n                                    this.device.manufacturer = TOUCHWIZ_MODELS[manufacturer][model][0];\n                                    this.device.model = TOUCHWIZ_MODELS[manufacturer][model][1];\n                                    this.device.identified = true;\n\n                                    this.os.name = 'Touchwiz';\n\n                                    switch (version) {\n                                        case '1.0':\n                                            this.os.version = new Version({\n                                                value: '1.0'\n                                            });\n                                            break;\n                                        case '1.5':\n                                            this.os.version = new Version({\n                                                value: '2.0'\n                                            });\n                                            break;\n                                        case '2.0':\n                                            this.os.version = new Version({\n                                                value: '3.0'\n                                            });\n                                            break;\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n\n            if (match = /\\((?:LG[-|\\/])(.*) (?:Browser\\/)?AppleWebkit/.exec(ua)) {\n                this.device.manufacturer = STRINGS_LG;\n                this.device.model = match[1];\n                this.device.type = 'mobile';\n                this.device.identified = true;\n            }\n\n            if (match = /^Mozilla\\/5.0 \\((?:Nokia|NOKIA)(?:\\s?)([^\\)]+)\\)UC AppleWebkit\\(like Gecko\\) Safari\\/530$/.exec(ua)) {\n                this.device.manufacturer = 'Nokia';\n                this.device.model = match[1];\n                this.device.type = 'mobile';\n                this.device.identified = true;\n\n                this.os.name = 'Series60';\n            }\n\n\n\n            /****************************************************\n             *      Safari\n             */\n\n            if (ua.match('Safari')) {\n                if (this.os.name === 'iOS') {\n                    this.browser.stock = true;\n                    this.browser.hidden = true;\n                    this.browser.name = 'Safari';\n                    this.browser.version = null;\n                }\n\n\n\n                if (this.os.name === 'Mac OS X' || this.os.name === 'Windows') {\n                    this.browser.name = 'Safari';\n                    this.browser.stock = this.os.name === 'Mac OS X';\n\n                    if (match = /Version\\/([0-9\\.]+)/.exec(ua)) {\n                        this.browser.version = new Version({\n                            value: match[1]\n                        });\n                    }\n\n                    if (ua.match(/AppleWebKit\\/[0-9\\.]+\\+/)) {\n                        this.browser.name = 'WebKit Nightly Build';\n                        this.browser.version = null;\n                    }\n                }\n            }\n\n            /****************************************************\n             *      Internet Explorer\n             */\n\n            if (ua.match('MSIE')) {\n                this.browser.name = 'Internet Explorer';\n\n                if (ua.match('IEMobile') || ua.match('Windows CE') || ua.match('Windows Phone') || ua.match('WP7')) {\n                    this.browser.name = 'Mobile Internet Explorer';\n                }\n\n                if (match = /MSIE ([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Opera\n             */\n\n            if (ua.match(/Opera/i)) {\n                this.browser.stock = false;\n                this.browser.name = 'Opera';\n\n                if (match = /Opera[\\/| ]([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                if (match = /Version\\/([0-9.]*)/.exec(ua)) {\n                    if (parseFloat(match[1]) >= 10) {\n                        this.browser.version = new Version({\n                            value: match[1]\n                        });\n                    } else {\n                        this.browser.version = null;\n                    }\n                }\n\n                if (this.browser.version && ua.match('Edition Labs')) {\n                    this.browser.version.type = 'alpha';\n                    this.browser.channel = 'Labs';\n                }\n\n                if (this.browser.version && ua.match('Edition Next')) {\n                    this.browser.version.type = 'alpha';\n                    this.browser.channel = 'Next';\n                }\n\n                if (ua.match('Opera Tablet')) {\n                    this.browser.name = 'Opera Mobile';\n                    this.device.type = 'tablet';\n                }\n\n                if (ua.match('Opera Mobi')) {\n                    this.browser.name = 'Opera Mobile';\n                    this.device.type = 'mobile';\n                }\n\n                if (match = /Opera Mini;/.exec(ua)) {\n                    this.browser.name = 'Opera Mini';\n                    this.browser.version = null;\n                    this.browser.mode = 'proxy';\n                    this.device.type = 'mobile';\n                }\n\n                if (match = /Opera Mini\\/(?:att\\/)?([0-9.]*)/.exec(ua)) {\n                    this.browser.name = 'Opera Mini';\n                    this.browser.version = new Version({\n                        value: match[1],\n                        details: -1\n                    });\n                    this.browser.mode = 'proxy';\n                    this.device.type = 'mobile';\n                }\n\n                if (this.browser.name === 'Opera' && this.device.type === 'mobile') {\n                    this.browser.name = 'Opera Mobile';\n\n                    if (ua.match(/BER/)) {\n                        this.browser.name = 'Opera Mini';\n                        this.browser.version = null;\n                    }\n                }\n\n                if (ua.match('InettvBrowser')) {\n                    this.device.type = 'television';\n                }\n\n                if (ua.match('Opera TV') || ua.match('Opera-TV')) {\n                    this.browser.name = 'Opera';\n                    this.device.type = 'television';\n                }\n\n                if (ua.match('Linux zbov')) {\n                    this.browser.name = 'Opera Mobile';\n                    this.browser.mode = 'desktop';\n\n                    this.device.type = 'mobile';\n\n                    this.os.name = null;\n                    this.os.version = null;\n                }\n\n                if (ua.match('Linux zvav')) {\n                    this.browser.name = 'Opera Mini';\n                    this.browser.version = null;\n                    this.browser.mode = 'desktop';\n\n                    this.device.type = 'mobile';\n\n                    this.os.name = null;\n                    this.os.version = null;\n                }\n            }\n\n            /****************************************************\n             *      Firefox\n             */\n\n            if (ua.match('Firefox')) {\n                this.browser.stock = false;\n                this.browser.name = 'Firefox';\n\n                if (match = /Firefox\\/([0-9ab.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                if (this.browser.version.type === 'alpha') {\n                    this.browser.channel = 'Aurora';\n                }\n\n                if (this.browser.version.type === 'beta') {\n                    this.browser.channel = 'Beta';\n                }\n\n                if (ua.match('Fennec')) {\n                    this.device.type = 'mobile';\n                }\n\n                if (ua.match('Mobile; rv')) {\n                    this.device.type = 'mobile';\n                }\n\n                if (ua.match('Tablet; rv')) {\n                    this.device.type = 'tablet';\n                }\n\n                if (this.device.type === 'mobile' || this.device.type === 'tablet') {\n                    this.browser.name = 'Firefox Mobile';\n                }\n            }\n\n            if (ua.match('Namoroka')) {\n                this.browser.stock = false;\n                this.browser.name = 'Firefox';\n\n                if (match = /Namoroka\\/([0-9ab.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                this.browser.channel = 'Namoroka';\n            }\n\n            if (ua.match('Shiretoko')) {\n                this.browser.stock = false;\n                this.browser.name = 'Firefox';\n\n                if (match = /Shiretoko\\/([0-9ab.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                this.browser.channel = 'Shiretoko';\n            }\n\n            if (ua.match('Minefield')) {\n                this.browser.stock = false;\n                this.browser.name = 'Firefox';\n\n                if (match = /Minefield\\/([0-9ab.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                this.browser.channel = 'Minefield';\n            }\n\n            if (ua.match('Firebird')) {\n                this.browser.stock = false;\n                this.browser.name = 'Firebird';\n\n                if (match = /Firebird\\/([0-9ab.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      SeaMonkey\n             */\n\n            if (ua.match('SeaMonkey')) {\n                this.browser.stock = false;\n                this.browser.name = 'SeaMonkey';\n\n                if (match = /SeaMonkey\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Netscape\n             */\n\n            if (ua.match('Netscape')) {\n                this.browser.stock = false;\n                this.browser.name = 'Netscape';\n\n                if (match = /Netscape[0-9]?\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Konqueror\n             */\n\n            if (ua.match('[k|K]onqueror/')) {\n                this.browser.name = 'Konqueror';\n\n                if (match = /[k|K]onqueror\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Chrome\n             */\n\n            if (match = /(?:Chrome|CrMo|CriOS)\\/([0-9.]*)/.exec(ua)) {\n                this.browser.stock = false;\n                this.browser.name = 'Chrome';\n                this.browser.version = new Version({\n                    value: match[1]\n                });\n\n                if (this.os.name === 'Android') {\n                    switch (match[1].split('.', 3).join('.')) {\n                        case '16.0.912':\n                            this.browser.channel = 'Beta';\n                            break;\n                        case '18.0.1025':\n                            this.browser.version.details = 1;\n                            break;\n                        default:\n                            this.browser.channel = 'Nightly';\n                            break;\n                    }\n                } else {\n                    switch (match[1].split('.', 3).join('.')) {\n                        case '0.2.149':\n                        case '0.3.154':\n                        case '0.4.154':\n                        case '1.0.154':\n                        case '2.0.172':\n                        case '3.0.195':\n                        case '4.0.249':\n                        case '4.1.249':\n                        case '5.0.375':\n                        case '6.0.472':\n                        case '7.0.517':\n                        case '8.0.552':\n                        case '9.0.597':\n                        case '10.0.648':\n                        case '11.0.696':\n                        case '12.0.742':\n                        case '13.0.782':\n                        case '14.0.835':\n                        case '15.0.874':\n                        case '16.0.912':\n                        case '17.0.963':\n                        case '18.0.1025':\n                        case '19.0.1084':\n                        case '20.0.1132':\n                        case '21.0.1180':\n                            if (this.browser.version.minor === 0) this.browser.version.details = 1;\n                            else this.browser.version.details = 2;\n\n                            break;\n                        default:\n                            this.browser.channel = 'Nightly';\n                            break;\n                    }\n                }\n            }\n\n            /****************************************************\n             *      Chrome Frame\n             */\n\n            if (ua.match('chromeframe')) {\n                this.browser.stock = false;\n                this.browser.name = 'Chrome Frame';\n\n                if (match = /chromeframe\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Chromium\n             */\n\n            if (ua.match('Chromium')) {\n                this.browser.stock = false;\n                this.browser.channel = '';\n                this.browser.name = 'Chromium';\n\n                if (match = /Chromium\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      BrowserNG\n             */\n\n            if (ua.match('BrowserNG')) {\n                this.browser.name = 'Nokia Browser';\n\n                if (match = /BrowserNG\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1],\n                        details: 3,\n                        builds: false\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Nokia Browser\n             */\n\n            if (ua.match('NokiaBrowser')) {\n                this.browser.name = 'Nokia Browser';\n\n                if (match = /NokiaBrowser\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1],\n                        details: 3\n                    });\n                }\n            }\n\n            /****************************************************\n             *      MicroB\n             */\n\n            if (ua.match('Maemo[ |_]Browser')) {\n                this.browser.name = 'MicroB';\n\n                if (match = /Maemo[ |_]Browser[ |_]([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1],\n                        details: 3\n                    });\n                }\n            }\n\n\n            /****************************************************\n             *      NetFront\n             */\n\n            if (ua.match('NetFront')) {\n                this.browser.name = 'NetFront';\n                this.device.type = 'mobile';\n\n                if (match = /NetFront\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                if (ua.match('InettvBrowser')) {\n                    this.device.type = 'television';\n                }\n            }\n\n            /****************************************************\n             *      Silk\n             */\n\n            if (ua.match('Silk')) {\n                if (ua.match('Silk-Accelerated')) {\n                    this.browser.name = 'Silk';\n\n                    if (match = /Silk\\/([0-9.]*)/.exec(ua)) {\n                        this.browser.version = new Version({\n                            value: match[1],\n                            details: 2\n                        });\n                    }\n\n                    this.device.manufacturer = 'Amazon';\n                    this.device.model = 'Kindle Fire';\n                    this.device.type = 'tablet';\n                    this.device.identified = true;\n\n                    if (this.os.name !== 'Android') {\n                        this.os.name = 'Android';\n                        this.os.version = null;\n                    }\n                }\n            }\n\n            /****************************************************\n             *      Dolfin\n             */\n\n            if (ua.match('Dolfin')) {\n                this.browser.name = 'Dolfin';\n\n                if (match = /Dolfin\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n\n            /****************************************************\n             *      Iris\n             */\n\n            if (ua.match('Iris')) {\n                this.browser.name = 'Iris';\n\n                this.device.type = 'mobile';\n                this.device.model = null;\n                this.device.manufacturer = null;\n\n                this.os.name = 'Windows Mobile';\n                this.os.version = null;\n\n                if (match = /Iris\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                if (match = / WM([0-9]) /.exec(ua)) {\n                    this.os.version = new Version({\n                        value: match[1] + '.0'\n                    });\n                } else {\n                    this.browser.mode = 'desktop';\n                }\n            }\n\n            /****************************************************\n             *      Jasmine\n             */\n\n            if (ua.match('Jasmine')) {\n                this.browser.name = 'Jasmine';\n\n                if (match = /Jasmine\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Boxee\n             */\n\n            if (ua.match('Boxee')) {\n                this.browser.name = 'Boxee';\n                this.device.type = 'television';\n\n                if (match = /Boxee\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Espial\n             */\n\n            if (ua.match('Espial')) {\n                this.browser.name = 'Espial';\n\n                this.os.name = '';\n                this.os.version = null;\n\n                if (this.device.type !== 'television') {\n                    this.device.type = 'television';\n                    this.device.model = null;\n                    this.device.manufacturer = null;\n                }\n\n                if (match = /Espial\\/([0-9.]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      ANT Galio\n             */\n            if (match = /ANTGalio\\/([0-9.]*)/.exec(ua)) {\n                this.browser.name = 'ANT Galio';\n                this.browser.version = new Version({\n                    value: match[1],\n                    details: 3\n                });\n                this.device.type = 'television';\n            }\n\n            /****************************************************\n             *      NetFront NX\n             */\n            if (match = /NX\\/([0-9.]*)/.exec(ua)) {\n                this.browser.name = 'NetFront NX';\n                this.browser.version = new Version({\n                    value: match[1],\n                    details: 2\n                });\n                if (match = /DTV/i.exec(ua)) {\n                    this.device.type = 'television';\n                } else if (match = /mobile/i.exec(ua)) {\n                    this.device.type = 'mobile';\n                } else {\n                    this.device.type = 'desktop';\n                }\n\n                this.os.name = null;\n                this.os.version = null;\n            }\n\n            /****************************************************\n             *      Obigo\n             */\n\n            if (ua.match(/Obigo/i)) {\n                this.browser.name = 'Obigo';\n\n                if (match = /Obigo\\/([0-9.]*)/i.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                if (match = /Obigo\\/([A-Z])([0-9.]*)/i.exec(ua)) {\n                    this.browser.name = 'Obigo ' + match[1];\n                    this.browser.version = new Version({\n                        value: match[2]\n                    });\n                }\n\n                if (match = /Obigo-([A-Z])([0-9.]*)\\//i.exec(ua)) {\n                    this.browser.name = 'Obigo ' + match[1];\n                    this.browser.version = new Version({\n                        value: match[2]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      UC Web\n             */\n\n            if (ua.match('UCWEB')) {\n                this.browser.stock = false;\n                this.browser.name = 'UC Browser';\n\n                if (match = /UCWEB([0-9]*[.][0-9]*)/.exec(ua)) {\n                    this.browser.version = new Version({\n                        value: match[1],\n                        details: 3\n                    });\n                }\n\n                if (this.os.name === 'Linux') {\n                    this.os.name = '';\n                }\n\n                this.device.type = 'mobile';\n\n                if (match = /^IUC \\(U;\\s?iOS ([0-9\\.]+);/.exec(ua)) {\n                    this.os.name = 'iOS';\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n                }\n\n                if (match = /^JUC \\(Linux; U; ([0-9\\.]+)[^;]*; [^;]+; ([^;]*[^\\s])\\s*; [0-9]+\\*[0-9]+\\)/.exec(ua)) {\n                    var model = cleanupModel(match[2]);\n\n                    this.os.name = 'Android';\n                    this.os.version = new Version({\n                        value: match[1]\n                    });\n\n                    if (typeof ANDROID_MODELS[model] !== 'undefined') {\n                        this.device.manufacturer = ANDROID_MODELS[model][0];\n                        this.device.model = ANDROID_MODELS[model][1];\n                        if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n                        this.device.identified = true;\n                    }\n                }\n            }\n\n            if (ua.match(/\\) UC /)) {\n                this.browser.stock = false;\n                this.browser.name = 'UC Browser';\n            }\n\n            if (match = /UCBrowser\\/([0-9.]*)/.exec(ua)) {\n                this.browser.stock = false;\n                this.browser.name = 'UC Browser';\n                this.browser.version = new Version({\n                    value: match[1],\n                    details: 2\n                });\n            }\n\n            /****************************************************\n             *      NineSky\n             */\n\n            if (match = /Ninesky(?:-android-mobile(?:-cn)?)?\\/([0-9.]*)/.exec(ua)) {\n                this.browser.name = 'NineSky';\n                this.browser.version = new Version({\n                    value: match[1]\n                });\n\n                if (this.os.name !== 'Android') {\n                    this.os.name = 'Android';\n                    this.os.version = null;\n\n                    this.device.manufacturer = null;\n                    this.device.model = null;\n                }\n            }\n\n            /****************************************************\n             *      Skyfire\n             */\n\n            if (match = /Skyfire\\/([0-9.]*)/.exec(ua)) {\n                this.browser.name = 'Skyfire';\n                this.browser.version = new Version({\n                    value: match[1]\n                });\n\n                this.device.type = 'mobile';\n\n                this.os.name = 'Android';\n                this.os.version = null;\n            }\n\n            /****************************************************\n             *      Dolphin HD\n             */\n\n            if (match = /DolphinHDCN\\/([0-9.]*)/.exec(ua)) {\n                this.browser.name = 'Dolphin';\n                this.browser.version = new Version({\n                    value: match[1]\n                });\n\n                this.device.type = 'mobile';\n\n                if (this.os.name !== 'Android') {\n                    this.os.name = 'Android';\n                    this.os.version = null;\n                }\n            }\n\n            if (match = /Dolphin\\/INT/.exec(ua)) {\n                this.browser.name = 'Dolphin';\n                this.device.type = 'mobile';\n            }\n\n            /****************************************************\n             *      QQ Browser\n             */\n\n            if (match = /(M?QQBrowser)\\/([0-9.]*)/.exec(ua)) {\n                this.browser.name = 'QQ Browser';\n\n                var version = match[2];\n                if (version.match(/^[0-9][0-9]$/)) version = version[0] + '.' + version[1];\n\n                this.browser.version = new Version({\n                    value: version,\n                    details: 2\n                });\n                this.browser.channel = ''\n\n                if (!this.os.name && match[1] === 'QQBrowser') {\n                    this.os.name = 'Windows';\n                }\n            }\n\n            /****************************************************\n             *      iBrowser\n             */\n\n            if (match = /(iBrowser)\\/([0-9.]*)/.exec(ua)) {\n                this.browser.name = 'iBrowser';\n\n                var version = match[2];\n                if (version.match(/[0-9][0-9]/)) version = version[0] + '.' + version[1];\n\n                this.browser.version = new Version({\n                    value: version,\n                    details: 2\n                });\n                this.browser.channel = ''\n            }\n\n            /****************************************************\n             *      Puffin\n             */\n\n            if (match = /Puffin\\/([0-9.]*)/.exec(ua)) {\n                this.browser.name = 'Puffin';\n                this.browser.version = new Version({\n                    value: match[1],\n                    details: 2\n                });\n\n                this.device.type = 'mobile';\n\n                if (this.os.name === 'Linux') {\n                    this.os.name = null;\n                    this.os.version = null;\n                }\n            }\n\n            /****************************************************\n             *      360 Extreme Explorer\n             */\n\n            if (ua.match('360EE')) {\n                this.browser.stock = false;\n                this.browser.name = '360 Extreme Explorer';\n                this.browser.version = null;\n            }\n\n            /****************************************************\n             *      Midori\n             */\n\n            if (match = /Midori\\/([0-9.]*)/.exec(ua)) {\n                this.browser.name = 'Midori';\n                this.browser.version = new Version({\n                    value: match[1]\n                });\n\n                if (this.os.name !== 'Linux') {\n                    this.os.name = 'Linux';\n                    this.os.version = null;\n                }\n\n                this.device.manufacturer = null;\n                this.device.model = null;\n                this.device.type = 'desktop';\n            }\n\n            /****************************************************\n             *      Others\n             */\n\n            var browsers = [{\n                name: 'AdobeAIR',\n                regexp: /AdobeAIR\\/([0-9.]*)/\n            }, {\n                name: 'Awesomium',\n                regexp: /Awesomium\\/([0-9.]*)/\n            }, {\n                name: 'Canvace',\n                regexp: /Canvace Standalone\\/([0-9.]*)/\n            }, {\n                name: 'Ekioh',\n                regexp: /Ekioh\\/([0-9.]*)/\n            }, {\n                name: 'JavaFX',\n                regexp: /JavaFX\\/([0-9.]*)/\n            }, {\n                name: 'GFXe',\n                regexp: /GFXe\\/([0-9.]*)/\n            }, {\n                name: 'LuaKit',\n                regexp: /luakit/\n            }, {\n                name: 'Titanium',\n                regexp: /Titanium\\/([0-9.]*)/\n            }, {\n                name: 'OpenWebKitSharp',\n                regexp: /OpenWebKitSharp/\n            }, {\n                name: 'Prism',\n                regexp: /Prism\\/([0-9.]*)/\n            }, {\n                name: 'Qt',\n                regexp: /Qt\\/([0-9.]*)/\n            }, {\n                name: 'QtEmbedded',\n                regexp: /QtEmbedded/\n            }, {\n                name: 'QtEmbedded',\n                regexp: /QtEmbedded.*Qt\\/([0-9.]*)/\n            }, {\n                name: 'RhoSimulator',\n                regexp: /RhoSimulator/\n            }, {\n                name: 'UWebKit',\n                regexp: /UWebKit\\/([0-9.]*)/\n            },\n\n            {\n                name: 'PhantomJS',\n                regexp: /PhantomJS\\/([0-9.]*)/\n            }, {\n                name: 'Google Web Preview',\n                regexp: /Google Web Preview/\n            },\n\n            {\n                name: 'Google Earth',\n                regexp: /Google Earth\\/([0-9.]*)/\n            }, {\n                name: 'EA Origin',\n                regexp: /Origin\\/([0-9.]*)/\n            }, {\n                name: 'SecondLife',\n                regexp: /SecondLife\\/([0-9.]*)/\n            }, {\n                name: 'Valve Steam',\n                regexp: /Valve Steam/\n            },\n\n            {\n                name: 'Songbird',\n                regexp: /Songbird\\/([0-9.]*)/\n            }, {\n                name: 'Thunderbird',\n                regexp: /Thunderbird\\/([0-9.]*)/\n            },\n\n            {\n                name: 'Abrowser',\n                regexp: /Abrowser\\/([0-9.]*)/\n            }, {\n                name: 'arora',\n                regexp: /[Aa]rora\\/([0-9.]*)/\n            }, {\n                name: 'Baidu Browser',\n                regexp: /M?BaiduBrowser\\/([0-9.]*)/i\n            }, {\n                name: 'Camino',\n                regexp: /Camino\\/([0-9.]*)/\n            }, {\n                name: 'Canure',\n                regexp: /Canure\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'CometBird',\n                regexp: /CometBird\\/([0-9.]*)/\n            }, {\n                name: 'Comodo Dragon',\n                regexp: /Comodo_Dragon\\/([0-9.]*)/,\n                details: 2\n            }, {\n                name: 'Conkeror',\n                regexp: /[Cc]onkeror\\/([0-9.]*)/\n            }, {\n                name: 'CoolNovo',\n                regexp: /(?:CoolNovo|CoolNovoChromePlus)\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'ChromePlus',\n                regexp: /ChromePlus(?:\\/([0-9.]*))?$/,\n                details: 3\n            }, {\n                name: 'Daedalus',\n                regexp: /Daedalus ([0-9.]*)/,\n                details: 2\n            }, {\n                name: 'Demobrowser',\n                regexp: /demobrowser\\/([0-9.]*)/\n            }, {\n                name: 'Dooble',\n                regexp: /Dooble(?:\\/([0-9.]*))?/\n            }, {\n                name: 'DWB',\n                regexp: /dwb(?:-hg)?(?:\\/([0-9.]*))?/\n            }, {\n                name: 'Epiphany',\n                regexp: /Epiphany\\/([0-9.]*)/\n            }, {\n                name: 'FireWeb',\n                regexp: /FireWeb\\/([0-9.]*)/\n            }, {\n                name: 'Flock',\n                regexp: /Flock\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'Galeon',\n                regexp: /Galeon\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'Helium',\n                regexp: /HeliumMobileBrowser\\/([0-9.]*)/\n            }, {\n                name: 'iCab',\n                regexp: /iCab\\/([0-9.]*)/\n            }, {\n                name: 'Iceape',\n                regexp: /Iceape\\/([0-9.]*)/\n            }, {\n                name: 'IceCat',\n                regexp: /IceCat ([0-9.]*)/\n            }, {\n                name: 'Iceweasel',\n                regexp: /Iceweasel\\/([0-9.]*)/\n            }, {\n                name: 'InternetSurfboard',\n                regexp: /InternetSurfboard\\/([0-9.]*)/\n            }, {\n                name: 'Iron',\n                regexp: /Iron\\/([0-9.]*)/,\n                details: 2\n            }, {\n                name: 'Isis',\n                regexp: /BrowserServer/\n            }, {\n                name: 'Jumanji',\n                regexp: /jumanji/\n            }, {\n                name: 'Kazehakase',\n                regexp: /Kazehakase\\/([0-9.]*)/\n            }, {\n                name: 'KChrome',\n                regexp: /KChrome\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'K-Meleon',\n                regexp: /K-Meleon\\/([0-9.]*)/\n            }, {\n                name: 'Leechcraft',\n                regexp: /Leechcraft(?:\\/([0-9.]*))?/,\n                details: 2\n            }, {\n                name: 'Lightning',\n                regexp: /Lightning\\/([0-9.]*)/\n            }, {\n                name: 'Lunascape',\n                regexp: /Lunascape[\\/| ]([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'iLunascape',\n                regexp: /iLunascape\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'Maxthon',\n                regexp: /Maxthon[\\/ ]([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'MiniBrowser',\n                regexp: /MiniBr?owserM\\/([0-9.]*)/\n            }, {\n                name: 'MiniBrowser',\n                regexp: /MiniBrowserMobile\\/([0-9.]*)/\n            }, {\n                name: 'MixShark',\n                regexp: /MixShark\\/([0-9.]*)/\n            }, {\n                name: 'Motorola WebKit',\n                regexp: /MotorolaWebKit\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'NetFront LifeBrowser',\n                regexp: /NetFrontLifeBrowser\\/([0-9.]*)/\n            }, {\n                name: 'Netscape Navigator',\n                regexp: /Navigator\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'Odyssey',\n                regexp: /OWB\\/([0-9.]*)/\n            }, {\n                name: 'OmniWeb',\n                regexp: /OmniWeb/\n            }, {\n                name: 'Orca',\n                regexp: /Orca\\/([0-9.]*)/\n            }, {\n                name: 'Origyn',\n                regexp: /Origyn Web Browser/\n            }, {\n                name: 'Palemoon',\n                regexp: /Pale[mM]oon\\/([0-9.]*)/\n            }, {\n                name: 'Phantom',\n                regexp: /Phantom\\/V([0-9.]*)/\n            }, {\n                name: 'Polaris',\n                regexp: /Polaris\\/v?([0-9.]*)/i,\n                details: 2\n            }, {\n                name: 'QtCreator',\n                regexp: /QtCreator\\/([0-9.]*)/\n            }, {\n                name: 'QtQmlViewer',\n                regexp: /QtQmlViewer/\n            }, {\n                name: 'QtTestBrowser',\n                regexp: /QtTestBrowser\\/([0-9.]*)/\n            }, {\n                name: 'QtWeb',\n                regexp: /QtWeb Internet Browser\\/([0-9.]*)/\n            }, {\n                name: 'QupZilla',\n                regexp: /QupZilla\\/([0-9.]*)/\n            }, {\n                name: 'Roccat',\n                regexp: /Roccat\\/([0-9]\\.[0-9.]*)/\n            }, {\n                name: 'Raven for Mac',\n                regexp: /Raven for Mac\\/([0-9.]*)/\n            }, {\n                name: 'rekonq',\n                regexp: /rekonq/\n            }, {\n                name: 'RockMelt',\n                regexp: /RockMelt\\/([0-9.]*)/,\n                details: 2\n            }, {\n                name: 'Sleipnir',\n                regexp: /Sleipnir\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'SMBrowser',\n                regexp: /SMBrowser/\n            }, {\n                name: 'Sogou Explorer',\n                regexp: /SE 2.X MetaSr/\n            }, {\n                name: 'Snowshoe',\n                regexp: /Snowshoe\\/([0-9.]*)/,\n                details: 2\n            }, {\n                name: 'Sputnik',\n                regexp: /Sputnik\\/([0-9.]*)/i,\n                details: 3\n            }, {\n                name: 'Stainless',\n                regexp: /Stainless\\/([0-9.]*)/\n            }, {\n                name: 'SunChrome',\n                regexp: /SunChrome\\/([0-9.]*)/\n            }, {\n                name: 'Surf',\n                regexp: /Surf\\/([0-9.]*)/\n            }, {\n                name: 'TaoBrowser',\n                regexp: /TaoBrowser\\/([0-9.]*)/,\n                details: 2\n            }, {\n                name: 'TaomeeBrowser',\n                regexp: /TaomeeBrowser\\/([0-9.]*)/,\n                details: 2\n            }, {\n                name: 'TazWeb',\n                regexp: /TazWeb/\n            }, {\n                name: 'Viera',\n                regexp: /Viera\\/([0-9.]*)/\n            }, {\n                name: 'Villanova',\n                regexp: /Villanova\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'Wavelink Velocity',\n                regexp: /Wavelink Velocity Browser\\/([0-9.]*)/,\n                details: 2\n            }, {\n                name: 'WebPositive',\n                regexp: /WebPositive/\n            }, {\n                name: 'WebRender',\n                regexp: /WebRender/\n            }, {\n                name: 'Wyzo',\n                regexp: /Wyzo\\/([0-9.]*)/,\n                details: 3\n            }, {\n                name: 'Zetakey',\n                regexp: /Zetakey Webkit\\/([0-9.]*)/\n            }, {\n                name: 'Zetakey',\n                regexp: /Zetakey\\/([0-9.]*)/\n            }]\n\n            for (var b = 0; b < browsers.length; b++) {\n                if (match = browsers[b].regexp.exec(ua)) {\n                    this.browser.name = browsers[b].name;\n                    this.browser.channel = '';\n                    this.browser.stock = false;\n\n                    if (match[1]) {\n                        this.browser.version = new Version({\n                            value: match[1],\n                            details: browsers[b].details || null\n                        });\n                    } else {\n                        this.browser.version = null;\n                    }\n                }\n            }\n\n\n\n            /****************************************************\n             *      WebKit\n             */\n\n            if (match = /WebKit\\/([0-9.]*)/i.exec(ua)) {\n                this.engine.name = 'Webkit';\n                this.engine.version = new Version({\n                    value: match[1]\n                });\n            }\n\n            if (match = /Browser\\/AppleWebKit([0-9.]*)/i.exec(ua)) {\n                this.engine.name = 'Webkit';\n                this.engine.version = new Version({\n                    value: match[1]\n                });\n            }\n\n            /****************************************************\n             *      KHTML\n             */\n\n            if (match = /KHTML\\/([0-9.]*)/.exec(ua)) {\n                this.engine.name = 'KHTML';\n                this.engine.version = new Version({\n                    value: match[1]\n                });\n            }\n\n            /****************************************************\n             *      Gecko\n             */\n\n            if (/Gecko/.exec(ua) && !/like Gecko/i.exec(ua)) {\n                this.engine.name = 'Gecko';\n\n                if (match = /; rv:([^\\)]+)\\)/.exec(ua)) {\n                    this.engine.version = new Version({\n                        value: match[1]\n                    });\n                }\n            }\n\n            /****************************************************\n             *      Presto\n             */\n\n            if (match = /Presto\\/([0-9.]*)/.exec(ua)) {\n                this.engine.name = 'Presto';\n                this.engine.version = new Version({\n                    value: match[1]\n                });\n            }\n\n            /****************************************************\n             *      Trident\n             */\n\n            if (match = /Trident\\/([0-9.]*)/.exec(ua)) {\n                this.engine.name = 'Trident';\n                this.engine.version = new Version({\n                    value: match[1]\n                });\n\n                if (this.browser.name === 'Internet Explorer') {\n                    if (parseVersion(this.engine.version) === 6 && parseFloat(this.browser.version) < 10) {\n                        this.browser.version = new Version({\n                            value: '10.0'\n                        });\n                        this.browser.mode = 'compat';\n                    }\n\n                    if (parseVersion(this.engine.version) === 5 && parseFloat(this.browser.version) < 9) {\n                        this.browser.version = new Version({\n                            value: '9.0'\n                        });\n                        this.browser.mode = 'compat';\n                    }\n\n                    if (parseVersion(this.engine.version) === 4 && parseFloat(this.browser.version) < 8) {\n                        this.browser.version = new Version({\n                            value: '8.0'\n                        });\n                        this.browser.mode = 'compat';\n                    }\n                }\n\n                if (this.os.name === 'Windows Phone') {\n                    if (parseVersion(this.engine.version) === 5 && parseFloat(this.os.version) < 7.5) {\n                        this.os.version = new Version({\n                            value: '7.5'\n                        });\n                    }\n                }\n            }\n\n\n            /****************************************************\n             *      Corrections\n             */\n\n            if (this.os.name === 'Android' && this.browser.stock) {\n                this.browser.hidden = true;\n            }\n\n            if (this.os.name === 'iOS' && this.browser.name === 'Opera Mini') {\n                this.os.version = null;\n            }\n\n            if (this.browser.name === 'Midori' && this.engine.name !== 'Webkit') {\n                this.engine.name = 'Webkit';\n                this.engine.version = null;\n            }\n\n            if (this.device.type === 'television' && this.browser.name === 'Opera') {\n                this.browser.name = 'Opera Devices';\n                switch (true) {\n                    case this.engine.version.is('2.10'):\n                        this.browser.version = new Version({\n                            value: 3.2\n                        });\n                        break;\n                    case this.engine.version.is('2.9'):\n                        this.browser.version = new Version({\n                            value: 3.1\n                        });\n                        break;\n                    case this.engine.version.is('2.8'):\n                        this.browser.version = new Version({\n                            value: 3.0\n                        });\n                        break;\n                    case this.engine.version.is('2.7'):\n                        this.browser.version = new Version({\n                            value: 2.9\n                        });\n                        break;\n                    case this.engine.version.is('2.6'):\n                        this.browser.version = new Version({\n                            value: 2.8\n                        });\n                        break;\n                    case this.engine.version.is('2.4'):\n                        this.browser.version = new Version({\n                            value: 10.3\n                        });\n                        break;\n                    case this.engine.version.is('2.3'):\n                        this.browser.version = new Version({\n                            value: 10\n                        });\n                        break;\n                    case this.engine.version.is('2.2'):\n                        this.browser.version = new Version({\n                            value: 9.7\n                        });\n                        break;\n                    case this.engine.version.is('2.1'):\n                        this.browser.version = new Version({\n                            value: 9.6\n                        });\n                        break;\n                    default:\n                        this.browser.version = null;\n                }\n\n                this.os.name = null;\n                this.os.version = null;\n            }\n\n\n            /****************************************************\n             *      Camouflage\n             */\n\n            if (this.options.detectCamouflage) {\n\n                if (match = /Mac OS X 10_6_3; ([^;]+); [a-z]{2}-(?:[a-z]{2})?\\)/.exec(ua)) {\n                    this.browser.name = '';\n                    this.browser.version = null;\n                    this.browser.mode = 'desktop';\n\n                    this.os.name = 'Android';\n                    this.os.version = null;\n\n                    this.engine.name = 'Webkit';\n                    this.engine.version = null;\n\n                    this.device.model = match[1];\n                    this.device.type = 'mobile';\n\n                    var model = cleanupModel(this.device.model);\n                    if (typeof ANDROID_MODELS[model] !== 'undefined') {\n                        this.device.manufacturer = ANDROID_MODELS[model][0];\n                        this.device.model = ANDROID_MODELS[model][1];\n                        if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n                        this.device.identified = true;\n                    }\n\n                    this.features.push('foundDevice');\n                }\n\n                if (match = /Linux Ventana; [a-z]{2}-[a-z]{2}; (.+) Build/.exec(ua)) {\n                    this.browser.name = '';\n                    this.browser.version = null;\n                    this.browser.mode = 'desktop';\n\n                    this.os.name = 'Android';\n                    this.os.version = null;\n\n                    this.engine.name = 'Webkit';\n                    this.engine.version = null;\n\n                    this.device.model = match[1];\n                    this.device.type = 'mobile';\n\n                    var model = cleanupModel(this.device.model);\n                    if (typeof ANDROID_MODELS[model] !== 'undefined') {\n                        this.device.manufacturer = ANDROID_MODELS[model][0];\n                        this.device.model = ANDROID_MODELS[model][1];\n                        if (typeof ANDROID_MODELS[model][2] !== 'undefined') this.device.type = ANDROID_MODELS[model][2];\n                        this.device.identified = true;\n                    }\n\n                    this.features.push('foundDevice');\n                }\n\n                if (this.browser.name === 'Safari') {\n                    if (this.os.name !== 'iOS' && /AppleWebKit\\/([0-9]+.[0-9]+)/i.exec(ua)[1] !== /Safari\\/([0-9]+.[0-9]+)/i.exec(ua)[1]) {\n                        this.features.push('safariMismatch');\n                        this.camouflage = true;\n                    }\n\n                    if (this.os.name === 'iOS' && !ua.match(/^Mozilla/)) {\n                        this.features.push('noMozillaPrefix');\n                        this.camouflage = true;\n                    }\n\n                    if (!/Version\\/[0-9\\.]+/.exec(ua)) {\n                        this.features.push('noVersion');\n                        this.camouflage = true;\n                    }\n                }\n\n                if (this.browser.name === 'Chrome') {\n                    if (!/(?:Chrome|CrMo|CriOS)\\/([0-9]{1,2}\\.[0-9]\\.[0-9]{3,4}\\.[0-9]+)/.exec(ua)) {\n                        this.features.push('wrongVersion');\n                        this.camouflage = true;\n                    }\n                }\n\n\n                if (this.options.useFeatures) {\n                    /* If it claims not to be Trident, but it is probably Trident running camouflage mode */\n                    if (window.ActiveXObject) {\n                        this.features.push('trident');\n\n                        if (typeof this.engine.name !== 'undefined' && this.engine.name !== 'Trident') {\n                            this.camouflage = typeof this.browser.name === 'undefined' || this.browser.name !== 'Maxthon';\n                        }\n                    }\n\n                    /* If it claims not to be Opera, but it is probably Opera running camouflage mode */\n                    if (window.opera) {\n                        this.features.push('presto');\n\n                        if (typeof this.engine.name !== 'undefined' && this.engine.name !== 'Presto') {\n                            this.camouflage = true;\n                        }\n\n                        if (this.browser.name === 'Internet Explorer') {\n                            this.camouflage = true;\n                        }\n                    }\n\n                    /* If it claims not to be Gecko, but it is probably Gecko running camouflage mode */\n                    if ('getBoxObjectFor' in document || 'mozInnerScreenX' in window) {\n                        this.features.push('gecko');\n\n                        if (typeof this.engine.name !== 'undefined' && this.engine.name !== 'Gecko') {\n                            this.camouflage = true;\n                        }\n\n                        if (this.browser.name === 'Internet Explorer') {\n                            this.camouflage = true;\n                        }\n                    }\n\n                    /* If it claims not to be Webkit, but it is probably Webkit running camouflage mode */\n                    if ('WebKitCSSMatrix' in window || 'WebKitPoint' in window || 'webkitStorageInfo' in window || 'webkitURL' in window) {\n                        this.features.push('webkit');\n\n                        if (typeof this.engine.name !== 'undefined' && this.engine.name !== 'Webkit') {\n                            this.camouflage = true;\n                        }\n\n                        if (this.browser.name === 'Internet Explorer') {\n                            this.camouflage = true;\n                        }\n                    }\n\n\n\n                    /* If it claims to be Safari and uses V8, it is probably an Android device running camouflage mode */\n                    if (this.engine.name === 'Webkit' && ({}.toString).toString().indexOf('\\n') === -1) {\n                        this.features.push('v8');\n\n                        if (this.browser !== null && this.browser.name === 'Safari') {\n                            this.camouflage = true;\n                        }\n                    }\n\n\n\n                    /* If we have an iPad that is not 768 x 1024, we have an imposter */\n                    if (this.device.model === 'iPad') {\n                        if ((screen.width !== 0 && screen.height !== 0) && (screen.width !== 768 && screen.height !== 1024) && (screen.width !== 1024 && screen.height !== 768)) {\n                            this.features.push('sizeMismatch');\n                            this.camouflage = true;\n                        }\n                    }\n\n                    /* If we have an iPhone or iPod that is not 320 x 480, we have an imposter */\n                    if (this.device.model === 'iPhone' || this.device.model === 'iPod') {\n                        if ((screen.width !== 0 && screen.height !== 0) && (screen.width !== 320 && screen.height !== 480) && (screen.width !== 480 && screen.height !== 320)) {\n                            this.features.push('sizeMismatch');\n                            this.camouflage = true;\n                        }\n                    }\n\n\n                    if (this.os.name === 'iOS' && this.os.version) {\n\n                        if (this.os.version.isOlder('4.0') && 'sandbox' in document.createElement('iframe')) {\n                            this.features.push('foundSandbox');\n                            this.camouflage = true;\n                        }\n\n                        if (this.os.version.isOlder('4.2') && 'WebSocket' in window) {\n                            this.features.push('foundSockets');\n                            this.camouflage = true;\n                        }\n\n                        if (this.os.version.isOlder('5.0') && !! window.Worker) {\n                            this.features.push('foundWorker');\n                            this.camouflage = true;\n                        }\n\n                        if (this.os.version.isNewer('2.1') && !window.applicationCache) {\n                            this.features.push('noAppCache');\n                            this.camouflage = true;\n                        }\n                    }\n\n                    if (this.os.name !== 'iOS' && this.browser.name === 'Safari' && this.browser.version) {\n\n                        if (this.browser.version.isOlder('4.0') && !! window.applicationCache) {\n                            this.features.push('foundAppCache');\n                            this.camouflage = true;\n                        }\n\n                        if (this.browser.version.isOlder('4.1') && !! (window.history && history.pushState)) {\n                            this.features.push('foundHistory');\n                            this.camouflage = true;\n                        }\n\n                        if (this.browser.version.isOlder('5.1') && !! document.documentElement.webkitRequestFullScreen) {\n                            this.features.push('foundFullscreen');\n                            this.camouflage = true;\n                        }\n\n                        if (this.browser.version.isOlder('5.2') && 'FileReader' in window) {\n                            this.features.push('foundFileReader');\n                            this.camouflage = true;\n                        }\n                    }\n                }\n            }\n        }\n    };\n\n    function cleanupModel(s) {\n        s = typeof s === 'undefined' ? '' : s;\n\n        s = s.replace(/_TD$/, '');\n        s = s.replace(/_CMCC$/, '');\n\n        s = s.replace(/_/g, ' ');\n        s = s.replace(/^\\s+|\\s+$/g, '');\n        s = s.replace(/\\/[^/]+$/, '');\n        s = s.replace(/\\/[^/]+ Android\\/.*/, '');\n\n        s = s.replace(/^tita on /, '');\n        s = s.replace(/^Android on /, '');\n        s = s.replace(/^Android for /, '');\n        s = s.replace(/^ICS AOSP on /, '');\n        s = s.replace(/^Full AOSP on /, '');\n        s = s.replace(/^Full Android on /, '');\n        s = s.replace(/^Full Cappuccino on /, '');\n        s = s.replace(/^Full MIPS Android on /, '');\n        s = s.replace(/^Full Android/, '');\n\n        s = s.replace(/^Acer ?/i, '');\n        s = s.replace(/^Iconia /, '');\n        s = s.replace(/^Ainol /, '');\n        s = s.replace(/^Coolpad ?/i, 'Coolpad ');\n        s = s.replace(/^ALCATEL /, '');\n        s = s.replace(/^Alcatel OT-(.*)/, 'one touch $1');\n        s = s.replace(/^YL-/, '');\n        s = s.replace(/^Novo7 ?/i, 'Novo7 ');\n        s = s.replace(/^GIONEE /, '');\n        s = s.replace(/^HW-/, '');\n        s = s.replace(/^Huawei[ -]/i, 'Huawei ');\n        s = s.replace(/^SAMSUNG[ -]/i, '');\n        s = s.replace(/^SonyEricsson/, '');\n        s = s.replace(/^Lenovo Lenovo/, 'Lenovo');\n        s = s.replace(/^LNV-Lenovo/, 'Lenovo');\n        s = s.replace(/^Lenovo-/, 'Lenovo ');\n        s = s.replace(/^(LG)[ _\\/]/, '$1-');\n        s = s.replace(/^(HTC.*)\\s(?:v|V)?[0-9.]+$/, '$1');\n        s = s.replace(/^(HTC)[-\\/]/, '$1 ');\n        s = s.replace(/^(HTC)([A-Z][0-9][0-9][0-9])/, '$1 $2');\n        s = s.replace(/^(Motorola[\\s|-])/, '')\n        s = s.replace(/^(Moto|MOT-)/, '')\n\n        s = s.replace(/-?(orange(-ls)?|vodafone|bouygues)$/i, '');\n        s = s.replace(/http:\\/\\/.+$/i, '');\n\n        s = s.replace(/^\\s+|\\s+$/g, '');\n\n        return s;\n    }\n\n    function parseVersion(version) {\n        version = version.toString();\n        var components = version.split('.');\n        var major = components.shift();\n        return parseFloat(major + '.' + components.join(''));\n    }\n\n    return Detected;\n\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3VhLWRldmljZUAwLjEuMTBAdWEtZGV2aWNlL2xpYi91c2VyYWdlbnQtYmFzZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdWEtZGV2aWNlQDAuMS4xMEB1YS1kZXZpY2UvbGliL3VzZXJhZ2VudC1iYXNlLmpzPzA1ZDkiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBTVFJJTkdTX1NBTVNVTkcgPSAnU2Ftc3VuZycsXG4gICAgICAgIFNUUklOR1NfU0hBUlAgPSAnU2hhcnAnLFxuICAgICAgICBTVFJJTkdTX1NPTllfRVJJQ1NTT04gPSAnU29ueSBFcmljc3NvbicsXG4gICAgICAgIFNUUklOR1NfTU9UT1JPTEEgPSAnTW90b3JvbGEnLFxuICAgICAgICBTVFJJTkdTX0xHID0gJ0xHJyxcbiAgICAgICAgU1RSSU5HU19IVUFXRUkgPSAnSHVhd2VpJyxcbiAgICAgICAgU1RSSU5HU19IVEMgPSAnSFRDJyxcbiAgICAgICAgU1RSSU5HU19DT09MUEFEID0gJ0Nvb2xwYWQnLFxuICAgICAgICBTVFJJTkdTX0FTVVMgPSAnQXN1cycsXG4gICAgICAgIFNUUklOR1NfQUNFUiA9ICdBY2VyJztcbiAgICB2YXIgU1RSSU5HU19CQVNFRCA9ICcgYmFzZWQgZGV2aWNlJztcblxuICAgIHZhciBUT1VDSFdJWl9NT0RFTFMgPSB7XG4gICAgICAgICdTQU1TVU5HJzoge1xuICAgICAgICAgICAgJ0dULVMzMzcwQyc6IFtTVFJJTkdTX1NBTVNVTkcsICdDb3JieSAzRyddLFxuICAgICAgICAgICAgJ0dULVMzNjUwJzogW1NUUklOR1NfU0FNU1VORywgJ0NvcmJ5J10sXG4gICAgICAgICAgICAnR1QtUzM2NTMnOiBbU1RSSU5HU19TQU1TVU5HLCAnQ29yYnknXSxcbiAgICAgICAgICAgICdHVC1TMzg1MCc6IFtTVFJJTkdTX1NBTVNVTkcsICdDb3JieSBJSSddLFxuICAgICAgICAgICAgJ0dULVM1MjMwJzogW1NUUklOR1NfU0FNU1VORywgJ1N0YXInXSxcbiAgICAgICAgICAgICdHVC1TNTIzMFcnOiBbU1RSSU5HU19TQU1TVU5HLCAnU3RhciddLFxuICAgICAgICAgICAgJ0dULVM1MjMzJzogW1NUUklOR1NfU0FNU1VORywgJ1N0YXInXSxcbiAgICAgICAgICAgICdHVC1TNTI2MCc6IFtTVFJJTkdTX1NBTVNVTkcsICdTdGFyIElJJ10sXG4gICAgICAgICAgICAnR1QtUzU1NjAnOiBbU1RSSU5HU19TQU1TVU5HLCAnTWFydmVsJ10sXG4gICAgICAgICAgICAnR1QtUzU2MjAnOiBbU1RSSU5HU19TQU1TVU5HLCAnTW9udGUnXSxcbiAgICAgICAgICAgICdHVC1TNzU1MCc6IFtTVFJJTkdTX1NBTVNVTkcsICdCbHVlIEVhcnRoJ10sXG4gICAgICAgICAgICAnR1QtUzgwMDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnSmV0J10sXG4gICAgICAgICAgICAnR1QtUzgwMDMnOiBbU1RSSU5HU19TQU1TVU5HLCAnSmV0J10sXG4gICAgICAgICAgICAnU0dILUY0ODAnOiBbU1RSSU5HU19TQU1TVU5HLCAnVG9jY28nXSxcbiAgICAgICAgICAgICdTR0gtVDUyOGcnOiBbU1RSSU5HU19TQU1TVU5HLCAnU3RyYWlnaHQgVGFsayddLFxuICAgICAgICAgICAgJ0dULUIzNDEwJzogW1NUUklOR1NfU0FNU1VORywgJ1N0YXIgUXdlcnR5J10sXG4gICAgICAgICAgICAnR1QtQjUzMTAnOiBbU1RSSU5HU19TQU1TVU5HLCAnQ29yYnkgUHJvJ10sXG4gICAgICAgICAgICAnR1QtQjc3MjInOiBbU1RSSU5HU19TQU1TVU5HLCAnU3RhciBEdW9zJ10sXG4gICAgICAgICAgICAnR1QtQzY3MTInOiBbU1RSSU5HU19TQU1TVU5HLCAnU3RhciBJSSBEdW9zJ11cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBCQURBX01PREVMUyA9IHtcbiAgICAgICAgJ1NBTVNVTkcnOiB7XG4gICAgICAgICAgICAnR1QtIFM1MjUwJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUgNTI1J10sXG4gICAgICAgICAgICAnR1QtUzUyNTAnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA1MjUnXSxcbiAgICAgICAgICAgICdHVC1TNTI1Myc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIDUyNSddLFxuICAgICAgICAgICAgJ0dULVM1MzMwJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUgNTMzJ10sXG4gICAgICAgICAgICAnR1QtUzUzODAnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSBZJ10sXG4gICAgICAgICAgICAnR1QtUzUzODBEJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUgWSddLFxuICAgICAgICAgICAgJ0dULVM1MzgwSyc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIFknXSxcbiAgICAgICAgICAgICdHVC1TNTc1MEUnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA1NzUnXSxcbiAgICAgICAgICAgICdHVC1TNTc1M0UnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA1NzUnXSxcbiAgICAgICAgICAgICdHVC1TNzIzMEInOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA3MjMnXSxcbiAgICAgICAgICAgICdHVC1TNzIzMEUnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA3MjMnXSxcbiAgICAgICAgICAgICdHVC1TNzIzM0UnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSA3MjMnXSxcbiAgICAgICAgICAgICdHVC1TNzI1MCc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIE0nXSxcbiAgICAgICAgICAgICdHVC1TNzI1MEQnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSBNJ10sXG4gICAgICAgICAgICAnR1QtUzg1MDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSddLFxuICAgICAgICAgICAgJ0dULVM4NTAwQyc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlJ10sXG4gICAgICAgICAgICAnR1QtUzg1MDBSJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUnXSxcbiAgICAgICAgICAgICdHVC1TODUwMFQnOiBbU1RSSU5HU19TQU1TVU5HLCAnV2F2ZSddLFxuICAgICAgICAgICAgJ0dULVM4NTMwJzogW1NUUklOR1NfU0FNU1VORywgJ1dhdmUgSUknXSxcbiAgICAgICAgICAgICdHVC1TODYwMCc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIDMnXSxcbiAgICAgICAgICAgICdTSFctTTQxMCc6IFtTVFJJTkdTX1NBTVNVTkcsICdXYXZlIDMnXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIFRJWkVOX01PREVMUyA9IHtcbiAgICAgICAgJ1NBTVNVTkcnOiB7XG4gICAgICAgICAgICAnR1QtSTk1MDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnR1QtSTk1MDAnXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIEJSRVdfTU9ERUxTID0ge1xuICAgICAgICAnQ29vbHBhZCBENTA4JzogW1NUUklOR1NfQ09PTFBBRCwgJ0Q1MDgnXSxcbiAgICAgICAgJ0Nvb2xwYWQgRTYwMCc6IFtTVFJJTkdTX0NPT0xQQUQsICdFNjAwJ10sXG4gICAgICAgICdTQ0gtRjgzOSc6IFtTVFJJTkdTX1NBTVNVTkcsICdTQ0gtRjgzOSddXG4gICAgfVxuXG4gICAgdmFyIFdJTkRPV1NfTU9CSUxFX01PREVMUyA9IHtcbiAgICAgICAgJ0RYOTAwJzogW1NUUklOR1NfQUNFUiwgJ1RlbXBvIERYOTAwJ10sXG4gICAgICAgICdGOTAwJzogW1NUUklOR1NfQUNFUiwgJ1RlbXBvIEY5MDAnXSxcbiAgICAgICAgJ0Nvb2xwYWQgRjgwMCc6IFtTVFJJTkdTX0NPT0xQQUQsICdGODAwJ10sXG4gICAgICAgICdnYXJtaW4tYXN1cy1OdXZpZm9uZS1NMTAnOiBbJ0dhcm1pbi1Bc3VzJywgJ051dmlmb25lIE0xMCddLFxuICAgICAgICAnSFAgaVBBUSA1MTAnOiBbJ0hQJywgJ2lQQVEgNTEwJ10sXG4gICAgICAgICdIRCBtaW5pIFQ1NTU1JzogW1NUUklOR1NfSFRDLCAnSEQgbWluaSddLFxuICAgICAgICAnSFRDIEhEIG1pbmknOiBbU1RSSU5HU19IVEMsICdIRCBtaW5pJ10sXG4gICAgICAgICdIVEMgSEQgbWluaSBUNTU1NSc6IFtTVFJJTkdTX0hUQywgJ0hEIG1pbmknXSxcbiAgICAgICAgJ0hUQyBIRDInOiBbU1RSSU5HU19IVEMsICdIRDInXSxcbiAgICAgICAgJ0hUQyBIRDIgVDg1ODUnOiBbU1RSSU5HU19IVEMsICdIRDInXSxcbiAgICAgICAgJ0hEMiBUODU4NSc6IFtTVFJJTkdTX0hUQywgJ0hEMiddLFxuICAgICAgICAnVC1Nb2JpbGUgTEVPJzogW1NUUklOR1NfSFRDLCAnSEQyJ10sXG4gICAgICAgICdkb3BvZFQ1NTg4JzogW1NUUklOR1NfSFRDLCAnSGVuZ3NoYW4nXSxcbiAgICAgICAgJ0hUQyBNZWdhLVQzMzMzJzogW1NUUklOR1NfSFRDLCAnTWVnYSddLFxuICAgICAgICAnSFRDIFNuYXAgUzUyMSc6IFtTVFJJTkdTX0hUQywgJ1NuYXAnXSxcbiAgICAgICAgJ0hUQyBUb3VjaDIgVDMzMjAnOiBbU1RSSU5HU19IVEMsICdUb3VjaCAyJ10sXG4gICAgICAgICdIVEMgVG91Y2gyIFQzMzMzJzogW1NUUklOR1NfSFRDLCAnVG91Y2ggMiddLFxuICAgICAgICAnSFRDIFRvdWNoMiBUMzMzNSc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIDInXSxcbiAgICAgICAgJ0hUQyBQMzcwMCc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIERpYW1vbmQnXSxcbiAgICAgICAgJ0hUQyBUb3VjaCBEaWFtb25kMiBUNTM1Myc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIERpYW1vbmQgMiddLFxuICAgICAgICAnSFRDIFRvdWNoIEhEIFQ4MjgyJzogW1NUUklOR1NfSFRDLCAnVG91Y2ggSEQnXSxcbiAgICAgICAgJ0hUQyBUb3VjaCBIRCBUODI4Myc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIEhEJ10sXG4gICAgICAgICdIVEMgVG91Y2ggSEQyIFQ4NTg1JzogW1NUUklOR1NfSFRDLCAnVG91Y2ggSEQyJ10sXG4gICAgICAgICdIVEMgVG91Y2ggUHJvMiBUNzM3Myc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIFBybyAyJ10sXG4gICAgICAgICdUNzM4MCc6IFtTVFJJTkdTX0hUQywgJ1RvdWNoIFBybyAyJ10sXG4gICAgICAgICdIVEMgVHlUTiBJSSc6IFtTVFJJTkdTX0hUQywgJ1R5VE4gSUknXSxcbiAgICAgICAgJ0dULUI3MzAwJzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIExpdGUnXSxcbiAgICAgICAgJ0dULUI3NjEwJzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIFBybyddLFxuICAgICAgICAnR1QtaTgwMDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgMiddLFxuICAgICAgICAnR1QtSTgwMDAnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgMiddLFxuICAgICAgICAnR1QtSTgwMDBVJzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIDInXSxcbiAgICAgICAgJ00xaSc6IFtTVFJJTkdTX1NPTllfRVJJQ1NTT04sICdNMWkgQXNwZW4nXVxuICAgIH1cblxuICAgIHZhciBXSU5ET1dTX1BIT05FX01PREVMUyA9IHtcbiAgICAgICAgJ0FjZXInOiB7XG4gICAgICAgICAgICAnQWxsZWdybyc6IFtTVFJJTkdTX0FDRVIsICdBbGxlZ3JvJ10sXG4gICAgICAgICAgICAnTTMxMCc6IFtTVFJJTkdTX0FDRVIsICdBbGxlZ3JvJ11cbiAgICAgICAgfSxcblxuICAgICAgICAnQXN1cyc6IHtcbiAgICAgICAgICAgICdHYWxheHk2JzogW1NUUklOR1NfQVNVUywgJ0dhbGF4eSA2J11cbiAgICAgICAgfSxcblxuICAgICAgICAnREVMTCc6IHtcbiAgICAgICAgICAgICdWZW51ZSBQcm8nOiBbJ0RlbGwnLCAnVmVudWUgUHJvJ11cbiAgICAgICAgfSxcblxuICAgICAgICAnRnVqaXRzdVRvc2hpYmFNb2JpbGVDb21tdW4nOiB7XG4gICAgICAgICAgICAnSVMxMlQnOiBbJ0Z1aml0c3UgVG9zaGliYScsICdJUzEyVCddXG4gICAgICAgIH0sXG5cbiAgICAgICAgJ0hUQyc6IHtcbiAgICAgICAgICAgICc3IE1vemFydCc6IFtTVFJJTkdTX0hUQywgJzcgTW96YXJ0J10sXG4gICAgICAgICAgICAnNyBNb3phcnQgVDg2OTgnOiBbU1RSSU5HU19IVEMsICc3IE1vemFydCddLFxuICAgICAgICAgICAgJ1Q4Njk3JzogW1NUUklOR1NfSFRDLCAnNyBNb3phcnQnXSxcbiAgICAgICAgICAgICdUODY5OCc6IFtTVFJJTkdTX0hUQywgJzcgTW96YXJ0J10sXG4gICAgICAgICAgICAnUEQ2NzEwMCc6IFtTVFJJTkdTX0hUQywgJzcgTW96YXJ0J10sXG4gICAgICAgICAgICAnTW96YXJ0IFQ4Njk4JzogW1NUUklOR1NfSFRDLCAnNyBNb3phcnQnXSxcbiAgICAgICAgICAgICdNb3phcnQnOiBbU1RSSU5HU19IVEMsICc3IE1vemFydCddLFxuICAgICAgICAgICAgJ1VTQ0NIVEMtUEM5MzEwMCc6IFtTVFJJTkdTX0hUQywgJ0Fycml2ZSddLFxuICAgICAgICAgICAgJ0dvbGQnOiBbU1RSSU5HU19IVEMsICdHb2xkICddLFxuICAgICAgICAgICAgJ0hEMic6IFtTVFJJTkdTX0hUQywgJ0hEMiddLFxuICAgICAgICAgICAgJ0hENyc6IFtTVFJJTkdTX0hUQywgJ0hENyddLFxuICAgICAgICAgICAgJ0hENyBUOTI5Mic6IFtTVFJJTkdTX0hUQywgJ0hENyddLFxuICAgICAgICAgICAgJ1Q5Mjk1JzogW1NUUklOR1NfSFRDLCAnSEQ3J10sXG4gICAgICAgICAgICAnVDkyOTYnOiBbU1RSSU5HU19IVEMsICdIRDcnXSxcbiAgICAgICAgICAgICdIRDcgSW5maW5pdHknOiBbU1RSSU5HU19IVEMsICdIRDcnXSxcbiAgICAgICAgICAgICdUNzU3NSc6IFtTVFJJTkdTX0hUQywgJzcgUHJvJ10sXG4gICAgICAgICAgICAnNyBQcm8gVDc1NzYnOiBbU1RSSU5HU19IVEMsICc3IFBybyddLFxuICAgICAgICAgICAgJ213cDY5ODUnOiBbU1RSSU5HU19IVEMsICdUcm9waHknXSxcbiAgICAgICAgICAgICc3IFRyb3BoeSBUODY4Nic6IFtTVFJJTkdTX0hUQywgJ1Ryb3BoeSddLFxuICAgICAgICAgICAgJzcgVHJvcGh5JzogW1NUUklOR1NfSFRDLCAnVHJvcGh5J10sXG4gICAgICAgICAgICAnUEM0MDEwMCc6IFtTVFJJTkdTX0hUQywgJ1Ryb3BoeSddLFxuICAgICAgICAgICAgJ1RvdWNoLUlUIFRyb3BoeSc6IFtTVFJJTkdTX0hUQywgJ1Ryb3BoeSddLFxuICAgICAgICAgICAgJ1JhZGFyJzogW1NUUklOR1NfSFRDLCAnUmFkYXInXSxcbiAgICAgICAgICAgICdSYWRhciA0Ryc6IFtTVFJJTkdTX0hUQywgJ1JhZGFyJ10sXG4gICAgICAgICAgICAnUmFkYXIgQzExMGUnOiBbU1RSSU5HU19IVEMsICdSYWRhciddLFxuICAgICAgICAgICAgJ01hemFhJzogW1NUUklOR1NfSFRDLCAnTWF6YWEnXSxcbiAgICAgICAgICAgICdNb25kcmlhbic6IFtTVFJJTkdTX0hUQywgJ01vbmRyaWFuJ10sXG4gICAgICAgICAgICAnU2NodWJlcnQnOiBbU1RSSU5HU19IVEMsICdTY2h1YmVydCddLFxuICAgICAgICAgICAgJzcgU2NodWJlcnQgVDkyOTInOiBbU1RSSU5HU19IVEMsICdTY2h1YmVydCddLFxuICAgICAgICAgICAgJ1NwYXJrJzogW1NUUklOR1NfSFRDLCAnU3BhcmsnXSxcbiAgICAgICAgICAgICdUODc4OCc6IFtTVFJJTkdTX0hUQywgJ1N1cnJvdW5kJ10sXG4gICAgICAgICAgICAnVElUQU4gWDMxMGUnOiBbU1RSSU5HU19IVEMsICdUaXRhbiddLFxuICAgICAgICAgICAgJ1gzMTBlJzogW1NUUklOR1NfSFRDLCAnVGl0YW4nXSxcbiAgICAgICAgICAgICdQSTM5MTAwJzogW1NUUklOR1NfSFRDLCAnVGl0YW4nXSxcbiAgICAgICAgICAgICdQSTg2MTAwJzogW1NUUklOR1NfSFRDLCAnVGl0YW4gSUknXSxcbiAgICAgICAgICAgICdVbHRpbWF0ZSc6IFtTVFJJTkdTX0hUQywgJ1VsdGltYXRlJ11cbiAgICAgICAgfSxcblxuICAgICAgICAnTEcnOiB7XG4gICAgICAgICAgICAnR1c5MTAnOiBbU1RSSU5HU19MRywgJ09wdGltdXMgNyddLFxuICAgICAgICAgICAgJ0xHIEUtOTAwJzogW1NUUklOR1NfTEcsICdPcHRpbXVzIDcgRTkwMCddLFxuICAgICAgICAgICAgJ0xHLUU5MDAnOiBbU1RSSU5HU19MRywgJ09wdGltdXMgNyBFOTAwJ10sXG4gICAgICAgICAgICAnTEctRTkwMGgnOiBbU1RSSU5HU19MRywgJ09wdGltdXMgNyBFOTAwJ10sXG4gICAgICAgICAgICAnTEctQzkwMCc6IFtTVFJJTkdTX0xHLCAnT3B0aW11cyA3USddLFxuICAgICAgICAgICAgJ0xHLUM5MDBCJzogW1NUUklOR1NfTEcsICdRdWFudHVtJ10sXG4gICAgICAgICAgICAnTEctQzkwMGsnOiBbU1RSSU5HU19MRywgJ1F1YW50dW0nXVxuICAgICAgICB9LFxuXG4gICAgICAgICdub2tpYSc6IHtcbiAgICAgICAgICAgICdTZWFSYXknOiBbJ05va2lhJywgJ0x1bWlhIDgwMCddLFxuICAgICAgICAgICAgJzgwMEMnOiBbJ05va2lhJywgJ0x1bWlhIDgwMCddXG4gICAgICAgIH0sXG5cbiAgICAgICAgJ05PS0lBJzoge1xuICAgICAgICAgICAgJzcxMCc6IFsnTm9raWEnLCAnTHVtaWEgNzEwJ10sXG4gICAgICAgICAgICAnTm9raWEgNzEwJzogWydOb2tpYScsICdMdW1pYSA3MTAnXSxcbiAgICAgICAgICAgICdMdW1pYSA3MTAnOiBbJ05va2lhJywgJ0x1bWlhIDcxMCddLFxuICAgICAgICAgICAgJ0x1bWlhIDcxOSc6IFsnTm9raWEnLCAnTHVtaWEgNzE5J10sXG4gICAgICAgICAgICAnTHVtaWEgODAwJzogWydOb2tpYScsICdMdW1pYSA4MDAnXSxcbiAgICAgICAgICAgICc4MDAnOiBbJ05va2lhJywgJ0x1bWlhIDgwMCddLFxuICAgICAgICAgICAgJ0x1bWlhIDkwMCc6IFsnTm9raWEnLCAnTHVtaWEgOTAwJ10sXG4gICAgICAgICAgICAnWFhYJzogWydOb2tpYScsICdwcm90b3R5cGUnXVxuICAgICAgICB9LFxuXG4gICAgICAgICdTQU1TVU5HJzoge1xuICAgICAgICAgICAgJ0dULUk4MzUwJzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIFcnXSxcbiAgICAgICAgICAgICdHVC1JODM1MFQnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgVyddLFxuICAgICAgICAgICAgJ1NHSC1pNjc3JzogW1NUUklOR1NfU0FNU1VORywgJ0ZvY3VzIEZsYXNoJ10sXG4gICAgICAgICAgICAnU0dILWk3MDcnOiBbU1RSSU5HU19TQU1TVU5HLCAnVGF5bG9yJ10sXG4gICAgICAgICAgICAnU0dILWk5MTcnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgNyddLFxuICAgICAgICAgICAgJ1NHSC1JOTE3JzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIDcnXSxcbiAgICAgICAgICAgICdTR0gtaTkxNy4nOiBbU1RSSU5HU19TQU1TVU5HLCAnRm9jdXMnXSxcbiAgICAgICAgICAgICdTR0gtaTkxN1InOiBbU1RSSU5HU19TQU1TVU5HLCAnRm9jdXMnXSxcbiAgICAgICAgICAgICdTR0gtaTkzNyc6IFtTVFJJTkdTX1NBTVNVTkcsICdGb2N1cyBTJ10sXG4gICAgICAgICAgICAnT01OSUE3JzogW1NUUklOR1NfU0FNU1VORywgJ09tbmlhIDcnXSxcbiAgICAgICAgICAgICdPTUlOQTcnOiBbU1RSSU5HU19TQU1TVU5HLCAnT21uaWEgNyddLFxuICAgICAgICAgICAgJ1RheWxvcic6IFtTVFJJTkdTX1NBTVNVTkcsICdUYXlsb3InXVxuICAgICAgICB9LFxuXG4gICAgICAgICdUT1NISUJBJzoge1xuICAgICAgICAgICAgJ1RTVU5BR0knOiBbJ1Rvc2hpYmEnLCAnVHN1bmFnaSddXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIEFORFJPSURfTU9ERUxTID0ge1xuICAgICAgICAnQW5kcm9pZCc6IFtudWxsLCBudWxsXSxcbiAgICAgICAgJ2dvb2dsZSBzZGsnOiBbbnVsbCwgbnVsbF0sXG4gICAgICAgICdzZGsnOiBbbnVsbCwgbnVsbF0sXG4gICAgICAgICdnZW5lcmljJzogW251bGwsIG51bGxdLFxuICAgICAgICAnZ2VuZXJpYyB4ODYnOiBbbnVsbCwgbnVsbF0sXG4gICAgICAgICdhbWQgYnJhem9zJzogWydBTUQnLCAnRnVzaW9uYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdBbWxvZ2ljIE0xIHJlZmVyZW5jZSBib2FyZCc6IFsnQW1sb2dpYycsICdNMSByZWZlcmVuY2UgYm9hcmQnXSxcbiAgICAgICAgJ0FNTDg3MjZNJzogWydBbWxvZ2ljJywgJ0FNTDg3MjYtTWJhc2VkIGRldmljZSddLFxuICAgICAgICAndmV4cHJlc3MgYTknOiBbJ0FSTScsICdWZXJzYXRpbGUgRXhwcmVzcyBkZXZlbG9wbWVudCBwbGF0Zm9ybSddLFxuICAgICAgICAnYmNtNzIzMSc6IFsnQnJvYWRjb20nLCAnQkNNNzIzMWJhc2VkIGRldmljZScsICd0ZWxldmlzaW9uJ10sXG4gICAgICAgICdiY203NDI1JzogWydCcm9hZGNvbScsICdCQ003NDI1YmFzZWQgZGV2aWNlJywgJ3RlbGV2aXNpb24nXSxcbiAgICAgICAgJ2JjbTc0MjknOiBbJ0Jyb2FkY29tJywgJ0JDTTc0MjliYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnaW14NTAgcmRwJzogWydGcmVlc2NhbGUnLCAnaS5NWDUwYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdpbXg1MSBiYmcnOiBbJ0ZyZWVzY2FsZScsICdpLk1YNTFiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ2lteDUzIGxvY28nOiBbJ0ZyZWVzY2FsZScsICdpLk1YNTNiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ2lteDUzIG1wMjA0ZjMnOiBbJ0ZyZWVzY2FsZScsICdpLk1YNTNiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ2lteDUzIHNtZCc6IFsnRnJlZXNjYWxlJywgJ2kuTVg1M2Jhc2VkIGRldmljZSddLFxuICAgICAgICAnaW14NTMgeWVhZ2xlJzogWydGcmVlc2NhbGUnLCAnaS5NWDUzYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdpbXg2cSc6IFsnRnJlZXNjYWxlJywgJ2kuTVg2UWJhc2VkIGRldmljZSddLFxuICAgICAgICAnT0RST0lELUEnOiBbJ0hhcmRrZXJuZWwnLCAnT0RST0lELUEgZGV2ZWxvcGVyIHRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ21mbGQgZHYxMCc6IFsnSW50ZWwnLCAnTWVkZmllbGRiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21mbGQgZHYyMCc6IFsnSW50ZWwnLCAnTWVkZmllbGRiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21mbGQgbHcwMCc6IFsnSW50ZWwnLCAnTWVkZmllbGRiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21mbGQgcHIyJzogWydJbnRlbCcsICdNZWRmaWVsZGJhc2VkIGRldmljZSddLFxuICAgICAgICAnbWZsZCBwcjMnOiBbJ0ludGVsJywgJ01lZGZpZWxkYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdiZXJsaW4gYmcyJzogWydNYXJ2ZWxsJywgJ0FybWFkYSAxMDAwYmFzZWQgZGV2aWNlJywgJ3RlbGV2aXNpb24nXSxcbiAgICAgICAgJ01TdGFyIEFtYmVyMyc6IFsnTVN0YXInLCAnQW1iZXIzYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdLb25rYSBBbWJlcjMnOiBbJ01TdGFyJywgJ0FtYmVyM2Jhc2VkIGRldmljZSddLFxuICAgICAgICAnbXQ1Mzk2JzogWydNZWRpYXRlaycsICdNVDUzOTZiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnYmlyZDc1djInOiBbJ01lZGlhdGVrJywgJ01UNjU3NWJhc2VkIGRldmljZSddLFxuICAgICAgICAnZWFnbGU3NXYxIDInOiBbJ01lZGlhdGVrJywgJ01UNjU3NWJhc2VkIGRldmljZSddLFxuICAgICAgICAnTUJYIERWQlQgcmVmZXJlbmNlIGJvYXJkIChjMDNyZWYpJzogWydNWEInLCAnRFZCVCByZWZlcmVuY2UgYm9hcmQnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnTlMyODE2JzogWydOdWZyb250JywgJ051U21hcnQgMjgxNmJhc2VkIGRldmljZSddLFxuICAgICAgICAnVmVudGFuYSc6IFsnblZpZGlhJywgJ1RlZ3JhIFZlbnRhbmEgZGV2ZWxvcG1lbnQga2l0J10sXG4gICAgICAgICdDYXJkaHUnOiBbJ25WaWRpYScsICdUZWdyYSAzYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdQYW5kYSc6IFsnUGFuZGFib2FyZCcsICdEZXZlbG9wbWVudCBLaXQnXSxcbiAgICAgICAgJ3BhbmRhYm9hcmQnOiBbJ1BhbmRhYm9hcmQnLCAnRGV2ZWxvcG1lbnQgS2l0J10sXG4gICAgICAgICdQYW5kYUJvYXJkJzogWydQYW5kYWJvYXJkJywgJ0RldmVsb3BtZW50IEtpdCddLFxuICAgICAgICAnTVNNJzogWydRdWFsY29tbScsICdTbmFwZHJhZ29uYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdtc203MjI3IGZmYSc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMWJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtNzYyNyBzdXJmJzogWydRdWFsY29tbScsICdTbmFwZHJhZ29uIFMxYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdtc203NjI3YSc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMWJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtNzYyN2Egc2t1MSc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMWJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtNzYyN2Egc2t1Myc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMWJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtNzYzMCBmdXNpb24nOiBbJ1F1YWxjb21tJywgJ1NuYXBkcmFnb24gUzJiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21zbTc2MzAgc3VyZic6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTMmJhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtODY2MCBjb3VnYXInOiBbJ1F1YWxjb21tJywgJ1NuYXBkcmFnb24gUzNiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ21zbTg2NjAgc3VyZic6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTM2Jhc2VkIGRldmljZSddLFxuICAgICAgICAnbXNtODk2MCc6IFsnUXVhbGNvbW0nLCAnU25hcGRyYWdvbiBTNGJhc2VkIGRldmljZSddLFxuICAgICAgICAncmsyODA4c2RrJzogWydSb2NrY2hpcCcsICdSSzI4MDhiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ1JLMjgxOCc6IFsnUm9ja2NoaXAnLCAnUksyODE4YmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdyazI4MThzZGsnOiBbJ1JvY2tjaGlwJywgJ1JLMjgxOGJhc2VkIGRldmljZSddLFxuICAgICAgICAnQW5kcm9pZC1mb3ItUm9ja2NoaXAtMjgxOCc6IFsnUm9ja2NoaXAnLCAnUksyODE4YmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdyazI5c2RrJzogWydSb2NrY2hpcCcsICdSSzI5YmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdSazI5c2RrJzogWydSb2NrY2hpcCcsICdSSzI5YmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdyazMwc2RrJzogWydSb2NrY2hpcCcsICdSSzMwYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdzM2M2NDEwJzogWydTYW1zdW5nJywgJ1MzQzY0MTBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ3NtZGs2NDEwJzogWydTYW1zdW5nJywgJ1MzQzY0MTBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ1NNREtDMTEwJzogWydTYW1zdW5nJywgJ0V4eW5vcyAzMTEwYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdTTURLVjIxMCc6IFsnU2Ftc3VuZycsICdFeHlub3MgNDIxMGJhc2VkIGRldmljZSddLFxuICAgICAgICAnUzVQVjIxMCc6IFsnU2Ftc3VuZycsICdFeHlub3MgNDIxMGJhc2VkIGRldmljZSddLFxuICAgICAgICAnc2VjIHNtZGtjMjEwJzogWydTYW1zdW5nJywgJ0V4eW5vcyA0MjEwYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdTTURLNHgxMic6IFsnU2Ftc3VuZycsICdFeHlub3MgNDIxMiBvciA0NDEyYmFzZWQgZGV2aWNlJ10sXG4gICAgICAgICdzbXA4Nnh4JzogWydTaWdtYScsICdTTVA4Nnh4YmFzZWQgZGV2aWNlJywgJ3RlbGV2aXNpb24nXSxcbiAgICAgICAgJ3N2ODg2MCc6IFsnU2t5dmlpYScsICdTVjg4NjBiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnc3RlIHU4NTAwJzogWydTVCBFcmljc3NvbicsICdOb3ZhdGhvciBVODUwMGJhc2VkIGRldmljZSddLFxuICAgICAgICAnVGVsZWNoaXBzIE04MDEgRXZhbHVhdGlvbiBCb2FyZCc6IFsnVGVsZWNoaXBzJywgJ004MDFiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnVGVsZWNoaXBzIFRDQzg5MDAgRXZhbHVhdGlvbiBCb2FyZCc6IFsnVGVsZWNoaXBzJywgJ1RDQzg5MDBiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnVENDODkyMCBTVEIgRVYnOiBbJ1RlbGVjaGlwcycsICdUQ0M4OTIwYmFzZWQgZGV2aWNlJywgJ3RlbGV2aXNpb24nXSxcbiAgICAgICAgJ09NQVAnOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ09NQVBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ09NQVAgU1MnOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ09NQVBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ0xvZ2ljUEQgWm9vbTInOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ09NQVBiYXNlZCBkZXZpY2UnXSxcbiAgICAgICAgJ29tYXAzZXZtJzogWydUZXhhcyBJbnN0cnVtZW50cycsICdPTUFQM2Jhc2VkIGRldmljZSddLFxuICAgICAgICAnT21hcDVzZXZtJzogWydUZXhhcyBJbnN0cnVtZW50cycsICdPTUFQNWJhc2VkIGRldmljZSddLFxuICAgICAgICAncG54ODQ3MyBraXJ5dW5nJzogWydUcmlkZW50JywgJ1BOWDg0NzNiYXNlZCBkZXZpY2UnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnY3Jlc3BvJzogWydHb29nbGUnLCAnTmV4dXMgUyddLFxuICAgICAgICAnQ3Jlc3BvJzogWydHb29nbGUnLCAnTmV4dXMgUyddLFxuICAgICAgICAnQ3Jlc3BvNEcnOiBbJ0dvb2dsZScsICdOZXh1cyBTJ10sXG4gICAgICAgICdQYXNzaW9uJzogWydHb29nbGUnLCAnTmV4dXMgT25lJ10sXG4gICAgICAgICdCcmF2byc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnZHJlYW0nOiBbJ0hUQycsICdEcmVhbSddLFxuICAgICAgICAnVm9ndWUnOiBbJ0hUQycsICdUb3VjaCddLFxuICAgICAgICAnVmVuZG9yIE9wdGltdXMnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ1N0aW5ncmF5JzogWydNb3Rvcm9sYScsICdYT09NJywgJ3RhYmxldCddLFxuICAgICAgICAnV2luZ3JheSc6IFsnTW90b3JvbGEnLCAnWE9PTScsICd0YWJsZXQnXSxcbiAgICAgICAgJ21hZ3Vybyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ01hZ3Vybyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ1Rvcm8tVlpXJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOZXh1cyddLFxuICAgICAgICAnYmxhemUnOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ0JsYXplIFRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0JsYXplJzogWydUZXhhcyBJbnN0cnVtZW50cycsICdCbGF6ZSBUYWJsZXQnLCAndGFibGV0J10sXG4gICAgICAgICdCbGF6ZSBUYWJsZXQnOiBbJ1RleGFzIEluc3RydW1lbnRzJywgJ0JsYXplIFRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0JsdWVTdGFja3MnOiBbJ0JsdWVTdGFja3MnLCAnQXBwIFBsYXllcicsICdkZXNrdG9wJ10sXG4gICAgICAgICd5b3V3YXZlIGN1c3RvbSc6IFsnWW91d2F2ZScsICdBbmRyb2lkIG9uIFBDJywgJ2Rlc2t0b3AnXSxcbiAgICAgICAgJ0ExMDAnOiBbJ0FjZXInLCAnSWNvbmlhIFRhYiBBMTAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQTEwMSc6IFsnQWNlcicsICdJY29uaWEgVGFiIEExMDEnLCAndGFibGV0J10sXG4gICAgICAgICdBMjAwJzogWydBY2VyJywgJ0ljb25pYSBUYWIgQTIwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E1MDAnOiBbJ0FjZXInLCAnSWNvbmlhIFRhYiBBNTAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQTUwMSc6IFsnQWNlcicsICdJY29uaWEgVGFiIEE1MDEnLCAndGFibGV0J10sXG4gICAgICAgICdBNTEwJzogWydBY2VyJywgJ0ljb25pYSBUYWIgQTUxMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E1MTEnOiBbJ0FjZXInLCAnSWNvbmlhIFRhYiBBNTExJywgJ3RhYmxldCddLFxuICAgICAgICAnQTcwMCc6IFsnQWNlcicsICdJY29uaWEgVGFiIEE3MDAnLCAndGFibGV0J10sXG4gICAgICAgICdBY2VyIEE4MDAnOiBbJ0FjZXInLCAnSWNvbmlhIFRhYiBBODAwJywgJ3RhYmxldCddLFxuICAgICAgICAnRTExMCc6IFsnQWNlcicsICdiZVRvdWNoIEUxMTAnXSxcbiAgICAgICAgJ0UxMjAnOiBbJ0FjZXInLCAnYmVUb3VjaCBFMTIwJ10sXG4gICAgICAgICdFMTMwJzogWydBY2VyJywgJ2JlVG91Y2ggRTEzMCddLFxuICAgICAgICAnRTE0MCc6IFsnQWNlcicsICdiZVRvdWNoIEUxNDAnXSxcbiAgICAgICAgJ0UyMTAnOiBbJ0FjZXInLCAnYmVUb3VjaCBFMjEwJ10sXG4gICAgICAgICdFMzEwJzogWydBY2VyJywgJ0xpcXVpZCBtaW5pJ10sXG4gICAgICAgICdFMzIwJzogWydBY2VyJywgJ0xpcXVpZCBFeHByZXNzJ10sXG4gICAgICAgICdFMzMwJzogWydBY2VyJywgJ0xpcXVpZCBHbG93J10sXG4gICAgICAgICdFNDAwJzogWydBY2VyJywgJ2JlVG91Y2ggRTQwMCddLFxuICAgICAgICAnRzEwMFcnOiBbJ0FjZXInLCAnRzEwMFcnXSxcbiAgICAgICAgJ1MxMDAnOiBbJ0FjZXInLCAnTGlxdWlkJ10sXG4gICAgICAgICdTMTEwJzogWydBY2VyJywgJ1N0cmVhbSddLFxuICAgICAgICAnUzEyMCc6IFsnQWNlcicsICdMaXF1aWQgbXQnXSxcbiAgICAgICAgJ1MzMDAnOiBbJ0FjZXInLCAnSWNvbmlhIFNtYXJ0J10sXG4gICAgICAgICdTNTAwJzogWydBY2VyJywgJ0Nsb3VkTW9iaWxlJ10sXG4gICAgICAgICdURDYwMCc6IFsnQWNlcicsICdiZVRvdWNoIFRENjAwJ10sXG4gICAgICAgICdMaXF1aWQnOiBbJ0FjZXInLCAnTGlxdWlkJ10sXG4gICAgICAgICdMaXF1aWQgRSc6IFsnQWNlcicsICdMaXF1aWQgRSddLFxuICAgICAgICAnTGlxdWlkIE10JzogWydBY2VyJywgJ0xpcXVpZCBtdCddLFxuICAgICAgICAnTGlxdWlkIE1UJzogWydBY2VyJywgJ0xpcXVpZCBtdCddLFxuICAgICAgICAnTGlxdWlkIE1ldGFsJzogWydBY2VyJywgJ0xpcXVpZCBtdCddLFxuICAgICAgICAnU3RyZWFtJzogWydBY2VyJywgJ1N0cmVhbSddLFxuICAgICAgICAnTjcwMCc6IFsnYWlnbycsICdONzAwJywgJ3RhYmxldCddLFxuICAgICAgICAnTTgwMSc6IFsnYWlnbycsICdNODAxJywgJ3RhYmxldCddLFxuICAgICAgICAnTm92bzcnOiBbJ0Fpbm92bycsICdOb3ZvNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ05vdm83IEF1cm9yYSc6IFsnQWlub3ZvJywgJ05vdm83IEF1cm9yYScsICd0YWJsZXQnXSxcbiAgICAgICAgJ05vdm83IEFkdmFuY2VkJzogWydBaW5vdm8nLCAnTm92bzcgQWR2YW5jZWQnLCAndGFibGV0J10sXG4gICAgICAgICdOb3ZvNyBBZHZhbmNlZDInOiBbJ0Fpbm92bycsICdOb3ZvNyBBZHZhbmNlZCAyJywgJ3RhYmxldCddLFxuICAgICAgICAnTm92bzcgQmFzaWMnOiBbJ0Fpbm92bycsICdOb3ZvNyBCYXNpYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ05vdm83IEVMRic6IFsnQWlub3ZvJywgJ05vdm83IEVsZicsICd0YWJsZXQnXSxcbiAgICAgICAgJ05vdm83IFBBTEFESU4nOiBbJ0Fpbm92bycsICdOb3ZvNyBQYWxhZGluJywgJ3RhYmxldCddLFxuICAgICAgICAnTm92bzggQWR2YW5jZWQnOiBbJ0Fpbm92bycsICdOb3ZvOCBBZHZhbmNlZCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA4OTAnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDg5MCddLFxuICAgICAgICAnb25lIHRvdWNoIDg5MEQnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDg5MCddLFxuICAgICAgICAnb25lIHRvdWNoIDg5MSc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggODkxJ10sXG4gICAgICAgICdPTkUgVE9VQ0ggOTAzJzogWydBbGNhdGVsJywgJ09uZSBUb3VjaCA5MDNTSFYtRTE3MEsnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA5MDYnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkwNiddLFxuICAgICAgICAnb25lIHRvdWNoIDkwOCc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTA4J10sXG4gICAgICAgICdvbmUgdG91Y2ggOTA4Ric6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTA4J10sXG4gICAgICAgICdvbmUgdG91Y2ggOTA4Uyc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTA4J10sXG4gICAgICAgICdvbmUgdG91Y2ggOTEwJzogWydBbGNhdGVsJywgJ09uZSBUb3VjaCA5MTAnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA5MTgnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnb25lIHRvdWNoIDkxOEQnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnT05FIFRPVUNIIDkxOEQnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnb25lIHRvdWNoIDkxOE0nOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnb25lIHRvdWNoIDkxOE4nOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnb25lIHRvdWNoIDk4MCc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTgwJ10sXG4gICAgICAgICdvbmUgdG91Y2ggOTgwQSc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTgwJ10sXG4gICAgICAgICdvbmUgdG91Y2ggOTgxQSc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTgxJ10sXG4gICAgICAgICdvbmUgdG91Y2ggOTg2JzogWydBbGNhdGVsJywgJ09uZSBUb3VjaCA5ODYnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA5OTAnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDk5MCddLFxuICAgICAgICAnb25lIHRvdWNoIDk5MEEnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDk5MCddLFxuICAgICAgICAnb25lIHRvdWNoIDk5MSc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTkxJ10sXG4gICAgICAgICdvbmUgdG91Y2ggOTkxRCc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTkxJ10sXG4gICAgICAgICdPTkUgVE9VQ0ggOTkzJzogWydBbGNhdGVsJywgJ09uZSBUb3VjaCA5OTMnXSxcbiAgICAgICAgJ29uZSB0b3VjaCA5OTUnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDk5NSddLFxuICAgICAgICAnVGVsZW5vciBPbmVUb3VjaCc6IFsnQWxjYXRlbCcsICdPbmUgVG91Y2ggOTkwJ10sXG4gICAgICAgICdPVCA5MTgnOiBbJ0FsY2F0ZWwnLCAnT25lIFRvdWNoIDkxOCddLFxuICAgICAgICAnVmVudHVyZSc6IFsnQWxjYXRlbCcsICdWZW50dXJlJ10sXG4gICAgICAgICdBbGx3aW5uZXIgQTEwJzogWydBbGxXaW5uZXInLCAnQTEwJywgJ3RhYmxldCddLFxuICAgICAgICAnOTdGQyc6IFsnQWxsV2lubmVyJywgJ0ExMCA5N0ZDJywgJ3RhYmxldCddLFxuICAgICAgICAnS2luZGxlIEZpcmUnOiBbJ0FtYXpvbicsICdLaW5kbGUgRmlyZScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FtYXpvbiBLaW5kbGUgRmlyZSc6IFsnQW1hem9uJywgJ0tpbmRsZSBGaXJlJywgJ3RhYmxldCddLFxuICAgICAgICAnQU1EMTIwJzogWydBbnlEQVRBJywgJ0FueVRBQiBBTUQxMjAnLCAndGFibGV0J10sXG4gICAgICAgICdNVzA4MTEnOiBbJ0FPQycsICdCcmVlemUgTVcwODExJywgJ3RhYmxldCddLFxuICAgICAgICAnTVcwODIxIFYyLjAnOiBbJ0FPQycsICdCcmVlemUgTVcwODIxJywgJ3RhYmxldCddLFxuICAgICAgICAnTVcwOTIyJzogWydBT0MnLCAnQnJlZXplIE1XMDkyMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FwYW5kYSBBNjAnOiBbJ0FwYW5kYScsICdBNjAnXSxcbiAgICAgICAgJ2FwYW5kYS1BNjAnOiBbJ0FwYW5kYScsICdBNjAnXSxcbiAgICAgICAgJ0E4MEtTQyc6IFsnQXJjaG9zJywgJ0Fybm92YSA4JywgJ3RhYmxldCddLFxuICAgICAgICAnQU43Q0cyJzogWydBcmNob3MnLCAnQXJub3ZhIDcnLCAndGFibGV0J10sXG4gICAgICAgICdBMTAxQic6IFsnQXJjaG9zJywgJ0Fybm92YSAxMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FOMTBCRzJEVCc6IFsnQXJjaG9zJywgJ0Fybm92YSAxMCBCJywgJ3RhYmxldCddLFxuICAgICAgICAnQU4xMEcyJzogWydBcmNob3MnLCAnQXJub3ZhIDEwIEcyJywgJ3RhYmxldCddLFxuICAgICAgICAnQTMyJzogWydBcmNob3MnLCAnMzInLCAnbWVkaWEnXSxcbiAgICAgICAgJ0EzNURFJzogWydBcmNob3MnLCAnMzUgU21hcnQgSG9tZSBQaG9uZSddLFxuICAgICAgICAnQTQzJzogWydBcmNob3MnLCAnNDMnLCAnbWVkaWEnXSxcbiAgICAgICAgJ0FyY2hvczUnOiBbJ0FyY2hvcycsICc1JywgJ21lZGlhJ10sXG4gICAgICAgICdBNzBIJzogWydBcmNob3MnLCAnNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E3MEhCJzogWydBcmNob3MnLCAnNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E3MEJIVCc6IFsnQXJjaG9zJywgJzcnLCAndGFibGV0J10sXG4gICAgICAgICdBNzBDSFQnOiBbJ0FyY2hvcycsICc3QycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E3MFMnOiBbJ0FyY2hvcycsICc3MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E3RUInOiBbJ0FyY2hvcycsICc3MEInLCAndGFibGV0J10sXG4gICAgICAgICdBUkNIT1MgNzBpdDInOiBbJ0FyY2hvcycsICc3MCBJVCAyJywgJ3RhYmxldCddLFxuICAgICAgICAnQVJDSE9TIDgwRzknOiBbJ0FyY2hvcycsICc4MCBHOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FSQ0hPUyAxMDFHOSc6IFsnQXJjaG9zJywgJzEwMSBHOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0ExMDFJVCc6IFsnQXJjaG9zJywgJzEwMSBJVCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FTVFJJJzogWydBU1RSSScsICdlLXJlYWRlcicsICdlcmVhZGVyJ10sXG4gICAgICAgICdlZWVwYyc6IFsnQXN1cycsICdFZWUgUGMnXSxcbiAgICAgICAgJ2FzdXMgbGFwdG9wJzogWydBc3VzJywgJ0VlZSBQYyddLFxuICAgICAgICAnTUUxNzEnOiBbJ0FzdXMnLCAnRWVlIFBhZCBNZU1PJywgJ3RhYmxldCddLFxuICAgICAgICAnU2xpZGVyIFNMMTAxJzogWydBc3VzJywgJ0VlZSBQYWQgU2xpZGVyJywgJ3RhYmxldCddLFxuICAgICAgICAnRVBBRCc6IFsnQXN1cycsICdFZWUgUGFkIFRyYW5zZm9ybWVyJywgJ3RhYmxldCddLFxuICAgICAgICAnVEYxMDEnOiBbJ0FzdXMnLCAnRWVlIFBhZCBUcmFuc2Zvcm1lcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RyYW5zZm9ybWVyIFRGMTAxJzogWydBc3VzJywgJ0VlZSBQYWQgVHJhbnNmb3JtZXInLCAndGFibGV0J10sXG4gICAgICAgICdUcmFuc2Zvcm1lciBURjEwMUcnOiBbJ0FzdXMnLCAnRWVlIFBhZCBUcmFuc2Zvcm1lcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RGMjAxJzogWydBc3VzJywgJ0VlZSBQYWQgVHJhbnNmb3JtZXIgUHJpbWUnLCAndGFibGV0J10sXG4gICAgICAgICdUcmFuc2Zvcm1lciBQcmltZSBURjIwMSc6IFsnQXN1cycsICdFZWUgUGFkIFRyYW5zZm9ybWVyIFByaW1lJywgJ3RhYmxldCddLFxuICAgICAgICAnVHJhbnNmb3JtZXIgUHJpbWUnOiBbJ0FzdXMnLCAnRWVlIFBhZCBUcmFuc2Zvcm1lciBQcmltZScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RyYW5zZm9ybWVyIFBhZCBURjMwMFQnOiBbJ0FzdXMnLCAnVHJhbnNmb3JtZXIgUGFkIDMwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FTVVMgVHJhbnNmb3JtZXIgVEYzMDBUJzogWydBc3VzJywgJ1RyYW5zZm9ybWVyIFBhZCAzMDAnLCAndGFibGV0J10sXG4gICAgICAgICdBU1VTIFRyYW5zZm9ybWVyIFBhZCBURjMwMFQnOiBbJ0FzdXMnLCAnVHJhbnNmb3JtZXIgUGFkIDMwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FTVVMgVHJhbnNmb3JtZXIgUGFkIFRGMzAwVEcnOiBbJ0FzdXMnLCAnVHJhbnNmb3JtZXIgUGFkIDMwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FTVVMgVHJhbnNmb3JtZXIgUGFkIFRGNzAwVCc6IFsnQXN1cycsICdUcmFuc2Zvcm1lciBQYWQgSW5maW5pdHkgNzAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQVNVUyBUcmFuc2Zvcm1lciBQYWQgVEY3MDBLJzogWydBc3VzJywgJ1RyYW5zZm9ybWVyIFBhZCBJbmZpbml0eSA3MDAnLCAndGFibGV0J10sXG4gICAgICAgICdBU1VTIFRyYW5zZm9ybWVyIFRGNzAwSyc6IFsnQXN1cycsICdUcmFuc2Zvcm1lciBQYWQgSW5maW5pdHkgNzAwJywgJ3RhYmxldCddLFxuICAgICAgICAnUGFkRm9uZSc6IFsnQXN1cycsICdQYWRmb25lJywgJ3RhYmxldCddLFxuICAgICAgICAnT01TIFRURCc6IFsnQXN1cycsICdFZWUgUGMgVDEwJ10sXG4gICAgICAgICdBU1VTIFQyMCc6IFsnQXN1cycsICdFZWUgUGMgVDIwJ10sXG4gICAgICAgICdFVEJXMTFBQSc6IFsnQXN1cycsICdUb3VnaCddLFxuICAgICAgICAnQVVYIFY5MDAnOiBbJ0FVWCcsICdWOTAwJ10sXG4gICAgICAgICdNOTEwQSc6IFsnQVVYJywgJ005MTAnXSxcbiAgICAgICAgJ1BJQ09wYWQtUUdOJzogWydBeGlvbycsICdQaWNvcGFkIFFHTicsICd0YWJsZXQnXSxcbiAgICAgICAgJ05PT0snOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0snLCAnZXJlYWRlciddLFxuICAgICAgICAnTm9va0NvbG9yJzogWydCYXJuZXMgJiBOb2JsZScsICdOT09LIENvbG9yJywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ05PT0sgQk5SVjIwMCc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBDb2xvcicsICdlcmVhZGVyJ10sXG4gICAgICAgICdOT09LIEJOUlYzMDAnOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0sgQ29sb3InLCAnZXJlYWRlciddLFxuICAgICAgICAnTm9va1RhYmxldCc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBUYWJsZXQnLCAnZXJlYWRlciddLFxuICAgICAgICAnTm9vayBUYWJsZXQnOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0sgVGFibGV0JywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ05PT0sgQk5UVjI1MCc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBUYWJsZXQnLCAnZXJlYWRlciddLFxuICAgICAgICAnTk9PSyBCTlRWMjUwQSc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBUYWJsZXQnLCAnZXJlYWRlciddLFxuICAgICAgICAnQk5UVjI1MCc6IFsnQmFybmVzICYgTm9ibGUnLCAnTk9PSyBUYWJsZXQnLCAnZXJlYWRlciddLFxuICAgICAgICAnQk5UVjI1MEEnOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0sgVGFibGV0JywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ05PT0sgU2xhdGUnOiBbJ0Jhcm5lcyAmIE5vYmxlJywgJ05PT0sgVGFibGV0JywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ0JlbldlZSA1MTAwJzogWydCZW5XZWUnLCAnNTEwMCddLFxuICAgICAgICAnQ0E5MDdBQUMwRyc6IFsnQmVzdGEnLCAnQ0E5MDdBQUMwRyddLFxuICAgICAgICAnQk05OTknOiBbJ0Jtb3JuJywgJ0JNOTk5JywgJ3RhYmxldCddLFxuICAgICAgICAnVjExJzogWydCbW9ybicsICdWMTEnLCAndGFibGV0J10sXG4gICAgICAgICdWOTknOiBbJ0Jtb3JuJywgJ1Y5OScsICd0YWJsZXQnXSxcbiAgICAgICAgJ2JxIERhVmluY2knOiBbJ2JxJywgJ0RhVmluY2knLCAndGFibGV0J10sXG4gICAgICAgICdDVDcwNCc6IFsnQ2FycmVmb3VyJywgJ0NUNzA0JywgJ3RhYmxldCddLFxuICAgICAgICAnQ1QxMDAyJzogWydDYXJyZWZvdXInLCAnQ1QxMDAyJywgJ3RhYmxldCddLFxuICAgICAgICAnQ2FtYW5naS1NYW5ncm92ZTcnOiBbJ0NhbWFuZ2knLCAnTWFuZ3JvdmUgNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1dTMTcxJzogWydDYW1hbmdpJywgJ1dlYlN0YXRpb24nLCAndGFibGV0J10sXG4gICAgICAgICdJUzExQ0EnOiBbJ0Nhc2lvJywgJ0d6T25lIElTMTFDQSddLFxuICAgICAgICAnQzc3MSc6IFsnQ2FzaW8nLCAnR3pPbmUgQ29tbWFuZG8nXSxcbiAgICAgICAgJ0NBVCBOT1ZBJzogWydDYXQnLCAnTk9WQScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FSTU0zVic6IFsnY2hpbmFsZWFwJywgJ0FSTU0zVicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NJVVMtNyc6IFsnQ2lzY28nLCAnQ2l1cycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NJVVMtNy1BVCc6IFsnQ2lzY28nLCAnQ2l1cycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NTTCBTcGljZSBNSTMwMCc6IFsnQ1NMJywgJ1NwaWNlIE1JMzAwJ10sXG4gICAgICAgICdDU0wtTUk0MTAnOiBbJ0NTTCcsICdTcGljZSBNSTQxMCddLFxuICAgICAgICAnTUlEMTAyNCc6IFsnQ29ieScsICdLeXJvcyBNSUQxMDI0JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlEMTEyNSc6IFsnQ29ieScsICdLeXJvcyBNSUQxMTI1JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlEMTEyNic6IFsnQ29ieScsICdLeXJvcyBNSUQxMTI2JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlENzAxMCc6IFsnQ29ieScsICdLeXJvcyBNSUQ3MDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnTUlENzAxMic6IFsnQ29ieScsICdLeXJvcyBNSUQ3MDEyJywgJ3RhYmxldCddLFxuICAgICAgICAnTUlENzAxNSc6IFsnQ29ieScsICdLeXJvcyBNSUQ3MDE1JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlENzAxNUEnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAxNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMTYnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAxNicsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMjAnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAyMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMjInOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAyMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMjQnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAyNCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcwMjUnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzAyNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDcxMjcnOiBbJ0NvYnknLCAnS3lyb3MgTUlENzEyNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDgwMjQnOiBbJ0NvYnknLCAnS3lyb3MgTUlEODAyNCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDgxMjUnOiBbJ0NvYnknLCAnS3lyb3MgTUlEODEyNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRDgxMjcnOiBbJ0NvYnknLCAnS3lyb3MgTUlEODEyNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1o3MSc6IFsnQ29tbXRpdmEnLCAnWjcxJ10sXG4gICAgICAgICdWLVQxMDAnOiBbJ0NvbW10aXZhJywgJ1YtVDEwMCddLFxuICAgICAgICAnRklILUZCMCc6IFsnQ29tbXRpdmEnLCAnSEQ3MDAnXSxcbiAgICAgICAgJ0Nvb2xwYWQgRDUxMCc6IFsnQ29vbHBhZCcsICdENTEwJ10sXG4gICAgICAgICdDb29scGFkIDgwMjAnOiBbJ0Nvb2xwYWQnLCAnODAyMCddLFxuICAgICAgICAnRDUzMCc6IFsnQ29vbHBhZCcsICdENTMwJ10sXG4gICAgICAgICdDb29scGFkIEQ1MzAnOiBbJ0Nvb2xwYWQnLCAnRDUzMCddLFxuICAgICAgICAnRDUzOSc6IFsnQ29vbHBhZCcsICdENTM5J10sXG4gICAgICAgICdDb29scGFkIEQ1MzknOiBbJ0Nvb2xwYWQnLCAnRDUzOSddLFxuICAgICAgICAnRTIzOSc6IFsnQ29vbHBhZCcsICdFMjM5J10sXG4gICAgICAgICdDb29scGFkIEUyMzknOiBbJ0Nvb2xwYWQnLCAnRTIzOSddLFxuICAgICAgICAnQ29vbHBhZCBOOTMwJzogWydDb29scGFkJywgJ045MzAnXSxcbiAgICAgICAgJ045MzAnOiBbJ0Nvb2xwYWQnLCAnTjkzMCddLFxuICAgICAgICAnQ29vbHBhZCBXNzA2JzogWydDb29scGFkJywgJ1c3MDYnXSxcbiAgICAgICAgJ0Nvb2xwYWQgVzcwNisnOiBbJ0Nvb2xwYWQnLCAnVzcwNiddLFxuICAgICAgICAnQ29vbHBhZCBXNzA4JzogWydDb29scGFkJywgJ1c3MDgnXSxcbiAgICAgICAgJ1c3MTEnOiBbJ0Nvb2xwYWQnLCAnVzcxMSddLFxuICAgICAgICAnQ29vbHBhZCA1MDEwJzogWydDb29scGFkJywgJzUwMTAnXSxcbiAgICAgICAgJ0Nvb2xwYWQgNTIxMCc6IFsnQ29vbHBhZCcsICc1MjEwJ10sXG4gICAgICAgICdDb29scGFkIDU4MjAnOiBbJ0Nvb2xwYWQnLCAnNTgyMCddLFxuICAgICAgICAnNTgzMic6IFsnQ29vbHBhZCcsICc1ODMyJ10sXG4gICAgICAgICdDb29scGFkIDU4MzInOiBbJ0Nvb2xwYWQnLCAnNTgzMiddLFxuICAgICAgICAnNTg1NSc6IFsnQ29vbHBhZCcsICc1ODU1J10sXG4gICAgICAgICdDb29scGFkIDU4NjAnOiBbJ0Nvb2xwYWQnLCAnNTg2MCddLFxuICAgICAgICAnQ29vbHBhZCA1ODYwKyc6IFsnQ29vbHBhZCcsICc1ODYwJ10sXG4gICAgICAgICdDb29scGFkIDU4NjBzJzogWydDb29scGFkJywgJzU4NjAnXSxcbiAgICAgICAgJzU4NjAnOiBbJ0Nvb2xwYWQnLCAnNTg2MCddLFxuICAgICAgICAnNTg2MEEnOiBbJ0Nvb2xwYWQnLCAnNTg2MCddLFxuICAgICAgICAnQ29vbHBhZCA1ODcwJzogWydDb29scGFkJywgJzU4NzAnXSxcbiAgICAgICAgJzU4NzAnOiBbJ0Nvb2xwYWQnLCAnNTg3MCddLFxuICAgICAgICAnQ29vbHBhZCA3MDA1JzogWydDb29scGFkJywgJzcwMDUnXSxcbiAgICAgICAgJzcyNjAnOiBbJ0Nvb2xwYWQnLCAnNzI2MCddLFxuICAgICAgICAnQ29vbHBhZCA3MDE5JzogWydDb29scGFkJywgJzcwMTknXSxcbiAgICAgICAgJ0Nvb2xwYWQgNzI2MCc6IFsnQ29vbHBhZCcsICc3MjYwJ10sXG4gICAgICAgICdDb29scGFkIDgwMTMnOiBbJ0Nvb2xwYWQnLCAnODAxMyddLFxuICAgICAgICAnQ29vbHBhZCA4ODA5JzogWydDb29scGFkJywgJzg4MDknXSxcbiAgICAgICAgJ0Nvb2xwYWQgODgxMCc6IFsnQ29vbHBhZCcsICc4ODEwJ10sXG4gICAgICAgICc4ODEwJzogWydDb29scGFkJywgJzg4MTAnXSxcbiAgICAgICAgJzgxNTAnOiBbJ0Nvb2xwYWQnLCAnODE1MCddLFxuICAgICAgICAnQ29vbHBhZCA4MTUwRCc6IFsnQ29vbHBhZCcsICc4MTUwJ10sXG5cbiAgICAgICAgJ0Nvb2xwYWQgODgxMSc6IFsnQ29vbHBhZCcsICc4ODExJ10sXG4gICAgICAgICdDb29scGFkIDk5MDAnOiBbJ0Nvb2xwYWQnLCAnOTkwMCddLFxuICAgICAgICAnQ29vbHBhZCA4MDUwJzogWydDb29scGFkJywgJzgwNTAnXSxcbiAgICAgICAgJ1ppaU83JzogWydDcmVhdGl2ZScsICdaaWlPIDcnLCAndGFibGV0J10sXG4gICAgICAgICdaaWlMQUJTIFppaU83JzogWydDcmVhdGl2ZScsICdaaWlPIDcnLCAndGFibGV0J10sXG4gICAgICAgICdaaWlMQUJTIFppaU8xMCAnOiBbJ0NyZWF0aXZlJywgJ1ppaU8gMTAnLCAndGFibGV0J10sXG4gICAgICAgICdDVUJFIEs4R1QgQSc6IFsnQ3ViZScsICdLOEdUIEEnLCAndGFibGV0J10sXG4gICAgICAgICdDVUJFIEs4R1QgQic6IFsnQ3ViZScsICdLOEdUIEInLCAndGFibGV0J10sXG4gICAgICAgICdLOEdUIEMnOiBbJ0N1YmUnLCAnSzhHVCBDJywgJ3RhYmxldCddLFxuICAgICAgICAnSzhHVCBIJzogWydDdWJlJywgJ0s4R1QgSCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NVQkUgSzhHVCBIJzogWydDdWJlJywgJ0s4R1QgSCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0s4R1QgVyc6IFsnQ3ViZScsICdLOEdUIFcnLCAndGFibGV0J10sXG4gICAgICAgICdDVUJFIFU4R1QnOiBbJ0N1YmUnLCAnVThHVCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NVQkUgVTlHVCc6IFsnQ3ViZScsICdVOUdUJywgJ3RhYmxldCddLFxuICAgICAgICAnQ1VCRSBVOUdUIDInOiBbJ0N1YmUnLCAnVTlHVCAyJywgJ3RhYmxldCddLFxuICAgICAgICAnQ3ViZSBVOUdUMic6IFsnQ3ViZScsICdVOUdUIDInLCAndGFibGV0J10sXG4gICAgICAgICdVOUdUJzogWydDdWJlJywgJ1U5R1QnLCAndGFibGV0J10sXG4gICAgICAgICdVOUdUMiBGcm9tIG1vYWdlLmNvbSc6IFsnQ3ViZScsICdVOUdUIDInLCAndGFibGV0J10sXG4gICAgICAgICdOOTAgRnJvbSBtb2FnZS5jb20nOiBbJ0N1YmUnLCAnVTlHVCAyJywgJ3RhYmxldCddLFxuICAgICAgICAnVTlHVCBTJzogWydDdWJlJywgJ1U5R1QgUycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1U5R1QgUyBBJzogWydDdWJlJywgJ1U5R1QgU0EnLCAndGFibGV0J10sXG4gICAgICAgICdVOUdUUyBBJzogWydDdWJlJywgJ1U5R1QgU0EnLCAndGFibGV0J10sXG4gICAgICAgICdVMTBHVCAyJzogWydDdWJlJywgJ1UxMEdUIDInLCAndGFibGV0J10sXG4gICAgICAgICdVMTBHVCBTJzogWydDdWJlJywgJ1UxMEdUIFMnLCAndGFibGV0J10sXG4gICAgICAgICdVMzBHVC1IJzogWydDdWJlJywgJ1UzMEdUIEgnLCAndGFibGV0J10sXG4gICAgICAgICdDVUJFIFE3UFJPJzogWydDdWJlJywgJ1E3IFBybycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0NVQkUgUTdQUk8gSic6IFsnQ3ViZScsICdRNyBQcm8nLCAndGFibGV0J10sXG4gICAgICAgICdDeWRsZSBNNyAodjAwMDUuMDQuMDMuMTIua28pJzogWydDeWRsZScsICdNNyBNdWx0aVBBRCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgQWVybyc6IFsnRGVsbCcsICdBZXJvJ10sXG4gICAgICAgICdEZWxsIE0wMU0nOiBbJ0RlbGwnLCAnTWluaSA1JywgJ3RhYmxldCddLFxuICAgICAgICAnRGVsbCBTdHJlYWsnOiBbJ0RlbGwnLCAnU3RyZWFrJywgJ3RhYmxldCddLFxuICAgICAgICAnMDAxREwnOiBbJ0RlbGwnLCAnU3RyZWFrJywgJ3RhYmxldCddLFxuICAgICAgICAnMTAxREwnOiBbJ0RlbGwnLCAnU3RyZWFrIFBybycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dTMDEnOiBbJ0RlbGwnLCAnU3RyZWFrIFBybycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgU3RyZWFrIFBybyc6IFsnRGVsbCcsICdTdHJlYWsgUHJvJywgJ3RhYmxldCddLFxuICAgICAgICAnc3RyZWFrNyc6IFsnRGVsbCcsICdTdHJlYWsgNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgU3RyZWFrIDcnOiBbJ0RlbGwnLCAnU3RyZWFrIDcnLCAndGFibGV0J10sXG4gICAgICAgICdEZWxsIFN0cmVhayAxMCBQcm8nOiBbJ0RlbGwnLCAnU3RyZWFrIDEwIFBybycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgVjA0Qic6IFsnRGVsbCcsICdTdHJlYWsgVjA0QicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RlbGwgVmVudWUnOiBbJ0RlbGwnLCAnVmVudWUnXSxcbiAgICAgICAgJ0RlbGwgWENEMzUnOiBbJ0RlbGwnLCAnWENEMzUnXSxcbiAgICAgICAgJ1hDRDM1JzogWydEZWxsJywgJ1hDRDM1J10sXG4gICAgICAgICdpRHg3JzogWydEaWdtYScsICdpRHg3JywgJ3RhYmxldCddLFxuICAgICAgICAnaUR4MTAnOiBbJ0RpZ21hJywgJ2lEeDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnaUR4MTAgM0cnOiBbJ0RpZ21hJywgJ2lEeDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnRE0wMDlTSCc6IFsnRGlzbmV5IE1vYmlsZScsICdETTAwOVNIJ10sXG4gICAgICAgICdETTAxMFNIJzogWydEaXNuZXkgTW9iaWxlJywgJ0RNMDEwU0gnXSxcbiAgICAgICAgJ0RNMDEyU0gnOiBbJ0Rpc25leSBNb2JpbGUnLCAnRE0wMTJTSCddLFxuICAgICAgICAnRi0wOEQnOiBbJ0Rpc25leSBNb2JpbGUnLCAnRi0wOEQnXSxcbiAgICAgICAgJ1AtMDVEJzogWydEaXNuZXkgTW9iaWxlJywgJ1AtMDVEJ10sXG4gICAgICAgICdUYWJsZXQtUDI3JzogWydEcmFjb1RlaycsICdQMjcgVGFibGV0JywgJ3RhYmxldCddLFxuICAgICAgICAnZWRnZWpyJzogWydFblRvdXJhZ2UnLCAnUG9ja2V0IGVER2UnLCAndGFibGV0J10sXG4gICAgICAgICdsOTdEJzogWydFUGFkJywgJ2w5N0QnLCAndGFibGV0J10sXG4gICAgICAgICdNNDMwMSc6IFsnRXN0b24nLCAnTUlEIE00MzAxJywgJ21lZGlhJ10sXG4gICAgICAgICdQMTBBTic6IFsnRXhwZXInLCAnRWFzeXBhZCBQMTBBTicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0ZJSC1GMFgnOiBbJ0ZJSCcsICdGMFgnXSxcbiAgICAgICAgJ0ZseSBJUTI2MCc6IFsnRmx5JywgJ0lRMjYwIEJsYWNrQmlyZCddLFxuICAgICAgICAnSVNXMTFGJzogWydGdWppdHN1JywgJ0Fycm93cyBaJ10sXG4gICAgICAgICdJU1cxM0YnOiBbJ0Z1aml0c3UnLCAnQXJyb3dzIFonXSxcbiAgICAgICAgJ0lTMTJGJzogWydGdWppdHN1JywgJ0Fycm93cyBFUyddLFxuICAgICAgICAnRi0wMUQnOiBbJ0Z1aml0c3UnLCAnQXJyb3dzIFRhYiBMVEUnLCAndGFibGV0J10sXG4gICAgICAgICdGLTAzRCc6IFsnRnVqaXRzdScsICdBcnJvd3MgS2lzcyddLFxuICAgICAgICAnRi0wNUQnOiBbJ0Z1aml0c3UnLCAnQXJyb3dzIFggTFRFJ10sXG4gICAgICAgICdGLTA3RCc6IFsnRnVqaXRzdScsICdBcnJvd3MgXFx1MDBjM1xcdWZmZmRcXHUwMGMyXFx1MDBiYyddLFxuICAgICAgICAnRi0xMEQnOiBbJ0Z1aml0c3UnLCAnQXJyb3dzIFggRi0xMEQnXSxcbiAgICAgICAgJ0YtMTJDJzogWydGdWppdHN1JywgJ0dsb2JldHJvdHRlciddLFxuICAgICAgICAnZjEyYXJjJzogWydGdWppdHN1JywgJ0YxMmFyYyddLFxuICAgICAgICAnTTUzMic6IFsnRnVqaXRzdScsICdTdHlsaXN0aWMgTTUzMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dhcm1pbmZvbmUnOiBbJ0dhcm1pbi1Bc3VzJywgJ0dhcm1pbmZvbmUnXSxcbiAgICAgICAgJ0dhcm1pbi1Bc3VzIEExMCc6IFsnR2FybWluLUFzdXMnLCAnTnV2aWZvbmUgQTEwJ10sXG4gICAgICAgICdHYXJtaW4tQXN1cyBBNTAnOiBbJ0dhcm1pbi1Bc3VzJywgJ051dmlmb25lIEE1MCddLFxuICAgICAgICAnVFBBNjBXJzogWydHYXRld2F5JywgJ1RQQTYwVycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dlZWtzcGhvbmUgWkVSTyc6IFsnR2Vla3NwaG9uZScsICdaRVJPJ10sXG4gICAgICAgICdnZW1laSBHMic6IFsnR2VtZWknLCAnRzInLCAndGFibGV0J10sXG4gICAgICAgICdHZW1laSBHMic6IFsnR2VtZWknLCAnRzInLCAndGFibGV0J10sXG4gICAgICAgICdnZW1laSBHMyc6IFsnR2VtZWknLCAnRzMnLCAndGFibGV0J10sXG4gICAgICAgICdHZW1laSBHOSc6IFsnR2VtZWknLCAnRzknLCAndGFibGV0J10sXG4gICAgICAgICdHU21hcnQgRzEzMTdEJzogWydHaWdhYnl0ZScsICdHU21hcnQgRzEzMTdEJ10sXG4gICAgICAgICdHaWdhYnl0ZSBUQjEwMCc6IFsnR2lnYWJ5dGUnLCAnVEIxMDAnLCAndGFibGV0J10sXG4gICAgICAgICdHTjEwMCc6IFsnR2lvbmVlJywgJ0dOMTAwJ10sXG4gICAgICAgICdHTjEwNSc6IFsnR2lvbmVlJywgJ0dOMTA1J10sXG4gICAgICAgICdHTjEwNic6IFsnR2lvbmVlJywgJ0dOMTA2J10sXG4gICAgICAgICdHTjIwMCc6IFsnR2lvbmVlJywgJ0dOMjAwJ10sXG4gICAgICAgICdHTjIwNSc6IFsnR2lvbmVlJywgJ0dOMjA1J10sXG4gICAgICAgICdHTjcwMFcnOiBbJ0dpb25lZScsICdHTjcwMFcnXSxcbiAgICAgICAgJ0dONzA4Vyc6IFsnR2lvbmVlJywgJ0dONzA4VyddLFxuICAgICAgICAnR29vZ2xlIElvbic6IFsnR29vZ2xlJywgJ0lvbiddLFxuICAgICAgICAnTmV4dXMgT25lJzogWydHb29nbGUnLCAnTmV4dXMgT25lJ10sXG4gICAgICAgICdOZXh1c09uZSc6IFsnR29vZ2xlJywgJ05leHVzIE9uZSddLFxuICAgICAgICAnSFRDIE5leHVzIE9uZSc6IFsnR29vZ2xlJywgJ05leHVzIE9uZSddLFxuICAgICAgICAnTmV4dXMgUyc6IFsnR29vZ2xlJywgJ05leHVzIFMnXSxcbiAgICAgICAgJ0dvb2dsZSBOZXh1cyBTJzogWydHb29nbGUnLCAnTmV4dXMgUyddLFxuICAgICAgICAnTmV4dXMgUyA0Ryc6IFsnR29vZ2xlJywgJ05leHVzIFMgNEcnXSxcbiAgICAgICAgJ0Rvb2RlcmJ1dHQtNC4wLjMtdjEnOiBbJ0dvb2dsZScsICdOZXh1cyBTIDRHJ10sXG4gICAgICAgICdOZXh1cyA3JzogWydHb29nbGUnLCAnTmV4dXMgNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hhaWVyIEhXLVc5MTAnOiBbJ0hhaWVyJywgJ0hXLVc5MTAnXSxcbiAgICAgICAgJ1NOMTBUMSc6IFsnSEFOTnNwcmVlJywgJ0hBTk5TcGFkIFNOMTBUMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NOMTBUMic6IFsnSEFOTnNwcmVlJywgJ0hBTk5TcGFkIFNOMTBUMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hhbm5zQ29tYic6IFsnSEFOTnNwcmVlJywgJ0hBTk5TcGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnWDEnOiBbJ0hDTCcsICdNRSBYMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01JRCBTZXJhaWxzJzogWydIZXJvdGFiJywgJ0M4JywgJ3RhYmxldCddLFxuICAgICAgICAnTUlEIFNlcmlhbHMnOiBbJ0hlcm90YWInLCAnQzgnLCAndGFibGV0J10sXG4gICAgICAgICdDT1NNTyBEVU8nOiBbJ0hpc2NyZWVuJywgJ0Nvc21vIERVTycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hTLVU4JzogWydIaXNlbnNlJywgJ1U4J10sXG4gICAgICAgICdIUy1UOTInOiBbJ0hpc2Vuc2UnLCAnVDkyJ10sXG4gICAgICAgICdIUy1FODYwJzogWydIaXNlbnNlJywgJ0U4NjAnXSxcbiAgICAgICAgJ0hTLUU5MTAnOiBbJ0hpc2Vuc2UnLCAnRTkxMCddLFxuICAgICAgICAnSFMtRTkyNic6IFsnSGlzZW5zZScsICdFOTI2J10sXG5cbiAgICAgICAgJ0hTLUVHOTAwJzogWydIaXNlbnNlJywgJ0VHOTAwJ10sXG4gICAgICAgICdIUy1FVDkxOSc6IFsnSGlzZW5zZScsICdFVDkxOSddLFxuICAgICAgICAnRUc5NjhCJzogWydIaXNlbnNlJywgJ0VHOTY4QiddLFxuICAgICAgICAnSEtQSE9ORSBIOC0zRyc6IFsnSEtQaG9uZScsICdIOCAzRyddLFxuICAgICAgICAnSE9TSU4gVTInOiBbJ0hvc2luJywgJ1UyJ10sXG4gICAgICAgICdUb3VjaHBhZCc6IFsnSFAnLCAnVG91Y2hQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdIUCBUb3VjaHBhZCc6IFsnSFAnLCAnVG91Y2hQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdjbSB0ZW5kZXJsb2luJzogWydIUCcsICdUb3VjaFBhZCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ2Fva3AgdGVuZGVybG9pbic6IFsnSFAnLCAnVG91Y2hQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdIVEMgQW1hemUgNEcnOiBbJ0hUQycsICdBbWF6ZSA0RyddLFxuICAgICAgICAnSFRDIFJ1YnknOiBbJ0hUQycsICdBbWF6ZSA0RyddLFxuICAgICAgICAnSFRDIEFtYXplIDRHKFJ1YnkpJzogWydIVEMnLCAnQW1hemUgNEcnXSxcbiAgICAgICAgJ0FtYXplIDRHJzogWydIVEMnLCAnQW1hemUgNEcnXSxcbiAgICAgICAgJ0hUQyBBcmlhJzogWydIVEMnLCAnQXJpYSddLFxuICAgICAgICAnSFRDIEFyaWEgQTYzODAnOiBbJ0hUQycsICdBcmlhJ10sXG4gICAgICAgICdIVEMgTGliZXJ0eSBBNjM4MCc6IFsnSFRDJywgJ0FyaWEnXSxcbiAgICAgICAgJ0hUQyBMaWJlcnR5JzogWydIVEMnLCAnQXJpYSddLFxuICAgICAgICAnSFRDIEE2MzY2JzogWydIVEMnLCAnQXJpYSddLFxuICAgICAgICAnSFRDIEJlZSc6IFsnSFRDJywgJ0JlZSddLFxuICAgICAgICAnSFRDIENoYUNoYSc6IFsnSFRDJywgJ0NoYUNoYSddLFxuICAgICAgICAnSFRDIENoYUNoYSBBODEwZSc6IFsnSFRDJywgJ0NoYUNoYSddLFxuICAgICAgICAnSFRDIENoYUNoYUNoYSBBODEwZSc6IFsnSFRDJywgJ0NoYUNoYSddLFxuICAgICAgICAnSFRDIEE4MTBlJzogWydIVEMnLCAnQ2hhQ2hhJ10sXG4gICAgICAgICdIVEMgQTkxODgnOiBbJ0hUQycsICdUaWFueGknXSxcbiAgICAgICAgJ0hUQyBCcmF2byc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBBODE4MSc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBBODE4Myc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBCZWF0cyBBODE4MSc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBDRE1BJzogWydIVEMnLCAnRGVzaXJlJ10sXG4gICAgICAgICdIVEMgRGVzaXJlIFNNUyc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBTLk0uUyc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnSFRDIERlc2lyZSBDJzogWydIVEMnLCAnRGVzaXJlIEMnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmVIRCc6IFsnSFRDJywgJ0Rlc2lyZSBIRCddLFxuICAgICAgICAnSFRDIERlc2lyZUhEIEE5MTkxJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdIVEMgRGVzaXJlSEQgQTkxOTInOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgSEQgQTkxOTEnOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0hUQyBBOTE5MSc6IFsnSFRDJywgJ0Rlc2lyZSBIRCddLFxuICAgICAgICAnSFRDIEE5MTkxIGZvciBBVCZUJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdIVEMgQTkxOTInOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgSEQnOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgSEQgd2l0aCBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ0Rlc2lyZSBIRCddLFxuICAgICAgICAnSFRDIERlc2lyZSBTJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmVTJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmVzUyc6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdIVEMgRGVzaXJlUyBTNTEwZSc6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdIVEMgRGVzaXJlUyBTNTEwYic6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdIVEMgRGVzaXJlIFMgUzUxMGUnOiBbJ0hUQycsICdEZXNpcmUgUyddLFxuICAgICAgICAnSFRDIFM1MTBlJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgU2FnYSc6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdIVEMgRGVzaXJlIFYnOiBbJ0hUQycsICdEZXNpcmUgViddLFxuICAgICAgICAnSFRDIFQzMjh3JzogWydIVEMnLCAnRGVzaXJlIFYnXSxcbiAgICAgICAgJ0hUQyBEZXNpcmUgVkMnOiBbJ0hUQycsICdEZXNpcmUgVkMnXSxcbiAgICAgICAgJ0hUQyBUMzI4ZCc6IFsnSFRDJywgJ0Rlc2lyZSBWQyddLFxuICAgICAgICAnSFRDIFQzMjh0JzogWydIVEMnLCAnRGVzaXJlIFZUJ10sXG4gICAgICAgICdIVEMgRGVzaXJlIFonOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnSFRDIERlc2lyZVonOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnSFRDIERlc2lyZVogQTcyNzInOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnSFRDIERlc2lyZSBaIEE3MjcyJzogWydIVEMnLCAnRGVzaXJlIFonXSxcbiAgICAgICAgJ0hUQyBWaXNpb24nOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnSFRDIEE3Mjc1JzogWydIVEMnLCAnRGVzaXJlIFonXSxcbiAgICAgICAgJ0hUQyBEcmVhbSc6IFsnSFRDJywgJ0RyZWFtJ10sXG4gICAgICAgICdIVEMgUzcxMGQnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlIDInXSxcbiAgICAgICAgJ0hUQyBJbmNyZWRpYmxlIDInOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlIDInXSxcbiAgICAgICAgJ0hUQyBYNTE1ZCc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIFg1MTVtJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdIVEMgWDUxNUMnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFdm8gM0QnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFVk8gM0QnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFVk8gM0QgR1NNJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdIVEMgRVZPIDNEIFg1MTVhJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdIVEMgRVZPIDNEIEdTTSBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIEVWTyAzRCBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIEVWTyAzRCBYNTE1TSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIEVWTzNEIFg1MTVhJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdIVEMgRVZPM0QgWDUxNW0nOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFdm8gM0QgWDUxNW0nOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0hUQyBFdm8gM0Qgd2l0aCBCZWF0cyBBdWRpbyBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnSFRDIEV2byA0Ryc6IFsnSFRDJywgJ0VWTyA0RyddLFxuICAgICAgICAnSFRDIEVWTyA0Ryc6IFsnSFRDJywgJ0VWTyA0RyddLFxuICAgICAgICAnSFRDIFg1MTVFJzogWydIVEMnLCAnRVZPIDRHKyddLFxuICAgICAgICAnSFRDIEVWTyA0RysgRm9yIFNwcmludCc6IFsnSFRDJywgJ0VWTyA0RysnXSxcbiAgICAgICAgJ0hUQyBFVk8gNEcrKyBGb3IgU3ByaW50JzogWydIVEMnLCAnRVZPIDRHKyddLFxuICAgICAgICAnSFRDIEM3MTVjJzogWydIVEMnLCAnRVZPIERlc2lnbiA0RyddLFxuICAgICAgICAnSFRDIERlc2lnbiA0Ryc6IFsnSFRDJywgJ0VWTyBEZXNpZ24gNEcnXSxcbiAgICAgICAgJ0hUQyBFVk8gZGVzaWduIDRHJzogWydIVEMnLCAnRVZPIERlc2lnbiA0RyddLFxuICAgICAgICAnSFRDIEVWTyBEZXNpZ24gNEcnOiBbJ0hUQycsICdFVk8gRGVzaWduIDRHJ10sXG4gICAgICAgICdIVEMgRXZvIFNoaWZ0JzogWydIVEMnLCAnRVZPIFNoaWZ0J10sXG4gICAgICAgICdIVEMgRVZPIFNoaWZ0IDRHJzogWydIVEMnLCAnRVZPIFNoaWZ0J10sXG4gICAgICAgICdIVEMgQTMxMGUnOiBbJ0hUQycsICdFeHBsb3JlciddLFxuICAgICAgICAnSFRDIEV4cGxvcmVyJzogWydIVEMnLCAnRXhwbG9yZXInXSxcbiAgICAgICAgJ0hUQyBFeHBsb3JlciBBMzEwYic6IFsnSFRDJywgJ0V4cGxvcmVyJ10sXG4gICAgICAgICdIVEMgRXhwbG9yZXIgQTMxMGUnOiBbJ0hUQycsICdFeHBsb3JlciddLFxuICAgICAgICAnSFRDIFA1MTBlJzogWydIVEMnLCAnRmx5ZXInLCAndGFibGV0J10sXG4gICAgICAgICdIVEMgRmx5ZXInOiBbJ0hUQycsICdGbHllcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hUQyBGbHllciBQNTEwZSc6IFsnSFRDJywgJ0ZseWVyJywgJ3RhYmxldCddLFxuICAgICAgICAnSFRDIEZseWVyIFA1MTInOiBbJ0hUQycsICdGbHllcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hUQyBGbHllciBQNTEyIE5BJzogWydIVEMnLCAnRmx5ZXInLCAndGFibGV0J10sXG4gICAgICAgICdIVEMgUDUxNUUnOiBbJ0hUQycsICdGbHllciA0RycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hUQyBHcmF0aWEgQTYzODAnOiBbJ0hUQycsICdHcmF0aWEnXSxcbiAgICAgICAgJ0hUQyBIRCc6IFsnSFRDJywgJ0hEJ10sXG4gICAgICAgICdIVEMgSEQyJzogWydIVEMnLCAnSEQyJ10sXG4gICAgICAgICdIVEMgSEQyIFQ4NTg1JzogWydIVEMnLCAnSEQyJ10sXG4gICAgICAgICdIVEMgSEQyKExlbyknOiBbJ0hUQycsICdIRDInXSxcbiAgICAgICAgJ0hUQyBIRDcnOiBbJ0hUQycsICdIRDcnXSxcbiAgICAgICAgJ0hUQyBUOTI5OSsnOiBbJ0hUQycsICdIRDcnXSxcbiAgICAgICAgJ0hUQyBIRDcgZm9yIFNwcmludCc6IFsnSFRDJywgJ0hENyddLFxuICAgICAgICAnSFRDIEhENyA0RyBUOTI5OSBGb3IgQVQmVCc6IFsnSFRDJywgJ0hENyddLFxuICAgICAgICAnSFRDIEhENyA0RyBUOTI5OSsgRm9yIEFUJlQnOiBbJ0hUQycsICdIRDcnXSxcbiAgICAgICAgJ0hUQyBUOTI5OSsgRm9yIEFUJlQnOiBbJ0hUQycsICdIRDcnXSxcbiAgICAgICAgJ0hUQyBIRDdTIFQ5Mzk5Kyc6IFsnSFRDJywgJ0hEN3MnXSxcbiAgICAgICAgJ0hUQyBIRDdTIFQ5ODk5Kyc6IFsnSFRDJywgJ0hEN3MnXSxcbiAgICAgICAgJ0hUQyBUOTg5OSsgRm9yIEFUJlQnOiBbJ0hUQycsICdIRDdzJ10sXG4gICAgICAgICdWaXRNb2QgRXh0cmFMaXRlIDEuNi41LmZ1bGxvZGV4IGZvciBIVEMgSEQ3IFBybyc6IFsnSFRDJywgJ0hENyBQcm8nXSxcbiAgICAgICAgJ0hUQyBIZXJvJzogWydIVEMnLCAnSGVybyddLFxuICAgICAgICAnSFRDIEhFUk8nOiBbJ0hUQycsICdIZXJvJ10sXG4gICAgICAgICdIVEMgSGVybyBDRE1BJzogWydIVEMnLCAnSGVybyddLFxuICAgICAgICAnSFRDIEhFUk8gQ0RNQSc6IFsnSFRDJywgJ0hlcm8nXSxcbiAgICAgICAgJ0hUQyBIRVJPMjAwJzogWydIVEMnLCAnSGVybyAyMDAnXSxcbiAgICAgICAgJ0hUQyBIZXJvIFMnOiBbJ0hUQycsICdIZXJvIFMnXSxcbiAgICAgICAgJ0hUQyBJTUFHSU8nOiBbJ0hUQycsICdJbWFnaW8nXSxcbiAgICAgICAgJ0hUQyBJbmNyZWRpYmxlJzogWydIVEMnLCAnSW5jcmVkaWJsZSddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGUgUzcxMEUnOiBbJ0hUQycsICdJbmNyZWRpYmxlIFMnXSxcbiAgICAgICAgJ0hUQyBTNzEwZSc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGUgUyc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGUgUyBTNzEwZSc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGUgUyBzNzEwZSc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSFRDIEluY3JlZGlibGVTIFM3MTBlJzogWydIVEMnLCAnSW5jcmVkaWJsZSBTJ10sXG4gICAgICAgICdIVEMgSW5jcmVkaWJsZSBTIHdpdGggQmVhdHMgQXVkaW8nOiBbJ0hUQycsICdJbmNyZWRpYmxlIFMnXSxcbiAgICAgICAgJ0hUQyBWaXZvJzogWydIVEMnLCAnSW5jcmVkaWJsZSBTJ10sXG4gICAgICAgICdIVEMgSW5ub3ZhdGlvbic6IFsnSFRDJywgJ0lubm92YXRpb24nXSxcbiAgICAgICAgJ0hUQyBJbnNwaXJlIDRHJzogWydIVEMnLCAnSW5zcGlyZSA0RyddLFxuICAgICAgICAnSFRDIEhENyBJbnNwaXJlIDRHIEZvciBWb2RhZm9uZSc6IFsnSFRDJywgJ0luc3BpcmUgNEcnXSxcbiAgICAgICAgJ0hUQyBQNzE1YSc6IFsnSFRDJywgJ0pldHN0cmVhbScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0hUQyBMZWdlbmQnOiBbJ0hUQycsICdMZWdlbmQnXSxcbiAgICAgICAgJ0hUQyBNYWdpYyc6IFsnSFRDJywgJ01hZ2ljJ10sXG4gICAgICAgICdIVEMgU2FwcGhpcmUnOiBbJ0hUQycsICdNYWdpYyddLFxuICAgICAgICAnSFRDIExleGlrb24nOiBbJ0hUQycsICdNZXJnZSddLFxuICAgICAgICAnSFRDIE9uZSBTJzogWydIVEMnLCAnT25lIFMnXSxcbiAgICAgICAgJ0hUQyBaNTIwZSc6IFsnSFRDJywgJ09uZSBTJ10sXG4gICAgICAgICdIVEMgT25lIFYnOiBbJ0hUQycsICdPbmUgViddLFxuICAgICAgICAnSFRDIFQzMjBlJzogWydIVEMnLCAnT25lIFYnXSxcbiAgICAgICAgJ0hUQyBPbmUgWCc6IFsnSFRDJywgJ09uZSBYJ10sXG4gICAgICAgICdIVEMgUzcyMGUnOiBbJ0hUQycsICdPbmUgWCddLFxuICAgICAgICAnSFRDIEVuZGVhdm91ci1MUyc6IFsnSFRDJywgJ09uZSBYJ10sXG4gICAgICAgICdIVEMgT25lIFhMJzogWydIVEMnLCAnT25lIFhMJ10sXG4gICAgICAgICdIVEMgWDcxMGEnOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBSYWlkZXInOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBSYWlkZXIgWDcxMGUnOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBSYWlkZXIgWDcxMHMnOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBSYWlkZXIgNEcgWDcxMGUnOiBbJ0hUQycsICdSYWlkZXIgNEcnXSxcbiAgICAgICAgJ0hUQyBQSDM5MTAwJzogWydIVEMnLCAnUmFpZGVyIDRHJ10sXG4gICAgICAgICdIVEMgSG9saWRheSc6IFsnSFRDJywgJ1JhaWRlciA0RyddLFxuICAgICAgICAnSFRDIFZlbG9jaXR5IDRHIFg3MTBzJzogWydIVEMnLCAnUmFpZGVyIDRHJ10sXG4gICAgICAgICdIVEMgUmV6b3VuZCc6IFsnSFRDJywgJ1Jlem91bmQnXSxcbiAgICAgICAgJ0hUQyBSaHltZSBTNTEwYic6IFsnSFRDJywgJ1JoeW1lJ10sXG4gICAgICAgICdIVEMgUzUxMGInOiBbJ0hUQycsICdSaHltZSddLFxuICAgICAgICAnSFRDIEJsaXNzJzogWydIVEMnLCAnUmh5bWUnXSxcbiAgICAgICAgJ0hUQyBCbGlzcyBTNTEwYic6IFsnSFRDJywgJ1JoeW1lJ10sXG4gICAgICAgICdIVEMgU2Fsc2EgQzUxMGUnOiBbJ0hUQycsICdTYWxzYSddLFxuICAgICAgICAnSFRDIEM1MTBlJzogWydIVEMnLCAnU2Fsc2EnXSxcbiAgICAgICAgJ0hUQyBaNzEwYSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFo3MTBlJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgWjcxMHQnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24nOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWjcxMCc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwYSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwRSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwZSBGb3IgQVQmVCc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBaNzEwZSB3aXRoIEJlYXRzIEF1ZGlvJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIHdpdGggQmVhdHMgQXVkaW8gWjcxMGUnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gd2l0aCBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBUYXN0ZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFB5cmFtaWQnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBQeXJhbWlkIFo3MTBhJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgUHlyYW1pZCBaNzEwZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiA0Ryc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiA0RyB3aXRoIEJlYXRzIEF1ZGlvJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIEcxNCc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBHMTQgZm9yIEFUJlQnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ0hUQyBHMTQgc2Vuc2F0aW9uJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdIVEMgWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb25YRSBCZWF0cyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvblhFIEJlYXRzIFo3MTVhJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uWEUgQmVhdHMgWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWEUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWEUgWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb25YRSBaNzE1ZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBYRSBCZWF0cyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvblhFIHdpdGggQmVhdHMgQXVkaW8nOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWEUgd2l0aCBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBYRSB3aXRoIEJlYXRzIEF1ZGlvIFo3MTVhJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIEp1cmVkcm9pZCBYRSBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiBYRSB3aXRoIEJlYXRzIEF1ZGlvIFo3MTVlJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIFhFIFdpdGggQmVhdHMgQXVkaW8gWjcxNWUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEUnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gNEcgWEUgd2l0aCBCZWF0cyBBdWRpbyc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYRSddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvbiB3aXRoIEJlYXRzIEF1ZGlvIFo3MTVlJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdIVEMgWDMxNUUnOiBbJ0hUQycsICdTZW5zYXRpb24gWEwnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb25YTCBCZWF0cyBYMzE1Yic6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnSFRDIFNlbnNhdGlvblhMIEJlYXRzIFgzMTVlJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhMJ10sXG4gICAgICAgICdIVEMgU2Vuc2F0aW9uIFhMIHdpdGggQmVhdHMgQXVkaW8gWDMxNWInOiBbJ0hUQycsICdTZW5zYXRpb24gWEwnXSxcbiAgICAgICAgJ0hUQyBTZW5zYXRpb24gWEwgd2l0aCBCZWF0cyBBdWRpbyBYMzE1ZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnSFRDIFJ1bm55bWVkZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnSFRDIEcyMSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnSFRDIFBIMDYxMzAnOiBbJ0hUQycsICdTdGF0dXMnXSxcbiAgICAgICAgJ0hUQyBTdGF0dXMnOiBbJ0hUQycsICdTdGF0dXMnXSxcbiAgICAgICAgJ0hUQyBUYXR0b28nOiBbJ0hUQycsICdUYXR0b28nXSxcbiAgICAgICAgJ0hUQyBUQVRUT08gQTMyODgnOiBbJ0hUQycsICdUYXR0b28nXSxcbiAgICAgICAgJ0hUQyBjbGljayc6IFsnSFRDJywgJ1RhdHRvbyddLFxuICAgICAgICAnSFRDIFgzMTBlJzogWydIVEMnLCAnVGl0YW4nXSxcbiAgICAgICAgJ0hUQyBUNzM3Myc6IFsnSFRDJywgJ1RvdWNoIFBybyBJSSddLFxuICAgICAgICAnSFRDIFRodW5kZXJCb2x0JzogWydIVEMnLCAnVGh1bmRlckJvbHQnXSxcbiAgICAgICAgJ0hUQyBNZWNoYSc6IFsnSFRDJywgJ1RodW5kZXJCb2x0J10sXG4gICAgICAgICdIVEMgVmVsb2NpdHkgNEcnOiBbJ0hUQycsICdWZWxvY2l0eSA0RyddLFxuICAgICAgICAnSFRDIFdpbGRmaXJlJzogWydIVEMnLCAnV2lsZGZpcmUnXSxcbiAgICAgICAgJ0hUQyBXaWxkZmlyZSBBMzMzMyc6IFsnSFRDJywgJ1dpbGRmaXJlJ10sXG4gICAgICAgICdIVEMgQTMzNjYnOiBbJ0hUQycsICdXaWxkZmlyZSddLFxuICAgICAgICAnSFRDIEEzMzgwJzogWydIVEMnLCAnV2lsZGZpcmUnXSxcbiAgICAgICAgJ0hUQyBXaWxkZmlyZVMnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdIVEMgV2lsZGZpcmUgUyc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0h0YyBXaWxkZmlyZSBzJzogWydIVEMnLCAnV2lsZGZpcmUgUyddLFxuICAgICAgICAnSFRDIFdpbGRmaXJlIFMgQTUxMGUnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdIVEMgV2lsZGZpcmUgUyBBNTEwYic6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBXaWxkZmlyZVMgQTUxMGUnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdIVEMgV2lsZGZpcmVTIEE1MTBiJzogWydIVEMnLCAnV2lsZGZpcmUgUyddLFxuICAgICAgICAnaHRjIHdpbGRmaXJlIHMgYTUxMGUnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdIVEMgV2lsZGZpcmUgUyBBNTE1Yyc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBBNTEwYSc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBBNTEwZSc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQyBBNTEwYyc6IFsnSFRDJywgJ1dpbGRmaXJlIFMnXSxcbiAgICAgICAgJ0hUQ1gwNkhUJzogWydIVEMnLCAnRGVzaXJlJ10sXG4gICAgICAgICdIVEMgQTYzOTAnOiBbJ0hUQycsICdBNjM5MCddLFxuICAgICAgICAnSFRDIEE4MTgwJzogWydIVEMnLCAnQTgxODAnXSxcbiAgICAgICAgJ0hUQyBQRzc2Mic6IFsnSFRDJywgJ1BHNzYyJ10sXG4gICAgICAgICdIVEMgUzcxNWUnOiBbJ0hUQycsICdTNzE1ZSddLFxuICAgICAgICAnSFRDIFM3MjB0JzogWydIVEMnLCAnUzcyMHQnXSxcbiAgICAgICAgJ0hUQyBaNTEwZCc6IFsnSFRDJywgJ1o1MTBkJ10sXG4gICAgICAgICdIVEMgWjU2MGUnOiBbJ0hUQycsICdaNTYwZSddLFxuICAgICAgICAnSFRDIFZMRSBVJzogWydIVEMnLCAnT25lIFMnXSxcbiAgICAgICAgJ0hUQyBWTEUjVSc6IFsnSFRDJywgJ09uZSBTJ10sXG4gICAgICAgICdIVEMgVklFIFUnOiBbJ0hUQycsICdPbmUgUyddLFxuICAgICAgICAnSFRDIEVWQSBVTCc6IFsnSFRDJywgJ09uZSBWJ10sXG4gICAgICAgICdIVEMgRU5SIFUnOiBbJ0hUQycsICdPbmUgWCddLFxuICAgICAgICAnRU5SIFUnOiBbJ0hUQycsICdPbmUgWCddLFxuICAgICAgICAnRW5kZWF2b3JVJzogWydIVEMnLCAnT25lIFgnXSxcbiAgICAgICAgJ0xpYmVydHknOiBbJ0hUQycsICdBcmlhJ10sXG4gICAgICAgICdEZXNpcmUnOiBbJ0hUQycsICdEZXNpcmUnXSxcbiAgICAgICAgJ0Rlc2lyZSBBODE4MSc6IFsnSFRDJywgJ0Rlc2lyZSddLFxuICAgICAgICAnZGVzaXJlIGhkJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdEZXNpcmUgSEQnOiBbJ0hUQycsICdEZXNpcmUgSEQnXSxcbiAgICAgICAgJ0RlZGlyZSBIRCc6IFsnSFRDJywgJ0Rlc2lyZSBIRCddLFxuICAgICAgICAnRGVzaXJlIEhkIChhY2UpJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdEZXNpcmUgUyc6IFsnSFRDJywgJ0Rlc2lyZSBTJ10sXG4gICAgICAgICdEZXNpcmVTJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0Rlc2lyZSBTYWdhJzogWydIVEMnLCAnRGVzaXJlIFMnXSxcbiAgICAgICAgJ0Rlc2lyZSBaJzogWydIVEMnLCAnRGVzaXJlIFonXSxcbiAgICAgICAgJ0RyZWFtJzogWydIVEMnLCAnRHJlYW0nXSxcbiAgICAgICAgJ0Ryb2lkIEluY3JlZGlibGUnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlJ10sXG4gICAgICAgICdFVk8nOiBbJ0hUQycsICdFVk8nXSxcbiAgICAgICAgJ0V2byBIRDInOiBbJ0hUQycsICdFVk8gSEQnXSxcbiAgICAgICAgJ0V2byAzRCBCZWF0cyBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnRXZvIDNEIEdTTSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnRVZPIDNEIFg1MTVtJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdFVk8zRCBYNTE1bSc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnRXZvIDRHJzogWydIVEMnLCAnRVZPIDRHJ10sXG4gICAgICAgICdFVk8gNEcnOiBbJ0hUQycsICdFVk8gNEcnXSxcbiAgICAgICAgJ3Bob3Rvbic6IFsnSFRDJywgJ0hEIG1pbmknXSxcbiAgICAgICAgJ0dpbkRyZWFtXFwvR2luTWFnaWMnOiBbJ0hUQycsICdEcmVhbSddLFxuICAgICAgICAnSEQyJzogWydIVEMnLCAnSEQyJ10sXG4gICAgICAgICdIRDcgIFBybyc6IFsnSFRDJywgJ0hENyBQcm8nXSxcbiAgICAgICAgJ0hlcm8nOiBbJ0hUQycsICdIZXJvJ10sXG4gICAgICAgICdIRVJPIENETUEnOiBbJ0hUQycsICdIZXJvJ10sXG4gICAgICAgICdIRVJPMjAwJzogWydIVEMnLCAnSGVybyAyMDAnXSxcbiAgICAgICAgJ0luY3JlZGlibGUnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlJ10sXG4gICAgICAgICdJbmNyZWRpYmxlIDInOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlIDInXSxcbiAgICAgICAgJ0luY3JlZGlibGUgUyc6IFsnSFRDJywgJ0luY3JlZGlibGUgUyddLFxuICAgICAgICAnSW5jcmVkaWJsZVMgUzcxMGUnOiBbJ0hUQycsICdJbmNyZWRpYmxlIFMnXSxcbiAgICAgICAgJ0luY3JlZGlibGVTJzogWydIVEMnLCAnSW5jcmVkaWJsZSBTJ10sXG4gICAgICAgICdJbnNwaXJlIEhEJzogWydIVEMnLCAnSW5zcGlyZSA0RyddLFxuICAgICAgICAnSW5zcGlyZSA0Ryc6IFsnSFRDJywgJ0luc3BpcmUgNEcnXSxcbiAgICAgICAgJ0xlZ2VuZCc6IFsnSFRDJywgJ0xlZ2VuZCddLFxuICAgICAgICAnTmV4dXNIRDInOiBbJ0hUQycsICdIRDInXSxcbiAgICAgICAgJ05leHVzIEhEMic6IFsnSFRDJywgJ0hEMiddLFxuICAgICAgICAnRG9jb21vIEhULTAzQSc6IFsnSFRDJywgJ01hZ2ljJ10sXG4gICAgICAgICdNSVVJLnVzIFNlbnNhdGlvbiA0Ryc6IFsnSFRDJywgJ1NlbnNhdGlvbiA0RyddLFxuICAgICAgICAnU2lSRiBEcmVhbSc6IFsnSFRDJywgJ0RyZWFtJ10sXG4gICAgICAgICdQeXJhbWlkJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdTZW5zYXRpb24nOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ1NlbnNhdGlvbiBaNzEwZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnU2Vuc2F0aW9uIDRHJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdTZW5zYXRpb24gNGcnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ1RyaXBOaUNFIFB5cmFtaWQnOiBbJ0hUQycsICdTZW5zYXRpb24nXSxcbiAgICAgICAgJ1NlbnNhdGlvblhFIEJlYXRzIFo3MTVlJzogWydIVEMnLCAnU2Vuc2F0aW9uIFhFJ10sXG4gICAgICAgICdTZW5zYXRpb25YTCBCZWF0cyBYMzE1ZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiBYTCddLFxuICAgICAgICAnQ2xpY2snOiBbJ0hUQycsICdUYXR0b28nXSxcbiAgICAgICAgJ1dpbGRmaXJlJzogWydIVEMnLCAnV2lsZGZpcmUnXSxcbiAgICAgICAgJ1dpbGRmaXJlIFMnOiBbJ0hUQycsICdXaWxkZmlyZSBTJ10sXG4gICAgICAgICdXaWxkZmlyZSBTIEE1MTBlJzogWydIVEMnLCAnV2lsZGZpcmUgUyddLFxuICAgICAgICAnU3ByaW50IEFQWDUxNUNLVCc6IFsnSFRDJywgJ0VWTyAzRCddLFxuICAgICAgICAnU3ByaW50IEFQQTkyOTJLVCc6IFsnSFRDJywgJ0VWTyA0RyddLFxuICAgICAgICAnU3ByaW50IEFQQTczNzNLVCc6IFsnSFRDJywgJ0VWTyBTaGlmdCA0RyddLFxuICAgICAgICAnU3ByaW50IEFQQzcxNUNLVCc6IFsnSFRDJywgJ0VWTyBEZXNpZ24gNEcnXSxcbiAgICAgICAgJ0EzMzgwJzogWydIVEMnLCAnV2lsZGZpcmUnXSxcbiAgICAgICAgJ0E2Mjc3JzogWydIVEMnLCAnSGVybyddLFxuICAgICAgICAnYTcyNzInOiBbJ0hUQycsICdEZXNpcmUgWiddLFxuICAgICAgICAnQTcyNzIrKEhUQyBEZXNpcmVaKSc6IFsnSFRDJywgJ0Rlc2lyZSBaJ10sXG4gICAgICAgICdTMzFIVCc6IFsnSFRDJywgJ0FyaWEnXSxcbiAgICAgICAgJ1M3MTBkJzogWydIVEMnLCAnRHJvaWQgSW5jcmVkaWJsZSAyJ10sXG4gICAgICAgICdTNzEwRCc6IFsnSFRDJywgJ0Ryb2lkIEluY3JlZGlibGUgMiddLFxuICAgICAgICAnWDA2SFQnOiBbJ0hUQycsICdEZXNpcmUnXSxcbiAgICAgICAgJzAwMUhUJzogWydIVEMnLCAnRGVzaXJlIEhEJ10sXG4gICAgICAgICdYMzI1YSc6IFsnSFRDJywgJ09uZSBYJ10sXG4gICAgICAgICdaNTIwbSc6IFsnSFRDJywgJ09uZSBTJ10sXG4gICAgICAgICdaNzEwJzogWydIVEMnLCAnU2Vuc2F0aW9uJ10sXG4gICAgICAgICdaNzEwZSc6IFsnSFRDJywgJ1NlbnNhdGlvbiddLFxuICAgICAgICAnVDkxOTloJzogWydIVEMnLCAnVDkxOTloJ10sXG4gICAgICAgICdIVEMgUzYxMGQnOiBbJ0hUQycsICdTNjEwZCddLFxuICAgICAgICAnQURSNjIwMCc6IFsnSFRDJywgJ0Ryb2lkIEVyaXMnXSxcbiAgICAgICAgJ0FEUjYzMDAnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlJ10sXG4gICAgICAgICdBRFI2MzI1VlcnOiBbJ0hUQycsICdNZXJnZSddLFxuICAgICAgICAnQURSNjMzMFZXJzogWydIVEMnLCAnUmh5bWUnXSxcbiAgICAgICAgJ0FEUjYzNTAnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlIDInXSxcbiAgICAgICAgJ0FEUjY0MDBMJzogWydIVEMnLCAnVGh1bmRlcmJvbHQgNEcnXSxcbiAgICAgICAgJ0FEUjY0MDBMIDRHJzogWydIVEMnLCAnVGh1bmRlcmJvbHQgNEcnXSxcbiAgICAgICAgJ0FEUjY0MTBMVlcgNEcnOiBbJ0hUQycsICdGaXJlYmFsbCddLFxuICAgICAgICAnQURSNjQyNUxWVyc6IFsnSFRDJywgJ1Jlem91bmQnXSxcbiAgICAgICAgJ0FEUjY0MjVMVlcgNEcnOiBbJ0hUQycsICdSZXpvdW5kJ10sXG4gICAgICAgICdDb3F1ZXR0aXNoIFJlZCc6IFsnSFRDJywgJ1Jlem91bmQnXSxcbiAgICAgICAgJ1BCOTk0MDAnOiBbJ0hUQycsICdEcm9pZCBJbmNyZWRpYmxlJ10sXG4gICAgICAgICdwY2RhZHI2MzUwJzogWydIVEMnLCAnRHJvaWQgSW5jcmVkaWJsZSAyJ10sXG4gICAgICAgICdQQzM2MTAwJzogWydIVEMnLCAnRVZPIDRHJ10sXG4gICAgICAgICdQRzA2MTAwJzogWydIVEMnLCAnRVZPIFNoaWZ0IDRHJ10sXG4gICAgICAgICdQRzQxMjAwJzogWydIVEMnLCAnRVZPIFZpZXcgNEcnLCAndGFibGV0J10sXG4gICAgICAgICdQRzg2MTAwJzogWydIVEMnLCAnRVZPIDNEJ10sXG4gICAgICAgICdQRzg2MTAwMDAnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ1BINDQxMDAnOiBbJ0hUQycsICdFVk8gRGVzaWduIDRHJ10sXG4gICAgICAgICdQSjgzMTAwJzogWydIVEMnLCAnT25lIFgnXSxcbiAgICAgICAgJ0lTVzExSFQnOiBbJ0hUQycsICdFVk8gNEcnXSxcbiAgICAgICAgJ0lTVzEySFQnOiBbJ0hUQycsICdFVk8gM0QnXSxcbiAgICAgICAgJ0lTVzEzSFQnOiBbJ0hUQycsICdKJ10sXG4gICAgICAgICdVU0NDQURSNjI3NVVTIENhcnJpZXIgSUQgNDUnOiBbJ0hUQycsICdEZXNpcmUnXSxcbiAgICAgICAgJ1VTQ0NBRFI2Mjg1VVMnOiBbJ0hUQycsICdIZXJvIFMnXSxcbiAgICAgICAgJ1VTQ0NBRFI2MzI1VVMgQ2FycmllciBJRCA0NSc6IFsnSFRDJywgJ01lcmdlJ10sXG4gICAgICAgICdNZWRpYVBhZCc6IFsnSHVhd2VpJywgJ01lZGlhUGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnSHVhd2VpIE1lZGlhUGFkJzogWydIdWF3ZWknLCAnTWVkaWFQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdIVUFXRUkgTWVkaWFQYWQnOiBbJ0h1YXdlaScsICdNZWRpYVBhZCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0h1YXdlaSBTNy0zMTJ1JzogWydIdWF3ZWknLCAnTWVkaWFQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdNZWRpYVBhZCAxMCBGSEQnOiBbJ0h1YXdlaScsICdNZWRpYVBhZCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0h1YXdlaSBDODUwMCc6IFsnSHVhd2VpJywgJ0M4NTAwJ10sXG4gICAgICAgICdIdWF3ZWkgQzg1MDBTJzogWydIdWF3ZWknLCAnQzg1MDAnXSxcbiAgICAgICAgJ0h1YXdlaSBDODYwMCc6IFsnSHVhd2VpJywgJ0M4NjAwJ10sXG4gICAgICAgICdIdWF3ZWkgQzg2NTAnOiBbJ0h1YXdlaScsICdDODY1MCddLFxuICAgICAgICAnSHVhd2VpIEM4NjUwKyc6IFsnSHVhd2VpJywgJ0M4NjUwJ10sXG4gICAgICAgICdIdWF3ZWkgQzg4MDAnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnSHVhd2VpIEM4ODEwJzogWydIdWF3ZWknLCAnQXNjZW5kIEczMDAnXSxcbiAgICAgICAgJ0h1YXdlaSBDODgxMic6IFsnSHVhd2VpJywgJ0FzY2VuZCBDODgxMiddLFxuICAgICAgICAnSHVhd2VpIEM4ODEyRSc6IFsnSHVhd2VpJywgJ0FzY2VuZCBDODgxMiddLFxuICAgICAgICAnSHVhd2VpIEM4ODI1RCc6IFsnSHVhd2VpJywgJ0FzY2VuZCBDODgyNUQnXSxcbiAgICAgICAgJ0h1YXdlaSBDODg2MEUnOiBbJ0h1YXdlaScsICdIb25vciddLFxuICAgICAgICAnSHVhd2VpIE04MzUnOiBbJ0h1YXdlaScsICdNODM1J10sXG4gICAgICAgICdIdWF3ZWkgTTg2MCc6IFsnSHVhd2VpJywgJ0FzY2VuZCddLFxuICAgICAgICAnSHVhd2VpIE05MjEnOiBbJ0h1YXdlaScsICdNOTIxJ10sXG4gICAgICAgICdIdWF3ZWkgUzg1MjAnOiBbJ0h1YXdlaScsICdTODUyMCddLFxuICAgICAgICAnSHVhd2VpIFM4NjAwJzogWydIdWF3ZWknLCAnUzg2MDAnXSxcbiAgICAgICAgJ0h1YXdlaSBUODMwMCc6IFsnSHVhd2VpJywgJ1Q4MzAwJ10sXG4gICAgICAgICdIdWF3ZWkgVDg2MDAnOiBbJ0h1YXdlaScsICdUODYwMCddLFxuICAgICAgICAnSHVhd2VpIFQ4ODMwJzogWydIdWF3ZWknLCAnVDg4MzAnXSxcbiAgICAgICAgJ1Q4ODMwJzogWydIdWF3ZWknLCAnVDg4MzAnXSxcbiAgICAgICAgJ1Q4NjIwJzogWydIdWF3ZWknLCAnVDg2MjAnXSxcbiAgICAgICAgJ0h1YXdlaSBUODgyOCc6IFsnSHVhd2VpJywgJ1Q4ODI4J10sXG4gICAgICAgICdIdWF3ZWkgVTgyMjAnOiBbJ0h1YXdlaScsICdVODIyMCddLFxuICAgICAgICAnSHVhd2VpIHU4NTAwJzogWydIdWF3ZWknLCAnSURFT1MgWDInXSxcbiAgICAgICAgJ0h1YXdlaSBVODgxNSc6IFsnSHVhd2VpJywgJ0FzY2VuZCBHMzAwJ10sXG4gICAgICAgICdIdWF3ZWkgVTg4MjVEJzogWydIdWF3ZWknLCAnQXNjZW5kIEczMzBEJ10sXG4gICAgICAgICdIdWF3ZWkgVTg4NTAnOiBbJ0h1YXdlaScsICdWaXNpb24nXSxcbiAgICAgICAgJ0h1YXdlaSBVODY1Mic6IFsnSHVhd2VpJywgJ1NvbmljJ10sXG4gICAgICAgICdIdWF3ZWkgVTg4MDAtNTEnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnSHVhd2VpIFU4ODE4JzogWydIdWF3ZWknLCAnQXNjZW5kIEczMDAnXSxcbiAgICAgICAgJ0h1YXdlaSBVOTAwMCc6IFsnSHVhd2VpJywgJ0FzY2VuZCBYJ10sXG4gICAgICAgICdIdWF3ZWkgSURFT1MgVTg1MDAnOiBbJ0h1YXdlaScsICdJREVPUyBYMiddLFxuICAgICAgICAnSHVhd2VpIElERU9TIFU4NjUwJzogWydIdWF3ZWknLCAnU29uaWMnXSxcbiAgICAgICAgJ0h1YXdlaSBJREVPUyBYMyc6IFsnSHVhd2VpJywgJ0lERU9TIFgzJ10sXG4gICAgICAgICdIdWF3ZWkgSWRlb3MgWDUnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnSHVhd2VpIElkZW9zIFg1IDEuMTIuOShyZXQ0cnQpJzogWydIdWF3ZWknLCAnSURFT1MgWDUnXSxcbiAgICAgICAgJ0h1YXdlaSBTT05JQyc6IFsnSHVhd2VpJywgJ1NvbmljJ10sXG4gICAgICAgICdIdWF3ZWkgODEwMC05JzogWydIdWF3ZWknLCAnVTgxMDAnXSxcbiAgICAgICAgJ0ZVU0lPTmlkZW9zJzogWydIdWF3ZWknLCAnSURFT1MnXSxcbiAgICAgICAgJ0duYXBwbyBJZGVvcyc6IFsnSHVhd2VpJywgJ0lERU9TJ10sXG4gICAgICAgICdJZGVvcyc6IFsnSHVhd2VpJywgJ0lERU9TJ10sXG4gICAgICAgICdJREVPUyBYNSc6IFsnSHVhd2VpJywgJ0lERU9TIFg1J10sXG4gICAgICAgICdJZGVvcyBTNyc6IFsnSHVhd2VpJywgJ0lERU9TIFM3JywgJ3RhYmxldCddLFxuICAgICAgICAnSURFT1MgUzcnOiBbJ0h1YXdlaScsICdJREVPUyBTNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lERU9TIFM3IFNsaW0nOiBbJ0h1YXdlaScsICdJREVPUyBTNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0h1YXdlaSBTNyc6IFsnSHVhd2VpJywgJ0lERU9TIFM3JywgJ3RhYmxldCddLFxuICAgICAgICAnU09OSUMnOiBbJ0h1YXdlaScsICdTb25pYyddLFxuICAgICAgICAnS3lpdnN0YXIgQXF1YSc6IFsnSHVhd2VpJywgJ1NvbmljJ10sXG4gICAgICAgICdMdWNreSBVbHRyYSBTb25pYyBVODY1MCc6IFsnSHVhd2VpJywgJ1NvbmljJ10sXG4gICAgICAgICdUdXJrY2VsbCBUMjAnOiBbJ0h1YXdlaScsICdTb25pYyddLFxuICAgICAgICAnTVRDIDk1MCc6IFsnSHVhd2VpJywgJ1U4MTYwJ10sXG4gICAgICAgICdNVEMgOTU1JzogWydIdWF3ZWknLCAnU29uaWMnXSxcbiAgICAgICAgJ01UQyBFdm8nOiBbJ0h1YXdlaScsICdDODUwMCddLFxuICAgICAgICAnTVRDIEFuZHJvaWQnOiBbJ0h1YXdlaScsICdVODExMCddLFxuICAgICAgICAnUzMxSFcnOiBbJ0h1YXdlaScsICdQb2NrZXQgV2lGaSBTJ10sXG4gICAgICAgICdTNDFIVyc6IFsnSHVhd2VpJywgJ1BvY2tldCBXaUZpIFMgSUknXSxcbiAgICAgICAgJzAwN0hXJzogWydIdWF3ZWknLCAnVmlzaW9uJ10sXG4gICAgICAgICdVTTg0MCc6IFsnSHVhd2VpJywgJ0V2b2x1dGlvbiddLFxuICAgICAgICAnTTg2MCc6IFsnSHVhd2VpJywgJ0FzY2VuZCddLFxuICAgICAgICAnTTg2NSc6IFsnSHVhd2VpJywgJ0FzY2VuZCBJSSddLFxuICAgICAgICAnTTg4Nic6IFsnSHVhd2VpJywgJ0dsb3J5J10sXG4gICAgICAgICdDODE1MCc6IFsnSHVhd2VpJywgJ0lERU9TJ10sXG4gICAgICAgICdjODUwMCc6IFsnSHVhd2VpJywgJ0M4NTAwJ10sXG4gICAgICAgICdDODUwMCc6IFsnSHVhd2VpJywgJ0M4NTAwJ10sXG4gICAgICAgICdDODUwMFMnOiBbJ0h1YXdlaScsICdDODUwMCddLFxuICAgICAgICAnQzg2MDAnOiBbJ0h1YXdlaScsICdDODYwMCddLFxuICAgICAgICAnYzg2NTAnOiBbJ0h1YXdlaScsICdDODY1MCddLFxuICAgICAgICAnQzg2NTAnOiBbJ0h1YXdlaScsICdDODY1MCddLFxuICAgICAgICAnYzg4MDAnOiBbJ0h1YXdlaScsICdDODgwMCddLFxuICAgICAgICAnQzg4MDAnOiBbJ0h1YXdlaScsICdDODgwMCddLFxuICAgICAgICAnYzg4MTAnOiBbJ0h1YXdlaScsICdBc2NlbmQgRzMwMEMnXSxcbiAgICAgICAgJ0M4ODEyJzogWydIdWF3ZWknLCAnQXNjZW5kIEM4ODEyJ10sXG4gICAgICAgICdTODYwMCc6IFsnSHVhd2VpJywgJ1M4NjAwJ10sXG4gICAgICAgICdVODEwMCc6IFsnSHVhd2VpJywgJ1U4MTAwJ10sXG4gICAgICAgICdVODExMCc6IFsnSHVhd2VpJywgJ1U4MTEwJ10sXG4gICAgICAgICd1ODEyMCc6IFsnSHVhd2VpJywgJ1U4MTIwJ10sXG4gICAgICAgICdVODEyMCc6IFsnSHVhd2VpJywgJ1U4MTIwJ10sXG4gICAgICAgICdVODE4MCc6IFsnSHVhd2VpJywgJ0lERU9TIFgxJ10sXG4gICAgICAgICdVODIyMCc6IFsnSHVhd2VpJywgJ1B1bHNlJ10sXG4gICAgICAgICdVODMwMCc6IFsnSHVhd2VpJywgJ1U4MzAwJ10sXG4gICAgICAgICdVODM1MCc6IFsnSHVhd2VpJywgJ0JvdWxkZXInXSxcbiAgICAgICAgJ1U4MTUwJzogWydIdWF3ZWknLCAnSURFT1MnXSxcbiAgICAgICAgJ1U4MTYwJzogWydIdWF3ZWknLCAnVTgxNjAnXSxcbiAgICAgICAgJ1U4NTAwJzogWydIdWF3ZWknLCAnSURFT1MgWDInXSxcbiAgICAgICAgJ1U4NTAwIEhpUVEnOiBbJ0h1YXdlaScsICdVODUwMCBIaVFRIEVkaXRpb24nXSxcbiAgICAgICAgJ1U4NTEwJzogWydIdWF3ZWknLCAnSURFT1MgWDMnXSxcbiAgICAgICAgJ3U4NjUwJzogWydIdWF3ZWknLCAnU29uaWMnXSxcbiAgICAgICAgJ1U4NjUwJzogWydIdWF3ZWknLCAnU29uaWMnXSxcbiAgICAgICAgJ1U4NjUwLTEnOiBbJ0h1YXdlaScsICdTb25pYyddLFxuICAgICAgICAnVTg2NjAnOiBbJ0h1YXdlaScsICdTb25pYyddLFxuICAgICAgICAndTg4MDAnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnVTg4MDAnOiBbJ0h1YXdlaScsICdJREVPUyBYNSddLFxuICAgICAgICAnVTg4MDArJzogWydIdWF3ZWknLCAnSURFT1MgWDUnXSxcbiAgICAgICAgJ1U4ODAwWCc6IFsnSHVhd2VpJywgJ0lERU9TIFg1J10sXG4gICAgICAgICdVODgwMHBybyc6IFsnSHVhd2VpJywgJ0lERU9TIFg1IFBybyddLFxuICAgICAgICAnVTg4MDBQUk8nOiBbJ0h1YXdlaScsICdJREVPUyBYNSBQcm8nXSxcbiAgICAgICAgJ1U4ODAwUHJvJzogWydIdWF3ZWknLCAnSURFT1MgWDUgUHJvJ10sXG4gICAgICAgICd1ODgwMHBybyc6IFsnSHVhd2VpJywgJ0lERU9TIFg1IFBybyddLFxuICAgICAgICAnVTg4MDAgUHJvJzogWydIdWF3ZWknLCAnSURFT1MgWDUgUHJvJ10sXG4gICAgICAgICdVODgxOCc6IFsnSHVhd2VpJywgJ0FzY2VuZCBHMzAwJ10sXG4gICAgICAgICdVODg1MCc6IFsnSHVhd2VpJywgJ1Zpc2lvbiddLFxuICAgICAgICAndTg4NjAnOiBbJ0h1YXdlaScsICdIb25vciddLFxuICAgICAgICAnVTg4NjAnOiBbJ0h1YXdlaScsICdIb25vciddLFxuICAgICAgICAnVTkwMDAnOiBbJ0h1YXdlaScsICdBc2NlbmQgWCddLFxuICAgICAgICAnVTkyMDAnOiBbJ0h1YXdlaScsICdBc2NlbmQgUDEnXSxcbiAgICAgICAgJ1U5MjAwLTEnOiBbJ0h1YXdlaScsICdBc2NlbmQgUDEnXSxcbiAgICAgICAgJ1U5NTAwJzogWydIdWF3ZWknLCAnQXNjZW5kIEQxJ10sXG4gICAgICAgICdVOTUwMUwnOiBbJ0h1YXdlaScsICdBc2NlbmQgRCBMVEUnXSxcbiAgICAgICAgJ1U5NTEwJzogWydIdWF3ZWknLCAnQXNjZW5kIEQgcXVhZCddLFxuICAgICAgICAnVTk1MTBFJzogWydIdWF3ZWknLCAnQXNjZW5kIEQgcXVhZCddLFxuICAgICAgICAnQ29tZXQnOiBbJ0h1YXdlaScsICdDb21ldCddLFxuICAgICAgICAnR1MwMic6IFsnSHVhd2VpJywgJ0hvbm9yJ10sXG4gICAgICAgICdHUzAzJzogWydIdWF3ZWknLCAnQXNjZW5kIFAxJ10sXG4gICAgICAgICdEcm9uaVgtMC41JzogWydIdWF3ZWknLCAnVTgxODAnXSxcbiAgICAgICAgJ01UUy1TUDEwMSc6IFsnSHVhd2VpJywgJ0M4NTExJ10sXG4gICAgICAgICdUU1AyMSc6IFsnSHVhd2VpJywgJ1U4MTEwJ10sXG4gICAgICAgICdIWVVOREFJIEg2JzogWydIeXVuZGFpJywgJ1N0b3JtIEg2J10sXG4gICAgICAgICdpQmFsbCBTbGlkZSBpNzAxMSc6IFsnaUJhbGwnLCAnU2xpZGUgaTcwMTEnXSxcbiAgICAgICAgJ05ldFRBQiBSVU5FJzogWydJY29uQml0JywgJ05ldFRhYiBSdW5lJywgJ3RhYmxldCddLFxuICAgICAgICAnRDcwVyc6IFsnSWNvbycsICdENzBXJywgJ3RhYmxldCddLFxuICAgICAgICAnRDgwJzogWydJY29vJywgJ0Q4MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lORk9CQVIgQTAxJzogWydpaWRhJywgJ0lORk9CQVIgQTAxJ10sXG4gICAgICAgICdNMDA5Ric6IFsnSW5mb3RtaWMnLCAnTTAwOUYnXSxcbiAgICAgICAgJ0FaMjEwQSc6IFsnSW50ZWwnLCAnQVoyMTBBJ10sXG4gICAgICAgICdBWjIxMEInOiBbJ0ludGVsJywgJ0FaMjEwQiddLFxuICAgICAgICAnQVo1MTAnOiBbJ0ludGVsJywgJ0FaNTEwJ10sXG4gICAgICAgICdncmVlbnJpZGdlJzogWydJbnRlbCcsICdHcmVlbiBSaWRnZScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lOUSBDbG91ZCBUb3VjaCc6IFsnSU5RJywgJ0Nsb3VkIFRvdWNoJ10sXG4gICAgICAgICdJTFQtTVgxMDAnOiBbJ2lSaXZlcicsICdUYWInLCAndGFibGV0J10sXG4gICAgICAgICdJVklPX0RFMzgnOiBbJ0l2aW8nLCAnREUzOCddLFxuICAgICAgICAnSlktRzInOiBbJ0ppYXl1JywgJ0cyJ10sXG4gICAgICAgICdKWEQgUzYwMVdJRkknOiBbJ0pYRCcsICdTNjAxIFdJRkknLCAnbWVkaWEnXSxcbiAgICAgICAgJ0EyJzogWydLYWthVGVjaCcsICdBMiddLFxuICAgICAgICAnRDkxJzogWydLSycsICdEOTEnLCAndGFibGV0J10sXG4gICAgICAgICdLMDgwJzogWydLb2JvJywgJ0swODAnLCAnZXJlYWRlciddLFxuICAgICAgICAnQTEwNic6IFsna29vYmVlJywgJ0ExNjAnXSxcbiAgICAgICAgJ0tQVCBBOSc6IFsnS1BUJywgJ0E5J10sXG4gICAgICAgICdFVi1TMTAwJzogWydLdHRlY2gnLCAnVGFrZSBFVi1TMTAwJ10sXG4gICAgICAgICdLTS1TMTIwJzogWydLdHRlY2gnLCAnVGFrZSAyIEtNLVMxMjAnXSxcbiAgICAgICAgJ0tNLVMyMDAnOiBbJ1RBS0UnLCAnSmFudXMgS00tUzIwMCddLFxuICAgICAgICAnS00tUzIyMCc6IFsnS3R0ZWNoJywgJ1Rha2UgVGFjaHkgS00tUzIyMCddLFxuICAgICAgICAnS3lvYm8gbWlyYXNvbCBlUmVhZGVyJzogWydLeW9ibycsICdlUmVhZGVyJywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ0lTVzExSyc6IFsnS3lvY2VyYScsICdEaWdubyddLFxuICAgICAgICAnSkMtS1NQODAwMCc6IFsnS3lvY2VyYScsICdFY2hvJ10sXG4gICAgICAgICdLU1A4MDAwJzogWydLeW9jZXJhJywgJ0VjaG8nXSxcbiAgICAgICAgJ1ppbyc6IFsnS3lvY2VyYScsICdaaW8nXSxcbiAgICAgICAgJ0M1MTU1JzogWydLeW9jZXJhJywgJ0M1MTU1J10sXG4gICAgICAgICdDNTE3MCc6IFsnS3lvY2VyYScsICdDNTE3MCddLFxuICAgICAgICAnTTkzMDAnOiBbJ0t5b2NlcmEnLCAnTTkzMDAnXSxcbiAgICAgICAgJ0U4MDAnOiBbJ0stVG91Y2gnLCAnRTgwMCddLFxuICAgICAgICAnVzYwNic6IFsnSy1Ub3VjaCcsICdXNjA2J10sXG4gICAgICAgICdLLVRvdWNoIFQ2MTknOiBbJ0stVG91Y2gnLCAnVDYxOSddLFxuICAgICAgICAnSy1Ub3VjaCBXNjE5JzogWydLLVRvdWNoJywgJ1c2MTknXSxcbiAgICAgICAgJ0stVG91Y2ggVzY1MCc6IFsnSy1Ub3VjaCcsICdXNjUwJ10sXG4gICAgICAgICdXNzAwJzogWydLLVRvdWNoJywgJ1c3MDAnXSxcbiAgICAgICAgJ1c4MDAnOiBbJ0stVG91Y2gnLCAnVzgwMCddLFxuICAgICAgICAnVzgwNic6IFsnSy1Ub3VjaCcsICdXODA2J10sXG4gICAgICAgICdXODA4JzogWydLLVRvdWNoJywgJ1c4MDgnXSxcbiAgICAgICAgJ1c4MTAnOiBbJ0stVG91Y2gnLCAnVzgxMCddLFxuICAgICAgICAnWDkwMCc6IFsnTGF2YScsICdYT0xPIFg5MDAnXSxcbiAgICAgICAgJ0xlbm92byBBNzk4dCc6IFsnTGVub3ZvJywgJ0E3OTh0J10sXG4gICAgICAgICdMRU5PVk8tTGVub3ZvLUEyODh0JzogWydMZW5vdm8nLCAnTGVQaG9uZSBBMjg4J10sXG4gICAgICAgICdUaGlua1BhZCBUYWJsZXQnOiBbJ0xlbm92bycsICdUaGlua1BhZCBUYWJsZXQnLCAndGFibGV0J10sXG4gICAgICAgICdLMSc6IFsnTGVub3ZvJywgJ0lkZWFQYWQgSzEnLCAndGFibGV0J10sXG4gICAgICAgICdJZGVhcGFkIFMxMC0zVCc6IFsnTGVub3ZvJywgJ0lkZWFQYWQgUzEwLTNUJywgJ3RhYmxldCddLFxuICAgICAgICAnUzIwMDVBLUgnOiBbJ0xlbm92bycsICdTMjAwNUEnXSxcbiAgICAgICAgJ0lkZWFUYWIgUzIwMDdBLUQnOiBbJ0xlbm92bycsICdJZGVhVGFiIFMyMDA3QScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lkZWFUYWJWMjAwN0EnOiBbJ0xlbm92bycsICdJZGVhVGFiIFYyMDA3QScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lkZWFUYWJWMjAwN0EtRC1JJzogWydMZW5vdm8nLCAnSWRlYVRhYiBWMjAwN0EnLCAndGFibGV0J10sXG4gICAgICAgICdJZGVhVGFiVjIwMTBBJzogWydMZW5vdm8nLCAnSWRlYVRhYiBWMjAxMEEnLCAndGFibGV0J10sXG4gICAgICAgICdJZGVhVGFiIEEyMTA3QS1IJzogWydMZW5vdm8nLCAnSWRlYVRhYiBWMjEwN0EnLCAndGFibGV0J10sXG4gICAgICAgICdBMSAwNyc6IFsnTGVub3ZvJywgJ0xlUGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnbGVwYWQgMDAxYic6IFsnTGVub3ZvJywgJ0xlUGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnbGVwYWQgMDAxbic6IFsnTGVub3ZvJywgJ0xlUGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnM0dDMTAxJzogWydMZW5vdm8nLCAnTGVQaG9uZSAzR0MxMDEnXSxcbiAgICAgICAgJ0xlbm92byAzR0MxMDEnOiBbJ0xlbm92bycsICdMZVBob25lIDNHQzEwMSddLFxuICAgICAgICAnM0dXMTAwJzogWydMZW5vdm8nLCAnTGVQaG9uZSAzR1cxMDAnXSxcbiAgICAgICAgJ0xlbm92byAzR1cxMDAnOiBbJ0xlbm92bycsICdMZVBob25lIDNHVzEwMCddLFxuICAgICAgICAnM0dXMTAxJzogWydMZW5vdm8nLCAnTGVQaG9uZSAzR1cxMDEnXSxcbiAgICAgICAgJ0xlbm92byAzR1cxMDEnOiBbJ0xlbm92bycsICdMZVBob25lIDNHVzEwMSddLFxuICAgICAgICAnTGVwaG9uZSAzR1cxMDEnOiBbJ0xlbm92bycsICdMZVBob25lIDNHVzEwMSddLFxuICAgICAgICAnTGVub3ZvIEExLTMyQUIwJzogWydMZW5vdm8nLCAnTGVQaG9uZSBBMS0zMkFCMCddLFxuICAgICAgICAnTGVub3ZvIFMxLTM3QUgwJzogWydMZW5vdm8nLCAnTGVQaG9uZSBTMS0zN0FIMCddLFxuICAgICAgICAnUzEgMzdBSE8nOiBbJ0xlbm92bycsICdMZVBob25lIFMxLTM3QUgwJ10sXG4gICAgICAgICdMZW5vdm8gUzItMzhBSDAnOiBbJ0xlbm92bycsICdMZVBob25lIFMyLTM4QUgwJ10sXG4gICAgICAgICdMZW5vdm8gUzItMzhBVDAnOiBbJ0xlbm92bycsICdMZVBob25lIFMyLTM4QVQwJ10sXG4gICAgICAgICdMZW5vdm8gQTI4OHQnOiBbJ0xlbm92bycsICdMZVBob25lIEEyODgnXSxcbiAgICAgICAgJ0xlbm92byBBMzY2dCc6IFsnTGVub3ZvJywgJ0xlUGhvbmUgQTM2NiddLFxuICAgICAgICAnTGVub3ZvIEEzOTBlJzogWydMZW5vdm8nLCAnTGVQaG9uZSBBMzkwJ10sXG4gICAgICAgICdMZW5vdm8gQTUwMCc6IFsnTGVub3ZvJywgJ0xlUGhvbmUgQTUwMCddLFxuICAgICAgICAnTGVub3ZvIEE1MjAnOiBbJ0xlbm92bycsICdMZVBob25lIEE1MjAnXSxcbiAgICAgICAgJ0xlbm92byBBNTYwZSc6IFsnTGVub3ZvJywgJ0E1NjAnXSxcbiAgICAgICAgJ0xlbm92byBBNjY4dCc6IFsnTGVub3ZvJywgJ0xlUGhvbmUgQTY2OCddLFxuICAgICAgICAnTGVub3ZvIEE2OTh0JzogWydMZW5vdm8nLCAnTGVQaG9uZSBBNjk4J10sXG4gICAgICAgICdMZW5vdm8gQTc1MCc6IFsnTGVub3ZvJywgJ0xlUGhvbmUgQTc1MCddLFxuICAgICAgICAnTGVub3ZvIEE3ODAnOiBbJ0xlbm92bycsICdMZVBob25lIEE3ODAnXSxcbiAgICAgICAgJ0xlbm92byBBNzg5JzogWydMZW5vdm8nLCAnTGVQaG9uZSBBNzg5J10sXG4gICAgICAgICdMZW5vdm8gQTc5MGUnOiBbJ0xlbm92bycsICdMZVBob25lIEE3OTAnXSxcbiAgICAgICAgJ0xlbm92byBQNzAnOiBbJ0xlbm92bycsICdMZVBob25lIFA3MCddLFxuICAgICAgICAnTGVub3ZvIFA3MDAnOiBbJ0xlbm92bycsICdMZVBob25lIFA3MDAnXSxcbiAgICAgICAgJ0xlbm92byBTODUwZSc6IFsnTGVub3ZvJywgJ1M4NTAnXSxcbiAgICAgICAgJ0xlbm92byBTODgwJzogWydMZW5vdm8nLCAnUzg4MCddLFxuICAgICAgICAnTGVub3ZvIEs4NjAnOiBbJ0xlbm92bycsICdLODYwJ10sXG4gICAgICAgICdBMzB0JzogWydMZW5vdm8nLCAnQTMwdCddLFxuICAgICAgICAnTGVub3ZvIEE2MCc6IFsnTGVub3ZvJywgJ0E2MCddLFxuICAgICAgICAnTGVub3ZvIEE2NSc6IFsnTGVub3ZvJywgJ0E2NSddLFxuICAgICAgICAnTGVub3ZvIEE2NnQnOiBbJ0xlbm92bycsICdBNjZ0J10sXG4gICAgICAgICdMZW5vdm8gQTY4ZSc6IFsnTGVub3ZvJywgJ0E2OGUnXSxcbiAgICAgICAgJ0xlbm92byBLODAwJzogWydMZW5vdm8nLCAnSzgwMCddLFxuICAgICAgICAnSURFQSBUViBUMTAwJzogWydMZW5vdm8nLCAnSURFQSBUVicsICd0ZWxldmlzaW9uJ10sXG4gICAgICAgICdJREVBIFRWIEs5MSc6IFsnTGVub3ZvJywgJ0lERUEgVFYnLCAndGVsZXZpc2lvbiddLFxuICAgICAgICAnVEM5NzAnOiBbJ0xlIFBhbicsICdUQzk3MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0xlUGFuSUknOiBbJ0xlIFBhbicsICdJSScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0xHLUM1NTUnOiBbJ0xHJywgJ09wdGltdXMgQ2hhdCddLFxuICAgICAgICAnTEctQzU1NS1wYXJyb3QnOiBbJ0xHJywgJ09wdGltdXMgQ2hhdCddLFxuICAgICAgICAnTEctQzY2MGgnOiBbJ0xHJywgJ09wdGltdXMgUHJvJ10sXG4gICAgICAgICdMRy1DNzI5JzogWydMRycsICdEb3VibGVQbGF5J10sXG4gICAgICAgICdMRy1DODAwRyc6IFsnTEcnLCAnRWNseXBzZSddLFxuICAgICAgICAnTEctQ1g2NzAnOiBbJ0xHJywgJ09wdGltdXMgM0cnXSxcbiAgICAgICAgJ0xHLUU0MDAnOiBbJ0xHJywgJ09wdGltdXMgTDMnXSxcbiAgICAgICAgJ0xHLUU0MDBmJzogWydMRycsICdPcHRpbXVzIEwzJ10sXG4gICAgICAgICdMRy1FNTEwJzogWydMRycsICdPcHRpbXVzIEh1YiddLFxuICAgICAgICAnTEctRTUxMGYnOiBbJ0xHJywgJ09wdGltdXMgSHViJ10sXG4gICAgICAgICdMRy1FNTEwZyc6IFsnTEcnLCAnT3B0aW11cyBIdWInXSxcbiAgICAgICAgJ0xHLUU2MTAnOiBbJ0xHJywgJ09wdGltdXMgTDUnXSxcbiAgICAgICAgJ0xHLUU2MTInOiBbJ0xHJywgJ09wdGltdXMgTDUnXSxcbiAgICAgICAgJ0xHLUU2MTJnJzogWydMRycsICdPcHRpbXVzIEw1J10sXG4gICAgICAgICdMRy1FNjE1Ric6IFsnTEcnLCAnRTYxNSddLFxuICAgICAgICAnTEctRTYxN0cnOiBbJ0xHJywgJ0U2MTcnXSxcbiAgICAgICAgJ0xHLUU3MjAnOiBbJ0xHJywgJ09wdGltdXMgQ2hpYyddLFxuICAgICAgICAnTEctRTcyMGInOiBbJ0xHJywgJ09wdGltdXMgQ2hpYyddLFxuICAgICAgICAnTEctRTczMCc6IFsnTEcnLCAnT3B0aW11cyBTb2wnXSxcbiAgICAgICAgJ0xHLUU5NzAnOiBbJ0xHJywgJ1NoaW5lJ10sXG4gICAgICAgICdMRy1GMTAwTCc6IFsnTEcnLCAnT3B0aW11cyBWdSddLFxuICAgICAgICAnTEctRjEwMFMnOiBbJ0xHJywgJ09wdGltdXMgVnUnXSxcbiAgICAgICAgJ0xHLUYxMjBLJzogWydMRycsICdPcHRpbXVzIExURSBUYWcnXSxcbiAgICAgICAgJ0xHLUYxMjBMJzogWydMRycsICdPcHRpbXVzIExURSBUYWcnXSxcbiAgICAgICAgJ0xHLUYxMjBTJzogWydMRycsICdPcHRpbXVzIExURSBUYWcnXSxcbiAgICAgICAgJ0xHLUYxNjBLJzogWydMRycsICdPcHRpbXVzIExURSBJSSddLFxuICAgICAgICAnTEctRjE2MEwnOiBbJ0xHJywgJ09wdGltdXMgTFRFIElJJ10sXG4gICAgICAgICdMRy1GMTYwUyc6IFsnTEcnLCAnT3B0aW11cyBMVEUgSUknXSxcbiAgICAgICAgJ0xHLUYxODBMJzogWydMRycsICdGMTgwTCddLFxuICAgICAgICAnTEctR1Q1NDAnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ0xHLUdUNTQwZic6IFsnTEcnLCAnT3B0aW11cyddLFxuICAgICAgICAnTEctR1Q1NDAgU3dpZnQnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ0xHLUdXNjIwJzogWydMRycsICdHVzYyMCddLFxuICAgICAgICAnTEctS0g1MjAwJzogWydMRycsICdBbmRyby0xJ10sXG4gICAgICAgICdMRy1LVTM3MDAnOiBbJ0xHJywgJ09wdGltdXMgT25lJ10sXG4gICAgICAgICdMRy1LVTU0MDAnOiBbJ0xHJywgJ1BSQURBIDMuMCddLFxuICAgICAgICAnTEctS1U1OTAwJzogWydMRycsICdPcHRpbXVzIEJsYWNrJ10sXG4gICAgICAgICdMRy1MNDBHJzogWydMRycsICdMNDBHJ10sXG4gICAgICAgICdMRy1MRzg1NSc6IFsnTEcnLCAnTWFycXVlZSddLFxuICAgICAgICAnTEctTFM2NzAnOiBbJ0xHJywgJ09wdGltdXMgUyddLFxuICAgICAgICAnTEctTFM2OTYnOiBbJ0xHJywgJ09wdGltdXMgRWxpdGUnXSxcbiAgICAgICAgJ0xHLUxTODQwJzogWydMRycsICdWaXBlciA0RyddLFxuICAgICAgICAnTEctTFM4NTUnOiBbJ0xHJywgJ01hcnF1ZWUnXSxcbiAgICAgICAgJ0xHLUxTODYwJzogWydMRycsICdcXCdDYXllbm5lXFwnJ10sXG4gICAgICAgICdMRy1MUzk3MCc6IFsnTEcnLCAnXFwnRWNsaXBzZVxcJyddLFxuICAgICAgICAnTEctTFUzMDAwJzogWydMRycsICdPcHRpbXVzIE1hY2gnXSxcbiAgICAgICAgJ0xHLUxVMzEwMCc6IFsnTEcnLCAnT3B0aW11cyBDaGljJ10sXG4gICAgICAgICdMRy1MVTM3MDAnOiBbJ0xHJywgJ09wdGltdXMgT25lJ10sXG4gICAgICAgICdMRy1MVTU0MDAnOiBbJ0xHJywgJ1BSQURBIDMuMCddLFxuICAgICAgICAnTEctTFU2MjAwJzogWydMRycsICdPcHRpbXVzIFEyJ10sXG4gICAgICAgICdMRy1sdTYyMDAnOiBbJ0xHJywgJ09wdGltdXMgUTInXSxcbiAgICAgICAgJ0xHLUxVNjUwMCc6IFsnTEcnLCAnT3B0aW11cyBOb3RlJ10sXG4gICAgICAgICdMRy1MVTY4MDAnOiBbJ0xHJywgJ09wdGltdXMgQmlnJ10sXG4gICAgICAgICdMRy1MVTgzMDAnOiBbJ0xHJywgJ09wdGltdXMgUGFkIExURSddLFxuICAgICAgICAnTEctTFc2OTAnOiBbJ0xHJywgJ09wdGltdXMgQyddLFxuICAgICAgICAnTEctTFc3NzAnOiBbJ0xHJywgJ0xXNzcwJ10sXG4gICAgICAgICdMRy1NUzY5MCc6IFsnTEcnLCAnT3B0aW11cyBNJ10sXG4gICAgICAgICdMRy1NUzc3MCc6IFsnTEcnLCAnTVM3NzAnXSxcbiAgICAgICAgJ0xHLU1TODQwJzogWydMRycsICdDb25uZWN0IDRHJ10sXG4gICAgICAgICdMRy1NUzkxMCc6IFsnTEcnLCAnRXN0ZWVtJ10sXG4gICAgICAgICdMRy1NUzY5NSc6IFsnTEcnLCAnT3B0aW11cyBNKyddLFxuICAgICAgICAnTEcgUDM1MCc6IFsnTEcnLCAnT3B0aW11cyBNZSddLFxuICAgICAgICAnTEctUDM1MCc6IFsnTEcnLCAnT3B0aW11cyBNZSddLFxuICAgICAgICAnTEctUDM1MGYnOiBbJ0xHJywgJ09wdGltdXMgTWUnXSxcbiAgICAgICAgJ0xHLVAzNTBnJzogWydMRycsICdPcHRpbXVzIE1lJ10sXG4gICAgICAgICdMRy1QMzU1JzogWydMRycsICdQMzU1J10sXG4gICAgICAgICdMRy1QNTAwJzogWydMRycsICdPcHRpbXVzIE9uZSddLFxuICAgICAgICAnTEctUDUwMGgnOiBbJ0xHJywgJ09wdGltdXMgT25lJ10sXG4gICAgICAgICdMRy1QNTAwaC1wYXJyb3QnOiBbJ0xHJywgJ09wdGltdXMgT25lJ10sXG4gICAgICAgICdMRy1QNTAzJzogWydMRycsICdPcHRpbXVzIE9uZSddLFxuICAgICAgICAnTEctUDUwNCc6IFsnTEcnLCAnT3B0aW11cyBPbmUnXSxcbiAgICAgICAgJ0xHLVA1MDUnOiBbJ0xHJywgJ1Bob2VuaXgnXSxcbiAgICAgICAgJ0xHLVA1MDVSJzogWydMRycsICdQaG9lbml4J10sXG4gICAgICAgICdMRy1QNTA2JzogWydMRycsICdUaHJpdmUnXSxcbiAgICAgICAgJ0xHLVA1MDknOiBbJ0xHJywgJ09wdGltdXMgVCddLFxuICAgICAgICAnTEctUDY5MCc6IFsnTEcnLCAnT3B0aW11cyBOZXQnXSxcbiAgICAgICAgJ0xHLVA2OTMnOiBbJ0xHJywgJ1A2OTMnXSxcbiAgICAgICAgJ0xHLVA2OTgnOiBbJ0xHJywgJ09wdGltdXMgTmV0J10sXG4gICAgICAgICdMRy1QNjk4Zic6IFsnTEcnLCAnT3B0aW11cyBOZXQnXSxcbiAgICAgICAgJ0xHLVA3MDAnOiBbJ0xHJywgJ09wdGltdXMgTDcnXSxcbiAgICAgICAgJ0xHLVA3MDUnOiBbJ0xHJywgJ09wdGltdXMgTDcnXSxcbiAgICAgICAgJ0xHLVA3MDVmJzogWydMRycsICdPcHRpbXVzIEw3J10sXG4gICAgICAgICdMRy1QNzA1Zyc6IFsnTEcnLCAnT3B0aW11cyBMNyddLFxuICAgICAgICAnTEctUDcwOGcnOiBbJ0xHJywgJ1A3MDgnXSxcbiAgICAgICAgJ0xHLVA3MjAnOiBbJ0xHJywgJ09wdGltdXMgQ2hpYyddLFxuICAgICAgICAnTEctUDcyMGgnOiBbJ0xHJywgJ09wdGltdXMgQ2hpYyddLFxuICAgICAgICAnTEctUDcyNSc6IFsnTEcnLCAnT3B0aW11cyAzRCBNYXgnXSxcbiAgICAgICAgJ0xHLVA3NjAnOiBbJ0xHJywgJ1A3NjAnXSxcbiAgICAgICAgJ0xHLVA3NjknOiBbJ0xHJywgJ1A3NjknXSxcbiAgICAgICAgJ0xHLVA4NjAnOiBbJ0xHJywgJ1A4NjAnXSxcbiAgICAgICAgJ0xHLVA4NzAnOiBbJ0xHJywgJ1A4NzAnXSxcbiAgICAgICAgJ0xHLVA4NzBGJzogWydMRycsICdQODcwJ10sXG4gICAgICAgICdMRy1QODgwJzogWydMRycsICdYMyddLFxuICAgICAgICAnTEctUDg4MGcnOiBbJ0xHJywgJ1gzJ10sXG4gICAgICAgICdMRy1QODk1JzogWydMRycsICdQODk1J10sXG4gICAgICAgICdMRy1QOTIwJzogWydMRycsICdPcHRpbXVzIDNEJ10sXG4gICAgICAgICdMRy1QOTIwaCc6IFsnTEcnLCAnT3B0aW11cyAzRCddLFxuICAgICAgICAnTEctUDkyNSc6IFsnTEcnLCAnVGhyaWxsJ10sXG4gICAgICAgICdMRy1QOTI1Zyc6IFsnTEcnLCAnVGhyaWxsJ10sXG4gICAgICAgICdMRy1QOTMwJzogWydMRycsICdOaXRybyBIRCddLFxuICAgICAgICAnTEctUDkzNic6IFsnTEcnLCAnT3B0aW11cyBMVEUnXSxcbiAgICAgICAgJ0xHLVA5NDAnOiBbJ0xHJywgJ1BSQURBIDMuMCddLFxuICAgICAgICAnTEctUDk3MCc6IFsnTEcnLCAnT3B0aW11cyBCbGFjayddLFxuICAgICAgICAnTEctUDk3MGgnOiBbJ0xHJywgJ09wdGltdXMgQmxhY2snXSxcbiAgICAgICAgJ0xHLVA5OTAnOiBbJ0xHJywgJ09wdGltdXMgMlggU3BlZWQnXSxcbiAgICAgICAgJ0xHLVA5OTBoJzogWydMRycsICdPcHRpbXVzIDJYIFNwZWVkJ10sXG4gICAgICAgICdMRy1QOTkwaE4nOiBbJ0xHJywgJ09wdGltdXMgMlggU3BlZWQnXSxcbiAgICAgICAgJ0xHLVA5OTBIJzogWydMRycsICdPcHRpbXVzIDJYIFNwZWVkJ10sXG4gICAgICAgICdMRy1QOTkzJzogWydMRycsICdPcHRpbXVzIDJYJ10sXG4gICAgICAgICdMRy1TVTU0MCc6IFsnTEcnLCAnUFJBREEgMy4wJ10sXG4gICAgICAgICdMRy1TVTY0MCc6IFsnTEcnLCAnT3B0aW11cyBMVEUnXSxcbiAgICAgICAgJ0xHLVNVNjYwJzogWydMRycsICdPcHRpbXVzIDJYJ10sXG4gICAgICAgICdMRy1TVTc2MCc6IFsnTEcnLCAnT3B0aW11cyAzRCddLFxuICAgICAgICAnTEctU1U3NjAtS3VzdCc6IFsnTEcnLCAnT3B0aW11cyAzRCddLFxuICAgICAgICAnTEctU1U4NzAnOiBbJ0xHJywgJ09wdGltdXMgM0QgQ3ViZSddLFxuICAgICAgICAnTEctU1U4ODAnOiBbJ0xHJywgJ09wdGltdXMgRVgnXSxcbiAgICAgICAgJ0xHLVVTNjcwJzogWydMRycsICdPcHRpbXVzIFUnXSxcbiAgICAgICAgJ0xHLVVTNzMwJzogWydMRycsICdVUzczMCddLFxuICAgICAgICAnTEctVjkwMCc6IFsnTEcnLCAnT3B0aW11cyBQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdMRy1WOTA1Uic6IFsnTEcnLCAnT3B0aW11cyBHLVNsYXRlJywgJ3RhYmxldCddLFxuICAgICAgICAnTEctVjkwOSc6IFsnTEcnLCAnT3B0aW11cyBHLVNsYXRlJywgJ3RhYmxldCddLFxuICAgICAgICAnTEctVk02NzAnOiBbJ0xHJywgJ09wdGltdXMgViddLFxuICAgICAgICAnTEctVk02OTYnOiBbJ0xHJywgJ09wdGltdXMgRWxpdGUnXSxcbiAgICAgICAgJ0xHLVZNNzAxJzogWydMRycsICdPcHRpbXVzIFNsaWRlciddLFxuICAgICAgICAnTEctVlM2NjAnOiBbJ0xHJywgJ1ZvcnRleCddLFxuICAgICAgICAnTEctVlM3MDAnOiBbJ0xHJywgJ0VubGlnaHRlbiddLFxuICAgICAgICAnTEctVlM3NDAnOiBbJ0xHJywgJ0FsbHknXSxcbiAgICAgICAgJ0xHLVZTODQwJzogWydMRycsICdDb25uZWN0IDRHJ10sXG4gICAgICAgICdMRy1WUzkxMCc6IFsnTEcnLCAnUmV2b2x1dGlvbiddLFxuICAgICAgICAnbGdwLTk3MCc6IFsnTEcnLCAnT3B0aW11cyBCbGFjayddLFxuICAgICAgICAnRTkwMCc6IFsnTEcnLCAnT3B0aW11cyA3J10sXG4gICAgICAgICdHVDU0MCc6IFsnTEcnLCAnT3B0aW11cyBHVDU0MCddLFxuICAgICAgICAnR1c2MjAnOiBbJ0xHJywgJ0dXNjIwJ10sXG4gICAgICAgICdLVTk1MDAnOiBbJ0xHJywgJ09wdGltdXMgWiddLFxuICAgICAgICAnTEdDNjYwJzogWydMRycsICdPcHRpbXVzIFBybyddLFxuICAgICAgICAnTEdMNDVDJzogWydMRycsICdPcHRpbXVzIE5ldCddLFxuICAgICAgICAnTEdMNTVDJzogWydMRycsICdPcHRpbXVzIFEnXSxcbiAgICAgICAgJ0xVMjMwMCc6IFsnTEcnLCAnT3B0aW11cyBRJ10sXG4gICAgICAgICdMUzY3MCc6IFsnTEcnLCAnT3B0aW11cyBTJ10sXG4gICAgICAgICdQOTQwJzogWydMRycsICdQUkFEQSAzLjAnXSxcbiAgICAgICAgJ1A5OTAnOiBbJ0xHJywgJ09wdGltdXMgMlggU3BlZWQnXSxcbiAgICAgICAgJ1VTQ0MtVVM3MzAnOiBbJ0xHJywgJ1VTNzMwJ10sXG4gICAgICAgICdVU0NDLVVTNzYwJzogWydMRycsICdHZW5lc2lzJ10sXG4gICAgICAgICdWTTY3MCc6IFsnTEcnLCAnT3B0aW11cyBWJ10sXG4gICAgICAgICdWUzg0MCA0Ryc6IFsnTEcnLCAnQ29ubmVjdCA0RyddLFxuICAgICAgICAnVlM5MDAtNEcnOiBbJ0xHJywgJ1ZTOTAwJ10sXG4gICAgICAgICdWUzkxMCA0Ryc6IFsnTEcnLCAnUmV2b2x1dGlvbiA0RyddLFxuICAgICAgICAnVlM5MjAgNEcnOiBbJ0xHJywgJ1NwZWN0cnVtIDRHJ10sXG4gICAgICAgICdWUzkzMCA0Ryc6IFsnTEcnLCAnVlM5MzAnXSxcbiAgICAgICAgJ1ZTOTUwIDRHJzogWydMRycsICdWUzk1MCddLFxuICAgICAgICAnTC0wMUQnOiBbJ0xHJywgJ09wdGltdXMgTFRFJ10sXG4gICAgICAgICdMLTAyRCc6IFsnTEcnLCAnUFJBREEgcGhvbmUnXSxcbiAgICAgICAgJ0wtMDRDJzogWydMRycsICdPcHRpbXVzIENoYXQnXSxcbiAgICAgICAgJ0wtMDVEJzogWydMRycsICdPcHRpbXVzIGl0J10sXG4gICAgICAgICdMLTA2Qyc6IFsnTEcnLCAnT3B0aW11cyBQYWQnLCAndGFibGV0J10sXG4gICAgICAgICdMLTA2RCc6IFsnTEcnLCAnT3B0aW11cyBWdSddLFxuICAgICAgICAnTC0wN0MnOiBbJ0xHJywgJ09wdGltdXMgQnJpZ2h0J10sXG4gICAgICAgICdMRy1FdmUnOiBbJ0xHJywgJ0V2ZSddLFxuICAgICAgICAnTEctT3B0aW11cyBPbmUgUDUwMCc6IFsnTEcnLCAnT3B0aW11cyBPbmUnXSxcbiAgICAgICAgJ0xHLU9wdGltdXMgMlgnOiBbJ0xHJywgJ09wdGltdXMgMlgnXSxcbiAgICAgICAgJ0xHLUdUNTQwIE9wdGltdXMnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ0xHLU9wdGltdXMgQmxhY2snOiBbJ0xHJywgJ09wdGltdXMgQmxhY2snXSxcbiAgICAgICAgJ0FsbHknOiBbJ0xHJywgJ0FsbHknXSxcbiAgICAgICAgJ09wdGltdXMnOiBbJ0xHJywgJ09wdGltdXMnXSxcbiAgICAgICAgJ09wdGltdXMgTWUnOiBbJ0xHJywgJ09wdGltdXMgTWUnXSxcbiAgICAgICAgJ29wdGltdXMgbWUgcDM1MCc6IFsnTEcnLCAnT3B0aW11cyBNZSddLFxuICAgICAgICAnT3B0aW11cyAyWCc6IFsnTEcnLCAnT3B0aW11cyAyWCddLFxuICAgICAgICAnT3B0aW11cyAyeCc6IFsnTEcnLCAnT3B0aW11cyAyWCddLFxuICAgICAgICAnSVMxMUxHJzogWydMRycsICdPcHRpbXVzIFgnXSxcbiAgICAgICAgJ1ZvcnRleCc6IFsnTEcnLCAnVm9ydGV4J10sXG4gICAgICAgICdMREstSUNLIHYxLjQnOiBbJ0xHJywgJ0VzdGVlbSddLFxuICAgICAgICAnVDYnOiBbJ01hbGF0YScsICdacGFkIFQ2JywgJ3RhYmxldCddLFxuICAgICAgICAnTWFsYXRhIFNNQkExMDAyJzogWydNYWxhdGEnLCAnVGFibGV0IFNNQi1BMTAwMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NUTTcxMkhDWic6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgNzEyYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NUTTgwM0hDJzogWydNZWRpYWNvbScsICdTbWFydFBhZCA4MTBjJywgJ3RhYmxldCddLFxuICAgICAgICAnTWVkaWFjb20gODEwQyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgODEwYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NtYXJ0cGFkODEwYyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgODEwYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NtYXJ0UGFkODEwYyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgODEwYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01QODEwQyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgODEwYycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01QOTA3Qyc6IFsnTWVkaWFjb20nLCAnU21hcnRQYWQgOTA3YycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01USzY1MTYnOiBbJ01lZGlhdGVrJywgJ01USzY1MTYnXSxcbiAgICAgICAgJ0xJRkVUQUIgUzk1MTInOiBbJ01lZGlvbicsICdMaWZldGFiIFM5NTEyJywgJ3RhYmxldCddLFxuICAgICAgICAnTElGRVRBQiBQOTUxNCc6IFsnTWVkaW9uJywgJ0xpZmV0YWIgUDk1MTQnLCAndGFibGV0J10sXG4gICAgICAgICdNRCBMSUZFVEFCIFA5NTE2JzogWydNZWRpb24nLCAnTGlmZXRhYiBQOTUxNicsICd0YWJsZXQnXSxcbiAgICAgICAgJ01FRElPTiBMSUZFIFA0MzEwJzogWydNZWRpb24nLCAnTGlmZSBQNDMxMCddLFxuICAgICAgICAnTTgnOiBbJ01laXp1JywgJ004J10sXG4gICAgICAgICdNOSc6IFsnTWVpenUnLCAnTTknXSxcbiAgICAgICAgJ00wNDAnOiBbJ01laXp1JywgJ00wNDAnXSxcbiAgICAgICAgJ005LXVubG9ja2VkJzogWydNZWl6dScsICdNOSddLFxuICAgICAgICAnbWVpenUgbTknOiBbJ01laXp1JywgJ005J10sXG4gICAgICAgICdNRUlaVSBNOSc6IFsnTWVpenUnLCAnTTknXSxcbiAgICAgICAgJ01FSVpVIE1YJzogWydNZWl6dScsICdNWCddLFxuICAgICAgICAnTTAzMCc6IFsnTWVpenUnLCAnTVggTTAzMCddLFxuICAgICAgICAnTTAzMSc6IFsnTWVpenUnLCAnTVggTTAzMSddLFxuICAgICAgICAnTTAzMic6IFsnTWVpenUnLCAnTVggTTAzMiddLFxuICAgICAgICAnU2xpZGVwYWQnOiBbJ01lbXVwJywgJ1NsaWRlcGFkJywgJ3RhYmxldCddLFxuICAgICAgICAnQTQ1JzogWydNaWNyb21heCcsICdBNDUgUHVuayddLFxuICAgICAgICAnTWljcm9tYXggQTUwJzogWydNaWNyb21heCcsICdBNTAgTmluamEnXSxcbiAgICAgICAgJ01pY3JvbWF4IEE2MCc6IFsnTWljcm9tYXgnLCAnQW5kcm8gQTYwJ10sXG4gICAgICAgICdNaWNyb21heCBBNzAnOiBbJ01pY3JvbWF4JywgJ0FuZHJvIEE3MCddLFxuICAgICAgICAnUDMwMChGdW5ib29rKSc6IFsnTWljcm9tYXgnLCAnRnVuYm9vayBQMzAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQVQ3MzUnOiBbJ01vaW5zdG9uZScsICdBVDczNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0E4NTMnOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSddLFxuICAgICAgICAnQTk1Myc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lIDInXSxcbiAgICAgICAgJ0ExNjgwJzogWydNb3Rvcm9sYScsICdNT1RPIEExNjgwJ10sXG4gICAgICAgICdFVDEnOiBbJ01vdG9yb2xhJywgJ0VUMSBFbnRlcnByaXNlIFRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ01CMjAwJzogWydNb3Rvcm9sYScsICdDTElRJ10sXG4gICAgICAgICdNQjMwMCc6IFsnTW90b3JvbGEnLCAnQkFDS0ZMSVAnXSxcbiAgICAgICAgJ01CNTAxJzogWydNb3Rvcm9sYScsICdDTElRIFhUJ10sXG4gICAgICAgICdNQjUwMic6IFsnTW90b3JvbGEnLCAnQ0hBUk0nXSxcbiAgICAgICAgJ01CNTExJzogWydNb3Rvcm9sYScsICdGTElQT1VUJ10sXG4gICAgICAgICdNQjUyMCc6IFsnTW90b3JvbGEnLCAnQlJBVk8nXSxcbiAgICAgICAgJ01CNTI1JzogWydNb3Rvcm9sYScsICdERUZZJ10sXG4gICAgICAgICdNQjUyNSsnOiBbJ01vdG9yb2xhJywgJ0RFRlknXSxcbiAgICAgICAgJ01CNTI1IGZvciBtZSc6IFsnTW90b3JvbGEnLCAnREVGWSddLFxuICAgICAgICAnTUI1MjYnOiBbJ01vdG9yb2xhJywgJ0RFRlkrJ10sXG4gICAgICAgICdNQjYxMSc6IFsnTW90b3JvbGEnLCAnQ0xJUSAyJ10sXG4gICAgICAgICdNQjYxMic6IFsnTW90b3JvbGEnLCAnWFBSVCddLFxuICAgICAgICAnTUI2MzInOiBbJ01vdG9yb2xhJywgJ1BSTysnXSxcbiAgICAgICAgJ01CODU1JzogWydNb3Rvcm9sYScsICdQSE9UT04gNEcnXSxcbiAgICAgICAgJ01CODYwJzogWydNb3Rvcm9sYScsICdBVFJJWCddLFxuICAgICAgICAnTUI4NjEnOiBbJ01vdG9yb2xhJywgJ0FUUklYJ10sXG4gICAgICAgICdtYjg2MSc6IFsnTW90b3JvbGEnLCAnQVRSSVgnXSxcbiAgICAgICAgJ01CODY1JzogWydNb3Rvcm9sYScsICdBVFJJWCAyJ10sXG4gICAgICAgICdNQjg3MCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWDInXSxcbiAgICAgICAgJ01CODg2JzogWydNb3Rvcm9sYScsICdESU5BUkEnXSxcbiAgICAgICAgJ01FNTAxJzogWydNb3Rvcm9sYScsICdDTElRIFhUJ10sXG4gICAgICAgICdNRTUxMSc6IFsnTW90b3JvbGEnLCAnRkxJUE9VVCddLFxuICAgICAgICAnbWU1MjUnOiBbJ01vdG9yb2xhJywgJ01PVE8gTUU1MjUnXSxcbiAgICAgICAgJ01lNTI1JzogWydNb3Rvcm9sYScsICdNT1RPIE1FNTI1J10sXG4gICAgICAgICdNRTUyNSc6IFsnTW90b3JvbGEnLCAnTU9UTyBNRTUyNSddLFxuICAgICAgICAnTUU1MjUrJzogWydNb3Rvcm9sYScsICdNT1RPIE1FNTI1J10sXG4gICAgICAgICdNRTYwMCc6IFsnTW90b3JvbGEnLCAnQkFDS0ZMSVAnXSxcbiAgICAgICAgJ01FNjMyJzogWydNb3Rvcm9sYScsICdQUk8rJ10sXG4gICAgICAgICdNRTcyMic6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lIDInXSxcbiAgICAgICAgJ01FODExJzogWydNb3Rvcm9sYScsICdEcm9pZCBYJ10sXG4gICAgICAgICdNRTg2MCc6IFsnTW90b3JvbGEnLCAnQVRSSVgnXSxcbiAgICAgICAgJ01FODYzJzogWydNb3Rvcm9sYScsICdNaWxlc3RvbmUgMyddLFxuICAgICAgICAnTUU4NjUnOiBbJ01vdG9yb2xhJywgJ0FUUklYIDInXSxcbiAgICAgICAgJ01UNjIwJzogWydNb3Rvcm9sYScsICdNT1RPIE1UNjIwJ10sXG4gICAgICAgICdNVDYyMHQnOiBbJ01vdG9yb2xhJywgJ01PVE8gTVQ2MjAnXSxcbiAgICAgICAgJ01UNzE2JzogWydNb3Rvcm9sYScsICdNT1RPIE1UNzE2J10sXG4gICAgICAgICdNVDgxMCc6IFsnTW90b3JvbGEnLCAnTU9UTyBNVDgxMCddLFxuICAgICAgICAnTVQ4NzAnOiBbJ01vdG9yb2xhJywgJ01PVE8gTVQ4NzAnXSxcbiAgICAgICAgJ01UOTE3JzogWydNb3Rvcm9sYScsICdNVDkxNyddLFxuICAgICAgICAnTVo1MDUnOiBbJ01vdG9yb2xhJywgJ1hPT00gRmFtaWx5IEVkaXRpb24nLCAndGFibGV0J10sXG4gICAgICAgICdNWjYwMCc6IFsnTW90b3JvbGEnLCAnWE9PTSA0RyBMVEUnLCAndGFibGV0J10sXG4gICAgICAgICdNWjYwMSc6IFsnTW90b3JvbGEnLCAnWE9PTSAzRycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjAyJzogWydNb3Rvcm9sYScsICdYT09NIDRHIExURScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjAzJzogWydNb3Rvcm9sYScsICdYT09NIDNHJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MDQnOiBbJ01vdG9yb2xhJywgJ1hPT00gV2lGaScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjA1JzogWydNb3Rvcm9sYScsICdYT09NIDNHJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MDYnOiBbJ01vdG9yb2xhJywgJ1hPT00gV2lGaScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjA3JzogWydNb3Rvcm9sYScsICdYT09NIDIgV2lGaSBNZWRpYSBFZGl0aW9uJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MDknOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFhZQk9BUkQgOC4yJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MDkgNEcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFhZQk9BUkQgOC4yJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MTUnOiBbJ01vdG9yb2xhJywgJ1hPT00gMiBXaUZpJywgJ3RhYmxldCddLFxuICAgICAgICAnTVo2MTcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFhZQk9BUkQgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ01aNjE3IDRHJzogWydNb3Rvcm9sYScsICdEcm9pZCBYWUJPQVJEIDEwLjEnLCAndGFibGV0J10sXG4gICAgICAgICdXWDQzNSc6IFsnTW90b3JvbGEnLCAnVFJJVU1QSCBXWDQzNSddLFxuICAgICAgICAnV1g0NDUnOiBbJ01vdG9yb2xhJywgJ0NJVFJVUyBXWDQ0NSddLFxuICAgICAgICAnWFQzMDAnOiBbJ01vdG9yb2xhJywgJ1NQSUNFJ10sXG4gICAgICAgICdYVDMwMSc6IFsnTW90b3JvbGEnLCAnTU9UTyBYVDMwMSddLFxuICAgICAgICAnWFQzMTEnOiBbJ01vdG9yb2xhJywgJ0ZJUkUnXSxcbiAgICAgICAgJ1hUMzE2JzogWydNb3Rvcm9sYScsICdNT1RPIFhUMzE2J10sXG4gICAgICAgICdYVDMxOSc6IFsnTW90b3JvbGEnLCAnTU9UTyBYVDMxOSddLFxuICAgICAgICAnWFQzOTAnOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQzOTAnXSxcbiAgICAgICAgJ1hUMzIwJzogWydNb3Rvcm9sYScsICdERUZZIE1pbmknXSxcbiAgICAgICAgJ1hUMzIxJzogWydNb3Rvcm9sYScsICdERUZZIE1pbmknXSxcbiAgICAgICAgJ1hUNTAwJzogWydNb3Rvcm9sYScsICdNT1RPIFhUNTAwJ10sXG4gICAgICAgICd4dC01MDAnOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQ1MDAnXSxcbiAgICAgICAgJ1hUNTAyJzogWydNb3Rvcm9sYScsICdRVUVOQ0ggWFQ1J10sXG4gICAgICAgICdYVDUzMCc6IFsnTW90b3JvbGEnLCAnRklSRSBYVCddLFxuICAgICAgICAnWFQ1MzEnOiBbJ01vdG9yb2xhJywgJ0ZJUkUgWFQnXSxcbiAgICAgICAgJ1hUNTMyJzogWydNb3Rvcm9sYScsICdYVDUzMiddLFxuICAgICAgICAnWFQ1MzUnOiBbJ01vdG9yb2xhJywgJ0RFRlknXSxcbiAgICAgICAgJ1hUNTUwJzogWydNb3Rvcm9sYScsICdYVDU1MCddLFxuICAgICAgICAnWFQ1NTYnOiBbJ01vdG9yb2xhJywgJ1hUNTU2J10sXG4gICAgICAgICdYVDYwMyc6IFsnTW90b3JvbGEnLCAnQURNSVJBTCddLFxuICAgICAgICAnWFQ2MTAnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFBybyddLFxuICAgICAgICAnWFQ2MTUnOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQ2MTUnXSxcbiAgICAgICAgJ1hUNjI2JzogWydNb3Rvcm9sYScsICdNT1RPIFhUNjI2J10sXG4gICAgICAgICdYVDY4MSc6IFsnTW90b3JvbGEnLCAnTU9UTyBYVDY4MSddLFxuICAgICAgICAnWFQ2ODInOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDMnXSxcbiAgICAgICAgJ1hUNjg1JzogWydNb3Rvcm9sYScsICdNT1RPIFhUNjg1J10sXG4gICAgICAgICdYVDY4Nyc6IFsnTW90b3JvbGEnLCAnQVRSSVggVFYnXSxcbiAgICAgICAgJ1hUNzAxJzogWydNb3Rvcm9sYScsICdYVDcwMSddLFxuICAgICAgICAnWFQ3MDInOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQ3MDInXSxcbiAgICAgICAgJ1hUNzExJzogWydNb3Rvcm9sYScsICdNT1RPIFhUNzExJ10sXG4gICAgICAgICdYVDcyMCc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lJ10sXG4gICAgICAgICdYVDg3NSc6IFsnTW90b3JvbGEnLCAnRHJvaWQgQmlvbmljJ10sXG4gICAgICAgICdYVDgwMCc6IFsnTW90b3JvbGEnLCAnTU9UTyBYVDgwMCddLFxuICAgICAgICAnWFQ4MDArJzogWydNb3Rvcm9sYScsICdNT1RPIFhUODAwJ10sXG4gICAgICAgICdYVDgwMFcnOiBbJ01vdG9yb2xhJywgJ01PVE8gR2xhbSddLFxuICAgICAgICAnWFQ4MDYnOiBbJ01vdG9yb2xhJywgJ01PVE8gWFQ4MDYnXSxcbiAgICAgICAgJ1hUODYwJzogWydNb3Rvcm9sYScsICdNaWxlc3RvbmUgMyddLFxuICAgICAgICAnWFQ4NjInOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDMnXSxcbiAgICAgICAgJ1hUODgyJzogWydNb3Rvcm9sYScsICdNT1RPIFhUODgyJ10sXG4gICAgICAgICdYVDg4Myc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lIDMnXSxcbiAgICAgICAgJ1hUODg5JzogWydNb3Rvcm9sYScsICdYVDg4OSddLFxuICAgICAgICAnWFQ4OTcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDQnXSxcbiAgICAgICAgJ1hUOTAxJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdYVDkxMCc6IFsnTW90b3JvbGEnLCAnUkFaUiddLFxuICAgICAgICAnWFQ5MTBLJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdYVDkxMFMnOiBbJ01vdG9yb2xhJywgJ1JBWlInXSxcbiAgICAgICAgJ1hUOTEwIDRHJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdYVDkxMic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnWFQ5MjMnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFJBWlIgSEQnXSxcbiAgICAgICAgJ1hUOTI1JzogWydNb3Rvcm9sYScsICdEcm9pZCBSQVpSIEhEJ10sXG4gICAgICAgICdYVDkyNic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnWFQ5MjYgNEcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFJBWlInXSxcbiAgICAgICAgJ1hUOTI4JzogWydNb3Rvcm9sYScsICdYVDkyOCddLFxuICAgICAgICAnQXRyaXggMic6IFsnTW90b3JvbGEnLCAnQVRSSVggMiddLFxuICAgICAgICAnQXRyaXggNGcnOiBbJ01vdG9yb2xhJywgJ0FUUklYIDRHJ10sXG4gICAgICAgICdBdHJpeCA0Ryc6IFsnTW90b3JvbGEnLCAnQVRSSVggNEcnXSxcbiAgICAgICAgJ0F0cml4IDRHIE1FODYwJzogWydNb3Rvcm9sYScsICdBVFJJWCA0RyddLFxuICAgICAgICAnQ0xJUSc6IFsnTW90b3JvbGEnLCAnQ0xJUSddLFxuICAgICAgICAnQ0xJUSBYVCc6IFsnTW90b3JvbGEnLCAnQ0xJUSBYVCddLFxuICAgICAgICAnQ0xJUTInOiBbJ01vdG9yb2xhJywgJ0NMSVEgMiddLFxuICAgICAgICAnQ29ydmFpcic6IFsnTW90b3JvbGEnLCAnQ29ydmFpcicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0RFRlknOiBbJ01vdG9yb2xhJywgJ0RFRlknXSxcbiAgICAgICAgJ0RlZnkrJzogWydNb3Rvcm9sYScsICdERUZZKyddLFxuICAgICAgICAnRGVmeSBQbHVzJzogWydNb3Rvcm9sYScsICdERUZZKyddLFxuICAgICAgICAnRGV2b3VyJzogWydNb3Rvcm9sYScsICdEZXZvdXInXSxcbiAgICAgICAgJ0RleHQnOiBbJ01vdG9yb2xhJywgJ0RleHQnXSxcbiAgICAgICAgJ0Ryb2lkJzogWydNb3Rvcm9sYScsICdEcm9pZCddLFxuICAgICAgICAnRFJPSUQnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkJ10sXG4gICAgICAgICdEUk9JRDInOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDInXSxcbiAgICAgICAgJ0RST0lEMiBHTE9CQUwnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDInXSxcbiAgICAgICAgJ0RST0lEMiBHbG9iYWwnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDInXSxcbiAgICAgICAgJ0Ryb2lkMkdsb2JhbCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgMiddLFxuICAgICAgICAnRFJPSUQgMic6IFsnTW90b3JvbGEnLCAnRHJvaWQgMiddLFxuICAgICAgICAnRFJPSUQzJzogWydNb3Rvcm9sYScsICdEcm9pZCAzJ10sXG4gICAgICAgICdEUk9JRDQnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIDQnXSxcbiAgICAgICAgJ0RST0lENCA0Ryc6IFsnTW90b3JvbGEnLCAnRHJvaWQgNCddLFxuICAgICAgICAnRFJPSUQgUHJvJzogWydNb3Rvcm9sYScsICdEcm9pZCBQcm8nXSxcbiAgICAgICAgJ0RST0lEIEJJT05JQyc6IFsnTW90b3JvbGEnLCAnRHJvaWQgQmlvbmljJ10sXG4gICAgICAgICdEUk9JRCBCSU9OSUMgNEcnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIEJpb25pYyddLFxuICAgICAgICAnRFJPSUQgQklPTklDIFhUODc1IDRHJzogWydNb3Rvcm9sYScsICdEcm9pZCBCaW9uaWMnXSxcbiAgICAgICAgJ0RST0lEUkFaUic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnRHJvaWQgUmF6cic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnRFJPSUQgUkFaUic6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnRFJPSUQgUkFaUiA0Ryc6IFsnTW90b3JvbGEnLCAnRHJvaWQgUkFaUiddLFxuICAgICAgICAnRFJPSUQgU1BZREVSJzogWydNb3Rvcm9sYScsICdEcm9pZCBSQVpSJ10sXG4gICAgICAgICdEUk9JRCBSQVpSIEhEJzogWydNb3Rvcm9sYScsICdEcm9pZCBSQVpSIEhEJ10sXG4gICAgICAgICdEUk9JRCBSQVpSIEhEIDRHJzogWydNb3Rvcm9sYScsICdEcm9pZCBSQVpSIEhEJ10sXG4gICAgICAgICdEcm9pZFgnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFgnXSxcbiAgICAgICAgJ0RST0lEWCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWCddLFxuICAgICAgICAnZHJvaWQgeCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWCddLFxuICAgICAgICAnRHJvaWQgWCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWCddLFxuICAgICAgICAnRFJPSUQgWCc6IFsnTW90b3JvbGEnLCAnRHJvaWQgWCddLFxuICAgICAgICAnRFJPSUQgWDInOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFgyJ10sXG4gICAgICAgICdFbGVjdHJpZnknOiBbJ01vdG9yb2xhJywgJ0VsZWN0cmlmeSddLFxuICAgICAgICAnTWlsZXN0b25lIFhUNzIwJzogWydNb3Rvcm9sYScsICdNaWxlc3RvbmUnXSxcbiAgICAgICAgJ01pbGVzdG9uZSBYdDcyMCc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lJ10sXG4gICAgICAgICdNaWxlc3RvbmUnOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSddLFxuICAgICAgICAnQTg1MyBNaWxlc3RvbmUnOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSddLFxuICAgICAgICAnTWlsZXN0b25lIFgnOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSBYJ10sXG4gICAgICAgICdNaWxlc3RvbmUgWDInOiBbJ01vdG9yb2xhJywgJ01pbGVzdG9uZSBYMiddLFxuICAgICAgICAnTW90b3JvaVgnOiBbJ01vdG9yb2xhJywgJ0Ryb2lkIFgnXSxcbiAgICAgICAgJ01vdG8gQmFja2ZsaXAnOiBbJ01vdG9yb2xhJywgJ0JBQ0tGTElQJ10sXG4gICAgICAgICdSQVpSJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdUcml1bXBoJzogWydNb3Rvcm9sYScsICdUUklVTVBIJ10sXG4gICAgICAgICdPcHVzIE9uZSc6IFsnTW90b3JvbGEnLCAnaTEnXSxcbiAgICAgICAgJ1Bob3Rvbic6IFsnTW90b3JvbGEnLCAnUEhPVE9OJ10sXG4gICAgICAgICdQaG90b24gNEcnOiBbJ01vdG9yb2xhJywgJ1BIT1RPTiA0RyddLFxuICAgICAgICAnWE9PTSc6IFsnTW90b3JvbGEnLCAnWE9PTScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1hvb20nOiBbJ01vdG9yb2xhJywgJ1hPT00nLCAndGFibGV0J10sXG4gICAgICAgICdYT09NIDInOiBbJ01vdG9yb2xhJywgJ1hPT00gMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1hPT00gMiBNRSc6IFsnTW90b3JvbGEnLCAnWE9PTSAyJywgJ3RhYmxldCddLFxuICAgICAgICAnWE9PTSBNWjYwNic6IFsnTW90b3JvbGEnLCAnWE9PTSBXaUZpJywgJ3RhYmxldCddLFxuICAgICAgICAnSVNXMTFNJzogWydNb3Rvcm9sYScsICdQSE9UT04nXSxcbiAgICAgICAgJ0lTMTJNJzogWydNb3Rvcm9sYScsICdSQVpSJ10sXG4gICAgICAgICdNT1RXWDQzNUtUJzogWydNb3Rvcm9sYScsICdUUklVTVBIJ10sXG4gICAgICAgICdYMy1JY2UgTUlVSSBYVDcyMCBNZW1vcmlsYSBDbGFzc2ljcyc6IFsnTW90b3JvbGEnLCAnTWlsZXN0b25lJ10sXG4gICAgICAgICdOQUJJLUEnOiBbJ05hYmknLCAnS2lkcyB0YWJsZXQnLCAndGFibGV0J10sXG4gICAgICAgICdOZXdwYWQnOiBbJ05ld3NteScsICdOZXdwYWQnLCAndGFibGV0J10sXG4gICAgICAgICdOZXdwYWQtSzk3JzogWydOZXdzbXknLCAnTmV3cGFkIEs5NycsICd0YWJsZXQnXSxcbiAgICAgICAgJ05ld3BhZCBQOSc6IFsnTmV3c215JywgJ05ld3BhZCBQOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ00tUEFEIE44JzogWydOZXdzbXknLCAnTS1wYWQgTjgnLCAndGFibGV0J10sXG4gICAgICAgICdMVC1OQTcnOiBbJ05FQycsICdMVC1OQTcnXSxcbiAgICAgICAgJ04tMDFEJzogWydORUMnLCAnTUVESUFTIFBQIE4tMDFEJ10sXG4gICAgICAgICdOLTA0Qyc6IFsnTkVDJywgJ01FRElBUyBOLTA0QyddLFxuICAgICAgICAnTi0wNEQnOiBbJ05FQycsICdNRURJQVMgTFRFIE4tMDREJ10sXG4gICAgICAgICdOLTA1RCc6IFsnTkVDJywgJ01FRElBUyBFUyBOLTA1RCddLFxuICAgICAgICAnTi0wNkMnOiBbJ05FQycsICdNRURJQVMgV1AgTi0wNkMnXSxcbiAgICAgICAgJ04tMDZEJzogWydORUMnLCAnTUVESUFTIFRhYiBOLTA2RCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ04tMDdEJzogWydORUMnLCAnTUVESUFTIFggTi0wN0QnXSxcbiAgICAgICAgJzEwMU4nOiBbJ05FQycsICdNRURJQVMgQ0ggU29mdGJhbmsgMTAxTiddLFxuICAgICAgICAnSVMxMU4nOiBbJ05FQycsICdNRURJQVMgQlIgSVMxMU4nXSxcbiAgICAgICAgJ05leGlhbiBOWC1BODkwJzogWydOZXhpYW4nLCAnSm91cm5leSddLFxuICAgICAgICAnTlgtQTg5MSc6IFsnTmV4aWFuJywgJ1VsdHJhIEpvdXJuZXknXSxcbiAgICAgICAgJ003MjZIQyc6IFsnTmV4dGJvb2snLCAnUHJlbWl1bSA3JywgJ2VyZWFkZXInXSxcbiAgICAgICAgJ05YTTcyNkhOJzogWydOZXh0Ym9vaycsICdQcmVtaXVtIDcnLCAnZXJlYWRlciddLFxuICAgICAgICAnTlhNODAzSEQnOiBbJ05leHRib29rJywgJ1ByZW1pdW0gOCcsICdlcmVhZGVyJ10sXG4gICAgICAgICdEQVRBTTgwM0hDJzogWydOZXh0Ym9vaycsICdQcmVtaXVtIDgnLCAnZXJlYWRlciddLFxuICAgICAgICAnTlhNOTAxJzogWydOZXh0Ym9vaycsICdOZXh0IDMnLCAnZXJlYWRlciddLFxuICAgICAgICAnTkdNIFZhbml0eSBTbWFydCc6IFsnTkdNJywgJ1Zhbml0eSBTbWFydCddLFxuICAgICAgICAnTm9raWEgTjknOiBbJ05va2lhJywgJ045J10sXG4gICAgICAgICdOb2tpYSBOOTAwJzogWydOb2tpYScsICdOOTAwJ10sXG4gICAgICAgICdMdW1pYTgwMCc6IFsnTm9raWEnLCAnTHVtaWEgODAwJ10sXG4gICAgICAgICdMdW1pYSA5MDAnOiBbJ05va2lhJywgJ0x1bWlhIDkwMCddLFxuICAgICAgICAnTm90aW9uIEluayBBREFNJzogWydOb3Rpb24gSW5rJywgJ0FEQU0nLCAndGFibGV0J10sXG4gICAgICAgICdQNEQgU0lSSVVTJzogWydOdnNibCcsICdQNEQgU0lSSVVTJywgJ3RhYmxldCddLFxuICAgICAgICAnUDREIFNpcml1cyc6IFsnTnZzYmwnLCAnUDREIFNJUklVUycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0VGTTcxMEEnOiBbJ09ibGlvJywgJ01pbnQgN3gnLCAndGFibGV0J10sXG4gICAgICAgICdPRFlTLVhwcmVzcyc6IFsnT2R5cycsICdYcHJlc3MnLCAndGFibGV0J10sXG4gICAgICAgICdPbGl2ZXR0aSBPbGlwYWQgMTAwJzogWydPbGl2ZXR0aScsICdPbGlwYWQgMTAwJywgJ3RhYmxldCddLFxuICAgICAgICAnT1AxMTAnOiBbJ09saXZldHRpJywgJ09saXBhZCAxMTAnLCAndGFibGV0J10sXG4gICAgICAgICdPTkRBIE1JRCc6IFsnT25kYScsICdNSUQnLCAndGFibGV0J10sXG4gICAgICAgICdWWDU4MEEnOiBbJ09uZGEnLCAnVlg1ODBBJywgJ3RhYmxldCddLFxuICAgICAgICAnVlg2MTBBJzogWydPbmRhJywgJ1ZYNjEwQScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RRMTUwJzogWydPbmRhJywgJ1RRMTUwJ10sXG4gICAgICAgICdOMlQnOiBbJ09OTicsICdOMlQnLCAndGFibGV0J10sXG4gICAgICAgICdSZW5lc2FzJzogWydPcGFkJywgJ1JlbmVzYXMnLCAndGFibGV0J10sXG4gICAgICAgICdyZW5lc2FzIGVtZXYnOiBbJ09wYWQnLCAnUmVuZXNhcycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1g5MDMnOiBbJ09wcG8nLCAnRmluZCBNZSBYOTAzJ10sXG4gICAgICAgICdYOTA1JzogWydPcHBvJywgJ0ZpbmQgMyBYOTA1J10sXG4gICAgICAgICdSODA1JzogWydPcHBvJywgJ1I4MDUnXSxcbiAgICAgICAgJ1I4MDEnOiBbJ09wcG8nLCAnUjgwMSddLFxuICAgICAgICAnUjgxMSc6IFsnT3BwbycsICdSODExJ10sXG4gICAgICAgICdYOTA5JzogWydPcHBvJywgJ1g5MDknXSxcbiAgICAgICAgJ09QUE9SODAxJzogWydPcHBvJywgJ1I4MDEnXSxcbiAgICAgICAgJ09QUE9YOTA1JzogWydPcHBvJywgJ0ZpbmQgMyBYOTA1J10sXG4gICAgICAgICdPUFBPWDkwNyc6IFsnT3BwbycsICdGaW5kIDMgWDkwNyddLFxuICAgICAgICAnWDkwNyc6IFsnT3BwbycsICdGaW5kIDMgWDkwNyddLFxuICAgICAgICAnWDkwMTUnOiBbJ09wcG8nLCAnRmluZCBYOTAxNSddLFxuICAgICAgICAnT1BQT1g5MDE3JzogWydPcHBvJywgJ0ZpbmRlciBYOTAxNyddLFxuICAgICAgICAnT1BQT1U3MDEnOiBbJ09wcG8nLCAnT1BQT1U3MDEnXSxcbiAgICAgICAgJ09QUE9SODA3JzogWydPcHBvJywgJ1JlYWwgUjgwNyddLFxuICAgICAgICAnT1BQT1I4MDUnOiBbJ09wcG8nLCAnUmVhbCBSODA1J10sXG4gICAgICAgICdSODA3JzogWydPcHBvJywgJ1JlYWwgUjgwNyddLFxuICAgICAgICAnT1BQT1Q3MDMnOiBbJ09wcG8nLCAnVDcwMyddLFxuICAgICAgICAnUC0wMUQnOiBbJ1BhbmFzb25pYycsICdQLTAxRCddLFxuICAgICAgICAnUC0wMkQnOiBbJ1BhbmFzb25pYycsICdMdW1peCBQaG9uZSddLFxuICAgICAgICAnUC0wNEQnOiBbJ1BhbmFzb25pYycsICdFbHVnYSddLFxuICAgICAgICAnUC0wN0MnOiBbJ1BhbmFzb25pYycsICdQLTA3QyddLFxuICAgICAgICAnZEwxJzogWydQYW5hc29uaWMnLCAnRWx1Z2EgZEwxJ10sXG4gICAgICAgICcxMDFQJzogWydQYW5hc29uaWMnLCAnTHVtaXggUGhvbmUnXSxcbiAgICAgICAgJ0pULUg1ODBWVCc6IFsnUGFuYXNvbmljJywgJ0JpelBhZCA3JywgJ3RhYmxldCddLFxuICAgICAgICAnSlQtSDU4MVZUJzogWydQYW5hc29uaWMnLCAnQml6UGFkIDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnRlotQTFBJzogWydQYW5hc29uaWMnLCAnVG91Z2hwYWQnLCAndGFibGV0J10sXG4gICAgICAgICdwYW5kaWdpdGFsOWhyJzogWydQYW5kaWdpdGFsJywgJzlIUicsICd0YWJsZXQnXSxcbiAgICAgICAgJ3BhbmRpZ2l0YWw5aHIyJzogWydQYW5kaWdpdGFsJywgJzlIUjInLCAndGFibGV0J10sXG4gICAgICAgICdwYW5kaWdpdGFsb3BjMSc6IFsnUGFuZGlnaXRhbCcsICdPUEMxJywgJ3RhYmxldCddLFxuICAgICAgICAncGFuZGlnaXRhbG9wcDEnOiBbJ1BhbmRpZ2l0YWwnLCAnT1BQMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ3BhbmRpZ2l0YWxwMWhyJzogWydQYW5kaWdpdGFsJywgJ3AxaHInLCAndGFibGV0J10sXG4gICAgICAgICdJTS1BNjAwUyc6IFsnUGFudGVjaCcsICdTSVJJVVMgXFx1MDBjM1xcdWZmZmRcXHUwMGMyXFx1MDBiMSddLFxuICAgICAgICAnSU0tQTYzMEsnOiBbJ1BhbnRlY2gnLCAnU0tZIEl6YXInXSxcbiAgICAgICAgJ0lNLUE2OTBMJzogWydQYW50ZWNoJywgJ1NLWSddLFxuICAgICAgICAnSU0tQTY5MFMnOiBbJ1BhbnRlY2gnLCAnU0tZJ10sXG4gICAgICAgICdJTS1BNzEwSyc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSBYcHJlc3MnXSxcbiAgICAgICAgJ0lNLUE3MjBMJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIFhwcmVzcyddLFxuICAgICAgICAnSU0tQTcyNUwnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgWCsnXSxcbiAgICAgICAgJ0lNLUE3MzBzJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIFMnXSxcbiAgICAgICAgJ0lNLUE3MzBTJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIFMnXSxcbiAgICAgICAgJ0lNLUE3NTBLJzogWydQYW50ZWNoJywgJ1NLWSBNaXJhY2ggQSddLFxuICAgICAgICAnSU0tQTc2MFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUmFjZXInXSxcbiAgICAgICAgJ0lNLUE3NzBLJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIFJhY2VyJ10sXG4gICAgICAgICdJTS1BNzgwTCc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSBSYWNlciddLFxuICAgICAgICAnSU0tQTgwMFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgTFRFJ10sXG4gICAgICAgICdJTS1BODEwSyc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSBMVEUgTSddLFxuICAgICAgICAnSU0tQTgxMFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgTFRFIE0nXSxcbiAgICAgICAgJ0lNLUE4MjBMJzogWydQYW50ZWNoJywgJ1NLWSBWZWdhIExURSBFWCddLFxuICAgICAgICAnSU0tQTgzMEsnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUmFjZXIgMiddLFxuICAgICAgICAnSU0tQTgzMEwnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUmFjZXIgMiddLFxuICAgICAgICAnSU0tQTgzMFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUmFjZXIgMiddLFxuICAgICAgICAnSU0tQTg0MFMnOiBbJ1BhbnRlY2gnLCAnU0tZIFZlZ2EgUzUnXSxcbiAgICAgICAgJ0lNLUE4NTBLJzogWydQYW50ZWNoJywgJ0lNLUE4NTBLJ10sXG4gICAgICAgICdJTS1UMTAwSyc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSBOby4gNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0lTMDYnOiBbJ1BhbnRlY2gnLCAnU0lSSVVTIFxcdTAwYzNcXHVmZmZkXFx1MDBjMlxcdTAwYjEnXSxcbiAgICAgICAgJ0FEUjg5OTUnOiBbJ1BhbnRlY2gnLCAnQnJlYWtvdXQnXSxcbiAgICAgICAgJ0FEUjg5OTUgNEcnOiBbJ1BhbnRlY2gnLCAnQnJlYWtvdXQnXSxcbiAgICAgICAgJ0FEUjkxMEwgNEcnOiBbJ1BhbnRlY2gnLCAnQURSOTEwTCddLFxuICAgICAgICAnUGFudGVjaFA0MTAwJzogWydQYW50ZWNoJywgJ0VsZW1lbnQnLCAndGFibGV0J10sXG4gICAgICAgICdQYW50ZWNoUDgwMDAnOiBbJ1BhbnRlY2gnLCAnQ3Jvc3NvdmVyJ10sXG4gICAgICAgICdQYW50ZWNoUDgwMTAnOiBbJ1BhbnRlY2gnLCAnUDgwMTAnXSxcbiAgICAgICAgJ1BhbnRlY2hQOTA2MCc6IFsnUGFudGVjaCcsICdQb2NrZXQnXSxcbiAgICAgICAgJ1BhbnRlY2hQOTA3MCc6IFsnUGFudGVjaCcsICdCdXJzdCddLFxuICAgICAgICAnU0tZIElNLUE2MDBTJzogWydQYW50ZWNoJywgJ1NJUklVUyBcXHUwMGMzXFx1ZmZmZFxcdTAwYzJcXHUwMGIxJ10sXG4gICAgICAgICdTS1kgSU0tQTYzMEsnOiBbJ1BhbnRlY2gnLCAnU0tZIEl6YXInXSxcbiAgICAgICAgJ1NLWSBJTS1BNjUwUyc6IFsnUGFudGVjaCcsICdTS1kgVmVnYSddLFxuICAgICAgICAnSVMxMVBUJzogWydQYW50ZWNoJywgJ01pcmFjaCBJUzExUFQnXSxcbiAgICAgICAgJ1BBVDcxMlcnOiBbJ1BlcmZlbycsICdQQVQ3MTJXJywgJ3RhYmxldCddLFxuICAgICAgICAnWDdHJzogWydQZWFybCcsICdUb3VjaGxldCBYN0cnLCAndGFibGV0J10sXG4gICAgICAgICdGV1M4MTAnOiBbJ1BISUNPTU0nLCAnRldTODEwJ10sXG4gICAgICAgICdQaGlsaXBzIFBJNTAwMCc6IFsnUGhpbGlwcycsICdQSTUwMDAnLCAndGFibGV0J10sXG4gICAgICAgICdQSTcwMDAnOiBbJ1BoaWxpcHMnLCAnUEk3MDAwJywgJ3RhYmxldCddLFxuICAgICAgICAnUGhpbGlwcyBXNjI2JzogWydQaGlsaXBzJywgJ1c2MjYnXSxcbiAgICAgICAgJ1BoaWxpcHMgVzYzMic6IFsnUGhpbGlwcycsICdXNjMyJ10sXG4gICAgICAgICdNT01PJzogWydQbG95ZXInLCAnTU9NTycsICd0YWJsZXQnXSxcbiAgICAgICAgJ01PTU8xNSc6IFsnUGxveWVyJywgJ01PTU8xNScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1BvY2tldEJvb2sgQTcnOiBbJ1BvY2tldEJvb2snLCAnQTcnLCAndGFibGV0J10sXG4gICAgICAgICdQb2NrZXRCb29rIEExMCc6IFsnUG9ja2V0Qm9vaycsICdBMTAnLCAndGFibGV0J10sXG4gICAgICAgICdNb2JpaSA3JzogWydQb2ludCBPZiBWaWV3JywgJ01vYmlpIDcnLCAndGFibGV0J10sXG4gICAgICAgICdQTVAzMzg0QlJVJzogWydQcmVzdGlnaW8nLCAnTXVsdGlwYWQgMzM4NCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RCMDdGVEEnOiBbJ1Bvc2l0aXZvJywgJ1RCMDdGVEEnLCAndGFibGV0J10sXG4gICAgICAgICdRVyBUQi0xMjA3JzogWydRd2FyZScsICdQcm8zJywgJ3RhYmxldCddLFxuICAgICAgICAnVzZIRCBJQ1MnOiBbJ1JhbW9zJywgJ1c2SEQnLCAndGFibGV0J10sXG4gICAgICAgICd3MTAnOiBbJ1JhbW9zJywgJ1cxMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1cxMCc6IFsnUmFtb3MnLCAnVzEwJywgJ3RhYmxldCddLFxuICAgICAgICAndzEwIHYyLjAnOiBbJ1JhbW9zJywgJ1cxMCB2Mi4wJywgJ3RhYmxldCddLFxuICAgICAgICAnVzEwIFYyLjAnOiBbJ1JhbW9zJywgJ1cxMCB2Mi4wJywgJ3RhYmxldCddLFxuICAgICAgICAnVDExQUQnOiBbJ1JhbW9zJywgJ1QxMUFEJywgJ3RhYmxldCddLFxuICAgICAgICAnVDExQUQuRkUnOiBbJ1JhbW9zJywgJ1QxMUFEJywgJ3RhYmxldCddLFxuICAgICAgICAnUGxheUJvb2snOiBbJ1JJTScsICdCbGFja0JlcnJ5IFBsYXlCb29rJywgJ3RhYmxldCddLFxuICAgICAgICAnUkJLLTQ5MCc6IFsnUml0bWl4JywgJ1JCSy00OTAnLCAndGFibGV0J10sXG4gICAgICAgICdBOEhEJzogWydTYWF5aScsICdEcm9wYWQgQThIRCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVM3NTY4JzogWydTYW1zdW5nJywgJ1M3NTY4J10sXG4gICAgICAgICdHYWxheHkgTmV4dXMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5leHVzJ10sXG4gICAgICAgICdHVC1CNTMzMCc6IFsnU2Ftc3VuZycsICdHVC1CNTMzMCddLFxuICAgICAgICAnR1QtQjU1MTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgUHJvJ10sXG4gICAgICAgICdHVC1CNTUxMEInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgUHJvJ10sXG4gICAgICAgICdHVC1CNTUxMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgUHJvJ10sXG4gICAgICAgICdHVC1CNTUxMic6IFsnU2Ftc3VuZycsICdHYWxheHkgWSBQcm8gRHVvcyddLFxuICAgICAgICAnR1QtQjc1MTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFBybyddLFxuICAgICAgICAnR1QtQjc1MTBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBQcm8nXSxcbiAgICAgICAgJ0dULUk1NTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSA1J10sXG4gICAgICAgICdHVC1JNTUwMEInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IDUnXSxcbiAgICAgICAgJ0dULUk1NTAwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgNSddLFxuICAgICAgICAnR1QtSTU1MDBNJzogWydTYW1zdW5nJywgJ0dhbGF4eSA1J10sXG4gICAgICAgICdHVC1JNTUwMC1NUjMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IDUnXSxcbiAgICAgICAgJ0dULUk1NTAzJzogWydTYW1zdW5nJywgJ0dhbGF4eSA1J10sXG4gICAgICAgICdHVC1JNTUwOCc6IFsnU2Ftc3VuZycsICdHYWxheHkgNSddLFxuICAgICAgICAnR1QtSTU1MTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IDU1MSddLFxuICAgICAgICAnR1QtSTU1MTBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSA1NTEnXSxcbiAgICAgICAgJ0dULUk1NTEwTSc6IFsnU2Ftc3VuZycsICdHYWxheHkgNTUxJ10sXG4gICAgICAgICdHVC1JNTUxMFQnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IDU1MSddLFxuICAgICAgICAnR1QtSTU3MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFNwaWNhJ10sXG4gICAgICAgICdHVC1JNTcwMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFNwaWNhJ10sXG4gICAgICAgICdHVC1JNTgwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgQXBvbGxvJ10sXG4gICAgICAgICdHVC1JNTgwMEQnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFwb2xsbyddLFxuICAgICAgICAnR1QtSTU4MDBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBcG9sbG8nXSxcbiAgICAgICAgJ0dULUk1ODAxJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBcG9sbG8nXSxcbiAgICAgICAgJ0dULUk2NTAwVSc6IFsnU2Ftc3VuZycsICdTYXR1cm4nXSxcbiAgICAgICAgJ0dULUk4MDAwJzogWydTYW1zdW5nJywgJ09tbmlhIDInXSxcbiAgICAgICAgJ0dULUk4MTUwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBXJ10sXG4gICAgICAgICdHVC1JODE1MEInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFcnXSxcbiAgICAgICAgJ0dULUk4MTYwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgMiddLFxuICAgICAgICAnR1QtSTgxNjBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgMiddLFxuICAgICAgICAnR1QtSTgxNjBQJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgMiddLFxuICAgICAgICAnR1QtSTgzMjAnOiBbJ1NhbXN1bmcnLCAnSDEnXSxcbiAgICAgICAgJ0dULUk4NTIwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBCZWFtJ10sXG4gICAgICAgICdHVC1JODUzMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgQmVhbSddLFxuICAgICAgICAnR1QtSTgyNTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEJlYW0nXSxcbiAgICAgICAgJ0dULWk5MDAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHVC1JOTAwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyddLFxuICAgICAgICAnR1QtSTkwMDBCJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHVC1JOTAwME0nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgVmlicmFudCddLFxuICAgICAgICAnR1QtSTkwMDBUJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHVC1JOTAwMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBQbHVzJ10sXG4gICAgICAgICdHVC1JOTAwMyc6IFsnU2Ftc3VuZycsICdHYWxheHkgU0wnXSxcbiAgICAgICAgJ0dULUk5MDAzTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgU0wnXSxcbiAgICAgICAgJ0dULUk5MDA4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHVC1JOTAwOEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMnXSxcbiAgICAgICAgJ0dULUk5MDEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEdpb3JnaW8gQXJtYW5pJ10sXG4gICAgICAgICdHVC1JOTAxOCc6IFsnU2Ftc3VuZycsICdHYWxheHkgR1QtSTkwMTgnXSxcbiAgICAgICAgJ0dULUk5MDcwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEFkdmFuY2UnXSxcbiAgICAgICAgJ0dULUk5MDcwUCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBBZHZhbmNlJ10sXG4gICAgICAgICdHVC1JOTA4Mic6IFsnU2Ftc3VuZycsICdHYWxheHkgR3JhbmQgRFVPUyddLFxuICAgICAgICAnR1QtSTkwODgnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMnXSxcbiAgICAgICAgJ0dULWk5MTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdHVC1JOTEwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnR1QtSTkxMDBHJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdHVC1JOTEwME0nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ0dULUk5MTAwVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnR1QtSTkxMDBQJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdHVC1JOTEwMyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUiddLFxuICAgICAgICAnR1QtSTkxMDgnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ0dULUk5MjEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJIExURSddLFxuICAgICAgICAnR1QtSTkyMTBUJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJIExURSddLFxuICAgICAgICAnR1QtSTkyMjAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ0dULUk5MjI4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdHVC1JOTI1MCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ0dULUk5MjUwIEVVUiBYWCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ0dULUk5MjYwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBQcmVtaWVyJ10sXG4gICAgICAgICdHVC1JOTMwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ0dULUk5MzAwVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ0dULUk5MzAzVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ0dULUk5MzA4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJSSddLFxuICAgICAgICAnR1QtSTk1MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEdULUk5NTAwJ10sXG4gICAgICAgICdHVC1JOTgwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgR1QtSTk4MDAnXSxcbiAgICAgICAgJ0dULU43MDAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdHVC1ONzAwMEInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ0dULU43MTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlIElJJ10sXG4gICAgICAgICdHVC1ONzEwMic6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBJSSddLFxuICAgICAgICAnR1QtTjgwMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUgMTAuMSddLFxuICAgICAgICAnR1QtTjgwMTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUgMTAuMSddLFxuICAgICAgICAnR1QtUDEwMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVAxMDAwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDEwMDBNJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QMTAwME4nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVAxMDAwVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDEwMDAgVGFibGV0JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QMTAxMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDMxMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAyICg3LjApJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDMxMDBCJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMiAoNy4wKScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVAzMTEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMiAoNy4wKScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVAzMTEzJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMiAoNy4wKScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA1MTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMiAoMTAuMSknLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNTExMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDIgKDEwLjEpJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDUxMTMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAyICgxMC4xKScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA2MjAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wIFBsdXMnLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNjIwMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA3LjAgUGx1cycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA2MjAxJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wIFBsdXMgTicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA2MjEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wIFBsdXMnLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNjIxMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDcuMCBQbHVzIE4nLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNjgwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDcuNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA2ODEwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy43JywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDcxMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAxMC4xVicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3MzAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgOC45JywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDczMDBCJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgOC45JywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDczMTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA4LjknLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNzMyMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3MzIwVCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3NTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3NTAwRCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDEwLjEnLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNzUwMFInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAxMC4xJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUDc1MDBWJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dULVA3NTAxJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMU4nLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNzUxMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDEwLjEnLCAndGFibGV0J10sXG4gICAgICAgICdHVC1QNzUxMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDEwLjFOJywgJ3RhYmxldCddLFxuICAgICAgICAnR1QtUzUzMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFBvY2tldCddLFxuICAgICAgICAnR1QtUzUzNjAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFknXSxcbiAgICAgICAgJ0dULVM1MzYwQic6IFsnU2Ftc3VuZycsICdHYWxheHkgWSddLFxuICAgICAgICAnR1QtUzUzNjBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBZJ10sXG4gICAgICAgICdHVC1TNTM2Myc6IFsnU2Ftc3VuZycsICdHYWxheHkgWSddLFxuICAgICAgICAnR1QtUzUzNjcnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgVFYnXSxcbiAgICAgICAgJ0dULVM1MzY4JzogWydTYW1zdW5nJywgJ0dULVM1MzY4J10sXG4gICAgICAgICdHVC1TNTM2OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgWSddLFxuICAgICAgICAnR1QtUzU1NzAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE1pbmknXSxcbiAgICAgICAgJ0dULVM1NTcwQic6IFsnU2Ftc3VuZycsICdHYWxheHkgTWluaSddLFxuICAgICAgICAnR1QtUzU1NzBJJzogWydTYW1zdW5nJywgJ0dhbGF4eSBNaW5pJ10sXG4gICAgICAgICdHVC1TNTU3MEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE1pbmknXSxcbiAgICAgICAgJ0dULVM1NTc4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBNaW5pJ10sXG4gICAgICAgICdHVC1TNTY2MCc6IFsnU2Ftc3VuZycsICdHYWxheHkgR2lvJ10sXG4gICAgICAgICdHVC1TNTY2ME0nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEdpbyddLFxuICAgICAgICAnR1QtUzU2NjBWJzogWydTYW1zdW5nJywgJ0dhbGF4eSBHaW8nXSxcbiAgICAgICAgJ0dULVM1NjcwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBGaXQnXSxcbiAgICAgICAgJ0dULVM1NjcwQic6IFsnU2Ftc3VuZycsICdHYWxheHkgRml0J10sXG4gICAgICAgICdHVC1TNTY3MEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEZpdCddLFxuICAgICAgICAnR1QtUzU2OTAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFhjb3ZlciddLFxuICAgICAgICAnR1QtUzU2OTBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBYY292ZXInXSxcbiAgICAgICAgJ0dULVM1ODIwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODMwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODMwQic6IFsnU2Ftc3VuZycsICdHYWxheHkgQWNlJ10sXG4gICAgICAgICdHVC1TNTgzMEMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnR1QtUzU4MzBEJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODMwRC1wYXJyb3QnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnR1QtUzU4MzBpJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODMwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgQWNlJ10sXG4gICAgICAgICdHVC1TNTgzME0nOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnR1QtUzU4MzBUJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODM4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UnXSxcbiAgICAgICAgJ0dULVM1ODM5aSc6IFsnU2Ftc3VuZycsICdHYWxheHkgQWNlJ10sXG4gICAgICAgICdHVC1TNjEwMic6IFsnU2Ftc3VuZycsICdHYWxheHkgWSBEdW9zJ10sXG4gICAgICAgICdHVC1TNjEwMkInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFkgRHVvcyddLFxuICAgICAgICAnR1QtUzY1MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE1pbmkgMiddLFxuICAgICAgICAnR1QtUzY1MDBEJzogWydTYW1zdW5nJywgJ0dhbGF4eSBNaW5pIDInXSxcbiAgICAgICAgJ0dULVM2NzAyJzogWydTYW1zdW5nJywgJ0dULVM2NzAyJ10sXG4gICAgICAgICdHVC1TNjgwMic6IFsnU2Ftc3VuZycsICdHYWxheHkgQWNlIER1b3MnXSxcbiAgICAgICAgJ0dULVM3NTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgUGx1cyddLFxuICAgICAgICAnR1QtUzc1MDBMJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgUGx1cyddLFxuICAgICAgICAnR1QtUzc1MDBXJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBY2UgUGx1cyddLFxuICAgICAgICAnR1QtVDk1OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBWaWJyYW50J10sXG4gICAgICAgICdTQ0gtaTUwOSc6IFsnU2Ftc3VuZycsICdHYWxheHkgWSddLFxuICAgICAgICAnU0NILWk1NTknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFBvcCddLFxuICAgICAgICAnU0NILWk1NjknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEdpbyddLFxuICAgICAgICAnU0NILWk1NzknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnU0NILWk1ODknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSBEdW9zJ10sXG4gICAgICAgICdTQ0gtaTcwNSA0Ryc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDIgKDcuMCknLCAndGFibGV0J10sXG4gICAgICAgICdTQ0gtaTgwOSc6IFsnU2Ftc3VuZycsICdTQ0gtaTgwOSddLFxuICAgICAgICAnU0NILWk4ODknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ1NDSC1pOTA5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdTQ0gtaTkxOSc6IFsnU2Ftc3VuZycsICdTQ0gtaTkxOSddLFxuICAgICAgICAnU0NILWk5MjknOiBbJ1NhbXN1bmcnLCAnU0NILWk5MjknXSxcbiAgICAgICAgJ1NDSC1JMTAwJzogWydTYW1zdW5nJywgJ0dlbSddLFxuICAgICAgICAnU0NILUkxMTAnOiBbJ1NhbXN1bmcnLCAnSWxsdXNpb24nXSxcbiAgICAgICAgJ1NDSC1JNDAwJzogWydTYW1zdW5nJywgJ0NvbnRpbnV1bSddLFxuICAgICAgICAnU0NILUk0MDUnOiBbJ1NhbXN1bmcnLCAnU3RyYXRvc3BoZXJlJ10sXG4gICAgICAgICdTQ0gtSTQwNSA0Ryc6IFsnU2Ftc3VuZycsICdTdHJhdG9zcGhlcmUnXSxcbiAgICAgICAgJ1NDSC1JNTAwJzogWydTYW1zdW5nJywgJ0Zhc2NpbmF0ZSddLFxuICAgICAgICAnU0NILUk1MTAnOiBbJ1NhbXN1bmcnLCAnU3RlYWx0aCBWJ10sXG4gICAgICAgICdTQ0gtSTUxMCA0Ryc6IFsnU2Ftc3VuZycsICdEcm9pZCBDaGFyZ2UnXSxcbiAgICAgICAgJ1NDSC1JNTE1JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOZXh1cyddLFxuICAgICAgICAnU0NILUk1MzUnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUlJJ10sXG4gICAgICAgICdTQ0gtSTUzNSA0Ryc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NDSC1JNjE5JzogWydTYW1zdW5nJywgJ1NDSC1JNjE5J10sXG4gICAgICAgICdTQ0gtSTY5OSc6IFsnU2Ftc3VuZycsICdTQ0gtSTY5OSddLFxuICAgICAgICAnU0NILUk3NzknOiBbJ1NhbXN1bmcnLCAnU0NILUk3NzknXSxcbiAgICAgICAgJ1NDSC1JODAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wJywgJ3RhYmxldCddLFxuICAgICAgICAnU0NILUk4MTUnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA3LjcnLCAndGFibGV0J10sXG4gICAgICAgICdTQ0gtSTgxNSA0Ryc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDcuNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDSC1JOTA1JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDSC1JOTA1IDRHJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDSC1JOTA5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdTQ0gtSTkxNSc6IFsnU2Ftc3VuZycsICdTQ0gtSTkxNSddLFxuICAgICAgICAnU0NILUk5MzknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUlJJ10sXG4gICAgICAgICdTQ0gtTTgyOEMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFByZWNlZGVudCddLFxuICAgICAgICAnU0NILU04MjhDYXJyYXkoOTA5NjQ4MzQ0OSknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFByZWNlZGVudCddLFxuICAgICAgICAnU0NILVI1MzBVJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJSSddLFxuICAgICAgICAnU0NILVI2ODAnOiBbJ1NhbXN1bmcnLCAnUmVwcCddLFxuICAgICAgICAnU0NILVI3MjAnOiBbJ1NhbXN1bmcnLCAnQWRtaXJlJ10sXG4gICAgICAgICdTQ0gtUjczMCc6IFsnU2Ftc3VuZycsICdUcmFuc2ZpeCddLFxuICAgICAgICAnU0NILVI3NjAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ1NDSC1SODIwJzogWydTYW1zdW5nJywgJ1NDSC1SODIwJ10sXG4gICAgICAgICdTQ0gtUjg4MCc6IFsnU2Ftc3VuZycsICdBY2NsYWltJ10sXG4gICAgICAgICdTQ0gtUjkxMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgSW5kdWxnZSA0RyddLFxuICAgICAgICAnU0NILVI5MTUnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEluZHVsZ2UnXSxcbiAgICAgICAgJ1NDSC1SOTIwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBBdHRhaW4gNEcnXSxcbiAgICAgICAgJ1NDSC1SOTMwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEF2aWF0b3InXSxcbiAgICAgICAgJ1NDSC1SOTQwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIExpZ2h0cmF5J10sXG4gICAgICAgICdTQ0gtUzcyMEMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFByb2NsYWltJ10sXG4gICAgICAgICdTQ0gtUzczNUMnOiBbJ1NhbXN1bmcnLCAnU0NILVM3MzUnXSxcbiAgICAgICAgJ1NDSC1XODk5JzogWydTYW1zdW5nJywgJ1NDSC1XODk5J10sXG4gICAgICAgICdTQ0gtVzk5OSc6IFsnU2Ftc3VuZycsICdTQ0gtVzk5OSddLFxuICAgICAgICAnU0dILUk1NDcnOiBbJ1NhbXN1bmcnLCAnU0dILUk1NDcnXSxcbiAgICAgICAgJ1NHSC1JNzE3JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdTR0gtSTcxN0QnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ1NHSC1JNzE3TSc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSddLFxuICAgICAgICAnU0dILUk3MTdSJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdTR0gtSTcyNyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSBTa3lyb2NrZXQnXSxcbiAgICAgICAgJ1NHSC1pNzI3Uic6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnU0dILUk3MjdSJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdTR0gtSTc0Nyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NHSC1JNzQ3TSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NHSC1JNzQ4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJSSddLFxuICAgICAgICAnU0dILUk3NTcnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgU2t5cm9ja2V0IEhEJ10sXG4gICAgICAgICdTR0gtSTc3Nyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnU0dILUk5Nzc3JzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdTR0gtSTg5Nic6IFsnU2Ftc3VuZycsICdDYXB0aXZhdGUnXSxcbiAgICAgICAgJ1NHSC1JODk3JzogWydTYW1zdW5nJywgJ0NhcHRpdmF0ZSddLFxuICAgICAgICAnU0dILUk5MjcnOiBbJ1NhbXN1bmcnLCAnQ2FwdGl2YXRlIEdsaWRlJ10sXG4gICAgICAgICdTR0gtSTkyN1InOiBbJ1NhbXN1bmcnLCAnQ2FwdGl2YXRlIEdsaWRlJ10sXG4gICAgICAgICdTR0gtSTk1Nyc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1JOTU3RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1JOTU3TSc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1JOTU3Uic6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1JOTg3JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wJywgJ3RhYmxldCddLFxuICAgICAgICAnU0dILUk5OTcnOiBbJ1NhbXN1bmcnLCAnSW5mdXNlIDRHJ10sXG4gICAgICAgICdTR0gtSTk5N1InOiBbJ1NhbXN1bmcnLCAnSW5mdXNlIDRHJ10sXG4gICAgICAgICdTR0gtSTkwMDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMnXSxcbiAgICAgICAgJ1NHSC1TNzMwRyc6IFsnU2Ftc3VuZycsICdTR0gtUzczMCddLFxuICAgICAgICAnU0dILVQ0OTknOiBbJ1NhbXN1bmcnLCAnRGFydCddLFxuICAgICAgICAnU0dILVQ0OTlWJzogWydTYW1zdW5nJywgJ0dhbGF4eSBNaW5pJ10sXG4gICAgICAgICdTR0gtVDQ5OVknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE1pbmknXSxcbiAgICAgICAgJ1NHSC1UNTg5JzogWydTYW1zdW5nJywgJ0dyYXZpdHkgU21hcnQnXSxcbiAgICAgICAgJ1NHSC1UNTg5Uic6IFsnU2Ftc3VuZycsICdHcmF2aXR5IFNtYXJ0J10sXG4gICAgICAgICdTR0gtVDY3OSc6IFsnU2Ftc3VuZycsICdFeGhpYml0IElJIDRHJ10sXG4gICAgICAgICdTR0gtVDY3OU0nOiBbJ1NhbXN1bmcnLCAnRXhoaWJpdCBJSSA0RyddLFxuICAgICAgICAnU0dILVQ3NTknOiBbJ1NhbXN1bmcnLCAnRXhoaWJpdCA0RyddLFxuICAgICAgICAnU0dILVQ3NjknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgQmxhemUgNEcnXSxcbiAgICAgICAgJ1NHSC1UODM5JzogWydTYW1zdW5nJywgJ1QtTW9iaWxlIFNpZGVraWNrJ10sXG4gICAgICAgICdTR0gtVDg0OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDcuMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1UODU5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NHSC1UODY5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgNy4wIFBsdXMnLCAndGFibGV0J10sXG4gICAgICAgICdTR0gtVDg3OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSddLFxuICAgICAgICAnU0dILVQ5NTknOiBbJ1NhbXN1bmcnLCAnVmlicmFudCddLFxuICAgICAgICAnU0dILVQ5NTlEJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEZhc2NpbmF0ZSAzRysnXSxcbiAgICAgICAgJ1NHSC1UOTU5UCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBGYXNjaW5hdGUgNEcnXSxcbiAgICAgICAgJ1NHSC1UOTU5Vic6IFsnU2Ftc3VuZycsICdHYWxheHkgUyA0RyddLFxuICAgICAgICAnU0dILVQ5ODknOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ1NHSC1UOTg5RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSBYJ10sXG4gICAgICAgICdTR0gtVDk5OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBCbGF6ZSA0RyddLFxuICAgICAgICAnU0dILVQ5OTlWJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIEJsYXplIDRHJ10sXG4gICAgICAgICdTSFYtRTEyMEsnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgSEQgTFRFJ10sXG4gICAgICAgICdTSFYtRTEyMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgSEQgTFRFJ10sXG4gICAgICAgICdTSFYtRTEyMFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgSEQgTFRFJ10sXG4gICAgICAgICdTSFYtRTExMFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgTFRFJ10sXG4gICAgICAgICdTSFYtRTE0MFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA4LjknLCAndGFibGV0J10sXG4gICAgICAgICdTSFYtRTE1MFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA3LjcnLCAndGFibGV0J10sXG4gICAgICAgICdTSFYtRTE2MEsnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5vdGUnXSxcbiAgICAgICAgJ1NIVi1FMTYwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBMVEUnXSxcbiAgICAgICAgJ1NIVi1FMTYwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBMVEUnXSxcbiAgICAgICAgJ1NIVi1FMTcwSyc6IFsnU2Ftc3VuZycsICdTSFYtRTE3MEsnXSxcbiAgICAgICAgJ1NIVi1FMTcwTCc6IFsnU2Ftc3VuZycsICdTSFYtRTE3MEwnXSxcbiAgICAgICAgJ1NIVi1FMjEwSyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NIVi1FMjEwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NIVi1FMjEwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NIVy1NMTAwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgQSddLFxuICAgICAgICAnU0hXLU0xMTBTJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdTSFctTTEzMEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFUnXSxcbiAgICAgICAgJ1NIVy1NMTMwSyc6IFsnU2Ftc3VuZycsICdHYWxheHkgSyddLFxuICAgICAgICAnU0hXLU0xODBLJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdTSFctTTE4MEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMTgwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiJywgJ3RhYmxldCddLFxuICAgICAgICAnU0hXLU0xODBXJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdTSFctTTE4NVMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMTkwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBIb3BwaW4nXSxcbiAgICAgICAgJ1NIVy1NMjIwTCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmVvJ10sXG4gICAgICAgICdTSFctTTI0MFMnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IEFjZSddLFxuICAgICAgICAnU0hXLU0yNTBLJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdTSFctTTI1MEwnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUknXSxcbiAgICAgICAgJ1NIVy1NMjUwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnU0hXLU0zMDBXJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMzA1Vyc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDguOScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMzQwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTSBTdHlsZSddLFxuICAgICAgICAnU0hXLU0zODBLJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWIgMTAuMScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NIVy1NMzgwUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgVGFiIDEwLjEnLCAndGFibGV0J10sXG4gICAgICAgICdTSFctTTM4MFcnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAxMC4xJywgJ3RhYmxldCddLFxuICAgICAgICAnU0hXLU00NDBTJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJSSddLFxuICAgICAgICAnU01ULWk5MTAwJzogWydTYW1zdW5nJywgJ1NNVC1JOTEwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NQSC1ENjAwJzogWydTYW1zdW5nJywgJ0NvbnF1ZXIgNEcnXSxcbiAgICAgICAgJ1NQSC1ENzAwJzogWydTYW1zdW5nJywgJ0VwaWMgNEcnXSxcbiAgICAgICAgJ1NQSC1ENzA1JzogWydTYW1zdW5nJywgJ0VwaWMgNEcgMiddLFxuICAgICAgICAnU1BILUQ3MTAnOiBbJ1NhbXN1bmcnLCAnRXBpYyA0RyBUb3VjaCddLFxuICAgICAgICAnU1BILUw3MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IE5leHVzJ10sXG4gICAgICAgICdTUEgtTDcxMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ1NQSC1NODIwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBQcmV2YWlsJ10sXG4gICAgICAgICdTUEgtTTgyMC1CU1QnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFByZXZhaWwnXSxcbiAgICAgICAgJ1NQSC1NNTgwJzogWydTYW1zdW5nJywgJ1JlcGxlbmlzaCddLFxuICAgICAgICAnU1BILU05MDAnOiBbJ1NhbXN1bmcnLCAnTW9tZW50J10sXG4gICAgICAgICdTUEgtTTkxMCc6IFsnU2Ftc3VuZycsICdJbnRlcmNlcHQnXSxcbiAgICAgICAgJ1NQSC1NOTIwJzogWydTYW1zdW5nJywgJ1RyYW5zZm9ybSddLFxuICAgICAgICAnU1BILU05MzAnOiBbJ1NhbXN1bmcnLCAnVHJhbnNmb3JtIFVsdHJhJ10sXG4gICAgICAgICdTUEgtTTkzMEJTVCc6IFsnU2Ftc3VuZycsICdUcmFuc2Zvcm0gVWx0cmEnXSxcbiAgICAgICAgJ1NQSC1QMTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdZUC1HQjEnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFBsYXllcicsICdtZWRpYSddLFxuICAgICAgICAnWVAtR0I3MCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUGxheWVyIDcwJywgJ21lZGlhJ10sXG4gICAgICAgICdZUC1HQjcwRCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUGxheWVyIDcwIFBsdXMnLCAnbWVkaWEnXSxcbiAgICAgICAgJ1lQLUdTMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBXaUZpIDMuNicsICdtZWRpYSddLFxuICAgICAgICAnWVAtRzEnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgV2lGaSA0LjAnLCAnbWVkaWEnXSxcbiAgICAgICAgJ1lQLUdJMSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBXaUZpIDQuMicsICdtZWRpYSddLFxuICAgICAgICAnWVAtRzUwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBQbGF5ZXInLCAnbWVkaWEnXSxcbiAgICAgICAgJ1lQLUc3MCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBXaUZpIDUuMCcsICdtZWRpYSddLFxuICAgICAgICAnR1Q5MTAwJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdJODk3JzogWydTYW1zdW5nJywgJ0NhcHRpdmF0ZSddLFxuICAgICAgICAnSTc1MDAnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5J10sXG4gICAgICAgICdJOTAwMCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyddLFxuICAgICAgICAnVDk1OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBWaWJyYW50J10sXG4gICAgICAgICdDYXB0aXZhdGUtSTg5Nyc6IFsnU2Ftc3VuZycsICdDYXB0aXZhdGUnXSxcbiAgICAgICAgJ0dhbGF4eSc6IFsnU2Ftc3VuZycsICdHYWxheHknXSxcbiAgICAgICAgJ0dhbGF4eSBOb3RlJzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlJ10sXG4gICAgICAgICdHYWxheHlTJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTJ10sXG4gICAgICAgICdHYWxheHkgUyBJSSc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSddLFxuICAgICAgICAnR2FsYXh5IFgnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFgnXSxcbiAgICAgICAgJ0dhbGF4eSBTcGljYSc6IFsnU2Ftc3VuZycsICdHYWxheHkgU3BpY2EnXSxcbiAgICAgICAgJ0dBTEFYWSBUYWInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0dBTEFYWSBORVhVUyc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ1ZpYnJhbnRtdGQnOiBbJ1NhbXN1bmcnLCAnVmlicmFudCddLFxuICAgICAgICAnU0MtMDFDJzogWydTYW1zdW5nJywgJ0dhbGF4eSBUYWInLCAndGFibGV0J10sXG4gICAgICAgICdTQy0wMUQnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiAxMC4xIExURScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDLTAyQic6IFsnU2Ftc3VuZycsICdHYWxheHkgUyddLFxuICAgICAgICAnU0MtMDJDJzogWydTYW1zdW5nJywgJ0dhbGF4eSBTIElJJ10sXG4gICAgICAgICdTQy0wMkQnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRhYiA3LjAgUGx1cycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1NDLTAzRCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSSBMVEUnXSxcbiAgICAgICAgJ1NDLTA0RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTmV4dXMnXSxcbiAgICAgICAgJ1NDLTA1RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBMVEUnXSxcbiAgICAgICAgJ1NDLTA2RCc6IFsnU2Ftc3VuZycsICdHYWxheHkgUyBJSUknXSxcbiAgICAgICAgJ0lTVzExU0MnOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFMgSUkgV2lNQVgnXSxcbiAgICAgICAgJ0dULVM3NTYyJzogWydTYW1zdW5nJywgJ0dULVM3NTYyJ10sXG4gICAgICAgICdHVC1TNzU2MmknOiBbJ1NhbXN1bmcnLCAnR1QtUzc1NjJpJ10sXG4gICAgICAgICdBMDFTSCc6IFsnU2hhcnAnLCAnQTAxU0gnXSxcbiAgICAgICAgJ0lTMDEnOiBbJ1NoYXJwJywgJ0lTMDEnXSxcbiAgICAgICAgJ0lTMDMnOiBbJ1NoYXJwJywgJ0lTMDMnXSxcbiAgICAgICAgJ0lTMDUnOiBbJ1NoYXJwJywgJ0lTMDUnXSxcbiAgICAgICAgJ0lTMTFTSCc6IFsnU2hhcnAnLCAnQXF1b3MgSVMxMVNIJ10sXG4gICAgICAgICdJUzEyU0gnOiBbJ1NoYXJwJywgJ0FxdW9zIElTMTJTSCddLFxuICAgICAgICAnSVMxM1NIJzogWydTaGFycCcsICdBcXVvcyBJUzEzU0gnXSxcbiAgICAgICAgJ0lTMTRTSCc6IFsnU2hhcnAnLCAnQXF1b3MgSVMxNFNIJ10sXG4gICAgICAgICdJU1cxNlNIJzogWydTaGFycCcsICdBcXVvcyBJU1cxNlNIJ10sXG4gICAgICAgICdFQi1XNTFHSic6IFsnU2hhcnAnLCAnRUItVzUxR0onXSxcbiAgICAgICAgJ1NCTTAwM1NIJzogWydTaGFycCcsICdHYWxhcGFnb3MnXSxcbiAgICAgICAgJ1NCTTAwNVNIJzogWydTaGFycCcsICdHYWxhcGFnb3MnXSxcbiAgICAgICAgJ1NCTTAwNlNIJzogWydTaGFycCcsICdBcXVvcyddLFxuICAgICAgICAnU0JNMDA3U0gnOiBbJ1NoYXJwJywgJ0FxdW9zIDAwN1NIJ10sXG4gICAgICAgICdTQk0wMDlTSCc6IFsnU2hhcnAnLCAnQXF1b3MgMDA5U0gnXSxcbiAgICAgICAgJ1NCTTEwMlNIJzogWydTaGFycCcsICdBcXVvcyAxMDJTSCddLFxuICAgICAgICAnU0JNMTAzU0gnOiBbJ1NoYXJwJywgJ0FxdW9zIDEwM1NIJ10sXG4gICAgICAgICdTQk0xMDRTSCc6IFsnU2hhcnAnLCAnQXF1b3MgMTA0U0gnXSxcbiAgICAgICAgJ1NCTTEwN1NIJzogWydTaGFycCcsICdBcXVvcyAxMDdTSCddLFxuICAgICAgICAnU0JNMTA3U0hCJzogWydTaGFycCcsICdBcXVvcyAxMDdTSCddLFxuICAgICAgICAnU0gtMDFEJzogWydTaGFycCcsICdBcXVvcyBTSC0wMUQnXSxcbiAgICAgICAgJ1NILTAyRCc6IFsnU2hhcnAnLCAnQXF1b3Mgc2xpZGVyIFNILTAyRCddLFxuICAgICAgICAnU0gtMDNDJzogWydTaGFycCcsICdMeW54IDNEJ10sXG4gICAgICAgICdTSC0wNkQnOiBbJ1NoYXJwJywgJ0FxdW9zIFNILTA2RCddLFxuICAgICAgICAnU0gtMDlEJzogWydTaGFycCcsICdBcXVvcyBaZXRhIFNILTA5RCddLFxuICAgICAgICAnU0gtMTBCJzogWydTaGFycCcsICdMeW54J10sXG4gICAgICAgICdTSC0xMkMnOiBbJ1NoYXJwJywgJ0FxdW9zJ10sXG4gICAgICAgICdTSC0xM0MnOiBbJ1NoYXJwJywgJ0FxdW9zIGYgU0gtMTNDJ10sXG4gICAgICAgICdTSDgwRic6IFsnU2hhcnAnLCAnQXF1b3MgU0g4MEYnXSxcbiAgICAgICAgJ1NINzJ4OFUnOiBbJ1NoYXJwJywgJ1NINzJ4OFUnXSxcbiAgICAgICAgJ1NIODExOFUnOiBbJ1NoYXJwJywgJ1NIODExOFUnXSxcbiAgICAgICAgJ1NIODEyOFUnOiBbJ1NoYXJwJywgJ1NIODEyOFUnXSxcbiAgICAgICAgJ1NIODE1OFUnOiBbJ1NoYXJwJywgJ1NIODE1OFUnXSxcbiAgICAgICAgJ1NIODE4OFUnOiBbJ1NoYXJwJywgJ1NIODE4OFUnXSxcbiAgICAgICAgJ1NIODI2OFUnOiBbJ1NoYXJwJywgJ1NIODI2OFUnXSxcbiAgICAgICAgJ0lORk9CQVIgQzAxJzogWydTaGFycCcsICdJTkZPQkFSIEMwMSddLFxuICAgICAgICAnU1BYLTUnOiBbJ1NpbXZhbGxleScsICdTUFgtNSddLFxuICAgICAgICAnU1BYLTUgM0cnOiBbJ1NpbXZhbGxleScsICdTUFgtNSAzRyddLFxuICAgICAgICAnU21hcnRRIEc3JzogWydTbWFydFEnLCAnRzcnLCAndGFibGV0J10sXG4gICAgICAgICdTbWFydFFUNyc6IFsnU21hcnRRJywgJ1Q3JywgJ3RhYmxldCddLFxuICAgICAgICAnU21hcnRRVDEwJzogWydTbWFydFEnLCAnVDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnU21hcnRRVDE1JzogWydTbWFydFEnLCAnVDE1JywgJ3RhYmxldCddLFxuICAgICAgICAnU21hcnRRVDE5JzogWydTbWFydFEnLCAnVDE5JywgJ3RhYmxldCddLFxuICAgICAgICAnU21hcnRRVDIwJzogWydTbWFydFEnLCAnVDIwJywgJ3RhYmxldCddLFxuICAgICAgICAnT01TMSA2JzogWydTb255IEVyaWNzc29uJywgJ0E4aSddLFxuICAgICAgICAnRTEwYSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwIE1pbmknXSxcbiAgICAgICAgJ0UxMGknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFgxMCBNaW5pJ10sXG4gICAgICAgICdFMTBpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwIE1pbmknXSxcbiAgICAgICAgJ0UxNSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDgnXSxcbiAgICAgICAgJ0UxNWEnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFg4J10sXG4gICAgICAgICdFMTVpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYOCddLFxuICAgICAgICAnRTE1aXYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFg4J10sXG4gICAgICAgICdFMTVpLW8nOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFg4J10sXG4gICAgICAgICdFMTZpJzogWydTb255IEVyaWNzc29uJywgJ1c4IFdhbGttYW4nXSxcbiAgICAgICAgJ0xUMTFpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBOZW8gViddLFxuICAgICAgICAnTFQxNSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdMVDE1YSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdMVDE1aSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdMVDE1aXYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIEFyYyddLFxuICAgICAgICAnTFQxNWktbyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdMVDE4YSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjIFMnXSxcbiAgICAgICAgJ0xUMThpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBcmMgUyddLFxuICAgICAgICAnTFQxOGl2JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBcmMgUyddLFxuICAgICAgICAnTFQxOGktbyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjIFMnXSxcbiAgICAgICAgJ0xUMjJpJzogWydTb255JywgJ1hwZXJpYSBQJ10sXG4gICAgICAgICdMVDI2aSc6IFsnU29ueScsICdYcGVyaWEgUyddLFxuICAgICAgICAnTFQyNmlpJzogWydTb255JywgJ1hwZXJpYSBTJ10sXG4gICAgICAgICdMVDI2aS1vJzogWydTb255JywgJ1hwZXJpYSBTJ10sXG4gICAgICAgICdMVDI4YXQnOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnTFQyOGgnOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnTFQyOGknOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnTFQyOWknOiBbJ1NvbnknLCAnWHBlcmlhIEdYJ10sXG4gICAgICAgICdTb255TFQyOWknOiBbJ1NvbnknLCAnWHBlcmlhIEdYJ10sXG4gICAgICAgICdTb255TFQzMGEnOiBbJ1NvbnknLCAnWHBlcmlhIE1pbnQnXSxcbiAgICAgICAgJ1NvbnlMVDMwcCc6IFsnU29ueScsICdYcGVyaWEgTWludCddLFxuICAgICAgICAnTUsxNmEnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFBybyddLFxuICAgICAgICAnTUsxNmknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFBybyddLFxuICAgICAgICAnTVQxMWEnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyBWJ10sXG4gICAgICAgICdNVDExaSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvIFYnXSxcbiAgICAgICAgJ01UMTFpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvIFYnXSxcbiAgICAgICAgJ01UMTFpLW8nOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyBWJ10sXG4gICAgICAgICdNVDE1YSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvJ10sXG4gICAgICAgICdNVDE1aSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvJ10sXG4gICAgICAgICdNVDE1aXYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyddLFxuICAgICAgICAnTVQxNWktbyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvJ10sXG4gICAgICAgICdNVDI1aSc6IFsnU29ueScsICdYcGVyaWEgTmVvIEwnXSxcbiAgICAgICAgJ01UMjdpJzogWydTb255JywgJ1hwZXJpYSBTb2xhJ10sXG4gICAgICAgICdSODAwYSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnUjgwMGknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFBsYXknXSxcbiAgICAgICAgJ1I4MDBpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnUjgwMGF0JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBQbGF5J10sXG4gICAgICAgICdSODAweCc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnU0sxN2EnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE1pbmkgUHJvJ10sXG4gICAgICAgICdTSzE3aSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTWluaSBQcm8nXSxcbiAgICAgICAgJ1NLMTdpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTWluaSBQcm8nXSxcbiAgICAgICAgJ1NLMTdpLW8nOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE1pbmkgUHJvJ10sXG4gICAgICAgICdTVDE1YSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTWluaSddLFxuICAgICAgICAnU1QxNWknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE1pbmknXSxcbiAgICAgICAgJ1NUMTdhJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBY3RpdmUnXSxcbiAgICAgICAgJ1NUMTdpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBY3RpdmUnXSxcbiAgICAgICAgJ1NUMThhJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBSYXknXSxcbiAgICAgICAgJ1NUMThpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBSYXknXSxcbiAgICAgICAgJ1NUMThpdic6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUmF5J10sXG4gICAgICAgICdTVDE4YXYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFJheSddLFxuICAgICAgICAnU29ueVNUMjEnOiBbJ1NvbnknLCAnXFwnVGFwaW9jYVxcJyddLFxuICAgICAgICAnU29ueVNUMjFpJzogWydTb255JywgJ1xcJ1RhcGlvY2FcXCcnXSxcbiAgICAgICAgJ1NvbnlTVDIxYTInOiBbJ1NvbnknLCAnXFwnVGFwaW9jYVxcJyddLFxuICAgICAgICAnU1QyMSc6IFsnU29ueScsICdcXCdUYXBpb2NhXFwnJ10sXG4gICAgICAgICdTVDIxaSc6IFsnU29ueScsICdcXCdUYXBpb2NhXFwnJ10sXG4gICAgICAgICdTb255U1QyM2knOiBbJ1NvbnknLCAnXFwnVGFwaW9jYSBEU1xcJyddLFxuICAgICAgICAnU1QyNWknOiBbJ1NvbnknLCAnWHBlcmlhIFUnXSxcbiAgICAgICAgJ1NUMjdpJzogWydTb255JywgJ1hwZXJpYSBHbyddLFxuICAgICAgICAnVTIwYSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwIE1pbmkgUHJvJ10sXG4gICAgICAgICdVMjBpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAgTWluaSBQcm8nXSxcbiAgICAgICAgJ1UyMGl2JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAgTWluaSBQcm8nXSxcbiAgICAgICAgJ1dUMTNpJzogWydTb255IEVyaWNzc29uJywgJ01peCBXYWxrbWFuJ10sXG4gICAgICAgICdXVDE4aSc6IFsnU29ueSBFcmljc3NvbicsICdXYWxrbWFuJ10sXG4gICAgICAgICdXVDE5YSc6IFsnU29ueSBFcmljc3NvbicsICdMaXZlIHdpdGggV2Fsa21hbiddLFxuICAgICAgICAnV1QxOWknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnTGl2ZSB3aXRoIFdhbGttYW4nXSxcbiAgICAgICAgJ1dUMTlpdic6IFsnU29ueSBFcmljc3NvbicsICdMaXZlIHdpdGggV2Fsa21hbiddLFxuICAgICAgICAnWDgnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFg4J10sXG4gICAgICAgICdYMTAnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFgxMCddLFxuICAgICAgICAnWDEwYSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwJ10sXG4gICAgICAgICdYMTBpJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAnXSxcbiAgICAgICAgJ1gxMGl2JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAnXSxcbiAgICAgICAgJ1gxMFMnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFgxMCddLFxuICAgICAgICAnWDEwbWluaSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwIE1pbmknXSxcbiAgICAgICAgJ1gxMCBNaW5pJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAgTWluaSddLFxuICAgICAgICAnWDEwIE1pbmkgUHJvJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAgTWluaSBQcm8nXSxcbiAgICAgICAgJ1oxaSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnUzUxU0UnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE1pbmknXSxcbiAgICAgICAgJ0lTMTFTJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBBY3JvJ10sXG4gICAgICAgICdJUzEyUyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQWNybyBIRCddLFxuICAgICAgICAnU08tMDFCJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYMTAnXSxcbiAgICAgICAgJ1NPLTAxQyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdTTy0wMUQnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFBsYXknXSxcbiAgICAgICAgJ1NPLTAyQyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQWNybyddLFxuICAgICAgICAnU08tMDJEJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBOWCddLFxuICAgICAgICAnU08tMDNDJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBSYXknXSxcbiAgICAgICAgJ1NPLTAzRCc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQWNybyBIRCddLFxuICAgICAgICAnU08tMDREJzogWydTb255JywgJ1hwZXJpYSBHWCddLFxuICAgICAgICAnU08tMDVEJzogWydTb255JywgJ1hwZXJpYSBTWCddLFxuICAgICAgICAnWFBFUklBIFg4JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYOCddLFxuICAgICAgICAnWHBlcmlhIFg4JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBYOCddLFxuICAgICAgICAnWHBlcmlhIFgxMCc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgWDEwJ10sXG4gICAgICAgICdYcGVyaWEgcmF5JzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBSYXknXSxcbiAgICAgICAgJ1hwZXJpYSBSYXknOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFJheSddLFxuICAgICAgICAnWHBlcmlhIEFyYyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgQXJjJ10sXG4gICAgICAgICdYcGVyaWEgTWluaSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTWluaSddLFxuICAgICAgICAnWHBlcmlhIG5lbyc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgTmVvJ10sXG4gICAgICAgICdYcGVyaWEgTmVvJzogWydTb255IEVyaWNzc29uJywgJ1hwZXJpYSBOZW8nXSxcbiAgICAgICAgJ1hQRVJJQSBORU8nOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyddLFxuICAgICAgICAnWHBlcmlhIE5lb1YnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyBWJ10sXG4gICAgICAgICdYcGVyaWEgTmVvIFYnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIE5lbyBWJ10sXG4gICAgICAgICdYcGVyaWEgUGxheSc6IFsnU29ueSBFcmljc3NvbicsICdYcGVyaWEgUGxheSddLFxuICAgICAgICAnU29ueSBFcmljc3NvbiBYcGVyaWEgWDEnOiBbJ1NvbnkgRXJpY3Nzb24nLCAnWHBlcmlhIFgxJ10sXG4gICAgICAgICdTb255SGF5YWJ1c2EnOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnSGF5YWJ1c2EnOiBbJ1NvbnknLCAnWHBlcmlhIElvbiddLFxuICAgICAgICAnbm96b21pJzogWydTb255JywgJ1hwZXJpYSBTJ10sXG4gICAgICAgICdTb255IFRhYmxldCBQJzogWydTb255JywgJ1RhYmxldCBQJywgJ3RhYmxldCddLFxuICAgICAgICAnU29ueSBUYWJsZXQgUyc6IFsnU29ueScsICdUYWJsZXQgUycsICd0YWJsZXQnXSxcbiAgICAgICAgJ05XWi1aMTAwMFNlcmllcyc6IFsnU29ueScsICdXYWxrbWFuIFonLCAnbWVkaWEnXSxcbiAgICAgICAgJ05XLVoxMDAwU2VyaWVzJzogWydTb255JywgJ1dhbGttYW4gWicsICdtZWRpYSddLFxuICAgICAgICAnU3BpY2UgTWkyODAnOiBbJ1NwaWNlJywgJ01pLTI4MCddLFxuICAgICAgICAnU3BpY2UgTWkzMDAnOiBbJ1NwaWNlJywgJ01pLTMwMCddLFxuICAgICAgICAnU3BpY2UgTWktMzEwJzogWydTcGljZScsICdNaS0zMTAnXSxcbiAgICAgICAgJ1NwaWNlIE1pLTQyNSc6IFsnU3BpY2UnLCAnTWktNDI1J10sXG4gICAgICAgICdTUElDRSBNaS03MjAnOiBbJ1NwaWNlJywgJ01pLTcyMCddLFxuICAgICAgICAnQTcyNzIrJzogWydTdGFyJywgJ0E3MjcyKyddLFxuICAgICAgICAnZTExMDkgdjczIGdxMTAwMiBjdHAnOiBbJ1N0YXInLCAnWDE4aSddLFxuICAgICAgICAnVFMxMDA0VCc6IFsnU3VyZiAzUScsICdUUzEwMDRUJywgJ3RhYmxldCddLFxuICAgICAgICAnU1lUQUJFWDctMic6IFsnU3lsdmFuaWEnLCAnU1lUQUJFWDcnLCAndGFibGV0J10sXG4gICAgICAgICdUQ0wgQTg2MCc6IFsnVENMJywgJ0E4NjAnXSxcbiAgICAgICAgJ1RDTCBBOTA2JzogWydUQ0wnLCAnQTkwNiddLFxuICAgICAgICAnVENMIEE5MDknOiBbJ1RDTCcsICdBOTA5J10sXG4gICAgICAgICdUQ0wgQTkxOSc6IFsnVENMJywgJ0E5MTknXSxcbiAgICAgICAgJ1RDTCBBOTkwJzogWydUQ0wnLCAnQTk5MCddLFxuICAgICAgICAnVENMIEE5OTYnOiBbJ1RDTCcsICdBOTk2J10sXG4gICAgICAgICdUQ0wgQTk5OCc6IFsnVENMJywgJ0E5OTgnXSxcbiAgICAgICAgJ1RDTCBHRU5FU0VFIEU3MDgnOiBbJ1RDTCcsICdHZW5lc2VlIEU3MDgnXSxcbiAgICAgICAgJ0ExMHQoNURNMyknOiBbJ1RlY2xhc3QnLCAnQTEwVCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1A3Mic6IFsnVGVjbGFzdCcsICdQNzInLCAndGFibGV0J10sXG4gICAgICAgICdQNzZUSSc6IFsnVGVjbGFzdCcsICdQNzZUaScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1A4MUhEJzogWydUZWNsYXN0JywgJ1A4MUhEJywgJ3RhYmxldCddLFxuICAgICAgICAnUDg1KFI4QTEpJzogWydUZWNsYXN0JywgJ1A4NScsICd0YWJsZXQnXSxcbiAgICAgICAgJ1Q3MjAgU0UnOiBbJ1RlY2xhc3QnLCAnVDcyMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1Q3NjAgZnJvbSBtb2FnZS5jb20nOiBbJ1RlY2xhc3QnLCAnVDc2MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ3RlZ2F2Mic6IFsnVGVnYXRlY2gnLCAnVEVHQSB2MicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1RNLTcwMjUnOiBbJ3RlWGV0JywgJ1RNLTcwMjUnLCAndGFibGV0J10sXG4gICAgICAgICdNb0ZpbmcnOiBbJ1Rob21zb24nLCAnTW9GaW5nJywgJ3RhYmxldCddLFxuICAgICAgICAnVWx0aW1hdGUxMCc6IFsnVG9tdGVjJywgJ1VsdGltYXRlMTAnLCAndGFibGV0J10sXG4gICAgICAgICdUaGwgVjcnOiBbJ1RITCcsICdWNyddLFxuICAgICAgICAnVGhMIFY3JzogWydUSEwnLCAnVjcnXSxcbiAgICAgICAgJ1RoTCBWOCc6IFsnVEhMJywgJ1Y4J10sXG4gICAgICAgICdUaEwgVjknOiBbJ1RITCcsICdWOSddLFxuICAgICAgICAnVGhMIFYxMSc6IFsnVEhMJywgJ1YxMSddLFxuICAgICAgICAnVFNCIENMT1VEIENPTVBBTklPTjtUT1NISUJBIEFDIEFORCBBWic6IFsnVG9zaGliYScsICdEeW5hYm9vayBBWicsICdkZXNrdG9wJ10sXG4gICAgICAgICdUT1NISUJBIEFDIEFORCBBWic6IFsnVG9zaGliYScsICdEeW5hYm9vayBBWicsICdkZXNrdG9wJ10sXG4gICAgICAgICdUT1NISUJBIEZPTElPIEFORCBBJzogWydUb3NoaWJhJywgJ0ZvbGlvIDEwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1QtMDFDJzogWydUb3NoaWJhJywgJ1JlZ3phIFQtMDFDJ10sXG4gICAgICAgICdULTAxRCc6IFsnVG9zaGliYScsICdSZWd6YSBULTAxRCddLFxuICAgICAgICAnSVMwNCc6IFsnVG9zaGliYScsICdSZWd6YSBJUzA0J10sXG4gICAgICAgICdJUzExVCc6IFsnVG9zaGliYScsICdSZWd6YSBJUzExVCddLFxuICAgICAgICAnQVQxUzAnOiBbJ1Rvc2hpYmEnLCAnUmVnemEgQVQxUzAnXSxcbiAgICAgICAgJ1Rvc3RhYjAzJzogWydUb3NoaWJhJywgJ1JlZ3phIEFUMTAwJywgJ3RhYmxldCddLFxuICAgICAgICAnQVQxMDAnOiBbJ1Rvc2hpYmEnLCAnUmVnemEgQVQxMDAnLCAndGFibGV0J10sXG4gICAgICAgICdBVDIwMCc6IFsnVG9zaGliYScsICdSZWd6YSBBVDIwMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0FUNDcwJzogWydUb3NoaWJhJywgJ1JlZ3phIEFUNDcwJywgJ3RhYmxldCddLFxuICAgICAgICAnQVQ1NzAnOiBbJ1Rvc2hpYmEnLCAnUmVnemEgQVQ1NzAnLCAndGFibGV0J10sXG4gICAgICAgICdBVDgzMCc6IFsnVG9zaGliYScsICdSZWd6YSBBVDgzMCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0ZvbGlvIDEwMCc6IFsnVG9zaGliYScsICdGb2xpbyAxMDAnLCAndGFibGV0J10sXG4gICAgICAgICdmb2xpbzEwMCc6IFsnVG9zaGliYScsICdGb2xpbyAxMDAnLCAndGFibGV0J10sXG4gICAgICAgICdUSFJpVkUnOiBbJ1Rvc2hpYmEnLCAnVEhSaVZFJywgJ3RhYmxldCddLFxuICAgICAgICAnRmFudGFzdGljIFQzJzogWydUV00nLCAnRmFudGFzdGljIFQzJ10sXG4gICAgICAgICdNNzAwMTQnOiBbJ1VuaXRlZCBTdGFyIFRlY2hub2xvZ3knLCAnTTcwMDE0JywgJ3RhYmxldCddLFxuICAgICAgICAnUFM0Nyc6IFsnVmVsb2NpdHkgTWljcm8nLCAnQ3J1eiBQUzQ3JywgJ3RhYmxldCddLFxuICAgICAgICAnVDMwMSc6IFsnVmVsb2NpdHkgTWljcm8nLCAnQ3J1eiBUMzAxJywgJ3RhYmxldCddLFxuICAgICAgICAnVmliby1BNjg4JzogWydGSUgnLCAnVmlibyBBNjg4J10sXG4gICAgICAgICdWaWRlb2Nvbi1WNzUwMCc6IFsnVmlkZW9jb24nLCAnVjc1MDAnXSxcbiAgICAgICAgJ0dUYWJsZXQnOiBbJ1ZpZXdTb25pYycsICdnVGFibGV0JywgJ3RhYmxldCddLFxuICAgICAgICAnR3RhYkNvbWInOiBbJ1ZpZXdTb25pYycsICdnVGFibGV0JywgJ3RhYmxldCddLFxuICAgICAgICAnVGVhbURSSCBJQ1MgZm9yIEdUYWJsZXQnOiBbJ1ZpZXdTb25pYycsICdnVGFibGV0JywgJ3RhYmxldCddLFxuICAgICAgICAnVmlld1BhZDcnOiBbJ1ZpZXdTb25pYycsICdWaWV3UGFkIDcnLCAndGFibGV0J10sXG4gICAgICAgICdWaWV3UGFkIDEwZSc6IFsnVmlld1NvbmljJywgJ1ZpZXdQYWQgMTBlJywgJ3RhYmxldCddLFxuICAgICAgICAnVlRBQjEwMDgnOiBbJ1ZpemlvJywgJ1ZUQUIxMDA4JywgJ3RhYmxldCddLFxuICAgICAgICAnVlRBQjMwMTAnOiBbJ1ZpemlvJywgJ1ZUQUIzMDEwJywgJ3RhYmxldCddLFxuICAgICAgICAnVk9UTyBXNTMwMCc6IFsnVk9UTycsICdXNTMwMCddLFxuICAgICAgICAneFBBRC03MCc6IFsnV2F5dGVRJywgJ3hQQUQtNzAnLCAndGFibGV0J10sXG4gICAgICAgICd4VEFCLTcwJzogWydXYXl0ZVEnLCAneFRBQi03MCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ1dlbGxjb00tQTk5JzogWydXZWxsY29NJywgJ0E5OSddLFxuICAgICAgICAnTjEyJzogWydXaW5kb3cnLCAnTjEyJywgJ3RhYmxldCddLFxuICAgICAgICAnTjEyUic6IFsnV2luZG93JywgJ04xMlInLCAndGFibGV0J10sXG4gICAgICAgICdONTAnOiBbJ1dpbmRvdycsICdONTAnLCAndGFibGV0J10sXG4gICAgICAgICdONTBEVCc6IFsnV2luZG93JywgJ041MERUJywgJ3RhYmxldCddLFxuICAgICAgICAnTjUwR1QnOiBbJ1dpbmRvdycsICdONTBHVCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ041MEdUIEEnOiBbJ1dpbmRvdycsICdONTBHVC1BJywgJ3RhYmxldCddLFxuICAgICAgICAnTjcwJzogWydXaW5kb3cnLCAnTjcwJywgJ3RhYmxldCddLFxuICAgICAgICAnTjcwIERVQUwgQ09SRSc6IFsnV2luZG93JywgJ043MCBEdWFsIENvcmUnLCAndGFibGV0J10sXG4gICAgICAgICdOODAnOiBbJ1dpbmRvdycsICdOODAnLCAndGFibGV0J10sXG4gICAgICAgICdOOTAnOiBbJ1dpbmRvdycsICdOOTAnLCAndGFibGV0J10sXG4gICAgICAgICdOOTAgRFVBTCBDT1JFMiBWMTInOiBbJ1dpbmRvdycsICdOOTAgRHVhbCBDb3JlJywgJ3RhYmxldCddLFxuICAgICAgICAnTjYxMic6IFsnV2lzaHdheScsICdONjEyJ10sXG4gICAgICAgICdBVC1BUzQzRCc6IFsnV29sZmdhbmcnLCAnQVQtQVM0M0QnXSxcbiAgICAgICAgJ00xMic6IFsnV29wYWQnLCAnTTEyJywgJ3RhYmxldCddLFxuICAgICAgICAnV004NjUwJzogWydXb25kZXJNZWRpYScsICdXTTg2NTAnLCAndGFibGV0J10sXG4gICAgICAgICdNSS1PTkUnOiBbJ1hpYW9taScsICdNSS1PTkUnXSxcbiAgICAgICAgJ01JLU9ORSBDMSc6IFsnWGlhb21pJywgJ01JLU9ORSBDMSddLFxuICAgICAgICAnTUktT05FIFBsdXMnOiBbJ1hpYW9taScsICdNSS1PTkUgUGx1cyddLFxuICAgICAgICAnTUkgMVMnOiBbJ1hpYW9taScsICdNSS1PTkUgUGx1cyddLFxuICAgICAgICAnTUkgMVNDJzogWydYaWFvbWknLCAnTUktT05FIDFTQyddLFxuICAgICAgICAnbWlvbmUgcGx1cyc6IFsnWGlhb21pJywgJ01JLU9ORSBQbHVzJ10sXG4gICAgICAgICdNSS1UV08nOiBbJ1hpYW9taScsICdNSS1UV08nXSxcbiAgICAgICAgJ01JIDInOiBbJ1hpYW9taScsICdNSS1UV08nXSxcbiAgICAgICAgJ01JIDJTJzogWydYaWFvbWknLCAnTUktVFdPIFBsdXMnXSxcbiAgICAgICAgJ01JIDJTQyc6IFsnWGlhb21pJywgJ01JLVRXTyBQbHVzJ10sXG4gICAgICAgICdRMDdDTDAxJzogWydYVmlzaW9uJywgJ1EwNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ042JzogWydZYXJ2aWsnLCAnMjEwIFRhYmxldCcsICd0YWJsZXQnXSxcbiAgICAgICAgJ0VNUjE4NzknOiBbJ1lpZG9uZycsICdFTVIxODc5JywgJ3RhYmxldCddLFxuICAgICAgICAneXVzdW4gVzcwMic6IFsnWXVzdW4nLCAnVzcwMiddLFxuICAgICAgICAnWVgtWVVTVU4gRTgwJzogWydZdXN1bicsICdFODAnXSxcbiAgICAgICAgJ3p0MTgwJzogWydaZW5pdGhpbmsnLCAnWlQtMTgwJywgJ3RhYmxldCddLFxuICAgICAgICAnSmFndWFyNyc6IFsnWmlpTGFicycsICdKYWd1YXIgNycsICd0YWJsZXQnXSxcbiAgICAgICAgJ1ppc3MgUmFuZ2VyIEhEJzogWydaaXNzJywgJ1JhbmdlciBIRCddLFxuICAgICAgICAnWlRFIExpYnJhJzogWydaVEUnLCAnTGlicmEnXSxcbiAgICAgICAgJ1pURS1UIFQ5JzogWydaVEUnLCAnTGlnaHQgVGFiIFQ5JywgJ3RhYmxldCddLFxuICAgICAgICAnVjknOiBbJ1pURScsICdMaWdodCBUYWIgVjknLCAndGFibGV0J10sXG4gICAgICAgICdWOWUrJzogWydaVEUnLCAnTGlnaHQgVGFiIDInLCAndGFibGV0J10sXG4gICAgICAgICdWOUEnOiBbJ1pURScsICdMaWdodCBUYWIgMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ0xpZ2h0IFRhYiAyVyc6IFsnWlRFJywgJ0xpZ2h0IFRhYiAyJywgJ3RhYmxldCddLFxuICAgICAgICAnTGlnaHQgVGFiIDInOiBbJ1pURScsICdMaWdodCBUYWIgMicsICd0YWJsZXQnXSxcbiAgICAgICAgJ1Y5Qyc6IFsnWlRFJywgJ0xpZ2h0IFRhYiAzJywgJ3RhYmxldCddLFxuICAgICAgICAnVjU1JzogWydaVEUnLCAnT3B0aWsnLCAndGFibGV0J10sXG4gICAgICAgICdBY3F1YSc6IFsnWlRFJywgJ0FjcXVhJ10sXG4gICAgICAgICdCbGFkZSc6IFsnWlRFJywgJ0JsYWRlJ10sXG4gICAgICAgICdCbGFkZS1WODgwJzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ1pURS1VIFY4ODAnOiBbJ1pURScsICdCbGFkZSddLFxuICAgICAgICAnQmxhZGUtb3BkYSc6IFsnWlRFJywgJ0JsYWRlJ10sXG4gICAgICAgICdaVEUtQkxBREUnOiBbJ1pURScsICdCbGFkZSddLFxuICAgICAgICAnWlRFIEJsYWRlJzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ1pURSBWODgwJzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ1pURS1VKFYpODgwKyc6IFsnWlRFJywgJ0JsYWRlJ10sXG4gICAgICAgICdWODgwJzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ2E1JzogWydaVEUnLCAnQmxhZGUnXSxcbiAgICAgICAgJ0JsYWRlMic6IFsnWlRFJywgJ0JsYWRlIDInXSxcbiAgICAgICAgJ0JsYWRlIFMnOiBbJ1pURScsICdCbGFkZSBTJ10sXG4gICAgICAgICdYNTAwJzogWydaVEUnLCAnU2NvcmUnXSxcbiAgICAgICAgJ1pURS1YNTAwJzogWydaVEUnLCAnU2NvcmUnXSxcbiAgICAgICAgJ1NrYXRlJzogWydaVEUnLCAnU2thdGUnXSxcbiAgICAgICAgJ1pURSBTa2F0ZSc6IFsnWlRFJywgJ1NrYXRlJ10sXG4gICAgICAgICdaVEUtU2thdGUnOiBbJ1pURScsICdTa2F0ZSddLFxuICAgICAgICAnWlRFLVNLQVRFJzogWydaVEUnLCAnU2thdGUnXSxcbiAgICAgICAgJ1pURS1WOTYwJzogWydaVEUnLCAnU2thdGUnXSxcbiAgICAgICAgJ1pURS1VIFY5NjAnOiBbJ1pURScsICdTa2F0ZSddLFxuICAgICAgICAnWlRFIFJhY2VyJzogWydaVEUnLCAnUmFjZXInXSxcbiAgICAgICAgJ1pURS1SQUNFUic6IFsnWlRFJywgJ1JhY2VyJ10sXG4gICAgICAgICdNVEMgOTE2JzogWydaVEUnLCAnUmFjZXInXSxcbiAgICAgICAgJ1JhY2VyJzogWydaVEUnLCAnUmFjZXInXSxcbiAgICAgICAgJ1JhY2VySUknOiBbJ1pURScsICdSYWNlciAyJ10sXG4gICAgICAgICdSQUNFUklJJzogWydaVEUnLCAnUmFjZXIgMiddLFxuICAgICAgICAnWlRFIFJvYW1lcic6IFsnWlRFJywgJ1JvYW1lciddLFxuICAgICAgICAnTjg2MCc6IFsnWlRFJywgJ1dhcnAnXSxcbiAgICAgICAgJ044ODAnOiBbJ1pURScsICdCbGFkZSddLFxuICAgICAgICAnWlRFLVQgVTgwMic6IFsnWlRFJywgJ1QtVTgwMiddLFxuICAgICAgICAnWlRFLVQgVTgwNic6IFsnWlRFJywgJ1QtVTgwNiddLFxuICAgICAgICAnWlRFLVQgVTgxMic6IFsnWlRFJywgJ1QtVTgxMiddLFxuICAgICAgICAnWlRFLVQgVTgzMCc6IFsnWlRFJywgJ1QtVTgzMCddLFxuICAgICAgICAnWlRFLVQgVTg4MCc6IFsnWlRFJywgJ1QtVTg4MCddLFxuICAgICAgICAnWlRFIFQgVTg4MCc6IFsnWlRFJywgJ1QtVTg4MCddLFxuICAgICAgICAnWlRFLVRVODgwJzogWydaVEUnLCAnVC1VODgwJ10sXG4gICAgICAgICdaVEUtVFU5MDAnOiBbJ1pURScsICdULVU5MDAnXSxcbiAgICAgICAgJ1pURS1UIFU5NjAnOiBbJ1pURScsICdULVU5NjAnXSxcbiAgICAgICAgJ1pURS1UVTk2MHMnOiBbJ1pURScsICdULVU5NjAnXSxcbiAgICAgICAgJ1pURS1UIFU5NjBzJzogWydaVEUnLCAnVC1VOTYwJ10sXG4gICAgICAgICdaVEUgVSBONzIwJzogWydaVEUnLCAnVS1ONzIwJ10sXG4gICAgICAgICdaVEUtVSBWODU2JzogWydaVEUnLCAnVS1WODU2J10sXG4gICAgICAgICdaVEUtVSBWODU3JzogWydaVEUnLCAnVS1WODU3J10sXG4gICAgICAgICdaVEUtVSBWODgxJzogWydaVEUnLCAnVS1WODgxJ10sXG4gICAgICAgICdaVEUtVSBYODUwJzogWydaVEUnLCAnVS1YODUwJ10sXG4gICAgICAgICdaVEUtVSBYODc2JzogWydaVEUnLCAnVS1YODc2J10sXG4gICAgICAgICdaVEUtWDg3Nic6IFsnWlRFJywgJ1UtWDg3NiddLFxuICAgICAgICAnWlRFLUMgUjc1MCc6IFsnWlRFJywgJ0MtUjc1MCddLFxuICAgICAgICAnWlRFLUMgTjYwMCc6IFsnWlRFJywgJ0MtTjYwMCddLFxuICAgICAgICAnWlRFLUMgTjYwMCsnOiBbJ1pURScsICdDLU42MDAnXSxcbiAgICAgICAgJ1pURS1DIE42MDYnOiBbJ1pURScsICdDLU42MDYnXSxcbiAgICAgICAgJ1pURS1DIE43MDAnOiBbJ1pURScsICdDLU43MDAnXSxcbiAgICAgICAgJ1pURS1DIE43NjAnOiBbJ1pURScsICdDLU43NjAnXSxcbiAgICAgICAgJ1pURS1DIE44ODAnOiBbJ1pURScsICdDLU44ODAnXSxcbiAgICAgICAgJ1pURS1DIE44ODBTJzogWydaVEUnLCAnQy1OODgwJ10sXG4gICAgICAgICdaVEUtQyBOODgwcyc6IFsnWlRFJywgJ0MtTjg4MCddLFxuICAgICAgICAnWlRFLUMgWDUwMCc6IFsnWlRFJywgJ0MtWDUwMCddLFxuICAgICAgICAnWlRFLUMgWDkyMCc6IFsnWlRFJywgJ0MtWDkyMCddLFxuICAgICAgICAnWlhZLVpURS1DIFg5MjAnOiBbJ1pURScsICdDLVg5MjAnXSxcbiAgICAgICAgJ1pURSBHVjgyMSc6IFsnWlRFJywgJ0ctVjgyMSddLFxuICAgICAgICAnWlRFIE44ODBFJzogWydaVEUnLCAnTjg4MEUnXSxcbiAgICAgICAgJ1pURS1OODgwRSc6IFsnWlRFJywgJ044ODBFJ10sXG4gICAgICAgICdNSVVJIE44ODBTJzogWydaVEUnLCAnTjg4MFMnXSxcbiAgICAgICAgJ1pURSBOODgyRSc6IFsnWlRFJywgJ044ODJFJ10sXG4gICAgICAgICdaVEUgTjg1NUQnOiBbJ1pURScsICdOODU1RCddLFxuICAgICAgICAnWlRFLU45MTAnOiBbJ1pURScsICdOOTEwJ10sXG4gICAgICAgICdFODEwJzogWydaVEUnLCAnRTgxMCddLFxuICAgICAgICAndTg4MCc6IFsnWlRFJywgJ1U4ODAnXSxcbiAgICAgICAgJ1pURSBVODgwRSc6IFsnWlRFJywgJ1U4ODBFJ10sXG4gICAgICAgICdVODgwJzogWydaVEUnLCAnVTg4MCddLFxuICAgICAgICAnWlRFIFU5NzAnOiBbJ1pURScsICdVOTcwJ10sXG4gICAgICAgICdaVEUgVjc2OCc6IFsnWlRFJywgJ1Y3NjgnXSxcbiAgICAgICAgJ1pURS1WODU2JzogWydaVEUnLCAnVjg1NiddLFxuICAgICAgICAnWlRFIFY4NzdiJzogWydaVEUnLCAnVjg3NyddLFxuICAgICAgICAnWlRFIFY4ODlEJzogWydaVEUnLCAnVjg4OSddLFxuICAgICAgICAnWlRFLVo5OTAnOiBbJ1pURScsICdaOTkwJ10sXG4gICAgICAgICdaVEVVNzkwJzogWydaVEUnLCAnVTc5MCddLFxuICAgICAgICAnMDAzWic6IFsnWlRFJywgJ1NvZnRiYW5rIDAwM1onXSxcbiAgICAgICAgJzAwOFonOiBbJ1pURScsICdTb2Z0YmFuayAwMDhaJ10sXG4gICAgICAgICcwMDlaJzogWydaVEUnLCAnU29mdGJhbmsgU3RhcjcnXSxcbiAgICAgICAgJ2ktbW9iaWxlIGk2OTEnOiBbJ2ktTW9iaWxlJywgJ2k2OTEnXSxcbiAgICAgICAgJ2ktbW9iaWxlIGk2OTUnOiBbJ2ktTW9iaWxlJywgJ2k2OTUnXSxcbiAgICAgICAgJ2ktbW9iaWxlIGk4NTgnOiBbJ2ktTW9iaWxlJywgJ2k4NTgnXSxcbiAgICAgICAgJ2ktbW9iaWxlIDNHIDg1MDAnOiBbJ2ktTW9iaWxlJywgJzNHIDg1MDAnXSxcbiAgICAgICAgJ2ktbW9iaWxlIEktTm90ZSc6IFsnaS1Nb2JpbGUnLCAnaS1Ob3RlJywgJ3RhYmxldCddLFxuICAgICAgICAnT3B0aW11cyBCb3N0b24nOiBbJ09wdGltdXMnLCAnQm9zdG9uJ10sXG4gICAgICAgICdPcHRpbXVzIFNhbiBGcmFuY2lzY28nOiBbJ09wdGltdXMnLCAnU2FuIEZyYW5jaXNjbyddLFxuICAgICAgICAnT3B0aW11cyBNb250ZSBDYXJsbyc6IFsnT3B0aW11cycsICdNb250ZSBDYXJsbyddLFxuICAgICAgICAnT3JhbmdlIEJvc3Rvbic6IFsnT3JhbmdlJywgJ0Jvc3RvbiddLFxuICAgICAgICAnT3JhbmdlIE1vbnRlIENhcmxvJzogWydPcmFuZ2UnLCAnTW9udGUgQ2FybG8nXSxcbiAgICAgICAgJ1NhbiBGcmFuY2lzY28nOiBbJ09yYW5nZScsICdTYW4gRnJhbmNpc2NvJ10sXG4gICAgICAgICdTYW4gRnJhbmNpc2NvIGZvciBPcmFuZ2UnOiBbJ09yYW5nZScsICdTYW4gRnJhbmNpc2NvJ10sXG4gICAgICAgICdPcmFuZ2UgU2FuIEZyYW5jaXNjbyc6IFsnT3JhbmdlJywgJ1NhbiBGcmFuY2lzY28nXSxcbiAgICAgICAgJ01PVkUnOiBbJ1QtTW9iaWxlJywgJ01PVkUnXSxcbiAgICAgICAgJ1QtTW9iaWxlIEcxJzogWydULU1vYmlsZScsICdHMSddLFxuICAgICAgICAnVC1Nb2JpbGUgRzInOiBbJ1QtTW9iaWxlJywgJ0cyJ10sXG4gICAgICAgICdULU1vYmlsZSBHMiBUb3VjaCc6IFsnVC1Nb2JpbGUnLCAnRzInXSxcbiAgICAgICAgJ0xHLVA5OTknOiBbJ1QtTW9iaWxlJywgJ0cyeCddLFxuICAgICAgICAnTEctRTczOSc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCddLFxuICAgICAgICAnVC1Nb2JpbGUgbXlUb3VjaCAzRyc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCAzRyddLFxuICAgICAgICAnVC1Nb2JpbGUgbXlUb3VjaCAzRyBTbGlkZSc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCAzRyBTbGlkZSddLFxuICAgICAgICAnVC1Nb2JpbGUgRXNwcmVzc28nOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggM0cgU2xpZGUnXSxcbiAgICAgICAgJ0hUQyBteVRvdWNoIDNHIFNsaWRlJzogWydULU1vYmlsZScsICdteVRvdWNoIDNHIFNsaWRlJ10sXG4gICAgICAgICdULU1vYmlsZSBteVRvdWNoIDRHJzogWydULU1vYmlsZScsICdteVRvdWNoIDRHJ10sXG4gICAgICAgICdIVEMgR2xhY2llcic6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCA0RyddLFxuICAgICAgICAnSFRDIFBhbmFjaGUnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggNEcnXSxcbiAgICAgICAgJ215VG91Y2g0Ryc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCA0RyddLFxuICAgICAgICAnTXkgVG91Y2ggNEcnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggNEcnXSxcbiAgICAgICAgJ0hUQyBNeXRvdWNoIDRHJzogWydULU1vYmlsZScsICdteVRvdWNoIDRHJ10sXG4gICAgICAgICdIVEMgTXkgVG91Y2ggNEcnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggNEcnXSxcbiAgICAgICAgJ0hUQyBteXRvdWNoNGcnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggNEcnXSxcbiAgICAgICAgJ0hUQyBteVRvdWNoIDRHIFNsaWRlJzogWydULU1vYmlsZScsICdteVRvdWNoIDRHIFNsaWRlJ10sXG4gICAgICAgICdteVRvdWNoIDRHIFNsaWRlJzogWydULU1vYmlsZScsICdteVRvdWNoIDRHIFNsaWRlJ10sXG4gICAgICAgICdULU1vYmlsZSBteVRvdWNoIFEnOiBbJ1QtTW9iaWxlJywgJ215VG91Y2ggUSddLFxuICAgICAgICAnTEctQzgwMCc6IFsnVC1Nb2JpbGUnLCAnbXlUb3VjaCBRJ10sXG4gICAgICAgICdQdWxzZSBNaW5pJzogWydULU1vYmlsZScsICdQdWxzZSBNaW5pJ10sXG4gICAgICAgICdWb2RhZm9uZSA4NDUnOiBbJ1ZvZGFmb25lJywgJzg0NSBOb3ZhJ10sXG4gICAgICAgICdWb2RhZm9uZSA4NTgnOiBbJ1ZvZGFmb25lJywgJzg1OCBTbWFydCddLFxuICAgICAgICAnVm9kYWZvbmUgOTQ1JzogWydWb2RhZm9uZScsICc5NDUnXSxcbiAgICAgICAgJ1ZvZGFmb25lIFNtYXJ0IElJJzogWydWb2RhZm9uZScsICdTbWFydCBJSSddLFxuICAgICAgICAnU21hcnRUYWIxMCc6IFsnVm9kYWZvbmUnLCAnU21hcnRUYWIgMTAnLCAndGFibGV0J10sXG4gICAgICAgICdTQ0gtTjcxOSc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSBJSSddLFxuICAgICAgICAnQ29vbHBhZCA4MTkwJzogWydDb29scGFkJywgJzgxOTAnXSxcbiAgICAgICAgJ1U3MDVUJzogWydPcHBvJywgJ1VsaWtlMiddLFxuICAgICAgICAnQ29vbHBhZCA4MDIwKyc6IFsnQ29vbHBhZCcsICc4MDIwJ10sXG4gICAgICAgICdIdWF3ZWkgWTMxMC01MDAwJzogWydIdWF3ZWknLCAnWTMxMCddLFxuICAgICAgICAnR1QtUzc1NzInOiBbJ1NhbXN1bmcnLCAnR2FsYXh5IFRyZW5kIER1b3MgSUknXSxcbiAgICAgICAgJ0xlbm92byBBMjc4dCc6IFsnTGVub3ZvJywgJ0EyNzh0J10sXG4gICAgICAgICdMZW5vdm8gQTY5MCc6IFsnTGVub3ZvJywgJ0E2OTAnXSxcbiAgICAgICAgJ0dULUk4MjYyRCc6IFsnU2Ftc3VuZycsICdMZVBob25lIEk4MjYyRCddLFxuICAgICAgICAnTGVub3ZvIEEyNzh0JzogWydMZW5vdm8nLCAnQTI3OHQnXSxcbiAgICAgICAgJ01JIDJDJzogWydYaWFvbWknLCAnTUktVFdPJ10sXG4gICAgICAgICdDb29scGFkIDgwNzAnOiBbJ0Nvb2xwYWQnLCAnODA3MCddLFxuICAgICAgICAnUjgxM1QnOiBbJ09wcG8nLCAnUjgxM1QnXSxcbiAgICAgICAgJ1pURSBVOTMwJzogWydaVEUnLCAnVTkzMCddLFxuICAgICAgICAnTGVub3ZvIEEzNjAnOiBbJ0xlbm92bycsICdMZVBob25lIEEzNjAnXSxcbiAgICAgICAgJ1NDSC1ONzE5JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlIElJJ10sXG4gICAgICAgICdDb29scGFkIDgwMTAnOiBbJ0Nvb2xwYWQnLCAnODAxMCddLFxuICAgICAgICAnTEVOT1ZPLUxlbm92by1BMjg4dCc6IFsnTGVub3ZvJywgJ0EyODh0J10sXG4gICAgICAgICdVNzAxVCc6IFsnT3BwbycsICdVNzAxVCddLFxuICAgICAgICAnWlRFVTc5NSc6IFsnQ29vbHBhZCcsICdVNzk1J10sXG4gICAgICAgICdIYWllci1IVC1JNjE3JzogWydIYWllcicsICdJNjE3J10sXG4gICAgICAgICdaVEVVODgwcyc6IFsnWlRFJywgJ1QtVTg4MCddLFxuICAgICAgICAnR1QtUzYzNTInOiBbJ1NhbXN1bmcnLCAnR1QtUzYzNTInXSxcbiAgICAgICAgJ0dULVM3NTY4JzogWydTYW1zdW5nJywgJ0dULVM3NTY4J10sXG4gICAgICAgICdLLVRvdWNoIFQ2MTkrJzogWydLLVRvdWNoJywgJ1Q2MTknXSxcbiAgICAgICAgJ01JIDJBJzogWydYaWFvbWknLCAnTUktVFdPIEEnXSxcbiAgICAgICAgJ0dULU43MTA4JzogWydTYW1zdW5nJywgJ0dhbGF4eSBOb3RlIElJJ10sXG4gICAgICAgICdLLVRvdWNoIFQ2MjEnOiBbJ0stVG91Y2gnLCAnVDYyMSddLFxuICAgICAgICAnTEVOT1ZPLUxlbm92by1BMjk4dCc6IFsnTGVub3ZvJywgJ0EyOTgnXSxcbiAgICAgICAgJ0Nvb2xwYWQgODE1MCc6IFsnQ29vbHBhZCcsICc4MTUwJ10sXG4gICAgICAgICc1ODYwUyc6IFsnQ29vbHBhZCcsICc1ODYwJ10sXG4gICAgICAgICdaVEVVODA3JzogWydaVEUnLCAnVTgwNyddLFxuICAgICAgICAnU0NILUk3MzknOiBbJ1NhbXN1bmcnLCAnU0NILUk3MzknXSxcbiAgICAgICAgJ1NDSC1JODI5JzogWydTYW1zdW5nJywgJ1NDSC1JODI5J10sXG4gICAgICAgICdIUy1FODMwJzogWydIaXNlbnNlJywgJ0U4MzAnXSxcbiAgICAgICAgJ0hTLUU5MjAnOiBbJ0hpc2Vuc2UnLCAnRTkyMCddLFxuICAgICAgICAnTGVub3ZvIFM3MjAnOiBbJ0xlbm92bycsICdTNzIwJ10sXG4gICAgICAgICdNSSAyQyc6IFsnWGlhb21pJywgJ01JLVRXTyddLFxuICAgICAgICAnT1BQTyBSODEzVCc6IFsnT3BwbycsICdSODEzJ10sXG4gICAgICAgICdTQ0gtSTg3OSc6IFsnU2Ftc3VuZycsICdHYWxheHkgTm90ZSddLFxuICAgICAgICAnR1QtUzYxMDJFJzogWydTYW1zdW5nJywgJ0dhbGF4eSBZIER1b3MnXVxuICAgIH1cblxuICAgIHZhciBCTEFDS0JFUlJZX01PREVMUyA9IHtcbiAgICAgICAgJzk2MDAnOiAnQm9sZCcsXG4gICAgICAgICc5NjUwJzogJ0JvbGQnLFxuICAgICAgICAnOTcwMCc6ICdCb2xkJyxcbiAgICAgICAgJzk3ODAnOiAnQm9sZCcsXG4gICAgICAgICc5NzkwJzogJ0JvbGQnLFxuICAgICAgICAnOTkwMCc6ICdCb2xkJyxcbiAgICAgICAgJzk5MzAnOiAnQm9sZCcsXG4gICAgICAgICc4MzAwJzogJ0N1cnZlJyxcbiAgICAgICAgJzgzMTAnOiAnQ3VydmUnLFxuICAgICAgICAnODMyMCc6ICdDdXJ2ZScsXG4gICAgICAgICc4MzMwJzogJ0N1cnZlJyxcbiAgICAgICAgJzgzNTBpJzogJ0N1cnZlJyxcbiAgICAgICAgJzg1MjAnOiAnQ3VydmUnLFxuICAgICAgICAnODUzMCc6ICdDdXJ2ZScsXG4gICAgICAgICc4OTAwJzogJ0N1cnZlJyxcbiAgICAgICAgJzkyMjAnOiAnQ3VydmUnLFxuICAgICAgICAnOTMwMCc6ICdDdXJ2ZScsXG4gICAgICAgICc5MzMwJzogJ0N1cnZlJyxcbiAgICAgICAgJzkzNTAnOiAnQ3VydmUnLFxuICAgICAgICAnOTM2MCc6ICdDdXJ2ZScsXG4gICAgICAgICc5MzcwJzogJ0N1cnZlJyxcbiAgICAgICAgJzkzODAnOiAnQ3VydmUnLFxuICAgICAgICAnODEwMCc6ICdQZWFybCcsXG4gICAgICAgICc4MTEwJzogJ1BlYXJsJyxcbiAgICAgICAgJzgxMjAnOiAnUGVhcmwnLFxuICAgICAgICAnODEzMCc6ICdQZWFybCcsXG4gICAgICAgICc4MjIwJzogJ1BlYXJsJyxcbiAgICAgICAgJzgyMzAnOiAnUGVhcmwnLFxuICAgICAgICAnOTEwMCc6ICdQZWFybCcsXG4gICAgICAgICc5MTA1JzogJ1BlYXJsJyxcbiAgICAgICAgJzk1MzAnOiAnU3Rvcm0nLFxuICAgICAgICAnOTU1MCc6ICdTdG9ybScsXG4gICAgICAgICc5NjcwJzogJ1N0eWxlJyxcbiAgICAgICAgJzk4MDAnOiAnVG9yY2gnLFxuICAgICAgICAnOTgxMCc6ICdUb3JjaCcsXG4gICAgICAgICc5ODUwJzogJ1RvcmNoJyxcbiAgICAgICAgJzk4NjAnOiAnVG9yY2gnLFxuICAgICAgICAnOTYzMCc6ICdUb3VyJyxcbiAgICAgICAgJzk5ODEnOiAnUG9yc2NoZSBQJ1xuICAgIH07XG5cblxuICAgIHZhciBWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICB9O1xuICAgIFZlcnNpb24ucHJvdG90eXBlID0ge1xuICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbCA9IHYudmFsdWUgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYWxpYXMgPSB2LmFsaWFzIHx8IG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBEZXRlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9O1xuICAgIERldGVjdGVkLnByb3RvdHlwZSA9IHtcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHVhLCBvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdXNlRmVhdHVyZXM6IG9wdGlvbnMgJiYgb3B0aW9ucy51c2VGZWF0dXJlcyB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgICBkZXRlY3RDYW1vdWZsYWdlOiBvcHRpb25zICYmIG9wdGlvbnMuZGV0ZWN0Q2Ftb3VmbGFnZSB8fCB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYnJvd3NlciA9IHtcbiAgICAgICAgICAgICAgICAnc3RvY2snOiB0cnVlLFxuICAgICAgICAgICAgICAgICdoaWRkZW4nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAnY2hhbm5lbCc6ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5lbmdpbmUgPSB7fTtcbiAgICAgICAgICAgIHRoaXMub3MgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlID0ge1xuICAgICAgICAgICAgICAgICd0eXBlJzogJ2Rlc2t0b3AnLFxuICAgICAgICAgICAgICAgICdpZGVudGlmaWVkJzogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5kZXRlY3QodWEpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRldGVjdDogZnVuY3Rpb24gKHVhKSB7XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFVuaXhcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1VuaXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdVbml4JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgRnJlZUJTRFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnRnJlZUJTRCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0ZyZWVCU0QnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBPcGVuQlNEXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdPcGVuQlNEJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnT3BlbkJTRCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE5ldEJTRFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnTmV0QlNEJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnTmV0QlNEJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgU3VuT1NcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1N1bk9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU29sYXJpcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIExpbnV4XG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdMaW51eCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0xpbnV4JztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnQ2VudE9TJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0NlbnRPUyc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9DZW50T1NcXC9bMC05XFwuXFwtXStlbChbMC05X10rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0ucmVwbGFjZSgvXy9nLCAnLicpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnRGViaWFuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0RlYmlhbic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdGZWRvcmEnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnRmVkb3JhJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0ZlZG9yYVxcL1swLTlcXC5cXC1dK2ZjKFswLTldKykvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnR2VudG9vJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0dlbnRvbyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdLdWJ1bnR1JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0t1YnVudHUnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnTWFuZHJpdmEgTGludXgnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnTWFuZHJpdmEnO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTWFuZHJpdmEgTGludXhcXC9bMC05XFwuXFwtXSttZHYoWzAtOV0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdNYWdlaWEnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnTWFnZWlhJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL01hZ2VpYVxcL1swLTlcXC5cXC1dK21nYShbMC05XSspLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1JlZCBIYXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnUmVkIEhhdCc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9SZWQgSGF0W15cXC9dKlxcL1swLTlcXC5cXC1dK2VsKFswLTlfXSspLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXS5yZXBsYWNlKC9fL2csICcuJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdTbGFja3dhcmUnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU2xhY2t3YXJlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1NVU0UnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU1VTRSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdUdXJib2xpbnV4JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1R1cmJvbGludXgnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnVWJ1bnR1JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1VidW50dSc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9VYnVudHVcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgaU9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdpUGhvbmUoIFNpbXVsYXRvcik/OycpIHx8IHVhLm1hdGNoKCdpUGFkOycpIHx8IHVhLm1hdGNoKCdpUG9kOycpIHx8IHVhLm1hdGNoKC9pUGhvbmVcXHMqXFxkKnM/W2NwXT87L2kpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ2lPUyc7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzEuMCdcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9PUyAoLiopIGxpa2UgTWFjIE9TIFgvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXS5yZXBsYWNlKC9fL2csICcuJylcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdpUGhvbmUgU2ltdWxhdG9yOycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZW11bGF0b3InO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodWEubWF0Y2goJ2lQb2Q7JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtZWRpYSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdBcHBsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ2lQb2QgVG91Y2gnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodWEubWF0Y2goJ2lQaG9uZTsnKSB8fCB1YS5tYXRjaCgvaVBob25lXFxzKlxcZCpzP1tjcF0/Oy9pKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdBcHBsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ2lQaG9uZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnQXBwbGUnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdpUGFkJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTWFjT1MgWFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGVsc2UgaWYgKHVhLm1hdGNoKCdNYWMgT1MgWCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ01hYyBPUyBYJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9NYWMgT1MgWCAoMTBbMC05XFwuX10qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLnJlcGxhY2UoL18vZywgJy4nKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFdpbmRvd3NcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1dpbmRvd3MnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9XaW5kb3dzIE5UIChbMC05XVxcLlswLTldKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gcGFyc2VWZXJzaW9uKG1hdGNoWzFdKTtcblxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2LjInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJzgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2LjEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJzcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2LjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJ1Zpc3RhJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNS4yJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6ICdTZXJ2ZXIgMjAwMydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzUuMSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnWFAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc1LjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJzIwMDAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJ05UICcgKyB0aGlzLm9zLnZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyA5NScpIHx8IHVhLm1hdGNoKCdXaW45NScpIHx8IHVhLm1hdGNoKCdXaW4gOXggNC4wMCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNC4wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnOTUnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyA5OCcpIHx8IHVhLm1hdGNoKCdXaW45OCcpIHx8IHVhLm1hdGNoKCdXaW4gOXggNC4xMCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNC4xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnOTgnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyBNRScpIHx8IHVhLm1hdGNoKCdXaW5NRScpIHx8IHVhLm1hdGNoKCdXaW4gOXggNC45MCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNC45JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnTUUnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyBYUCcpIHx8IHVhLm1hdGNoKCdXaW5YUCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNS4xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiAnWFAnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV1A3JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1dpbmRvd3MgUGhvbmUnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzcuMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5tb2RlID0gJ2Rlc2t0b3AnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyBDRScpIHx8IHVhLm1hdGNoKCdXaW5DRScpIHx8IHVhLm1hdGNoKCdXaW5kb3dzQ0UnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJyBJRU1vYmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnV2luZG93cyBNb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJyBJRU1vYmlsZSA4JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNi41JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJyBJRU1vYmlsZSA3JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNi4xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJyBJRU1vYmlsZSA2JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnNi4wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1dpbmRvd3MgQ0UnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvV2luZG93c0NFT1NcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1dpbmRvd3MgQ0UgKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdXaW5kb3dzIE1vYmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzIE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvV2luZG93c01vYmlsZVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1dpbmRvd3MgTW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnV2luZG93cyBQaG9uZSBbMC05XScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzIE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1YS5tYXRjaCgvV2luZG93cyBQaG9uZSAoWzAtOS5dKikvKVsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1dpbmRvd3MgUGhvbmUgT1MnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnV2luZG93cyBQaG9uZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1YS5tYXRjaCgvV2luZG93cyBQaG9uZSBPUyAoWzAtOS5dKikvKVsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MudmVyc2lvbiA8IDcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzIE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvSUVNb2JpbGVcXC9bXjtdKzsgKFteO10rKTsgKFteO10rKVs7fFxcKV0vLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hbnVmYWN0dXJlciA9IHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlcjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gY2xlYW51cE1vZGVsKHRoaXMuZGV2aWNlLm1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFdJTkRPV1NfUEhPTkVfTU9ERUxTW21hbnVmYWN0dXJlcl0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBXSU5ET1dTX1BIT05FX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFdJTkRPV1NfUEhPTkVfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBXSU5ET1dTX1BIT05FX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hbnVmYWN0dXJlciA9PT0gJ01pY3Jvc29mdCcgJiYgbW9kZWwgPT09ICdYRGV2aWNlRW11bGF0b3InKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdlbXVsYXRvcic7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgQW5kcm9pZFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0FuZHJvaWQnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdBbmRyb2lkJztcbiAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0FuZHJvaWQoPzogKT8oPzpBbGxQaG9uZV98Q3lhbm9nZW5Nb2RfKT8oPzpcXC8pP3Y/KFswLTkuXSspLy5leGVjKHVhLnJlcGxhY2UoJy11cGRhdGUnLCAnLicpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdBbmRyb2lkIEVjbGFpcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMi4wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLnZlcnNpb24gPj0gMykgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLnZlcnNpb24gPj0gNCAmJiB1YS5tYXRjaCgnTW9iaWxlJykpIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9FY2xhaXI7ICg/OlthLXpBLVpdW2EtekEtWl0oPzpbLV9dW2EtekEtWl1bYS16QS1aXSk/KSBCdWlsZFxcLyhbXlxcL10qKVxcLy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gLzsgKFteO10qW147XFxzXSlcXHMrQnVpbGQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA9IC9bYS16QS1aXVthLXpBLVpdKD86Wy1fXVthLXpBLVpdW2EtekEtWl0pPzsgKFteO10qW147XFxzXSk7XFxzK0J1aWxkLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2ggPSAvXFwoKFteO10rKTtVO0FuZHJvaWRcXC9bXjtdKztbMC05XStcXCpbMC05XSs7Q1RDXFwvMi4wXFwpLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2ggPSAvO1xccz8oW147XSspO1xccz9bMC05XStcXCpbMC05XSs7XFxzP0NUQ1xcLzIuMC8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL3poLWNuO1xccyooLio/KShcXC98YnVpbGQpL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL0FuZHJvaWQgW147XSs7ICg/OlthLXpBLVpdW2EtekEtWl0oPzpbLV9dW2EtekEtWl1bYS16QS1aXSk/OyApPyhbXildKylcXCkvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdWEubWF0Y2goL1thLXpBLVpdW2EtekEtWl0oPzpbLV9dW2EtekEtWl1bYS16QS1aXSk/LykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL14oLis/KVxcL1xcUysvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgLyogU29tZXRpbWVzIHdlIGdldCBhIG1vZGVsIG5hbWUgdGhhdCBzdGFydHMgd2l0aCBBbmRyb2lkLCBpbiB0aGF0IGNhc2UgaXQgaXMgYSBtaXNtYXRjaCBhbmQgd2Ugc2hvdWxkIGlnbm9yZSBpdCAqL1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldmljZS5tb2RlbCAmJiB0aGlzLmRldmljZS5tb2RlbC5zdWJzdHJpbmcoMCwgNykgPT09ICdBbmRyb2lkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV2aWNlLm1vZGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBBTkRST0lEX01PREVMU1ttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzJdICE9PSAndW5kZWZpbmVkJykgdGhpcy5kZXZpY2UudHlwZSA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsID09PSAnRW11bGF0b3InIHx8IG1vZGVsID09PSAneDg2IEVtdWxhdG9yJyB8fCBtb2RlbCA9PT0gJ3g4NiBWaXJ0dWFsQm94JyB8fCBtb2RlbCA9PT0gJ3ZtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZW11bGF0b3InO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0hQIGVTdGF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0hQJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnZVN0YXRpb24nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RhYmxldCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1ByZVxcLzEuMCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdQYWxtJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUHJlJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUHJlXFwvMS4xJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1BhbG0nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdQcmUgUGx1cyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1ByZVxcLzEuMicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdQYWxtJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUHJlIDInO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQcmVcXC8zLjAnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnSFAnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdQcmUgMyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1BpeGlcXC8xLjAnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnUGFsbSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1BpeGknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQaXhpXFwvMS4xJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1BhbG0nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdQaXhpIFBsdXMnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQMTYwVU4/QT9cXC8xLjAnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnSFAnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdWZWVyJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBHb29nbGUgVFZcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0dvb2dsZVRWJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnR29vZ2xlIFRWJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnQ2hyb21lLzUuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcxJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0Nocm9tZS8xMS4nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzInXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFdvUGhvbmVcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1dvUGhvbmUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXb1Bob25lJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Xb1Bob25lXFwvKFswLTlcXC5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEJsYWNrQmVycnlcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0JsYWNrQmVycnknKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdCbGFja0JlcnJ5IE9TJztcblxuICAgICAgICAgICAgICAgIGlmICghdWEubWF0Y2goJ09wZXJhJykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0JsYWNrQmVycnkoWzAtOV0qKVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLzsgQmxhY2tCZXJyeSAoWzAtOV0qKTsvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ZlcnNpb25cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MudmVyc2lvbiA+PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0JsYWNrQmVycnknO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRldmljZS5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQkxBQ0tCRVJSWV9NT0RFTFNbdGhpcy5kZXZpY2UubW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0JsYWNrQmVycnkgJyArIEJMQUNLQkVSUllfTU9ERUxTW3RoaXMuZGV2aWNlLm1vZGVsXSArICcgJyArIHRoaXMuZGV2aWNlLm1vZGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdCbGFja0JlcnJ5ICcgKyB0aGlzLmRldmljZS5tb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0JsYWNrQmVycnknO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnQmxhY2tCZXJyeSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1JJTSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBCbGFja0JlcnJ5IFBsYXlCb29rXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdSSU0gVGFibGV0IE9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQmxhY2tCZXJyeSBUYWJsZXQgT1MnO1xuICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVhLm1hdGNoKC9SSU0gVGFibGV0IE9TIChbMC05Ll0qKS8pWzFdLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnUklNJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdCbGFja0JlcnJ5IFBsYXlCb29rJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RhYmxldCc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHVhLm1hdGNoKCdQbGF5Qm9vaycpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ZlcnNpb25cXC8oMTBbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0JsYWNrQmVycnknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdSSU0nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdCbGFja0JlcnJ5IFBsYXlCb29rJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgV2ViT1NcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJyg/OndlYnxocHcpT1MnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICd3ZWJPUyc7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdWEubWF0Y2goLyg/OndlYnxocHcpT1NcXC8oWzAtOS5dKikvKVsxXVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCd0YWJsZXQnKSkgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gdWEubWF0Y2goJ2hwd09TJykgPyAnSFAnIDogJ1BhbG0nO1xuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUHJlXFwvMS4wJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1ByZSc7XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQcmVcXC8xLjEnKSkgdGhpcy5kZXZpY2UubW9kZWwgPSAnUHJlIFBsdXMnO1xuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUHJlXFwvMS4yJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1ByZTInO1xuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUHJlXFwvMy4wJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1ByZTMnO1xuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUGl4aVxcLzEuMCcpKSB0aGlzLmRldmljZS5tb2RlbCA9ICdQaXhpJztcbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1BpeGlcXC8xLjEnKSkgdGhpcy5kZXZpY2UubW9kZWwgPSAnUGl4aSBQbHVzJztcbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1AxNjBVTj9BP1xcLzEuMCcpKSB0aGlzLmRldmljZS5tb2RlbCA9ICdWZWVyJztcbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ1RvdWNoUGFkXFwvMS4wJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1RvdWNoUGFkJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnRW11bGF0b3JcXC8nKSB8fCB1YS5tYXRjaCgnRGVza3RvcFxcLycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZW11bGF0b3InO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFM2MFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU3ltYmlhbicpIHx8IHVhLm1hdGNoKCdTZXJpZXNbIF0/NjAnKSB8fCB1YS5tYXRjaCgnUzYwJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU2VyaWVzNjAnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdTeW1iaWFuT1MvOS4xJykgJiYgIXVhLm1hdGNoKCdTZXJpZXM2MCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMy4wJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvU2VyaWVzNjBcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTm9raWEoW15cXC87XSspW1xcL3w7XS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdICE9PSAnQnJvd3NlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdOb2tpYSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvVmVydHUoW15cXC87XSspW1xcL3w7XS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1ZlcnR1JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1N5bWJpYW47IFU7IChbXjtdKyk7IFthLXpdW2Etel1cXC1bYS16XVthLXpdL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05va2lhJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1NhbXN1bmdcXC8oW147XSopOy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19TQU1TVU5HO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFM0MFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU2VyaWVzNDAnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdTZXJpZXM0MCc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTm9raWEoW15cXC9dKylcXC8vLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdOb2tpYSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTWVlR29cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ01lZUdvJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnTWVlR28nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Ob2tpYShbXlxcKV0rKVxcKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05va2lhJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNYWVtb1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnTWFlbW8nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdNYWVtbyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLyhOWzAtOV0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05va2lhJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBUaXplblxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnVGl6ZW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdUaXplbic7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvVGl6ZW5bXFwvIF0oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoKFteO10rKTsgKFteXFwvXSspXFwvLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMV0gIT09ICdMaW51eCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsyXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBUSVpFTl9NT0RFTFNbdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFRJWkVOX01PREVMU1t0aGlzLmRldmljZS5tYW51ZmFjdHVyZXJdW3RoaXMuZGV2aWNlLm1vZGVsXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFudWZhY3R1cmVyID0gdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBUSVpFTl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBUSVpFTl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEJhZGFcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1tifEJdYWRhJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQmFkYSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvW2J8Ql1hZGFcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoKFteO10rKTsgKFteXFwvXSspXFwvLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMl0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQkFEQV9NT0RFTFNbdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEJBREFfTU9ERUxTW3RoaXMuZGV2aWNlLm1hbnVmYWN0dXJlcl1bdGhpcy5kZXZpY2UubW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWFudWZhY3R1cmVyID0gdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZWwgPSBjbGVhbnVwTW9kZWwodGhpcy5kZXZpY2UubW9kZWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IEJBREFfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IEJBREFfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdWzFdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEJyZXdcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goL0JSRVcvaSkgfHwgdWEubWF0Y2goJ0JNUDsgVScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0JyZXcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9CUkVXOyBVOyAoWzAtOS5dKikvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA9IC87QlJFV1xcLyhbMC05Ll0qKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9cXCgoW147XSspO1U7UkVYXFwvW147XSs7QlJFV1xcL1teO10rOyg/Oi4qOyk/WzAtOV0rXFwqWzAtOV0rO0NUQ1xcLzIuMFxcKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXZpY2UubW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gY2xlYW51cE1vZGVsKHRoaXMuZGV2aWNlLm1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEJSRVdfTU9ERUxTW21vZGVsXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IEJSRVdfTU9ERUxTW21vZGVsXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gQlJFV19NT0RFTFNbbW9kZWxdWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE1US1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgvXFwoTVRLOy8pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ01USyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBDck9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdDck9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQ2hyb21lIE9TJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2Rlc2t0b3AnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBKb2xpIE9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdKb2xpIE9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnSm9saSBPUyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdkZXNrdG9wJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Kb2xpIE9TXFwvKFswLTkuXSopL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgSGFpa3VcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0hhaWt1JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnSGFpa3UnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZGVza3RvcCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFFOWFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnUU5YJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnUU5YJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE9TLzIgV2FycFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnT1NcXC8yOyBXYXJwJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnT1MvMiBXYXJwJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2Rlc2t0b3AnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09TXFwvMjsgV2FycCAoWzAtOS5dKikvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBHcmlkIE9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdHcmlkIE9TJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnR3JpZCBPUyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0dyaWQgT1MgKFswLTkuXSopL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgQW1pZ2FPU1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgvQW1pZ2FPUy9pKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdBbWlnYU9TJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2Rlc2t0b3AnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0FtaWdhT1MgKFswLTkuXSopL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNb3JwaE9TXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKC9Nb3JwaE9TL2kpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ01vcnBoT1MnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTW9ycGhPUyAoWzAtOS5dKikvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEtpbmRsZVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnS2luZGxlJykgJiYgIXVhLm1hdGNoKCdGaXJlJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdBbWF6b24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0tpbmRsZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdlcmVhZGVyJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnS2luZGxlXFwvMi4wJykpIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0tpbmRsZSAyJztcbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0tpbmRsZVxcLzMuMCcpKSB0aGlzLmRldmljZS5tb2RlbCA9ICdLaW5kbGUgMyBvciBsYXRlcic7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTk9PS1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnbm9vayBicm93c2VyJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQW5kcm9pZCc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnQmFybmVzICYgTm9ibGUnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ05PT0snO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZXJlYWRlcic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEJvb2tlZW5cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ2Jvb2tlZW5cXC9jeWJvb2snKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0Jvb2tlZW4nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0N5Ym9vayc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdlcmVhZGVyJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnT3Jpem9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnQ3lib29rIE9yaXpvbic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFNvbnkgUmVhZGVyXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdFQlJEMTEwMScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnU29ueSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUmVhZGVyJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2VyZWFkZXInO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBpUml2ZXJcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0lyaXZlciA7JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdpUml2ZXInO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1N0b3J5JztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2VyZWFkZXInO1xuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdFQjA3JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnU3RvcnkgSEQgRUIwNyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE5pbnRlbmRvXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjMwIChOaW50ZW5kbyBXaWk7IFU7IDsgMzY0MjsgZW4pXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuMzAgKE5pbnRlbmRvIFdpaTsgVTsgOyAyMDQ3LTc7IGVuKVxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjUwIChOaW50ZW5kbyBEU2k7IE9wZXJhLzUwNzsgVTsgZW4tVVMpXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChOaW50ZW5kbyAzRFM7IFU7IDsgZW4pIFZlcnNpb24vMS43NDU1LlVTXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChOaW50ZW5kbyAzRFM7IFU7IDsgZW4pIFZlcnNpb24vMS43NDU1LkVVXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdOaW50ZW5kbyBXaWknKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05pbnRlbmRvJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdXaWknO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZ2FtaW5nJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdOaW50ZW5kbyBEU2knKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05pbnRlbmRvJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdEU2knO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZ2FtaW5nJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdOaW50ZW5kbyAzRFMnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05pbnRlbmRvJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICczRFMnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZ2FtaW5nJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9WZXJzaW9uXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQbGF5U3RhdGlvbiBQb3J0YWJsZScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnU29ueSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUGxheXN0YXRpb24gUG9ydGFibGUnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnZ2FtaW5nJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdQbGF5U3RhdGlvbiBWaXRhJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9QbGF5U3RhdGlvbiBWaXRhIChbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTb255JztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdQbGF5U3RhdGlvbiBWaXRhJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2dhbWluZyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgvUGxheVN0YXRpb24gMy9pKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1BMQVlTVEFUSU9OIDM7PyAoWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnU29ueSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnUGxheXN0YXRpb24gMyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdnYW1pbmcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBQYW5hc29uaWMgU21hcnQgVmllcmFcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChGcmVlQlNEOyBVOyBWaWVyYTsgamEtSlApIEFwcGxlV2ViS2l0LzUzNS4xIChLSFRNTCwgbGlrZSBHZWNrbykgVmllcmEvMS4yLjQgQ2hyb21lLzE0LjAuODM1LjIwMiBTYWZhcmkvNTM1LjFcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1ZpZXJhJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnUGFuYXNvbmljJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdTbWFydCBWaWVyYSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBTaGFycCBBUVVPUyBUVlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKERUVikgQXBwbGVXZWJLaXQvNTMxLjIgIChLSFRNTCwgbGlrZSBHZWNrbykgQVFVT1NCcm93c2VyLzEuMCAoVVMwMERUVjtWOzAwMDE7MDAwMSlcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKERUVikgQXBwbGVXZWJLaXQvNTMxLjIrIChLSFRNTCwgbGlrZSBHZWNrbykgRXNwaWFsLzYuMC40IEFRVU9TQnJvd3Nlci8xLjAgKENIMDBEVFY7VjswMDAxOzAwMDEpXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY2bDsgVTsgZW4pIFByZXN0by8yLjguMTE1IFZlcnNpb24vMTEuMTAgQVFVT1MtQVMvMS4wIExDLTQwTEU4MzVYXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdBUVVPU0Jyb3dzZXInKSB8fCB1YS5tYXRjaCgnQVFVT1MtQVMnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfU0hBUlA7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnQXF1b3MgVFYnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgU2Ftc3VuZyBTbWFydCBUVlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKFNtYXJ0SHViOyBTTUFSVC1UVjsgVTsgTGludXgvU21hcnRUVjsgTWFwbGUyMDEyKSBBcHBsZVdlYktpdC81MzQuNyAoS0hUTUwsIGxpa2UgR2Vja28pIFNtYXJ0VFYgU2FmYXJpLzUzNC43XG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChTbWFydEh1YjsgU01BUlQtVFY7IFU7IExpbnV4L1NtYXJ0VFYpIEFwcGxlV2ViS2l0LzUzMS4yKyAoS0hUTUwsIGxpa2UgR2Vja28pIFdlYkJyb3dzZXIvMS4wIFNtYXJ0VFYgU2FmYXJpLzUzMS4yK1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU01BUlQtVFYnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfU0FNU1VORztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdTbWFydCBUVic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9NYXBsZShbMC05XSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCArPSAnICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFNvbnkgSW50ZXJuZXQgVFZcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY3bDsgVTsgSW5ldHR2QnJvd3Nlci8yLjIoMDAwMTRBO1NvbnlEVFYxMTU7MDAwMjswMTAwKSBLREwtNDZFWDY0MDsgQ0MvVVNBOyBlbikgUHJlc3RvLzIuOC4xMTUgVmVyc2lvbi8xMS4xMFxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjgwIChMaW51eCBhcm12N2w7IFU7IEluZXR0dkJyb3dzZXIvMi4yKDAwMDE0QTtTb255RFRWMTE1OzAwMDI7MDEwMCkgS0RMLTQwRVg2NDA7IENDL1VTQTsgZW4pIFByZXN0by8yLjEwLjI1MCBWZXJzaW9uLzExLjYwXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY3bDsgVTsgSW5ldHR2QnJvd3Nlci8yLjIoMDAwMTRBO1NvbnlEVFYxMTU7MDAwMjswMTAwKSBOL0E7IENDL1VTQTsgZW4pIFByZXN0by8yLjguMTE1IFZlcnNpb24vMTEuMTBcbiAgICAgICAgICAgICAqICAgICAgT3BlcmEvOS44MCAoTGludXggbWlwczsgVTsgSW5ldHR2QnJvd3Nlci8yLjIgKDAwMDE0QTtTb255RFRWMTE1OzAwMDI7MDEwMCkgOyBDQy9KUE47IGVuKSBQcmVzdG8vMi45LjE2NyBWZXJzaW9uLzExLjUwXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IG1pcHM7IFU7IEluZXR0dkJyb3dzZXIvMi4yICgwMDAxNEE7U29ueURUVjExNTswMDAyOzAxMDApIEFaMkNWVDI7IENDL0NBTjsgZW4pIFByZXN0by8yLjcuNjEgVmVyc2lvbi8xMS4wMFxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjgwIChMaW51eCBhcm12Nmw7IE9wZXJhIFRWIFN0b3JlLzQyMDc7IFU7IChTb255QkRQL0JEVjExKTsgZW4pIFByZXN0by8yLjkuMTY3IFZlcnNpb24vMTEuNTBcbiAgICAgICAgICAgICAqICAgICAgT3BlcmEvOS44MCAoTGludXggYXJtdjZsIDsgVTsgKFNvbnlCRFAvQkRWMTEpOyBlbikgUHJlc3RvLzIuNi4zMyBWZXJzaW9uLzEwLjYwXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY2bDsgVTsgKFNvbnlCRFAvQkRWMTEpOyBlbikgUHJlc3RvLzIuOC4xMTUgVmVyc2lvbi8xMS4xMFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU29ueURUVnxTb255QkRQfFNvbnlDRUJyb3dzZXInKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTb255JztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdJbnRlcm5ldCBUVic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgUGhpbGlwcyBOZXQgVFZcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuNzAgKExpbnV4IGFybXY2bCA7IFU7IENFLUhUTUwvMS4wIE5FVFRWLzIuMC4yOyBlbikgUHJlc3RvLzIuMi4xXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhLzkuODAgKExpbnV4IGFybXY2bCA7IFU7IENFLUhUTUwvMS4wIE5FVFRWLzMuMC4xOzsgZW4pIFByZXN0by8yLjYuMzMgVmVyc2lvbi8xMC42MFxuICAgICAgICAgICAgICogICAgICBPcGVyYS85LjgwIChMaW51eCBtaXBzOyBVOyBDRS1IVE1MLzEuMCBORVRUVi8zLjAuMTsgUEhJTElQUy1BVk0tMjAxMjsgZW4pIFByZXN0by8yLjkuMTY3IFZlcnNpb24vMTEuNTBcbiAgICAgICAgICAgICAqICAgICAgT3BlcmEvOS44MCAoTGludXggbWlwcyA7IFU7IEhiYlRWLzEuMS4xICg7IFBoaWxpcHM7IDsgOyA7ICkgQ0UtSFRNTC8xLjAgTkVUVFYvMy4xLjA7IGVuKSBQcmVzdG8vMi42LjMzIFZlcnNpb24vMTAuNzBcbiAgICAgICAgICAgICAqICAgICAgT3BlcmEvOS44MCAoTGludXggaTY4NjsgVTsgSGJiVFYvMS4xLjEgKDsgUGhpbGlwczsgOyA7IDsgKSBDRS1IVE1MLzEuMCBORVRUVi8zLjEuMDsgZW4pIFByZXN0by8yLjkuMTY3IFZlcnNpb24vMTEuNTBcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05FVFRWXFwvJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnUGhpbGlwcyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnTmV0IFRWJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBMRyBOZXRDYXN0IFRWXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogICAgICBNb3ppbGxhLzUuMCAoRGlyZWN0RkI7IExpbnV4IGFybXY3bCkgQXBwbGVXZWJLaXQvNTM0LjI2KyAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNS4wIFNhZmFyaS81MzQuMjYrIExHIEJyb3dzZXIvNS4wMC4wMCgrbW91c2UrM0QrU0NSRUVOK1RVTkVSOyBMR0U7IEdMT0JBTC1QTEFUNDsgMDMuMDkuMjI7IDB4MDAwMDAwMDE7KTsgTEcgTmV0Q2FzdC5UVi0yMDEyXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChEaXJlY3RGQjsgTGludXggYXJtdjdsKSBBcHBsZVdlYktpdC81MzQuMjYrIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi81LjAgU2FmYXJpLzUzNC4yNisgTEcgQnJvd3Nlci81LjAwLjAwKCtTQ1JFRU4rVFVORVI7IExHRTsgR0xPQkFMLVBMQVQ0OyAwMS4wMC4wMDsgMHgwMDAwMDAwMTspOyBMRyBOZXRDYXN0LlRWLTIwMTJcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKERpcmVjdEZCOyBVOyBMaW51eCBhcm12Nmw7IGVuKSBBcHBsZVdlYktpdC81MzEuMiAgKEtIVE1MLCBsaWtlIEdlY2tvKSBTYWZhcmkvNTMxLjIgIExHIEJyb3dzZXIvNC4xLjQoIEJEUDsgTEdFOyBNZWRpYS9CRDY2MDsgNjk3MDsgYWJjOyk7IExHIE5ldENhc3QuTWVkaWEtMjAxMVxuICAgICAgICAgICAgICogICAgICBNb3ppbGxhLzUuMCAoRGlyZWN0RkI7IFU7IExpbnV4IDc2MzE7IGVuKSBBcHBsZVdlYktpdC81MzEuMiAgKEtIVE1MLCBsaWtlIEdlY2tvKSBTYWZhcmkvNTMxLjIgIExHIEJyb3dzZXIvNC4xLjQoIE5PX05VTTsgTEdFOyBNZWRpYS9TUDUyMDsgU1QuMy45Ny40MDkuRjsgMHgwMDAwMDAwMTspOyBMRyBOZXRDYXN0Lk1lZGlhLTIwMTFcbiAgICAgICAgICAgICAqICAgICAgTW96aWxsYS81LjAgKERpcmVjdEZCOyBVOyBMaW51eCA3NjMwOyBlbikgQXBwbGVXZWJLaXQvNTMxLjIgIChLSFRNTCwgbGlrZSBHZWNrbykgU2FmYXJpLzUzMS4yICBMRyBCcm93c2VyLzQuMS40KCAzRCBCRFAgTk9fTlVNOyBMR0U7IE1lZGlhL1NUNjAwOyBMRyBOZXRDYXN0Lk1lZGlhLTIwMTFcbiAgICAgICAgICAgICAqICAgICAgKExHU21hcnRUVi8xLjApIEFwcGxlV2ViS2l0LzUzNC4yMyBPQklHTy1UMTAvMi4wXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL0xHIE5ldENhc3RcXC4oPzpUVnxNZWRpYSktKFswLTldKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19MRztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdOZXRDYXN0IFRWICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvTEdTbWFydFRWLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfTEc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnU21hcnQgVFYnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRvc2hpYmEgU21hcnQgVFZcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiAgICAgIE1vemlsbGEvNS4wIChMaW51eCBtaXBzZWw7IFU7IEhiYlRWLzEuMS4xICg7IFRPU0hJQkE7IERUVl9STDk1MzsgNTYuNy42Ni43OyB0MTI7ICkgOyBUb3NoaWJhVFAvMS4zLjAgKCtWSURFT19NUDQrVklERU9fWF9NU19BU0YrQVVESU9fTVBFRytBVURJT19NUDQrRFJNK05BVElWRUxBVU5DSCkgOyBlbikgQXBwbGVXZWJLaXQvNTM0LjEgKEtIVE1MLCBsaWtlIEdlY2tvKVxuICAgICAgICAgICAgICogICAgICBNb3ppbGxhLzUuMCAoRFRWOyBUU0JOZXRUVi9UMzIwMTM3MTMuMDIwMy43REQ7IFRWd2l0aFZpZGVvUGxheWVyOyBsaWtlIEdlY2tvKSBOZXRGcm9udC80LjEgRFRWTmV0QnJvd3Nlci8yLjIgKDAwMDAzOTtUMzIwMTM3MTM7MDIwMzs3REQpIEluZXR0dkJyb3dzZXIvMi4yICgwMDAwMzk7VDMyMDEzNzEzOzAyMDM7N0REKVxuICAgICAgICAgICAgICogICAgICBNb3ppbGxhLzUuMCAoTGludXggbWlwc2VsOyBVOyBIYmJUVi8xLjEuMSAoOyBUT1NISUJBOyA0MFBYMjAwOyAwLjcuMy4wLjsgdDEyOyApIDsgVG9zaGliYV9UUC8xLjMuMCAoK1ZJREVPX01QNCtBVURJT19NUEVHK0FVRElPX01QNCtWSURFT19YX01TX0FTRitPRkZMSU5FQVBQKSA7IGVuKSBBcHBsZVdlYktpdC81MzQuMSAoS0hUTUwsIGxpa2UgR2VjXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdUb3NoaWJhXz9UUFxcLycpIHx8IHVhLm1hdGNoKCdUU0JOZXRUVlxcLycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1Rvc2hpYmEnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1NtYXJ0IFRWJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNYWNoQmx1ZSBYVFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9tYnh0V2ViS2l0XFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ01hY2hCbHVlIFhUJ1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBBREJcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoQURCOyAoW15cXCldKylcXCkvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ0FEQic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAobWF0Y2hbMV0gIT09ICdVbmtub3duJyA/IG1hdGNoWzFdLnJlcGxhY2UoJ0FEQicsICcnKSArICcgJyA6ICcnKSArICdJUFRWIHJlY2VpdmVyJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNU3RhclxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgvTXN0YXI7T1dCLykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTVN0YXInO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ1BWUic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09yaWd5biBXZWIgQnJvd3Nlcic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRlY2huaVNhdFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9cXFRlY2huaVNhdCAoW147XSspOy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnVGVjaG5pU2F0JztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRlY2huaWNvbG9yXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL1xcVGVjaG5pY29sb3JfKFteO10rKTsvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1RlY2huaWNvbG9yJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFdpbmJveCBFdm8yXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL1dpbmJveCBFdm8yLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdXaW5ib3gnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0V2bzInO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFJva3VcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvXlJva3VcXC9EVlAtKFswLTldKykvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1Jva3UnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwMDAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnSEQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwNTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnWEQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzIxMDAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnWERTJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcyNDAwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJ0xUJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICczMDAwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gJzIgSEQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzMwNTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnMiBYRCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnMzEwMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICcyIFhTJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvSGJiVFZcXC8xLjEuMSBcXChbXjtdKjtcXHMqKFteO10qKVxccyo7XFxzKihbXjtdKilcXHMqOy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmVuZG9yTmFtZSA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB2YXIgbW9kZWxOYW1lID0gbWF0Y2hbMl0udHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgJiYgdmVuZG9yTmFtZSAhPT0gJycgJiYgdmVuZG9yTmFtZSAhPT0gJ3ZlbmRvck5hbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodmVuZG9yTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTEdFJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTEcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVE9TSElCQSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ1Rvc2hpYmEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc21hcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9ICdTbWFydCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0djJuJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnVFYyTic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IHZlbmRvck5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGV2aWNlLm1vZGVsICYmIG1vZGVsTmFtZSAhPT0gJycgJiYgbW9kZWxOYW1lICE9PSAnbW9kZWxOYW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlbE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdHTE9CQUxfUExBVDMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdOZXRDYXN0IFRWJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU21hcnRUVjIwMTInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdTbWFydCBUViAyMDEyJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndmlkZW93ZWInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9ICdWaWRlb3dlYic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbW9kZWxOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVuZG9yTmFtZSA9PT0gJ0h1bWF4Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gdGhpcy5kZXZpY2UubW9kZWwudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIERldGVjdCB0eXBlIGJhc2VkIG9uIGNvbW1vbiBpZGVudGlmaWVyc1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnSW5ldHR2QnJvd3NlcicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdNSURQJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRyeSB0byBkZXRlY3QgYW55IGRldmljZXMgYmFzZWQgb24gY29tbW9uXG4gICAgICAgICAgICAgKiAgICAgIGxvY2F0aW9ucyBvZiBtb2RlbCBpZHNcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGV2aWNlLm1vZGVsICYmICF0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF1YS5tYXRjaCgvXihNb3ppbGxhfE9wZXJhKS8pKSBpZiAobWF0Y2ggPSAvXig/Ok1RUUJyb3dzZXJcXC9bMC05XFwuXStcXC8pPyhbXlxcc10rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKC9fVEQkLywgJycpO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoL19DTUNDJC8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKC9bXyBdTW96aWxsYSQvLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSgvIExpbnV4JC8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKC8gT3BlcmEkLywgJycpO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoL1xcL1swLTldLiokLywgJycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1swLTldK3hbMC05XSs7IChbXjtdKykvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1swLTldK1hbMC05XSsgKFteO1xcL1xcKFxcKV0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvV2luZG93cyBOVCA1LjE7IChbXjtdKyk7IFdpbmRvd3MgUGhvbmUvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1xcKSBQUEM7ICg/OlswLTldK3hbMC05XSs7ICk/KFteO1xcL1xcKFxcKV0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoKFteO10rKTsgVTsgV2luZG93cyBNb2JpbGUvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ZvZGFmb25lXFwvMS4wXFwvKFteXFwvXSspLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2gobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9cXCAoW15cXHNdKykkLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2gobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kZXZpY2UubW9kZWwgJiYgIXRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gY2xlYW51cE1vZGVsKGNhbmRpZGF0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnQW5kcm9pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEFORFJPSURfTU9ERUxTW21vZGVsXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBBTkRST0lEX01PREVMU1ttb2RlbF1bMl0gIT09ICd1bmRlZmluZWQnKSB0aGlzLmRldmljZS50eXBlID0gQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9zLm5hbWUgfHwgdGhpcy5vcy5uYW1lID09PSAnV2luZG93cycgfHwgdGhpcy5vcy5uYW1lID09PSAnV2luZG93cyBNb2JpbGUnIHx8IHRoaXMub3MubmFtZSA9PT0gJ1dpbmRvd3MgQ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBXSU5ET1dTX01PQklMRV9NT0RFTFNbbW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBXSU5ET1dTX01PQklMRV9NT0RFTFNbbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IFdJTkRPV1NfTU9CSUxFX01PREVMU1ttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSAhPT0gJ1dpbmRvd3MgTW9iaWxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1dpbmRvd3MgTW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXkdJT05FRS0oW15cXHNdKykvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnR2lvbmVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IGNsZWFudXBNb2RlbChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXkhUQ18/KFteXFwvX10rKSg/OlxcL3xffCQpLy5leGVjKGNhbmRpZGF0ZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19IVEM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15IVUFXRUktKFteXFwvXSopLy5leGVjKGNhbmRpZGF0ZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19IVUFXRUk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLyg/Ol58XFwoKUxHRT8oPzpcXC98LXxffFxccykoW15cXHNdKikvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBTVFJJTkdTX0xHO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gY2xlYW51cE1vZGVsKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9eTU9ULShbXlxcL19dKykoPzpcXC98X3wkKS8uZXhlYyhjYW5kaWRhdGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfTU9UT1JPTEE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15Nb3Rvcm9sYV8oW15cXC9fXSspKD86XFwvfF98JCkvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBTVFJJTkdTX01PVE9ST0xBO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gY2xlYW51cE1vZGVsKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9eTm9raWEoW15cXC9dKykoPzpcXC98JCkvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnTm9raWEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gY2xlYW51cE1vZGVsKG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaWRlbnRpZmllZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3MubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnU2VyaWVzNDAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15Tb255RXJpY3Nzb24oW15cXC9fXSspKD86XFwvfF98JCkvLmV4ZWMoY2FuZGlkYXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBTVFJJTkdTX1NPTllfRVJJQ1NTT047XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBjbGVhbnVwTW9kZWwobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15TQU1TVU5HLShbXlxcL19dKykoPzpcXC98X3wkKS8uZXhlYyhjYW5kaWRhdGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IFNUUklOR1NfU0FNU1VORztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IGNsZWFudXBNb2RlbChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ0JhZGEnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYW51ZmFjdHVyZXIgPSAnU0FNU1VORyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBCQURBX01PREVMU1ttYW51ZmFjdHVyZXJdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQkFEQV9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBCQURBX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gQkFEQV9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2ggPSAvSmFzbWluZVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hbnVmYWN0dXJlciA9ICdTQU1TVU5HJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gY2xlYW51cE1vZGVsKHRoaXMuZGV2aWNlLm1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFRPVUNIV0laX01PREVMU1ttYW51ZmFjdHVyZXJdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgVE9VQ0hXSVpfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gVE9VQ0hXSVpfTU9ERUxTW21hbnVmYWN0dXJlcl1bbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBUT1VDSFdJWl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ1RvdWNod2l6JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzIuMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaCA9IC9Eb2xmaW5cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYW51ZmFjdHVyZXIgPSAnU0FNU1VORyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBCQURBX01PREVMU1ttYW51ZmFjdHVyZXJdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQkFEQV9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBCQURBX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gQkFEQV9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0JhZGEnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcyLjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzEuMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIuMic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMS4yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMy4wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcyLjAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVE9VQ0hXSVpfTU9ERUxTW21hbnVmYWN0dXJlcl0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBUT1VDSFdJWl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBUT1VDSFdJWl9NT0RFTFNbbWFudWZhY3R1cmVyXVttb2RlbF1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IFRPVUNIV0laX01PREVMU1ttYW51ZmFjdHVyZXJdW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnVG91Y2h3aXonO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxLjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzEuMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEuNSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMi4wJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMi4wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICczLjAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvXFwoKD86TEdbLXxcXC9dKSguKikgKD86QnJvd3NlclxcLyk/QXBwbGVXZWJraXQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gU1RSSU5HU19MRztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL15Nb3ppbGxhXFwvNS4wIFxcKCg/Ok5va2lhfE5PS0lBKSg/Olxccz8pKFteXFwpXSspXFwpVUMgQXBwbGVXZWJraXRcXChsaWtlIEdlY2tvXFwpIFNhZmFyaVxcLzUzMCQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gJ05va2lhJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdTZXJpZXM2MCc7XG4gICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBTYWZhcmlcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1NhZmFyaScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ2lPUycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ1NhZmFyaSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ01hYyBPUyBYJyB8fCB0aGlzLm9zLm5hbWUgPT09ICdXaW5kb3dzJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdTYWZhcmknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSB0aGlzLm9zLm5hbWUgPT09ICdNYWMgT1MgWCc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ZlcnNpb25cXC8oWzAtOVxcLl0rKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goL0FwcGxlV2ViS2l0XFwvWzAtOVxcLl0rXFwrLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ1dlYktpdCBOaWdodGx5IEJ1aWxkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgSW50ZXJuZXQgRXhwbG9yZXJcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ01TSUUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ0ludGVybmV0IEV4cGxvcmVyJztcblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnSUVNb2JpbGUnKSB8fCB1YS5tYXRjaCgnV2luZG93cyBDRScpIHx8IHVhLm1hdGNoKCdXaW5kb3dzIFBob25lJykgfHwgdWEubWF0Y2goJ1dQNycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ01vYmlsZSBJbnRlcm5ldCBFeHBsb3Jlcic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL01TSUUgKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE9wZXJhXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKC9PcGVyYS9pKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09wZXJhJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9PcGVyYVtcXC98IF0oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9WZXJzaW9uXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtYXRjaFsxXSkgPj0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLnZlcnNpb24gJiYgdWEubWF0Y2goJ0VkaXRpb24gTGFicycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uLnR5cGUgPSAnYWxwaGEnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdMYWJzJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLnZlcnNpb24gJiYgdWEubWF0Y2goJ0VkaXRpb24gTmV4dCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uLnR5cGUgPSAnYWxwaGEnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdOZXh0JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ09wZXJhIFRhYmxldCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09wZXJhIE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGFibGV0JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ09wZXJhIE1vYmknKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSBNb2JpbGUnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09wZXJhIE1pbmk7Ly5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSBNaW5pJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubW9kZSA9ICdwcm94eSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvT3BlcmEgTWluaVxcLyg/OmF0dFxcLyk/KFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSBNaW5pJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAtMVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAncHJveHknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnT3BlcmEnICYmIHRoaXMuZGV2aWNlLnR5cGUgPT09ICdtb2JpbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09wZXJhIE1vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKC9CRVIvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnT3BlcmEgTWluaSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0luZXR0dkJyb3dzZXInKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnT3BlcmEgVFYnKSB8fCB1YS5tYXRjaCgnT3BlcmEtVFYnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAndGVsZXZpc2lvbic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdMaW51eCB6Ym92JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnT3BlcmEgTW9iaWxlJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdMaW51eCB6dmF2JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnT3BlcmEgTWluaSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBGaXJlZm94XG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdGaXJlZm94JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlZm94JztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9GaXJlZm94XFwvKFswLTlhYi5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJyb3dzZXIudmVyc2lvbi50eXBlID09PSAnYWxwaGEnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5jaGFubmVsID0gJ0F1cm9yYSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci52ZXJzaW9uLnR5cGUgPT09ICdiZXRhJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdCZXRhJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0Zlbm5lYycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ01vYmlsZTsgcnYnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdUYWJsZXQ7IHJ2JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldmljZS50eXBlID09PSAnbW9iaWxlJyB8fCB0aGlzLmRldmljZS50eXBlID09PSAndGFibGV0Jykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlZm94IE1vYmlsZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05hbW9yb2thJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlZm94JztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9OYW1vcm9rYVxcLyhbMC05YWIuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdOYW1vcm9rYSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU2hpcmV0b2tvJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlZm94JztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9TaGlyZXRva29cXC8oWzAtOWFiLl0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnU2hpcmV0b2tvJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdNaW5lZmllbGQnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ0ZpcmVmb3gnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL01pbmVmaWVsZFxcLyhbMC05YWIuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICdNaW5lZmllbGQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ0ZpcmViaXJkJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdGaXJlYmlyZCc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvRmlyZWJpcmRcXC8oWzAtOWFiLl0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBTZWFNb25rZXlcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ1NlYU1vbmtleScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnU2VhTW9ua2V5JztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9TZWFNb25rZXlcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTmV0c2NhcGVcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05ldHNjYXBlJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdOZXRzY2FwZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTmV0c2NhcGVbMC05XT9cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgS29ucXVlcm9yXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdba3xLXW9ucXVlcm9yLycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnS29ucXVlcm9yJztcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9ba3xLXW9ucXVlcm9yXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIENocm9tZVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC8oPzpDaHJvbWV8Q3JNb3xDcmlPUylcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnQ2hyb21lJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnQW5kcm9pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtYXRjaFsxXS5zcGxpdCgnLicsIDMpLmpvaW4oJy4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMTYuMC45MTInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5jaGFubmVsID0gJ0JldGEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMTguMC4xMDI1JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbi5kZXRhaWxzID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnTmlnaHRseSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoWzFdLnNwbGl0KCcuJywgMykuam9pbignLicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwLjIuMTQ5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAuMy4xNTQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMC40LjE1NCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxLjAuMTU0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIuMC4xNzInOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMy4wLjE5NSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc0LjAuMjQ5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzQuMS4yNDknOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNS4wLjM3NSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2LjAuNDcyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzcuMC41MTcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOC4wLjU1Mic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc5LjAuNTk3JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEwLjAuNjQ4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzExLjAuNjk2JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEyLjAuNzQyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEzLjAuNzgyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE0LjAuODM1JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE1LjAuODc0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE2LjAuOTEyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE3LjAuOTYzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzE4LjAuMTAyNSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxOS4wLjEwODQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMjAuMC4xMTMyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIxLjAuMTE4MCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci52ZXJzaW9uLm1pbm9yID09PSAwKSB0aGlzLmJyb3dzZXIudmVyc2lvbi5kZXRhaWxzID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMuYnJvd3Nlci52ZXJzaW9uLmRldGFpbHMgPSAyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5jaGFubmVsID0gJ05pZ2h0bHknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBDaHJvbWUgRnJhbWVcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ2Nocm9tZWZyYW1lJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuc3RvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdDaHJvbWUgRnJhbWUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL2Nocm9tZWZyYW1lXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIENocm9taXVtXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdDaHJvbWl1bScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdDaHJvbWl1bSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvQ2hyb21pdW1cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgQnJvd3Nlck5HXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdCcm93c2VyTkcnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ05va2lhIEJyb3dzZXInO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0Jyb3dzZXJOR1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRzOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE5va2lhIEJyb3dzZXJcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05va2lhQnJvd3NlcicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnTm9raWEgQnJvd3Nlcic7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTm9raWFCcm93c2VyXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBNaWNyb0JcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ01hZW1vWyB8X11Ccm93c2VyJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdNaWNyb0InO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL01hZW1vWyB8X11Ccm93c2VyWyB8X10oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogM1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTmV0RnJvbnRcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goJ05ldEZyb250JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdOZXRGcm9udCc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL05ldEZyb250XFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodWEubWF0Y2goJ0luZXR0dkJyb3dzZXInKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgU2lsa1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnU2lsaycpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdTaWxrLUFjY2VsZXJhdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnU2lsayc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL1NpbGtcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSAnQW1hem9uJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSAnS2luZGxlIEZpcmUnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RhYmxldCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLm5hbWUgIT09ICdBbmRyb2lkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgRG9sZmluXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdEb2xmaW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ0RvbGZpbic7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvRG9sZmluXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgSXJpc1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnSXJpcycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnSXJpcyc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnV2luZG93cyBNb2JpbGUnO1xuICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvSXJpc1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLyBXTShbMC05XSkgLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0gKyAnLjAnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5tb2RlID0gJ2Rlc2t0b3AnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgSmFzbWluZVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnSmFzbWluZScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnSmFzbWluZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvSmFzbWluZVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBCb3hlZVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnQm94ZWUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ0JveGVlJztcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL0JveGVlXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIEVzcGlhbFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnRXNwaWFsJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdFc3BpYWwnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldmljZS50eXBlICE9PSAndGVsZXZpc2lvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Fc3BpYWxcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgQU5UIEdhbGlvXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9BTlRHYWxpb1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdBTlQgR2FsaW8nO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ3RlbGV2aXNpb24nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBOZXRGcm9udCBOWFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvTlhcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnTmV0RnJvbnQgTlgnO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvRFRWL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICd0ZWxldmlzaW9uJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL21vYmlsZS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLnR5cGUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ2Rlc2t0b3AnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgT2JpZ29cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goL09iaWdvL2kpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnT2JpZ28nO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09iaWdvXFwvKFswLTkuXSopL2kuZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09iaWdvXFwvKFtBLVpdKShbMC05Ll0qKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ09iaWdvICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMl1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL09iaWdvLShbQS1aXSkoWzAtOS5dKilcXC8vaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPYmlnbyAnICsgbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzJdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgVUMgV2ViXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKHVhLm1hdGNoKCdVQ1dFQicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnVUMgQnJvd3Nlcic7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvVUNXRUIoWzAtOV0qWy5dWzAtOV0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLm5hbWUgPT09ICdMaW51eCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gL15JVUMgXFwoVTtcXHM/aU9TIChbMC05XFwuXSspOy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ2lPUyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvXkpVQyBcXChMaW51eDsgVTsgKFswLTlcXC5dKylbXjtdKjsgW147XSs7IChbXjtdKlteXFxzXSlcXHMqOyBbMC05XStcXCpbMC05XStcXCkvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbChtYXRjaFsyXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBBTkRST0lEX01PREVMU1ttb2RlbF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tYW51ZmFjdHVyZXIgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzJdICE9PSAndW5kZWZpbmVkJykgdGhpcy5kZXZpY2UudHlwZSA9IEFORFJPSURfTU9ERUxTW21vZGVsXVsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodWEubWF0Y2goL1xcKSBVQyAvKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ1VDIEJyb3dzZXInO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvVUNCcm93c2VyXFwvKFswLTkuXSopLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJ1VDIEJyb3dzZXInO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgTmluZVNreVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9OaW5lc2t5KD86LWFuZHJvaWQtbW9iaWxlKD86LWNuKT8pP1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdOaW5lU2t5JztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lICE9PSAnQW5kcm9pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1hbnVmYWN0dXJlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlLm1vZGVsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFNreWZpcmVcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvU2t5ZmlyZVxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdTa3lmaXJlJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9zLm5hbWUgPSAnQW5kcm9pZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5vcy52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgRG9scGhpbiBIRFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9Eb2xwaGluSERDTlxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdEb2xwaGluJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lICE9PSAnQW5kcm9pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL0RvbHBoaW5cXC9JTlQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnRG9scGhpbic7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBRUSBCcm93c2VyXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gLyhNP1FRQnJvd3NlcilcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnUVEgQnJvd3Nlcic7XG5cbiAgICAgICAgICAgICAgICB2YXIgdmVyc2lvbiA9IG1hdGNoWzJdO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uLm1hdGNoKC9eWzAtOV1bMC05XSQvKSkgdmVyc2lvbiA9IHZlcnNpb25bMF0gKyAnLicgKyB2ZXJzaW9uWzFdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnJ1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9zLm5hbWUgJiYgbWF0Y2hbMV0gPT09ICdRUUJyb3dzZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdXaW5kb3dzJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIGlCcm93c2VyXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gLyhpQnJvd3NlcilcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnaUJyb3dzZXInO1xuXG4gICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBtYXRjaFsyXTtcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbi5tYXRjaCgvWzAtOV1bMC05XS8pKSB2ZXJzaW9uID0gdmVyc2lvblswXSArICcuJyArIHZlcnNpb25bMV07XG5cbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuY2hhbm5lbCA9ICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFB1ZmZpblxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9QdWZmaW5cXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnUHVmZmluJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS50eXBlID0gJ21vYmlsZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnTGludXgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICAzNjAgRXh0cmVtZSBFeHBsb3JlclxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh1YS5tYXRjaCgnMzYwRUUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5zdG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJzM2MCBFeHRyZW1lIEV4cGxvcmVyJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIE1pZG9yaVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9NaWRvcmlcXC8oWzAtOS5dKikvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm5hbWUgPSAnTWlkb3JpJztcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lICE9PSAnTGludXgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MubmFtZSA9ICdMaW51eCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5tb2RlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdkZXNrdG9wJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgT3RoZXJzXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgdmFyIGJyb3dzZXJzID0gW3tcbiAgICAgICAgICAgICAgICBuYW1lOiAnQWRvYmVBSVInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0Fkb2JlQUlSXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBd2Vzb21pdW0nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0F3ZXNvbWl1bVxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ2FudmFjZScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvQ2FudmFjZSBTdGFuZGFsb25lXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdFa2lvaCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvRWtpb2hcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0phdmFGWCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvSmF2YUZYXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdHRlhlJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9HRlhlXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdMdWFLaXQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL2x1YWtpdC9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnVGl0YW5pdW0nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1RpdGFuaXVtXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdPcGVuV2ViS2l0U2hhcnAnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL09wZW5XZWJLaXRTaGFycC9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUHJpc20nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1ByaXNtXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdRdCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUXRcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0RW1iZWRkZWQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1F0RW1iZWRkZWQvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0RW1iZWRkZWQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1F0RW1iZWRkZWQuKlF0XFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSaG9TaW11bGF0b3InLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1Job1NpbXVsYXRvci9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnVVdlYktpdCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVVdlYktpdFxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUGhhbnRvbUpTJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9QaGFudG9tSlNcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0dvb2dsZSBXZWIgUHJldmlldycsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvR29vZ2xlIFdlYiBQcmV2aWV3L1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdHb29nbGUgRWFydGgnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0dvb2dsZSBFYXJ0aFxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRUEgT3JpZ2luJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9PcmlnaW5cXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NlY29uZExpZmUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1NlY29uZExpZmVcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1ZhbHZlIFN0ZWFtJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9WYWx2ZSBTdGVhbS9cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU29uZ2JpcmQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1NvbmdiaXJkXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdUaHVuZGVyYmlyZCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVGh1bmRlcmJpcmRcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Ficm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9BYnJvd3NlclxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnYXJvcmEnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1tBYV1yb3JhXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdCYWlkdSBCcm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9NP0JhaWR1QnJvd3NlclxcLyhbMC05Ll0qKS9pXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NhbWlubycsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvQ2FtaW5vXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDYW51cmUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0NhbnVyZVxcLyhbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogM1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb21ldEJpcmQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0NvbWV0QmlyZFxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29tb2RvIERyYWdvbicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvQ29tb2RvX0RyYWdvblxcLyhbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25rZXJvcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvW0NjXW9ua2Vyb3JcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Nvb2xOb3ZvJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC8oPzpDb29sTm92b3xDb29sTm92b0Nocm9tZVBsdXMpXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Nocm9tZVBsdXMnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0Nocm9tZVBsdXMoPzpcXC8oWzAtOS5dKikpPyQvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRGFlZGFsdXMnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0RhZWRhbHVzIChbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdEZW1vYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvZGVtb2Jyb3dzZXJcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Rvb2JsZScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvRG9vYmxlKD86XFwvKFswLTkuXSopKT8vXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0RXQicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvZHdiKD86LWhnKT8oPzpcXC8oWzAtOS5dKikpPy9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRXBpcGhhbnknLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0VwaXBoYW55XFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdGaXJlV2ViJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9GaXJlV2ViXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdGbG9jaycsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvRmxvY2tcXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnR2FsZW9uJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9HYWxlb25cXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSGVsaXVtJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9IZWxpdW1Nb2JpbGVCcm93c2VyXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdpQ2FiJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9pQ2FiXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdJY2VhcGUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0ljZWFwZVxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSWNlQ2F0JyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9JY2VDYXQgKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdJY2V3ZWFzZWwnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0ljZXdlYXNlbFxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW50ZXJuZXRTdXJmYm9hcmQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0ludGVybmV0U3VyZmJvYXJkXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdJcm9uJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9Jcm9uXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0lzaXMnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0Jyb3dzZXJTZXJ2ZXIvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0p1bWFuamknLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL2p1bWFuamkvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0themVoYWthc2UnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0themVoYWthc2VcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0tDaHJvbWUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0tDaHJvbWVcXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSy1NZWxlb24nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL0stTWVsZW9uXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdMZWVjaGNyYWZ0JyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9MZWVjaGNyYWZ0KD86XFwvKFswLTkuXSopKT8vLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnTGlnaHRuaW5nJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9MaWdodG5pbmdcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0x1bmFzY2FwZScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvTHVuYXNjYXBlW1xcL3wgXShbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogM1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdpTHVuYXNjYXBlJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9pTHVuYXNjYXBlXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ01heHRob24nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL01heHRob25bXFwvIF0oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnTWluaUJyb3dzZXInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL01pbmlCcj9vd3Nlck1cXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ01pbmlCcm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9NaW5pQnJvd3Nlck1vYmlsZVxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnTWl4U2hhcmsnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL01peFNoYXJrXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdNb3Rvcm9sYSBXZWJLaXQnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL01vdG9yb2xhV2ViS2l0XFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ05ldEZyb250IExpZmVCcm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9OZXRGcm9udExpZmVCcm93c2VyXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdOZXRzY2FwZSBOYXZpZ2F0b3InLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL05hdmlnYXRvclxcLyhbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogM1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdPZHlzc2V5JyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9PV0JcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ09tbmlXZWInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL09tbmlXZWIvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ09yY2EnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL09yY2FcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ09yaWd5bicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvT3JpZ3luIFdlYiBCcm93c2VyL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdQYWxlbW9vbicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUGFsZVttTV1vb25cXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1BoYW50b20nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1BoYW50b21cXC9WKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdQb2xhcmlzJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9Qb2xhcmlzXFwvdj8oWzAtOS5dKikvaSxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0Q3JlYXRvcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUXRDcmVhdG9yXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdRdFFtbFZpZXdlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUXRRbWxWaWV3ZXIvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0VGVzdEJyb3dzZXInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1F0VGVzdEJyb3dzZXJcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1F0V2ViJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9RdFdlYiBJbnRlcm5ldCBCcm93c2VyXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdRdXBaaWxsYScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUXVwWmlsbGFcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JvY2NhdCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUm9jY2F0XFwvKFswLTldXFwuWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JhdmVuIGZvciBNYWMnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1JhdmVuIGZvciBNYWNcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3Jla29ucScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvcmVrb25xL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSb2NrTWVsdCcsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvUm9ja01lbHRcXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU2xlaXBuaXInLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1NsZWlwbmlyXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NNQnJvd3NlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvU01Ccm93c2VyL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdTb2dvdSBFeHBsb3JlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvU0UgMi5YIE1ldGFTci9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU25vd3Nob2UnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1Nub3dzaG9lXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NwdXRuaWsnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1NwdXRuaWtcXC8oWzAtOS5dKikvaSxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1N0YWlubGVzcycsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvU3RhaW5sZXNzXFwvKFswLTkuXSopL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdTdW5DaHJvbWUnLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1N1bkNocm9tZVxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU3VyZicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvU3VyZlxcLyhbMC05Ll0qKS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnVGFvQnJvd3NlcicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVGFvQnJvd3NlclxcLyhbMC05Ll0qKS8sXG4gICAgICAgICAgICAgICAgZGV0YWlsczogMlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdUYW9tZWVCcm93c2VyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9UYW9tZWVCcm93c2VyXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1RheldlYicsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVGF6V2ViL1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdWaWVyYScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVmllcmFcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1ZpbGxhbm92YScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvVmlsbGFub3ZhXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAzXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1dhdmVsaW5rIFZlbG9jaXR5JyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9XYXZlbGluayBWZWxvY2l0eSBCcm93c2VyXFwvKFswLTkuXSopLyxcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiAyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1dlYlBvc2l0aXZlJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9XZWJQb3NpdGl2ZS9cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnV2ViUmVuZGVyJyxcbiAgICAgICAgICAgICAgICByZWdleHA6IC9XZWJSZW5kZXIvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1d5em8nLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1d5em9cXC8oWzAtOS5dKikvLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IDNcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnWmV0YWtleScsXG4gICAgICAgICAgICAgICAgcmVnZXhwOiAvWmV0YWtleSBXZWJraXRcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1pldGFrZXknLFxuICAgICAgICAgICAgICAgIHJlZ2V4cDogL1pldGFrZXlcXC8oWzAtOS5dKikvXG4gICAgICAgICAgICB9XVxuXG4gICAgICAgICAgICBmb3IgKHZhciBiID0gMDsgYiA8IGJyb3dzZXJzLmxlbmd0aDsgYisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gYnJvd3NlcnNbYl0ucmVnZXhwLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gYnJvd3NlcnNbYl0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLmNoYW5uZWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnN0b2NrID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogYnJvd3NlcnNbYl0uZGV0YWlscyB8fCBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFdlYktpdFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9XZWJLaXRcXC8oWzAtOS5dKikvaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5hbWUgPSAnV2Via2l0JztcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL0Jyb3dzZXJcXC9BcHBsZVdlYktpdChbMC05Ll0qKS9pLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUubmFtZSA9ICdXZWJraXQnO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBLSFRNTFxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChtYXRjaCA9IC9LSFRNTFxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5uYW1lID0gJ0tIVE1MJztcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgR2Vja29cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAoL0dlY2tvLy5leGVjKHVhKSAmJiAhL2xpa2UgR2Vja28vaS5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5hbWUgPSAnR2Vja28nO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID0gLzsgcnY6KFteXFwpXSspXFwpLy5leGVjKHVhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICAgICAqICAgICAgUHJlc3RvXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKG1hdGNoID0gL1ByZXN0b1xcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5uYW1lID0gJ1ByZXN0byc7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hdGNoWzFdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIFRyaWRlbnRcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAobWF0Y2ggPSAvVHJpZGVudFxcLyhbMC05Ll0qKS8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5uYW1lID0gJ1RyaWRlbnQnO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXRjaFsxXVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnSW50ZXJuZXQgRXhwbG9yZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZVZlcnNpb24odGhpcy5lbmdpbmUudmVyc2lvbikgPT09IDYgJiYgcGFyc2VGbG9hdCh0aGlzLmJyb3dzZXIudmVyc2lvbikgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcxMC4wJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubW9kZSA9ICdjb21wYXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlVmVyc2lvbih0aGlzLmVuZ2luZS52ZXJzaW9uKSA9PT0gNSAmJiBwYXJzZUZsb2F0KHRoaXMuYnJvd3Nlci52ZXJzaW9uKSA8IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnOS4wJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubW9kZSA9ICdjb21wYXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlVmVyc2lvbih0aGlzLmVuZ2luZS52ZXJzaW9uKSA9PT0gNCAmJiBwYXJzZUZsb2F0KHRoaXMuYnJvd3Nlci52ZXJzaW9uKSA8IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnOC4wJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubW9kZSA9ICdjb21wYXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ1dpbmRvd3MgUGhvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZVZlcnNpb24odGhpcy5lbmdpbmUudmVyc2lvbikgPT09IDUgJiYgcGFyc2VGbG9hdCh0aGlzLm9zLnZlcnNpb24pIDwgNy41KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICc3LjUnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgICogICAgICBDb3JyZWN0aW9uc1xuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9zLm5hbWUgPT09ICdBbmRyb2lkJyAmJiB0aGlzLmJyb3dzZXIuc3RvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSA9PT0gJ2lPUycgJiYgdGhpcy5icm93c2VyLm5hbWUgPT09ICdPcGVyYSBNaW5pJykge1xuICAgICAgICAgICAgICAgIHRoaXMub3MudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmJyb3dzZXIubmFtZSA9PT0gJ01pZG9yaScgJiYgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ1dlYmtpdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5uYW1lID0gJ1dlYmtpdCc7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRldmljZS50eXBlID09PSAndGVsZXZpc2lvbicgJiYgdGhpcy5icm93c2VyLm5hbWUgPT09ICdPcGVyYScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIubmFtZSA9ICdPcGVyYSBEZXZpY2VzJztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmVuZ2luZS52ZXJzaW9uLmlzKCcyLjEwJyk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMy4yXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZW5naW5lLnZlcnNpb24uaXMoJzIuOScpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDMuMVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmVuZ2luZS52ZXJzaW9uLmlzKCcyLjgnKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAzLjBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5lbmdpbmUudmVyc2lvbi5pcygnMi43Jyk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG5ldyBWZXJzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMi45XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZW5naW5lLnZlcnNpb24uaXMoJzIuNicpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDIuOFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmVuZ2luZS52ZXJzaW9uLmlzKCcyLjQnKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxMC4zXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZW5naW5lLnZlcnNpb24uaXMoJzIuMycpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDEwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZW5naW5lLnZlcnNpb24uaXMoJzIuMicpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLnZlcnNpb24gPSBuZXcgVmVyc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDkuN1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmVuZ2luZS52ZXJzaW9uLmlzKCcyLjEnKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbmV3IFZlcnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiA5LjZcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXIudmVyc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAgICAgKiAgICAgIENhbW91ZmxhZ2VcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRldGVjdENhbW91ZmxhZ2UpIHtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9IC9NYWMgT1MgWCAxMF82XzM7IChbXjtdKyk7IFthLXpdezJ9LSg/OlthLXpdezJ9KT9cXCkvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5hbWUgPSAnV2Via2l0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUudmVyc2lvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQU5EUk9JRF9NT0RFTFNbbW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEFORFJPSURfTU9ERUxTW21vZGVsXVsyXSAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMuZGV2aWNlLnR5cGUgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZm91bmREZXZpY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggPSAvTGludXggVmVudGFuYTsgW2Etel17Mn0tW2Etel17Mn07ICguKykgQnVpbGQvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3Nlci52ZXJzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyLm1vZGUgPSAnZGVza3RvcCc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcy5uYW1lID0gJ0FuZHJvaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9zLnZlcnNpb24gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLm5hbWUgPSAnV2Via2l0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUudmVyc2lvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UudHlwZSA9ICdtb2JpbGUnO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGNsZWFudXBNb2RlbCh0aGlzLmRldmljZS5tb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQU5EUk9JRF9NT0RFTFNbbW9kZWxdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubWFudWZhY3R1cmVyID0gQU5EUk9JRF9NT0RFTFNbbW9kZWxdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UubW9kZWwgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEFORFJPSURfTU9ERUxTW21vZGVsXVsyXSAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMuZGV2aWNlLnR5cGUgPSBBTkRST0lEX01PREVMU1ttb2RlbF1bMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldmljZS5pZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZm91bmREZXZpY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLm5hbWUgPT09ICdTYWZhcmknKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLm5hbWUgIT09ICdpT1MnICYmIC9BcHBsZVdlYktpdFxcLyhbMC05XSsuWzAtOV0rKS9pLmV4ZWModWEpWzFdICE9PSAvU2FmYXJpXFwvKFswLTldKy5bMC05XSspL2kuZXhlYyh1YSlbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnc2FmYXJpTWlzbWF0Y2gnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnaU9TJyAmJiAhdWEubWF0Y2goL15Nb3ppbGxhLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnbm9Nb3ppbGxhUHJlZml4Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEvVmVyc2lvblxcL1swLTlcXC5dKy8uZXhlYyh1YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnbm9WZXJzaW9uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnQ2hyb21lJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIS8oPzpDaHJvbWV8Q3JNb3xDcmlPUylcXC8oWzAtOV17MSwyfVxcLlswLTldXFwuWzAtOV17Myw0fVxcLlswLTldKykvLmV4ZWModWEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ3dyb25nVmVyc2lvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAvKiBJZiBpdCBjbGFpbXMgbm90IHRvIGJlIFRyaWRlbnQsIGJ1dCBpdCBpcyBwcm9iYWJseSBUcmlkZW50IHJ1bm5pbmcgY2Ftb3VmbGFnZSBtb2RlICovXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCd0cmlkZW50Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ1RyaWRlbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHlwZW9mIHRoaXMuYnJvd3Nlci5uYW1lID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmJyb3dzZXIubmFtZSAhPT0gJ01heHRob24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyogSWYgaXQgY2xhaW1zIG5vdCB0byBiZSBPcGVyYSwgYnV0IGl0IGlzIHByb2JhYmx5IE9wZXJhIHJ1bm5pbmcgY2Ftb3VmbGFnZSBtb2RlICovXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cub3BlcmEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgncHJlc3RvJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5lbmdpbmUubmFtZSAhPT0gJ1ByZXN0bycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLm5hbWUgPT09ICdJbnRlcm5ldCBFeHBsb3JlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyogSWYgaXQgY2xhaW1zIG5vdCB0byBiZSBHZWNrbywgYnV0IGl0IGlzIHByb2JhYmx5IEdlY2tvIHJ1bm5pbmcgY2Ftb3VmbGFnZSBtb2RlICovXG4gICAgICAgICAgICAgICAgICAgIGlmICgnZ2V0Qm94T2JqZWN0Rm9yJyBpbiBkb2N1bWVudCB8fCAnbW96SW5uZXJTY3JlZW5YJyBpbiB3aW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZ2Vja28nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVuZ2luZS5uYW1lICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmVuZ2luZS5uYW1lICE9PSAnR2Vja28nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnSW50ZXJuZXQgRXhwbG9yZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8qIElmIGl0IGNsYWltcyBub3QgdG8gYmUgV2Via2l0LCBidXQgaXQgaXMgcHJvYmFibHkgV2Via2l0IHJ1bm5pbmcgY2Ftb3VmbGFnZSBtb2RlICovXG4gICAgICAgICAgICAgICAgICAgIGlmICgnV2ViS2l0Q1NTTWF0cml4JyBpbiB3aW5kb3cgfHwgJ1dlYktpdFBvaW50JyBpbiB3aW5kb3cgfHwgJ3dlYmtpdFN0b3JhZ2VJbmZvJyBpbiB3aW5kb3cgfHwgJ3dlYmtpdFVSTCcgaW4gd2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ3dlYmtpdCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZW5naW5lLm5hbWUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZW5naW5lLm5hbWUgIT09ICdXZWJraXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJvd3Nlci5uYW1lID09PSAnSW50ZXJuZXQgRXhwbG9yZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG5cblxuICAgICAgICAgICAgICAgICAgICAvKiBJZiBpdCBjbGFpbXMgdG8gYmUgU2FmYXJpIGFuZCB1c2VzIFY4LCBpdCBpcyBwcm9iYWJseSBhbiBBbmRyb2lkIGRldmljZSBydW5uaW5nIGNhbW91ZmxhZ2UgbW9kZSAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmdpbmUubmFtZSA9PT0gJ1dlYmtpdCcgJiYgKHt9LnRvU3RyaW5nKS50b1N0cmluZygpLmluZGV4T2YoJ1xcbicpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCd2OCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyICE9PSBudWxsICYmIHRoaXMuYnJvd3Nlci5uYW1lID09PSAnU2FmYXJpJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhbiBpUGFkIHRoYXQgaXMgbm90IDc2OCB4IDEwMjQsIHdlIGhhdmUgYW4gaW1wb3N0ZXIgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV2aWNlLm1vZGVsID09PSAnaVBhZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2NyZWVuLndpZHRoICE9PSAwICYmIHNjcmVlbi5oZWlnaHQgIT09IDApICYmIChzY3JlZW4ud2lkdGggIT09IDc2OCAmJiBzY3JlZW4uaGVpZ2h0ICE9PSAxMDI0KSAmJiAoc2NyZWVuLndpZHRoICE9PSAxMDI0ICYmIHNjcmVlbi5oZWlnaHQgIT09IDc2OCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ3NpemVNaXNtYXRjaCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGFuIGlQaG9uZSBvciBpUG9kIHRoYXQgaXMgbm90IDMyMCB4IDQ4MCwgd2UgaGF2ZSBhbiBpbXBvc3RlciAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXZpY2UubW9kZWwgPT09ICdpUGhvbmUnIHx8IHRoaXMuZGV2aWNlLm1vZGVsID09PSAnaVBvZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2NyZWVuLndpZHRoICE9PSAwICYmIHNjcmVlbi5oZWlnaHQgIT09IDApICYmIChzY3JlZW4ud2lkdGggIT09IDMyMCAmJiBzY3JlZW4uaGVpZ2h0ICE9PSA0ODApICYmIChzY3JlZW4ud2lkdGggIT09IDQ4MCAmJiBzY3JlZW4uaGVpZ2h0ICE9PSAzMjApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCdzaXplTWlzbWF0Y2gnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy5uYW1lID09PSAnaU9TJyAmJiB0aGlzLm9zLnZlcnNpb24pIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MudmVyc2lvbi5pc09sZGVyKCc0LjAnKSAmJiAnc2FuZGJveCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ2ZvdW5kU2FuZGJveCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9zLnZlcnNpb24uaXNPbGRlcignNC4yJykgJiYgJ1dlYlNvY2tldCcgaW4gd2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCdmb3VuZFNvY2tldHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcy52ZXJzaW9uLmlzT2xkZXIoJzUuMCcpICYmICEhIHdpbmRvdy5Xb3JrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ2ZvdW5kV29ya2VyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MudmVyc2lvbi5pc05ld2VyKCcyLjEnKSAmJiAhd2luZG93LmFwcGxpY2F0aW9uQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goJ25vQXBwQ2FjaGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3MubmFtZSAhPT0gJ2lPUycgJiYgdGhpcy5icm93c2VyLm5hbWUgPT09ICdTYWZhcmknICYmIHRoaXMuYnJvd3Nlci52ZXJzaW9uKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJyb3dzZXIudmVyc2lvbi5pc09sZGVyKCc0LjAnKSAmJiAhISB3aW5kb3cuYXBwbGljYXRpb25DYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZm91bmRBcHBDYWNoZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Ftb3VmbGFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJyb3dzZXIudmVyc2lvbi5pc09sZGVyKCc0LjEnKSAmJiAhISAod2luZG93Lmhpc3RvcnkgJiYgaGlzdG9yeS5wdXNoU3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCdmb3VuZEhpc3RvcnknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLnZlcnNpb24uaXNPbGRlcignNS4xJykgJiYgISEgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKCdmb3VuZEZ1bGxzY3JlZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbW91ZmxhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5icm93c2VyLnZlcnNpb24uaXNPbGRlcignNS4yJykgJiYgJ0ZpbGVSZWFkZXInIGluIHdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCgnZm91bmRGaWxlUmVhZGVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1vdWZsYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwTW9kZWwocykge1xuICAgICAgICBzID0gdHlwZW9mIHMgPT09ICd1bmRlZmluZWQnID8gJycgOiBzO1xuXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL19URCQvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL19DTUNDJC8sICcnKTtcblxuICAgICAgICBzID0gcy5yZXBsYWNlKC9fL2csICcgJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXFwvW14vXSskLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9cXC9bXi9dKyBBbmRyb2lkXFwvLiovLCAnJyk7XG5cbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXnRpdGEgb24gLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eQW5kcm9pZCBvbiAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15BbmRyb2lkIGZvciAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15JQ1MgQU9TUCBvbiAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15GdWxsIEFPU1Agb24gLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eRnVsbCBBbmRyb2lkIG9uIC8sICcnKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXkZ1bGwgQ2FwcHVjY2lubyBvbiAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15GdWxsIE1JUFMgQW5kcm9pZCBvbiAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15GdWxsIEFuZHJvaWQvLCAnJyk7XG5cbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXkFjZXIgPy9pLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15JY29uaWEgLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eQWlub2wgLywgJycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eQ29vbHBhZCA/L2ksICdDb29scGFkICcpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eQUxDQVRFTCAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15BbGNhdGVsIE9ULSguKikvLCAnb25lIHRvdWNoICQxJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15ZTC0vLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15Ob3ZvNyA/L2ksICdOb3ZvNyAnKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXkdJT05FRSAvLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15IVy0vLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15IdWF3ZWlbIC1dL2ksICdIdWF3ZWkgJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15TQU1TVU5HWyAtXS9pLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15Tb255RXJpY3Nzb24vLCAnJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15MZW5vdm8gTGVub3ZvLywgJ0xlbm92bycpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eTE5WLUxlbm92by8sICdMZW5vdm8nKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXkxlbm92by0vLCAnTGVub3ZvICcpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eKExHKVsgX1xcL10vLCAnJDEtJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL14oSFRDLiopXFxzKD86dnxWKT9bMC05Ll0rJC8sICckMScpO1xuICAgICAgICBzID0gcy5yZXBsYWNlKC9eKEhUQylbLVxcL10vLCAnJDEgJyk7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL14oSFRDKShbQS1aXVswLTldWzAtOV1bMC05XSkvLCAnJDEgJDInKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXihNb3Rvcm9sYVtcXHN8LV0pLywgJycpXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL14oTW90b3xNT1QtKS8sICcnKVxuXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoLy0/KG9yYW5nZSgtbHMpP3x2b2RhZm9uZXxib3V5Z3VlcykkL2ksICcnKTtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvaHR0cDpcXC9cXC8uKyQvaSwgJycpO1xuXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcblxuICAgICAgICByZXR1cm4gcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVZlcnNpb24odmVyc2lvbikge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi50b1N0cmluZygpO1xuICAgICAgICB2YXIgY29tcG9uZW50cyA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIG1ham9yID0gY29tcG9uZW50cy5zaGlmdCgpO1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYWpvciArICcuJyArIGNvbXBvbmVudHMuam9pbignJykpO1xuICAgIH1cblxuICAgIHJldHVybiBEZXRlY3RlZDtcblxufSkoKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_ua-device@0.1.10@ua-device/lib/useragent-base.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/cell/index.js":
/*!*********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/cell/index.js ***!
  \*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/babel-helper-vue-jsx-merge-props */ \"./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _shared__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./shared */ \"./node_modules/_vant@2.2.16@vant/es/cell/shared.js\");\n/* harmony import */ var _utils_functional__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/functional */ \"./node_modules/_vant@2.2.16@vant/es/utils/functional.js\");\n/* harmony import */ var _utils_router__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/router */ \"./node_modules/_vant@2.2.16@vant/es/utils/router.js\");\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../icon */ \"./node_modules/_vant@2.2.16@vant/es/icon/index.js\");\n\n\n\n\n\n\n // Types\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"createNamespace\"])('cell'),\n    createComponent = _createNamespace[0],\n    bem = _createNamespace[1];\n\nfunction Cell(h, props, slots, ctx) {\n  var icon = props.icon,\n      size = props.size,\n      title = props.title,\n      label = props.label,\n      value = props.value,\n      isLink = props.isLink,\n      arrowDirection = props.arrowDirection;\n  var showTitle = slots.title || Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"isDef\"])(title);\n  var showValue = slots.default || Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"isDef\"])(value);\n  var showLabel = slots.label || Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"isDef\"])(label);\n  var Label = showLabel && h(\"div\", {\n    \"class\": [bem('label'), props.labelClass]\n  }, [slots.label ? slots.label() : label]);\n  var Title = showTitle && h(\"div\", {\n    \"class\": [bem('title'), props.titleClass],\n    \"style\": props.titleStyle\n  }, [slots.title ? slots.title() : h(\"span\", [title]), Label]);\n  var Value = showValue && h(\"div\", {\n    \"class\": [bem('value', {\n      alone: !slots.title && !title\n    }), props.valueClass]\n  }, [slots.default ? slots.default() : h(\"span\", [value])]);\n  var LeftIcon = slots.icon ? slots.icon() : icon && h(_icon__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n    \"class\": bem('left-icon'),\n    \"attrs\": {\n      \"name\": icon\n    }\n  });\n  var rightIconSlot = slots['right-icon'];\n  var RightIcon = rightIconSlot ? rightIconSlot() : isLink && h(_icon__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n    \"class\": bem('right-icon'),\n    \"attrs\": {\n      \"name\": arrowDirection ? \"arrow-\" + arrowDirection : 'arrow'\n    }\n  });\n\n  function onClick(event) {\n    Object(_utils_functional__WEBPACK_IMPORTED_MODULE_4__[\"emit\"])(ctx, 'click', event);\n    Object(_utils_router__WEBPACK_IMPORTED_MODULE_5__[\"functionalRoute\"])(ctx);\n  }\n\n  var clickable = isLink || props.clickable;\n  var classes = {\n    clickable: clickable,\n    center: props.center,\n    required: props.required,\n    borderless: !props.border\n  };\n\n  if (size) {\n    classes[size] = size;\n  }\n\n  return h(\"div\", _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_1___default()([{\n    \"class\": bem(classes),\n    \"attrs\": {\n      \"role\": clickable ? 'button' : null,\n      \"tabindex\": clickable ? 0 : null\n    },\n    \"on\": {\n      \"click\": onClick\n    }\n  }, Object(_utils_functional__WEBPACK_IMPORTED_MODULE_4__[\"inherit\"])(ctx)]), [LeftIcon, Title, Value, RightIcon, slots.extra && slots.extra()]);\n}\n\nCell.props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, _shared__WEBPACK_IMPORTED_MODULE_3__[\"cellProps\"], {}, _utils_router__WEBPACK_IMPORTED_MODULE_5__[\"routeProps\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent(Cell));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY2VsbC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9jZWxsL2luZGV4LmpzP2QyZDkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX21lcmdlSlNYUHJvcHMgZnJvbSBcIkB2dWUvYmFiZWwtaGVscGVyLXZ1ZS1qc3gtbWVyZ2UtcHJvcHNcIjtcbmltcG9ydCB7IGNyZWF0ZU5hbWVzcGFjZSwgaXNEZWYgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBjZWxsUHJvcHMgfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQgeyBlbWl0LCBpbmhlcml0IH0gZnJvbSAnLi4vdXRpbHMvZnVuY3Rpb25hbCc7XG5pbXBvcnQgeyByb3V0ZVByb3BzLCBmdW5jdGlvbmFsUm91dGUgfSBmcm9tICcuLi91dGlscy9yb3V0ZXInO1xuaW1wb3J0IEljb24gZnJvbSAnLi4vaWNvbic7IC8vIFR5cGVzXG5cbnZhciBfY3JlYXRlTmFtZXNwYWNlID0gY3JlYXRlTmFtZXNwYWNlKCdjZWxsJyksXG4gICAgY3JlYXRlQ29tcG9uZW50ID0gX2NyZWF0ZU5hbWVzcGFjZVswXSxcbiAgICBiZW0gPSBfY3JlYXRlTmFtZXNwYWNlWzFdO1xuXG5mdW5jdGlvbiBDZWxsKGgsIHByb3BzLCBzbG90cywgY3R4KSB7XG4gIHZhciBpY29uID0gcHJvcHMuaWNvbixcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIGxhYmVsID0gcHJvcHMubGFiZWwsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgaXNMaW5rID0gcHJvcHMuaXNMaW5rLFxuICAgICAgYXJyb3dEaXJlY3Rpb24gPSBwcm9wcy5hcnJvd0RpcmVjdGlvbjtcbiAgdmFyIHNob3dUaXRsZSA9IHNsb3RzLnRpdGxlIHx8IGlzRGVmKHRpdGxlKTtcbiAgdmFyIHNob3dWYWx1ZSA9IHNsb3RzLmRlZmF1bHQgfHwgaXNEZWYodmFsdWUpO1xuICB2YXIgc2hvd0xhYmVsID0gc2xvdHMubGFiZWwgfHwgaXNEZWYobGFiZWwpO1xuICB2YXIgTGFiZWwgPSBzaG93TGFiZWwgJiYgaChcImRpdlwiLCB7XG4gICAgXCJjbGFzc1wiOiBbYmVtKCdsYWJlbCcpLCBwcm9wcy5sYWJlbENsYXNzXVxuICB9LCBbc2xvdHMubGFiZWwgPyBzbG90cy5sYWJlbCgpIDogbGFiZWxdKTtcbiAgdmFyIFRpdGxlID0gc2hvd1RpdGxlICYmIGgoXCJkaXZcIiwge1xuICAgIFwiY2xhc3NcIjogW2JlbSgndGl0bGUnKSwgcHJvcHMudGl0bGVDbGFzc10sXG4gICAgXCJzdHlsZVwiOiBwcm9wcy50aXRsZVN0eWxlXG4gIH0sIFtzbG90cy50aXRsZSA/IHNsb3RzLnRpdGxlKCkgOiBoKFwic3BhblwiLCBbdGl0bGVdKSwgTGFiZWxdKTtcbiAgdmFyIFZhbHVlID0gc2hvd1ZhbHVlICYmIGgoXCJkaXZcIiwge1xuICAgIFwiY2xhc3NcIjogW2JlbSgndmFsdWUnLCB7XG4gICAgICBhbG9uZTogIXNsb3RzLnRpdGxlICYmICF0aXRsZVxuICAgIH0pLCBwcm9wcy52YWx1ZUNsYXNzXVxuICB9LCBbc2xvdHMuZGVmYXVsdCA/IHNsb3RzLmRlZmF1bHQoKSA6IGgoXCJzcGFuXCIsIFt2YWx1ZV0pXSk7XG4gIHZhciBMZWZ0SWNvbiA9IHNsb3RzLmljb24gPyBzbG90cy5pY29uKCkgOiBpY29uICYmIGgoSWNvbiwge1xuICAgIFwiY2xhc3NcIjogYmVtKCdsZWZ0LWljb24nKSxcbiAgICBcImF0dHJzXCI6IHtcbiAgICAgIFwibmFtZVwiOiBpY29uXG4gICAgfVxuICB9KTtcbiAgdmFyIHJpZ2h0SWNvblNsb3QgPSBzbG90c1sncmlnaHQtaWNvbiddO1xuICB2YXIgUmlnaHRJY29uID0gcmlnaHRJY29uU2xvdCA/IHJpZ2h0SWNvblNsb3QoKSA6IGlzTGluayAmJiBoKEljb24sIHtcbiAgICBcImNsYXNzXCI6IGJlbSgncmlnaHQtaWNvbicpLFxuICAgIFwiYXR0cnNcIjoge1xuICAgICAgXCJuYW1lXCI6IGFycm93RGlyZWN0aW9uID8gXCJhcnJvdy1cIiArIGFycm93RGlyZWN0aW9uIDogJ2Fycm93J1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gb25DbGljayhldmVudCkge1xuICAgIGVtaXQoY3R4LCAnY2xpY2snLCBldmVudCk7XG4gICAgZnVuY3Rpb25hbFJvdXRlKGN0eCk7XG4gIH1cblxuICB2YXIgY2xpY2thYmxlID0gaXNMaW5rIHx8IHByb3BzLmNsaWNrYWJsZTtcbiAgdmFyIGNsYXNzZXMgPSB7XG4gICAgY2xpY2thYmxlOiBjbGlja2FibGUsXG4gICAgY2VudGVyOiBwcm9wcy5jZW50ZXIsXG4gICAgcmVxdWlyZWQ6IHByb3BzLnJlcXVpcmVkLFxuICAgIGJvcmRlcmxlc3M6ICFwcm9wcy5ib3JkZXJcbiAgfTtcblxuICBpZiAoc2l6ZSkge1xuICAgIGNsYXNzZXNbc2l6ZV0gPSBzaXplO1xuICB9XG5cbiAgcmV0dXJuIGgoXCJkaXZcIiwgX21lcmdlSlNYUHJvcHMoW3tcbiAgICBcImNsYXNzXCI6IGJlbShjbGFzc2VzKSxcbiAgICBcImF0dHJzXCI6IHtcbiAgICAgIFwicm9sZVwiOiBjbGlja2FibGUgPyAnYnV0dG9uJyA6IG51bGwsXG4gICAgICBcInRhYmluZGV4XCI6IGNsaWNrYWJsZSA/IDAgOiBudWxsXG4gICAgfSxcbiAgICBcIm9uXCI6IHtcbiAgICAgIFwiY2xpY2tcIjogb25DbGlja1xuICAgIH1cbiAgfSwgaW5oZXJpdChjdHgpXSksIFtMZWZ0SWNvbiwgVGl0bGUsIFZhbHVlLCBSaWdodEljb24sIHNsb3RzLmV4dHJhICYmIHNsb3RzLmV4dHJhKCldKTtcbn1cblxuQ2VsbC5wcm9wcyA9IF9leHRlbmRzKHt9LCBjZWxsUHJvcHMsIHt9LCByb3V0ZVByb3BzKTtcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbXBvbmVudChDZWxsKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/cell/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/cell/shared.js":
/*!**********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/cell/shared.js ***!
  \**********************************************************/
/*! exports provided: cellProps */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cellProps\", function() { return cellProps; });\nvar cellProps = {\n  icon: String,\n  size: String,\n  center: Boolean,\n  isLink: Boolean,\n  required: Boolean,\n  clickable: Boolean,\n  titleStyle: null,\n  titleClass: null,\n  valueClass: null,\n  labelClass: null,\n  title: [Number, String],\n  value: [Number, String],\n  label: [Number, String],\n  arrowDirection: String,\n  border: {\n    type: Boolean,\n    default: true\n  }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY2VsbC9zaGFyZWQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY2VsbC9zaGFyZWQuanM/MGIxOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIGNlbGxQcm9wcyA9IHtcbiAgaWNvbjogU3RyaW5nLFxuICBzaXplOiBTdHJpbmcsXG4gIGNlbnRlcjogQm9vbGVhbixcbiAgaXNMaW5rOiBCb29sZWFuLFxuICByZXF1aXJlZDogQm9vbGVhbixcbiAgY2xpY2thYmxlOiBCb29sZWFuLFxuICB0aXRsZVN0eWxlOiBudWxsLFxuICB0aXRsZUNsYXNzOiBudWxsLFxuICB2YWx1ZUNsYXNzOiBudWxsLFxuICBsYWJlbENsYXNzOiBudWxsLFxuICB0aXRsZTogW051bWJlciwgU3RyaW5nXSxcbiAgdmFsdWU6IFtOdW1iZXIsIFN0cmluZ10sXG4gIGxhYmVsOiBbTnVtYmVyLCBTdHJpbmddLFxuICBhcnJvd0RpcmVjdGlvbjogU3RyaW5nLFxuICBib3JkZXI6IHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGRlZmF1bHQ6IHRydWVcbiAgfVxufTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/cell/shared.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css":
/*!*******************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css ***!
  \*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"5ef806ae\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\", function() {\n     var newContent = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5jc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5jc3M/MGZkMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMSEuLi8uLi8uLi9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0yIS4vaW5kZXguY3NzXCIpO1xuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcbi8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cbnZhciBhZGQgPSByZXF1aXJlKFwiIS4uLy4uLy4uL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlc0NsaWVudC5qc1wiKS5kZWZhdWx0XG52YXIgdXBkYXRlID0gYWRkKFwiNWVmODA2YWVcIiwgY29udGVudCwgZmFsc2UsIHtcInNvdXJjZU1hcFwiOmZhbHNlLFwic2hhZG93TW9kZVwiOmZhbHNlfSk7XG4vLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5pZihtb2R1bGUuaG90KSB7XG4gLy8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3NcbiBpZighY29udGVudC5sb2NhbHMpIHtcbiAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi9pbmRleC5jc3NcIiwgZnVuY3Rpb24oKSB7XG4gICAgIHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMSEuLi8uLi8uLi9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0yIS4vaW5kZXguY3NzXCIpO1xuICAgICBpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcbiAgICAgdXBkYXRlKG5ld0NvbnRlbnQpO1xuICAgfSk7XG4gfVxuIC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3NcbiBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/collapse-item/index.js":
/*!******************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/collapse-item/index.js ***!
  \******************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _utils_constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/constant */ \"./node_modules/_vant@2.2.16@vant/es/utils/constant.js\");\n/* harmony import */ var _utils_dom_raf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/dom/raf */ \"./node_modules/_vant@2.2.16@vant/es/utils/dom/raf.js\");\n/* harmony import */ var _cell__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../cell */ \"./node_modules/_vant@2.2.16@vant/es/cell/index.js\");\n/* harmony import */ var _cell_shared__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../cell/shared */ \"./node_modules/_vant@2.2.16@vant/es/cell/shared.js\");\n/* harmony import */ var _mixins_relation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../mixins/relation */ \"./node_modules/_vant@2.2.16@vant/es/mixins/relation.js\");\n\n\n\n\n\n\n\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"])('collapse-item'),\n    createComponent = _createNamespace[0],\n    bem = _createNamespace[1];\n\nvar CELL_SLOTS = ['title', 'icon', 'right-icon'];\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent({\n  mixins: [Object(_mixins_relation__WEBPACK_IMPORTED_MODULE_6__[\"ChildrenMixin\"])('vanCollapse')],\n  props: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, _cell_shared__WEBPACK_IMPORTED_MODULE_5__[\"cellProps\"], {\n    name: [Number, String],\n    disabled: Boolean,\n    isLink: {\n      type: Boolean,\n      default: true\n    }\n  }),\n  data: function data() {\n    return {\n      show: null,\n      inited: null\n    };\n  },\n  computed: {\n    currentName: function currentName() {\n      return Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(this.name) ? this.name : this.index;\n    },\n    expanded: function expanded() {\n      var _this = this;\n\n      if (!this.parent) {\n        return null;\n      }\n\n      var _this$parent = this.parent,\n          value = _this$parent.value,\n          accordion = _this$parent.accordion;\n\n      if ( true && !accordion && !Array.isArray(value)) {\n        console.error('[Vant] Collapse: type of prop \"value\" should be Array');\n        return;\n      }\n\n      return accordion ? value === this.currentName : value.some(function (name) {\n        return name === _this.currentName;\n      });\n    }\n  },\n  created: function created() {\n    this.show = this.expanded;\n    this.inited = this.expanded;\n  },\n  watch: {\n    expanded: function expanded(_expanded, prev) {\n      var _this2 = this;\n\n      if (prev === null) {\n        return;\n      }\n\n      if (_expanded) {\n        this.show = true;\n        this.inited = true;\n      } // Use raf: flick when opened in safari\n      // Use nextTick: closing animation failed when set `user-select: none`\n\n\n      var nextTick = _expanded ? this.$nextTick : _utils_dom_raf__WEBPACK_IMPORTED_MODULE_3__[\"raf\"];\n      nextTick(function () {\n        var _this2$$refs = _this2.$refs,\n            content = _this2$$refs.content,\n            wrapper = _this2$$refs.wrapper;\n\n        if (!content || !wrapper) {\n          return;\n        }\n\n        var offsetHeight = content.offsetHeight;\n\n        if (offsetHeight) {\n          var contentHeight = offsetHeight + \"px\";\n          wrapper.style.height = _expanded ? 0 : contentHeight; // use double raf to ensure animation can start in mobile safari\n\n          Object(_utils_dom_raf__WEBPACK_IMPORTED_MODULE_3__[\"doubleRaf\"])(function () {\n            wrapper.style.height = _expanded ? contentHeight : 0;\n          });\n        } else {\n          _this2.onTransitionEnd();\n        }\n      });\n    }\n  },\n  methods: {\n    onClick: function onClick() {\n      if (this.disabled) {\n        return;\n      }\n\n      var parent = this.parent;\n      var name = parent.accordion && this.currentName === parent.value ? '' : this.currentName;\n      this.parent.switch(name, !this.expanded);\n    },\n    onTransitionEnd: function onTransitionEnd() {\n      if (!this.expanded) {\n        this.show = false;\n      } else {\n        this.$refs.wrapper.style.height = '';\n      }\n    }\n  },\n  render: function render() {\n    var _this3 = this,\n        _ref;\n\n    var h = arguments[0];\n    var disabled = this.disabled,\n        expanded = this.expanded;\n    var titleSlots = CELL_SLOTS.reduce(function (slots, name) {\n      if (_this3.slots(name)) {\n        slots[name] = function () {\n          return _this3.slots(name);\n        };\n      }\n\n      return slots;\n    }, {});\n\n    if (this.slots('value')) {\n      titleSlots.default = function () {\n        return _this3.slots('value');\n      };\n    }\n\n    var Title = h(_cell__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      \"attrs\": {\n        \"role\": \"button\",\n        \"tabindex\": disabled ? -1 : 0,\n        \"aria-expanded\": String(expanded)\n      },\n      \"class\": bem('title', {\n        disabled: disabled,\n        expanded: expanded\n      }),\n      \"on\": {\n        \"click\": this.onClick\n      },\n      \"scopedSlots\": titleSlots,\n      \"props\": Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, this.$props)\n    });\n    var Content = this.inited && h(\"div\", {\n      \"directives\": [{\n        name: \"show\",\n        value: this.show\n      }],\n      \"ref\": \"wrapper\",\n      \"class\": bem('wrapper'),\n      \"on\": {\n        \"transitionend\": this.onTransitionEnd\n      }\n    }, [h(\"div\", {\n      \"ref\": \"content\",\n      \"class\": bem('content')\n    }, [this.slots()])]);\n    return h(\"div\", {\n      \"class\": [bem(), (_ref = {}, _ref[_utils_constant__WEBPACK_IMPORTED_MODULE_2__[\"BORDER_TOP\"]] = this.index, _ref)]\n    }, [Title, Content]);\n  }\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9jb2xsYXBzZS1pdGVtL2luZGV4LmpzPzNlODUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgeyBjcmVhdGVOYW1lc3BhY2UsIGlzRGVmIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgQk9SREVSX1RPUCB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50JztcbmltcG9ydCB7IHJhZiwgZG91YmxlUmFmIH0gZnJvbSAnLi4vdXRpbHMvZG9tL3JhZic7XG5pbXBvcnQgQ2VsbCBmcm9tICcuLi9jZWxsJztcbmltcG9ydCB7IGNlbGxQcm9wcyB9IGZyb20gJy4uL2NlbGwvc2hhcmVkJztcbmltcG9ydCB7IENoaWxkcmVuTWl4aW4gfSBmcm9tICcuLi9taXhpbnMvcmVsYXRpb24nO1xuXG52YXIgX2NyZWF0ZU5hbWVzcGFjZSA9IGNyZWF0ZU5hbWVzcGFjZSgnY29sbGFwc2UtaXRlbScpLFxuICAgIGNyZWF0ZUNvbXBvbmVudCA9IF9jcmVhdGVOYW1lc3BhY2VbMF0sXG4gICAgYmVtID0gX2NyZWF0ZU5hbWVzcGFjZVsxXTtcblxudmFyIENFTExfU0xPVFMgPSBbJ3RpdGxlJywgJ2ljb24nLCAncmlnaHQtaWNvbiddO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ29tcG9uZW50KHtcbiAgbWl4aW5zOiBbQ2hpbGRyZW5NaXhpbigndmFuQ29sbGFwc2UnKV0sXG4gIHByb3BzOiBfZXh0ZW5kcyh7fSwgY2VsbFByb3BzLCB7XG4gICAgbmFtZTogW051bWJlciwgU3RyaW5nXSxcbiAgICBkaXNhYmxlZDogQm9vbGVhbixcbiAgICBpc0xpbms6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9KSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdzogbnVsbCxcbiAgICAgIGluaXRlZDogbnVsbFxuICAgIH07XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgY3VycmVudE5hbWU6IGZ1bmN0aW9uIGN1cnJlbnROYW1lKCkge1xuICAgICAgcmV0dXJuIGlzRGVmKHRoaXMubmFtZSkgPyB0aGlzLm5hbWUgOiB0aGlzLmluZGV4O1xuICAgIH0sXG4gICAgZXhwYW5kZWQ6IGZ1bmN0aW9uIGV4cGFuZGVkKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIF90aGlzJHBhcmVudCA9IHRoaXMucGFyZW50LFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkcGFyZW50LnZhbHVlLFxuICAgICAgICAgIGFjY29yZGlvbiA9IF90aGlzJHBhcmVudC5hY2NvcmRpb247XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFhY2NvcmRpb24gJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tWYW50XSBDb2xsYXBzZTogdHlwZSBvZiBwcm9wIFwidmFsdWVcIiBzaG91bGQgYmUgQXJyYXknKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjb3JkaW9uID8gdmFsdWUgPT09IHRoaXMuY3VycmVudE5hbWUgOiB2YWx1ZS5zb21lKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBfdGhpcy5jdXJyZW50TmFtZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcbiAgICB0aGlzLnNob3cgPSB0aGlzLmV4cGFuZGVkO1xuICAgIHRoaXMuaW5pdGVkID0gdGhpcy5leHBhbmRlZDtcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBleHBhbmRlZDogZnVuY3Rpb24gZXhwYW5kZWQoX2V4cGFuZGVkLCBwcmV2KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2V4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMuc2hvdyA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTtcbiAgICAgIH0gLy8gVXNlIHJhZjogZmxpY2sgd2hlbiBvcGVuZWQgaW4gc2FmYXJpXG4gICAgICAvLyBVc2UgbmV4dFRpY2s6IGNsb3NpbmcgYW5pbWF0aW9uIGZhaWxlZCB3aGVuIHNldCBgdXNlci1zZWxlY3Q6IG5vbmVgXG5cblxuICAgICAgdmFyIG5leHRUaWNrID0gX2V4cGFuZGVkID8gdGhpcy4kbmV4dFRpY2sgOiByYWY7XG4gICAgICBuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpczIkJHJlZnMgPSBfdGhpczIuJHJlZnMsXG4gICAgICAgICAgICBjb250ZW50ID0gX3RoaXMyJCRyZWZzLmNvbnRlbnQsXG4gICAgICAgICAgICB3cmFwcGVyID0gX3RoaXMyJCRyZWZzLndyYXBwZXI7XG5cbiAgICAgICAgaWYgKCFjb250ZW50IHx8ICF3cmFwcGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9mZnNldEhlaWdodCA9IGNvbnRlbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIGlmIChvZmZzZXRIZWlnaHQpIHtcbiAgICAgICAgICB2YXIgY29udGVudEhlaWdodCA9IG9mZnNldEhlaWdodCArIFwicHhcIjtcbiAgICAgICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9IF9leHBhbmRlZCA/IDAgOiBjb250ZW50SGVpZ2h0OyAvLyB1c2UgZG91YmxlIHJhZiB0byBlbnN1cmUgYW5pbWF0aW9uIGNhbiBzdGFydCBpbiBtb2JpbGUgc2FmYXJpXG5cbiAgICAgICAgICBkb3VibGVSYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd3JhcHBlci5zdHlsZS5oZWlnaHQgPSBfZXhwYW5kZWQgPyBjb250ZW50SGVpZ2h0IDogMDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczIub25UcmFuc2l0aW9uRW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgIHZhciBuYW1lID0gcGFyZW50LmFjY29yZGlvbiAmJiB0aGlzLmN1cnJlbnROYW1lID09PSBwYXJlbnQudmFsdWUgPyAnJyA6IHRoaXMuY3VycmVudE5hbWU7XG4gICAgICB0aGlzLnBhcmVudC5zd2l0Y2gobmFtZSwgIXRoaXMuZXhwYW5kZWQpO1xuICAgIH0sXG4gICAgb25UcmFuc2l0aW9uRW5kOiBmdW5jdGlvbiBvblRyYW5zaXRpb25FbmQoKSB7XG4gICAgICBpZiAoIXRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiRyZWZzLndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcyxcbiAgICAgICAgX3JlZjtcblxuICAgIHZhciBoID0gYXJndW1lbnRzWzBdO1xuICAgIHZhciBkaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQsXG4gICAgICAgIGV4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICB2YXIgdGl0bGVTbG90cyA9IENFTExfU0xPVFMucmVkdWNlKGZ1bmN0aW9uIChzbG90cywgbmFtZSkge1xuICAgICAgaWYgKF90aGlzMy5zbG90cyhuYW1lKSkge1xuICAgICAgICBzbG90c1tuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLnNsb3RzKG5hbWUpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2xvdHM7XG4gICAgfSwge30pO1xuXG4gICAgaWYgKHRoaXMuc2xvdHMoJ3ZhbHVlJykpIHtcbiAgICAgIHRpdGxlU2xvdHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5zbG90cygndmFsdWUnKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIFRpdGxlID0gaChDZWxsLCB7XG4gICAgICBcImF0dHJzXCI6IHtcbiAgICAgICAgXCJyb2xlXCI6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwidGFiaW5kZXhcIjogZGlzYWJsZWQgPyAtMSA6IDAsXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBTdHJpbmcoZXhwYW5kZWQpXG4gICAgICB9LFxuICAgICAgXCJjbGFzc1wiOiBiZW0oJ3RpdGxlJywge1xuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZFxuICAgICAgfSksXG4gICAgICBcIm9uXCI6IHtcbiAgICAgICAgXCJjbGlja1wiOiB0aGlzLm9uQ2xpY2tcbiAgICAgIH0sXG4gICAgICBcInNjb3BlZFNsb3RzXCI6IHRpdGxlU2xvdHMsXG4gICAgICBcInByb3BzXCI6IF9leHRlbmRzKHt9LCB0aGlzLiRwcm9wcylcbiAgICB9KTtcbiAgICB2YXIgQ29udGVudCA9IHRoaXMuaW5pdGVkICYmIGgoXCJkaXZcIiwge1xuICAgICAgXCJkaXJlY3RpdmVzXCI6IFt7XG4gICAgICAgIG5hbWU6IFwic2hvd1wiLFxuICAgICAgICB2YWx1ZTogdGhpcy5zaG93XG4gICAgICB9XSxcbiAgICAgIFwicmVmXCI6IFwid3JhcHBlclwiLFxuICAgICAgXCJjbGFzc1wiOiBiZW0oJ3dyYXBwZXInKSxcbiAgICAgIFwib25cIjoge1xuICAgICAgICBcInRyYW5zaXRpb25lbmRcIjogdGhpcy5vblRyYW5zaXRpb25FbmRcbiAgICAgIH1cbiAgICB9LCBbaChcImRpdlwiLCB7XG4gICAgICBcInJlZlwiOiBcImNvbnRlbnRcIixcbiAgICAgIFwiY2xhc3NcIjogYmVtKCdjb250ZW50JylcbiAgICB9LCBbdGhpcy5zbG90cygpXSldKTtcbiAgICByZXR1cm4gaChcImRpdlwiLCB7XG4gICAgICBcImNsYXNzXCI6IFtiZW0oKSwgKF9yZWYgPSB7fSwgX3JlZltCT1JERVJfVE9QXSA9IHRoaXMuaW5kZXgsIF9yZWYpXVxuICAgIH0sIFtUaXRsZSwgQ29udGVudF0pO1xuICB9XG59KTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse-item/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/collapse-item/style/index.js":
/*!************************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/collapse-item/style/index.js ***!
  \************************************************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../style/base.css */ \"./node_modules/_vant@2.2.16@vant/es/style/base.css\");\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_base_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _image_index_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../image/index.css */ \"./node_modules/_vant@2.2.16@vant/es/image/index.css\");\n/* harmony import */ var _image_index_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_image_index_css__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../index.css */ \"./node_modules/_vant@2.2.16@vant/es/collapse-item/index.css\");\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_index_css__WEBPACK_IMPORTED_MODULE_2__);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UtaXRlbS9zdHlsZS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9jb2xsYXBzZS1pdGVtL3N0eWxlL2luZGV4LmpzPzYwNDkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuLi8uLi9zdHlsZS9iYXNlLmNzcyc7XG5pbXBvcnQgJy4uLy4uL2ltYWdlL2luZGV4LmNzcyc7XG5pbXBvcnQgJy4uL2luZGV4LmNzcyc7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse-item/style/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/collapse/index.js":
/*!*************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/collapse/index.js ***!
  \*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _mixins_relation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mixins/relation */ \"./node_modules/_vant@2.2.16@vant/es/mixins/relation.js\");\n/* harmony import */ var _utils_constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/constant */ \"./node_modules/_vant@2.2.16@vant/es/utils/constant.js\");\n\n\n\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"createNamespace\"])('collapse'),\n    createComponent = _createNamespace[0],\n    bem = _createNamespace[1];\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent({\n  mixins: [Object(_mixins_relation__WEBPACK_IMPORTED_MODULE_1__[\"ParentMixin\"])('vanCollapse')],\n  props: {\n    accordion: Boolean,\n    value: [String, Number, Array],\n    border: {\n      type: Boolean,\n      default: true\n    }\n  },\n  methods: {\n    switch: function _switch(name, expanded) {\n      if (!this.accordion) {\n        name = expanded ? this.value.concat(name) : this.value.filter(function (activeName) {\n          return activeName !== name;\n        });\n      }\n\n      this.$emit('change', name);\n      this.$emit('input', name);\n    }\n  },\n  render: function render() {\n    var _ref;\n\n    var h = arguments[0];\n    return h(\"div\", {\n      \"class\": [bem(), (_ref = {}, _ref[_utils_constant__WEBPACK_IMPORTED_MODULE_2__[\"BORDER_TOP_BOTTOM\"]] = this.border, _ref)]\n    }, [this.slots()]);\n  }\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2UvaW5kZXguanM/YTI1YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVOYW1lc3BhY2UgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBQYXJlbnRNaXhpbiB9IGZyb20gJy4uL21peGlucy9yZWxhdGlvbic7XG5pbXBvcnQgeyBCT1JERVJfVE9QX0JPVFRPTSB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50JztcblxudmFyIF9jcmVhdGVOYW1lc3BhY2UgPSBjcmVhdGVOYW1lc3BhY2UoJ2NvbGxhcHNlJyksXG4gICAgY3JlYXRlQ29tcG9uZW50ID0gX2NyZWF0ZU5hbWVzcGFjZVswXSxcbiAgICBiZW0gPSBfY3JlYXRlTmFtZXNwYWNlWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb25lbnQoe1xuICBtaXhpbnM6IFtQYXJlbnRNaXhpbigndmFuQ29sbGFwc2UnKV0sXG4gIHByb3BzOiB7XG4gICAgYWNjb3JkaW9uOiBCb29sZWFuLFxuICAgIHZhbHVlOiBbU3RyaW5nLCBOdW1iZXIsIEFycmF5XSxcbiAgICBib3JkZXI6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgc3dpdGNoOiBmdW5jdGlvbiBfc3dpdGNoKG5hbWUsIGV4cGFuZGVkKSB7XG4gICAgICBpZiAoIXRoaXMuYWNjb3JkaW9uKSB7XG4gICAgICAgIG5hbWUgPSBleHBhbmRlZCA/IHRoaXMudmFsdWUuY29uY2F0KG5hbWUpIDogdGhpcy52YWx1ZS5maWx0ZXIoZnVuY3Rpb24gKGFjdGl2ZU5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gYWN0aXZlTmFtZSAhPT0gbmFtZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIG5hbWUpO1xuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBuYW1lKTtcbiAgICB9XG4gIH0sXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIGggPSBhcmd1bWVudHNbMF07XG4gICAgcmV0dXJuIGgoXCJkaXZcIiwge1xuICAgICAgXCJjbGFzc1wiOiBbYmVtKCksIChfcmVmID0ge30sIF9yZWZbQk9SREVSX1RPUF9CT1RUT01dID0gdGhpcy5ib3JkZXIsIF9yZWYpXVxuICAgIH0sIFt0aGlzLnNsb3RzKCldKTtcbiAgfVxufSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/collapse/style/index.js":
/*!*******************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/collapse/style/index.js ***!
  \*******************************************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../style/base.css */ \"./node_modules/_vant@2.2.16@vant/es/style/base.css\");\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_base_css__WEBPACK_IMPORTED_MODULE_0__);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2Uvc3R5bGUvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvY29sbGFwc2Uvc3R5bGUvaW5kZXguanM/NThkZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4uLy4uL3N0eWxlL2Jhc2UuY3NzJzsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/collapse/style/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/icon/index.js":
/*!*********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/icon/index.js ***!
  \*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/babel-helper-vue-jsx-merge-props */ \"./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _utils_functional__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/functional */ \"./node_modules/_vant@2.2.16@vant/es/utils/functional.js\");\n/* harmony import */ var _info__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../info */ \"./node_modules/_vant@2.2.16@vant/es/info/index.js\");\n/* harmony import */ var _image__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../image */ \"./node_modules/_vant@2.2.16@vant/es/image/index.js\");\n\n\n\n\n // Types\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"])('icon'),\n    createComponent = _createNamespace[0],\n    bem = _createNamespace[1];\n\nfunction isImage(name) {\n  return name ? name.indexOf('/') !== -1 : false;\n}\n\nfunction Icon(h, props, slots, ctx) {\n  var imageIcon = isImage(props.name);\n  return h(props.tag, _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default()([{\n    \"class\": [props.classPrefix, imageIcon ? '' : props.classPrefix + \"-\" + props.name],\n    \"style\": {\n      color: props.color,\n      fontSize: Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"addUnit\"])(props.size)\n    }\n  }, Object(_utils_functional__WEBPACK_IMPORTED_MODULE_2__[\"inherit\"])(ctx, true)]), [slots.default && slots.default(), imageIcon && h(_image__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n    \"class\": bem('image'),\n    \"attrs\": {\n      \"fit\": \"contain\",\n      \"src\": props.name,\n      \"showLoading\": false\n    }\n  }), h(_info__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    \"attrs\": {\n      \"dot\": props.dot,\n      \"info\": props.info\n    }\n  })]);\n}\n\nIcon.props = {\n  dot: Boolean,\n  name: String,\n  size: [Number, String],\n  info: [Number, String],\n  color: String,\n  tag: {\n    type: String,\n    default: 'i'\n  },\n  classPrefix: {\n    type: String,\n    default: bem()\n  }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent(Icon));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaWNvbi9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9pY29uL2luZGV4LmpzP2EwYzgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9tZXJnZUpTWFByb3BzIGZyb20gXCJAdnVlL2JhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzXCI7XG5pbXBvcnQgeyBjcmVhdGVOYW1lc3BhY2UsIGFkZFVuaXQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBpbmhlcml0IH0gZnJvbSAnLi4vdXRpbHMvZnVuY3Rpb25hbCc7XG5pbXBvcnQgSW5mbyBmcm9tICcuLi9pbmZvJztcbmltcG9ydCBJbWFnZSBmcm9tICcuLi9pbWFnZSc7IC8vIFR5cGVzXG5cbnZhciBfY3JlYXRlTmFtZXNwYWNlID0gY3JlYXRlTmFtZXNwYWNlKCdpY29uJyksXG4gICAgY3JlYXRlQ29tcG9uZW50ID0gX2NyZWF0ZU5hbWVzcGFjZVswXSxcbiAgICBiZW0gPSBfY3JlYXRlTmFtZXNwYWNlWzFdO1xuXG5mdW5jdGlvbiBpc0ltYWdlKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUgPyBuYW1lLmluZGV4T2YoJy8nKSAhPT0gLTEgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gSWNvbihoLCBwcm9wcywgc2xvdHMsIGN0eCkge1xuICB2YXIgaW1hZ2VJY29uID0gaXNJbWFnZShwcm9wcy5uYW1lKTtcbiAgcmV0dXJuIGgocHJvcHMudGFnLCBfbWVyZ2VKU1hQcm9wcyhbe1xuICAgIFwiY2xhc3NcIjogW3Byb3BzLmNsYXNzUHJlZml4LCBpbWFnZUljb24gPyAnJyA6IHByb3BzLmNsYXNzUHJlZml4ICsgXCItXCIgKyBwcm9wcy5uYW1lXSxcbiAgICBcInN0eWxlXCI6IHtcbiAgICAgIGNvbG9yOiBwcm9wcy5jb2xvcixcbiAgICAgIGZvbnRTaXplOiBhZGRVbml0KHByb3BzLnNpemUpXG4gICAgfVxuICB9LCBpbmhlcml0KGN0eCwgdHJ1ZSldKSwgW3Nsb3RzLmRlZmF1bHQgJiYgc2xvdHMuZGVmYXVsdCgpLCBpbWFnZUljb24gJiYgaChJbWFnZSwge1xuICAgIFwiY2xhc3NcIjogYmVtKCdpbWFnZScpLFxuICAgIFwiYXR0cnNcIjoge1xuICAgICAgXCJmaXRcIjogXCJjb250YWluXCIsXG4gICAgICBcInNyY1wiOiBwcm9wcy5uYW1lLFxuICAgICAgXCJzaG93TG9hZGluZ1wiOiBmYWxzZVxuICAgIH1cbiAgfSksIGgoSW5mbywge1xuICAgIFwiYXR0cnNcIjoge1xuICAgICAgXCJkb3RcIjogcHJvcHMuZG90LFxuICAgICAgXCJpbmZvXCI6IHByb3BzLmluZm9cbiAgICB9XG4gIH0pXSk7XG59XG5cbkljb24ucHJvcHMgPSB7XG4gIGRvdDogQm9vbGVhbixcbiAgbmFtZTogU3RyaW5nLFxuICBzaXplOiBbTnVtYmVyLCBTdHJpbmddLFxuICBpbmZvOiBbTnVtYmVyLCBTdHJpbmddLFxuICBjb2xvcjogU3RyaW5nLFxuICB0YWc6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgZGVmYXVsdDogJ2knXG4gIH0sXG4gIGNsYXNzUHJlZml4OiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGRlZmF1bHQ6IGJlbSgpXG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb25lbnQoSWNvbik7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/icon/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/icon/style/index.js":
/*!***************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/icon/style/index.js ***!
  \***************************************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../style/base.css */ \"./node_modules/_vant@2.2.16@vant/es/style/base.css\");\n/* harmony import */ var _style_base_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_base_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _image_index_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../image/index.css */ \"./node_modules/_vant@2.2.16@vant/es/image/index.css\");\n/* harmony import */ var _image_index_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_image_index_css__WEBPACK_IMPORTED_MODULE_1__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaWNvbi9zdHlsZS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9pY29uL3N0eWxlL2luZGV4LmpzPzk0MGIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuLi8uLi9zdHlsZS9iYXNlLmNzcyc7XG5pbXBvcnQgJy4uLy4uL2ltYWdlL2luZGV4LmNzcyc7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/icon/style/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/image/index.css":
/*!***********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/image/index.css ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"9269565e\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css\", function() {\n     var newContent = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./index.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/image/index.css\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW1hZ2UvaW5kZXguY3NzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL2ltYWdlL2luZGV4LmNzcz9jZmRhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi9pbmRleC5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI5MjY5NTY1ZVwiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL2luZGV4LmNzc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi9pbmRleC5jc3NcIik7XG4gICAgIGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuICAgICB1cGRhdGUobmV3Q29udGVudCk7XG4gICB9KTtcbiB9XG4gLy8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuIG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/image/index.css\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/image/index.js":
/*!**********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/image/index.js ***!
  \**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/babel-helper-vue-jsx-merge-props */ \"./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../icon */ \"./node_modules/_vant@2.2.16@vant/es/icon/index.js\");\n\n\n\n\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"])('image'),\n    createComponent = _createNamespace[0],\n    bem = _createNamespace[1];\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent({\n  props: {\n    src: String,\n    fit: String,\n    alt: String,\n    round: Boolean,\n    width: [Number, String],\n    height: [Number, String],\n    radius: [Number, String],\n    lazyLoad: Boolean,\n    showError: {\n      type: Boolean,\n      default: true\n    },\n    showLoading: {\n      type: Boolean,\n      default: true\n    }\n  },\n  data: function data() {\n    return {\n      loading: true,\n      error: false\n    };\n  },\n  watch: {\n    src: function src() {\n      this.loading = true;\n      this.error = false;\n    }\n  },\n  computed: {\n    style: function style() {\n      var style = {};\n\n      if (Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(this.width)) {\n        style.width = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"addUnit\"])(this.width);\n      }\n\n      if (Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(this.height)) {\n        style.height = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"addUnit\"])(this.height);\n      }\n\n      if (Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(this.radius)) {\n        style.overflow = 'hidden';\n        style.borderRadius = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"addUnit\"])(this.radius);\n      }\n\n      return style;\n    }\n  },\n  created: function created() {\n    var $Lazyload = this.$Lazyload;\n\n    if ($Lazyload) {\n      $Lazyload.$on('loaded', this.onLazyLoaded);\n      $Lazyload.$on('error', this.onLazyLoadError);\n    }\n  },\n  beforeDestroy: function beforeDestroy() {\n    var $Lazyload = this.$Lazyload;\n\n    if ($Lazyload) {\n      $Lazyload.$off('loaded', this.onLazyLoaded);\n      $Lazyload.$off('error', this.onLazyLoadError);\n    }\n  },\n  methods: {\n    onLoad: function onLoad(event) {\n      this.loading = false;\n      this.$emit('load', event);\n    },\n    onLazyLoaded: function onLazyLoaded(_ref) {\n      var el = _ref.el;\n\n      if (el === this.$refs.image && this.loading) {\n        this.onLoad();\n      }\n    },\n    onLazyLoadError: function onLazyLoadError(_ref2) {\n      var el = _ref2.el;\n\n      if (el === this.$refs.image && !this.error) {\n        this.onError();\n      }\n    },\n    onError: function onError(event) {\n      this.error = true;\n      this.loading = false;\n      this.$emit('error', event);\n    },\n    onClick: function onClick(event) {\n      this.$emit('click', event);\n    },\n    genPlaceholder: function genPlaceholder() {\n      var h = this.$createElement;\n\n      if (this.loading && this.showLoading) {\n        return h(\"div\", {\n          \"class\": bem('loading')\n        }, [this.slots('loading') || h(_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n          \"attrs\": {\n            \"name\": \"photo-o\",\n            \"size\": \"22\"\n          }\n        })]);\n      }\n\n      if (this.error && this.showError) {\n        return h(\"div\", {\n          \"class\": bem('error')\n        }, [this.slots('error') || h(_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n          \"attrs\": {\n            \"name\": \"warning-o\",\n            \"size\": \"22\"\n          }\n        })]);\n      }\n    },\n    genImage: function genImage() {\n      var h = this.$createElement;\n      var imgData = {\n        class: bem('img'),\n        attrs: {\n          alt: this.alt\n        },\n        style: {\n          objectFit: this.fit\n        }\n      };\n\n      if (this.error) {\n        return;\n      }\n\n      if (this.lazyLoad) {\n        return h(\"img\", _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default()([{\n          \"ref\": \"image\",\n          \"directives\": [{\n            name: \"lazy\",\n            value: this.src\n          }]\n        }, imgData]));\n      }\n\n      return h(\"img\", _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default()([{\n        \"attrs\": {\n          \"src\": this.src\n        },\n        \"on\": {\n          \"load\": this.onLoad,\n          \"error\": this.onError\n        }\n      }, imgData]));\n    }\n  },\n  render: function render() {\n    var h = arguments[0];\n    return h(\"div\", {\n      \"class\": bem({\n        round: this.round\n      }),\n      \"style\": this.style,\n      \"on\": {\n        \"click\": this.onClick\n      }\n    }, [this.genImage(), this.genPlaceholder()]);\n  }\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW1hZ2UvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW1hZ2UvaW5kZXguanM/MDljMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX21lcmdlSlNYUHJvcHMyIGZyb20gXCJAdnVlL2JhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzXCI7XG5pbXBvcnQgX21lcmdlSlNYUHJvcHMgZnJvbSBcIkB2dWUvYmFiZWwtaGVscGVyLXZ1ZS1qc3gtbWVyZ2UtcHJvcHNcIjtcbmltcG9ydCB7IGNyZWF0ZU5hbWVzcGFjZSwgaXNEZWYsIGFkZFVuaXQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgSWNvbiBmcm9tICcuLi9pY29uJztcblxudmFyIF9jcmVhdGVOYW1lc3BhY2UgPSBjcmVhdGVOYW1lc3BhY2UoJ2ltYWdlJyksXG4gICAgY3JlYXRlQ29tcG9uZW50ID0gX2NyZWF0ZU5hbWVzcGFjZVswXSxcbiAgICBiZW0gPSBfY3JlYXRlTmFtZXNwYWNlWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb25lbnQoe1xuICBwcm9wczoge1xuICAgIHNyYzogU3RyaW5nLFxuICAgIGZpdDogU3RyaW5nLFxuICAgIGFsdDogU3RyaW5nLFxuICAgIHJvdW5kOiBCb29sZWFuLFxuICAgIHdpZHRoOiBbTnVtYmVyLCBTdHJpbmddLFxuICAgIGhlaWdodDogW051bWJlciwgU3RyaW5nXSxcbiAgICByYWRpdXM6IFtOdW1iZXIsIFN0cmluZ10sXG4gICAgbGF6eUxvYWQ6IEJvb2xlYW4sXG4gICAgc2hvd0Vycm9yOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgc2hvd0xvYWRpbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9LFxuICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgZXJyb3I6IGZhbHNlXG4gICAgfTtcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBzcmM6IGZ1bmN0aW9uIHNyYygpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmVycm9yID0gZmFsc2U7XG4gICAgfVxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIHN0eWxlOiBmdW5jdGlvbiBzdHlsZSgpIHtcbiAgICAgIHZhciBzdHlsZSA9IHt9O1xuXG4gICAgICBpZiAoaXNEZWYodGhpcy53aWR0aCkpIHtcbiAgICAgICAgc3R5bGUud2lkdGggPSBhZGRVbml0KHRoaXMud2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEZWYodGhpcy5oZWlnaHQpKSB7XG4gICAgICAgIHN0eWxlLmhlaWdodCA9IGFkZFVuaXQodGhpcy5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEZWYodGhpcy5yYWRpdXMpKSB7XG4gICAgICAgIHN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICAgIHN0eWxlLmJvcmRlclJhZGl1cyA9IGFkZFVuaXQodGhpcy5yYWRpdXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuICB9LFxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuICAgIHZhciAkTGF6eWxvYWQgPSB0aGlzLiRMYXp5bG9hZDtcblxuICAgIGlmICgkTGF6eWxvYWQpIHtcbiAgICAgICRMYXp5bG9hZC4kb24oJ2xvYWRlZCcsIHRoaXMub25MYXp5TG9hZGVkKTtcbiAgICAgICRMYXp5bG9hZC4kb24oJ2Vycm9yJywgdGhpcy5vbkxhenlMb2FkRXJyb3IpO1xuICAgIH1cbiAgfSxcbiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICB2YXIgJExhenlsb2FkID0gdGhpcy4kTGF6eWxvYWQ7XG5cbiAgICBpZiAoJExhenlsb2FkKSB7XG4gICAgICAkTGF6eWxvYWQuJG9mZignbG9hZGVkJywgdGhpcy5vbkxhenlMb2FkZWQpO1xuICAgICAgJExhenlsb2FkLiRvZmYoJ2Vycm9yJywgdGhpcy5vbkxhenlMb2FkRXJyb3IpO1xuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIG9uTG9hZDogZnVuY3Rpb24gb25Mb2FkKGV2ZW50KSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuJGVtaXQoJ2xvYWQnLCBldmVudCk7XG4gICAgfSxcbiAgICBvbkxhenlMb2FkZWQ6IGZ1bmN0aW9uIG9uTGF6eUxvYWRlZChfcmVmKSB7XG4gICAgICB2YXIgZWwgPSBfcmVmLmVsO1xuXG4gICAgICBpZiAoZWwgPT09IHRoaXMuJHJlZnMuaW1hZ2UgJiYgdGhpcy5sb2FkaW5nKSB7XG4gICAgICAgIHRoaXMub25Mb2FkKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkxhenlMb2FkRXJyb3I6IGZ1bmN0aW9uIG9uTGF6eUxvYWRFcnJvcihfcmVmMikge1xuICAgICAgdmFyIGVsID0gX3JlZjIuZWw7XG5cbiAgICAgIGlmIChlbCA9PT0gdGhpcy4kcmVmcy5pbWFnZSAmJiAhdGhpcy5lcnJvcikge1xuICAgICAgICB0aGlzLm9uRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRXJyb3I6IGZ1bmN0aW9uIG9uRXJyb3IoZXZlbnQpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSB0cnVlO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLiRlbWl0KCdlcnJvcicsIGV2ZW50KTtcbiAgICB9LFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NsaWNrJywgZXZlbnQpO1xuICAgIH0sXG4gICAgZ2VuUGxhY2Vob2xkZXI6IGZ1bmN0aW9uIGdlblBsYWNlaG9sZGVyKCkge1xuICAgICAgdmFyIGggPSB0aGlzLiRjcmVhdGVFbGVtZW50O1xuXG4gICAgICBpZiAodGhpcy5sb2FkaW5nICYmIHRoaXMuc2hvd0xvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuIGgoXCJkaXZcIiwge1xuICAgICAgICAgIFwiY2xhc3NcIjogYmVtKCdsb2FkaW5nJylcbiAgICAgICAgfSwgW3RoaXMuc2xvdHMoJ2xvYWRpbmcnKSB8fCBoKEljb24sIHtcbiAgICAgICAgICBcImF0dHJzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInBob3RvLW9cIixcbiAgICAgICAgICAgIFwic2l6ZVwiOiBcIjIyXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0pXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVycm9yICYmIHRoaXMuc2hvd0Vycm9yKSB7XG4gICAgICAgIHJldHVybiBoKFwiZGl2XCIsIHtcbiAgICAgICAgICBcImNsYXNzXCI6IGJlbSgnZXJyb3InKVxuICAgICAgICB9LCBbdGhpcy5zbG90cygnZXJyb3InKSB8fCBoKEljb24sIHtcbiAgICAgICAgICBcImF0dHJzXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIndhcm5pbmctb1wiLFxuICAgICAgICAgICAgXCJzaXplXCI6IFwiMjJcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSldKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdlbkltYWdlOiBmdW5jdGlvbiBnZW5JbWFnZSgpIHtcbiAgICAgIHZhciBoID0gdGhpcy4kY3JlYXRlRWxlbWVudDtcbiAgICAgIHZhciBpbWdEYXRhID0ge1xuICAgICAgICBjbGFzczogYmVtKCdpbWcnKSxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBhbHQ6IHRoaXMuYWx0XG4gICAgICAgIH0sXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgb2JqZWN0Rml0OiB0aGlzLmZpdFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5lcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XG4gICAgICAgIHJldHVybiBoKFwiaW1nXCIsIF9tZXJnZUpTWFByb3BzKFt7XG4gICAgICAgICAgXCJyZWZcIjogXCJpbWFnZVwiLFxuICAgICAgICAgIFwiZGlyZWN0aXZlc1wiOiBbe1xuICAgICAgICAgICAgbmFtZTogXCJsYXp5XCIsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5zcmNcbiAgICAgICAgICB9XVxuICAgICAgICB9LCBpbWdEYXRhXSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaChcImltZ1wiLCBfbWVyZ2VKU1hQcm9wczIoW3tcbiAgICAgICAgXCJhdHRyc1wiOiB7XG4gICAgICAgICAgXCJzcmNcIjogdGhpcy5zcmNcbiAgICAgICAgfSxcbiAgICAgICAgXCJvblwiOiB7XG4gICAgICAgICAgXCJsb2FkXCI6IHRoaXMub25Mb2FkLFxuICAgICAgICAgIFwiZXJyb3JcIjogdGhpcy5vbkVycm9yXG4gICAgICAgIH1cbiAgICAgIH0sIGltZ0RhdGFdKSk7XG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgaCA9IGFyZ3VtZW50c1swXTtcbiAgICByZXR1cm4gaChcImRpdlwiLCB7XG4gICAgICBcImNsYXNzXCI6IGJlbSh7XG4gICAgICAgIHJvdW5kOiB0aGlzLnJvdW5kXG4gICAgICB9KSxcbiAgICAgIFwic3R5bGVcIjogdGhpcy5zdHlsZSxcbiAgICAgIFwib25cIjoge1xuICAgICAgICBcImNsaWNrXCI6IHRoaXMub25DbGlja1xuICAgICAgfVxuICAgIH0sIFt0aGlzLmdlbkltYWdlKCksIHRoaXMuZ2VuUGxhY2Vob2xkZXIoKV0pO1xuICB9XG59KTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/image/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/info/index.js":
/*!*********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/info/index.js ***!
  \*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/babel-helper-vue-jsx-merge-props */ \"./node_modules/_@vue_babel-helper-vue-jsx-merge-props@1.0.0@@vue/babel-helper-vue-jsx-merge-props/dist/helper.js\");\n/* harmony import */ var _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _utils_functional__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/functional */ \"./node_modules/_vant@2.2.16@vant/es/utils/functional.js\");\n\n\n // Types\n\nvar _createNamespace = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"])('info'),\n    createComponent = _createNamespace[0],\n    bem = _createNamespace[1];\n\nfunction Info(h, props, slots, ctx) {\n  var dot = props.dot,\n      info = props.info;\n  var showInfo = Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"isDef\"])(info) && info !== '';\n\n  if (!dot && !showInfo) {\n    return;\n  }\n\n  return h(\"div\", _vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_0___default()([{\n    \"class\": bem({\n      dot: dot\n    })\n  }, Object(_utils_functional__WEBPACK_IMPORTED_MODULE_2__[\"inherit\"])(ctx, true)]), [dot ? '' : props.info]);\n}\n\nInfo.props = {\n  dot: Boolean,\n  info: [Number, String]\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (createComponent(Info));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvaW5mby9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy9pbmZvL2luZGV4LmpzPzdjNTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9tZXJnZUpTWFByb3BzIGZyb20gXCJAdnVlL2JhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzXCI7XG5pbXBvcnQgeyBjcmVhdGVOYW1lc3BhY2UsIGlzRGVmIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgaW5oZXJpdCB9IGZyb20gJy4uL3V0aWxzL2Z1bmN0aW9uYWwnOyAvLyBUeXBlc1xuXG52YXIgX2NyZWF0ZU5hbWVzcGFjZSA9IGNyZWF0ZU5hbWVzcGFjZSgnaW5mbycpLFxuICAgIGNyZWF0ZUNvbXBvbmVudCA9IF9jcmVhdGVOYW1lc3BhY2VbMF0sXG4gICAgYmVtID0gX2NyZWF0ZU5hbWVzcGFjZVsxXTtcblxuZnVuY3Rpb24gSW5mbyhoLCBwcm9wcywgc2xvdHMsIGN0eCkge1xuICB2YXIgZG90ID0gcHJvcHMuZG90LFxuICAgICAgaW5mbyA9IHByb3BzLmluZm87XG4gIHZhciBzaG93SW5mbyA9IGlzRGVmKGluZm8pICYmIGluZm8gIT09ICcnO1xuXG4gIGlmICghZG90ICYmICFzaG93SW5mbykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBoKFwiZGl2XCIsIF9tZXJnZUpTWFByb3BzKFt7XG4gICAgXCJjbGFzc1wiOiBiZW0oe1xuICAgICAgZG90OiBkb3RcbiAgICB9KVxuICB9LCBpbmhlcml0KGN0eCwgdHJ1ZSldKSwgW2RvdCA/ICcnIDogcHJvcHMuaW5mb10pO1xufVxuXG5JbmZvLnByb3BzID0ge1xuICBkb3Q6IEJvb2xlYW4sXG4gIGluZm86IFtOdW1iZXIsIFN0cmluZ11cbn07XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb25lbnQoSW5mbyk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/info/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/locale/index.js":
/*!***********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/locale/index.js ***!
  \***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var _utils_deep_assign__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/deep-assign */ \"./node_modules/_vant@2.2.16@vant/es/utils/deep-assign.js\");\n/* harmony import */ var _lang_zh_CN__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lang/zh-CN */ \"./node_modules/_vant@2.2.16@vant/es/locale/lang/zh-CN.js\");\n\n\n\nvar proto = vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prototype;\nvar defineReactive = vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].util.defineReactive;\ndefineReactive(proto, '$vantLang', 'zh-CN');\ndefineReactive(proto, '$vantMessages', {\n  'zh-CN': _lang_zh_CN__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  messages: function messages() {\n    return proto.$vantMessages[proto.$vantLang];\n  },\n  use: function use(lang, messages) {\n    var _this$add;\n\n    proto.$vantLang = lang;\n    this.add((_this$add = {}, _this$add[lang] = messages, _this$add));\n  },\n  add: function add(messages) {\n    if (messages === void 0) {\n      messages = {};\n    }\n\n    Object(_utils_deep_assign__WEBPACK_IMPORTED_MODULE_1__[\"deepAssign\"])(proto.$vantMessages, messages);\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbG9jYWxlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL2xvY2FsZS9pbmRleC5qcz9mNTg1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBWdWUgZnJvbSAndnVlJztcbmltcG9ydCB7IGRlZXBBc3NpZ24gfSBmcm9tICcuLi91dGlscy9kZWVwLWFzc2lnbic7XG5pbXBvcnQgZGVmYXVsdE1lc3NhZ2VzIGZyb20gJy4vbGFuZy96aC1DTic7XG52YXIgcHJvdG8gPSBWdWUucHJvdG90eXBlO1xudmFyIGRlZmluZVJlYWN0aXZlID0gVnVlLnV0aWwuZGVmaW5lUmVhY3RpdmU7XG5kZWZpbmVSZWFjdGl2ZShwcm90bywgJyR2YW50TGFuZycsICd6aC1DTicpO1xuZGVmaW5lUmVhY3RpdmUocHJvdG8sICckdmFudE1lc3NhZ2VzJywge1xuICAnemgtQ04nOiBkZWZhdWx0TWVzc2FnZXNcbn0pO1xuZXhwb3J0IGRlZmF1bHQge1xuICBtZXNzYWdlczogZnVuY3Rpb24gbWVzc2FnZXMoKSB7XG4gICAgcmV0dXJuIHByb3RvLiR2YW50TWVzc2FnZXNbcHJvdG8uJHZhbnRMYW5nXTtcbiAgfSxcbiAgdXNlOiBmdW5jdGlvbiB1c2UobGFuZywgbWVzc2FnZXMpIHtcbiAgICB2YXIgX3RoaXMkYWRkO1xuXG4gICAgcHJvdG8uJHZhbnRMYW5nID0gbGFuZztcbiAgICB0aGlzLmFkZCgoX3RoaXMkYWRkID0ge30sIF90aGlzJGFkZFtsYW5nXSA9IG1lc3NhZ2VzLCBfdGhpcyRhZGQpKTtcbiAgfSxcbiAgYWRkOiBmdW5jdGlvbiBhZGQobWVzc2FnZXMpIHtcbiAgICBpZiAobWVzc2FnZXMgPT09IHZvaWQgMCkge1xuICAgICAgbWVzc2FnZXMgPSB7fTtcbiAgICB9XG5cbiAgICBkZWVwQXNzaWduKHByb3RvLiR2YW50TWVzc2FnZXMsIG1lc3NhZ2VzKTtcbiAgfVxufTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/locale/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/locale/lang/zh-CN.js":
/*!****************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/locale/lang/zh-CN.js ***!
  \****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  name: '姓名',\n  tel: '电话',\n  save: '保存',\n  confirm: '确认',\n  cancel: '取消',\n  delete: '删除',\n  complete: '完成',\n  loading: '加载中...',\n  telEmpty: '请填写电话',\n  nameEmpty: '请填写姓名',\n  confirmDelete: '确定要删除么',\n  telInvalid: '请填写正确的电话',\n  vanContactCard: {\n    addText: '添加联系人'\n  },\n  vanContactList: {\n    addText: '新建联系人'\n  },\n  vanPagination: {\n    prev: '上一页',\n    next: '下一页'\n  },\n  vanPullRefresh: {\n    pulling: '下拉即可刷新...',\n    loosing: '释放即可刷新...'\n  },\n  vanSubmitBar: {\n    label: '合计:'\n  },\n  vanCoupon: {\n    valid: '有效期',\n    unlimited: '无使用门槛',\n    discount: function discount(_discount) {\n      return _discount + \"\\u6298\";\n    },\n    condition: function condition(_condition) {\n      return \"\\u6EE1\" + _condition + \"\\u5143\\u53EF\\u7528\";\n    }\n  },\n  vanCouponCell: {\n    title: '优惠券',\n    tips: '使用优惠',\n    count: function count(_count) {\n      return _count + \"\\u5F20\\u53EF\\u7528\";\n    }\n  },\n  vanCouponList: {\n    empty: '暂无优惠券',\n    exchange: '兑换',\n    close: '不使用优惠',\n    enable: '可使用优惠券',\n    disabled: '不可使用优惠券',\n    placeholder: '请输入优惠码'\n  },\n  vanAddressEdit: {\n    area: '地区',\n    postal: '邮政编码',\n    areaEmpty: '请选择地区',\n    addressEmpty: '请填写详细地址',\n    postalEmpty: '邮政编码格式不正确',\n    defaultAddress: '设为默认收货地址',\n    telPlaceholder: '收货人手机号',\n    namePlaceholder: '收货人姓名',\n    areaPlaceholder: '选择省 / 市 / 区'\n  },\n  vanAddressEditDetail: {\n    label: '详细地址',\n    placeholder: '街道门牌、楼层房间号等信息'\n  },\n  vanAddressList: {\n    add: '新增地址'\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbG9jYWxlL2xhbmcvemgtQ04uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbG9jYWxlL2xhbmcvemgtQ04uanM/NzdkNCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICflp5PlkI0nLFxuICB0ZWw6ICfnlLXor50nLFxuICBzYXZlOiAn5L+d5a2YJyxcbiAgY29uZmlybTogJ+ehruiupCcsXG4gIGNhbmNlbDogJ+WPlua2iCcsXG4gIGRlbGV0ZTogJ+WIoOmZpCcsXG4gIGNvbXBsZXRlOiAn5a6M5oiQJyxcbiAgbG9hZGluZzogJ+WKoOi9veS4rS4uLicsXG4gIHRlbEVtcHR5OiAn6K+35aGr5YaZ55S16K+dJyxcbiAgbmFtZUVtcHR5OiAn6K+35aGr5YaZ5aeT5ZCNJyxcbiAgY29uZmlybURlbGV0ZTogJ+ehruWumuimgeWIoOmZpOS5iCcsXG4gIHRlbEludmFsaWQ6ICfor7floavlhpnmraPnoa7nmoTnlLXor50nLFxuICB2YW5Db250YWN0Q2FyZDoge1xuICAgIGFkZFRleHQ6ICfmt7vliqDogZTns7vkuronXG4gIH0sXG4gIHZhbkNvbnRhY3RMaXN0OiB7XG4gICAgYWRkVGV4dDogJ+aWsOW7uuiBlOezu+S6uidcbiAgfSxcbiAgdmFuUGFnaW5hdGlvbjoge1xuICAgIHByZXY6ICfkuIrkuIDpobUnLFxuICAgIG5leHQ6ICfkuIvkuIDpobUnXG4gIH0sXG4gIHZhblB1bGxSZWZyZXNoOiB7XG4gICAgcHVsbGluZzogJ+S4i+aLieWNs+WPr+WIt+aWsC4uLicsXG4gICAgbG9vc2luZzogJ+mHiuaUvuWNs+WPr+WIt+aWsC4uLidcbiAgfSxcbiAgdmFuU3VibWl0QmFyOiB7XG4gICAgbGFiZWw6ICflkIjorqHvvJonXG4gIH0sXG4gIHZhbkNvdXBvbjoge1xuICAgIHZhbGlkOiAn5pyJ5pWI5pyfJyxcbiAgICB1bmxpbWl0ZWQ6ICfml6Dkvb/nlKjpl6jmp5snLFxuICAgIGRpc2NvdW50OiBmdW5jdGlvbiBkaXNjb3VudChfZGlzY291bnQpIHtcbiAgICAgIHJldHVybiBfZGlzY291bnQgKyBcIlxcdTYyOThcIjtcbiAgICB9LFxuICAgIGNvbmRpdGlvbjogZnVuY3Rpb24gY29uZGl0aW9uKF9jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBcIlxcdTZFRTFcIiArIF9jb25kaXRpb24gKyBcIlxcdTUxNDNcXHU1M0VGXFx1NzUyOFwiO1xuICAgIH1cbiAgfSxcbiAgdmFuQ291cG9uQ2VsbDoge1xuICAgIHRpdGxlOiAn5LyY5oOg5Yi4JyxcbiAgICB0aXBzOiAn5L2/55So5LyY5oOgJyxcbiAgICBjb3VudDogZnVuY3Rpb24gY291bnQoX2NvdW50KSB7XG4gICAgICByZXR1cm4gX2NvdW50ICsgXCJcXHU1RjIwXFx1NTNFRlxcdTc1MjhcIjtcbiAgICB9XG4gIH0sXG4gIHZhbkNvdXBvbkxpc3Q6IHtcbiAgICBlbXB0eTogJ+aaguaXoOS8mOaDoOWIuCcsXG4gICAgZXhjaGFuZ2U6ICflhZHmjaInLFxuICAgIGNsb3NlOiAn5LiN5L2/55So5LyY5oOgJyxcbiAgICBlbmFibGU6ICflj6/kvb/nlKjkvJjmg6DliLgnLFxuICAgIGRpc2FibGVkOiAn5LiN5Y+v5L2/55So5LyY5oOg5Yi4JyxcbiAgICBwbGFjZWhvbGRlcjogJ+ivt+i+k+WFpeS8mOaDoOeggSdcbiAgfSxcbiAgdmFuQWRkcmVzc0VkaXQ6IHtcbiAgICBhcmVhOiAn5Zyw5Yy6JyxcbiAgICBwb3N0YWw6ICfpgq7mlL/nvJbnoIEnLFxuICAgIGFyZWFFbXB0eTogJ+ivt+mAieaLqeWcsOWMuicsXG4gICAgYWRkcmVzc0VtcHR5OiAn6K+35aGr5YaZ6K+m57uG5Zyw5Z2AJyxcbiAgICBwb3N0YWxFbXB0eTogJ+mCruaUv+e8lueggeagvOW8j+S4jeato+ehricsXG4gICAgZGVmYXVsdEFkZHJlc3M6ICforr7kuLrpu5jorqTmlLbotKflnLDlnYAnLFxuICAgIHRlbFBsYWNlaG9sZGVyOiAn5pS26LSn5Lq65omL5py65Y+3JyxcbiAgICBuYW1lUGxhY2Vob2xkZXI6ICfmlLbotKfkurrlp5PlkI0nLFxuICAgIGFyZWFQbGFjZWhvbGRlcjogJ+mAieaLqeecgSAvIOW4giAvIOWMuidcbiAgfSxcbiAgdmFuQWRkcmVzc0VkaXREZXRhaWw6IHtcbiAgICBsYWJlbDogJ+ivpue7huWcsOWdgCcsXG4gICAgcGxhY2Vob2xkZXI6ICfooZfpgZPpl6jniYzjgIHmpbzlsYLmiL/pl7Tlj7fnrYnkv6Hmga8nXG4gIH0sXG4gIHZhbkFkZHJlc3NMaXN0OiB7XG4gICAgYWRkOiAn5paw5aKe5Zyw5Z2AJ1xuICB9XG59OyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/locale/lang/zh-CN.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/mixins/relation.js":
/*!**************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/mixins/relation.js ***!
  \**************************************************************/
/*! exports provided: ChildrenMixin, ParentMixin */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ChildrenMixin\", function() { return ChildrenMixin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ParentMixin\", function() { return ParentMixin; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n\n\nfunction flattenVNodes(vnodes) {\n  var result = [];\n\n  function traverse(vnodes) {\n    vnodes.forEach(function (vnode) {\n      result.push(vnode);\n\n      if (vnode.children) {\n        traverse(vnode.children);\n      }\n    });\n  }\n\n  traverse(vnodes);\n  return result;\n}\n\nfunction ChildrenMixin(_parent, options) {\n  var _inject, _computed;\n\n  if (options === void 0) {\n    options = {};\n  }\n\n  var indexKey = options.indexKey || 'index';\n  return vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].extend({\n    inject: (_inject = {}, _inject[_parent] = {\n      default: null\n    }, _inject),\n    computed: (_computed = {\n      parent: function parent() {\n        if (this.disableBindRelation) {\n          return null;\n        }\n\n        return this[_parent];\n      }\n    }, _computed[indexKey] = function () {\n      this.bindRelation();\n      return this.parent.children.indexOf(this);\n    }, _computed),\n    mounted: function mounted() {\n      this.bindRelation();\n    },\n    beforeDestroy: function beforeDestroy() {\n      var _this = this;\n\n      if (this.parent) {\n        this.parent.children = this.parent.children.filter(function (item) {\n          return item !== _this;\n        });\n      }\n    },\n    methods: {\n      bindRelation: function bindRelation() {\n        if (!this.parent || this.parent.children.indexOf(this) !== -1) {\n          return;\n        }\n\n        var children = [].concat(this.parent.children, [this]);\n        var vnodes = flattenVNodes(this.parent.slots());\n        children.sort(function (a, b) {\n          return vnodes.indexOf(a.$vnode) - vnodes.indexOf(b.$vnode);\n        });\n        this.parent.children = children;\n      }\n    }\n  });\n}\nfunction ParentMixin(parent) {\n  return {\n    provide: function provide() {\n      var _ref;\n\n      return _ref = {}, _ref[parent] = this, _ref;\n    },\n    data: function data() {\n      return {\n        children: []\n      };\n    }\n  };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbWl4aW5zL3JlbGF0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL21peGlucy9yZWxhdGlvbi5qcz9hNTVlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBWdWUgZnJvbSAndnVlJztcblxuZnVuY3Rpb24gZmxhdHRlblZOb2Rlcyh2bm9kZXMpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZ1bmN0aW9uIHRyYXZlcnNlKHZub2Rlcykge1xuICAgIHZub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uICh2bm9kZSkge1xuICAgICAgcmVzdWx0LnB1c2godm5vZGUpO1xuXG4gICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgdHJhdmVyc2Uodm5vZGUuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhdmVyc2Uodm5vZGVzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENoaWxkcmVuTWl4aW4oX3BhcmVudCwgb3B0aW9ucykge1xuICB2YXIgX2luamVjdCwgX2NvbXB1dGVkO1xuXG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgaW5kZXhLZXkgPSBvcHRpb25zLmluZGV4S2V5IHx8ICdpbmRleCc7XG4gIHJldHVybiBWdWUuZXh0ZW5kKHtcbiAgICBpbmplY3Q6IChfaW5qZWN0ID0ge30sIF9pbmplY3RbX3BhcmVudF0gPSB7XG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSwgX2luamVjdCksXG4gICAgY29tcHV0ZWQ6IChfY29tcHV0ZWQgPSB7XG4gICAgICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZUJpbmRSZWxhdGlvbikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNbX3BhcmVudF07XG4gICAgICB9XG4gICAgfSwgX2NvbXB1dGVkW2luZGV4S2V5XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuYmluZFJlbGF0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICB9LCBfY29tcHV0ZWQpLFxuICAgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLmJpbmRSZWxhdGlvbigpO1xuICAgIH0sXG4gICAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5jaGlsZHJlbiA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBpdGVtICE9PSBfdGhpcztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICBiaW5kUmVsYXRpb246IGZ1bmN0aW9uIGJpbmRSZWxhdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCB8fCB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpICE9PSAtMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IFtdLmNvbmNhdCh0aGlzLnBhcmVudC5jaGlsZHJlbiwgW3RoaXNdKTtcbiAgICAgICAgdmFyIHZub2RlcyA9IGZsYXR0ZW5WTm9kZXModGhpcy5wYXJlbnQuc2xvdHMoKSk7XG4gICAgICAgIGNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICByZXR1cm4gdm5vZGVzLmluZGV4T2YoYS4kdm5vZGUpIC0gdm5vZGVzLmluZGV4T2YoYi4kdm5vZGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wYXJlbnQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIFBhcmVudE1peGluKHBhcmVudCkge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGU6IGZ1bmN0aW9uIHByb3ZpZGUoKSB7XG4gICAgICB2YXIgX3JlZjtcblxuICAgICAgcmV0dXJuIF9yZWYgPSB7fSwgX3JlZltwYXJlbnRdID0gdGhpcywgX3JlZjtcbiAgICB9LFxuICAgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgIH07XG4gICAgfVxuICB9O1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/mixins/relation.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/mixins/slots.js":
/*!***********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/mixins/slots.js ***!
  \***********************************************************/
/*! exports provided: SlotsMixin */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SlotsMixin\", function() { return SlotsMixin; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/**\n * Use scopedSlots in Vue 2.6+\n * downgrade to slots in lower version\n */\n\nvar SlotsMixin = vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].extend({\n  methods: {\n    slots: function slots(name, props) {\n      if (name === void 0) {\n        name = 'default';\n      }\n\n      var $slots = this.$slots,\n          $scopedSlots = this.$scopedSlots;\n      var scopedSlot = $scopedSlots[name];\n\n      if (scopedSlot) {\n        return scopedSlot(props);\n      }\n\n      return $slots[name];\n    }\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvbWl4aW5zL3Nsb3RzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL21peGlucy9zbG90cy5qcz9kMWZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIHNjb3BlZFNsb3RzIGluIFZ1ZSAyLjYrXG4gKiBkb3duZ3JhZGUgdG8gc2xvdHMgaW4gbG93ZXIgdmVyc2lvblxuICovXG5pbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG5leHBvcnQgdmFyIFNsb3RzTWl4aW4gPSBWdWUuZXh0ZW5kKHtcbiAgbWV0aG9kczoge1xuICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cyhuYW1lLCBwcm9wcykge1xuICAgICAgaWYgKG5hbWUgPT09IHZvaWQgMCkge1xuICAgICAgICBuYW1lID0gJ2RlZmF1bHQnO1xuICAgICAgfVxuXG4gICAgICB2YXIgJHNsb3RzID0gdGhpcy4kc2xvdHMsXG4gICAgICAgICAgJHNjb3BlZFNsb3RzID0gdGhpcy4kc2NvcGVkU2xvdHM7XG4gICAgICB2YXIgc2NvcGVkU2xvdCA9ICRzY29wZWRTbG90c1tuYW1lXTtcblxuICAgICAgaWYgKHNjb3BlZFNsb3QpIHtcbiAgICAgICAgcmV0dXJuIHNjb3BlZFNsb3QocHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJHNsb3RzW25hbWVdO1xuICAgIH1cbiAgfVxufSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/mixins/slots.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/style/base.css":
/*!**********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/style/base.css ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./base.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"976633f2\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./base.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css\", function() {\n     var newContent = __webpack_require__(/*! !../../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./base.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_vant@2.2.16@vant/es/style/base.css\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvc3R5bGUvYmFzZS5jc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvc3R5bGUvYmFzZS5jc3M/ZDYwNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMSEuLi8uLi8uLi9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0yIS4vYmFzZS5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI5NzY2MzNmMlwiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL2Jhc2UuY3NzXCIsIGZ1bmN0aW9uKCkge1xuICAgICB2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL2Jhc2UuY3NzXCIpO1xuICAgICBpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcbiAgICAgdXBkYXRlKG5ld0NvbnRlbnQpO1xuICAgfSk7XG4gfVxuIC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3NcbiBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/style/base.css\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/constant.js":
/*!*************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/constant.js ***!
  \*************************************************************/
/*! exports provided: RED, BLUE, GREEN, WHITE, GRAY, GRAY_DARK, BORDER, BORDER_TOP, BORDER_LEFT, BORDER_RIGHT, BORDER_BOTTOM, BORDER_SURROUND, BORDER_TOP_BOTTOM, BORDER_UNSET_TOP_BOTTOM */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RED\", function() { return RED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BLUE\", function() { return BLUE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GREEN\", function() { return GREEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"WHITE\", function() { return WHITE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GRAY\", function() { return GRAY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GRAY_DARK\", function() { return GRAY_DARK; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER\", function() { return BORDER; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_TOP\", function() { return BORDER_TOP; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_LEFT\", function() { return BORDER_LEFT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_RIGHT\", function() { return BORDER_RIGHT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_BOTTOM\", function() { return BORDER_BOTTOM; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_SURROUND\", function() { return BORDER_SURROUND; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_TOP_BOTTOM\", function() { return BORDER_TOP_BOTTOM; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BORDER_UNSET_TOP_BOTTOM\", function() { return BORDER_UNSET_TOP_BOTTOM; });\n// color\nvar RED = '#ee0a24';\nvar BLUE = '#1989fa';\nvar GREEN = '#07c160';\nvar WHITE = '#fff';\nvar GRAY = '#c9c9c9';\nvar GRAY_DARK = '#969799'; // border\n\nvar BORDER = 'van-hairline';\nvar BORDER_TOP = BORDER + \"--top\";\nvar BORDER_LEFT = BORDER + \"--left\";\nvar BORDER_RIGHT = BORDER + \"--right\";\nvar BORDER_BOTTOM = BORDER + \"--bottom\";\nvar BORDER_SURROUND = BORDER + \"--surround\";\nvar BORDER_TOP_BOTTOM = BORDER + \"--top-bottom\";\nvar BORDER_UNSET_TOP_BOTTOM = BORDER + \"-unset--top-bottom\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY29uc3RhbnQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY29uc3RhbnQuanM/MjY0YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBjb2xvclxuZXhwb3J0IHZhciBSRUQgPSAnI2VlMGEyNCc7XG5leHBvcnQgdmFyIEJMVUUgPSAnIzE5ODlmYSc7XG5leHBvcnQgdmFyIEdSRUVOID0gJyMwN2MxNjAnO1xuZXhwb3J0IHZhciBXSElURSA9ICcjZmZmJztcbmV4cG9ydCB2YXIgR1JBWSA9ICcjYzljOWM5JztcbmV4cG9ydCB2YXIgR1JBWV9EQVJLID0gJyM5Njk3OTknOyAvLyBib3JkZXJcblxuZXhwb3J0IHZhciBCT1JERVIgPSAndmFuLWhhaXJsaW5lJztcbmV4cG9ydCB2YXIgQk9SREVSX1RPUCA9IEJPUkRFUiArIFwiLS10b3BcIjtcbmV4cG9ydCB2YXIgQk9SREVSX0xFRlQgPSBCT1JERVIgKyBcIi0tbGVmdFwiO1xuZXhwb3J0IHZhciBCT1JERVJfUklHSFQgPSBCT1JERVIgKyBcIi0tcmlnaHRcIjtcbmV4cG9ydCB2YXIgQk9SREVSX0JPVFRPTSA9IEJPUkRFUiArIFwiLS1ib3R0b21cIjtcbmV4cG9ydCB2YXIgQk9SREVSX1NVUlJPVU5EID0gQk9SREVSICsgXCItLXN1cnJvdW5kXCI7XG5leHBvcnQgdmFyIEJPUkRFUl9UT1BfQk9UVE9NID0gQk9SREVSICsgXCItLXRvcC1ib3R0b21cIjtcbmV4cG9ydCB2YXIgQk9SREVSX1VOU0VUX1RPUF9CT1RUT00gPSBCT1JERVIgKyBcIi11bnNldC0tdG9wLWJvdHRvbVwiOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/constant.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/create/bem.js":
/*!***************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/create/bem.js ***!
  \***************************************************************/
/*! exports provided: createBEM */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createBEM\", function() { return createBEM; });\n/**\n * bem helper\n * b() // 'button'\n * b('text') // 'button__text'\n * b({ disabled }) // 'button button--disabled'\n * b('text', { disabled }) // 'button__text button__text--disabled'\n * b(['disabled', 'primary']) // 'button button--disabled button--primary'\n */\nvar ELEMENT = '__';\nvar MODS = '--';\n\nfunction join(name, el, symbol) {\n  return el ? name + symbol + el : name;\n}\n\nfunction prefix(name, mods) {\n  if (typeof mods === 'string') {\n    return join(name, mods, MODS);\n  }\n\n  if (Array.isArray(mods)) {\n    return mods.map(function (item) {\n      return prefix(name, item);\n    });\n  }\n\n  var ret = {};\n\n  if (mods) {\n    Object.keys(mods).forEach(function (key) {\n      ret[name + MODS + key] = mods[key];\n    });\n  }\n\n  return ret;\n}\n\nfunction createBEM(name) {\n  return function (el, mods) {\n    if (el && typeof el !== 'string') {\n      mods = el;\n      el = '';\n    }\n\n    el = join(name, el, ELEMENT);\n    return mods ? [el, prefix(el, mods)] : el;\n  };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2JlbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9jcmVhdGUvYmVtLmpzPzUyOWUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBiZW0gaGVscGVyXG4gKiBiKCkgLy8gJ2J1dHRvbidcbiAqIGIoJ3RleHQnKSAvLyAnYnV0dG9uX190ZXh0J1xuICogYih7IGRpc2FibGVkIH0pIC8vICdidXR0b24gYnV0dG9uLS1kaXNhYmxlZCdcbiAqIGIoJ3RleHQnLCB7IGRpc2FibGVkIH0pIC8vICdidXR0b25fX3RleHQgYnV0dG9uX190ZXh0LS1kaXNhYmxlZCdcbiAqIGIoWydkaXNhYmxlZCcsICdwcmltYXJ5J10pIC8vICdidXR0b24gYnV0dG9uLS1kaXNhYmxlZCBidXR0b24tLXByaW1hcnknXG4gKi9cbnZhciBFTEVNRU5UID0gJ19fJztcbnZhciBNT0RTID0gJy0tJztcblxuZnVuY3Rpb24gam9pbihuYW1lLCBlbCwgc3ltYm9sKSB7XG4gIHJldHVybiBlbCA/IG5hbWUgKyBzeW1ib2wgKyBlbCA6IG5hbWU7XG59XG5cbmZ1bmN0aW9uIHByZWZpeChuYW1lLCBtb2RzKSB7XG4gIGlmICh0eXBlb2YgbW9kcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gam9pbihuYW1lLCBtb2RzLCBNT0RTKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZHMpKSB7XG4gICAgcmV0dXJuIG1vZHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gcHJlZml4KG5hbWUsIGl0ZW0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHJldCA9IHt9O1xuXG4gIGlmIChtb2RzKSB7XG4gICAgT2JqZWN0LmtleXMobW9kcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXRbbmFtZSArIE1PRFMgKyBrZXldID0gbW9kc1trZXldO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJFTShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZWwsIG1vZHMpIHtcbiAgICBpZiAoZWwgJiYgdHlwZW9mIGVsICE9PSAnc3RyaW5nJykge1xuICAgICAgbW9kcyA9IGVsO1xuICAgICAgZWwgPSAnJztcbiAgICB9XG5cbiAgICBlbCA9IGpvaW4obmFtZSwgZWwsIEVMRU1FTlQpO1xuICAgIHJldHVybiBtb2RzID8gW2VsLCBwcmVmaXgoZWwsIG1vZHMpXSA6IGVsO1xuICB9O1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/create/bem.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/create/component.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/create/component.js ***!
  \*********************************************************************/
/*! exports provided: unifySlots, createComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unifySlots\", function() { return unifySlots; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createComponent\", function() { return createComponent; });\n/* harmony import */ var _locale__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../locale */ \"./node_modules/_vant@2.2.16@vant/es/locale/index.js\");\n/* harmony import */ var _format_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../format/string */ \"./node_modules/_vant@2.2.16@vant/es/utils/format/string.js\");\n/* harmony import */ var _mixins_slots__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../mixins/slots */ \"./node_modules/_vant@2.2.16@vant/es/mixins/slots.js\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/**\n * Create a basic component with common options\n */\n\n\n\n\n\nfunction install(Vue) {\n  var name = this.name;\n  Vue.component(name, this);\n  Vue.component(Object(_format_string__WEBPACK_IMPORTED_MODULE_1__[\"camelize\"])(\"-\" + name), this);\n} // unify slots & scopedSlots\n\n\nfunction unifySlots(context) {\n  // use data.scopedSlots in lower Vue version\n  var scopedSlots = context.scopedSlots || context.data.scopedSlots || {};\n  var slots = context.slots();\n  Object.keys(slots).forEach(function (key) {\n    if (!scopedSlots[key]) {\n      scopedSlots[key] = function () {\n        return slots[key];\n      };\n    }\n  });\n  return scopedSlots;\n} // should be removed after Vue 3\n\nfunction transformFunctionComponent(pure) {\n  return {\n    functional: true,\n    props: pure.props,\n    model: pure.model,\n    render: function render(h, context) {\n      return pure(h, context.props, unifySlots(context), context);\n    }\n  };\n}\n\nfunction createComponent(name) {\n  return function (sfc) {\n    if (typeof sfc === 'function') {\n      sfc = transformFunctionComponent(sfc);\n    }\n\n    if (!sfc.functional) {\n      sfc.mixins = sfc.mixins || [];\n      sfc.mixins.push(_mixins_slots__WEBPACK_IMPORTED_MODULE_2__[\"SlotsMixin\"]);\n    }\n\n    sfc.name = name;\n    sfc.install = install;\n    return sfc;\n  };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2NvbXBvbmVudC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9jcmVhdGUvY29tcG9uZW50LmpzPzA1YTciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGUgYSBiYXNpYyBjb21wb25lbnQgd2l0aCBjb21tb24gb3B0aW9uc1xuICovXG5pbXBvcnQgJy4uLy4uL2xvY2FsZSc7XG5pbXBvcnQgeyBjYW1lbGl6ZSB9IGZyb20gJy4uL2Zvcm1hdC9zdHJpbmcnO1xuaW1wb3J0IHsgU2xvdHNNaXhpbiB9IGZyb20gJy4uLy4uL21peGlucy9zbG90cyc7XG5pbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG5cbmZ1bmN0aW9uIGluc3RhbGwoVnVlKSB7XG4gIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICBWdWUuY29tcG9uZW50KG5hbWUsIHRoaXMpO1xuICBWdWUuY29tcG9uZW50KGNhbWVsaXplKFwiLVwiICsgbmFtZSksIHRoaXMpO1xufSAvLyB1bmlmeSBzbG90cyAmIHNjb3BlZFNsb3RzXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWZ5U2xvdHMoY29udGV4dCkge1xuICAvLyB1c2UgZGF0YS5zY29wZWRTbG90cyBpbiBsb3dlciBWdWUgdmVyc2lvblxuICB2YXIgc2NvcGVkU2xvdHMgPSBjb250ZXh0LnNjb3BlZFNsb3RzIHx8IGNvbnRleHQuZGF0YS5zY29wZWRTbG90cyB8fCB7fTtcbiAgdmFyIHNsb3RzID0gY29udGV4dC5zbG90cygpO1xuICBPYmplY3Qua2V5cyhzbG90cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFzY29wZWRTbG90c1trZXldKSB7XG4gICAgICBzY29wZWRTbG90c1trZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc2xvdHNba2V5XTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNjb3BlZFNsb3RzO1xufSAvLyBzaG91bGQgYmUgcmVtb3ZlZCBhZnRlciBWdWUgM1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1GdW5jdGlvbkNvbXBvbmVudChwdXJlKSB7XG4gIHJldHVybiB7XG4gICAgZnVuY3Rpb25hbDogdHJ1ZSxcbiAgICBwcm9wczogcHVyZS5wcm9wcyxcbiAgICBtb2RlbDogcHVyZS5tb2RlbCxcbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcHVyZShoLCBjb250ZXh0LnByb3BzLCB1bmlmeVNsb3RzKGNvbnRleHQpLCBjb250ZXh0KTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHNmYykge1xuICAgIGlmICh0eXBlb2Ygc2ZjID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzZmMgPSB0cmFuc2Zvcm1GdW5jdGlvbkNvbXBvbmVudChzZmMpO1xuICAgIH1cblxuICAgIGlmICghc2ZjLmZ1bmN0aW9uYWwpIHtcbiAgICAgIHNmYy5taXhpbnMgPSBzZmMubWl4aW5zIHx8IFtdO1xuICAgICAgc2ZjLm1peGlucy5wdXNoKFNsb3RzTWl4aW4pO1xuICAgIH1cblxuICAgIHNmYy5uYW1lID0gbmFtZTtcbiAgICBzZmMuaW5zdGFsbCA9IGluc3RhbGw7XG4gICAgcmV0dXJuIHNmYztcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/create/component.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/create/i18n.js":
/*!****************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/create/i18n.js ***!
  \****************************************************************/
/*! exports provided: createI18N */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createI18N\", function() { return createI18N; });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! .. */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _format_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../format/string */ \"./node_modules/_vant@2.2.16@vant/es/utils/format/string.js\");\n/* harmony import */ var _locale__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../locale */ \"./node_modules/_vant@2.2.16@vant/es/locale/index.js\");\n\n\n\nfunction createI18N(name) {\n  var prefix = Object(_format_string__WEBPACK_IMPORTED_MODULE_1__[\"camelize\"])(name) + '.';\n  return function (path) {\n    var message = Object(___WEBPACK_IMPORTED_MODULE_0__[\"get\"])(_locale__WEBPACK_IMPORTED_MODULE_2__[\"default\"].messages(), prefix + path) || Object(___WEBPACK_IMPORTED_MODULE_0__[\"get\"])(_locale__WEBPACK_IMPORTED_MODULE_2__[\"default\"].messages(), path);\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    return typeof message === 'function' ? message.apply(void 0, args) : message;\n  };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2kxOG4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2kxOG4uanM/MWFiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXQgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBjYW1lbGl6ZSB9IGZyb20gJy4uL2Zvcm1hdC9zdHJpbmcnO1xuaW1wb3J0IGxvY2FsZSBmcm9tICcuLi8uLi9sb2NhbGUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUkxOE4obmFtZSkge1xuICB2YXIgcHJlZml4ID0gY2FtZWxpemUobmFtZSkgKyAnLic7XG4gIHJldHVybiBmdW5jdGlvbiAocGF0aCkge1xuICAgIHZhciBtZXNzYWdlID0gZ2V0KGxvY2FsZS5tZXNzYWdlcygpLCBwcmVmaXggKyBwYXRoKSB8fCBnZXQobG9jYWxlLm1lc3NhZ2VzKCksIHBhdGgpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSAnZnVuY3Rpb24nID8gbWVzc2FnZS5hcHBseSh2b2lkIDAsIGFyZ3MpIDogbWVzc2FnZTtcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/create/i18n.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/create/index.js":
/*!*****************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/create/index.js ***!
  \*****************************************************************/
/*! exports provided: createNamespace */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createNamespace\", function() { return createNamespace; });\n/* harmony import */ var _bem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bem */ \"./node_modules/_vant@2.2.16@vant/es/utils/create/bem.js\");\n/* harmony import */ var _component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./component */ \"./node_modules/_vant@2.2.16@vant/es/utils/create/component.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./i18n */ \"./node_modules/_vant@2.2.16@vant/es/utils/create/i18n.js\");\n\n\n\nfunction createNamespace(name) {\n  name = 'van-' + name;\n  return [Object(_component__WEBPACK_IMPORTED_MODULE_1__[\"createComponent\"])(name), Object(_bem__WEBPACK_IMPORTED_MODULE_0__[\"createBEM\"])(name), Object(_i18n__WEBPACK_IMPORTED_MODULE_2__[\"createI18N\"])(name)];\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvY3JlYXRlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL3V0aWxzL2NyZWF0ZS9pbmRleC5qcz8yODBmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUJFTSB9IGZyb20gJy4vYmVtJztcbmltcG9ydCB7IGNyZWF0ZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7IGNyZWF0ZUkxOE4gfSBmcm9tICcuL2kxOG4nO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5hbWVzcGFjZShuYW1lKSB7XG4gIG5hbWUgPSAndmFuLScgKyBuYW1lO1xuICByZXR1cm4gW2NyZWF0ZUNvbXBvbmVudChuYW1lKSwgY3JlYXRlQkVNKG5hbWUpLCBjcmVhdGVJMThOKG5hbWUpXTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/create/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/deep-assign.js":
/*!****************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/deep-assign.js ***!
  \****************************************************************/
/*! exports provided: deepAssign */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deepAssign\", function() { return deepAssign; });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction assignKey(to, from, key) {\n  var val = from[key];\n\n  if (!Object(___WEBPACK_IMPORTED_MODULE_0__[\"isDef\"])(val)) {\n    return;\n  }\n\n  if (!hasOwnProperty.call(to, key) || !Object(___WEBPACK_IMPORTED_MODULE_0__[\"isObj\"])(val) || typeof val === 'function') {\n    to[key] = val;\n  } else {\n    // eslint-disable-next-line no-use-before-define\n    to[key] = deepAssign(Object(to[key]), from[key]);\n  }\n}\n\nfunction deepAssign(to, from) {\n  Object.keys(from).forEach(function (key) {\n    assignKey(to, from, key);\n  });\n  return to;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZGVlcC1hc3NpZ24uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZGVlcC1hc3NpZ24uanM/OTQxZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0RlZiwgaXNPYmogfSBmcm9tICcuJztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGFzc2lnbktleSh0bywgZnJvbSwga2V5KSB7XG4gIHZhciB2YWwgPSBmcm9tW2tleV07XG5cbiAgaWYgKCFpc0RlZih2YWwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHRvLCBrZXkpIHx8ICFpc09iaih2YWwpIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0b1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHRvW2tleV0gPSBkZWVwQXNzaWduKE9iamVjdCh0b1trZXldKSwgZnJvbVtrZXldKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0bywgZnJvbSkge1xuICBPYmplY3Qua2V5cyhmcm9tKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBhc3NpZ25LZXkodG8sIGZyb20sIGtleSk7XG4gIH0pO1xuICByZXR1cm4gdG87XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/deep-assign.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/dom/raf.js":
/*!************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/dom/raf.js ***!
  \************************************************************/
/*! exports provided: raf, doubleRaf, cancelRaf */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"raf\", function() { return raf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"doubleRaf\", function() { return doubleRaf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cancelRaf\", function() { return cancelRaf; });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! .. */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/**\n * requestAnimationFrame polyfill\n */\n\nvar prev = Date.now();\n/* istanbul ignore next */\n\nfunction fallback(fn) {\n  var curr = Date.now();\n  var ms = Math.max(0, 16 - (curr - prev));\n  var id = setTimeout(fn, ms);\n  prev = curr + ms;\n  return id;\n}\n/* istanbul ignore next */\n\n\nvar root = ___WEBPACK_IMPORTED_MODULE_0__[\"isServer\"] ? global : window;\n/* istanbul ignore next */\n\nvar iRaf = root.requestAnimationFrame || fallback;\n/* istanbul ignore next */\n\nvar iCancel = root.cancelAnimationFrame || root.clearTimeout;\nfunction raf(fn) {\n  return iRaf.call(root, fn);\n} // double raf for animation\n\nfunction doubleRaf(fn) {\n  raf(function () {\n    raf(fn);\n  });\n}\nfunction cancelRaf(id) {\n  iCancel.call(root, id);\n}\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZG9tL3JhZi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9kb20vcmFmLmpzPzc2M2YiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcG9seWZpbGxcbiAqL1xuaW1wb3J0IHsgaXNTZXJ2ZXIgfSBmcm9tICcuLic7XG52YXIgcHJldiA9IERhdGUubm93KCk7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5mdW5jdGlvbiBmYWxsYmFjayhmbikge1xuICB2YXIgY3VyciA9IERhdGUubm93KCk7XG4gIHZhciBtcyA9IE1hdGgubWF4KDAsIDE2IC0gKGN1cnIgLSBwcmV2KSk7XG4gIHZhciBpZCA9IHNldFRpbWVvdXQoZm4sIG1zKTtcbiAgcHJldiA9IGN1cnIgKyBtcztcbiAgcmV0dXJuIGlkO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG52YXIgcm9vdCA9IGlzU2VydmVyID8gZ2xvYmFsIDogd2luZG93O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxudmFyIGlSYWYgPSByb290LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBmYWxsYmFjaztcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbnZhciBpQ2FuY2VsID0gcm9vdC5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCByb290LmNsZWFyVGltZW91dDtcbmV4cG9ydCBmdW5jdGlvbiByYWYoZm4pIHtcbiAgcmV0dXJuIGlSYWYuY2FsbChyb290LCBmbik7XG59IC8vIGRvdWJsZSByYWYgZm9yIGFuaW1hdGlvblxuXG5leHBvcnQgZnVuY3Rpb24gZG91YmxlUmFmKGZuKSB7XG4gIHJhZihmdW5jdGlvbiAoKSB7XG4gICAgcmFmKGZuKTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsUmFmKGlkKSB7XG4gIGlDYW5jZWwuY2FsbChyb290LCBpZCk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/dom/raf.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/format/string.js":
/*!******************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/format/string.js ***!
  \******************************************************************/
/*! exports provided: camelize, padZero */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"camelize\", function() { return camelize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"padZero\", function() { return padZero; });\nvar camelizeRE = /-(\\w)/g;\nfunction camelize(str) {\n  return str.replace(camelizeRE, function (_, c) {\n    return c.toUpperCase();\n  });\n}\nfunction padZero(num, targetLength) {\n  if (targetLength === void 0) {\n    targetLength = 2;\n  }\n\n  var str = num + '';\n\n  while (str.length < targetLength) {\n    str = '0' + str;\n  }\n\n  return str;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZm9ybWF0L3N0cmluZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9mb3JtYXQvc3RyaW5nLmpzPzZlMWIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNhbWVsaXplUkUgPSAvLShcXHcpL2c7XG5leHBvcnQgZnVuY3Rpb24gY2FtZWxpemUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykge1xuICAgIHJldHVybiBjLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhZFplcm8obnVtLCB0YXJnZXRMZW5ndGgpIHtcbiAgaWYgKHRhcmdldExlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgdGFyZ2V0TGVuZ3RoID0gMjtcbiAgfVxuXG4gIHZhciBzdHIgPSBudW0gKyAnJztcblxuICB3aGlsZSAoc3RyLmxlbmd0aCA8IHRhcmdldExlbmd0aCkge1xuICAgIHN0ciA9ICcwJyArIHN0cjtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/format/string.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/format/unit.js":
/*!****************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/format/unit.js ***!
  \****************************************************************/
/*! exports provided: addUnit */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addUnit\", function() { return addUnit; });\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! .. */ \"./node_modules/_vant@2.2.16@vant/es/utils/index.js\");\n/* harmony import */ var _validate_number__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../validate/number */ \"./node_modules/_vant@2.2.16@vant/es/utils/validate/number.js\");\n\n\nfunction addUnit(value) {\n  if (!Object(___WEBPACK_IMPORTED_MODULE_0__[\"isDef\"])(value)) {\n    return undefined;\n  }\n\n  value = String(value);\n  return Object(_validate_number__WEBPACK_IMPORTED_MODULE_1__[\"isNumber\"])(value) ? value + \"px\" : value;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZm9ybWF0L3VuaXQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZm9ybWF0L3VuaXQuanM/ZTgyMyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0RlZiB9IGZyb20gJy4uJztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi4vdmFsaWRhdGUvbnVtYmVyJztcbmV4cG9ydCBmdW5jdGlvbiBhZGRVbml0KHZhbHVlKSB7XG4gIGlmICghaXNEZWYodmFsdWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSA/IHZhbHVlICsgXCJweFwiIDogdmFsdWU7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/format/unit.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/functional.js":
/*!***************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/functional.js ***!
  \***************************************************************/
/*! exports provided: inherit, emit, mount */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"inherit\", function() { return inherit; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"emit\", function() { return emit; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mount\", function() { return mount; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/_@babel_runtime@7.7.4@@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n\n\nvar inheritKey = ['ref', 'style', 'class', 'attrs', 'nativeOn', 'directives', 'staticClass', 'staticStyle'];\nvar mapInheritKey = {\n  nativeOn: 'on'\n}; // inherit partial context, map nativeOn to on\n\nfunction inherit(context, inheritListeners) {\n  var result = inheritKey.reduce(function (obj, key) {\n    if (context.data[key]) {\n      obj[mapInheritKey[key] || key] = context.data[key];\n    }\n\n    return obj;\n  }, {});\n\n  if (inheritListeners) {\n    result.on = result.on || {};\n\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(result.on, context.data.on);\n  }\n\n  return result;\n} // emit event\n\nfunction emit(context, eventName) {\n  for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n    args[_key - 2] = arguments[_key];\n  }\n\n  var listeners = context.listeners[eventName];\n\n  if (listeners) {\n    if (Array.isArray(listeners)) {\n      listeners.forEach(function (listener) {\n        listener.apply(void 0, args);\n      });\n    } else {\n      listeners.apply(void 0, args);\n    }\n  }\n} // mount functional component\n\nfunction mount(Component, data) {\n  var instance = new vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"]({\n    el: document.createElement('div'),\n    props: Component.props,\n    render: function render(h) {\n      return h(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        props: this.$props\n      }, data));\n    }\n  });\n  document.body.appendChild(instance.$el);\n  return instance;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvZnVuY3Rpb25hbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmFudEAyLjIuMTZAdmFudC9lcy91dGlscy9mdW5jdGlvbmFsLmpzPzEzY2YiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG52YXIgaW5oZXJpdEtleSA9IFsncmVmJywgJ3N0eWxlJywgJ2NsYXNzJywgJ2F0dHJzJywgJ25hdGl2ZU9uJywgJ2RpcmVjdGl2ZXMnLCAnc3RhdGljQ2xhc3MnLCAnc3RhdGljU3R5bGUnXTtcbnZhciBtYXBJbmhlcml0S2V5ID0ge1xuICBuYXRpdmVPbjogJ29uJ1xufTsgLy8gaW5oZXJpdCBwYXJ0aWFsIGNvbnRleHQsIG1hcCBuYXRpdmVPbiB0byBvblxuXG5leHBvcnQgZnVuY3Rpb24gaW5oZXJpdChjb250ZXh0LCBpbmhlcml0TGlzdGVuZXJzKSB7XG4gIHZhciByZXN1bHQgPSBpbmhlcml0S2V5LnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICBpZiAoY29udGV4dC5kYXRhW2tleV0pIHtcbiAgICAgIG9ialttYXBJbmhlcml0S2V5W2tleV0gfHwga2V5XSA9IGNvbnRleHQuZGF0YVtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcblxuICBpZiAoaW5oZXJpdExpc3RlbmVycykge1xuICAgIHJlc3VsdC5vbiA9IHJlc3VsdC5vbiB8fCB7fTtcblxuICAgIF9leHRlbmRzKHJlc3VsdC5vbiwgY29udGV4dC5kYXRhLm9uKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59IC8vIGVtaXQgZXZlbnRcblxuZXhwb3J0IGZ1bmN0aW9uIGVtaXQoY29udGV4dCwgZXZlbnROYW1lKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAyID8gX2xlbiAtIDIgOiAwKSwgX2tleSA9IDI7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBjb250ZXh0Lmxpc3RlbmVyc1tldmVudE5hbWVdO1xuXG4gIGlmIChsaXN0ZW5lcnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsaXN0ZW5lcnMpKSB7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXIuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0ZW5lcnMuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB9XG4gIH1cbn0gLy8gbW91bnQgZnVuY3Rpb25hbCBjb21wb25lbnRcblxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50KENvbXBvbmVudCwgZGF0YSkge1xuICB2YXIgaW5zdGFuY2UgPSBuZXcgVnVlKHtcbiAgICBlbDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgcHJvcHM6IENvbXBvbmVudC5wcm9wcyxcbiAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7XG4gICAgICByZXR1cm4gaChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICAgICAgcHJvcHM6IHRoaXMuJHByb3BzXG4gICAgICB9LCBkYXRhKSk7XG4gICAgfVxuICB9KTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbnN0YW5jZS4kZWwpO1xuICByZXR1cm4gaW5zdGFuY2U7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/functional.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/index.js":
/*!**********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/index.js ***!
  \**********************************************************/
/*! exports provided: createNamespace, addUnit, isServer, noop, isDef, isObj, get */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isServer\", function() { return isServer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"noop\", function() { return noop; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isDef\", function() { return isDef; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isObj\", function() { return isObj; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"get\", function() { return get; });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var _create__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./create */ \"./node_modules/_vant@2.2.16@vant/es/utils/create/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createNamespace\", function() { return _create__WEBPACK_IMPORTED_MODULE_1__[\"createNamespace\"]; });\n\n/* harmony import */ var _format_unit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./format/unit */ \"./node_modules/_vant@2.2.16@vant/es/utils/format/unit.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"addUnit\", function() { return _format_unit__WEBPACK_IMPORTED_MODULE_2__[\"addUnit\"]; });\n\n\n\n\nvar isServer = vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prototype.$isServer;\nfunction noop() {}\nfunction isDef(value) {\n  return value !== undefined && value !== null;\n}\nfunction isObj(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\nfunction get(object, path) {\n  var keys = path.split('.');\n  var result = object;\n  keys.forEach(function (key) {\n    result = isDef(result[key]) ? result[key] : '';\n  });\n  return result;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvaW5kZXguanM/YmI4NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG5leHBvcnQgeyBjcmVhdGVOYW1lc3BhY2UgfSBmcm9tICcuL2NyZWF0ZSc7XG5leHBvcnQgeyBhZGRVbml0IH0gZnJvbSAnLi9mb3JtYXQvdW5pdCc7XG5leHBvcnQgdmFyIGlzU2VydmVyID0gVnVlLnByb3RvdHlwZS4kaXNTZXJ2ZXI7XG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpIHt9XG5leHBvcnQgZnVuY3Rpb24gaXNEZWYodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmooeCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB4O1xuICByZXR1cm4geCAhPT0gbnVsbCAmJiAodHlwZSA9PT0gJ29iamVjdCcgfHwgdHlwZSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCkge1xuICB2YXIga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdDtcbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXN1bHQgPSBpc0RlZihyZXN1bHRba2V5XSkgPyByZXN1bHRba2V5XSA6ICcnO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/index.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/router.js":
/*!***********************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/router.js ***!
  \***********************************************************/
/*! exports provided: route, functionalRoute, routeProps */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"route\", function() { return route; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"functionalRoute\", function() { return functionalRoute; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"routeProps\", function() { return routeProps; });\n/**\n * Vue Router support\n */\nfunction route(router, config) {\n  var to = config.to,\n      url = config.url,\n      replace = config.replace;\n\n  if (to && router) {\n    var promise = router[replace ? 'replace' : 'push'](to);\n    /* istanbul ignore else */\n\n    if (promise && promise.catch) {\n      promise.catch(function (err) {\n        /* istanbul ignore if */\n        if (err && err.name !== 'NavigationDuplicated') {\n          throw err;\n        }\n      });\n    }\n  } else if (url) {\n    replace ? location.replace(url) : location.href = url;\n  }\n}\nfunction functionalRoute(context) {\n  route(context.parent && context.parent.$router, context.props);\n}\nvar routeProps = {\n  url: String,\n  replace: Boolean,\n  to: [String, Object]\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvcm91dGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL3V0aWxzL3JvdXRlci5qcz9mMjc2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVnVlIFJvdXRlciBzdXBwb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3V0ZShyb3V0ZXIsIGNvbmZpZykge1xuICB2YXIgdG8gPSBjb25maWcudG8sXG4gICAgICB1cmwgPSBjb25maWcudXJsLFxuICAgICAgcmVwbGFjZSA9IGNvbmZpZy5yZXBsYWNlO1xuXG4gIGlmICh0byAmJiByb3V0ZXIpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHJvdXRlcltyZXBsYWNlID8gJ3JlcGxhY2UnIDogJ3B1c2gnXSh0byk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblxuICAgIGlmIChwcm9taXNlICYmIHByb21pc2UuY2F0Y2gpIHtcbiAgICAgIHByb21pc2UuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGVyciAmJiBlcnIubmFtZSAhPT0gJ05hdmlnYXRpb25EdXBsaWNhdGVkJykge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHVybCkge1xuICAgIHJlcGxhY2UgPyBsb2NhdGlvbi5yZXBsYWNlKHVybCkgOiBsb2NhdGlvbi5ocmVmID0gdXJsO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZnVuY3Rpb25hbFJvdXRlKGNvbnRleHQpIHtcbiAgcm91dGUoY29udGV4dC5wYXJlbnQgJiYgY29udGV4dC5wYXJlbnQuJHJvdXRlciwgY29udGV4dC5wcm9wcyk7XG59XG5leHBvcnQgdmFyIHJvdXRlUHJvcHMgPSB7XG4gIHVybDogU3RyaW5nLFxuICByZXBsYWNlOiBCb29sZWFuLFxuICB0bzogW1N0cmluZywgT2JqZWN0XVxufTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/router.js\n");

/***/ }),

/***/ "./node_modules/_vant@2.2.16@vant/es/utils/validate/number.js":
/*!********************************************************************!*\
  !*** ./node_modules/_vant@2.2.16@vant/es/utils/validate/number.js ***!
  \********************************************************************/
/*! exports provided: isNumber, isNaN */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNumber\", function() { return isNumber; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNaN\", function() { return isNaN; });\nfunction isNumber(value) {\n  return /^\\d+(\\.\\d+)?$/.test(value);\n}\nfunction isNaN(value) {\n  if (Number.isNaN) {\n    return Number.isNaN(value);\n  } // eslint-disable-next-line no-self-compare\n\n\n  return value !== value;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZhbnRAMi4yLjE2QHZhbnQvZXMvdXRpbHMvdmFsaWRhdGUvbnVtYmVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192YW50QDIuMi4xNkB2YW50L2VzL3V0aWxzL3ZhbGlkYXRlL251bWJlci5qcz9jYTg2Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICByZXR1cm4gL15cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gIGlmIChOdW1iZXIuaXNOYU4pIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlKTtcbiAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5cblxuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vant@2.2.16@vant/es/utils/validate/number.js\n");

/***/ }),

/***/ "./node_modules/_video.js@6.12.1@video.js/dist/video.cjs.js":
/*!******************************************************************!*\
  !*** ./node_modules/_video.js@6.12.1@video.js/dist/video.cjs.js ***!
  \******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/**\n * @license\n * Video.js 6.12.1 <http://videojs.com/>\n * Copyright Brightcove, Inc. <https://www.brightcove.com/>\n * Available under Apache License Version 2.0\n * <https://github.com/videojs/video.js/blob/master/LICENSE>\n *\n * Includes vtt.js <https://github.com/mozilla/vtt.js>\n * Available under Apache License Version 2.0\n * <https://github.com/mozilla/vtt.js/blob/master/LICENSE>\n */\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar window = _interopDefault(__webpack_require__(/*! global/window */ \"./node_modules/_global@4.3.2@global/window.js\"));\nvar document = _interopDefault(__webpack_require__(/*! global/document */ \"./node_modules/_global@4.3.2@global/document.js\"));\nvar tsml = _interopDefault(__webpack_require__(/*! tsml */ \"./node_modules/_tsml@1.0.1@tsml/tsml.js\"));\nvar safeParseTuple = _interopDefault(__webpack_require__(/*! safe-json-parse/tuple */ \"./node_modules/_safe-json-parse@4.0.0@safe-json-parse/tuple.js\"));\nvar xhr = _interopDefault(__webpack_require__(/*! xhr */ \"./node_modules/_xhr@2.4.0@xhr/index.js\"));\nvar vtt = _interopDefault(__webpack_require__(/*! videojs-vtt.js */ \"./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/browser-index.js\"));\n\nvar version = \"6.12.1\";\n\n/**\n * @file browser.js\n * @module browser\n */\nvar USER_AGENT = window.navigator && window.navigator.userAgent || '';\nvar webkitVersionMap = /AppleWebKit\\/([\\d.]+)/i.exec(USER_AGENT);\nvar appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;\n\n/*\n * Device is an iPhone\n *\n * @type {Boolean}\n * @constant\n * @private\n */\nvar IS_IPAD = /iPad/i.test(USER_AGENT);\n\n// The Facebook app's UIWebView identifies as both an iPhone and iPad, so\n// to identify iPhones, we need to exclude iPads.\n// http://artsy.github.io/blog/2012/10/18/the-perils-of-ios-user-agent-sniffing/\nvar IS_IPHONE = /iPhone/i.test(USER_AGENT) && !IS_IPAD;\nvar IS_IPOD = /iPod/i.test(USER_AGENT);\nvar IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;\n\nvar IOS_VERSION = function () {\n  var match = USER_AGENT.match(/OS (\\d+)_/i);\n\n  if (match && match[1]) {\n    return match[1];\n  }\n  return null;\n}();\n\nvar IS_ANDROID = /Android/i.test(USER_AGENT);\nvar ANDROID_VERSION = function () {\n  // This matches Android Major.Minor.Patch versions\n  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned\n  var match = USER_AGENT.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i);\n\n  if (!match) {\n    return null;\n  }\n\n  var major = match[1] && parseFloat(match[1]);\n  var minor = match[2] && parseFloat(match[2]);\n\n  if (major && minor) {\n    return parseFloat(match[1] + '.' + match[2]);\n  } else if (major) {\n    return major;\n  }\n  return null;\n}();\n\n// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser\nvar IS_OLD_ANDROID = IS_ANDROID && /webkit/i.test(USER_AGENT) && ANDROID_VERSION < 2.3;\nvar IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;\n\nvar IS_FIREFOX = /Firefox/i.test(USER_AGENT);\nvar IS_EDGE = /Edge/i.test(USER_AGENT);\nvar IS_CHROME = !IS_EDGE && (/Chrome/i.test(USER_AGENT) || /CriOS/i.test(USER_AGENT));\nvar CHROME_VERSION = function () {\n  var match = USER_AGENT.match(/(Chrome|CriOS)\\/(\\d+)/);\n\n  if (match && match[2]) {\n    return parseFloat(match[2]);\n  }\n  return null;\n}();\nvar IS_IE8 = /MSIE\\s8\\.0/.test(USER_AGENT);\nvar IE_VERSION = function () {\n  var result = /MSIE\\s(\\d+)\\.\\d/.exec(USER_AGENT);\n  var version = result && parseFloat(result[1]);\n\n  if (!version && /Trident\\/7.0/i.test(USER_AGENT) && /rv:11.0/.test(USER_AGENT)) {\n    // IE 11 has a different user agent string than other IE versions\n    version = 11.0;\n  }\n\n  return version;\n}();\n\nvar IS_SAFARI = /Safari/i.test(USER_AGENT) && !IS_CHROME && !IS_ANDROID && !IS_EDGE;\nvar IS_ANY_SAFARI = (IS_SAFARI || IS_IOS) && !IS_CHROME;\n\nvar TOUCH_ENABLED = isReal() && ('ontouchstart' in window || window.navigator.maxTouchPoints || window.DocumentTouch && window.document instanceof window.DocumentTouch);\n\nvar BACKGROUND_SIZE_SUPPORTED = isReal() && 'backgroundSize' in window.document.createElement('video').style;\n\nvar browser = (Object.freeze || Object)({\n\tIS_IPAD: IS_IPAD,\n\tIS_IPHONE: IS_IPHONE,\n\tIS_IPOD: IS_IPOD,\n\tIS_IOS: IS_IOS,\n\tIOS_VERSION: IOS_VERSION,\n\tIS_ANDROID: IS_ANDROID,\n\tANDROID_VERSION: ANDROID_VERSION,\n\tIS_OLD_ANDROID: IS_OLD_ANDROID,\n\tIS_NATIVE_ANDROID: IS_NATIVE_ANDROID,\n\tIS_FIREFOX: IS_FIREFOX,\n\tIS_EDGE: IS_EDGE,\n\tIS_CHROME: IS_CHROME,\n\tCHROME_VERSION: CHROME_VERSION,\n\tIS_IE8: IS_IE8,\n\tIE_VERSION: IE_VERSION,\n\tIS_SAFARI: IS_SAFARI,\n\tIS_ANY_SAFARI: IS_ANY_SAFARI,\n\tTOUCH_ENABLED: TOUCH_ENABLED,\n\tBACKGROUND_SIZE_SUPPORTED: BACKGROUND_SIZE_SUPPORTED\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n  return typeof obj;\n} : function (obj) {\n  return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\n\n\n\n\n\n\n\n\n\n\nvar inherits = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar taggedTemplateLiteralLoose = function (strings, raw) {\n  strings.raw = raw;\n  return strings;\n};\n\n/**\n * @file obj.js\n * @module obj\n */\n\n/**\n * @callback obj:EachCallback\n *\n * @param {Mixed} value\n *        The current key for the object that is being iterated over.\n *\n * @param {string} key\n *        The current key-value for object that is being iterated over\n */\n\n/**\n * @callback obj:ReduceCallback\n *\n * @param {Mixed} accum\n *        The value that is accumulating over the reduce loop.\n *\n * @param {Mixed} value\n *        The current key for the object that is being iterated over.\n *\n * @param {string} key\n *        The current key-value for object that is being iterated over\n *\n * @return {Mixed}\n *         The new accumulated value.\n */\nvar toString = Object.prototype.toString;\n\n/**\n * Get the keys of an Object\n *\n * @param {Object}\n *        The Object to get the keys from\n *\n * @return {string[]}\n *         An array of the keys from the object. Returns an empty array if the\n *         object passed in was invalid or had no keys.\n *\n * @private\n */\nvar keys = function keys(object) {\n  return isObject(object) ? Object.keys(object) : [];\n};\n\n/**\n * Array-like iteration for objects.\n *\n * @param {Object} object\n *        The object to iterate over\n *\n * @param {obj:EachCallback} fn\n *        The callback function which is called for each key in the object.\n */\nfunction each(object, fn) {\n  keys(object).forEach(function (key) {\n    return fn(object[key], key);\n  });\n}\n\n/**\n * Array-like reduce for objects.\n *\n * @param {Object} object\n *        The Object that you want to reduce.\n *\n * @param {Function} fn\n *         A callback function which is called for each key in the object. It\n *         receives the accumulated value and the per-iteration value and key\n *         as arguments.\n *\n * @param {Mixed} [initial = 0]\n *        Starting value\n *\n * @return {Mixed}\n *         The final accumulated value.\n */\nfunction reduce(object, fn) {\n  var initial = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n  return keys(object).reduce(function (accum, key) {\n    return fn(accum, object[key], key);\n  }, initial);\n}\n\n/**\n * Object.assign-style object shallow merge/extend.\n *\n * @param  {Object} target\n * @param  {Object} ...sources\n * @return {Object}\n */\nfunction assign(target) {\n  for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    sources[_key - 1] = arguments[_key];\n  }\n\n  if (Object.assign) {\n    return Object.assign.apply(Object, [target].concat(sources));\n  }\n\n  sources.forEach(function (source) {\n    if (!source) {\n      return;\n    }\n\n    each(source, function (value, key) {\n      target[key] = value;\n    });\n  });\n\n  return target;\n}\n\n/**\n * Returns whether a value is an object of any kind - including DOM nodes,\n * arrays, regular expressions, etc. Not functions, though.\n *\n * This avoids the gotcha where using `typeof` on a `null` value\n * results in `'object'`.\n *\n * @param  {Object} value\n * @return {Boolean}\n */\nfunction isObject(value) {\n  return !!value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object';\n}\n\n/**\n * Returns whether an object appears to be a \"plain\" object - that is, a\n * direct instance of `Object`.\n *\n * @param  {Object} value\n * @return {Boolean}\n */\nfunction isPlain(value) {\n  return isObject(value) && toString.call(value) === '[object Object]' && value.constructor === Object;\n}\n\n/**\n * @file log.js\n * @module log\n */\nvar log = void 0;\n\n// This is the private tracking variable for logging level.\nvar level = 'info';\n\n// This is the private tracking variable for the logging history.\nvar history = [];\n\n/**\n * Log messages to the console and history based on the type of message\n *\n * @private\n * @param  {string} type\n *         The name of the console method to use.\n *\n * @param  {Array} args\n *         The arguments to be passed to the matching console method.\n *\n * @param  {boolean} [stringify]\n *         By default, only old IEs should get console argument stringification,\n *         but this is exposed as a parameter to facilitate testing.\n */\nvar logByType = function logByType(type, args) {\n  var stringify = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : !!IE_VERSION && IE_VERSION < 11;\n\n  var lvl = log.levels[level];\n  var lvlRegExp = new RegExp('^(' + lvl + ')$');\n\n  if (type !== 'log') {\n\n    // Add the type to the front of the message when it's not \"log\".\n    args.unshift(type.toUpperCase() + ':');\n  }\n\n  // Add a clone of the args at this point to history.\n  if (history) {\n    history.push([].concat(args));\n  }\n\n  // Add console prefix after adding to history.\n  args.unshift('VIDEOJS:');\n\n  // If there's no console then don't try to output messages, but they will\n  // still be stored in history.\n  if (!window.console) {\n    return;\n  }\n\n  // Was setting these once outside of this function, but containing them\n  // in the function makes it easier to test cases where console doesn't exist\n  // when the module is executed.\n  var fn = window.console[type];\n\n  if (!fn && type === 'debug') {\n    // Certain browsers don't have support for console.debug. For those, we\n    // should default to the closest comparable log.\n    fn = window.console.info || window.console.log;\n  }\n\n  // Bail out if there's no console or if this type is not allowed by the\n  // current logging level.\n  if (!fn || !lvl || !lvlRegExp.test(type)) {\n    return;\n  }\n\n  // IEs previous to 11 log objects uselessly as \"[object Object]\"; so, JSONify\n  // objects and arrays for those less-capable browsers.\n  if (stringify) {\n    args = args.map(function (a) {\n      if (isObject(a) || Array.isArray(a)) {\n        try {\n          return JSON.stringify(a);\n        } catch (x) {\n          return String(a);\n        }\n      }\n\n      // Cast to string before joining, so we get null and undefined explicitly\n      // included in output (as we would in a modern console).\n      return String(a);\n    }).join(' ');\n  }\n\n  // Old IE versions do not allow .apply() for console methods (they are\n  // reported as objects rather than functions).\n  if (!fn.apply) {\n    fn(args);\n  } else {\n    fn[Array.isArray(args) ? 'apply' : 'call'](window.console, args);\n  }\n};\n\n/**\n * Logs plain debug messages. Similar to `console.log`.\n *\n * @class\n * @param    {Mixed[]} args\n *           One or more messages or objects that should be logged.\n */\nlog = function log() {\n  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  logByType('log', args);\n};\n\n/**\n * Enumeration of available logging levels, where the keys are the level names\n * and the values are `|`-separated strings containing logging methods allowed\n * in that logging level. These strings are used to create a regular expression\n * matching the function name being called.\n *\n * Levels provided by video.js are:\n *\n * - `off`: Matches no calls. Any value that can be cast to `false` will have\n *   this effect. The most restrictive.\n * - `all`: Matches only Video.js-provided functions (`debug`, `log`,\n *   `log.warn`, and `log.error`).\n * - `debug`: Matches `log.debug`, `log`, `log.warn`, and `log.error` calls.\n * - `info` (default): Matches `log`, `log.warn`, and `log.error` calls.\n * - `warn`: Matches `log.warn` and `log.error` calls.\n * - `error`: Matches only `log.error` calls.\n *\n * @type {Object}\n */\nlog.levels = {\n  all: 'debug|log|warn|error',\n  off: '',\n  debug: 'debug|log|warn|error',\n  info: 'log|warn|error',\n  warn: 'warn|error',\n  error: 'error',\n  DEFAULT: level\n};\n\n/**\n * Get or set the current logging level. If a string matching a key from\n * {@link log.levels} is provided, acts as a setter. Regardless of argument,\n * returns the current logging level.\n *\n * @param  {string} [lvl]\n *         Pass to set a new logging level.\n *\n * @return {string}\n *         The current logging level.\n */\nlog.level = function (lvl) {\n  if (typeof lvl === 'string') {\n    if (!log.levels.hasOwnProperty(lvl)) {\n      throw new Error('\"' + lvl + '\" in not a valid log level');\n    }\n    level = lvl;\n  }\n  return level;\n};\n\n/**\n * Returns an array containing everything that has been logged to the history.\n *\n * This array is a shallow clone of the internal history record. However, its\n * contents are _not_ cloned; so, mutating objects inside this array will\n * mutate them in history.\n *\n * @return {Array}\n */\nlog.history = function () {\n  return history ? [].concat(history) : [];\n};\n\n/**\n * Clears the internal history tracking, but does not prevent further history\n * tracking.\n */\nlog.history.clear = function () {\n  if (history) {\n    history.length = 0;\n  }\n};\n\n/**\n * Disable history tracking if it is currently enabled.\n */\nlog.history.disable = function () {\n  if (history !== null) {\n    history.length = 0;\n    history = null;\n  }\n};\n\n/**\n * Enable history tracking if it is currently disabled.\n */\nlog.history.enable = function () {\n  if (history === null) {\n    history = [];\n  }\n};\n\n/**\n * Logs error messages. Similar to `console.error`.\n *\n * @param {Mixed[]} args\n *        One or more messages or objects that should be logged as an error\n */\nlog.error = function () {\n  for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    args[_key2] = arguments[_key2];\n  }\n\n  return logByType('error', args);\n};\n\n/**\n * Logs warning messages. Similar to `console.warn`.\n *\n * @param {Mixed[]} args\n *        One or more messages or objects that should be logged as a warning.\n */\nlog.warn = function () {\n  for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n    args[_key3] = arguments[_key3];\n  }\n\n  return logByType('warn', args);\n};\n\n/**\n * Logs debug messages. Similar to `console.debug`, but may also act as a comparable\n * log if `console.debug` is not available\n *\n * @param {Mixed[]} args\n *        One or more messages or objects that should be logged as debug.\n */\nlog.debug = function () {\n  for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n    args[_key4] = arguments[_key4];\n  }\n\n  return logByType('debug', args);\n};\n\nvar log$1 = log;\n\n/**\n * @file computed-style.js\n * @module computed-style\n */\n/**\n * A safe getComputedStyle with an IE8 fallback.\n *\n * This is needed because in Firefox, if the player is loaded in an iframe with\n * `display:none`, then `getComputedStyle` returns `null`, so, we do a null-check to\n * make sure  that the player doesn't break in these cases.\n *\n * @param {Element} el\n *        The element you want the computed style of\n *\n * @param {string} prop\n *        The property name you want\n *\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n *\n * @static\n * @const\n */\nfunction computedStyle(el, prop) {\n  if (!el || !prop) {\n    return '';\n  }\n\n  if (typeof window.getComputedStyle === 'function') {\n    var cs = window.getComputedStyle(el);\n\n    return cs ? cs[prop] : '';\n  }\n\n  return el.currentStyle[prop] || '';\n}\n\nvar _templateObject = taggedTemplateLiteralLoose(['Setting attributes in the second argument of createEl()\\n                has been deprecated. Use the third argument instead.\\n                createEl(type, properties, attributes). Attempting to set ', ' to ', '.'], ['Setting attributes in the second argument of createEl()\\n                has been deprecated. Use the third argument instead.\\n                createEl(type, properties, attributes). Attempting to set ', ' to ', '.']);\n\n/**\n * @file dom.js\n * @module dom\n */\n/**\n * Detect if a value is a string with any non-whitespace characters.\n *\n * @param {string} str\n *        The string to check\n *\n * @return {boolean}\n *         - True if the string is non-blank\n *         - False otherwise\n *\n */\nfunction isNonBlankString(str) {\n  return typeof str === 'string' && /\\S/.test(str);\n}\n\n/**\n * Throws an error if the passed string has whitespace. This is used by\n * class methods to be relatively consistent with the classList API.\n *\n * @param {string} str\n *         The string to check for whitespace.\n *\n * @throws {Error}\n *         Throws an error if there is whitespace in the string.\n *\n */\nfunction throwIfWhitespace(str) {\n  if (/\\s/.test(str)) {\n    throw new Error('class has illegal whitespace characters');\n  }\n}\n\n/**\n * Produce a regular expression for matching a className within an elements className.\n *\n * @param {string} className\n *         The className to generate the RegExp for.\n *\n * @return {RegExp}\n *         The RegExp that will check for a specific `className` in an elements\n *         className.\n */\nfunction classRegExp(className) {\n  return new RegExp('(^|\\\\s)' + className + '($|\\\\s)');\n}\n\n/**\n * Whether the current DOM interface appears to be real.\n *\n * @return {Boolean}\n */\nfunction isReal() {\n  return (\n\n    // Both document and window will never be undefined thanks to `global`.\n    document === window.document &&\n\n    // In IE < 9, DOM methods return \"object\" as their type, so all we can\n    // confidently check is that it exists.\n    typeof document.createElement !== 'undefined'\n  );\n}\n\n/**\n * Determines, via duck typing, whether or not a value is a DOM element.\n *\n * @param {Mixed} value\n *        The thing to check\n *\n * @return {boolean}\n *         - True if it is a DOM element\n *         - False otherwise\n */\nfunction isEl(value) {\n  return isObject(value) && value.nodeType === 1;\n}\n\n/**\n * Determines if the current DOM is embedded in an iframe.\n *\n * @return {boolean}\n *\n */\nfunction isInFrame() {\n\n  // We need a try/catch here because Safari will throw errors when attempting\n  // to get either `parent` or `self`\n  try {\n    return window.parent !== window.self;\n  } catch (x) {\n    return true;\n  }\n}\n\n/**\n * Creates functions to query the DOM using a given method.\n *\n * @param {string} method\n *         The method to create the query with.\n *\n * @return {Function}\n *         The query method\n */\nfunction createQuerier(method) {\n  return function (selector, context) {\n    if (!isNonBlankString(selector)) {\n      return document[method](null);\n    }\n    if (isNonBlankString(context)) {\n      context = document.querySelector(context);\n    }\n\n    var ctx = isEl(context) ? context : document;\n\n    return ctx[method] && ctx[method](selector);\n  };\n}\n\n/**\n * Creates an element and applies properties.\n *\n * @param {string} [tagName='div']\n *         Name of tag to be created.\n *\n * @param {Object} [properties={}]\n *         Element properties to be applied.\n *\n * @param {Object} [attributes={}]\n *         Element attributes to be applied.\n *\n * @param {String|Element|TextNode|Array|Function} [content]\n *         Contents for the element (see: {@link dom:normalizeContent})\n *\n * @return {Element}\n *         The element that was created.\n */\nfunction createEl() {\n  var tagName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div';\n  var properties = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var content = arguments[3];\n\n  var el = document.createElement(tagName);\n\n  Object.getOwnPropertyNames(properties).forEach(function (propName) {\n    var val = properties[propName];\n\n    // See #2176\n    // We originally were accepting both properties and attributes in the\n    // same object, but that doesn't work so well.\n    if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {\n      log$1.warn(tsml(_templateObject, propName, val));\n      el.setAttribute(propName, val);\n\n      // Handle textContent since it's not supported everywhere and we have a\n      // method for it.\n    } else if (propName === 'textContent') {\n      textContent(el, val);\n    } else {\n      el[propName] = val;\n    }\n  });\n\n  Object.getOwnPropertyNames(attributes).forEach(function (attrName) {\n    el.setAttribute(attrName, attributes[attrName]);\n  });\n\n  if (content) {\n    appendContent(el, content);\n  }\n\n  return el;\n}\n\n/**\n * Injects text into an element, replacing any existing contents entirely.\n *\n * @param {Element} el\n *        The element to add text content into\n *\n * @param {string} text\n *        The text content to add.\n *\n * @return {Element}\n *         The element with added text content.\n */\nfunction textContent(el, text) {\n  if (typeof el.textContent === 'undefined') {\n    el.innerText = text;\n  } else {\n    el.textContent = text;\n  }\n  return el;\n}\n\n/**\n * Insert an element as the first child node of another\n *\n * @param {Element} child\n *        Element to insert\n *\n * @param {Element} parent\n *        Element to insert child into\n */\nfunction prependTo(child, parent) {\n  if (parent.firstChild) {\n    parent.insertBefore(child, parent.firstChild);\n  } else {\n    parent.appendChild(child);\n  }\n}\n\n/**\n * Check if an element has a CSS class\n *\n * @param {Element} element\n *        Element to check\n *\n * @param {string} classToCheck\n *        Class name to check for\n *\n * @return {boolean}\n *         - True if the element had the class\n *         - False otherwise.\n *\n * @throws {Error}\n *         Throws an error if `classToCheck` has white space.\n */\nfunction hasClass(element, classToCheck) {\n  throwIfWhitespace(classToCheck);\n  if (element.classList) {\n    return element.classList.contains(classToCheck);\n  }\n  return classRegExp(classToCheck).test(element.className);\n}\n\n/**\n * Add a CSS class name to an element\n *\n * @param {Element} element\n *        Element to add class name to.\n *\n * @param {string} classToAdd\n *        Class name to add.\n *\n * @return {Element}\n *         The dom element with the added class name.\n */\nfunction addClass(element, classToAdd) {\n  if (element.classList) {\n    element.classList.add(classToAdd);\n\n    // Don't need to `throwIfWhitespace` here because `hasElClass` will do it\n    // in the case of classList not being supported.\n  } else if (!hasClass(element, classToAdd)) {\n    element.className = (element.className + ' ' + classToAdd).trim();\n  }\n\n  return element;\n}\n\n/**\n * Remove a CSS class name from an element\n *\n * @param {Element} element\n *        Element to remove a class name from.\n *\n * @param {string} classToRemove\n *        Class name to remove\n *\n * @return {Element}\n *         The dom element with class name removed.\n */\nfunction removeClass(element, classToRemove) {\n  if (element.classList) {\n    element.classList.remove(classToRemove);\n  } else {\n    throwIfWhitespace(classToRemove);\n    element.className = element.className.split(/\\s+/).filter(function (c) {\n      return c !== classToRemove;\n    }).join(' ');\n  }\n\n  return element;\n}\n\n/**\n * The callback definition for toggleElClass.\n *\n * @callback Dom~PredicateCallback\n * @param {Element} element\n *        The DOM element of the Component.\n *\n * @param {string} classToToggle\n *        The `className` that wants to be toggled\n *\n * @return {boolean|undefined}\n *         - If true the `classToToggle` will get added to `element`.\n *         - If false the `classToToggle` will get removed from `element`.\n *         - If undefined this callback will be ignored\n */\n\n/**\n * Adds or removes a CSS class name on an element depending on an optional\n * condition or the presence/absence of the class name.\n *\n * @param {Element} element\n *        The element to toggle a class name on.\n *\n * @param {string} classToToggle\n *        The class that should be toggled\n *\n * @param {boolean|PredicateCallback} [predicate]\n *        See the return value for {@link Dom~PredicateCallback}\n *\n * @return {Element}\n *         The element with a class that has been toggled.\n */\nfunction toggleClass(element, classToToggle, predicate) {\n\n  // This CANNOT use `classList` internally because IE does not support the\n  // second parameter to the `classList.toggle()` method! Which is fine because\n  // `classList` will be used by the add/remove functions.\n  var has = hasClass(element, classToToggle);\n\n  if (typeof predicate === 'function') {\n    predicate = predicate(element, classToToggle);\n  }\n\n  if (typeof predicate !== 'boolean') {\n    predicate = !has;\n  }\n\n  // If the necessary class operation matches the current state of the\n  // element, no action is required.\n  if (predicate === has) {\n    return;\n  }\n\n  if (predicate) {\n    addClass(element, classToToggle);\n  } else {\n    removeClass(element, classToToggle);\n  }\n\n  return element;\n}\n\n/**\n * Apply attributes to an HTML element.\n *\n * @param {Element} el\n *        Element to add attributes to.\n *\n * @param {Object} [attributes]\n *        Attributes to be applied.\n */\nfunction setAttributes(el, attributes) {\n  Object.getOwnPropertyNames(attributes).forEach(function (attrName) {\n    var attrValue = attributes[attrName];\n\n    if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {\n      el.removeAttribute(attrName);\n    } else {\n      el.setAttribute(attrName, attrValue === true ? '' : attrValue);\n    }\n  });\n}\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributes are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n *\n * @param {Element} tag\n *        Element from which to get tag attributes.\n *\n * @return {Object}\n *         All attributes of the element.\n */\nfunction getAttributes(tag) {\n  var obj = {};\n\n  // known boolean attributes\n  // we can check for matching boolean properties, but older browsers\n  // won't know about HTML5 boolean attributes that we still read from\n  var knownBooleans = ',' + 'autoplay,controls,playsinline,loop,muted,default,defaultMuted' + ',';\n\n  if (tag && tag.attributes && tag.attributes.length > 0) {\n    var attrs = tag.attributes;\n\n    for (var i = attrs.length - 1; i >= 0; i--) {\n      var attrName = attrs[i].name;\n      var attrVal = attrs[i].value;\n\n      // check for known booleans\n      // the matching element property will return a value for typeof\n      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(',' + attrName + ',') !== -1) {\n        // the value of an included boolean attribute is typically an empty\n        // string ('') which would equal false if we just check for a false value.\n        // we also don't want support bad code like autoplay='false'\n        attrVal = attrVal !== null ? true : false;\n      }\n\n      obj[attrName] = attrVal;\n    }\n  }\n\n  return obj;\n}\n\n/**\n * Get the value of an element's attribute\n *\n * @param {Element} el\n *        A DOM element\n *\n * @param {string} attribute\n *        Attribute to get the value of\n *\n * @return {string}\n *         value of the attribute\n */\nfunction getAttribute(el, attribute) {\n  return el.getAttribute(attribute);\n}\n\n/**\n * Set the value of an element's attribute\n *\n * @param {Element} el\n *        A DOM element\n *\n * @param {string} attribute\n *        Attribute to set\n *\n * @param {string} value\n *        Value to set the attribute to\n */\nfunction setAttribute(el, attribute, value) {\n  el.setAttribute(attribute, value);\n}\n\n/**\n * Remove an element's attribute\n *\n * @param {Element} el\n *        A DOM element\n *\n * @param {string} attribute\n *        Attribute to remove\n */\nfunction removeAttribute(el, attribute) {\n  el.removeAttribute(attribute);\n}\n\n/**\n * Attempt to block the ability to select text while dragging controls\n */\nfunction blockTextSelection() {\n  document.body.focus();\n  document.onselectstart = function () {\n    return false;\n  };\n}\n\n/**\n * Turn off text selection blocking\n */\nfunction unblockTextSelection() {\n  document.onselectstart = function () {\n    return true;\n  };\n}\n\n/**\n * Identical to the native `getBoundingClientRect` function, but ensures that\n * the method is supported at all (it is in all browsers we claim to support)\n * and that the element is in the DOM before continuing.\n *\n * This wrapper function also shims properties which are not provided by some\n * older browsers (namely, IE8).\n *\n * Additionally, some browsers do not support adding properties to a\n * `ClientRect`/`DOMRect` object; so, we shallow-copy it with the standard\n * properties (except `x` and `y` which are not widely supported). This helps\n * avoid implementations where keys are non-enumerable.\n *\n * @param  {Element} el\n *         Element whose `ClientRect` we want to calculate.\n *\n * @return {Object|undefined}\n *         Always returns a plain\n */\nfunction getBoundingClientRect(el) {\n  if (el && el.getBoundingClientRect && el.parentNode) {\n    var rect = el.getBoundingClientRect();\n    var result = {};\n\n    ['bottom', 'height', 'left', 'right', 'top', 'width'].forEach(function (k) {\n      if (rect[k] !== undefined) {\n        result[k] = rect[k];\n      }\n    });\n\n    if (!result.height) {\n      result.height = parseFloat(computedStyle(el, 'height'));\n    }\n\n    if (!result.width) {\n      result.width = parseFloat(computedStyle(el, 'width'));\n    }\n\n    return result;\n  }\n}\n\n/**\n * The postion of a DOM element on the page.\n *\n * @typedef {Object} module:dom~Position\n *\n * @property {number} left\n *           Pixels to the left\n *\n * @property {number} top\n *           Pixels on top\n */\n\n/**\n * Offset Left.\n * getBoundingClientRect technique from\n * John Resig\n *\n * @see http://ejohn.org/blog/getboundingclientrect-is-awesome/\n *\n * @param {Element} el\n *        Element from which to get offset\n *\n * @return {module:dom~Position}\n *         The position of the element that was passed in.\n */\nfunction findPosition(el) {\n  var box = void 0;\n\n  if (el.getBoundingClientRect && el.parentNode) {\n    box = el.getBoundingClientRect();\n  }\n\n  if (!box) {\n    return {\n      left: 0,\n      top: 0\n    };\n  }\n\n  var docEl = document.documentElement;\n  var body = document.body;\n\n  var clientLeft = docEl.clientLeft || body.clientLeft || 0;\n  var scrollLeft = window.pageXOffset || body.scrollLeft;\n  var left = box.left + scrollLeft - clientLeft;\n\n  var clientTop = docEl.clientTop || body.clientTop || 0;\n  var scrollTop = window.pageYOffset || body.scrollTop;\n  var top = box.top + scrollTop - clientTop;\n\n  // Android sometimes returns slightly off decimal values, so need to round\n  return {\n    left: Math.round(left),\n    top: Math.round(top)\n  };\n}\n\n/**\n * x and y coordinates for a dom element or mouse pointer\n *\n * @typedef {Object} Dom~Coordinates\n *\n * @property {number} x\n *           x coordinate in pixels\n *\n * @property {number} y\n *           y coordinate in pixels\n */\n\n/**\n * Get pointer position in element\n * Returns an object with x and y coordinates.\n * The base on the coordinates are the bottom left of the element.\n *\n * @param {Element} el\n *        Element on which to get the pointer position on\n *\n * @param {EventTarget~Event} event\n *        Event object\n *\n * @return {Dom~Coordinates}\n *         A Coordinates object corresponding to the mouse position.\n *\n */\nfunction getPointerPosition(el, event) {\n  var position = {};\n  var box = findPosition(el);\n  var boxW = el.offsetWidth;\n  var boxH = el.offsetHeight;\n\n  var boxY = box.top;\n  var boxX = box.left;\n  var pageY = event.pageY;\n  var pageX = event.pageX;\n\n  if (event.changedTouches) {\n    pageX = event.changedTouches[0].pageX;\n    pageY = event.changedTouches[0].pageY;\n  }\n\n  position.y = Math.max(0, Math.min(1, (boxY - pageY + boxH) / boxH));\n  position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));\n\n  return position;\n}\n\n/**\n * Determines, via duck typing, whether or not a value is a text node.\n *\n * @param {Mixed} value\n *        Check if this value is a text node.\n *\n * @return {boolean}\n *         - True if it is a text node\n *         - False otherwise\n */\nfunction isTextNode(value) {\n  return isObject(value) && value.nodeType === 3;\n}\n\n/**\n * Empties the contents of an element.\n *\n * @param {Element} el\n *        The element to empty children from\n *\n * @return {Element}\n *         The element with no children\n */\nfunction emptyEl(el) {\n  while (el.firstChild) {\n    el.removeChild(el.firstChild);\n  }\n  return el;\n}\n\n/**\n * Normalizes content for eventual insertion into the DOM.\n *\n * This allows a wide range of content definition methods, but protects\n * from falling into the trap of simply writing to `innerHTML`, which is\n * an XSS concern.\n *\n * The content for an element can be passed in multiple types and\n * combinations, whose behavior is as follows:\n *\n * @param {String|Element|TextNode|Array|Function} content\n *        - String: Normalized into a text node.\n *        - Element/TextNode: Passed through.\n *        - Array: A one-dimensional array of strings, elements, nodes, or functions\n *          (which return single strings, elements, or nodes).\n *        - Function: If the sole argument, is expected to produce a string, element,\n *          node, or array as defined above.\n *\n * @return {Array}\n *         All of the content that was passed in normalized.\n */\nfunction normalizeContent(content) {\n\n  // First, invoke content if it is a function. If it produces an array,\n  // that needs to happen before normalization.\n  if (typeof content === 'function') {\n    content = content();\n  }\n\n  // Next up, normalize to an array, so one or many items can be normalized,\n  // filtered, and returned.\n  return (Array.isArray(content) ? content : [content]).map(function (value) {\n\n    // First, invoke value if it is a function to produce a new value,\n    // which will be subsequently normalized to a Node of some kind.\n    if (typeof value === 'function') {\n      value = value();\n    }\n\n    if (isEl(value) || isTextNode(value)) {\n      return value;\n    }\n\n    if (typeof value === 'string' && /\\S/.test(value)) {\n      return document.createTextNode(value);\n    }\n  }).filter(function (value) {\n    return value;\n  });\n}\n\n/**\n * Normalizes and appends content to an element.\n *\n * @param {Element} el\n *        Element to append normalized content to.\n *\n *\n * @param {String|Element|TextNode|Array|Function} content\n *        See the `content` argument of {@link dom:normalizeContent}\n *\n * @return {Element}\n *         The element with appended normalized content.\n */\nfunction appendContent(el, content) {\n  normalizeContent(content).forEach(function (node) {\n    return el.appendChild(node);\n  });\n  return el;\n}\n\n/**\n * Normalizes and inserts content into an element; this is identical to\n * `appendContent()`, except it empties the element first.\n *\n * @param {Element} el\n *        Element to insert normalized content into.\n *\n * @param {String|Element|TextNode|Array|Function} content\n *        See the `content` argument of {@link dom:normalizeContent}\n *\n * @return {Element}\n *         The element with inserted normalized content.\n *\n */\nfunction insertContent(el, content) {\n  return appendContent(emptyEl(el), content);\n}\n\n/**\n * Check if event was a single left click\n *\n * @param {EventTarget~Event} event\n *        Event object\n *\n * @return {boolean}\n *         - True if a left click\n *         - False if not a left click\n */\nfunction isSingleLeftClick(event) {\n  // Note: if you create something draggable, be sure to\n  // call it on both `mousedown` and `mousemove` event,\n  // otherwise `mousedown` should be enough for a button\n\n  if (event.button === undefined && event.buttons === undefined) {\n    // Why do we need `buttons` ?\n    // Because, middle mouse sometimes have this:\n    // e.button === 0 and e.buttons === 4\n    // Furthermore, we want to prevent combination click, something like\n    // HOLD middlemouse then left click, that would be\n    // e.button === 0, e.buttons === 5\n    // just `button` is not gonna work\n\n    // Alright, then what this block does ?\n    // this is for chrome `simulate mobile devices`\n    // I want to support this as well\n\n    return true;\n  }\n\n  if (event.button === 0 && event.buttons === undefined) {\n    // Touch screen, sometimes on some specific device, `buttons`\n    // doesn't have anything (safari on ios, blackberry...)\n\n    return true;\n  }\n\n  if (IE_VERSION === 9) {\n    // Ignore IE9\n\n    return true;\n  }\n\n  if (event.button !== 0 || event.buttons !== 1) {\n    // This is the reason we have those if else block above\n    // if any special case we can catch and let it slide\n    // we do it above, when get to here, this definitely\n    // is-not-left-click\n\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Finds a single DOM element matching `selector` within the optional\n * `context` of another DOM element (defaulting to `document`).\n *\n * @param {string} selector\n *        A valid CSS selector, which will be passed to `querySelector`.\n *\n * @param {Element|String} [context=document]\n *        A DOM element within which to query. Can also be a selector\n *        string in which case the first matching element will be used\n *        as context. If missing (or no element matches selector), falls\n *        back to `document`.\n *\n * @return {Element|null}\n *         The element that was found or null.\n */\nvar $ = createQuerier('querySelector');\n\n/**\n * Finds a all DOM elements matching `selector` within the optional\n * `context` of another DOM element (defaulting to `document`).\n *\n * @param {string} selector\n *           A valid CSS selector, which will be passed to `querySelectorAll`.\n *\n * @param {Element|String} [context=document]\n *           A DOM element within which to query. Can also be a selector\n *           string in which case the first matching element will be used\n *           as context. If missing (or no element matches selector), falls\n *           back to `document`.\n *\n * @return {NodeList}\n *         A element list of elements that were found. Will be empty if none were found.\n *\n */\nvar $$ = createQuerier('querySelectorAll');\n\n\n\nvar Dom = (Object.freeze || Object)({\n\tisReal: isReal,\n\tisEl: isEl,\n\tisInFrame: isInFrame,\n\tcreateEl: createEl,\n\ttextContent: textContent,\n\tprependTo: prependTo,\n\thasClass: hasClass,\n\taddClass: addClass,\n\tremoveClass: removeClass,\n\ttoggleClass: toggleClass,\n\tsetAttributes: setAttributes,\n\tgetAttributes: getAttributes,\n\tgetAttribute: getAttribute,\n\tsetAttribute: setAttribute,\n\tremoveAttribute: removeAttribute,\n\tblockTextSelection: blockTextSelection,\n\tunblockTextSelection: unblockTextSelection,\n\tgetBoundingClientRect: getBoundingClientRect,\n\tfindPosition: findPosition,\n\tgetPointerPosition: getPointerPosition,\n\tisTextNode: isTextNode,\n\temptyEl: emptyEl,\n\tnormalizeContent: normalizeContent,\n\tappendContent: appendContent,\n\tinsertContent: insertContent,\n\tisSingleLeftClick: isSingleLeftClick,\n\t$: $,\n\t$$: $$\n});\n\n/**\n * @file guid.js\n * @module guid\n */\n\n/**\n * Unique ID for an element or function\n * @type {Number}\n */\nvar _guid = 1;\n\n/**\n * Get a unique auto-incrementing ID by number that has not been returned before.\n *\n * @return {number}\n *         A new unique ID.\n */\nfunction newGUID() {\n  return _guid++;\n}\n\n/**\n * @file dom-data.js\n * @module dom-data\n */\n/**\n * Element Data Store.\n *\n * Allows for binding data to an element without putting it directly on the\n * element. Ex. Event listeners are stored here.\n * (also from jsninja.com, slightly modified and updated for closure compiler)\n *\n * @type {Object}\n * @private\n */\nvar elData = {};\n\n/*\n * Unique attribute name to store an element's guid in\n *\n * @type {String}\n * @constant\n * @private\n */\nvar elIdAttr = 'vdata' + new Date().getTime();\n\n/**\n * Returns the cache object where data for an element is stored\n *\n * @param {Element} el\n *        Element to store data for.\n *\n * @return {Object}\n *         The cache object for that el that was passed in.\n */\nfunction getData(el) {\n  var id = el[elIdAttr];\n\n  if (!id) {\n    id = el[elIdAttr] = newGUID();\n  }\n\n  if (!elData[id]) {\n    elData[id] = {};\n  }\n\n  return elData[id];\n}\n\n/**\n * Returns whether or not an element has cached data\n *\n * @param {Element} el\n *        Check if this element has cached data.\n *\n * @return {boolean}\n *         - True if the DOM element has cached data.\n *         - False otherwise.\n */\nfunction hasData(el) {\n  var id = el[elIdAttr];\n\n  if (!id) {\n    return false;\n  }\n\n  return !!Object.getOwnPropertyNames(elData[id]).length;\n}\n\n/**\n * Delete data for the element from the cache and the guid attr from getElementById\n *\n * @param {Element} el\n *        Remove cached data for this element.\n */\nfunction removeData(el) {\n  var id = el[elIdAttr];\n\n  if (!id) {\n    return;\n  }\n\n  // Remove all stored data\n  delete elData[id];\n\n  // Remove the elIdAttr property from the DOM node\n  try {\n    delete el[elIdAttr];\n  } catch (e) {\n    if (el.removeAttribute) {\n      el.removeAttribute(elIdAttr);\n    } else {\n      // IE doesn't appear to support removeAttribute on the document element\n      el[elIdAttr] = null;\n    }\n  }\n}\n\n/**\n * @file events.js. An Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)\n * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)\n * This should work very similarly to jQuery's events, however it's based off the book version which isn't as\n * robust as jquery's, so there's probably some differences.\n *\n * @module events\n */\n\n/**\n * Clean up the listener cache and dispatchers\n *\n * @param {Element|Object} elem\n *        Element to clean up\n *\n * @param {string} type\n *        Type of event to clean up\n */\nfunction _cleanUpEvents(elem, type) {\n  var data = getData(elem);\n\n  // Remove the events of a particular type if there are none left\n  if (data.handlers[type].length === 0) {\n    delete data.handlers[type];\n    // data.handlers[type] = null;\n    // Setting to null was causing an error with data.handlers\n\n    // Remove the meta-handler from the element\n    if (elem.removeEventListener) {\n      elem.removeEventListener(type, data.dispatcher, false);\n    } else if (elem.detachEvent) {\n      elem.detachEvent('on' + type, data.dispatcher);\n    }\n  }\n\n  // Remove the events object if there are no types left\n  if (Object.getOwnPropertyNames(data.handlers).length <= 0) {\n    delete data.handlers;\n    delete data.dispatcher;\n    delete data.disabled;\n  }\n\n  // Finally remove the element data if there is no data left\n  if (Object.getOwnPropertyNames(data).length === 0) {\n    removeData(elem);\n  }\n}\n\n/**\n * Loops through an array of event types and calls the requested method for each type.\n *\n * @param {Function} fn\n *        The event method we want to use.\n *\n * @param {Element|Object} elem\n *        Element or object to bind listeners to\n *\n * @param {string} type\n *        Type of event to bind to.\n *\n * @param {EventTarget~EventListener} callback\n *        Event listener.\n */\nfunction _handleMultipleEvents(fn, elem, types, callback) {\n  types.forEach(function (type) {\n    // Call the event method for each one of the types\n    fn(elem, type, callback);\n  });\n}\n\n/**\n * Fix a native event to have standard property values\n *\n * @param {Object} event\n *        Event object to fix.\n *\n * @return {Object}\n *         Fixed event object.\n */\nfunction fixEvent(event) {\n\n  function returnTrue() {\n    return true;\n  }\n\n  function returnFalse() {\n    return false;\n  }\n\n  // Test if fixing up is needed\n  // Used to check if !event.stopPropagation instead of isPropagationStopped\n  // But native events return true for stopPropagation, but don't have\n  // other expected methods like isPropagationStopped. Seems to be a problem\n  // with the Javascript Ninja code. So we're just overriding all events now.\n  if (!event || !event.isPropagationStopped) {\n    var old = event || window.event;\n\n    event = {};\n    // Clone the old object so that we can modify the values event = {};\n    // IE8 Doesn't like when you mess with native event properties\n    // Firefox returns false for event.hasOwnProperty('type') and other props\n    //  which makes copying more difficult.\n    // TODO: Probably best to create a whitelist of event props\n    for (var key in old) {\n      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y\n      // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation\n      // and webkitMovementX/Y\n      if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' && key !== 'webkitMovementX' && key !== 'webkitMovementY') {\n        // Chrome 32+ warns if you try to copy deprecated returnValue, but\n        // we still want to if preventDefault isn't supported (IE8).\n        if (!(key === 'returnValue' && old.preventDefault)) {\n          event[key] = old[key];\n        }\n      }\n    }\n\n    // The event occurred on this element\n    if (!event.target) {\n      event.target = event.srcElement || document;\n    }\n\n    // Handle which other element the event is related to\n    if (!event.relatedTarget) {\n      event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;\n    }\n\n    // Stop the default browser action\n    event.preventDefault = function () {\n      if (old.preventDefault) {\n        old.preventDefault();\n      }\n      event.returnValue = false;\n      old.returnValue = false;\n      event.defaultPrevented = true;\n    };\n\n    event.defaultPrevented = false;\n\n    // Stop the event from bubbling\n    event.stopPropagation = function () {\n      if (old.stopPropagation) {\n        old.stopPropagation();\n      }\n      event.cancelBubble = true;\n      old.cancelBubble = true;\n      event.isPropagationStopped = returnTrue;\n    };\n\n    event.isPropagationStopped = returnFalse;\n\n    // Stop the event from bubbling and executing other handlers\n    event.stopImmediatePropagation = function () {\n      if (old.stopImmediatePropagation) {\n        old.stopImmediatePropagation();\n      }\n      event.isImmediatePropagationStopped = returnTrue;\n      event.stopPropagation();\n    };\n\n    event.isImmediatePropagationStopped = returnFalse;\n\n    // Handle mouse position\n    if (event.clientX !== null && event.clientX !== undefined) {\n      var doc = document.documentElement;\n      var body = document.body;\n\n      event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n      event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);\n    }\n\n    // Handle key presses\n    event.which = event.charCode || event.keyCode;\n\n    // Fix button for mouse clicks:\n    // 0 == left; 1 == middle; 2 == right\n    if (event.button !== null && event.button !== undefined) {\n\n      // The following is disabled because it does not pass videojs-standard\n      // and... yikes.\n      /* eslint-disable */\n      event.button = event.button & 1 ? 0 : event.button & 4 ? 1 : event.button & 2 ? 2 : 0;\n      /* eslint-enable */\n    }\n  }\n\n  // Returns fixed-up instance\n  return event;\n}\n\n/**\n * Whether passive event listeners are supported\n */\nvar _supportsPassive = false;\n\n(function () {\n  try {\n    var opts = Object.defineProperty({}, 'passive', {\n      get: function get() {\n        _supportsPassive = true;\n      }\n    });\n\n    window.addEventListener('test', null, opts);\n    window.removeEventListener('test', null, opts);\n  } catch (e) {\n    // disregard\n  }\n})();\n\n/**\n * Touch events Chrome expects to be passive\n */\nvar passiveEvents = ['touchstart', 'touchmove'];\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @param {Element|Object} elem\n *        Element or object to bind listeners to\n *\n * @param {string|string[]} type\n *        Type of event to bind to.\n *\n * @param {EventTarget~EventListener} fn\n *        Event listener.\n */\nfunction on(elem, type, fn) {\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(on, elem, type, fn);\n  }\n\n  var data = getData(elem);\n\n  // We need a place to store all our handler data\n  if (!data.handlers) {\n    data.handlers = {};\n  }\n\n  if (!data.handlers[type]) {\n    data.handlers[type] = [];\n  }\n\n  if (!fn.guid) {\n    fn.guid = newGUID();\n  }\n\n  data.handlers[type].push(fn);\n\n  if (!data.dispatcher) {\n    data.disabled = false;\n\n    data.dispatcher = function (event, hash) {\n\n      if (data.disabled) {\n        return;\n      }\n\n      event = fixEvent(event);\n\n      var handlers = data.handlers[event.type];\n\n      if (handlers) {\n        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.\n        var handlersCopy = handlers.slice(0);\n\n        for (var m = 0, n = handlersCopy.length; m < n; m++) {\n          if (event.isImmediatePropagationStopped()) {\n            break;\n          } else {\n            try {\n              handlersCopy[m].call(elem, event, hash);\n            } catch (e) {\n              log$1.error(e);\n            }\n          }\n        }\n      }\n    };\n  }\n\n  if (data.handlers[type].length === 1) {\n    if (elem.addEventListener) {\n      var options = false;\n\n      if (_supportsPassive && passiveEvents.indexOf(type) > -1) {\n        options = { passive: true };\n      }\n      elem.addEventListener(type, data.dispatcher, options);\n    } else if (elem.attachEvent) {\n      elem.attachEvent('on' + type, data.dispatcher);\n    }\n  }\n}\n\n/**\n * Removes event listeners from an element\n *\n * @param {Element|Object} elem\n *        Object to remove listeners from.\n *\n * @param {string|string[]} [type]\n *        Type of listener to remove. Don't include to remove all events from element.\n *\n * @param {EventTarget~EventListener} [fn]\n *        Specific listener to remove. Don't include to remove listeners for an event\n *        type.\n */\nfunction off(elem, type, fn) {\n  // Don't want to add a cache object through getElData if not needed\n  if (!hasData(elem)) {\n    return;\n  }\n\n  var data = getData(elem);\n\n  // If no events exist, nothing to unbind\n  if (!data.handlers) {\n    return;\n  }\n\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(off, elem, type, fn);\n  }\n\n  // Utility function\n  var removeType = function removeType(el, t) {\n    data.handlers[t] = [];\n    _cleanUpEvents(el, t);\n  };\n\n  // Are we removing all bound events?\n  if (type === undefined) {\n    for (var t in data.handlers) {\n      if (Object.prototype.hasOwnProperty.call(data.handlers || {}, t)) {\n        removeType(elem, t);\n      }\n    }\n    return;\n  }\n\n  var handlers = data.handlers[type];\n\n  // If no handlers exist, nothing to unbind\n  if (!handlers) {\n    return;\n  }\n\n  // If no listener was provided, remove all listeners for type\n  if (!fn) {\n    removeType(elem, type);\n    return;\n  }\n\n  // We're only removing a single handler\n  if (fn.guid) {\n    for (var n = 0; n < handlers.length; n++) {\n      if (handlers[n].guid === fn.guid) {\n        handlers.splice(n--, 1);\n      }\n    }\n  }\n\n  _cleanUpEvents(elem, type);\n}\n\n/**\n * Trigger an event for an element\n *\n * @param {Element|Object} elem\n *        Element to trigger an event on\n *\n * @param {EventTarget~Event|string} event\n *        A string (the type) or an event object with a type attribute\n *\n * @param {Object} [hash]\n *        data hash to pass along with the event\n *\n * @return {boolean|undefined}\n *         - Returns the opposite of `defaultPrevented` if default was prevented\n *         - Otherwise returns undefined\n */\nfunction trigger(elem, event, hash) {\n  // Fetches element data and a reference to the parent (for bubbling).\n  // Don't want to add a data object to cache for every parent,\n  // so checking hasElData first.\n  var elemData = hasData(elem) ? getData(elem) : {};\n  var parent = elem.parentNode || elem.ownerDocument;\n  // type = event.type || event,\n  // handler;\n\n  // If an event name was passed as a string, creates an event out of it\n  if (typeof event === 'string') {\n    event = { type: event, target: elem };\n  } else if (!event.target) {\n    event.target = elem;\n  }\n\n  // Normalizes the event properties.\n  event = fixEvent(event);\n\n  // If the passed element has a dispatcher, executes the established handlers.\n  if (elemData.dispatcher) {\n    elemData.dispatcher.call(elem, event, hash);\n  }\n\n  // Unless explicitly stopped or the event does not bubble (e.g. media events)\n  // recursively calls this function to bubble the event up the DOM.\n  if (parent && !event.isPropagationStopped() && event.bubbles === true) {\n    trigger.call(null, parent, event, hash);\n\n    // If at the top of the DOM, triggers the default action unless disabled.\n  } else if (!parent && !event.defaultPrevented) {\n    var targetData = getData(event.target);\n\n    // Checks if the target has a default action for this event.\n    if (event.target[event.type]) {\n      // Temporarily disables event dispatching on the target as we have already executed the handler.\n      targetData.disabled = true;\n      // Executes the default action.\n      if (typeof event.target[event.type] === 'function') {\n        event.target[event.type]();\n      }\n      // Re-enables event dispatching.\n      targetData.disabled = false;\n    }\n  }\n\n  // Inform the triggerer if the default was prevented by returning false\n  return !event.defaultPrevented;\n}\n\n/**\n * Trigger a listener only once for an event\n *\n * @param {Element|Object} elem\n *        Element or object to bind to.\n *\n * @param {string|string[]} type\n *        Name/type of event\n *\n * @param {Event~EventListener} fn\n *        Event Listener function\n */\nfunction one(elem, type, fn) {\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(one, elem, type, fn);\n  }\n  var func = function func() {\n    off(elem, type, func);\n    fn.apply(this, arguments);\n  };\n\n  // copy the guid to the new function so it can removed using the original function's ID\n  func.guid = fn.guid = fn.guid || newGUID();\n  on(elem, type, func);\n}\n\nvar Events = (Object.freeze || Object)({\n\tfixEvent: fixEvent,\n\ton: on,\n\toff: off,\n\ttrigger: trigger,\n\tone: one\n});\n\n/**\n * @file setup.js - Functions for setting up a player without\n * user interaction based on the data-setup `attribute` of the video tag.\n *\n * @module setup\n */\nvar _windowLoaded = false;\nvar videojs$2 = void 0;\n\n/**\n * Set up any tags that have a data-setup `attribute` when the player is started.\n */\nvar autoSetup = function autoSetup() {\n\n  // Protect against breakage in non-browser environments and check global autoSetup option.\n  if (!isReal() || videojs$2.options.autoSetup === false) {\n    return;\n  }\n\n  // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*\n  // var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));\n  // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));\n  // var mediaEls = vids.concat(audios);\n\n  // Because IE8 doesn't support calling slice on a node list, we need to loop\n  // through each list of elements to build up a new, combined list of elements.\n  var vids = document.getElementsByTagName('video');\n  var audios = document.getElementsByTagName('audio');\n  var divs = document.getElementsByTagName('video-js');\n  var mediaEls = [];\n\n  if (vids && vids.length > 0) {\n    for (var i = 0, e = vids.length; i < e; i++) {\n      mediaEls.push(vids[i]);\n    }\n  }\n\n  if (audios && audios.length > 0) {\n    for (var _i = 0, _e = audios.length; _i < _e; _i++) {\n      mediaEls.push(audios[_i]);\n    }\n  }\n\n  if (divs && divs.length > 0) {\n    for (var _i2 = 0, _e2 = divs.length; _i2 < _e2; _i2++) {\n      mediaEls.push(divs[_i2]);\n    }\n  }\n\n  // Check if any media elements exist\n  if (mediaEls && mediaEls.length > 0) {\n\n    for (var _i3 = 0, _e3 = mediaEls.length; _i3 < _e3; _i3++) {\n      var mediaEl = mediaEls[_i3];\n\n      // Check if element exists, has getAttribute func.\n      // IE seems to consider typeof el.getAttribute == 'object' instead of\n      // 'function' like expected, at least when loading the player immediately.\n      if (mediaEl && mediaEl.getAttribute) {\n\n        // Make sure this player hasn't already been set up.\n        if (mediaEl.player === undefined) {\n          var options = mediaEl.getAttribute('data-setup');\n\n          // Check if data-setup attr exists.\n          // We only auto-setup if they've added the data-setup attr.\n          if (options !== null) {\n            // Create new video.js instance.\n            videojs$2(mediaEl);\n          }\n        }\n\n        // If getAttribute isn't defined, we need to wait for the DOM.\n      } else {\n        autoSetupTimeout(1);\n        break;\n      }\n    }\n\n    // No videos were found, so keep looping unless page is finished loading.\n  } else if (!_windowLoaded) {\n    autoSetupTimeout(1);\n  }\n};\n\n/**\n * Wait until the page is loaded before running autoSetup. This will be called in\n * autoSetup if `hasLoaded` returns false.\n *\n * @param {number} wait\n *        How long to wait in ms\n *\n * @param {module:videojs} [vjs]\n *        The videojs library function\n */\nfunction autoSetupTimeout(wait, vjs) {\n  if (vjs) {\n    videojs$2 = vjs;\n  }\n\n  window.setTimeout(autoSetup, wait);\n}\n\nif (isReal() && document.readyState === 'complete') {\n  _windowLoaded = true;\n} else {\n  /**\n   * Listen for the load event on window, and set _windowLoaded to true.\n   *\n   * @listens load\n   */\n  one(window, 'load', function () {\n    _windowLoaded = true;\n  });\n}\n\n/**\n * @file stylesheet.js\n * @module stylesheet\n */\n/**\n * Create a DOM syle element given a className for it.\n *\n * @param {string} className\n *        The className to add to the created style element.\n *\n * @return {Element}\n *         The element that was created.\n */\nvar createStyleElement = function createStyleElement(className) {\n  var style = document.createElement('style');\n\n  style.className = className;\n\n  return style;\n};\n\n/**\n * Add text to a DOM element.\n *\n * @param {Element} el\n *        The Element to add text content to.\n *\n * @param {string} content\n *        The text to add to the element.\n */\nvar setTextContent = function setTextContent(el, content) {\n  if (el.styleSheet) {\n    el.styleSheet.cssText = content;\n  } else {\n    el.textContent = content;\n  }\n};\n\n/**\n * @file fn.js\n * @module fn\n */\n/**\n * Bind (a.k.a proxy or Context). A simple method for changing the context of a function\n * It also stores a unique id on the function so it can be easily removed from events.\n *\n * @param {Mixed} context\n *        The object to bind as scope.\n *\n * @param {Function} fn\n *        The function to be bound to a scope.\n *\n * @param {number} [uid]\n *        An optional unique ID for the function to be set\n *\n * @return {Function}\n *         The new function that will be bound into the context given\n */\nvar bind = function bind(context, fn, uid) {\n  // Make sure the function has a unique ID\n  if (!fn.guid) {\n    fn.guid = newGUID();\n  }\n\n  // Create the new function that changes the context\n  var bound = function bound() {\n    return fn.apply(context, arguments);\n  };\n\n  // Allow for the ability to individualize this function\n  // Needed in the case where multiple objects might share the same prototype\n  // IF both items add an event listener with the same function, then you try to remove just one\n  // it will remove both because they both have the same guid.\n  // when using this, you need to use the bind method when you remove the listener as well.\n  // currently used in text tracks\n  bound.guid = uid ? uid + '_' + fn.guid : fn.guid;\n\n  return bound;\n};\n\n/**\n * Wraps the given function, `fn`, with a new function that only invokes `fn`\n * at most once per every `wait` milliseconds.\n *\n * @param  {Function} fn\n *         The function to be throttled.\n *\n * @param  {Number}   wait\n *         The number of milliseconds by which to throttle.\n *\n * @return {Function}\n */\nvar throttle = function throttle(fn, wait) {\n  var last = Date.now();\n\n  var throttled = function throttled() {\n    var now = Date.now();\n\n    if (now - last >= wait) {\n      fn.apply(undefined, arguments);\n      last = now;\n    }\n  };\n\n  return throttled;\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked.\n *\n * Inspired by lodash and underscore implementations.\n *\n * @param  {Function} func\n *         The function to wrap with debounce behavior.\n *\n * @param  {number} wait\n *         The number of milliseconds to wait after the last invocation.\n *\n * @param  {boolean} [immediate]\n *         Whether or not to invoke the function immediately upon creation.\n *\n * @param  {Object} [context=window]\n *         The \"context\" in which the debounced function should debounce. For\n *         example, if this function should be tied to a Video.js player,\n *         the player can be passed here. Alternatively, defaults to the\n *         global `window` object.\n *\n * @return {Function}\n *         A debounced function.\n */\nvar debounce = function debounce(func, wait, immediate) {\n  var context = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : window;\n\n  var timeout = void 0;\n\n  /* eslint-disable consistent-this */\n  return function () {\n    var self = this;\n    var args = arguments;\n\n    var _later = function later() {\n      timeout = null;\n      _later = null;\n      if (!immediate) {\n        func.apply(self, args);\n      }\n    };\n\n    if (!timeout && immediate) {\n      func.apply(self, args);\n    }\n\n    context.clearTimeout(timeout);\n    timeout = context.setTimeout(_later, wait);\n  };\n  /* eslint-enable consistent-this */\n};\n\n/**\n * @file src/js/event-target.js\n */\n/**\n * `EventTarget` is a class that can have the same API as the DOM `EventTarget`. It\n * adds shorthand functions that wrap around lengthy functions. For example:\n * the `on` function is a wrapper around `addEventListener`.\n *\n * @see [EventTarget Spec]{@link https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget}\n * @class EventTarget\n */\nvar EventTarget = function EventTarget() {};\n\n/**\n * A Custom DOM event.\n *\n * @typedef {Object} EventTarget~Event\n * @see [Properties]{@link https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent}\n */\n\n/**\n * All event listeners should follow the following format.\n *\n * @callback EventTarget~EventListener\n * @this {EventTarget}\n *\n * @param {EventTarget~Event} event\n *        the event that triggered this function\n *\n * @param {Object} [hash]\n *        hash of data sent during the event\n */\n\n/**\n * An object containing event names as keys and booleans as values.\n *\n * > NOTE: If an event name is set to a true value here {@link EventTarget#trigger}\n *         will have extra functionality. See that function for more information.\n *\n * @property EventTarget.prototype.allowedEvents_\n * @private\n */\nEventTarget.prototype.allowedEvents_ = {};\n\n/**\n * Adds an `event listener` to an instance of an `EventTarget`. An `event listener` is a\n * function that will get called when an event with a certain name gets triggered.\n *\n * @param {string|string[]} type\n *        An event name or an array of event names.\n *\n * @param {EventTarget~EventListener} fn\n *        The function to call with `EventTarget`s\n */\nEventTarget.prototype.on = function (type, fn) {\n  // Remove the addEventListener alias before calling Events.on\n  // so we don't get into an infinite type loop\n  var ael = this.addEventListener;\n\n  this.addEventListener = function () {};\n  on(this, type, fn);\n  this.addEventListener = ael;\n};\n\n/**\n * An alias of {@link EventTarget#on}. Allows `EventTarget` to mimic\n * the standard DOM API.\n *\n * @function\n * @see {@link EventTarget#on}\n */\nEventTarget.prototype.addEventListener = EventTarget.prototype.on;\n\n/**\n * Removes an `event listener` for a specific event from an instance of `EventTarget`.\n * This makes it so that the `event listener` will no longer get called when the\n * named event happens.\n *\n * @param {string|string[]} type\n *        An event name or an array of event names.\n *\n * @param {EventTarget~EventListener} fn\n *        The function to remove.\n */\nEventTarget.prototype.off = function (type, fn) {\n  off(this, type, fn);\n};\n\n/**\n * An alias of {@link EventTarget#off}. Allows `EventTarget` to mimic\n * the standard DOM API.\n *\n * @function\n * @see {@link EventTarget#off}\n */\nEventTarget.prototype.removeEventListener = EventTarget.prototype.off;\n\n/**\n * This function will add an `event listener` that gets triggered only once. After the\n * first trigger it will get removed. This is like adding an `event listener`\n * with {@link EventTarget#on} that calls {@link EventTarget#off} on itself.\n *\n * @param {string|string[]} type\n *        An event name or an array of event names.\n *\n * @param {EventTarget~EventListener} fn\n *        The function to be called once for each event name.\n */\nEventTarget.prototype.one = function (type, fn) {\n  // Remove the addEventListener alialing Events.on\n  // so we don't get into an infinite type loop\n  var ael = this.addEventListener;\n\n  this.addEventListener = function () {};\n  one(this, type, fn);\n  this.addEventListener = ael;\n};\n\n/**\n * This function causes an event to happen. This will then cause any `event listeners`\n * that are waiting for that event, to get called. If there are no `event listeners`\n * for an event then nothing will happen.\n *\n * If the name of the `Event` that is being triggered is in `EventTarget.allowedEvents_`.\n * Trigger will also call the `on` + `uppercaseEventName` function.\n *\n * Example:\n * 'click' is in `EventTarget.allowedEvents_`, so, trigger will attempt to call\n * `onClick` if it exists.\n *\n * @param {string|EventTarget~Event|Object} event\n *        The name of the event, an `Event`, or an object with a key of type set to\n *        an event name.\n */\nEventTarget.prototype.trigger = function (event) {\n  var type = event.type || event;\n\n  if (typeof event === 'string') {\n    event = { type: type };\n  }\n  event = fixEvent(event);\n\n  if (this.allowedEvents_[type] && this['on' + type]) {\n    this['on' + type](event);\n  }\n\n  trigger(this, event);\n};\n\n/**\n * An alias of {@link EventTarget#trigger}. Allows `EventTarget` to mimic\n * the standard DOM API.\n *\n * @function\n * @see {@link EventTarget#trigger}\n */\nEventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;\n\n/**\n * @file mixins/evented.js\n * @module evented\n */\n/**\n * Returns whether or not an object has had the evented mixin applied.\n *\n * @param  {Object} object\n *         An object to test.\n *\n * @return {boolean}\n *         Whether or not the object appears to be evented.\n */\nvar isEvented = function isEvented(object) {\n  return object instanceof EventTarget || !!object.eventBusEl_ && ['on', 'one', 'off', 'trigger'].every(function (k) {\n    return typeof object[k] === 'function';\n  });\n};\n\n/**\n * Whether a value is a valid event type - non-empty string or array.\n *\n * @private\n * @param  {string|Array} type\n *         The type value to test.\n *\n * @return {boolean}\n *         Whether or not the type is a valid event type.\n */\nvar isValidEventType = function isValidEventType(type) {\n  return (\n    // The regex here verifies that the `type` contains at least one non-\n    // whitespace character.\n    typeof type === 'string' && /\\S/.test(type) || Array.isArray(type) && !!type.length\n  );\n};\n\n/**\n * Validates a value to determine if it is a valid event target. Throws if not.\n *\n * @private\n * @throws {Error}\n *         If the target does not appear to be a valid event target.\n *\n * @param  {Object} target\n *         The object to test.\n */\nvar validateTarget = function validateTarget(target) {\n  if (!target.nodeName && !isEvented(target)) {\n    throw new Error('Invalid target; must be a DOM node or evented object.');\n  }\n};\n\n/**\n * Validates a value to determine if it is a valid event target. Throws if not.\n *\n * @private\n * @throws {Error}\n *         If the type does not appear to be a valid event type.\n *\n * @param  {string|Array} type\n *         The type to test.\n */\nvar validateEventType = function validateEventType(type) {\n  if (!isValidEventType(type)) {\n    throw new Error('Invalid event type; must be a non-empty string or array.');\n  }\n};\n\n/**\n * Validates a value to determine if it is a valid listener. Throws if not.\n *\n * @private\n * @throws {Error}\n *         If the listener is not a function.\n *\n * @param  {Function} listener\n *         The listener to test.\n */\nvar validateListener = function validateListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new Error('Invalid listener; must be a function.');\n  }\n};\n\n/**\n * Takes an array of arguments given to `on()` or `one()`, validates them, and\n * normalizes them into an object.\n *\n * @private\n * @param  {Object} self\n *         The evented object on which `on()` or `one()` was called. This\n *         object will be bound as the `this` value for the listener.\n *\n * @param  {Array} args\n *         An array of arguments passed to `on()` or `one()`.\n *\n * @return {Object}\n *         An object containing useful values for `on()` or `one()` calls.\n */\nvar normalizeListenArgs = function normalizeListenArgs(self, args) {\n\n  // If the number of arguments is less than 3, the target is always the\n  // evented object itself.\n  var isTargetingSelf = args.length < 3 || args[0] === self || args[0] === self.eventBusEl_;\n  var target = void 0;\n  var type = void 0;\n  var listener = void 0;\n\n  if (isTargetingSelf) {\n    target = self.eventBusEl_;\n\n    // Deal with cases where we got 3 arguments, but we are still listening to\n    // the evented object itself.\n    if (args.length >= 3) {\n      args.shift();\n    }\n\n    type = args[0];\n    listener = args[1];\n  } else {\n    target = args[0];\n    type = args[1];\n    listener = args[2];\n  }\n\n  validateTarget(target);\n  validateEventType(type);\n  validateListener(listener);\n\n  listener = bind(self, listener);\n\n  return { isTargetingSelf: isTargetingSelf, target: target, type: type, listener: listener };\n};\n\n/**\n * Adds the listener to the event type(s) on the target, normalizing for\n * the type of target.\n *\n * @private\n * @param  {Element|Object} target\n *         A DOM node or evented object.\n *\n * @param  {string} method\n *         The event binding method to use (\"on\" or \"one\").\n *\n * @param  {string|Array} type\n *         One or more event type(s).\n *\n * @param  {Function} listener\n *         A listener function.\n */\nvar listen = function listen(target, method, type, listener) {\n  validateTarget(target);\n\n  if (target.nodeName) {\n    Events[method](target, type, listener);\n  } else {\n    target[method](type, listener);\n  }\n};\n\n/**\n * Contains methods that provide event capabilites to an object which is passed\n * to {@link module:evented|evented}.\n *\n * @mixin EventedMixin\n */\nvar EventedMixin = {\n\n  /**\n   * Add a listener to an event (or events) on this object or another evented\n   * object.\n   *\n   * @param  {string|Array|Element|Object} targetOrType\n   *         If this is a string or array, it represents the event type(s)\n   *         that will trigger the listener.\n   *\n   *         Another evented object can be passed here instead, which will\n   *         cause the listener to listen for events on _that_ object.\n   *\n   *         In either case, the listener's `this` value will be bound to\n   *         this object.\n   *\n   * @param  {string|Array|Function} typeOrListener\n   *         If the first argument was a string or array, this should be the\n   *         listener function. Otherwise, this is a string or array of event\n   *         type(s).\n   *\n   * @param  {Function} [listener]\n   *         If the first argument was another evented object, this will be\n   *         the listener function.\n   */\n  on: function on$$1() {\n    var _this = this;\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    var _normalizeListenArgs = normalizeListenArgs(this, args),\n        isTargetingSelf = _normalizeListenArgs.isTargetingSelf,\n        target = _normalizeListenArgs.target,\n        type = _normalizeListenArgs.type,\n        listener = _normalizeListenArgs.listener;\n\n    listen(target, 'on', type, listener);\n\n    // If this object is listening to another evented object.\n    if (!isTargetingSelf) {\n\n      // If this object is disposed, remove the listener.\n      var removeListenerOnDispose = function removeListenerOnDispose() {\n        return _this.off(target, type, listener);\n      };\n\n      // Use the same function ID as the listener so we can remove it later it\n      // using the ID of the original listener.\n      removeListenerOnDispose.guid = listener.guid;\n\n      // Add a listener to the target's dispose event as well. This ensures\n      // that if the target is disposed BEFORE this object, we remove the\n      // removal listener that was just added. Otherwise, we create a memory leak.\n      var removeRemoverOnTargetDispose = function removeRemoverOnTargetDispose() {\n        return _this.off('dispose', removeListenerOnDispose);\n      };\n\n      // Use the same function ID as the listener so we can remove it later\n      // it using the ID of the original listener.\n      removeRemoverOnTargetDispose.guid = listener.guid;\n\n      listen(this, 'on', 'dispose', removeListenerOnDispose);\n      listen(target, 'on', 'dispose', removeRemoverOnTargetDispose);\n    }\n  },\n\n\n  /**\n   * Add a listener to an event (or events) on this object or another evented\n   * object. The listener will only be called once and then removed.\n   *\n   * @param  {string|Array|Element|Object} targetOrType\n   *         If this is a string or array, it represents the event type(s)\n   *         that will trigger the listener.\n   *\n   *         Another evented object can be passed here instead, which will\n   *         cause the listener to listen for events on _that_ object.\n   *\n   *         In either case, the listener's `this` value will be bound to\n   *         this object.\n   *\n   * @param  {string|Array|Function} typeOrListener\n   *         If the first argument was a string or array, this should be the\n   *         listener function. Otherwise, this is a string or array of event\n   *         type(s).\n   *\n   * @param  {Function} [listener]\n   *         If the first argument was another evented object, this will be\n   *         the listener function.\n   */\n  one: function one$$1() {\n    var _this2 = this;\n\n    for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    var _normalizeListenArgs2 = normalizeListenArgs(this, args),\n        isTargetingSelf = _normalizeListenArgs2.isTargetingSelf,\n        target = _normalizeListenArgs2.target,\n        type = _normalizeListenArgs2.type,\n        listener = _normalizeListenArgs2.listener;\n\n    // Targeting this evented object.\n\n\n    if (isTargetingSelf) {\n      listen(target, 'one', type, listener);\n\n      // Targeting another evented object.\n    } else {\n      var wrapper = function wrapper() {\n        for (var _len3 = arguments.length, largs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n          largs[_key3] = arguments[_key3];\n        }\n\n        _this2.off(target, type, wrapper);\n        listener.apply(null, largs);\n      };\n\n      // Use the same function ID as the listener so we can remove it later\n      // it using the ID of the original listener.\n      wrapper.guid = listener.guid;\n      listen(target, 'one', type, wrapper);\n    }\n  },\n\n\n  /**\n   * Removes listener(s) from event(s) on an evented object.\n   *\n   * @param  {string|Array|Element|Object} [targetOrType]\n   *         If this is a string or array, it represents the event type(s).\n   *\n   *         Another evented object can be passed here instead, in which case\n   *         ALL 3 arguments are _required_.\n   *\n   * @param  {string|Array|Function} [typeOrListener]\n   *         If the first argument was a string or array, this may be the\n   *         listener function. Otherwise, this is a string or array of event\n   *         type(s).\n   *\n   * @param  {Function} [listener]\n   *         If the first argument was another evented object, this will be\n   *         the listener function; otherwise, _all_ listeners bound to the\n   *         event type(s) will be removed.\n   */\n  off: function off$$1(targetOrType, typeOrListener, listener) {\n\n    // Targeting this evented object.\n    if (!targetOrType || isValidEventType(targetOrType)) {\n      off(this.eventBusEl_, targetOrType, typeOrListener);\n\n      // Targeting another evented object.\n    } else {\n      var target = targetOrType;\n      var type = typeOrListener;\n\n      // Fail fast and in a meaningful way!\n      validateTarget(target);\n      validateEventType(type);\n      validateListener(listener);\n\n      // Ensure there's at least a guid, even if the function hasn't been used\n      listener = bind(this, listener);\n\n      // Remove the dispose listener on this evented object, which was given\n      // the same guid as the event listener in on().\n      this.off('dispose', listener);\n\n      if (target.nodeName) {\n        off(target, type, listener);\n        off(target, 'dispose', listener);\n      } else if (isEvented(target)) {\n        target.off(type, listener);\n        target.off('dispose', listener);\n      }\n    }\n  },\n\n\n  /**\n   * Fire an event on this evented object, causing its listeners to be called.\n   *\n   * @param   {string|Object} event\n   *          An event type or an object with a type property.\n   *\n   * @param   {Object} [hash]\n   *          An additional object to pass along to listeners.\n   *\n   * @returns {boolean}\n   *          Whether or not the default behavior was prevented.\n   */\n  trigger: function trigger$$1(event, hash) {\n    return trigger(this.eventBusEl_, event, hash);\n  }\n};\n\n/**\n * Applies {@link module:evented~EventedMixin|EventedMixin} to a target object.\n *\n * @param  {Object} target\n *         The object to which to add event methods.\n *\n * @param  {Object} [options={}]\n *         Options for customizing the mixin behavior.\n *\n * @param  {String} [options.eventBusKey]\n *         By default, adds a `eventBusEl_` DOM element to the target object,\n *         which is used as an event bus. If the target object already has a\n *         DOM element that should be used, pass its key here.\n *\n * @return {Object}\n *         The target object.\n */\nfunction evented(target) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var eventBusKey = options.eventBusKey;\n\n  // Set or create the eventBusEl_.\n\n  if (eventBusKey) {\n    if (!target[eventBusKey].nodeName) {\n      throw new Error('The eventBusKey \"' + eventBusKey + '\" does not refer to an element.');\n    }\n    target.eventBusEl_ = target[eventBusKey];\n  } else {\n    target.eventBusEl_ = createEl('span', { className: 'vjs-event-bus' });\n  }\n\n  assign(target, EventedMixin);\n\n  // When any evented object is disposed, it removes all its listeners.\n  target.on('dispose', function () {\n    target.off();\n    window.setTimeout(function () {\n      target.eventBusEl_ = null;\n    }, 0);\n  });\n\n  return target;\n}\n\n/**\n * @file mixins/stateful.js\n * @module stateful\n */\n/**\n * Contains methods that provide statefulness to an object which is passed\n * to {@link module:stateful}.\n *\n * @mixin StatefulMixin\n */\nvar StatefulMixin = {\n\n  /**\n   * A hash containing arbitrary keys and values representing the state of\n   * the object.\n   *\n   * @type {Object}\n   */\n  state: {},\n\n  /**\n   * Set the state of an object by mutating its\n   * {@link module:stateful~StatefulMixin.state|state} object in place.\n   *\n   * @fires   module:stateful~StatefulMixin#statechanged\n   * @param   {Object|Function} stateUpdates\n   *          A new set of properties to shallow-merge into the plugin state.\n   *          Can be a plain object or a function returning a plain object.\n   *\n   * @returns {Object|undefined}\n   *          An object containing changes that occurred. If no changes\n   *          occurred, returns `undefined`.\n   */\n  setState: function setState(stateUpdates) {\n    var _this = this;\n\n    // Support providing the `stateUpdates` state as a function.\n    if (typeof stateUpdates === 'function') {\n      stateUpdates = stateUpdates();\n    }\n\n    var changes = void 0;\n\n    each(stateUpdates, function (value, key) {\n\n      // Record the change if the value is different from what's in the\n      // current state.\n      if (_this.state[key] !== value) {\n        changes = changes || {};\n        changes[key] = {\n          from: _this.state[key],\n          to: value\n        };\n      }\n\n      _this.state[key] = value;\n    });\n\n    // Only trigger \"statechange\" if there were changes AND we have a trigger\n    // function. This allows us to not require that the target object be an\n    // evented object.\n    if (changes && isEvented(this)) {\n\n      /**\n       * An event triggered on an object that is both\n       * {@link module:stateful|stateful} and {@link module:evented|evented}\n       * indicating that its state has changed.\n       *\n       * @event    module:stateful~StatefulMixin#statechanged\n       * @type     {Object}\n       * @property {Object} changes\n       *           A hash containing the properties that were changed and\n       *           the values they were changed `from` and `to`.\n       */\n      this.trigger({\n        changes: changes,\n        type: 'statechanged'\n      });\n    }\n\n    return changes;\n  }\n};\n\n/**\n * Applies {@link module:stateful~StatefulMixin|StatefulMixin} to a target\n * object.\n *\n * If the target object is {@link module:evented|evented} and has a\n * `handleStateChanged` method, that method will be automatically bound to the\n * `statechanged` event on itself.\n *\n * @param   {Object} target\n *          The object to be made stateful.\n *\n * @param   {Object} [defaultState]\n *          A default set of properties to populate the newly-stateful object's\n *          `state` property.\n *\n * @returns {Object}\n *          Returns the `target`.\n */\nfunction stateful(target, defaultState) {\n  assign(target, StatefulMixin);\n\n  // This happens after the mixing-in because we need to replace the `state`\n  // added in that step.\n  target.state = assign({}, target.state, defaultState);\n\n  // Auto-bind the `handleStateChanged` method of the target object if it exists.\n  if (typeof target.handleStateChanged === 'function' && isEvented(target)) {\n    target.on('statechanged', target.handleStateChanged);\n  }\n\n  return target;\n}\n\n/**\n * @file to-title-case.js\n * @module to-title-case\n */\n\n/**\n * Uppercase the first letter of a string.\n *\n * @param {string} string\n *        String to be uppercased\n *\n * @return {string}\n *         The string with an uppercased first letter\n */\nfunction toTitleCase(string) {\n  if (typeof string !== 'string') {\n    return string;\n  }\n\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Compares the TitleCase versions of the two strings for equality.\n *\n * @param {string} str1\n *        The first string to compare\n *\n * @param {string} str2\n *        The second string to compare\n *\n * @return {boolean}\n *         Whether the TitleCase versions of the strings are equal\n */\nfunction titleCaseEquals(str1, str2) {\n  return toTitleCase(str1) === toTitleCase(str2);\n}\n\n/**\n * @file merge-options.js\n * @module merge-options\n */\n/**\n * Deep-merge one or more options objects, recursively merging **only** plain\n * object properties.\n *\n * @param   {Object[]} sources\n *          One or more objects to merge into a new object.\n *\n * @returns {Object}\n *          A new object that is the merged result of all sources.\n */\nfunction mergeOptions() {\n  var result = {};\n\n  for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) {\n    sources[_key] = arguments[_key];\n  }\n\n  sources.forEach(function (source) {\n    if (!source) {\n      return;\n    }\n\n    each(source, function (value, key) {\n      if (!isPlain(value)) {\n        result[key] = value;\n        return;\n      }\n\n      if (!isPlain(result[key])) {\n        result[key] = {};\n      }\n\n      result[key] = mergeOptions(result[key], value);\n    });\n  });\n\n  return result;\n}\n\n/**\n * Player Component - Base class for all UI objects\n *\n * @file component.js\n */\n/**\n * Base class for all UI Components.\n * Components are UI objects which represent both a javascript object and an element\n * in the DOM. They can be children of other components, and can have\n * children themselves.\n *\n * Components can also use methods from {@link EventTarget}\n */\n\nvar Component = function () {\n\n  /**\n   * A callback that is called when a component is ready. Does not have any\n   * paramters and any callback value will be ignored.\n   *\n   * @callback Component~ReadyCallback\n   * @this Component\n   */\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Object[]} [options.children]\n   *        An array of children objects to intialize this component with. Children objects have\n   *        a name property that will be used if more than one component of the same type needs to be\n   *        added.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        Function that gets called when the `Component` is ready.\n   */\n  function Component(player, options, ready) {\n    classCallCheck(this, Component);\n\n\n    // The component might be the player itself and we can't pass `this` to super\n    if (!player && this.play) {\n      this.player_ = player = this; // eslint-disable-line\n    } else {\n      this.player_ = player;\n    }\n\n    // Make a copy of prototype.options_ to protect against overriding defaults\n    this.options_ = mergeOptions({}, this.options_);\n\n    // Updated options with supplied options\n    options = this.options_ = mergeOptions(this.options_, options);\n\n    // Get ID from options or options element if one is supplied\n    this.id_ = options.id || options.el && options.el.id;\n\n    // If there was no ID from the options, generate one\n    if (!this.id_) {\n      // Don't require the player ID function in the case of mock players\n      var id = player && player.id && player.id() || 'no_player';\n\n      this.id_ = id + '_component_' + newGUID();\n    }\n\n    this.name_ = options.name || null;\n\n    // Create element if one wasn't provided in options\n    if (options.el) {\n      this.el_ = options.el;\n    } else if (options.createEl !== false) {\n      this.el_ = this.createEl();\n    }\n\n    // if evented is anything except false, we want to mixin in evented\n    if (options.evented !== false) {\n      // Make this an evented object and use `el_`, if available, as its event bus\n      evented(this, { eventBusKey: this.el_ ? 'el_' : null });\n    }\n    stateful(this, this.constructor.defaultState);\n\n    this.children_ = [];\n    this.childIndex_ = {};\n    this.childNameIndex_ = {};\n\n    // Add any child components in options\n    if (options.initChildren !== false) {\n      this.initChildren();\n    }\n\n    this.ready(ready);\n    // Don't want to trigger ready here or it will before init is actually\n    // finished for all children that run this constructor\n\n    if (options.reportTouchActivity !== false) {\n      this.enableTouchActivity();\n    }\n  }\n\n  /**\n   * Dispose of the `Component` and all child components.\n   *\n   * @fires Component#dispose\n   */\n\n\n  Component.prototype.dispose = function dispose() {\n\n    /**\n     * Triggered when a `Component` is disposed.\n     *\n     * @event Component#dispose\n     * @type {EventTarget~Event}\n     *\n     * @property {boolean} [bubbles=false]\n     *           set to false so that the close event does not\n     *           bubble up\n     */\n    this.trigger({ type: 'dispose', bubbles: false });\n\n    // Dispose all children.\n    if (this.children_) {\n      for (var i = this.children_.length - 1; i >= 0; i--) {\n        if (this.children_[i].dispose) {\n          this.children_[i].dispose();\n        }\n      }\n    }\n\n    // Delete child references\n    this.children_ = null;\n    this.childIndex_ = null;\n    this.childNameIndex_ = null;\n\n    if (this.el_) {\n      // Remove element from DOM\n      if (this.el_.parentNode) {\n        this.el_.parentNode.removeChild(this.el_);\n      }\n\n      removeData(this.el_);\n      this.el_ = null;\n    }\n\n    // remove reference to the player after disposing of the element\n    this.player_ = null;\n  };\n\n  /**\n   * Return the {@link Player} that the `Component` has attached to.\n   *\n   * @return {Player}\n   *         The player that this `Component` has attached to.\n   */\n\n\n  Component.prototype.player = function player() {\n    return this.player_;\n  };\n\n  /**\n   * Deep merge of options objects with new options.\n   * > Note: When both `obj` and `options` contain properties whose values are objects.\n   *         The two properties get merged using {@link module:mergeOptions}\n   *\n   * @param {Object} obj\n   *        The object that contains new options.\n   *\n   * @return {Object}\n   *         A new object of `this.options_` and `obj` merged together.\n   *\n   * @deprecated since version 5\n   */\n\n\n  Component.prototype.options = function options(obj) {\n    log$1.warn('this.options() has been deprecated and will be moved to the constructor in 6.0');\n\n    if (!obj) {\n      return this.options_;\n    }\n\n    this.options_ = mergeOptions(this.options_, obj);\n    return this.options_;\n  };\n\n  /**\n   * Get the `Component`s DOM element\n   *\n   * @return {Element}\n   *         The DOM element for this `Component`.\n   */\n\n\n  Component.prototype.el = function el() {\n    return this.el_;\n  };\n\n  /**\n   * Create the `Component`s DOM element.\n   *\n   * @param {string} [tagName]\n   *        Element's DOM node type. e.g. 'div'\n   *\n   * @param {Object} [properties]\n   *        An object of properties that should be set.\n   *\n   * @param {Object} [attributes]\n   *        An object of attributes that should be set.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  Component.prototype.createEl = function createEl$$1(tagName, properties, attributes) {\n    return createEl(tagName, properties, attributes);\n  };\n\n  /**\n   * Localize a string given the string in english.\n   *\n   * If tokens are provided, it'll try and run a simple token replacement on the provided string.\n   * The tokens it looks for look like `{1}` with the index being 1-indexed into the tokens array.\n   *\n   * If a `defaultValue` is provided, it'll use that over `string`,\n   * if a value isn't found in provided language files.\n   * This is useful if you want to have a descriptive key for token replacement\n   * but have a succinct localized string and not require `en.json` to be included.\n   *\n   * Currently, it is used for the progress bar timing.\n   * ```js\n   * {\n   *   \"progress bar timing: currentTime={1} duration={2}\": \"{1} of {2}\"\n   * }\n   * ```\n   * It is then used like so:\n   * ```js\n   * this.localize('progress bar timing: currentTime={1} duration{2}',\n   *               [this.player_.currentTime(), this.player_.duration()],\n   *               '{1} of {2}');\n   * ```\n   *\n   * Which outputs something like: `01:23 of 24:56`.\n   *\n   *\n   * @param {string} string\n   *        The string to localize and the key to lookup in the language files.\n   * @param {string[]} [tokens]\n   *        If the current item has token replacements, provide the tokens here.\n   * @param {string} [defaultValue]\n   *        Defaults to `string`. Can be a default value to use for token replacement\n   *        if the lookup key is needed to be separate.\n   *\n   * @return {string}\n   *         The localized string or if no localization exists the english string.\n   */\n\n\n  Component.prototype.localize = function localize(string, tokens) {\n    var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : string;\n\n    var code = this.player_.language && this.player_.language();\n    var languages = this.player_.languages && this.player_.languages();\n    var language = languages && languages[code];\n    var primaryCode = code && code.split('-')[0];\n    var primaryLang = languages && languages[primaryCode];\n\n    var localizedString = defaultValue;\n\n    if (language && language[string]) {\n      localizedString = language[string];\n    } else if (primaryLang && primaryLang[string]) {\n      localizedString = primaryLang[string];\n    }\n\n    if (tokens) {\n      localizedString = localizedString.replace(/\\{(\\d+)\\}/g, function (match, index) {\n        var value = tokens[index - 1];\n        var ret = value;\n\n        if (typeof value === 'undefined') {\n          ret = match;\n        }\n\n        return ret;\n      });\n    }\n\n    return localizedString;\n  };\n\n  /**\n   * Return the `Component`s DOM element. This is where children get inserted.\n   * This will usually be the the same as the element returned in {@link Component#el}.\n   *\n   * @return {Element}\n   *         The content element for this `Component`.\n   */\n\n\n  Component.prototype.contentEl = function contentEl() {\n    return this.contentEl_ || this.el_;\n  };\n\n  /**\n   * Get this `Component`s ID\n   *\n   * @return {string}\n   *         The id of this `Component`\n   */\n\n\n  Component.prototype.id = function id() {\n    return this.id_;\n  };\n\n  /**\n   * Get the `Component`s name. The name gets used to reference the `Component`\n   * and is set during registration.\n   *\n   * @return {string}\n   *         The name of this `Component`.\n   */\n\n\n  Component.prototype.name = function name() {\n    return this.name_;\n  };\n\n  /**\n   * Get an array of all child components\n   *\n   * @return {Array}\n   *         The children\n   */\n\n\n  Component.prototype.children = function children() {\n    return this.children_;\n  };\n\n  /**\n   * Returns the child `Component` with the given `id`.\n   *\n   * @param {string} id\n   *        The id of the child `Component` to get.\n   *\n   * @return {Component|undefined}\n   *         The child `Component` with the given `id` or undefined.\n   */\n\n\n  Component.prototype.getChildById = function getChildById(id) {\n    return this.childIndex_[id];\n  };\n\n  /**\n   * Returns the child `Component` with the given `name`.\n   *\n   * @param {string} name\n   *        The name of the child `Component` to get.\n   *\n   * @return {Component|undefined}\n   *         The child `Component` with the given `name` or undefined.\n   */\n\n\n  Component.prototype.getChild = function getChild(name) {\n    if (!name) {\n      return;\n    }\n\n    name = toTitleCase(name);\n\n    return this.childNameIndex_[name];\n  };\n\n  /**\n   * Add a child `Component` inside the current `Component`.\n   *\n   *\n   * @param {string|Component} child\n   *        The name or instance of a child to add.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of options that will get passed to children of\n   *        the child.\n   *\n   * @param {number} [index=this.children_.length]\n   *        The index to attempt to add a child into.\n   *\n   * @return {Component}\n   *         The `Component` that gets added as a child. When using a string the\n   *         `Component` will get created by this process.\n   */\n\n\n  Component.prototype.addChild = function addChild(child) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.children_.length;\n\n    var component = void 0;\n    var componentName = void 0;\n\n    // If child is a string, create component with options\n    if (typeof child === 'string') {\n      componentName = toTitleCase(child);\n\n      var componentClassName = options.componentClass || componentName;\n\n      // Set name through options\n      options.name = componentName;\n\n      // Create a new object & element for this controls set\n      // If there's no .player_, this is a player\n      var ComponentClass = Component.getComponent(componentClassName);\n\n      if (!ComponentClass) {\n        throw new Error('Component ' + componentClassName + ' does not exist');\n      }\n\n      // data stored directly on the videojs object may be\n      // misidentified as a component to retain\n      // backwards-compatibility with 4.x. check to make sure the\n      // component class can be instantiated.\n      if (typeof ComponentClass !== 'function') {\n        return null;\n      }\n\n      component = new ComponentClass(this.player_ || this, options);\n\n      // child is a component instance\n    } else {\n      component = child;\n    }\n\n    this.children_.splice(index, 0, component);\n\n    if (typeof component.id === 'function') {\n      this.childIndex_[component.id()] = component;\n    }\n\n    // If a name wasn't used to create the component, check if we can use the\n    // name function of the component\n    componentName = componentName || component.name && toTitleCase(component.name());\n\n    if (componentName) {\n      this.childNameIndex_[componentName] = component;\n    }\n\n    // Add the UI object's element to the container div (box)\n    // Having an element is not required\n    if (typeof component.el === 'function' && component.el()) {\n      var childNodes = this.contentEl().children;\n      var refNode = childNodes[index] || null;\n\n      this.contentEl().insertBefore(component.el(), refNode);\n    }\n\n    // Return so it can stored on parent object if desired.\n    return component;\n  };\n\n  /**\n   * Remove a child `Component` from this `Component`s list of children. Also removes\n   * the child `Component`s element from this `Component`s element.\n   *\n   * @param {Component} component\n   *        The child `Component` to remove.\n   */\n\n\n  Component.prototype.removeChild = function removeChild(component) {\n    if (typeof component === 'string') {\n      component = this.getChild(component);\n    }\n\n    if (!component || !this.children_) {\n      return;\n    }\n\n    var childFound = false;\n\n    for (var i = this.children_.length - 1; i >= 0; i--) {\n      if (this.children_[i] === component) {\n        childFound = true;\n        this.children_.splice(i, 1);\n        break;\n      }\n    }\n\n    if (!childFound) {\n      return;\n    }\n\n    this.childIndex_[component.id()] = null;\n    this.childNameIndex_[component.name()] = null;\n\n    var compEl = component.el();\n\n    if (compEl && compEl.parentNode === this.contentEl()) {\n      this.contentEl().removeChild(component.el());\n    }\n  };\n\n  /**\n   * Add and initialize default child `Component`s based upon options.\n   */\n\n\n  Component.prototype.initChildren = function initChildren() {\n    var _this = this;\n\n    var children = this.options_.children;\n\n    if (children) {\n      // `this` is `parent`\n      var parentOptions = this.options_;\n\n      var handleAdd = function handleAdd(child) {\n        var name = child.name;\n        var opts = child.opts;\n\n        // Allow options for children to be set at the parent options\n        // e.g. videojs(id, { controlBar: false });\n        // instead of videojs(id, { children: { controlBar: false });\n        if (parentOptions[name] !== undefined) {\n          opts = parentOptions[name];\n        }\n\n        // Allow for disabling default components\n        // e.g. options['children']['posterImage'] = false\n        if (opts === false) {\n          return;\n        }\n\n        // Allow options to be passed as a simple boolean if no configuration\n        // is necessary.\n        if (opts === true) {\n          opts = {};\n        }\n\n        // We also want to pass the original player options\n        // to each component as well so they don't need to\n        // reach back into the player for options later.\n        opts.playerOptions = _this.options_.playerOptions;\n\n        // Create and add the child component.\n        // Add a direct reference to the child by name on the parent instance.\n        // If two of the same component are used, different names should be supplied\n        // for each\n        var newChild = _this.addChild(name, opts);\n\n        if (newChild) {\n          _this[name] = newChild;\n        }\n      };\n\n      // Allow for an array of children details to passed in the options\n      var workingChildren = void 0;\n      var Tech = Component.getComponent('Tech');\n\n      if (Array.isArray(children)) {\n        workingChildren = children;\n      } else {\n        workingChildren = Object.keys(children);\n      }\n\n      workingChildren\n      // children that are in this.options_ but also in workingChildren  would\n      // give us extra children we do not want. So, we want to filter them out.\n      .concat(Object.keys(this.options_).filter(function (child) {\n        return !workingChildren.some(function (wchild) {\n          if (typeof wchild === 'string') {\n            return child === wchild;\n          }\n          return child === wchild.name;\n        });\n      })).map(function (child) {\n        var name = void 0;\n        var opts = void 0;\n\n        if (typeof child === 'string') {\n          name = child;\n          opts = children[name] || _this.options_[name] || {};\n        } else {\n          name = child.name;\n          opts = child;\n        }\n\n        return { name: name, opts: opts };\n      }).filter(function (child) {\n        // we have to make sure that child.name isn't in the techOrder since\n        // techs are registerd as Components but can't aren't compatible\n        // See https://github.com/videojs/video.js/issues/2772\n        var c = Component.getComponent(child.opts.componentClass || toTitleCase(child.name));\n\n        return c && !Tech.isTech(c);\n      }).forEach(handleAdd);\n    }\n  };\n\n  /**\n   * Builds the default DOM class name. Should be overriden by sub-components.\n   *\n   * @return {string}\n   *         The DOM class name for this object.\n   *\n   * @abstract\n   */\n\n\n  Component.prototype.buildCSSClass = function buildCSSClass() {\n    // Child classes can include a function that does:\n    // return 'CLASS NAME' + this._super();\n    return '';\n  };\n\n  /**\n   * Bind a listener to the component's ready state.\n   * Different from event listeners in that if the ready event has already happened\n   * it will trigger the function immediately.\n   *\n   * @return {Component}\n   *         Returns itself; method can be chained.\n   */\n\n\n  Component.prototype.ready = function ready(fn) {\n    var sync = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    if (!fn) {\n      return;\n    }\n\n    if (!this.isReady_) {\n      this.readyQueue_ = this.readyQueue_ || [];\n      this.readyQueue_.push(fn);\n      return;\n    }\n\n    if (sync) {\n      fn.call(this);\n    } else {\n      // Call the function asynchronously by default for consistency\n      this.setTimeout(fn, 1);\n    }\n  };\n\n  /**\n   * Trigger all the ready listeners for this `Component`.\n   *\n   * @fires Component#ready\n   */\n\n\n  Component.prototype.triggerReady = function triggerReady() {\n    this.isReady_ = true;\n\n    // Ensure ready is triggered asynchronously\n    this.setTimeout(function () {\n      var readyQueue = this.readyQueue_;\n\n      // Reset Ready Queue\n      this.readyQueue_ = [];\n\n      if (readyQueue && readyQueue.length > 0) {\n        readyQueue.forEach(function (fn) {\n          fn.call(this);\n        }, this);\n      }\n\n      // Allow for using event listeners also\n      /**\n       * Triggered when a `Component` is ready.\n       *\n       * @event Component#ready\n       * @type {EventTarget~Event}\n       */\n      this.trigger('ready');\n    }, 1);\n  };\n\n  /**\n   * Find a single DOM element matching a `selector`. This can be within the `Component`s\n   * `contentEl()` or another custom context.\n   *\n   * @param {string} selector\n   *        A valid CSS selector, which will be passed to `querySelector`.\n   *\n   * @param {Element|string} [context=this.contentEl()]\n   *        A DOM element within which to query. Can also be a selector string in\n   *        which case the first matching element will get used as context. If\n   *        missing `this.contentEl()` gets used. If  `this.contentEl()` returns\n   *        nothing it falls back to `document`.\n   *\n   * @return {Element|null}\n   *         the dom element that was found, or null\n   *\n   * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors)\n   */\n\n\n  Component.prototype.$ = function $$$1(selector, context) {\n    return $(selector, context || this.contentEl());\n  };\n\n  /**\n   * Finds all DOM element matching a `selector`. This can be within the `Component`s\n   * `contentEl()` or another custom context.\n   *\n   * @param {string} selector\n   *        A valid CSS selector, which will be passed to `querySelectorAll`.\n   *\n   * @param {Element|string} [context=this.contentEl()]\n   *        A DOM element within which to query. Can also be a selector string in\n   *        which case the first matching element will get used as context. If\n   *        missing `this.contentEl()` gets used. If  `this.contentEl()` returns\n   *        nothing it falls back to `document`.\n   *\n   * @return {NodeList}\n   *         a list of dom elements that were found\n   *\n   * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors)\n   */\n\n\n  Component.prototype.$$ = function $$$$1(selector, context) {\n    return $$(selector, context || this.contentEl());\n  };\n\n  /**\n   * Check if a component's element has a CSS class name.\n   *\n   * @param {string} classToCheck\n   *        CSS class name to check.\n   *\n   * @return {boolean}\n   *         - True if the `Component` has the class.\n   *         - False if the `Component` does not have the class`\n   */\n\n\n  Component.prototype.hasClass = function hasClass$$1(classToCheck) {\n    return hasClass(this.el_, classToCheck);\n  };\n\n  /**\n   * Add a CSS class name to the `Component`s element.\n   *\n   * @param {string} classToAdd\n   *        CSS class name to add\n   */\n\n\n  Component.prototype.addClass = function addClass$$1(classToAdd) {\n    addClass(this.el_, classToAdd);\n  };\n\n  /**\n   * Remove a CSS class name from the `Component`s element.\n   *\n   * @param {string} classToRemove\n   *        CSS class name to remove\n   */\n\n\n  Component.prototype.removeClass = function removeClass$$1(classToRemove) {\n    removeClass(this.el_, classToRemove);\n  };\n\n  /**\n   * Add or remove a CSS class name from the component's element.\n   * - `classToToggle` gets added when {@link Component#hasClass} would return false.\n   * - `classToToggle` gets removed when {@link Component#hasClass} would return true.\n   *\n   * @param  {string} classToToggle\n   *         The class to add or remove based on (@link Component#hasClass}\n   *\n   * @param  {boolean|Dom~predicate} [predicate]\n   *         An {@link Dom~predicate} function or a boolean\n   */\n\n\n  Component.prototype.toggleClass = function toggleClass$$1(classToToggle, predicate) {\n    toggleClass(this.el_, classToToggle, predicate);\n  };\n\n  /**\n   * Show the `Component`s element if it is hidden by removing the\n   * 'vjs-hidden' class name from it.\n   */\n\n\n  Component.prototype.show = function show() {\n    this.removeClass('vjs-hidden');\n  };\n\n  /**\n   * Hide the `Component`s element if it is currently showing by adding the\n   * 'vjs-hidden` class name to it.\n   */\n\n\n  Component.prototype.hide = function hide() {\n    this.addClass('vjs-hidden');\n  };\n\n  /**\n   * Lock a `Component`s element in its visible state by adding the 'vjs-lock-showing'\n   * class name to it. Used during fadeIn/fadeOut.\n   *\n   * @private\n   */\n\n\n  Component.prototype.lockShowing = function lockShowing() {\n    this.addClass('vjs-lock-showing');\n  };\n\n  /**\n   * Unlock a `Component`s element from its visible state by removing the 'vjs-lock-showing'\n   * class name from it. Used during fadeIn/fadeOut.\n   *\n   * @private\n   */\n\n\n  Component.prototype.unlockShowing = function unlockShowing() {\n    this.removeClass('vjs-lock-showing');\n  };\n\n  /**\n   * Get the value of an attribute on the `Component`s element.\n   *\n   * @param {string} attribute\n   *        Name of the attribute to get the value from.\n   *\n   * @return {string|null}\n   *         - The value of the attribute that was asked for.\n   *         - Can be an empty string on some browsers if the attribute does not exist\n   *           or has no value\n   *         - Most browsers will return null if the attibute does not exist or has\n   *           no value.\n   *\n   * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute}\n   */\n\n\n  Component.prototype.getAttribute = function getAttribute$$1(attribute) {\n    return getAttribute(this.el_, attribute);\n  };\n\n  /**\n   * Set the value of an attribute on the `Component`'s element\n   *\n   * @param {string} attribute\n   *        Name of the attribute to set.\n   *\n   * @param {string} value\n   *        Value to set the attribute to.\n   *\n   * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute}\n   */\n\n\n  Component.prototype.setAttribute = function setAttribute$$1(attribute, value) {\n    setAttribute(this.el_, attribute, value);\n  };\n\n  /**\n   * Remove an attribute from the `Component`s element.\n   *\n   * @param {string} attribute\n   *        Name of the attribute to remove.\n   *\n   * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/removeAttribute}\n   */\n\n\n  Component.prototype.removeAttribute = function removeAttribute$$1(attribute) {\n    removeAttribute(this.el_, attribute);\n  };\n\n  /**\n   * Get or set the width of the component based upon the CSS styles.\n   * See {@link Component#dimension} for more detailed information.\n   *\n   * @param {number|string} [num]\n   *        The width that you want to set postfixed with '%', 'px' or nothing.\n   *\n   * @param {boolean} [skipListeners]\n   *        Skip the componentresize event trigger\n   *\n   * @return {number|string}\n   *         The width when getting, zero if there is no width. Can be a string\n   *           postpixed with '%' or 'px'.\n   */\n\n\n  Component.prototype.width = function width(num, skipListeners) {\n    return this.dimension('width', num, skipListeners);\n  };\n\n  /**\n   * Get or set the height of the component based upon the CSS styles.\n   * See {@link Component#dimension} for more detailed information.\n   *\n   * @param {number|string} [num]\n   *        The height that you want to set postfixed with '%', 'px' or nothing.\n   *\n   * @param {boolean} [skipListeners]\n   *        Skip the componentresize event trigger\n   *\n   * @return {number|string}\n   *         The width when getting, zero if there is no width. Can be a string\n   *         postpixed with '%' or 'px'.\n   */\n\n\n  Component.prototype.height = function height(num, skipListeners) {\n    return this.dimension('height', num, skipListeners);\n  };\n\n  /**\n   * Set both the width and height of the `Component` element at the same time.\n   *\n   * @param  {number|string} width\n   *         Width to set the `Component`s element to.\n   *\n   * @param  {number|string} height\n   *         Height to set the `Component`s element to.\n   */\n\n\n  Component.prototype.dimensions = function dimensions(width, height) {\n    // Skip componentresize listeners on width for optimization\n    this.width(width, true);\n    this.height(height);\n  };\n\n  /**\n   * Get or set width or height of the `Component` element. This is the shared code\n   * for the {@link Component#width} and {@link Component#height}.\n   *\n   * Things to know:\n   * - If the width or height in an number this will return the number postfixed with 'px'.\n   * - If the width/height is a percent this will return the percent postfixed with '%'\n   * - Hidden elements have a width of 0 with `window.getComputedStyle`. This function\n   *   defaults to the `Component`s `style.width` and falls back to `window.getComputedStyle`.\n   *   See [this]{@link http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/}\n   *   for more information\n   * - If you want the computed style of the component, use {@link Component#currentWidth}\n   *   and {@link {Component#currentHeight}\n   *\n   * @fires Component#componentresize\n   *\n   * @param {string} widthOrHeight\n   8        'width' or 'height'\n   *\n   * @param  {number|string} [num]\n   8         New dimension\n   *\n   * @param  {boolean} [skipListeners]\n   *         Skip componentresize event trigger\n   *\n   * @return {number}\n   *         The dimension when getting or 0 if unset\n   */\n\n\n  Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) {\n    if (num !== undefined) {\n      // Set to zero if null or literally NaN (NaN !== NaN)\n      if (num === null || num !== num) {\n        num = 0;\n      }\n\n      // Check if using css width/height (% or px) and adjust\n      if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {\n        this.el_.style[widthOrHeight] = num;\n      } else if (num === 'auto') {\n        this.el_.style[widthOrHeight] = '';\n      } else {\n        this.el_.style[widthOrHeight] = num + 'px';\n      }\n\n      // skipListeners allows us to avoid triggering the resize event when setting both width and height\n      if (!skipListeners) {\n        /**\n         * Triggered when a component is resized.\n         *\n         * @event Component#componentresize\n         * @type {EventTarget~Event}\n         */\n        this.trigger('componentresize');\n      }\n\n      return;\n    }\n\n    // Not setting a value, so getting it\n    // Make sure element exists\n    if (!this.el_) {\n      return 0;\n    }\n\n    // Get dimension value from style\n    var val = this.el_.style[widthOrHeight];\n    var pxIndex = val.indexOf('px');\n\n    if (pxIndex !== -1) {\n      // Return the pixel value with no 'px'\n      return parseInt(val.slice(0, pxIndex), 10);\n    }\n\n    // No px so using % or no style was set, so falling back to offsetWidth/height\n    // If component has display:none, offset will return 0\n    // TODO: handle display:none and no dimension style using px\n    return parseInt(this.el_['offset' + toTitleCase(widthOrHeight)], 10);\n  };\n\n  /**\n   * Get the width or the height of the `Component` elements computed style. Uses\n   * `window.getComputedStyle`.\n   *\n   * @param {string} widthOrHeight\n   *        A string containing 'width' or 'height'. Whichever one you want to get.\n   *\n   * @return {number}\n   *         The dimension that gets asked for or 0 if nothing was set\n   *         for that dimension.\n   */\n\n\n  Component.prototype.currentDimension = function currentDimension(widthOrHeight) {\n    var computedWidthOrHeight = 0;\n\n    if (widthOrHeight !== 'width' && widthOrHeight !== 'height') {\n      throw new Error('currentDimension only accepts width or height value');\n    }\n\n    if (typeof window.getComputedStyle === 'function') {\n      var computedStyle = window.getComputedStyle(this.el_);\n\n      computedWidthOrHeight = computedStyle.getPropertyValue(widthOrHeight) || computedStyle[widthOrHeight];\n    }\n\n    // remove 'px' from variable and parse as integer\n    computedWidthOrHeight = parseFloat(computedWidthOrHeight);\n\n    // if the computed value is still 0, it's possible that the browser is lying\n    // and we want to check the offset values.\n    // This code also runs on IE8 and wherever getComputedStyle doesn't exist.\n    if (computedWidthOrHeight === 0) {\n      var rule = 'offset' + toTitleCase(widthOrHeight);\n\n      computedWidthOrHeight = this.el_[rule];\n    }\n\n    return computedWidthOrHeight;\n  };\n\n  /**\n   * An object that contains width and height values of the `Component`s\n   * computed style. Uses `window.getComputedStyle`.\n   *\n   * @typedef {Object} Component~DimensionObject\n   *\n   * @property {number} width\n   *           The width of the `Component`s computed style.\n   *\n   * @property {number} height\n   *           The height of the `Component`s computed style.\n   */\n\n  /**\n   * Get an object that contains width and height values of the `Component`s\n   * computed style.\n   *\n   * @return {Component~DimensionObject}\n   *         The dimensions of the components element\n   */\n\n\n  Component.prototype.currentDimensions = function currentDimensions() {\n    return {\n      width: this.currentDimension('width'),\n      height: this.currentDimension('height')\n    };\n  };\n\n  /**\n   * Get the width of the `Component`s computed style. Uses `window.getComputedStyle`.\n   *\n   * @return {number} width\n   *           The width of the `Component`s computed style.\n   */\n\n\n  Component.prototype.currentWidth = function currentWidth() {\n    return this.currentDimension('width');\n  };\n\n  /**\n   * Get the height of the `Component`s computed style. Uses `window.getComputedStyle`.\n   *\n   * @return {number} height\n   *           The height of the `Component`s computed style.\n   */\n\n\n  Component.prototype.currentHeight = function currentHeight() {\n    return this.currentDimension('height');\n  };\n\n  /**\n   * Set the focus to this component\n   */\n\n\n  Component.prototype.focus = function focus() {\n    this.el_.focus();\n  };\n\n  /**\n   * Remove the focus from this component\n   */\n\n\n  Component.prototype.blur = function blur() {\n    this.el_.blur();\n  };\n\n  /**\n   * Emit a 'tap' events when touch event support gets detected. This gets used to\n   * support toggling the controls through a tap on the video. They get enabled\n   * because every sub-component would have extra overhead otherwise.\n   *\n   * @private\n   * @fires Component#tap\n   * @listens Component#touchstart\n   * @listens Component#touchmove\n   * @listens Component#touchleave\n   * @listens Component#touchcancel\n   * @listens Component#touchend\n    */\n\n\n  Component.prototype.emitTapEvents = function emitTapEvents() {\n    // Track the start time so we can determine how long the touch lasted\n    var touchStart = 0;\n    var firstTouch = null;\n\n    // Maximum movement allowed during a touch event to still be considered a tap\n    // Other popular libs use anywhere from 2 (hammer.js) to 15,\n    // so 10 seems like a nice, round number.\n    var tapMovementThreshold = 10;\n\n    // The maximum length a touch can be while still being considered a tap\n    var touchTimeThreshold = 200;\n\n    var couldBeTap = void 0;\n\n    this.on('touchstart', function (event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length === 1) {\n        // Copy pageX/pageY from the object\n        firstTouch = {\n          pageX: event.touches[0].pageX,\n          pageY: event.touches[0].pageY\n        };\n        // Record start time so we can detect a tap vs. \"touch and hold\"\n        touchStart = new Date().getTime();\n        // Reset couldBeTap tracking\n        couldBeTap = true;\n      }\n    });\n\n    this.on('touchmove', function (event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length > 1) {\n        couldBeTap = false;\n      } else if (firstTouch) {\n        // Some devices will throw touchmoves for all but the slightest of taps.\n        // So, if we moved only a small distance, this could still be a tap\n        var xdiff = event.touches[0].pageX - firstTouch.pageX;\n        var ydiff = event.touches[0].pageY - firstTouch.pageY;\n        var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff);\n\n        if (touchDistance > tapMovementThreshold) {\n          couldBeTap = false;\n        }\n      }\n    });\n\n    var noTap = function noTap() {\n      couldBeTap = false;\n    };\n\n    // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s\n    this.on('touchleave', noTap);\n    this.on('touchcancel', noTap);\n\n    // When the touch ends, measure how long it took and trigger the appropriate\n    // event\n    this.on('touchend', function (event) {\n      firstTouch = null;\n      // Proceed only if the touchmove/leave/cancel event didn't happen\n      if (couldBeTap === true) {\n        // Measure how long the touch lasted\n        var touchTime = new Date().getTime() - touchStart;\n\n        // Make sure the touch was less than the threshold to be considered a tap\n        if (touchTime < touchTimeThreshold) {\n          // Don't let browser turn this into a click\n          event.preventDefault();\n          /**\n           * Triggered when a `Component` is tapped.\n           *\n           * @event Component#tap\n           * @type {EventTarget~Event}\n           */\n          this.trigger('tap');\n          // It may be good to copy the touchend event object and change the\n          // type to tap, if the other event properties aren't exact after\n          // Events.fixEvent runs (e.g. event.target)\n        }\n      }\n    });\n  };\n\n  /**\n   * This function reports user activity whenever touch events happen. This can get\n   * turned off by any sub-components that wants touch events to act another way.\n   *\n   * Report user touch activity when touch events occur. User activity gets used to\n   * determine when controls should show/hide. It is simple when it comes to mouse\n   * events, because any mouse event should show the controls. So we capture mouse\n   * events that bubble up to the player and report activity when that happens.\n   * With touch events it isn't as easy as `touchstart` and `touchend` toggle player\n   * controls. So touch events can't help us at the player level either.\n   *\n   * User activity gets checked asynchronously. So what could happen is a tap event\n   * on the video turns the controls off. Then the `touchend` event bubbles up to\n   * the player. Which, if it reported user activity, would turn the controls right\n   * back on. We also don't want to completely block touch events from bubbling up.\n   * Furthermore a `touchmove` event and anything other than a tap, should not turn\n   * controls back on.\n   *\n   * @listens Component#touchstart\n   * @listens Component#touchmove\n   * @listens Component#touchend\n   * @listens Component#touchcancel\n   */\n\n\n  Component.prototype.enableTouchActivity = function enableTouchActivity() {\n    // Don't continue if the root player doesn't support reporting user activity\n    if (!this.player() || !this.player().reportUserActivity) {\n      return;\n    }\n\n    // listener for reporting that the user is active\n    var report = bind(this.player(), this.player().reportUserActivity);\n\n    var touchHolding = void 0;\n\n    this.on('touchstart', function () {\n      report();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(touchHolding);\n      // report at the same interval as activityCheck\n      touchHolding = this.setInterval(report, 250);\n    });\n\n    var touchEnd = function touchEnd(event) {\n      report();\n      // stop the interval that maintains activity if the touch is holding\n      this.clearInterval(touchHolding);\n    };\n\n    this.on('touchmove', report);\n    this.on('touchend', touchEnd);\n    this.on('touchcancel', touchEnd);\n  };\n\n  /**\n   * A callback that has no parameters and is bound into `Component`s context.\n   *\n   * @callback Component~GenericCallback\n   * @this Component\n   */\n\n  /**\n   * Creates a function that runs after an `x` millisecond timeout. This function is a\n   * wrapper around `window.setTimeout`. There are a few reasons to use this one\n   * instead though:\n   * 1. It gets cleared via  {@link Component#clearTimeout} when\n   *    {@link Component#dispose} gets called.\n   * 2. The function callback will gets turned into a {@link Component~GenericCallback}\n   *\n   * > Note: You can't use `window.clearTimeout` on the id returned by this function. This\n   *         will cause its dispose listener not to get cleaned up! Please use\n   *         {@link Component#clearTimeout} or {@link Component#dispose} instead.\n   *\n   * @param {Component~GenericCallback} fn\n   *        The function that will be run after `timeout`.\n   *\n   * @param {number} timeout\n   *        Timeout in milliseconds to delay before executing the specified function.\n   *\n   * @return {number}\n   *         Returns a timeout ID that gets used to identify the timeout. It can also\n   *         get used in {@link Component#clearTimeout} to clear the timeout that\n   *         was set.\n   *\n   * @listens Component#dispose\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout}\n   */\n\n\n  Component.prototype.setTimeout = function setTimeout(fn, timeout) {\n    var _this2 = this;\n\n    // declare as variables so they are properly available in timeout function\n    // eslint-disable-next-line\n    var timeoutId, disposeFn;\n\n    fn = bind(this, fn);\n\n    timeoutId = window.setTimeout(function () {\n      _this2.off('dispose', disposeFn);\n      fn();\n    }, timeout);\n\n    disposeFn = function disposeFn() {\n      return _this2.clearTimeout(timeoutId);\n    };\n\n    disposeFn.guid = 'vjs-timeout-' + timeoutId;\n\n    this.on('dispose', disposeFn);\n\n    return timeoutId;\n  };\n\n  /**\n   * Clears a timeout that gets created via `window.setTimeout` or\n   * {@link Component#setTimeout}. If you set a timeout via {@link Component#setTimeout}\n   * use this function instead of `window.clearTimout`. If you don't your dispose\n   * listener will not get cleaned up until {@link Component#dispose}!\n   *\n   * @param {number} timeoutId\n   *        The id of the timeout to clear. The return value of\n   *        {@link Component#setTimeout} or `window.setTimeout`.\n   *\n   * @return {number}\n   *         Returns the timeout id that was cleared.\n   *\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearTimeout}\n   */\n\n\n  Component.prototype.clearTimeout = function clearTimeout(timeoutId) {\n    window.clearTimeout(timeoutId);\n\n    var disposeFn = function disposeFn() {};\n\n    disposeFn.guid = 'vjs-timeout-' + timeoutId;\n\n    this.off('dispose', disposeFn);\n\n    return timeoutId;\n  };\n\n  /**\n   * Creates a function that gets run every `x` milliseconds. This function is a wrapper\n   * around `window.setInterval`. There are a few reasons to use this one instead though.\n   * 1. It gets cleared via  {@link Component#clearInterval} when\n   *    {@link Component#dispose} gets called.\n   * 2. The function callback will be a {@link Component~GenericCallback}\n   *\n   * @param {Component~GenericCallback} fn\n   *        The function to run every `x` seconds.\n   *\n   * @param {number} interval\n   *        Execute the specified function every `x` milliseconds.\n   *\n   * @return {number}\n   *         Returns an id that can be used to identify the interval. It can also be be used in\n   *         {@link Component#clearInterval} to clear the interval.\n   *\n   * @listens Component#dispose\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval}\n   */\n\n\n  Component.prototype.setInterval = function setInterval(fn, interval) {\n    var _this3 = this;\n\n    fn = bind(this, fn);\n\n    var intervalId = window.setInterval(fn, interval);\n\n    var disposeFn = function disposeFn() {\n      return _this3.clearInterval(intervalId);\n    };\n\n    disposeFn.guid = 'vjs-interval-' + intervalId;\n\n    this.on('dispose', disposeFn);\n\n    return intervalId;\n  };\n\n  /**\n   * Clears an interval that gets created via `window.setInterval` or\n   * {@link Component#setInterval}. If you set an inteval via {@link Component#setInterval}\n   * use this function instead of `window.clearInterval`. If you don't your dispose\n   * listener will not get cleaned up until {@link Component#dispose}!\n   *\n   * @param {number} intervalId\n   *        The id of the interval to clear. The return value of\n   *        {@link Component#setInterval} or `window.setInterval`.\n   *\n   * @return {number}\n   *         Returns the interval id that was cleared.\n   *\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearInterval}\n   */\n\n\n  Component.prototype.clearInterval = function clearInterval(intervalId) {\n    window.clearInterval(intervalId);\n\n    var disposeFn = function disposeFn() {};\n\n    disposeFn.guid = 'vjs-interval-' + intervalId;\n\n    this.off('dispose', disposeFn);\n\n    return intervalId;\n  };\n\n  /**\n   * Queues up a callback to be passed to requestAnimationFrame (rAF), but\n   * with a few extra bonuses:\n   *\n   * - Supports browsers that do not support rAF by falling back to\n   *   {@link Component#setTimeout}.\n   *\n   * - The callback is turned into a {@link Component~GenericCallback} (i.e.\n   *   bound to the component).\n   *\n   * - Automatic cancellation of the rAF callback is handled if the component\n   *   is disposed before it is called.\n   *\n   * @param  {Component~GenericCallback} fn\n   *         A function that will be bound to this component and executed just\n   *         before the browser's next repaint.\n   *\n   * @return {number}\n   *         Returns an rAF ID that gets used to identify the timeout. It can\n   *         also be used in {@link Component#cancelAnimationFrame} to cancel\n   *         the animation frame callback.\n   *\n   * @listens Component#dispose\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame}\n   */\n\n\n  Component.prototype.requestAnimationFrame = function requestAnimationFrame(fn) {\n    var _this4 = this;\n\n    // declare as variables so they are properly available in rAF function\n    // eslint-disable-next-line\n    var id, disposeFn;\n\n    if (this.supportsRaf_) {\n      fn = bind(this, fn);\n\n      id = window.requestAnimationFrame(function () {\n        _this4.off('dispose', disposeFn);\n        fn();\n      });\n\n      disposeFn = function disposeFn() {\n        return _this4.cancelAnimationFrame(id);\n      };\n\n      disposeFn.guid = 'vjs-raf-' + id;\n      this.on('dispose', disposeFn);\n\n      return id;\n    }\n\n    // Fall back to using a timer.\n    return this.setTimeout(fn, 1000 / 60);\n  };\n\n  /**\n   * Cancels a queued callback passed to {@link Component#requestAnimationFrame}\n   * (rAF).\n   *\n   * If you queue an rAF callback via {@link Component#requestAnimationFrame},\n   * use this function instead of `window.cancelAnimationFrame`. If you don't,\n   * your dispose listener will not get cleaned up until {@link Component#dispose}!\n   *\n   * @param {number} id\n   *        The rAF ID to clear. The return value of {@link Component#requestAnimationFrame}.\n   *\n   * @return {number}\n   *         Returns the rAF ID that was cleared.\n   *\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/cancelAnimationFrame}\n   */\n\n\n  Component.prototype.cancelAnimationFrame = function cancelAnimationFrame(id) {\n    if (this.supportsRaf_) {\n      window.cancelAnimationFrame(id);\n\n      var disposeFn = function disposeFn() {};\n\n      disposeFn.guid = 'vjs-raf-' + id;\n\n      this.off('dispose', disposeFn);\n\n      return id;\n    }\n\n    // Fall back to using a timer.\n    return this.clearTimeout(id);\n  };\n\n  /**\n   * Register a `Component` with `videojs` given the name and the component.\n   *\n   * > NOTE: {@link Tech}s should not be registered as a `Component`. {@link Tech}s\n   *         should be registered using {@link Tech.registerTech} or\n   *         {@link videojs:videojs.registerTech}.\n   *\n   * > NOTE: This function can also be seen on videojs as\n   *         {@link videojs:videojs.registerComponent}.\n   *\n   * @param {string} name\n   *        The name of the `Component` to register.\n   *\n   * @param {Component} ComponentToRegister\n   *        The `Component` class to register.\n   *\n   * @return {Component}\n   *         The `Component` that was registered.\n   */\n\n\n  Component.registerComponent = function registerComponent(name, ComponentToRegister) {\n    if (typeof name !== 'string' || !name) {\n      throw new Error('Illegal component name, \"' + name + '\"; must be a non-empty string.');\n    }\n\n    var Tech = Component.getComponent('Tech');\n\n    // We need to make sure this check is only done if Tech has been registered.\n    var isTech = Tech && Tech.isTech(ComponentToRegister);\n    var isComp = Component === ComponentToRegister || Component.prototype.isPrototypeOf(ComponentToRegister.prototype);\n\n    if (isTech || !isComp) {\n      var reason = void 0;\n\n      if (isTech) {\n        reason = 'techs must be registered using Tech.registerTech()';\n      } else {\n        reason = 'must be a Component subclass';\n      }\n\n      throw new Error('Illegal component, \"' + name + '\"; ' + reason + '.');\n    }\n\n    name = toTitleCase(name);\n\n    if (!Component.components_) {\n      Component.components_ = {};\n    }\n\n    var Player = Component.getComponent('Player');\n\n    if (name === 'Player' && Player && Player.players) {\n      var players = Player.players;\n      var playerNames = Object.keys(players);\n\n      // If we have players that were disposed, then their name will still be\n      // in Players.players. So, we must loop through and verify that the value\n      // for each item is not null. This allows registration of the Player component\n      // after all players have been disposed or before any were created.\n      if (players && playerNames.length > 0 && playerNames.map(function (pname) {\n        return players[pname];\n      }).every(Boolean)) {\n        throw new Error('Can not register Player component after player has been created.');\n      }\n    }\n\n    Component.components_[name] = ComponentToRegister;\n\n    return ComponentToRegister;\n  };\n\n  /**\n   * Get a `Component` based on the name it was registered with.\n   *\n   * @param {string} name\n   *        The Name of the component to get.\n   *\n   * @return {Component}\n   *         The `Component` that got registered under the given name.\n   *\n   * @deprecated In `videojs` 6 this will not return `Component`s that were not\n   *             registered using {@link Component.registerComponent}. Currently we\n   *             check the global `videojs` object for a `Component` name and\n   *             return that if it exists.\n   */\n\n\n  Component.getComponent = function getComponent(name) {\n    if (!name) {\n      return;\n    }\n\n    name = toTitleCase(name);\n\n    if (Component.components_ && Component.components_[name]) {\n      return Component.components_[name];\n    }\n  };\n\n  return Component;\n}();\n\n/**\n * Whether or not this component supports `requestAnimationFrame`.\n *\n * This is exposed primarily for testing purposes.\n *\n * @private\n * @type {Boolean}\n */\n\n\nComponent.prototype.supportsRaf_ = typeof window.requestAnimationFrame === 'function' && typeof window.cancelAnimationFrame === 'function';\n\nComponent.registerComponent('Component', Component);\n\n/**\n * @file time-ranges.js\n * @module time-ranges\n */\n\n/**\n * Returns the time for the specified index at the start or end\n * of a TimeRange object.\n *\n * @function time-ranges:indexFunction\n *\n * @param {number} [index=0]\n *        The range number to return the time for.\n *\n * @return {number}\n *         The time that offset at the specified index.\n *\n * @depricated index must be set to a value, in the future this will throw an error.\n */\n\n/**\n * An object that contains ranges of time for various reasons.\n *\n * @typedef {Object} TimeRange\n *\n * @property {number} length\n *           The number of time ranges represented by this Object\n *\n * @property {time-ranges:indexFunction} start\n *           Returns the time offset at which a specified time range begins.\n *\n * @property {time-ranges:indexFunction} end\n *           Returns the time offset at which a specified time range ends.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges\n */\n\n/**\n * Check if any of the time ranges are over the maximum index.\n *\n * @param {string} fnName\n *        The function name to use for logging\n *\n * @param {number} index\n *        The index to check\n *\n * @param {number} maxIndex\n *        The maximum possible index\n *\n * @throws {Error} if the timeRanges provided are over the maxIndex\n */\nfunction rangeCheck(fnName, index, maxIndex) {\n  if (typeof index !== 'number' || index < 0 || index > maxIndex) {\n    throw new Error('Failed to execute \\'' + fnName + '\\' on \\'TimeRanges\\': The index provided (' + index + ') is non-numeric or out of bounds (0-' + maxIndex + ').');\n  }\n}\n\n/**\n * Get the time for the specified index at the start or end\n * of a TimeRange object.\n *\n * @param {string} fnName\n *        The function name to use for logging\n *\n * @param {string} valueIndex\n *        The proprety that should be used to get the time. should be 'start' or 'end'\n *\n * @param {Array} ranges\n *        An array of time ranges\n *\n * @param {Array} [rangeIndex=0]\n *        The index to start the search at\n *\n * @return {number}\n *         The time that offset at the specified index.\n *\n *\n * @depricated rangeIndex must be set to a value, in the future this will throw an error.\n * @throws {Error} if rangeIndex is more than the length of ranges\n */\nfunction getRange(fnName, valueIndex, ranges, rangeIndex) {\n  rangeCheck(fnName, rangeIndex, ranges.length - 1);\n  return ranges[rangeIndex][valueIndex];\n}\n\n/**\n * Create a time range object given ranges of time.\n *\n * @param {Array} [ranges]\n *        An array of time ranges.\n */\nfunction createTimeRangesObj(ranges) {\n  if (ranges === undefined || ranges.length === 0) {\n    return {\n      length: 0,\n      start: function start() {\n        throw new Error('This TimeRanges object is empty');\n      },\n      end: function end() {\n        throw new Error('This TimeRanges object is empty');\n      }\n    };\n  }\n  return {\n    length: ranges.length,\n    start: getRange.bind(null, 'start', 0, ranges),\n    end: getRange.bind(null, 'end', 1, ranges)\n  };\n}\n\n/**\n * Should create a fake `TimeRange` object which mimics an HTML5 time range instance.\n *\n * @param {number|Array} start\n *        The start of a single range or an array of ranges\n *\n * @param {number} end\n *        The end of a single range.\n *\n * @private\n */\nfunction createTimeRanges(start, end) {\n  if (Array.isArray(start)) {\n    return createTimeRangesObj(start);\n  } else if (start === undefined || end === undefined) {\n    return createTimeRangesObj();\n  }\n  return createTimeRangesObj([[start, end]]);\n}\n\n/**\n * @file buffer.js\n * @module buffer\n */\n/**\n * Compute the percentage of the media that has been buffered.\n *\n * @param {TimeRange} buffered\n *        The current `TimeRange` object representing buffered time ranges\n *\n * @param {number} duration\n *        Total duration of the media\n *\n * @return {number}\n *         Percent buffered of the total duration in decimal form.\n */\nfunction bufferedPercent(buffered, duration) {\n  var bufferedDuration = 0;\n  var start = void 0;\n  var end = void 0;\n\n  if (!duration) {\n    return 0;\n  }\n\n  if (!buffered || !buffered.length) {\n    buffered = createTimeRanges(0, 0);\n  }\n\n  for (var i = 0; i < buffered.length; i++) {\n    start = buffered.start(i);\n    end = buffered.end(i);\n\n    // buffered end can be bigger than duration by a very small fraction\n    if (end > duration) {\n      end = duration;\n    }\n\n    bufferedDuration += end - start;\n  }\n\n  return bufferedDuration / duration;\n}\n\n/**\n * @file fullscreen-api.js\n * @module fullscreen-api\n * @private\n */\n/**\n * Store the browser-specific methods for the fullscreen API.\n *\n * @type {Object}\n * @see [Specification]{@link https://fullscreen.spec.whatwg.org}\n * @see [Map Approach From Screenfull.js]{@link https://github.com/sindresorhus/screenfull.js}\n */\nvar FullscreenApi = {};\n\n// browser API methods\nvar apiMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],\n// WebKit\n['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'],\n// Old WebKit (Safari 5.1)\n['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'],\n// Mozilla\n['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'],\n// Microsoft\n['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];\n\nvar specApi = apiMap[0];\nvar browserApi = void 0;\n\n// determine the supported set of functions\nfor (var i = 0; i < apiMap.length; i++) {\n  // check for exitFullscreen function\n  if (apiMap[i][1] in document) {\n    browserApi = apiMap[i];\n    break;\n  }\n}\n\n// map the browser API names to the spec API names\nif (browserApi) {\n  for (var _i = 0; _i < browserApi.length; _i++) {\n    FullscreenApi[specApi[_i]] = browserApi[_i];\n  }\n}\n\n/**\n * @file media-error.js\n */\n/**\n * A Custom `MediaError` class which mimics the standard HTML5 `MediaError` class.\n *\n * @param {number|string|Object|MediaError} value\n *        This can be of multiple types:\n *        - number: should be a standard error code\n *        - string: an error message (the code will be 0)\n *        - Object: arbitrary properties\n *        - `MediaError` (native): used to populate a video.js `MediaError` object\n *        - `MediaError` (video.js): will return itself if it's already a\n *          video.js `MediaError` object.\n *\n * @see [MediaError Spec]{@link https://dev.w3.org/html5/spec-author-view/video.html#mediaerror}\n * @see [Encrypted MediaError Spec]{@link https://www.w3.org/TR/2013/WD-encrypted-media-20130510/#error-codes}\n *\n * @class MediaError\n */\nfunction MediaError(value) {\n\n  // Allow redundant calls to this constructor to avoid having `instanceof`\n  // checks peppered around the code.\n  if (value instanceof MediaError) {\n    return value;\n  }\n\n  if (typeof value === 'number') {\n    this.code = value;\n  } else if (typeof value === 'string') {\n    // default code is zero, so this is a custom error\n    this.message = value;\n  } else if (isObject(value)) {\n\n    // We assign the `code` property manually because native `MediaError` objects\n    // do not expose it as an own/enumerable property of the object.\n    if (typeof value.code === 'number') {\n      this.code = value.code;\n    }\n\n    assign(this, value);\n  }\n\n  if (!this.message) {\n    this.message = MediaError.defaultMessages[this.code] || '';\n  }\n}\n\n/**\n * The error code that refers two one of the defined `MediaError` types\n *\n * @type {Number}\n */\nMediaError.prototype.code = 0;\n\n/**\n * An optional message that to show with the error. Message is not part of the HTML5\n * video spec but allows for more informative custom errors.\n *\n * @type {String}\n */\nMediaError.prototype.message = '';\n\n/**\n * An optional status code that can be set by plugins to allow even more detail about\n * the error. For example a plugin might provide a specific HTTP status code and an\n * error message for that code. Then when the plugin gets that error this class will\n * know how to display an error message for it. This allows a custom message to show\n * up on the `Player` error overlay.\n *\n * @type {Array}\n */\nMediaError.prototype.status = null;\n\n/**\n * Errors indexed by the W3C standard. The order **CANNOT CHANGE**! See the\n * specification listed under {@link MediaError} for more information.\n *\n * @enum {array}\n * @readonly\n * @property {string} 0 - MEDIA_ERR_CUSTOM\n * @property {string} 1 - MEDIA_ERR_CUSTOM\n * @property {string} 2 - MEDIA_ERR_ABORTED\n * @property {string} 3 - MEDIA_ERR_NETWORK\n * @property {string} 4 - MEDIA_ERR_SRC_NOT_SUPPORTED\n * @property {string} 5 - MEDIA_ERR_ENCRYPTED\n */\nMediaError.errorTypes = ['MEDIA_ERR_CUSTOM', 'MEDIA_ERR_ABORTED', 'MEDIA_ERR_NETWORK', 'MEDIA_ERR_DECODE', 'MEDIA_ERR_SRC_NOT_SUPPORTED', 'MEDIA_ERR_ENCRYPTED'];\n\n/**\n * The default `MediaError` messages based on the {@link MediaError.errorTypes}.\n *\n * @type {Array}\n * @constant\n */\nMediaError.defaultMessages = {\n  1: 'You aborted the media playback',\n  2: 'A network error caused the media download to fail part-way.',\n  3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',\n  4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',\n  5: 'The media is encrypted and we do not have the keys to decrypt it.'\n};\n\n// Add types as properties on MediaError\n// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;\nfor (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {\n  MediaError[MediaError.errorTypes[errNum]] = errNum;\n  // values should be accessible on both the class and instance\n  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;\n}\n\n/**\n * Returns whether an object is `Promise`-like (i.e. has a `then` method).\n *\n * @param  {Object}  value\n *         An object that may or may not be `Promise`-like.\n *\n * @return {Boolean}\n *         Whether or not the object is `Promise`-like.\n */\nfunction isPromise(value) {\n  return value !== undefined && value !== null && typeof value.then === 'function';\n}\n\n/**\n * Silence a Promise-like object.\n *\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n *\n * @param  {Object} value\n *         An object that may or may not be `Promise`-like.\n */\nfunction silencePromise(value) {\n  if (isPromise(value)) {\n    value.then(null, function (e) {});\n  }\n}\n\n/**\n * @file text-track-list-converter.js Utilities for capturing text track state and\n * re-creating tracks based on a capture.\n *\n * @module text-track-list-converter\n */\n\n/**\n * Examine a single {@link TextTrack} and return a JSON-compatible javascript object that\n * represents the {@link TextTrack}'s state.\n *\n * @param {TextTrack} track\n *        The text track to query.\n *\n * @return {Object}\n *         A serializable javascript representation of the TextTrack.\n * @private\n */\nvar trackToJson_ = function trackToJson_(track) {\n  var ret = ['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(function (acc, prop, i) {\n\n    if (track[prop]) {\n      acc[prop] = track[prop];\n    }\n\n    return acc;\n  }, {\n    cues: track.cues && Array.prototype.map.call(track.cues, function (cue) {\n      return {\n        startTime: cue.startTime,\n        endTime: cue.endTime,\n        text: cue.text,\n        id: cue.id\n      };\n    })\n  });\n\n  return ret;\n};\n\n/**\n * Examine a {@link Tech} and return a JSON-compatible javascript array that represents the\n * state of all {@link TextTrack}s currently configured. The return array is compatible with\n * {@link text-track-list-converter:jsonToTextTracks}.\n *\n * @param {Tech} tech\n *        The tech object to query\n *\n * @return {Array}\n *         A serializable javascript representation of the {@link Tech}s\n *         {@link TextTrackList}.\n */\nvar textTracksToJson = function textTracksToJson(tech) {\n\n  var trackEls = tech.$$('track');\n\n  var trackObjs = Array.prototype.map.call(trackEls, function (t) {\n    return t.track;\n  });\n  var tracks = Array.prototype.map.call(trackEls, function (trackEl) {\n    var json = trackToJson_(trackEl.track);\n\n    if (trackEl.src) {\n      json.src = trackEl.src;\n    }\n    return json;\n  });\n\n  return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track) {\n    return trackObjs.indexOf(track) === -1;\n  }).map(trackToJson_));\n};\n\n/**\n * Create a set of remote {@link TextTrack}s on a {@link Tech} based on an array of javascript\n * object {@link TextTrack} representations.\n *\n * @param {Array} json\n *        An array of `TextTrack` representation objects, like those that would be\n *        produced by `textTracksToJson`.\n *\n * @param {Tech} tech\n *        The `Tech` to create the `TextTrack`s on.\n */\nvar jsonToTextTracks = function jsonToTextTracks(json, tech) {\n  json.forEach(function (track) {\n    var addedTrack = tech.addRemoteTextTrack(track).track;\n\n    if (!track.src && track.cues) {\n      track.cues.forEach(function (cue) {\n        return addedTrack.addCue(cue);\n      });\n    }\n  });\n\n  return tech.textTracks();\n};\n\nvar textTrackConverter = { textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_ };\n\n/**\n * @file modal-dialog.js\n */\nvar MODAL_CLASS_NAME = 'vjs-modal-dialog';\nvar ESC = 27;\n\n/**\n * The `ModalDialog` displays over the video and its controls, which blocks\n * interaction with the player until it is closed.\n *\n * Modal dialogs include a \"Close\" button and will close when that button\n * is activated - or when ESC is pressed anywhere.\n *\n * @extends Component\n */\n\nvar ModalDialog = function (_Component) {\n  inherits(ModalDialog, _Component);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Mixed} [options.content=undefined]\n   *        Provide customized content for this modal.\n   *\n   * @param {string} [options.description]\n   *        A text description for the modal, primarily for accessibility.\n   *\n   * @param {boolean} [options.fillAlways=false]\n   *        Normally, modals are automatically filled only the first time\n   *        they open. This tells the modal to refresh its content\n   *        every time it opens.\n   *\n   * @param {string} [options.label]\n   *        A text label for the modal, primarily for accessibility.\n   *\n   * @param {boolean} [options.temporary=true]\n   *        If `true`, the modal can only be opened once; it will be\n   *        disposed as soon as it's closed.\n   *\n   * @param {boolean} [options.uncloseable=false]\n   *        If `true`, the user will not be able to close the modal\n   *        through the UI in the normal ways. Programmatic closing is\n   *        still possible.\n   */\n  function ModalDialog(player, options) {\n    classCallCheck(this, ModalDialog);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.opened_ = _this.hasBeenOpened_ = _this.hasBeenFilled_ = false;\n\n    _this.closeable(!_this.options_.uncloseable);\n    _this.content(_this.options_.content);\n\n    // Make sure the contentEl is defined AFTER any children are initialized\n    // because we only want the contents of the modal in the contentEl\n    // (not the UI elements like the close button).\n    _this.contentEl_ = createEl('div', {\n      className: MODAL_CLASS_NAME + '-content'\n    }, {\n      role: 'document'\n    });\n\n    _this.descEl_ = createEl('p', {\n      className: MODAL_CLASS_NAME + '-description vjs-control-text',\n      id: _this.el().getAttribute('aria-describedby')\n    });\n\n    textContent(_this.descEl_, _this.description());\n    _this.el_.appendChild(_this.descEl_);\n    _this.el_.appendChild(_this.contentEl_);\n    return _this;\n  }\n\n  /**\n   * Create the `ModalDialog`'s DOM element\n   *\n   * @return {Element}\n   *         The DOM element that gets created.\n   */\n\n\n  ModalDialog.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: this.buildCSSClass(),\n      tabIndex: -1\n    }, {\n      'aria-describedby': this.id() + '_description',\n      'aria-hidden': 'true',\n      'aria-label': this.label(),\n      'role': 'dialog'\n    });\n  };\n\n  ModalDialog.prototype.dispose = function dispose() {\n    this.contentEl_ = null;\n    this.descEl_ = null;\n    this.previouslyActiveEl_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  ModalDialog.prototype.buildCSSClass = function buildCSSClass() {\n    return MODAL_CLASS_NAME + ' vjs-hidden ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Handles `keydown` events on the document, looking for ESC, which closes\n   * the modal.\n   *\n   * @param {EventTarget~Event} e\n   *        The keypress that triggered this event.\n   *\n   * @listens keydown\n   */\n\n\n  ModalDialog.prototype.handleKeyPress = function handleKeyPress(e) {\n    if (e.which === ESC && this.closeable()) {\n      this.close();\n    }\n  };\n\n  /**\n   * Returns the label string for this modal. Primarily used for accessibility.\n   *\n   * @return {string}\n   *         the localized or raw label of this modal.\n   */\n\n\n  ModalDialog.prototype.label = function label() {\n    return this.localize(this.options_.label || 'Modal Window');\n  };\n\n  /**\n   * Returns the description string for this modal. Primarily used for\n   * accessibility.\n   *\n   * @return {string}\n   *         The localized or raw description of this modal.\n   */\n\n\n  ModalDialog.prototype.description = function description() {\n    var desc = this.options_.description || this.localize('This is a modal window.');\n\n    // Append a universal closeability message if the modal is closeable.\n    if (this.closeable()) {\n      desc += ' ' + this.localize('This modal can be closed by pressing the Escape key or activating the close button.');\n    }\n\n    return desc;\n  };\n\n  /**\n   * Opens the modal.\n   *\n   * @fires ModalDialog#beforemodalopen\n   * @fires ModalDialog#modalopen\n   */\n\n\n  ModalDialog.prototype.open = function open() {\n    if (!this.opened_) {\n      var player = this.player();\n\n      /**\n        * Fired just before a `ModalDialog` is opened.\n        *\n        * @event ModalDialog#beforemodalopen\n        * @type {EventTarget~Event}\n        */\n      this.trigger('beforemodalopen');\n      this.opened_ = true;\n\n      // Fill content if the modal has never opened before and\n      // never been filled.\n      if (this.options_.fillAlways || !this.hasBeenOpened_ && !this.hasBeenFilled_) {\n        this.fill();\n      }\n\n      // If the player was playing, pause it and take note of its previously\n      // playing state.\n      this.wasPlaying_ = !player.paused();\n\n      if (this.options_.pauseOnOpen && this.wasPlaying_) {\n        player.pause();\n      }\n\n      if (this.closeable()) {\n        this.on(this.el_.ownerDocument, 'keydown', bind(this, this.handleKeyPress));\n      }\n\n      // Hide controls and note if they were enabled.\n      this.hadControls_ = player.controls();\n      player.controls(false);\n\n      this.show();\n      this.conditionalFocus_();\n      this.el().setAttribute('aria-hidden', 'false');\n\n      /**\n        * Fired just after a `ModalDialog` is opened.\n        *\n        * @event ModalDialog#modalopen\n        * @type {EventTarget~Event}\n        */\n      this.trigger('modalopen');\n      this.hasBeenOpened_ = true;\n    }\n  };\n\n  /**\n   * If the `ModalDialog` is currently open or closed.\n   *\n   * @param  {boolean} [value]\n   *         If given, it will open (`true`) or close (`false`) the modal.\n   *\n   * @return {boolean}\n   *         the current open state of the modaldialog\n   */\n\n\n  ModalDialog.prototype.opened = function opened(value) {\n    if (typeof value === 'boolean') {\n      this[value ? 'open' : 'close']();\n    }\n    return this.opened_;\n  };\n\n  /**\n   * Closes the modal, does nothing if the `ModalDialog` is\n   * not open.\n   *\n   * @fires ModalDialog#beforemodalclose\n   * @fires ModalDialog#modalclose\n   */\n\n\n  ModalDialog.prototype.close = function close() {\n    if (!this.opened_) {\n      return;\n    }\n    var player = this.player();\n\n    /**\n      * Fired just before a `ModalDialog` is closed.\n      *\n      * @event ModalDialog#beforemodalclose\n      * @type {EventTarget~Event}\n      */\n    this.trigger('beforemodalclose');\n    this.opened_ = false;\n\n    if (this.wasPlaying_ && this.options_.pauseOnOpen) {\n      player.play();\n    }\n\n    if (this.closeable()) {\n      this.off(this.el_.ownerDocument, 'keydown', bind(this, this.handleKeyPress));\n    }\n\n    if (this.hadControls_) {\n      player.controls(true);\n    }\n\n    this.hide();\n    this.el().setAttribute('aria-hidden', 'true');\n\n    /**\n      * Fired just after a `ModalDialog` is closed.\n      *\n      * @event ModalDialog#modalclose\n      * @type {EventTarget~Event}\n      */\n    this.trigger('modalclose');\n    this.conditionalBlur_();\n\n    if (this.options_.temporary) {\n      this.dispose();\n    }\n  };\n\n  /**\n   * Check to see if the `ModalDialog` is closeable via the UI.\n   *\n   * @param  {boolean} [value]\n   *         If given as a boolean, it will set the `closeable` option.\n   *\n   * @return {boolean}\n   *         Returns the final value of the closable option.\n   */\n\n\n  ModalDialog.prototype.closeable = function closeable(value) {\n    if (typeof value === 'boolean') {\n      var closeable = this.closeable_ = !!value;\n      var close = this.getChild('closeButton');\n\n      // If this is being made closeable and has no close button, add one.\n      if (closeable && !close) {\n\n        // The close button should be a child of the modal - not its\n        // content element, so temporarily change the content element.\n        var temp = this.contentEl_;\n\n        this.contentEl_ = this.el_;\n        close = this.addChild('closeButton', { controlText: 'Close Modal Dialog' });\n        this.contentEl_ = temp;\n        this.on(close, 'close', this.close);\n      }\n\n      // If this is being made uncloseable and has a close button, remove it.\n      if (!closeable && close) {\n        this.off(close, 'close', this.close);\n        this.removeChild(close);\n        close.dispose();\n      }\n    }\n    return this.closeable_;\n  };\n\n  /**\n   * Fill the modal's content element with the modal's \"content\" option.\n   * The content element will be emptied before this change takes place.\n   */\n\n\n  ModalDialog.prototype.fill = function fill() {\n    this.fillWith(this.content());\n  };\n\n  /**\n   * Fill the modal's content element with arbitrary content.\n   * The content element will be emptied before this change takes place.\n   *\n   * @fires ModalDialog#beforemodalfill\n   * @fires ModalDialog#modalfill\n   *\n   * @param {Mixed} [content]\n   *        The same rules apply to this as apply to the `content` option.\n   */\n\n\n  ModalDialog.prototype.fillWith = function fillWith(content) {\n    var contentEl = this.contentEl();\n    var parentEl = contentEl.parentNode;\n    var nextSiblingEl = contentEl.nextSibling;\n\n    /**\n     * Fired just before a `ModalDialog` is filled with content.\n     *\n     * @event ModalDialog#beforemodalfill\n     * @type {EventTarget~Event}\n     */\n    this.trigger('beforemodalfill');\n    this.hasBeenFilled_ = true;\n\n    // Detach the content element from the DOM before performing\n    // manipulation to avoid modifying the live DOM multiple times.\n    parentEl.removeChild(contentEl);\n    this.empty();\n    insertContent(contentEl, content);\n    /**\n     * Fired just after a `ModalDialog` is filled with content.\n     *\n     * @event ModalDialog#modalfill\n     * @type {EventTarget~Event}\n     */\n    this.trigger('modalfill');\n\n    // Re-inject the re-filled content element.\n    if (nextSiblingEl) {\n      parentEl.insertBefore(contentEl, nextSiblingEl);\n    } else {\n      parentEl.appendChild(contentEl);\n    }\n\n    // make sure that the close button is last in the dialog DOM\n    var closeButton = this.getChild('closeButton');\n\n    if (closeButton) {\n      parentEl.appendChild(closeButton.el_);\n    }\n  };\n\n  /**\n   * Empties the content element. This happens anytime the modal is filled.\n   *\n   * @fires ModalDialog#beforemodalempty\n   * @fires ModalDialog#modalempty\n   */\n\n\n  ModalDialog.prototype.empty = function empty() {\n    /**\n     * Fired just before a `ModalDialog` is emptied.\n     *\n     * @event ModalDialog#beforemodalempty\n     * @type {EventTarget~Event}\n     */\n    this.trigger('beforemodalempty');\n    emptyEl(this.contentEl());\n\n    /**\n     * Fired just after a `ModalDialog` is emptied.\n     *\n     * @event ModalDialog#modalempty\n     * @type {EventTarget~Event}\n     */\n    this.trigger('modalempty');\n  };\n\n  /**\n   * Gets or sets the modal content, which gets normalized before being\n   * rendered into the DOM.\n   *\n   * This does not update the DOM or fill the modal, but it is called during\n   * that process.\n   *\n   * @param  {Mixed} [value]\n   *         If defined, sets the internal content value to be used on the\n   *         next call(s) to `fill`. This value is normalized before being\n   *         inserted. To \"clear\" the internal content value, pass `null`.\n   *\n   * @return {Mixed}\n   *         The current content of the modal dialog\n   */\n\n\n  ModalDialog.prototype.content = function content(value) {\n    if (typeof value !== 'undefined') {\n      this.content_ = value;\n    }\n    return this.content_;\n  };\n\n  /**\n   * conditionally focus the modal dialog if focus was previously on the player.\n   *\n   * @private\n   */\n\n\n  ModalDialog.prototype.conditionalFocus_ = function conditionalFocus_() {\n    var activeEl = document.activeElement;\n    var playerEl = this.player_.el_;\n\n    this.previouslyActiveEl_ = null;\n\n    if (playerEl.contains(activeEl) || playerEl === activeEl) {\n      this.previouslyActiveEl_ = activeEl;\n\n      this.focus();\n\n      this.on(document, 'keydown', this.handleKeyDown);\n    }\n  };\n\n  /**\n   * conditionally blur the element and refocus the last focused element\n   *\n   * @private\n   */\n\n\n  ModalDialog.prototype.conditionalBlur_ = function conditionalBlur_() {\n    if (this.previouslyActiveEl_) {\n      this.previouslyActiveEl_.focus();\n      this.previouslyActiveEl_ = null;\n    }\n\n    this.off(document, 'keydown', this.handleKeyDown);\n  };\n\n  /**\n   * Keydown handler. Attached when modal is focused.\n   *\n   * @listens keydown\n   */\n\n\n  ModalDialog.prototype.handleKeyDown = function handleKeyDown(event) {\n    // exit early if it isn't a tab key\n    if (event.which !== 9) {\n      return;\n    }\n\n    var focusableEls = this.focusableEls_();\n    var activeEl = this.el_.querySelector(':focus');\n    var focusIndex = void 0;\n\n    for (var i = 0; i < focusableEls.length; i++) {\n      if (activeEl === focusableEls[i]) {\n        focusIndex = i;\n        break;\n      }\n    }\n\n    if (document.activeElement === this.el_) {\n      focusIndex = 0;\n    }\n\n    if (event.shiftKey && focusIndex === 0) {\n      focusableEls[focusableEls.length - 1].focus();\n      event.preventDefault();\n    } else if (!event.shiftKey && focusIndex === focusableEls.length - 1) {\n      focusableEls[0].focus();\n      event.preventDefault();\n    }\n  };\n\n  /**\n   * get all focusable elements\n   *\n   * @private\n   */\n\n\n  ModalDialog.prototype.focusableEls_ = function focusableEls_() {\n    var allChildren = this.el_.querySelectorAll('*');\n\n    return Array.prototype.filter.call(allChildren, function (child) {\n      return (child instanceof window.HTMLAnchorElement || child instanceof window.HTMLAreaElement) && child.hasAttribute('href') || (child instanceof window.HTMLInputElement || child instanceof window.HTMLSelectElement || child instanceof window.HTMLTextAreaElement || child instanceof window.HTMLButtonElement) && !child.hasAttribute('disabled') || child instanceof window.HTMLIFrameElement || child instanceof window.HTMLObjectElement || child instanceof window.HTMLEmbedElement || child.hasAttribute('tabindex') && child.getAttribute('tabindex') !== -1 || child.hasAttribute('contenteditable');\n    });\n  };\n\n  return ModalDialog;\n}(Component);\n\n/**\n * Default options for `ModalDialog` default options.\n *\n * @type {Object}\n * @private\n */\n\n\nModalDialog.prototype.options_ = {\n  pauseOnOpen: true,\n  temporary: true\n};\n\nComponent.registerComponent('ModalDialog', ModalDialog);\n\n/**\n * @file track-list.js\n */\n/**\n * Common functionaliy between {@link TextTrackList}, {@link AudioTrackList}, and\n * {@link VideoTrackList}\n *\n * @extends EventTarget\n */\n\nvar TrackList = function (_EventTarget) {\n  inherits(TrackList, _EventTarget);\n\n  /**\n   * Create an instance of this class\n   *\n   * @param {Track[]} tracks\n   *        A list of tracks to initialize the list with.\n   *\n   * @param {Object} [list]\n   *        The child object with inheritance done manually for ie8.\n   *\n   * @abstract\n   */\n  function TrackList() {\n    var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n    var _ret;\n\n    var list = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n    classCallCheck(this, TrackList);\n\n    var _this = possibleConstructorReturn(this, _EventTarget.call(this));\n\n    if (!list) {\n      list = _this; // eslint-disable-line\n      if (IS_IE8) {\n        list = document.createElement('custom');\n        for (var prop in TrackList.prototype) {\n          if (prop !== 'constructor') {\n            list[prop] = TrackList.prototype[prop];\n          }\n        }\n      }\n    }\n\n    list.tracks_ = [];\n\n    /**\n     * @memberof TrackList\n     * @member {number} length\n     *         The current number of `Track`s in the this Trackist.\n     * @instance\n     */\n    Object.defineProperty(list, 'length', {\n      get: function get$$1() {\n        return this.tracks_.length;\n      }\n    });\n\n    for (var i = 0; i < tracks.length; i++) {\n      list.addTrack(tracks[i]);\n    }\n\n    // must return the object, as for ie8 it will not be this\n    // but a reference to a document object\n    return _ret = list, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add a {@link Track} to the `TrackList`\n   *\n   * @param {Track} track\n   *        The audio, video, or text track to add to the list.\n   *\n   * @fires TrackList#addtrack\n   */\n\n\n  TrackList.prototype.addTrack = function addTrack(track) {\n    var index = this.tracks_.length;\n\n    if (!('' + index in this)) {\n      Object.defineProperty(this, index, {\n        get: function get$$1() {\n          return this.tracks_[index];\n        }\n      });\n    }\n\n    // Do not add duplicate tracks\n    if (this.tracks_.indexOf(track) === -1) {\n      this.tracks_.push(track);\n      /**\n       * Triggered when a track is added to a track list.\n       *\n       * @event TrackList#addtrack\n       * @type {EventTarget~Event}\n       * @property {Track} track\n       *           A reference to track that was added.\n       */\n      this.trigger({\n        track: track,\n        type: 'addtrack'\n      });\n    }\n  };\n\n  /**\n   * Remove a {@link Track} from the `TrackList`\n   *\n   * @param {Track} rtrack\n   *        The audio, video, or text track to remove from the list.\n   *\n   * @fires TrackList#removetrack\n   */\n\n\n  TrackList.prototype.removeTrack = function removeTrack(rtrack) {\n    var track = void 0;\n\n    for (var i = 0, l = this.length; i < l; i++) {\n      if (this[i] === rtrack) {\n        track = this[i];\n        if (track.off) {\n          track.off();\n        }\n\n        this.tracks_.splice(i, 1);\n\n        break;\n      }\n    }\n\n    if (!track) {\n      return;\n    }\n\n    /**\n     * Triggered when a track is removed from track list.\n     *\n     * @event TrackList#removetrack\n     * @type {EventTarget~Event}\n     * @property {Track} track\n     *           A reference to track that was removed.\n     */\n    this.trigger({\n      track: track,\n      type: 'removetrack'\n    });\n  };\n\n  /**\n   * Get a Track from the TrackList by a tracks id\n   *\n   * @param {String} id - the id of the track to get\n   * @method getTrackById\n   * @return {Track}\n   * @private\n   */\n\n\n  TrackList.prototype.getTrackById = function getTrackById(id) {\n    var result = null;\n\n    for (var i = 0, l = this.length; i < l; i++) {\n      var track = this[i];\n\n      if (track.id === id) {\n        result = track;\n        break;\n      }\n    }\n\n    return result;\n  };\n\n  return TrackList;\n}(EventTarget);\n\n/**\n * Triggered when a different track is selected/enabled.\n *\n * @event TrackList#change\n * @type {EventTarget~Event}\n */\n\n/**\n * Events that can be called with on + eventName. See {@link EventHandler}.\n *\n * @property {Object} TrackList#allowedEvents_\n * @private\n */\n\n\nTrackList.prototype.allowedEvents_ = {\n  change: 'change',\n  addtrack: 'addtrack',\n  removetrack: 'removetrack'\n};\n\n// emulate attribute EventHandler support to allow for feature detection\nfor (var event in TrackList.prototype.allowedEvents_) {\n  TrackList.prototype['on' + event] = null;\n}\n\n/**\n * @file audio-track-list.js\n */\n/**\n * Anywhere we call this function we diverge from the spec\n * as we only support one enabled audiotrack at a time\n *\n * @param {AudioTrackList} list\n *        list to work on\n *\n * @param {AudioTrack} track\n *        The track to skip\n *\n * @private\n */\nvar disableOthers = function disableOthers(list, track) {\n  for (var i = 0; i < list.length; i++) {\n    if (!Object.keys(list[i]).length || track.id === list[i].id) {\n      continue;\n    }\n    // another audio track is enabled, disable it\n    list[i].enabled = false;\n  }\n};\n\n/**\n * The current list of {@link AudioTrack} for a media file.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist}\n * @extends TrackList\n */\n\nvar AudioTrackList = function (_TrackList) {\n  inherits(AudioTrackList, _TrackList);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {AudioTrack[]} [tracks=[]]\n   *        A list of `AudioTrack` to instantiate the list with.\n   */\n  function AudioTrackList() {\n    var _this, _ret;\n\n    var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    classCallCheck(this, AudioTrackList);\n\n    var list = void 0;\n\n    // make sure only 1 track is enabled\n    // sorted from last index to first index\n    for (var i = tracks.length - 1; i >= 0; i--) {\n      if (tracks[i].enabled) {\n        disableOthers(tracks, tracks[i]);\n        break;\n      }\n    }\n\n    // IE8 forces us to implement inheritance ourselves\n    // as it does not support Object.defineProperty properly\n    if (IS_IE8) {\n      list = document.createElement('custom');\n      for (var prop in TrackList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = TrackList.prototype[prop];\n        }\n      }\n      for (var _prop in AudioTrackList.prototype) {\n        if (_prop !== 'constructor') {\n          list[_prop] = AudioTrackList.prototype[_prop];\n        }\n      }\n    }\n\n    list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this);\n    list.changing_ = false;\n\n    return _ret = list, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add an {@link AudioTrack} to the `AudioTrackList`.\n   *\n   * @param {AudioTrack} track\n   *        The AudioTrack to add to the list\n   *\n   * @fires TrackList#addtrack\n   */\n\n\n  AudioTrackList.prototype.addTrack = function addTrack(track) {\n    var _this2 = this;\n\n    if (track.enabled) {\n      disableOthers(this, track);\n    }\n\n    _TrackList.prototype.addTrack.call(this, track);\n    // native tracks don't have this\n    if (!track.addEventListener) {\n      return;\n    }\n\n    /**\n     * @listens AudioTrack#enabledchange\n     * @fires TrackList#change\n     */\n    track.addEventListener('enabledchange', function () {\n      // when we are disabling other tracks (since we don't support\n      // more than one track at a time) we will set changing_\n      // to true so that we don't trigger additional change events\n      if (_this2.changing_) {\n        return;\n      }\n      _this2.changing_ = true;\n      disableOthers(_this2, track);\n      _this2.changing_ = false;\n      _this2.trigger('change');\n    });\n  };\n\n  return AudioTrackList;\n}(TrackList);\n\n/**\n * @file video-track-list.js\n */\n/**\n * Un-select all other {@link VideoTrack}s that are selected.\n *\n * @param {VideoTrackList} list\n *        list to work on\n *\n * @param {VideoTrack} track\n *        The track to skip\n *\n * @private\n */\nvar disableOthers$1 = function disableOthers(list, track) {\n  for (var i = 0; i < list.length; i++) {\n    if (!Object.keys(list[i]).length || track.id === list[i].id) {\n      continue;\n    }\n    // another video track is enabled, disable it\n    list[i].selected = false;\n  }\n};\n\n/**\n * The current list of {@link VideoTrack} for a video.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist}\n * @extends TrackList\n */\n\nvar VideoTrackList = function (_TrackList) {\n  inherits(VideoTrackList, _TrackList);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {VideoTrack[]} [tracks=[]]\n   *        A list of `VideoTrack` to instantiate the list with.\n   */\n  function VideoTrackList() {\n    var _this, _ret;\n\n    var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    classCallCheck(this, VideoTrackList);\n\n    var list = void 0;\n\n    // make sure only 1 track is enabled\n    // sorted from last index to first index\n    for (var i = tracks.length - 1; i >= 0; i--) {\n      if (tracks[i].selected) {\n        disableOthers$1(tracks, tracks[i]);\n        break;\n      }\n    }\n\n    // IE8 forces us to implement inheritance ourselves\n    // as it does not support Object.defineProperty properly\n    if (IS_IE8) {\n      list = document.createElement('custom');\n      for (var prop in TrackList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = TrackList.prototype[prop];\n        }\n      }\n      for (var _prop in VideoTrackList.prototype) {\n        if (_prop !== 'constructor') {\n          list[_prop] = VideoTrackList.prototype[_prop];\n        }\n      }\n    }\n\n    list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this);\n    list.changing_ = false;\n\n    /**\n     * @member {number} VideoTrackList#selectedIndex\n     *         The current index of the selected {@link VideoTrack`}.\n     */\n    Object.defineProperty(list, 'selectedIndex', {\n      get: function get$$1() {\n        for (var _i = 0; _i < this.length; _i++) {\n          if (this[_i].selected) {\n            return _i;\n          }\n        }\n        return -1;\n      },\n      set: function set$$1() {}\n    });\n\n    return _ret = list, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add a {@link VideoTrack} to the `VideoTrackList`.\n   *\n   * @param {VideoTrack} track\n   *        The VideoTrack to add to the list\n   *\n   * @fires TrackList#addtrack\n   */\n\n\n  VideoTrackList.prototype.addTrack = function addTrack(track) {\n    var _this2 = this;\n\n    if (track.selected) {\n      disableOthers$1(this, track);\n    }\n\n    _TrackList.prototype.addTrack.call(this, track);\n    // native tracks don't have this\n    if (!track.addEventListener) {\n      return;\n    }\n\n    /**\n     * @listens VideoTrack#selectedchange\n     * @fires TrackList#change\n     */\n    track.addEventListener('selectedchange', function () {\n      if (_this2.changing_) {\n        return;\n      }\n      _this2.changing_ = true;\n      disableOthers$1(_this2, track);\n      _this2.changing_ = false;\n      _this2.trigger('change');\n    });\n  };\n\n  return VideoTrackList;\n}(TrackList);\n\n/**\n * @file text-track-list.js\n */\n/**\n * The current list of {@link TextTrack} for a media file.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist}\n * @extends TrackList\n */\n\nvar TextTrackList = function (_TrackList) {\n  inherits(TextTrackList, _TrackList);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {TextTrack[]} [tracks=[]]\n   *        A list of `TextTrack` to instantiate the list with.\n   */\n  function TextTrackList() {\n    var _this, _ret;\n\n    var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    classCallCheck(this, TextTrackList);\n\n    var list = void 0;\n\n    // IE8 forces us to implement inheritance ourselves\n    // as it does not support Object.defineProperty properly\n    if (IS_IE8) {\n      list = document.createElement('custom');\n      for (var prop in TrackList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = TrackList.prototype[prop];\n        }\n      }\n      for (var _prop in TextTrackList.prototype) {\n        if (_prop !== 'constructor') {\n          list[_prop] = TextTrackList.prototype[_prop];\n        }\n      }\n    }\n\n    list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this);\n    return _ret = list, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add a {@link TextTrack} to the `TextTrackList`\n   *\n   * @param {TextTrack} track\n   *        The text track to add to the list.\n   *\n   * @fires TrackList#addtrack\n   */\n\n\n  TextTrackList.prototype.addTrack = function addTrack(track) {\n    _TrackList.prototype.addTrack.call(this, track);\n\n    /**\n     * @listens TextTrack#modechange\n     * @fires TrackList#change\n     */\n    track.addEventListener('modechange', bind(this, function () {\n      this.trigger('change');\n    }));\n\n    var nonLanguageTextTrackKind = ['metadata', 'chapters'];\n\n    if (nonLanguageTextTrackKind.indexOf(track.kind) === -1) {\n      track.addEventListener('modechange', bind(this, function () {\n        this.trigger('selectedlanguagechange');\n      }));\n    }\n  };\n\n  return TextTrackList;\n}(TrackList);\n\n/**\n * @file html-track-element-list.js\n */\n\n/**\n * The current list of {@link HtmlTrackElement}s.\n */\n\nvar HtmlTrackElementList = function () {\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {HtmlTrackElement[]} [tracks=[]]\n   *        A list of `HtmlTrackElement` to instantiate the list with.\n   */\n  function HtmlTrackElementList() {\n    var trackElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    classCallCheck(this, HtmlTrackElementList);\n\n    var list = this; // eslint-disable-line\n\n    if (IS_IE8) {\n      list = document.createElement('custom');\n\n      for (var prop in HtmlTrackElementList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = HtmlTrackElementList.prototype[prop];\n        }\n      }\n    }\n\n    list.trackElements_ = [];\n\n    /**\n     * @memberof HtmlTrackElementList\n     * @member {number} length\n     *         The current number of `Track`s in the this Trackist.\n     * @instance\n     */\n    Object.defineProperty(list, 'length', {\n      get: function get$$1() {\n        return this.trackElements_.length;\n      }\n    });\n\n    for (var i = 0, length = trackElements.length; i < length; i++) {\n      list.addTrackElement_(trackElements[i]);\n    }\n\n    if (IS_IE8) {\n      return list;\n    }\n  }\n\n  /**\n   * Add an {@link HtmlTrackElement} to the `HtmlTrackElementList`\n   *\n   * @param {HtmlTrackElement} trackElement\n   *        The track element to add to the list.\n   *\n   * @private\n   */\n\n\n  HtmlTrackElementList.prototype.addTrackElement_ = function addTrackElement_(trackElement) {\n    var index = this.trackElements_.length;\n\n    if (!('' + index in this)) {\n      Object.defineProperty(this, index, {\n        get: function get$$1() {\n          return this.trackElements_[index];\n        }\n      });\n    }\n\n    // Do not add duplicate elements\n    if (this.trackElements_.indexOf(trackElement) === -1) {\n      this.trackElements_.push(trackElement);\n    }\n  };\n\n  /**\n   * Get an {@link HtmlTrackElement} from the `HtmlTrackElementList` given an\n   * {@link TextTrack}.\n   *\n   * @param {TextTrack} track\n   *        The track associated with a track element.\n   *\n   * @return {HtmlTrackElement|undefined}\n   *         The track element that was found or undefined.\n   *\n   * @private\n   */\n\n\n  HtmlTrackElementList.prototype.getTrackElementByTrack_ = function getTrackElementByTrack_(track) {\n    var trackElement_ = void 0;\n\n    for (var i = 0, length = this.trackElements_.length; i < length; i++) {\n      if (track === this.trackElements_[i].track) {\n        trackElement_ = this.trackElements_[i];\n\n        break;\n      }\n    }\n\n    return trackElement_;\n  };\n\n  /**\n   * Remove a {@link HtmlTrackElement} from the `HtmlTrackElementList`\n   *\n   * @param {HtmlTrackElement} trackElement\n   *        The track element to remove from the list.\n   *\n   * @private\n   */\n\n\n  HtmlTrackElementList.prototype.removeTrackElement_ = function removeTrackElement_(trackElement) {\n    for (var i = 0, length = this.trackElements_.length; i < length; i++) {\n      if (trackElement === this.trackElements_[i]) {\n        this.trackElements_.splice(i, 1);\n\n        break;\n      }\n    }\n  };\n\n  return HtmlTrackElementList;\n}();\n\n/**\n * @file text-track-cue-list.js\n */\n/**\n * @typedef {Object} TextTrackCueList~TextTrackCue\n *\n * @property {string} id\n *           The unique id for this text track cue\n *\n * @property {number} startTime\n *           The start time for this text track cue\n *\n * @property {number} endTime\n *           The end time for this text track cue\n *\n * @property {boolean} pauseOnExit\n *           Pause when the end time is reached if true.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcue}\n */\n\n/**\n * A List of TextTrackCues.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist}\n */\n\nvar TextTrackCueList = function () {\n\n  /**\n   * Create an instance of this class..\n   *\n   * @param {Array} cues\n   *        A list of cues to be initialized with\n   */\n  function TextTrackCueList(cues) {\n    classCallCheck(this, TextTrackCueList);\n\n    var list = this; // eslint-disable-line\n\n    if (IS_IE8) {\n      list = document.createElement('custom');\n\n      for (var prop in TextTrackCueList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = TextTrackCueList.prototype[prop];\n        }\n      }\n    }\n\n    TextTrackCueList.prototype.setCues_.call(list, cues);\n\n    /**\n     * @memberof TextTrackCueList\n     * @member {number} length\n     *         The current number of `TextTrackCue`s in the TextTrackCueList.\n     * @instance\n     */\n    Object.defineProperty(list, 'length', {\n      get: function get$$1() {\n        return this.length_;\n      }\n    });\n\n    if (IS_IE8) {\n      return list;\n    }\n  }\n\n  /**\n   * A setter for cues in this list. Creates getters\n   * an an index for the cues.\n   *\n   * @param {Array} cues\n   *        An array of cues to set\n   *\n   * @private\n   */\n\n\n  TextTrackCueList.prototype.setCues_ = function setCues_(cues) {\n    var oldLength = this.length || 0;\n    var i = 0;\n    var l = cues.length;\n\n    this.cues_ = cues;\n    this.length_ = cues.length;\n\n    var defineProp = function defineProp(index) {\n      if (!('' + index in this)) {\n        Object.defineProperty(this, '' + index, {\n          get: function get$$1() {\n            return this.cues_[index];\n          }\n        });\n      }\n    };\n\n    if (oldLength < l) {\n      i = oldLength;\n\n      for (; i < l; i++) {\n        defineProp.call(this, i);\n      }\n    }\n  };\n\n  /**\n   * Get a `TextTrackCue` that is currently in the `TextTrackCueList` by id.\n   *\n   * @param {string} id\n   *        The id of the cue that should be searched for.\n   *\n   * @return {TextTrackCueList~TextTrackCue|null}\n   *         A single cue or null if none was found.\n   */\n\n\n  TextTrackCueList.prototype.getCueById = function getCueById(id) {\n    var result = null;\n\n    for (var i = 0, l = this.length; i < l; i++) {\n      var cue = this[i];\n\n      if (cue.id === id) {\n        result = cue;\n        break;\n      }\n    }\n\n    return result;\n  };\n\n  return TextTrackCueList;\n}();\n\n/**\n * @file track-kinds.js\n */\n\n/**\n * All possible `VideoTrackKind`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-videotrack-kind\n * @typedef VideoTrack~Kind\n * @enum\n */\nvar VideoTrackKind = {\n  alternative: 'alternative',\n  captions: 'captions',\n  main: 'main',\n  sign: 'sign',\n  subtitles: 'subtitles',\n  commentary: 'commentary'\n};\n\n/**\n * All possible `AudioTrackKind`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-audiotrack-kind\n * @typedef AudioTrack~Kind\n * @enum\n */\nvar AudioTrackKind = {\n  'alternative': 'alternative',\n  'descriptions': 'descriptions',\n  'main': 'main',\n  'main-desc': 'main-desc',\n  'translation': 'translation',\n  'commentary': 'commentary'\n};\n\n/**\n * All possible `TextTrackKind`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-texttrack-kind\n * @typedef TextTrack~Kind\n * @enum\n */\nvar TextTrackKind = {\n  subtitles: 'subtitles',\n  captions: 'captions',\n  descriptions: 'descriptions',\n  chapters: 'chapters',\n  metadata: 'metadata'\n};\n\n/**\n * All possible `TextTrackMode`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode\n * @typedef TextTrack~Mode\n * @enum\n */\nvar TextTrackMode = {\n  disabled: 'disabled',\n  hidden: 'hidden',\n  showing: 'showing'\n};\n\n/**\n * @file track.js\n */\n/**\n * A Track class that contains all of the common functionality for {@link AudioTrack},\n * {@link VideoTrack}, and {@link TextTrack}.\n *\n * > Note: This class should not be used directly\n *\n * @see {@link https://html.spec.whatwg.org/multipage/embedded-content.html}\n * @extends EventTarget\n * @abstract\n */\n\nvar Track = function (_EventTarget) {\n  inherits(Track, _EventTarget);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} [options={}]\n   *        Object of option names and values\n   *\n   * @param {string} [options.kind='']\n   *        A valid kind for the track type you are creating.\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this AudioTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @abstract\n   */\n  function Track() {\n    var _ret;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, Track);\n\n    var _this = possibleConstructorReturn(this, _EventTarget.call(this));\n\n    var track = _this; // eslint-disable-line\n\n    if (IS_IE8) {\n      track = document.createElement('custom');\n      for (var prop in Track.prototype) {\n        if (prop !== 'constructor') {\n          track[prop] = Track.prototype[prop];\n        }\n      }\n    }\n\n    var trackProps = {\n      id: options.id || 'vjs_track_' + newGUID(),\n      kind: options.kind || '',\n      label: options.label || '',\n      language: options.language || ''\n    };\n\n    /**\n     * @memberof Track\n     * @member {string} id\n     *         The id of this track. Cannot be changed after creation.\n     * @instance\n     *\n     * @readonly\n     */\n\n    /**\n     * @memberof Track\n     * @member {string} kind\n     *         The kind of track that this is. Cannot be changed after creation.\n     * @instance\n     *\n     * @readonly\n     */\n\n    /**\n     * @memberof Track\n     * @member {string} label\n     *         The label of this track. Cannot be changed after creation.\n     * @instance\n     *\n     * @readonly\n     */\n\n    /**\n     * @memberof Track\n     * @member {string} language\n     *         The two letter language code for this track. Cannot be changed after\n     *         creation.\n     * @instance\n     *\n     * @readonly\n     */\n\n    var _loop = function _loop(key) {\n      Object.defineProperty(track, key, {\n        get: function get$$1() {\n          return trackProps[key];\n        },\n        set: function set$$1() {}\n      });\n    };\n\n    for (var key in trackProps) {\n      _loop(key);\n    }\n\n    return _ret = track, possibleConstructorReturn(_this, _ret);\n  }\n\n  return Track;\n}(EventTarget);\n\n/**\n * @file url.js\n * @module url\n */\n/**\n * @typedef {Object} url:URLObject\n *\n * @property {string} protocol\n *           The protocol of the url that was parsed.\n *\n * @property {string} hostname\n *           The hostname of the url that was parsed.\n *\n * @property {string} port\n *           The port of the url that was parsed.\n *\n * @property {string} pathname\n *           The pathname of the url that was parsed.\n *\n * @property {string} search\n *           The search query of the url that was parsed.\n *\n * @property {string} hash\n *           The hash of the url that was parsed.\n *\n * @property {string} host\n *           The host of the url that was parsed.\n */\n\n/**\n * Resolve and parse the elements of a URL.\n *\n * @param  {String} url\n *         The url to parse\n *\n * @return {url:URLObject}\n *         An object of url details\n */\nvar parseUrl = function parseUrl(url) {\n  var props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];\n\n  // add the url to an anchor and let the browser parse the URL\n  var a = document.createElement('a');\n\n  a.href = url;\n\n  // IE8 (and 9?) Fix\n  // ie8 doesn't parse the URL correctly until the anchor is actually\n  // added to the body, and an innerHTML is needed to trigger the parsing\n  var addToBody = a.host === '' && a.protocol !== 'file:';\n  var div = void 0;\n\n  if (addToBody) {\n    div = document.createElement('div');\n    div.innerHTML = '<a href=\"' + url + '\"></a>';\n    a = div.firstChild;\n    // prevent the div from affecting layout\n    div.setAttribute('style', 'display:none; position:absolute;');\n    document.body.appendChild(div);\n  }\n\n  // Copy the specific URL properties to a new object\n  // This is also needed for IE8 because the anchor loses its\n  // properties when it's removed from the dom\n  var details = {};\n\n  for (var i = 0; i < props.length; i++) {\n    details[props[i]] = a[props[i]];\n  }\n\n  // IE9 adds the port to the host property unlike everyone else. If\n  // a port identifier is added for standard ports, strip it.\n  if (details.protocol === 'http:') {\n    details.host = details.host.replace(/:80$/, '');\n  }\n\n  if (details.protocol === 'https:') {\n    details.host = details.host.replace(/:443$/, '');\n  }\n\n  if (!details.protocol) {\n    details.protocol = window.location.protocol;\n  }\n\n  if (addToBody) {\n    document.body.removeChild(div);\n  }\n\n  return details;\n};\n\n/**\n * Get absolute version of relative URL. Used to tell flash correct URL.\n *\n *\n * @param  {string} url\n *         URL to make absolute\n *\n * @return {string}\n *         Absolute URL\n *\n * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue\n */\nvar getAbsoluteURL = function getAbsoluteURL(url) {\n  // Check if absolute URL\n  if (!url.match(/^https?:\\/\\//)) {\n    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.\n    var div = document.createElement('div');\n\n    div.innerHTML = '<a href=\"' + url + '\">x</a>';\n    url = div.firstChild.href;\n  }\n\n  return url;\n};\n\n/**\n * Returns the extension of the passed file name. It will return an empty string\n * if passed an invalid path.\n *\n * @param {string} path\n *        The fileName path like '/path/to/file.mp4'\n *\n * @returns {string}\n *          The extension in lower case or an empty string if no\n *          extension could be found.\n */\nvar getFileExtension = function getFileExtension(path) {\n  if (typeof path === 'string') {\n    var splitPathRe = /^(\\/?)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?)(\\.([^\\.\\/\\?]+)))(?:[\\/]*|[\\?].*)$/i;\n    var pathParts = splitPathRe.exec(path);\n\n    if (pathParts) {\n      return pathParts.pop().toLowerCase();\n    }\n  }\n\n  return '';\n};\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @param {string} url\n *        The url to check.\n *\n * @return {boolean}\n *         Whether it is a cross domain request or not.\n */\nvar isCrossOrigin = function isCrossOrigin(url) {\n  var winLoc = window.location;\n  var urlInfo = parseUrl(url);\n\n  // IE8 protocol relative urls will return ':' for protocol\n  var srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;\n\n  // Check if url is for another domain/origin\n  // IE8 doesn't know location.origin, so we won't rely on it here\n  var crossOrigin = srcProtocol + urlInfo.host !== winLoc.protocol + winLoc.host;\n\n  return crossOrigin;\n};\n\nvar Url = (Object.freeze || Object)({\n\tparseUrl: parseUrl,\n\tgetAbsoluteURL: getAbsoluteURL,\n\tgetFileExtension: getFileExtension,\n\tisCrossOrigin: isCrossOrigin\n});\n\n/**\n * @file text-track.js\n */\n/**\n * Takes a webvtt file contents and parses it into cues\n *\n * @param {string} srcContent\n *        webVTT file contents\n *\n * @param {TextTrack} track\n *        TextTrack to add cues to. Cues come from the srcContent.\n *\n * @private\n */\nvar parseCues = function parseCues(srcContent, track) {\n  var parser = new window.WebVTT.Parser(window, window.vttjs, window.WebVTT.StringDecoder());\n  var errors = [];\n\n  parser.oncue = function (cue) {\n    track.addCue(cue);\n  };\n\n  parser.onparsingerror = function (error) {\n    errors.push(error);\n  };\n\n  parser.onflush = function () {\n    track.trigger({\n      type: 'loadeddata',\n      target: track\n    });\n  };\n\n  parser.parse(srcContent);\n  if (errors.length > 0) {\n    if (window.console && window.console.groupCollapsed) {\n      window.console.groupCollapsed('Text Track parsing errors for ' + track.src);\n    }\n    errors.forEach(function (error) {\n      return log$1.error(error);\n    });\n    if (window.console && window.console.groupEnd) {\n      window.console.groupEnd();\n    }\n  }\n\n  parser.flush();\n};\n\n/**\n * Load a `TextTrack` from a specifed url.\n *\n * @param {string} src\n *        Url to load track from.\n *\n * @param {TextTrack} track\n *        Track to add cues to. Comes from the content at the end of `url`.\n *\n * @private\n */\nvar loadTrack = function loadTrack(src, track) {\n  var opts = {\n    uri: src\n  };\n  var crossOrigin = isCrossOrigin(src);\n\n  if (crossOrigin) {\n    opts.cors = crossOrigin;\n  }\n\n  xhr(opts, bind(this, function (err, response, responseBody) {\n    if (err) {\n      return log$1.error(err, response);\n    }\n\n    track.loaded_ = true;\n\n    // Make sure that vttjs has loaded, otherwise, wait till it finished loading\n    // NOTE: this is only used for the alt/video.novtt.js build\n    if (typeof window.WebVTT !== 'function') {\n      if (track.tech_) {\n        var loadHandler = function loadHandler() {\n          return parseCues(responseBody, track);\n        };\n\n        track.tech_.on('vttjsloaded', loadHandler);\n        track.tech_.on('vttjserror', function () {\n          log$1.error('vttjs failed to load, stopping trying to process ' + track.src);\n          track.tech_.off('vttjsloaded', loadHandler);\n        });\n      }\n    } else {\n      parseCues(responseBody, track);\n    }\n  }));\n};\n\n/**\n * A representation of a single `TextTrack`.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack}\n * @extends Track\n */\n\nvar TextTrack = function (_Track) {\n  inherits(TextTrack, _Track);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} options={}\n   *        Object of option names and values\n   *\n   * @param {Tech} options.tech\n   *        A reference to the tech that owns this TextTrack.\n   *\n   * @param {TextTrack~Kind} [options.kind='subtitles']\n   *        A valid text track kind.\n   *\n   * @param {TextTrack~Mode} [options.mode='disabled']\n   *        A valid text track mode.\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this TextTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @param {string} [options.srclang='']\n   *        A valid two character language code. An alternative, but deprioritized\n   *        vesion of `options.language`\n   *\n   * @param {string} [options.src]\n   *        A url to TextTrack cues.\n   *\n   * @param {boolean} [options.default]\n   *        If this track should default to on or off.\n   */\n  function TextTrack() {\n    var _this, _ret;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, TextTrack);\n\n    if (!options.tech) {\n      throw new Error('A tech was not provided.');\n    }\n\n    var settings = mergeOptions(options, {\n      kind: TextTrackKind[options.kind] || 'subtitles',\n      language: options.language || options.srclang || ''\n    });\n    var mode = TextTrackMode[settings.mode] || 'disabled';\n    var default_ = settings['default'];\n\n    if (settings.kind === 'metadata' || settings.kind === 'chapters') {\n      mode = 'hidden';\n    }\n    // on IE8 this will be a document element\n    // for every other browser this will be a normal object\n    var tt = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this);\n\n    tt.tech_ = settings.tech;\n\n    if (IS_IE8) {\n      for (var prop in TextTrack.prototype) {\n        if (prop !== 'constructor') {\n          tt[prop] = TextTrack.prototype[prop];\n        }\n      }\n    }\n\n    tt.cues_ = [];\n    tt.activeCues_ = [];\n\n    var cues = new TextTrackCueList(tt.cues_);\n    var activeCues = new TextTrackCueList(tt.activeCues_);\n    var changed = false;\n    var timeupdateHandler = bind(tt, function () {\n\n      // Accessing this.activeCues for the side-effects of updating itself\n      // due to it's nature as a getter function. Do not remove or cues will\n      // stop updating!\n      // Use the setter to prevent deletion from uglify (pure_getters rule)\n      this.activeCues = this.activeCues;\n      if (changed) {\n        this.trigger('cuechange');\n        changed = false;\n      }\n    });\n\n    if (mode !== 'disabled') {\n      tt.tech_.ready(function () {\n        tt.tech_.on('timeupdate', timeupdateHandler);\n      }, true);\n    }\n\n    /**\n     * @memberof TextTrack\n     * @member {boolean} default\n     *         If this track was set to be on or off by default. Cannot be changed after\n     *         creation.\n     * @instance\n     *\n     * @readonly\n     */\n    Object.defineProperty(tt, 'default', {\n      get: function get$$1() {\n        return default_;\n      },\n      set: function set$$1() {}\n    });\n\n    /**\n     * @memberof TextTrack\n     * @member {string} mode\n     *         Set the mode of this TextTrack to a valid {@link TextTrack~Mode}. Will\n     *         not be set if setting to an invalid mode.\n     * @instance\n     *\n     * @fires TextTrack#modechange\n     */\n    Object.defineProperty(tt, 'mode', {\n      get: function get$$1() {\n        return mode;\n      },\n      set: function set$$1(newMode) {\n        var _this2 = this;\n\n        if (!TextTrackMode[newMode]) {\n          return;\n        }\n        mode = newMode;\n        if (mode === 'showing') {\n\n          this.tech_.ready(function () {\n            _this2.tech_.on('timeupdate', timeupdateHandler);\n          }, true);\n        }\n        /**\n         * An event that fires when mode changes on this track. This allows\n         * the TextTrackList that holds this track to act accordingly.\n         *\n         * > Note: This is not part of the spec!\n         *\n         * @event TextTrack#modechange\n         * @type {EventTarget~Event}\n         */\n        this.trigger('modechange');\n      }\n    });\n\n    /**\n     * @memberof TextTrack\n     * @member {TextTrackCueList} cues\n     *         The text track cue list for this TextTrack.\n     * @instance\n     */\n    Object.defineProperty(tt, 'cues', {\n      get: function get$$1() {\n        if (!this.loaded_) {\n          return null;\n        }\n\n        return cues;\n      },\n      set: function set$$1() {}\n    });\n\n    /**\n     * @memberof TextTrack\n     * @member {TextTrackCueList} activeCues\n     *         The list text track cues that are currently active for this TextTrack.\n     * @instance\n     */\n    Object.defineProperty(tt, 'activeCues', {\n      get: function get$$1() {\n        if (!this.loaded_) {\n          return null;\n        }\n\n        // nothing to do\n        if (this.cues.length === 0) {\n          return activeCues;\n        }\n\n        var ct = this.tech_.currentTime();\n        var active = [];\n\n        for (var i = 0, l = this.cues.length; i < l; i++) {\n          var cue = this.cues[i];\n\n          if (cue.startTime <= ct && cue.endTime >= ct) {\n            active.push(cue);\n          } else if (cue.startTime === cue.endTime && cue.startTime <= ct && cue.startTime + 0.5 >= ct) {\n            active.push(cue);\n          }\n        }\n\n        changed = false;\n\n        if (active.length !== this.activeCues_.length) {\n          changed = true;\n        } else {\n          for (var _i = 0; _i < active.length; _i++) {\n            if (this.activeCues_.indexOf(active[_i]) === -1) {\n              changed = true;\n            }\n          }\n        }\n\n        this.activeCues_ = active;\n        activeCues.setCues_(this.activeCues_);\n\n        return activeCues;\n      },\n\n\n      // /!\\ Keep this setter empty (see the timeupdate handler above)\n      set: function set$$1() {}\n    });\n\n    if (settings.src) {\n      tt.src = settings.src;\n      loadTrack(settings.src, tt);\n    } else {\n      tt.loaded_ = true;\n    }\n\n    return _ret = tt, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add a cue to the internal list of cues.\n   *\n   * @param {TextTrack~Cue} cue\n   *        The cue to add to our internal list\n   */\n\n\n  TextTrack.prototype.addCue = function addCue(originalCue) {\n    var cue = originalCue;\n\n    if (window.vttjs && !(originalCue instanceof window.vttjs.VTTCue)) {\n      cue = new window.vttjs.VTTCue(originalCue.startTime, originalCue.endTime, originalCue.text);\n\n      for (var prop in originalCue) {\n        if (!(prop in cue)) {\n          cue[prop] = originalCue[prop];\n        }\n      }\n\n      // make sure that `id` is copied over\n      cue.id = originalCue.id;\n      cue.originalCue_ = originalCue;\n    }\n\n    var tracks = this.tech_.textTracks();\n\n    for (var i = 0; i < tracks.length; i++) {\n      if (tracks[i] !== this) {\n        tracks[i].removeCue(cue);\n      }\n    }\n\n    this.cues_.push(cue);\n    this.cues.setCues_(this.cues_);\n  };\n\n  /**\n   * Remove a cue from our internal list\n   *\n   * @param {TextTrack~Cue} removeCue\n   *        The cue to remove from our internal list\n   */\n\n\n  TextTrack.prototype.removeCue = function removeCue(_removeCue) {\n    var i = this.cues_.length;\n\n    while (i--) {\n      var cue = this.cues_[i];\n\n      if (cue === _removeCue || cue.originalCue_ && cue.originalCue_ === _removeCue) {\n        this.cues_.splice(i, 1);\n        this.cues.setCues_(this.cues_);\n        break;\n      }\n    }\n  };\n\n  return TextTrack;\n}(Track);\n\n/**\n * cuechange - One or more cues in the track have become active or stopped being active.\n */\n\n\nTextTrack.prototype.allowedEvents_ = {\n  cuechange: 'cuechange'\n};\n\n/**\n * A representation of a single `AudioTrack`. If it is part of an {@link AudioTrackList}\n * only one `AudioTrack` in the list will be enabled at a time.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotrack}\n * @extends Track\n */\n\nvar AudioTrack = function (_Track) {\n  inherits(AudioTrack, _Track);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} [options={}]\n   *        Object of option names and values\n   *\n   * @param {AudioTrack~Kind} [options.kind='']\n   *        A valid audio track kind\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this AudioTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @param {boolean} [options.enabled]\n   *        If this track is the one that is currently playing. If this track is part of\n   *        an {@link AudioTrackList}, only one {@link AudioTrack} will be enabled.\n   */\n  function AudioTrack() {\n    var _this, _ret;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, AudioTrack);\n\n    var settings = mergeOptions(options, {\n      kind: AudioTrackKind[options.kind] || ''\n    });\n    // on IE8 this will be a document element\n    // for every other browser this will be a normal object\n    var track = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this);\n    var enabled = false;\n\n    if (IS_IE8) {\n      for (var prop in AudioTrack.prototype) {\n        if (prop !== 'constructor') {\n          track[prop] = AudioTrack.prototype[prop];\n        }\n      }\n    }\n    /**\n     * @memberof AudioTrack\n     * @member {boolean} enabled\n     *         If this `AudioTrack` is enabled or not. When setting this will\n     *         fire {@link AudioTrack#enabledchange} if the state of enabled is changed.\n     * @instance\n     *\n     * @fires VideoTrack#selectedchange\n     */\n    Object.defineProperty(track, 'enabled', {\n      get: function get$$1() {\n        return enabled;\n      },\n      set: function set$$1(newEnabled) {\n        // an invalid or unchanged value\n        if (typeof newEnabled !== 'boolean' || newEnabled === enabled) {\n          return;\n        }\n        enabled = newEnabled;\n\n        /**\n         * An event that fires when enabled changes on this track. This allows\n         * the AudioTrackList that holds this track to act accordingly.\n         *\n         * > Note: This is not part of the spec! Native tracks will do\n         *         this internally without an event.\n         *\n         * @event AudioTrack#enabledchange\n         * @type {EventTarget~Event}\n         */\n        this.trigger('enabledchange');\n      }\n    });\n\n    // if the user sets this track to selected then\n    // set selected to that true value otherwise\n    // we keep it false\n    if (settings.enabled) {\n      track.enabled = settings.enabled;\n    }\n    track.loaded_ = true;\n\n    return _ret = track, possibleConstructorReturn(_this, _ret);\n  }\n\n  return AudioTrack;\n}(Track);\n\n/**\n * A representation of a single `VideoTrack`.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotrack}\n * @extends Track\n */\n\nvar VideoTrack = function (_Track) {\n  inherits(VideoTrack, _Track);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} [options={}]\n   *        Object of option names and values\n   *\n   * @param {string} [options.kind='']\n   *        A valid {@link VideoTrack~Kind}\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this AudioTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @param {boolean} [options.selected]\n   *        If this track is the one that is currently playing.\n   */\n  function VideoTrack() {\n    var _this, _ret;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, VideoTrack);\n\n    var settings = mergeOptions(options, {\n      kind: VideoTrackKind[options.kind] || ''\n    });\n\n    // on IE8 this will be a document element\n    // for every other browser this will be a normal object\n    var track = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this);\n    var selected = false;\n\n    if (IS_IE8) {\n      for (var prop in VideoTrack.prototype) {\n        if (prop !== 'constructor') {\n          track[prop] = VideoTrack.prototype[prop];\n        }\n      }\n    }\n\n    /**\n     * @memberof VideoTrack\n     * @member {boolean} selected\n     *         If this `VideoTrack` is selected or not. When setting this will\n     *         fire {@link VideoTrack#selectedchange} if the state of selected changed.\n     * @instance\n     *\n     * @fires VideoTrack#selectedchange\n     */\n    Object.defineProperty(track, 'selected', {\n      get: function get$$1() {\n        return selected;\n      },\n      set: function set$$1(newSelected) {\n        // an invalid or unchanged value\n        if (typeof newSelected !== 'boolean' || newSelected === selected) {\n          return;\n        }\n        selected = newSelected;\n\n        /**\n         * An event that fires when selected changes on this track. This allows\n         * the VideoTrackList that holds this track to act accordingly.\n         *\n         * > Note: This is not part of the spec! Native tracks will do\n         *         this internally without an event.\n         *\n         * @event VideoTrack#selectedchange\n         * @type {EventTarget~Event}\n         */\n        this.trigger('selectedchange');\n      }\n    });\n\n    // if the user sets this track to selected then\n    // set selected to that true value otherwise\n    // we keep it false\n    if (settings.selected) {\n      track.selected = settings.selected;\n    }\n\n    return _ret = track, possibleConstructorReturn(_this, _ret);\n  }\n\n  return VideoTrack;\n}(Track);\n\n/**\n * @file html-track-element.js\n */\n\n/**\n * @memberof HTMLTrackElement\n * @typedef {HTMLTrackElement~ReadyState}\n * @enum {number}\n */\nvar NONE = 0;\nvar LOADING = 1;\nvar LOADED = 2;\nvar ERROR = 3;\n\n/**\n * A single track represented in the DOM.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#htmltrackelement}\n * @extends EventTarget\n */\n\nvar HTMLTrackElement = function (_EventTarget) {\n  inherits(HTMLTrackElement, _EventTarget);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} options={}\n   *        Object of option names and values\n   *\n   * @param {Tech} options.tech\n   *        A reference to the tech that owns this HTMLTrackElement.\n   *\n   * @param {TextTrack~Kind} [options.kind='subtitles']\n   *        A valid text track kind.\n   *\n   * @param {TextTrack~Mode} [options.mode='disabled']\n   *        A valid text track mode.\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this TextTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @param {string} [options.srclang='']\n   *        A valid two character language code. An alternative, but deprioritized\n   *        vesion of `options.language`\n   *\n   * @param {string} [options.src]\n   *        A url to TextTrack cues.\n   *\n   * @param {boolean} [options.default]\n   *        If this track should default to on or off.\n   */\n  function HTMLTrackElement() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, HTMLTrackElement);\n\n    var _this = possibleConstructorReturn(this, _EventTarget.call(this));\n\n    var readyState = void 0;\n    var trackElement = _this; // eslint-disable-line\n\n    if (IS_IE8) {\n      trackElement = document.createElement('custom');\n\n      for (var prop in HTMLTrackElement.prototype) {\n        if (prop !== 'constructor') {\n          trackElement[prop] = HTMLTrackElement.prototype[prop];\n        }\n      }\n    }\n\n    var track = new TextTrack(options);\n\n    trackElement.kind = track.kind;\n    trackElement.src = track.src;\n    trackElement.srclang = track.language;\n    trackElement.label = track.label;\n    trackElement['default'] = track['default'];\n\n    /**\n     * @memberof HTMLTrackElement\n     * @member {HTMLTrackElement~ReadyState} readyState\n     *         The current ready state of the track element.\n     * @instance\n     */\n    Object.defineProperty(trackElement, 'readyState', {\n      get: function get$$1() {\n        return readyState;\n      }\n    });\n\n    /**\n     * @memberof HTMLTrackElement\n     * @member {TextTrack} track\n     *         The underlying TextTrack object.\n     * @instance\n     *\n     */\n    Object.defineProperty(trackElement, 'track', {\n      get: function get$$1() {\n        return track;\n      }\n    });\n\n    readyState = NONE;\n\n    /**\n     * @listens TextTrack#loadeddata\n     * @fires HTMLTrackElement#load\n     */\n    track.addEventListener('loadeddata', function () {\n      readyState = LOADED;\n\n      trackElement.trigger({\n        type: 'load',\n        target: trackElement\n      });\n    });\n\n    if (IS_IE8) {\n      var _ret;\n\n      return _ret = trackElement, possibleConstructorReturn(_this, _ret);\n    }\n    return _this;\n  }\n\n  return HTMLTrackElement;\n}(EventTarget);\n\nHTMLTrackElement.prototype.allowedEvents_ = {\n  load: 'load'\n};\n\nHTMLTrackElement.NONE = NONE;\nHTMLTrackElement.LOADING = LOADING;\nHTMLTrackElement.LOADED = LOADED;\nHTMLTrackElement.ERROR = ERROR;\n\n/*\n * This file contains all track properties that are used in\n * player.js, tech.js, html5.js and possibly other techs in the future.\n */\n\nvar NORMAL = {\n  audio: {\n    ListClass: AudioTrackList,\n    TrackClass: AudioTrack,\n    capitalName: 'Audio'\n  },\n  video: {\n    ListClass: VideoTrackList,\n    TrackClass: VideoTrack,\n    capitalName: 'Video'\n  },\n  text: {\n    ListClass: TextTrackList,\n    TrackClass: TextTrack,\n    capitalName: 'Text'\n  }\n};\n\nObject.keys(NORMAL).forEach(function (type) {\n  NORMAL[type].getterName = type + 'Tracks';\n  NORMAL[type].privateName = type + 'Tracks_';\n});\n\nvar REMOTE = {\n  remoteText: {\n    ListClass: TextTrackList,\n    TrackClass: TextTrack,\n    capitalName: 'RemoteText',\n    getterName: 'remoteTextTracks',\n    privateName: 'remoteTextTracks_'\n  },\n  remoteTextEl: {\n    ListClass: HtmlTrackElementList,\n    TrackClass: HTMLTrackElement,\n    capitalName: 'RemoteTextTrackEls',\n    getterName: 'remoteTextTrackEls',\n    privateName: 'remoteTextTrackEls_'\n  }\n};\n\nvar ALL = mergeOptions(NORMAL, REMOTE);\n\nREMOTE.names = Object.keys(REMOTE);\nNORMAL.names = Object.keys(NORMAL);\nALL.names = [].concat(REMOTE.names).concat(NORMAL.names);\n\n/**\n * @file tech.js\n */\n\n/**\n * An Object containing a structure like: `{src: 'url', type: 'mimetype'}` or string\n * that just contains the src url alone.\n * * `var SourceObject = {src: 'http://ex.com/video.mp4', type: 'video/mp4'};`\n   * `var SourceString = 'http://example.com/some-video.mp4';`\n *\n * @typedef {Object|string} Tech~SourceObject\n *\n * @property {string} src\n *           The url to the source\n *\n * @property {string} type\n *           The mime type of the source\n */\n\n/**\n * A function used by {@link Tech} to create a new {@link TextTrack}.\n *\n * @private\n *\n * @param {Tech} self\n *        An instance of the Tech class.\n *\n * @param {string} kind\n *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata)\n *\n * @param {string} [label]\n *        Label to identify the text track\n *\n * @param {string} [language]\n *        Two letter language abbreviation\n *\n * @param {Object} [options={}]\n *        An object with additional text track options\n *\n * @return {TextTrack}\n *          The text track that was created.\n */\nfunction createTrackHelper(self, kind, label, language) {\n  var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\n\n  var tracks = self.textTracks();\n\n  options.kind = kind;\n\n  if (label) {\n    options.label = label;\n  }\n  if (language) {\n    options.language = language;\n  }\n  options.tech = self;\n\n  var track = new ALL.text.TrackClass(options);\n\n  tracks.addTrack(track);\n\n  return track;\n}\n\n/**\n * This is the base class for media playback technology controllers, such as\n * {@link Flash} and {@link HTML5}\n *\n * @extends Component\n */\n\nvar Tech = function (_Component) {\n  inherits(Tech, _Component);\n\n  /**\n   * Create an instance of this Tech.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} ready\n   *        Callback function to call when the `HTML5` Tech is ready.\n   */\n  function Tech() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var ready = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n    classCallCheck(this, Tech);\n\n    // we don't want the tech to report user activity automatically.\n    // This is done manually in addControlsListeners\n    options.reportTouchActivity = false;\n\n    // keep track of whether the current source has played at all to\n    // implement a very limited played()\n    var _this = possibleConstructorReturn(this, _Component.call(this, null, options, ready));\n\n    _this.hasStarted_ = false;\n    _this.on('playing', function () {\n      this.hasStarted_ = true;\n    });\n    _this.on('loadstart', function () {\n      this.hasStarted_ = false;\n    });\n\n    ALL.names.forEach(function (name) {\n      var props = ALL[name];\n\n      if (options && options[props.getterName]) {\n        _this[props.privateName] = options[props.getterName];\n      }\n    });\n\n    // Manually track progress in cases where the browser/flash player doesn't report it.\n    if (!_this.featuresProgressEvents) {\n      _this.manualProgressOn();\n    }\n\n    // Manually track timeupdates in cases where the browser/flash player doesn't report it.\n    if (!_this.featuresTimeupdateEvents) {\n      _this.manualTimeUpdatesOn();\n    }\n\n    ['Text', 'Audio', 'Video'].forEach(function (track) {\n      if (options['native' + track + 'Tracks'] === false) {\n        _this['featuresNative' + track + 'Tracks'] = false;\n      }\n    });\n\n    if (options.nativeCaptions === false || options.nativeTextTracks === false) {\n      _this.featuresNativeTextTracks = false;\n    } else if (options.nativeCaptions === true || options.nativeTextTracks === true) {\n      _this.featuresNativeTextTracks = true;\n    }\n\n    if (!_this.featuresNativeTextTracks) {\n      _this.emulateTextTracks();\n    }\n\n    _this.autoRemoteTextTracks_ = new ALL.text.ListClass();\n\n    _this.initTrackListeners();\n\n    // Turn on component tap events only if not using native controls\n    if (!options.nativeControlsForTouch) {\n      _this.emitTapEvents();\n    }\n\n    if (_this.constructor) {\n      _this.name_ = _this.constructor.name || 'Unknown Tech';\n    }\n    return _this;\n  }\n\n  /**\n   * A special function to trigger source set in a way that will allow player\n   * to re-trigger if the player or tech are not ready yet.\n   *\n   * @fires Tech#sourceset\n   * @param {string} src The source string at the time of the source changing.\n   */\n\n\n  Tech.prototype.triggerSourceset = function triggerSourceset(src) {\n    var _this2 = this;\n\n    if (!this.isReady_) {\n      // on initial ready we have to trigger source set\n      // 1ms after ready so that player can watch for it.\n      this.one('ready', function () {\n        return _this2.setTimeout(function () {\n          return _this2.triggerSourceset(src);\n        }, 1);\n      });\n    }\n\n    /**\n     * Fired when the source is set on the tech causing the media element\n     * to reload.\n     *\n     * @see {@link Player#event:sourceset}\n     * @event Tech#sourceset\n     * @type {EventTarget~Event}\n     */\n    this.trigger({\n      src: src,\n      type: 'sourceset'\n    });\n  };\n\n  /* Fallbacks for unsupported event types\n  ================================================================================ */\n\n  /**\n   * Polyfill the `progress` event for browsers that don't support it natively.\n   *\n   * @see {@link Tech#trackProgress}\n   */\n\n\n  Tech.prototype.manualProgressOn = function manualProgressOn() {\n    this.on('durationchange', this.onDurationChange);\n\n    this.manualProgress = true;\n\n    // Trigger progress watching when a source begins loading\n    this.one('ready', this.trackProgress);\n  };\n\n  /**\n   * Turn off the polyfill for `progress` events that was created in\n   * {@link Tech#manualProgressOn}\n   */\n\n\n  Tech.prototype.manualProgressOff = function manualProgressOff() {\n    this.manualProgress = false;\n    this.stopTrackingProgress();\n\n    this.off('durationchange', this.onDurationChange);\n  };\n\n  /**\n   * This is used to trigger a `progress` event when the buffered percent changes. It\n   * sets an interval function that will be called every 500 milliseconds to check if the\n   * buffer end percent has changed.\n   *\n   * > This function is called by {@link Tech#manualProgressOn}\n   *\n   * @param {EventTarget~Event} event\n   *        The `ready` event that caused this to run.\n   *\n   * @listens Tech#ready\n   * @fires Tech#progress\n   */\n\n\n  Tech.prototype.trackProgress = function trackProgress(event) {\n    this.stopTrackingProgress();\n    this.progressInterval = this.setInterval(bind(this, function () {\n      // Don't trigger unless buffered amount is greater than last time\n\n      var numBufferedPercent = this.bufferedPercent();\n\n      if (this.bufferedPercent_ !== numBufferedPercent) {\n        /**\n         * See {@link Player#progress}\n         *\n         * @event Tech#progress\n         * @type {EventTarget~Event}\n         */\n        this.trigger('progress');\n      }\n\n      this.bufferedPercent_ = numBufferedPercent;\n\n      if (numBufferedPercent === 1) {\n        this.stopTrackingProgress();\n      }\n    }), 500);\n  };\n\n  /**\n   * Update our internal duration on a `durationchange` event by calling\n   * {@link Tech#duration}.\n   *\n   * @param {EventTarget~Event} event\n   *        The `durationchange` event that caused this to run.\n   *\n   * @listens Tech#durationchange\n   */\n\n\n  Tech.prototype.onDurationChange = function onDurationChange(event) {\n    this.duration_ = this.duration();\n  };\n\n  /**\n   * Get and create a `TimeRange` object for buffering.\n   *\n   * @return {TimeRange}\n   *         The time range object that was created.\n   */\n\n\n  Tech.prototype.buffered = function buffered() {\n    return createTimeRanges(0, 0);\n  };\n\n  /**\n   * Get the percentage of the current video that is currently buffered.\n   *\n   * @return {number}\n   *         A number from 0 to 1 that represents the decimal percentage of the\n   *         video that is buffered.\n   *\n   */\n\n\n  Tech.prototype.bufferedPercent = function bufferedPercent$$1() {\n    return bufferedPercent(this.buffered(), this.duration_);\n  };\n\n  /**\n   * Turn off the polyfill for `progress` events that was created in\n   * {@link Tech#manualProgressOn}\n   * Stop manually tracking progress events by clearing the interval that was set in\n   * {@link Tech#trackProgress}.\n   */\n\n\n  Tech.prototype.stopTrackingProgress = function stopTrackingProgress() {\n    this.clearInterval(this.progressInterval);\n  };\n\n  /**\n   * Polyfill the `timeupdate` event for browsers that don't support it.\n   *\n   * @see {@link Tech#trackCurrentTime}\n   */\n\n\n  Tech.prototype.manualTimeUpdatesOn = function manualTimeUpdatesOn() {\n    this.manualTimeUpdates = true;\n\n    this.on('play', this.trackCurrentTime);\n    this.on('pause', this.stopTrackingCurrentTime);\n  };\n\n  /**\n   * Turn off the polyfill for `timeupdate` events that was created in\n   * {@link Tech#manualTimeUpdatesOn}\n   */\n\n\n  Tech.prototype.manualTimeUpdatesOff = function manualTimeUpdatesOff() {\n    this.manualTimeUpdates = false;\n    this.stopTrackingCurrentTime();\n    this.off('play', this.trackCurrentTime);\n    this.off('pause', this.stopTrackingCurrentTime);\n  };\n\n  /**\n   * Sets up an interval function to track current time and trigger `timeupdate` every\n   * 250 milliseconds.\n   *\n   * @listens Tech#play\n   * @triggers Tech#timeupdate\n   */\n\n\n  Tech.prototype.trackCurrentTime = function trackCurrentTime() {\n    if (this.currentTimeInterval) {\n      this.stopTrackingCurrentTime();\n    }\n    this.currentTimeInterval = this.setInterval(function () {\n      /**\n       * Triggered at an interval of 250ms to indicated that time is passing in the video.\n       *\n       * @event Tech#timeupdate\n       * @type {EventTarget~Event}\n       */\n      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n\n      // 42 = 24 fps // 250 is what Webkit uses // FF uses 15\n    }, 250);\n  };\n\n  /**\n   * Stop the interval function created in {@link Tech#trackCurrentTime} so that the\n   * `timeupdate` event is no longer triggered.\n   *\n   * @listens {Tech#pause}\n   */\n\n\n  Tech.prototype.stopTrackingCurrentTime = function stopTrackingCurrentTime() {\n    this.clearInterval(this.currentTimeInterval);\n\n    // #1002 - if the video ends right before the next timeupdate would happen,\n    // the progress bar won't make it all the way to the end\n    this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n  };\n\n  /**\n   * Turn off all event polyfills, clear the `Tech`s {@link AudioTrackList},\n   * {@link VideoTrackList}, and {@link TextTrackList}, and dispose of this Tech.\n   *\n   * @fires Component#dispose\n   */\n\n\n  Tech.prototype.dispose = function dispose() {\n\n    // clear out all tracks because we can't reuse them between techs\n    this.clearTracks(NORMAL.names);\n\n    // Turn off any manual progress or timeupdate tracking\n    if (this.manualProgress) {\n      this.manualProgressOff();\n    }\n\n    if (this.manualTimeUpdates) {\n      this.manualTimeUpdatesOff();\n    }\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Clear out a single `TrackList` or an array of `TrackLists` given their names.\n   *\n   * > Note: Techs without source handlers should call this between sources for `video`\n   *         & `audio` tracks. You don't want to use them between tracks!\n   *\n   * @param {string[]|string} types\n   *        TrackList names to clear, valid names are `video`, `audio`, and\n   *        `text`.\n   */\n\n\n  Tech.prototype.clearTracks = function clearTracks(types) {\n    var _this3 = this;\n\n    types = [].concat(types);\n    // clear out all tracks because we can't reuse them between techs\n    types.forEach(function (type) {\n      var list = _this3[type + 'Tracks']() || [];\n      var i = list.length;\n\n      while (i--) {\n        var track = list[i];\n\n        if (type === 'text') {\n          _this3.removeRemoteTextTrack(track);\n        }\n        list.removeTrack(track);\n      }\n    });\n  };\n\n  /**\n   * Remove any TextTracks added via addRemoteTextTrack that are\n   * flagged for automatic garbage collection\n   */\n\n\n  Tech.prototype.cleanupAutoTextTracks = function cleanupAutoTextTracks() {\n    var list = this.autoRemoteTextTracks_ || [];\n    var i = list.length;\n\n    while (i--) {\n      var track = list[i];\n\n      this.removeRemoteTextTrack(track);\n    }\n  };\n\n  /**\n   * Reset the tech, which will removes all sources and reset the internal readyState.\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.reset = function reset() {};\n\n  /**\n   * Get or set an error on the Tech.\n   *\n   * @param {MediaError} [err]\n   *        Error to set on the Tech\n   *\n   * @return {MediaError|null}\n   *         The current error object on the tech, or null if there isn't one.\n   */\n\n\n  Tech.prototype.error = function error(err) {\n    if (err !== undefined) {\n      this.error_ = new MediaError(err);\n      this.trigger('error');\n    }\n    return this.error_;\n  };\n\n  /**\n   * Returns the `TimeRange`s that have been played through for the current source.\n   *\n   * > NOTE: This implementation is incomplete. It does not track the played `TimeRange`.\n   *         It only checks wether the source has played at all or not.\n   *\n   * @return {TimeRange}\n   *         - A single time range if this video has played\n   *         - An empty set of ranges if not.\n   */\n\n\n  Tech.prototype.played = function played() {\n    if (this.hasStarted_) {\n      return createTimeRanges(0, 0);\n    }\n    return createTimeRanges();\n  };\n\n  /**\n   * Causes a manual time update to occur if {@link Tech#manualTimeUpdatesOn} was\n   * previously called.\n   *\n   * @fires Tech#timeupdate\n   */\n\n\n  Tech.prototype.setCurrentTime = function setCurrentTime() {\n    // improve the accuracy of manual timeupdates\n    if (this.manualTimeUpdates) {\n      /**\n       * A manual `timeupdate` event.\n       *\n       * @event Tech#timeupdate\n       * @type {EventTarget~Event}\n       */\n      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n    }\n  };\n\n  /**\n   * Turn on listeners for {@link VideoTrackList}, {@link {AudioTrackList}, and\n   * {@link TextTrackList} events.\n   *\n   * This adds {@link EventTarget~EventListeners} for `addtrack`, and  `removetrack`.\n   *\n   * @fires Tech#audiotrackchange\n   * @fires Tech#videotrackchange\n   * @fires Tech#texttrackchange\n   */\n\n\n  Tech.prototype.initTrackListeners = function initTrackListeners() {\n    var _this4 = this;\n\n    /**\n     * Triggered when tracks are added or removed on the Tech {@link AudioTrackList}\n     *\n     * @event Tech#audiotrackchange\n     * @type {EventTarget~Event}\n     */\n\n    /**\n     * Triggered when tracks are added or removed on the Tech {@link VideoTrackList}\n     *\n     * @event Tech#videotrackchange\n     * @type {EventTarget~Event}\n     */\n\n    /**\n     * Triggered when tracks are added or removed on the Tech {@link TextTrackList}\n     *\n     * @event Tech#texttrackchange\n     * @type {EventTarget~Event}\n     */\n    NORMAL.names.forEach(function (name) {\n      var props = NORMAL[name];\n      var trackListChanges = function trackListChanges() {\n        _this4.trigger(name + 'trackchange');\n      };\n\n      var tracks = _this4[props.getterName]();\n\n      tracks.addEventListener('removetrack', trackListChanges);\n      tracks.addEventListener('addtrack', trackListChanges);\n\n      _this4.on('dispose', function () {\n        tracks.removeEventListener('removetrack', trackListChanges);\n        tracks.removeEventListener('addtrack', trackListChanges);\n      });\n    });\n  };\n\n  /**\n   * Emulate TextTracks using vtt.js if necessary\n   *\n   * @fires Tech#vttjsloaded\n   * @fires Tech#vttjserror\n   */\n\n\n  Tech.prototype.addWebVttScript_ = function addWebVttScript_() {\n    var _this5 = this;\n\n    if (window.WebVTT) {\n      return;\n    }\n\n    // Initially, Tech.el_ is a child of a dummy-div wait until the Component system\n    // signals that the Tech is ready at which point Tech.el_ is part of the DOM\n    // before inserting the WebVTT script\n    if (document.body.contains(this.el())) {\n\n      // load via require if available and vtt.js script location was not passed in\n      // as an option. novtt builds will turn the above require call into an empty object\n      // which will cause this if check to always fail.\n      if (!this.options_['vtt.js'] && isPlain(vtt) && Object.keys(vtt).length > 0) {\n        this.trigger('vttjsloaded');\n        return;\n      }\n\n      // load vtt.js via the script location option or the cdn of no location was\n      // passed in\n      var script = document.createElement('script');\n\n      script.src = this.options_['vtt.js'] || 'https://vjs.zencdn.net/vttjs/0.12.4/vtt.min.js';\n      script.onload = function () {\n        /**\n         * Fired when vtt.js is loaded.\n         *\n         * @event Tech#vttjsloaded\n         * @type {EventTarget~Event}\n         */\n        _this5.trigger('vttjsloaded');\n      };\n      script.onerror = function () {\n        /**\n         * Fired when vtt.js was not loaded due to an error\n         *\n         * @event Tech#vttjsloaded\n         * @type {EventTarget~Event}\n         */\n        _this5.trigger('vttjserror');\n      };\n      this.on('dispose', function () {\n        script.onload = null;\n        script.onerror = null;\n      });\n      // but have not loaded yet and we set it to true before the inject so that\n      // we don't overwrite the injected window.WebVTT if it loads right away\n      window.WebVTT = true;\n      this.el().parentNode.appendChild(script);\n    } else {\n      this.ready(this.addWebVttScript_);\n    }\n  };\n\n  /**\n   * Emulate texttracks\n   *\n   */\n\n\n  Tech.prototype.emulateTextTracks = function emulateTextTracks() {\n    var _this6 = this;\n\n    var tracks = this.textTracks();\n    var remoteTracks = this.remoteTextTracks();\n    var handleAddTrack = function handleAddTrack(e) {\n      return tracks.addTrack(e.track);\n    };\n    var handleRemoveTrack = function handleRemoveTrack(e) {\n      return tracks.removeTrack(e.track);\n    };\n\n    remoteTracks.on('addtrack', handleAddTrack);\n    remoteTracks.on('removetrack', handleRemoveTrack);\n\n    this.addWebVttScript_();\n\n    var updateDisplay = function updateDisplay() {\n      return _this6.trigger('texttrackchange');\n    };\n\n    var textTracksChanges = function textTracksChanges() {\n      updateDisplay();\n\n      for (var i = 0; i < tracks.length; i++) {\n        var track = tracks[i];\n\n        track.removeEventListener('cuechange', updateDisplay);\n        if (track.mode === 'showing') {\n          track.addEventListener('cuechange', updateDisplay);\n        }\n      }\n    };\n\n    textTracksChanges();\n    tracks.addEventListener('change', textTracksChanges);\n    tracks.addEventListener('addtrack', textTracksChanges);\n    tracks.addEventListener('removetrack', textTracksChanges);\n\n    this.on('dispose', function () {\n      remoteTracks.off('addtrack', handleAddTrack);\n      remoteTracks.off('removetrack', handleRemoveTrack);\n      tracks.removeEventListener('change', textTracksChanges);\n      tracks.removeEventListener('addtrack', textTracksChanges);\n      tracks.removeEventListener('removetrack', textTracksChanges);\n\n      for (var i = 0; i < tracks.length; i++) {\n        var track = tracks[i];\n\n        track.removeEventListener('cuechange', updateDisplay);\n      }\n    });\n  };\n\n  /**\n   * Create and returns a remote {@link TextTrack} object.\n   *\n   * @param {string} kind\n   *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata)\n   *\n   * @param {string} [label]\n   *        Label to identify the text track\n   *\n   * @param {string} [language]\n   *        Two letter language abbreviation\n   *\n   * @return {TextTrack}\n   *         The TextTrack that gets created.\n   */\n\n\n  Tech.prototype.addTextTrack = function addTextTrack(kind, label, language) {\n    if (!kind) {\n      throw new Error('TextTrack kind is required but was not provided');\n    }\n\n    return createTrackHelper(this, kind, label, language);\n  };\n\n  /**\n   * Create an emulated TextTrack for use by addRemoteTextTrack\n   *\n   * This is intended to be overridden by classes that inherit from\n   * Tech in order to create native or custom TextTracks.\n   *\n   * @param {Object} options\n   *        The object should contain the options to initialize the TextTrack with.\n   *\n   * @param {string} [options.kind]\n   *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata).\n   *\n   * @param {string} [options.label].\n   *        Label to identify the text track\n   *\n   * @param {string} [options.language]\n   *        Two letter language abbreviation.\n   *\n   * @return {HTMLTrackElement}\n   *         The track element that gets created.\n   */\n\n\n  Tech.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) {\n    var track = mergeOptions(options, {\n      tech: this\n    });\n\n    return new REMOTE.remoteTextEl.TrackClass(track);\n  };\n\n  /**\n   * Creates a remote text track object and returns an html track element.\n   *\n   * > Note: This can be an emulated {@link HTMLTrackElement} or a native one.\n   *\n   * @param {Object} options\n   *        See {@link Tech#createRemoteTextTrack} for more detailed properties.\n   *\n   * @param {boolean} [manualCleanup=true]\n   *        - When false: the TextTrack will be automatically removed from the video\n   *          element whenever the source changes\n   *        - When True: The TextTrack will have to be cleaned up manually\n   *\n   * @return {HTMLTrackElement}\n   *         An Html Track Element.\n   *\n   * @deprecated The default functionality for this function will be equivalent\n   *             to \"manualCleanup=false\" in the future. The manualCleanup parameter will\n   *             also be removed.\n   */\n\n\n  Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack() {\n    var _this7 = this;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var manualCleanup = arguments[1];\n\n    var htmlTrackElement = this.createRemoteTextTrack(options);\n\n    if (manualCleanup !== true && manualCleanup !== false) {\n      // deprecation warning\n      log$1.warn('Calling addRemoteTextTrack without explicitly setting the \"manualCleanup\" parameter to `true` is deprecated and default to `false` in future version of video.js');\n      manualCleanup = true;\n    }\n\n    // store HTMLTrackElement and TextTrack to remote list\n    this.remoteTextTrackEls().addTrackElement_(htmlTrackElement);\n    this.remoteTextTracks().addTrack(htmlTrackElement.track);\n\n    if (manualCleanup !== true) {\n      // create the TextTrackList if it doesn't exist\n      this.ready(function () {\n        return _this7.autoRemoteTextTracks_.addTrack(htmlTrackElement.track);\n      });\n    }\n\n    return htmlTrackElement;\n  };\n\n  /**\n   * Remove a remote text track from the remote `TextTrackList`.\n   *\n   * @param {TextTrack} track\n   *        `TextTrack` to remove from the `TextTrackList`\n   */\n\n\n  Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {\n    var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track);\n\n    // remove HTMLTrackElement and TextTrack from remote list\n    this.remoteTextTrackEls().removeTrackElement_(trackElement);\n    this.remoteTextTracks().removeTrack(track);\n    this.autoRemoteTextTracks_.removeTrack(track);\n  };\n\n  /**\n   * Gets available media playback quality metrics as specified by the W3C's Media\n   * Playback Quality API.\n   *\n   * @see [Spec]{@link https://wicg.github.io/media-playback-quality}\n   *\n   * @return {Object}\n   *         An object with supported media playback quality metrics\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() {\n    return {};\n  };\n\n  /**\n   * A method to set a poster from a `Tech`.\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.setPoster = function setPoster() {};\n\n  /**\n   * A method to check for the presence of the 'playsinine' <video> attribute.\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.playsinline = function playsinline() {};\n\n  /**\n   * A method to set or unset the 'playsinine' <video> attribute.\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.setPlaysinline = function setPlaysinline() {};\n\n  /*\n   * Check if the tech can support the given mime-type.\n   *\n   * The base tech does not support any type, but source handlers might\n   * overwrite this.\n   *\n   * @param  {string} type\n   *         The mimetype to check for support\n   *\n   * @return {string}\n   *         'probably', 'maybe', or empty string\n   *\n   * @see [Spec]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canPlayType}\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.canPlayType = function canPlayType() {\n    return '';\n  };\n\n  /**\n   * Check if the type is supported by this tech.\n   *\n   * The base tech does not support any type, but source handlers might\n   * overwrite this.\n   *\n   * @param {string} type\n   *        The media type to check\n   * @return {string} Returns the native video element's response\n   */\n\n\n  Tech.canPlayType = function canPlayType() {\n    return '';\n  };\n\n  /**\n   * Check if the tech can support the given source\n   * @param {Object} srcObj\n   *        The source object\n   * @param {Object} options\n   *        The options passed to the tech\n   * @return {string} 'probably', 'maybe', or '' (empty string)\n   */\n\n\n  Tech.canPlaySource = function canPlaySource(srcObj, options) {\n    return Tech.canPlayType(srcObj.type);\n  };\n\n  /*\n   * Return whether the argument is a Tech or not.\n   * Can be passed either a Class like `Html5` or a instance like `player.tech_`\n   *\n   * @param {Object} component\n   *        The item to check\n   *\n   * @return {boolean}\n   *         Whether it is a tech or not\n   *         - True if it is a tech\n   *         - False if it is not\n   */\n\n\n  Tech.isTech = function isTech(component) {\n    return component.prototype instanceof Tech || component instanceof Tech || component === Tech;\n  };\n\n  /**\n   * Registers a `Tech` into a shared list for videojs.\n   *\n   * @param {string} name\n   *        Name of the `Tech` to register.\n   *\n   * @param {Object} tech\n   *        The `Tech` class to register.\n   */\n\n\n  Tech.registerTech = function registerTech(name, tech) {\n    if (!Tech.techs_) {\n      Tech.techs_ = {};\n    }\n\n    if (!Tech.isTech(tech)) {\n      throw new Error('Tech ' + name + ' must be a Tech');\n    }\n\n    if (!Tech.canPlayType) {\n      throw new Error('Techs must have a static canPlayType method on them');\n    }\n    if (!Tech.canPlaySource) {\n      throw new Error('Techs must have a static canPlaySource method on them');\n    }\n\n    name = toTitleCase(name);\n\n    Tech.techs_[name] = tech;\n    if (name !== 'Tech') {\n      // camel case the techName for use in techOrder\n      Tech.defaultTechOrder_.push(name);\n    }\n    return tech;\n  };\n\n  /**\n   * Get a `Tech` from the shared list by name.\n   *\n   * @param {string} name\n   *        `camelCase` or `TitleCase` name of the Tech to get\n   *\n   * @return {Tech|undefined}\n   *         The `Tech` or undefined if there was no tech with the name requsted.\n   */\n\n\n  Tech.getTech = function getTech(name) {\n    if (!name) {\n      return;\n    }\n\n    name = toTitleCase(name);\n\n    if (Tech.techs_ && Tech.techs_[name]) {\n      return Tech.techs_[name];\n    }\n\n    if (window && window.videojs && window.videojs[name]) {\n      log$1.warn('The ' + name + ' tech was added to the videojs object when it should be registered using videojs.registerTech(name, tech)');\n      return window.videojs[name];\n    }\n  };\n\n  return Tech;\n}(Component);\n\n/**\n * Get the {@link VideoTrackList}\n *\n * @returns {VideoTrackList}\n * @method Tech.prototype.videoTracks\n */\n\n/**\n * Get the {@link AudioTrackList}\n *\n * @returns {AudioTrackList}\n * @method Tech.prototype.audioTracks\n */\n\n/**\n * Get the {@link TextTrackList}\n *\n * @returns {TextTrackList}\n * @method Tech.prototype.textTracks\n */\n\n/**\n * Get the remote element {@link TextTrackList}\n *\n * @returns {TextTrackList}\n * @method Tech.prototype.remoteTextTracks\n */\n\n/**\n * Get the remote element {@link HtmlTrackElementList}\n *\n * @returns {HtmlTrackElementList}\n * @method Tech.prototype.remoteTextTrackEls\n */\n\nALL.names.forEach(function (name) {\n  var props = ALL[name];\n\n  Tech.prototype[props.getterName] = function () {\n    this[props.privateName] = this[props.privateName] || new props.ListClass();\n    return this[props.privateName];\n  };\n});\n\n/**\n * List of associated text tracks\n *\n * @type {TextTrackList}\n * @private\n * @property Tech#textTracks_\n */\n\n/**\n * List of associated audio tracks.\n *\n * @type {AudioTrackList}\n * @private\n * @property Tech#audioTracks_\n */\n\n/**\n * List of associated video tracks.\n *\n * @type {VideoTrackList}\n * @private\n * @property Tech#videoTracks_\n */\n\n/**\n * Boolean indicating wether the `Tech` supports volume control.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresVolumeControl = true;\n\n/**\n * Boolean indicating whether the `Tech` supports muting volume.\n *\n * @type {bolean}\n * @default\n */\nTech.prototype.featuresMuteControl = true;\n\n/**\n * Boolean indicating whether the `Tech` supports fullscreen resize control.\n * Resizing plugins using request fullscreen reloads the plugin\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresFullscreenResize = false;\n\n/**\n * Boolean indicating wether the `Tech` supports changing the speed at which the video\n * plays. Examples:\n *   - Set player to play 2x (twice) as fast\n *   - Set player to play 0.5x (half) as fast\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresPlaybackRate = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the `progress` event. This is currently\n * not triggered by video-js-swf. This will be used to determine if\n * {@link Tech#manualProgressOn} should be called.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresProgressEvents = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the `sourceset` event.\n *\n * A tech should set this to `true` and then use {@link Tech#triggerSourceset}\n * to trigger a {@link Tech#event:sourceset} at the earliest time after getting\n * a new source.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresSourceset = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the `timeupdate` event. This is currently\n * not triggered by video-js-swf. This will be used to determine if\n * {@link Tech#manualTimeUpdates} should be called.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresTimeupdateEvents = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the native `TextTrack`s.\n * This will help us integrate with native `TextTrack`s if the browser supports them.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresNativeTextTracks = false;\n\n/**\n * A functional mixin for techs that want to use the Source Handler pattern.\n * Source handlers are scripts for handling specific formats.\n * The source handler pattern is used for adaptive formats (HLS, DASH) that\n * manually load video data and feed it into a Source Buffer (Media Source Extensions)\n * Example: `Tech.withSourceHandlers.call(MyTech);`\n *\n * @param {Tech} _Tech\n *        The tech to add source handler functions to.\n *\n * @mixes Tech~SourceHandlerAdditions\n */\nTech.withSourceHandlers = function (_Tech) {\n\n  /**\n   * Register a source handler\n   *\n   * @param {Function} handler\n   *        The source handler class\n   *\n   * @param {number} [index]\n   *        Register it at the following index\n   */\n  _Tech.registerSourceHandler = function (handler, index) {\n    var handlers = _Tech.sourceHandlers;\n\n    if (!handlers) {\n      handlers = _Tech.sourceHandlers = [];\n    }\n\n    if (index === undefined) {\n      // add to the end of the list\n      index = handlers.length;\n    }\n\n    handlers.splice(index, 0, handler);\n  };\n\n  /**\n   * Check if the tech can support the given type. Also checks the\n   * Techs sourceHandlers.\n   *\n   * @param {string} type\n   *         The mimetype to check.\n   *\n   * @return {string}\n   *         'probably', 'maybe', or '' (empty string)\n   */\n  _Tech.canPlayType = function (type) {\n    var handlers = _Tech.sourceHandlers || [];\n    var can = void 0;\n\n    for (var i = 0; i < handlers.length; i++) {\n      can = handlers[i].canPlayType(type);\n\n      if (can) {\n        return can;\n      }\n    }\n\n    return '';\n  };\n\n  /**\n   * Returns the first source handler that supports the source.\n   *\n   * TODO: Answer question: should 'probably' be prioritized over 'maybe'\n   *\n   * @param {Tech~SourceObject} source\n   *        The source object\n   *\n   * @param {Object} options\n   *        The options passed to the tech\n   *\n   * @return {SourceHandler|null}\n   *          The first source handler that supports the source or null if\n   *          no SourceHandler supports the source\n   */\n  _Tech.selectSourceHandler = function (source, options) {\n    var handlers = _Tech.sourceHandlers || [];\n    var can = void 0;\n\n    for (var i = 0; i < handlers.length; i++) {\n      can = handlers[i].canHandleSource(source, options);\n\n      if (can) {\n        return handlers[i];\n      }\n    }\n\n    return null;\n  };\n\n  /**\n   * Check if the tech can support the given source.\n   *\n   * @param {Tech~SourceObject} srcObj\n   *        The source object\n   *\n   * @param {Object} options\n   *        The options passed to the tech\n   *\n   * @return {string}\n   *         'probably', 'maybe', or '' (empty string)\n   */\n  _Tech.canPlaySource = function (srcObj, options) {\n    var sh = _Tech.selectSourceHandler(srcObj, options);\n\n    if (sh) {\n      return sh.canHandleSource(srcObj, options);\n    }\n\n    return '';\n  };\n\n  /**\n   * When using a source handler, prefer its implementation of\n   * any function normally provided by the tech.\n   */\n  var deferrable = ['seekable', 'seeking', 'duration'];\n\n  /**\n   * A wrapper around {@link Tech#seekable} that will call a `SourceHandler`s seekable\n   * function if it exists, with a fallback to the Techs seekable function.\n   *\n   * @method _Tech.seekable\n   */\n\n  /**\n   * A wrapper around {@link Tech#duration} that will call a `SourceHandler`s duration\n   * function if it exists, otherwise it will fallback to the techs duration function.\n   *\n   * @method _Tech.duration\n   */\n\n  deferrable.forEach(function (fnName) {\n    var originalFn = this[fnName];\n\n    if (typeof originalFn !== 'function') {\n      return;\n    }\n\n    this[fnName] = function () {\n      if (this.sourceHandler_ && this.sourceHandler_[fnName]) {\n        return this.sourceHandler_[fnName].apply(this.sourceHandler_, arguments);\n      }\n      return originalFn.apply(this, arguments);\n    };\n  }, _Tech.prototype);\n\n  /**\n   * Create a function for setting the source using a source object\n   * and source handlers.\n   * Should never be called unless a source handler was found.\n   *\n   * @param {Tech~SourceObject} source\n   *        A source object with src and type keys\n   */\n  _Tech.prototype.setSource = function (source) {\n    var sh = _Tech.selectSourceHandler(source, this.options_);\n\n    if (!sh) {\n      // Fall back to a native source hander when unsupported sources are\n      // deliberately set\n      if (_Tech.nativeSourceHandler) {\n        sh = _Tech.nativeSourceHandler;\n      } else {\n        log$1.error('No source hander found for the current source.');\n      }\n    }\n\n    // Dispose any existing source handler\n    this.disposeSourceHandler();\n    this.off('dispose', this.disposeSourceHandler);\n\n    if (sh !== _Tech.nativeSourceHandler) {\n      this.currentSource_ = source;\n    }\n\n    this.sourceHandler_ = sh.handleSource(source, this, this.options_);\n    this.on('dispose', this.disposeSourceHandler);\n  };\n\n  /**\n   * Clean up any existing SourceHandlers and listeners when the Tech is disposed.\n   *\n   * @listens Tech#dispose\n   */\n  _Tech.prototype.disposeSourceHandler = function () {\n    // if we have a source and get another one\n    // then we are loading something new\n    // than clear all of our current tracks\n    if (this.currentSource_) {\n      this.clearTracks(['audio', 'video']);\n      this.currentSource_ = null;\n    }\n\n    // always clean up auto-text tracks\n    this.cleanupAutoTextTracks();\n\n    if (this.sourceHandler_) {\n\n      if (this.sourceHandler_.dispose) {\n        this.sourceHandler_.dispose();\n      }\n\n      this.sourceHandler_ = null;\n    }\n  };\n};\n\n// The base Tech class needs to be registered as a Component. It is the only\n// Tech that can be registered as a Component.\nComponent.registerComponent('Tech', Tech);\nTech.registerTech('Tech', Tech);\n\n/**\n * A list of techs that should be added to techOrder on Players\n *\n * @private\n */\nTech.defaultTechOrder_ = [];\n\nvar middlewares = {};\nvar middlewareInstances = {};\n\nvar TERMINATOR = {};\n\nfunction use(type, middleware) {\n  middlewares[type] = middlewares[type] || [];\n  middlewares[type].push(middleware);\n}\n\n\n\nfunction setSource(player, src, next) {\n  player.setTimeout(function () {\n    return setSourceHelper(src, middlewares[src.type], next, player);\n  }, 1);\n}\n\nfunction setTech(middleware, tech) {\n  middleware.forEach(function (mw) {\n    return mw.setTech && mw.setTech(tech);\n  });\n}\n\n/**\n * Calls a getter on the tech first, through each middleware\n * from right to left to the player.\n */\nfunction get$1(middleware, tech, method) {\n  return middleware.reduceRight(middlewareIterator(method), tech[method]());\n}\n\n/**\n * Takes the argument given to the player and calls the setter method on each\n * middlware from left to right to the tech.\n */\nfunction set$1(middleware, tech, method, arg) {\n  return tech[method](middleware.reduce(middlewareIterator(method), arg));\n}\n\n/**\n * Takes the argument given to the player and calls the `call` version of the method\n * on each middleware from left to right.\n * Then, call the passed in method on the tech and return the result unchanged\n * back to the player, through middleware, this time from right to left.\n */\nfunction mediate(middleware, tech, method) {\n  var arg = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n  var callMethod = 'call' + toTitleCase(method);\n  var middlewareValue = middleware.reduce(middlewareIterator(callMethod), arg);\n  var terminated = middlewareValue === TERMINATOR;\n  var returnValue = terminated ? null : tech[method](middlewareValue);\n\n  executeRight(middleware, method, returnValue, terminated);\n\n  return returnValue;\n}\n\nvar allowedGetters = {\n  buffered: 1,\n  currentTime: 1,\n  duration: 1,\n  seekable: 1,\n  played: 1,\n  paused: 1\n};\n\nvar allowedSetters = {\n  setCurrentTime: 1\n};\n\nvar allowedMediators = {\n  play: 1,\n  pause: 1\n};\n\nfunction middlewareIterator(method) {\n  return function (value, mw) {\n    // if the previous middleware terminated, pass along the termination\n    if (value === TERMINATOR) {\n      return TERMINATOR;\n    }\n\n    if (mw[method]) {\n      return mw[method](value);\n    }\n\n    return value;\n  };\n}\n\nfunction executeRight(mws, method, value, terminated) {\n  for (var i = mws.length - 1; i >= 0; i--) {\n    var mw = mws[i];\n\n    if (mw[method]) {\n      mw[method](terminated, value);\n    }\n  }\n}\n\nfunction clearCacheForPlayer(player) {\n  middlewareInstances[player.id()] = null;\n}\n\n/**\n * {\n *  [playerId]: [[mwFactory, mwInstance], ...]\n * }\n */\nfunction getOrCreateFactory(player, mwFactory) {\n  var mws = middlewareInstances[player.id()];\n  var mw = null;\n\n  if (mws === undefined || mws === null) {\n    mw = mwFactory(player);\n    middlewareInstances[player.id()] = [[mwFactory, mw]];\n    return mw;\n  }\n\n  for (var i = 0; i < mws.length; i++) {\n    var _mws$i = mws[i],\n        mwf = _mws$i[0],\n        mwi = _mws$i[1];\n\n\n    if (mwf !== mwFactory) {\n      continue;\n    }\n\n    mw = mwi;\n  }\n\n  if (mw === null) {\n    mw = mwFactory(player);\n    mws.push([mwFactory, mw]);\n  }\n\n  return mw;\n}\n\nfunction setSourceHelper() {\n  var src = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var middleware = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  var next = arguments[2];\n  var player = arguments[3];\n  var acc = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n  var lastRun = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n  var mwFactory = middleware[0],\n      mwrest = middleware.slice(1);\n\n  // if mwFactory is a string, then we're at a fork in the road\n\n  if (typeof mwFactory === 'string') {\n    setSourceHelper(src, middlewares[mwFactory], next, player, acc, lastRun);\n\n    // if we have an mwFactory, call it with the player to get the mw,\n    // then call the mw's setSource method\n  } else if (mwFactory) {\n    var mw = getOrCreateFactory(player, mwFactory);\n\n    // if setSource isn't present, implicitly select this middleware\n    if (!mw.setSource) {\n      acc.push(mw);\n      return setSourceHelper(src, mwrest, next, player, acc, lastRun);\n    }\n\n    mw.setSource(assign({}, src), function (err, _src) {\n\n      // something happened, try the next middleware on the current level\n      // make sure to use the old src\n      if (err) {\n        return setSourceHelper(src, mwrest, next, player, acc, lastRun);\n      }\n\n      // we've succeeded, now we need to go deeper\n      acc.push(mw);\n\n      // if it's the same type, continue down the current chain\n      // otherwise, we want to go down the new chain\n      setSourceHelper(_src, src.type === _src.type ? mwrest : middlewares[_src.type], next, player, acc, lastRun);\n    });\n  } else if (mwrest.length) {\n    setSourceHelper(src, mwrest, next, player, acc, lastRun);\n  } else if (lastRun) {\n    next(src, acc);\n  } else {\n    setSourceHelper(src, middlewares['*'], next, player, acc, true);\n  }\n}\n\n/**\n * Mimetypes\n *\n * @see http://hul.harvard.edu/ois/////systems/wax/wax-public-help/mimetypes.htm\n * @typedef Mimetypes~Kind\n * @enum\n */\nvar MimetypesKind = {\n  opus: 'video/ogg',\n  ogv: 'video/ogg',\n  mp4: 'video/mp4',\n  mov: 'video/mp4',\n  m4v: 'video/mp4',\n  mkv: 'video/x-matroska',\n  mp3: 'audio/mpeg',\n  aac: 'audio/aac',\n  oga: 'audio/ogg',\n  m3u8: 'application/x-mpegURL'\n};\n\n/**\n * Get the mimetype of a given src url if possible\n *\n * @param {string} src\n *        The url to the src\n *\n * @return {string}\n *         return the mimetype if it was known or empty string otherwise\n */\nvar getMimetype = function getMimetype() {\n  var src = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n  var ext = getFileExtension(src);\n  var mimetype = MimetypesKind[ext.toLowerCase()];\n\n  return mimetype || '';\n};\n\n/**\n * Find the mime type of a given source string if possible. Uses the player\n * source cache.\n *\n * @param {Player} player\n *        The player object\n *\n * @param {string} src\n *        The source string\n *\n * @return {string}\n *         The type that was found\n */\nvar findMimetype = function findMimetype(player, src) {\n  if (!src) {\n    return '';\n  }\n\n  // 1. check for the type in the `source` cache\n  if (player.cache_.source.src === src && player.cache_.source.type) {\n    return player.cache_.source.type;\n  }\n\n  // 2. see if we have this source in our `currentSources` cache\n  var matchingSources = player.cache_.sources.filter(function (s) {\n    return s.src === src;\n  });\n\n  if (matchingSources.length) {\n    return matchingSources[0].type;\n  }\n\n  // 3. look for the src url in source elements and use the type there\n  var sources = player.$$('source');\n\n  for (var i = 0; i < sources.length; i++) {\n    var s = sources[i];\n\n    if (s.type && s.src && s.src === src) {\n      return s.type;\n    }\n  }\n\n  // 4. finally fallback to our list of mime types based on src url extension\n  return getMimetype(src);\n};\n\n/**\n * @module filter-source\n */\n/**\n * Filter out single bad source objects or multiple source objects in an\n * array. Also flattens nested source object arrays into a 1 dimensional\n * array of source objects.\n *\n * @param {Tech~SourceObject|Tech~SourceObject[]} src\n *        The src object to filter\n *\n * @return {Tech~SourceObject[]}\n *         An array of sourceobjects containing only valid sources\n *\n * @private\n */\nvar filterSource = function filterSource(src) {\n  // traverse array\n  if (Array.isArray(src)) {\n    var newsrc = [];\n\n    src.forEach(function (srcobj) {\n      srcobj = filterSource(srcobj);\n\n      if (Array.isArray(srcobj)) {\n        newsrc = newsrc.concat(srcobj);\n      } else if (isObject(srcobj)) {\n        newsrc.push(srcobj);\n      }\n    });\n\n    src = newsrc;\n  } else if (typeof src === 'string' && src.trim()) {\n    // convert string into object\n    src = [fixSource({ src: src })];\n  } else if (isObject(src) && typeof src.src === 'string' && src.src && src.src.trim()) {\n    // src is already valid\n    src = [fixSource(src)];\n  } else {\n    // invalid source, turn it into an empty array\n    src = [];\n  }\n\n  return src;\n};\n\n/**\n * Checks src mimetype, adding it when possible\n *\n * @param {Tech~SourceObject} src\n *        The src object to check\n * @return {Tech~SourceObject}\n *        src Object with known type\n */\nfunction fixSource(src) {\n  var mimetype = getMimetype(src.src);\n\n  if (!src.type && mimetype) {\n    src.type = mimetype;\n  }\n\n  return src;\n}\n\n/**\n * @file loader.js\n */\n/**\n * The `MediaLoader` is the `Component` that decides which playback technology to load\n * when a player is initialized.\n *\n * @extends Component\n */\n\nvar MediaLoader = function (_Component) {\n  inherits(MediaLoader, _Component);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should attach to.\n   *\n   * @param {Object} [options]\n   *        The key/value stroe of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function that is run when this component is ready.\n   */\n  function MediaLoader(player, options, ready) {\n    classCallCheck(this, MediaLoader);\n\n    // MediaLoader has no element\n    var options_ = mergeOptions({ createEl: false }, options);\n\n    // If there are no sources when the player is initialized,\n    // load the first supported playback technology.\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options_, ready));\n\n    if (!options.playerOptions.sources || options.playerOptions.sources.length === 0) {\n      for (var i = 0, j = options.playerOptions.techOrder; i < j.length; i++) {\n        var techName = toTitleCase(j[i]);\n        var tech = Tech.getTech(techName);\n\n        // Support old behavior of techs being registered as components.\n        // Remove once that deprecated behavior is removed.\n        if (!techName) {\n          tech = Component.getComponent(techName);\n        }\n\n        // Check if the browser supports this technology\n        if (tech && tech.isSupported()) {\n          player.loadTech_(techName);\n          break;\n        }\n      }\n    } else {\n      // Loop through playback technologies (HTML5, Flash) and check for support.\n      // Then load the best source.\n      // A few assumptions here:\n      //   All playback technologies respect preload false.\n      player.src(options.playerOptions.sources);\n    }\n    return _this;\n  }\n\n  return MediaLoader;\n}(Component);\n\nComponent.registerComponent('MediaLoader', MediaLoader);\n\n/**\n * @file button.js\n */\n/**\n * Clickable Component which is clickable or keyboard actionable,\n * but is not a native HTML button.\n *\n * @extends Component\n */\n\nvar ClickableComponent = function (_Component) {\n  inherits(ClickableComponent, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param  {Player} player\n   *         The `Player` that this class should be attached to.\n   *\n   * @param  {Object} [options]\n   *         The key/value store of player options.\n   */\n  function ClickableComponent(player, options) {\n    classCallCheck(this, ClickableComponent);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.emitTapEvents();\n\n    _this.enable();\n    return _this;\n  }\n\n  /**\n   * Create the `Component`s DOM element.\n   *\n   * @param {string} [tag=div]\n   *        The element's node type.\n   *\n   * @param {Object} [props={}]\n   *        An object of properties that should be set on the element.\n   *\n   * @param {Object} [attributes={}]\n   *        An object of attributes that should be set on the element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  ClickableComponent.prototype.createEl = function createEl$$1() {\n    var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div';\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    props = assign({\n      innerHTML: '<span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>',\n      className: this.buildCSSClass(),\n      tabIndex: 0\n    }, props);\n\n    if (tag === 'button') {\n      log$1.error('Creating a ClickableComponent with an HTML element of ' + tag + ' is not supported; use a Button instead.');\n    }\n\n    // Add ARIA attributes for clickable element which is not a native HTML button\n    attributes = assign({\n      role: 'button'\n    }, attributes);\n\n    this.tabIndex_ = props.tabIndex;\n\n    var el = _Component.prototype.createEl.call(this, tag, props, attributes);\n\n    this.createControlTextEl(el);\n\n    return el;\n  };\n\n  ClickableComponent.prototype.dispose = function dispose() {\n    // remove controlTextEl_ on dipose\n    this.controlTextEl_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Create a control text element on this `Component`\n   *\n   * @param {Element} [el]\n   *        Parent element for the control text.\n   *\n   * @return {Element}\n   *         The control text element that gets created.\n   */\n\n\n  ClickableComponent.prototype.createControlTextEl = function createControlTextEl(el) {\n    this.controlTextEl_ = createEl('span', {\n      className: 'vjs-control-text'\n    }, {\n      // let the screen reader user know that the text of the element may change\n      'aria-live': 'polite'\n    });\n\n    if (el) {\n      el.appendChild(this.controlTextEl_);\n    }\n\n    this.controlText(this.controlText_, el);\n\n    return this.controlTextEl_;\n  };\n\n  /**\n   * Get or set the localize text to use for the controls on the `Component`.\n   *\n   * @param {string} [text]\n   *        Control text for element.\n   *\n   * @param {Element} [el=this.el()]\n   *        Element to set the title on.\n   *\n   * @return {string}\n   *         - The control text when getting\n   */\n\n\n  ClickableComponent.prototype.controlText = function controlText(text) {\n    var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.el();\n\n    if (text === undefined) {\n      return this.controlText_ || 'Need Text';\n    }\n\n    var localizedText = this.localize(text);\n\n    this.controlText_ = text;\n    textContent(this.controlTextEl_, localizedText);\n    if (!this.nonIconControl) {\n      // Set title attribute if only an icon is shown\n      el.setAttribute('title', localizedText);\n    }\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  ClickableComponent.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Enable this `Component`s element.\n   */\n\n\n  ClickableComponent.prototype.enable = function enable() {\n    if (!this.enabled_) {\n      this.enabled_ = true;\n      this.removeClass('vjs-disabled');\n      this.el_.setAttribute('aria-disabled', 'false');\n      if (typeof this.tabIndex_ !== 'undefined') {\n        this.el_.setAttribute('tabIndex', this.tabIndex_);\n      }\n      this.on(['tap', 'click'], this.handleClick);\n      this.on('focus', this.handleFocus);\n      this.on('blur', this.handleBlur);\n    }\n  };\n\n  /**\n   * Disable this `Component`s element.\n   */\n\n\n  ClickableComponent.prototype.disable = function disable() {\n    this.enabled_ = false;\n    this.addClass('vjs-disabled');\n    this.el_.setAttribute('aria-disabled', 'true');\n    if (typeof this.tabIndex_ !== 'undefined') {\n      this.el_.removeAttribute('tabIndex');\n    }\n    this.off(['tap', 'click'], this.handleClick);\n    this.off('focus', this.handleFocus);\n    this.off('blur', this.handleBlur);\n  };\n\n  /**\n   * This gets called when a `ClickableComponent` gets:\n   * - Clicked (via the `click` event, listening starts in the constructor)\n   * - Tapped (via the `tap` event, listening starts in the constructor)\n   * - The following things happen in order:\n   *   1. {@link ClickableComponent#handleFocus} is called via a `focus` event on the\n   *      `ClickableComponent`.\n   *   2. {@link ClickableComponent#handleFocus} adds a listener for `keydown` on using\n   *      {@link ClickableComponent#handleKeyPress}.\n   *   3. `ClickableComponent` has not had a `blur` event (`blur` means that focus was lost). The user presses\n   *      the space or enter key.\n   *   4. {@link ClickableComponent#handleKeyPress} calls this function with the `keydown`\n   *      event as a parameter.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   * @abstract\n   */\n\n\n  ClickableComponent.prototype.handleClick = function handleClick(event) {};\n\n  /**\n   * This gets called when a `ClickableComponent` gains focus via a `focus` event.\n   * Turns on listening for `keydown` events. When they happen it\n   * calls `this.handleKeyPress`.\n   *\n   * @param {EventTarget~Event} event\n   *        The `focus` event that caused this function to be called.\n   *\n   * @listens focus\n   */\n\n\n  ClickableComponent.prototype.handleFocus = function handleFocus(event) {\n    on(document, 'keydown', bind(this, this.handleKeyPress));\n  };\n\n  /**\n   * Called when this ClickableComponent has focus and a key gets pressed down. By\n   * default it will call `this.handleClick` when the key is space or enter.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown` event that caused this function to be called.\n   *\n   * @listens keydown\n   */\n\n\n  ClickableComponent.prototype.handleKeyPress = function handleKeyPress(event) {\n\n    // Support Space (32) or Enter (13) key operation to fire a click event\n    if (event.which === 32 || event.which === 13) {\n      event.preventDefault();\n      this.trigger('click');\n    } else if (_Component.prototype.handleKeyPress) {\n\n      // Pass keypress handling up for unsupported keys\n      _Component.prototype.handleKeyPress.call(this, event);\n    }\n  };\n\n  /**\n   * Called when a `ClickableComponent` loses focus. Turns off the listener for\n   * `keydown` events. Which Stops `this.handleKeyPress` from getting called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `blur` event that caused this function to be called.\n   *\n   * @listens blur\n   */\n\n\n  ClickableComponent.prototype.handleBlur = function handleBlur(event) {\n    off(document, 'keydown', bind(this, this.handleKeyPress));\n  };\n\n  return ClickableComponent;\n}(Component);\n\nComponent.registerComponent('ClickableComponent', ClickableComponent);\n\n/**\n * @file poster-image.js\n */\n/**\n * A `ClickableComponent` that handles showing the poster image for the player.\n *\n * @extends ClickableComponent\n */\n\nvar PosterImage = function (_ClickableComponent) {\n  inherits(PosterImage, _ClickableComponent);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should attach to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function PosterImage(player, options) {\n    classCallCheck(this, PosterImage);\n\n    var _this = possibleConstructorReturn(this, _ClickableComponent.call(this, player, options));\n\n    _this.update();\n    player.on('posterchange', bind(_this, _this.update));\n    return _this;\n  }\n\n  /**\n   * Clean up and dispose of the `PosterImage`.\n   */\n\n\n  PosterImage.prototype.dispose = function dispose() {\n    this.player().off('posterchange', this.update);\n    _ClickableComponent.prototype.dispose.call(this);\n  };\n\n  /**\n   * Create the `PosterImage`s DOM element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  PosterImage.prototype.createEl = function createEl$$1() {\n    var el = createEl('div', {\n      className: 'vjs-poster',\n\n      // Don't want poster to be tabbable.\n      tabIndex: -1\n    });\n\n    // To ensure the poster image resizes while maintaining its original aspect\n    // ratio, use a div with `background-size` when available. For browsers that\n    // do not support `background-size` (e.g. IE8), fall back on using a regular\n    // img element.\n    if (!BACKGROUND_SIZE_SUPPORTED) {\n      this.fallbackImg_ = createEl('img');\n      el.appendChild(this.fallbackImg_);\n    }\n\n    return el;\n  };\n\n  /**\n   * An {@link EventTarget~EventListener} for {@link Player#posterchange} events.\n   *\n   * @listens Player#posterchange\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `Player#posterchange` event that triggered this function.\n   */\n\n\n  PosterImage.prototype.update = function update(event) {\n    var url = this.player().poster();\n\n    this.setSrc(url);\n\n    // If there's no poster source we should display:none on this component\n    // so it's not still clickable or right-clickable\n    if (url) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  };\n\n  /**\n   * Set the source of the `PosterImage` depending on the display method.\n   *\n   * @param {string} url\n   *        The URL to the source for the `PosterImage`.\n   */\n\n\n  PosterImage.prototype.setSrc = function setSrc(url) {\n    if (this.fallbackImg_) {\n      this.fallbackImg_.src = url;\n    } else {\n      var backgroundImage = '';\n\n      // Any falsey values should stay as an empty string, otherwise\n      // this will throw an extra error\n      if (url) {\n        backgroundImage = 'url(\"' + url + '\")';\n      }\n\n      this.el_.style.backgroundImage = backgroundImage;\n    }\n  };\n\n  /**\n   * An {@link EventTarget~EventListener} for clicks on the `PosterImage`. See\n   * {@link ClickableComponent#handleClick} for instances where this will be triggered.\n   *\n   * @listens tap\n   * @listens click\n   * @listens keydown\n   *\n   * @param {EventTarget~Event} event\n   +        The `click`, `tap` or `keydown` event that caused this function to be called.\n   */\n\n\n  PosterImage.prototype.handleClick = function handleClick(event) {\n    // We don't want a click to trigger playback when controls are disabled\n    if (!this.player_.controls()) {\n      return;\n    }\n\n    if (this.player_.paused()) {\n      silencePromise(this.player_.play());\n    } else {\n      this.player_.pause();\n    }\n  };\n\n  return PosterImage;\n}(ClickableComponent);\n\nComponent.registerComponent('PosterImage', PosterImage);\n\n/**\n * @file text-track-display.js\n */\nvar darkGray = '#222';\nvar lightGray = '#ccc';\nvar fontMap = {\n  monospace: 'monospace',\n  sansSerif: 'sans-serif',\n  serif: 'serif',\n  monospaceSansSerif: '\"Andale Mono\", \"Lucida Console\", monospace',\n  monospaceSerif: '\"Courier New\", monospace',\n  proportionalSansSerif: 'sans-serif',\n  proportionalSerif: 'serif',\n  casual: '\"Comic Sans MS\", Impact, fantasy',\n  script: '\"Monotype Corsiva\", cursive',\n  smallcaps: '\"Andale Mono\", \"Lucida Console\", monospace, sans-serif'\n};\n\n/**\n * Construct an rgba color from a given hex color code.\n *\n * @param {number} color\n *        Hex number for color, like #f0e or #f604e2.\n *\n * @param {number} opacity\n *        Value for opacity, 0.0 - 1.0.\n *\n * @return {string}\n *         The rgba color that was created, like 'rgba(255, 0, 0, 0.3)'.\n */\nfunction constructColor(color, opacity) {\n  var hex = void 0;\n\n  if (color.length === 4) {\n    // color looks like \"#f0e\"\n    hex = color[1] + color[1] + color[2] + color[2] + color[3] + color[3];\n  } else if (color.length === 7) {\n    // color looks like \"#f604e2\"\n    hex = color.slice(1);\n  } else {\n    throw new Error('Invalid color code provided, ' + color + '; must be formatted as e.g. #f0e or #f604e2.');\n  }\n  return 'rgba(' + parseInt(hex.slice(0, 2), 16) + ',' + parseInt(hex.slice(2, 4), 16) + ',' + parseInt(hex.slice(4, 6), 16) + ',' + opacity + ')';\n}\n\n/**\n * Try to update the style of a DOM element. Some style changes will throw an error,\n * particularly in IE8. Those should be noops.\n *\n * @param {Element} el\n *        The DOM element to be styled.\n *\n * @param {string} style\n *        The CSS property on the element that should be styled.\n *\n * @param {string} rule\n *        The style rule that should be applied to the property.\n *\n * @private\n */\nfunction tryUpdateStyle(el, style, rule) {\n  try {\n    el.style[style] = rule;\n  } catch (e) {\n\n    // Satisfies linter.\n    return;\n  }\n}\n\n/**\n * The component for displaying text track cues.\n *\n * @extends Component\n */\n\nvar TextTrackDisplay = function (_Component) {\n  inherits(TextTrackDisplay, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when `TextTrackDisplay` is ready.\n   */\n  function TextTrackDisplay(player, options, ready) {\n    classCallCheck(this, TextTrackDisplay);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options, ready));\n\n    player.on('loadstart', bind(_this, _this.toggleDisplay));\n    player.on('texttrackchange', bind(_this, _this.updateDisplay));\n    player.on('loadstart', bind(_this, _this.preselectTrack));\n\n    // This used to be called during player init, but was causing an error\n    // if a track should show by default and the display hadn't loaded yet.\n    // Should probably be moved to an external track loader when we support\n    // tracks that don't need a display.\n    player.ready(bind(_this, function () {\n      if (player.tech_ && player.tech_.featuresNativeTextTracks) {\n        this.hide();\n        return;\n      }\n\n      player.on('fullscreenchange', bind(this, this.updateDisplay));\n\n      var tracks = this.options_.playerOptions.tracks || [];\n\n      for (var i = 0; i < tracks.length; i++) {\n        this.player_.addRemoteTextTrack(tracks[i], true);\n      }\n\n      this.preselectTrack();\n    }));\n    return _this;\n  }\n\n  /**\n  * Preselect a track following this precedence:\n  * - matches the previously selected {@link TextTrack}'s language and kind\n  * - matches the previously selected {@link TextTrack}'s language only\n  * - is the first default captions track\n  * - is the first default descriptions track\n  *\n  * @listens Player#loadstart\n  */\n\n\n  TextTrackDisplay.prototype.preselectTrack = function preselectTrack() {\n    var modes = { captions: 1, subtitles: 1 };\n    var trackList = this.player_.textTracks();\n    var userPref = this.player_.cache_.selectedLanguage;\n    var firstDesc = void 0;\n    var firstCaptions = void 0;\n    var preferredTrack = void 0;\n\n    for (var i = 0; i < trackList.length; i++) {\n      var track = trackList[i];\n\n      if (userPref && userPref.enabled && userPref.language === track.language) {\n        // Always choose the track that matches both language and kind\n        if (track.kind === userPref.kind) {\n          preferredTrack = track;\n          // or choose the first track that matches language\n        } else if (!preferredTrack) {\n          preferredTrack = track;\n        }\n\n        // clear everything if offTextTrackMenuItem was clicked\n      } else if (userPref && !userPref.enabled) {\n        preferredTrack = null;\n        firstDesc = null;\n        firstCaptions = null;\n      } else if (track['default']) {\n        if (track.kind === 'descriptions' && !firstDesc) {\n          firstDesc = track;\n        } else if (track.kind in modes && !firstCaptions) {\n          firstCaptions = track;\n        }\n      }\n    }\n\n    // The preferredTrack matches the user preference and takes\n    // precendence over all the other tracks.\n    // So, display the preferredTrack before the first default track\n    // and the subtitles/captions track before the descriptions track\n    if (preferredTrack) {\n      preferredTrack.mode = 'showing';\n    } else if (firstCaptions) {\n      firstCaptions.mode = 'showing';\n    } else if (firstDesc) {\n      firstDesc.mode = 'showing';\n    }\n  };\n\n  /**\n   * Turn display of {@link TextTrack}'s from the current state into the other state.\n   * There are only two states:\n   * - 'shown'\n   * - 'hidden'\n   *\n   * @listens Player#loadstart\n   */\n\n\n  TextTrackDisplay.prototype.toggleDisplay = function toggleDisplay() {\n    if (this.player_.tech_ && this.player_.tech_.featuresNativeTextTracks) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  };\n\n  /**\n   * Create the {@link Component}'s DOM element.\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  TextTrackDisplay.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-text-track-display'\n    }, {\n      'aria-live': 'off',\n      'aria-atomic': 'true'\n    });\n  };\n\n  /**\n   * Clear all displayed {@link TextTrack}s.\n   */\n\n\n  TextTrackDisplay.prototype.clearDisplay = function clearDisplay() {\n    if (typeof window.WebVTT === 'function') {\n      window.WebVTT.processCues(window, [], this.el_);\n    }\n  };\n\n  /**\n   * Update the displayed TextTrack when a either a {@link Player#texttrackchange} or\n   * a {@link Player#fullscreenchange} is fired.\n   *\n   * @listens Player#texttrackchange\n   * @listens Player#fullscreenchange\n   */\n\n\n  TextTrackDisplay.prototype.updateDisplay = function updateDisplay() {\n    var tracks = this.player_.textTracks();\n\n    this.clearDisplay();\n\n    // Track display prioritization model: if multiple tracks are 'showing',\n    //  display the first 'subtitles' or 'captions' track which is 'showing',\n    //  otherwise display the first 'descriptions' track which is 'showing'\n\n    var descriptionsTrack = null;\n    var captionsSubtitlesTrack = null;\n    var i = tracks.length;\n\n    while (i--) {\n      var track = tracks[i];\n\n      if (track.mode === 'showing') {\n        if (track.kind === 'descriptions') {\n          descriptionsTrack = track;\n        } else {\n          captionsSubtitlesTrack = track;\n        }\n      }\n    }\n\n    if (captionsSubtitlesTrack) {\n      if (this.getAttribute('aria-live') !== 'off') {\n        this.setAttribute('aria-live', 'off');\n      }\n      this.updateForTrack(captionsSubtitlesTrack);\n    } else if (descriptionsTrack) {\n      if (this.getAttribute('aria-live') !== 'assertive') {\n        this.setAttribute('aria-live', 'assertive');\n      }\n      this.updateForTrack(descriptionsTrack);\n    }\n  };\n\n  /**\n   * Add an {@link Texttrack} to to the {@link Tech}s {@link TextTrackList}.\n   *\n   * @param {TextTrack} track\n   *        Text track object to be added to the list.\n   */\n\n\n  TextTrackDisplay.prototype.updateForTrack = function updateForTrack(track) {\n    if (typeof window.WebVTT !== 'function' || !track.activeCues) {\n      return;\n    }\n\n    var cues = [];\n\n    for (var _i = 0; _i < track.activeCues.length; _i++) {\n      cues.push(track.activeCues[_i]);\n    }\n\n    window.WebVTT.processCues(window, cues, this.el_);\n\n    if (!this.player_.textTrackSettings) {\n      return;\n    }\n\n    var overrides = this.player_.textTrackSettings.getValues();\n\n    var i = cues.length;\n\n    while (i--) {\n      var cue = cues[i];\n\n      if (!cue) {\n        continue;\n      }\n\n      var cueDiv = cue.displayState;\n\n      if (overrides.color) {\n        cueDiv.firstChild.style.color = overrides.color;\n      }\n      if (overrides.textOpacity) {\n        tryUpdateStyle(cueDiv.firstChild, 'color', constructColor(overrides.color || '#fff', overrides.textOpacity));\n      }\n      if (overrides.backgroundColor) {\n        cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;\n      }\n      if (overrides.backgroundOpacity) {\n        tryUpdateStyle(cueDiv.firstChild, 'backgroundColor', constructColor(overrides.backgroundColor || '#000', overrides.backgroundOpacity));\n      }\n      if (overrides.windowColor) {\n        if (overrides.windowOpacity) {\n          tryUpdateStyle(cueDiv, 'backgroundColor', constructColor(overrides.windowColor, overrides.windowOpacity));\n        } else {\n          cueDiv.style.backgroundColor = overrides.windowColor;\n        }\n      }\n      if (overrides.edgeStyle) {\n        if (overrides.edgeStyle === 'dropshadow') {\n          cueDiv.firstChild.style.textShadow = '2px 2px 3px ' + darkGray + ', 2px 2px 4px ' + darkGray + ', 2px 2px 5px ' + darkGray;\n        } else if (overrides.edgeStyle === 'raised') {\n          cueDiv.firstChild.style.textShadow = '1px 1px ' + darkGray + ', 2px 2px ' + darkGray + ', 3px 3px ' + darkGray;\n        } else if (overrides.edgeStyle === 'depressed') {\n          cueDiv.firstChild.style.textShadow = '1px 1px ' + lightGray + ', 0 1px ' + lightGray + ', -1px -1px ' + darkGray + ', 0 -1px ' + darkGray;\n        } else if (overrides.edgeStyle === 'uniform') {\n          cueDiv.firstChild.style.textShadow = '0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray;\n        }\n      }\n      if (overrides.fontPercent && overrides.fontPercent !== 1) {\n        var fontSize = window.parseFloat(cueDiv.style.fontSize);\n\n        cueDiv.style.fontSize = fontSize * overrides.fontPercent + 'px';\n        cueDiv.style.height = 'auto';\n        cueDiv.style.top = 'auto';\n        cueDiv.style.bottom = '2px';\n      }\n      if (overrides.fontFamily && overrides.fontFamily !== 'default') {\n        if (overrides.fontFamily === 'small-caps') {\n          cueDiv.firstChild.style.fontVariant = 'small-caps';\n        } else {\n          cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];\n        }\n      }\n    }\n  };\n\n  return TextTrackDisplay;\n}(Component);\n\nComponent.registerComponent('TextTrackDisplay', TextTrackDisplay);\n\n/**\n * @file loading-spinner.js\n */\n/**\n * A loading spinner for use during waiting/loading events.\n *\n * @extends Component\n */\n\nvar LoadingSpinner = function (_Component) {\n  inherits(LoadingSpinner, _Component);\n\n  function LoadingSpinner() {\n    classCallCheck(this, LoadingSpinner);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the `LoadingSpinner`s DOM element.\n   *\n   * @return {Element}\n   *         The dom element that gets created.\n   */\n  LoadingSpinner.prototype.createEl = function createEl$$1() {\n    var isAudio = this.player_.isAudio();\n    var playerType = this.localize(isAudio ? 'Audio Player' : 'Video Player');\n    var controlText = createEl('span', {\n      className: 'vjs-control-text',\n      innerHTML: this.localize('{1} is loading.', [playerType])\n    });\n\n    var el = _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-loading-spinner',\n      dir: 'ltr'\n    });\n\n    el.appendChild(controlText);\n\n    return el;\n  };\n\n  return LoadingSpinner;\n}(Component);\n\nComponent.registerComponent('LoadingSpinner', LoadingSpinner);\n\n/**\n * @file button.js\n */\n/**\n * Base class for all buttons.\n *\n * @extends ClickableComponent\n */\n\nvar Button = function (_ClickableComponent) {\n  inherits(Button, _ClickableComponent);\n\n  function Button() {\n    classCallCheck(this, Button);\n    return possibleConstructorReturn(this, _ClickableComponent.apply(this, arguments));\n  }\n\n  /**\n   * Create the `Button`s DOM element.\n   *\n   * @param {string} [tag=\"button\"]\n   *        The element's node type. This argument is IGNORED: no matter what\n   *        is passed, it will always create a `button` element.\n   *\n   * @param {Object} [props={}]\n   *        An object of properties that should be set on the element.\n   *\n   * @param {Object} [attributes={}]\n   *        An object of attributes that should be set on the element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n  Button.prototype.createEl = function createEl(tag) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    tag = 'button';\n\n    props = assign({\n      innerHTML: '<span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>',\n      className: this.buildCSSClass()\n    }, props);\n\n    // Add attributes for button element\n    attributes = assign({\n\n      // Necessary since the default button type is \"submit\"\n      type: 'button'\n    }, attributes);\n\n    var el = Component.prototype.createEl.call(this, tag, props, attributes);\n\n    this.createControlTextEl(el);\n\n    return el;\n  };\n\n  /**\n   * Add a child `Component` inside of this `Button`.\n   *\n   * @param {string|Component} child\n   *        The name or instance of a child to add.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of options that will get passed to children of\n   *        the child.\n   *\n   * @return {Component}\n   *         The `Component` that gets added as a child. When using a string the\n   *         `Component` will get created by this process.\n   *\n   * @deprecated since version 5\n   */\n\n\n  Button.prototype.addChild = function addChild(child) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var className = this.constructor.name;\n\n    log$1.warn('Adding an actionable (user controllable) child to a Button (' + className + ') is not supported; use a ClickableComponent instead.');\n\n    // Avoid the error message generated by ClickableComponent's addChild method\n    return Component.prototype.addChild.call(this, child, options);\n  };\n\n  /**\n   * Enable the `Button` element so that it can be activated or clicked. Use this with\n   * {@link Button#disable}.\n   */\n\n\n  Button.prototype.enable = function enable() {\n    _ClickableComponent.prototype.enable.call(this);\n    this.el_.removeAttribute('disabled');\n  };\n\n  /**\n   * Disable the `Button` element so that it cannot be activated or clicked. Use this with\n   * {@link Button#enable}.\n   */\n\n\n  Button.prototype.disable = function disable() {\n    _ClickableComponent.prototype.disable.call(this);\n    this.el_.setAttribute('disabled', 'disabled');\n  };\n\n  /**\n   * This gets called when a `Button` has focus and `keydown` is triggered via a key\n   * press.\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to get called.\n   *\n   * @listens keydown\n   */\n\n\n  Button.prototype.handleKeyPress = function handleKeyPress(event) {\n\n    // Ignore Space (32) or Enter (13) key operation, which is handled by the browser for a button.\n    if (event.which === 32 || event.which === 13) {\n      return;\n    }\n\n    // Pass keypress handling up for unsupported keys\n    _ClickableComponent.prototype.handleKeyPress.call(this, event);\n  };\n\n  return Button;\n}(ClickableComponent);\n\nComponent.registerComponent('Button', Button);\n\n/**\n * @file big-play-button.js\n */\n/**\n * The initial play button that shows before the video has played. The hiding of the\n * `BigPlayButton` get done via CSS and `Player` states.\n *\n * @extends Button\n */\n\nvar BigPlayButton = function (_Button) {\n  inherits(BigPlayButton, _Button);\n\n  function BigPlayButton(player, options) {\n    classCallCheck(this, BigPlayButton);\n\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    _this.mouseused_ = false;\n\n    _this.on('mousedown', _this.handleMouseDown);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object. Always returns 'vjs-big-play-button'.\n   */\n\n\n  BigPlayButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-big-play-button';\n  };\n\n  /**\n   * This gets called when a `BigPlayButton` \"clicked\". See {@link ClickableComponent}\n   * for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  BigPlayButton.prototype.handleClick = function handleClick(event) {\n    var playPromise = this.player_.play();\n\n    // exit early if clicked via the mouse\n    if (this.mouseused_ && event.clientX && event.clientY) {\n      silencePromise(playPromise);\n      return;\n    }\n\n    var cb = this.player_.getChild('controlBar');\n    var playToggle = cb && cb.getChild('playToggle');\n\n    if (!playToggle) {\n      this.player_.focus();\n      return;\n    }\n\n    var playFocus = function playFocus() {\n      return playToggle.focus();\n    };\n\n    if (isPromise(playPromise)) {\n      playPromise.then(playFocus, function () {});\n    } else {\n      this.setTimeout(playFocus, 1);\n    }\n  };\n\n  BigPlayButton.prototype.handleKeyPress = function handleKeyPress(event) {\n    this.mouseused_ = false;\n\n    _Button.prototype.handleKeyPress.call(this, event);\n  };\n\n  BigPlayButton.prototype.handleMouseDown = function handleMouseDown(event) {\n    this.mouseused_ = true;\n  };\n\n  return BigPlayButton;\n}(Button);\n\n/**\n * The text that should display over the `BigPlayButton`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n */\n\n\nBigPlayButton.prototype.controlText_ = 'Play Video';\n\nComponent.registerComponent('BigPlayButton', BigPlayButton);\n\n/**\n * @file close-button.js\n */\n/**\n * The `CloseButton` is a `{@link Button}` that fires a `close` event when\n * it gets clicked.\n *\n * @extends Button\n */\n\nvar CloseButton = function (_Button) {\n  inherits(CloseButton, _Button);\n\n  /**\n   * Creates an instance of the this class.\n   *\n   * @param  {Player} player\n   *         The `Player` that this class should be attached to.\n   *\n   * @param  {Object} [options]\n   *         The key/value store of player options.\n   */\n  function CloseButton(player, options) {\n    classCallCheck(this, CloseButton);\n\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    _this.controlText(options && options.controlText || _this.localize('Close'));\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  CloseButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-close-button ' + _Button.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * This gets called when a `CloseButton` gets clicked. See\n   * {@link ClickableComponent#handleClick} for more information on when this will be\n   * triggered\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   * @fires CloseButton#close\n   */\n\n\n  CloseButton.prototype.handleClick = function handleClick(event) {\n\n    /**\n     * Triggered when the a `CloseButton` is clicked.\n     *\n     * @event CloseButton#close\n     * @type {EventTarget~Event}\n     *\n     * @property {boolean} [bubbles=false]\n     *           set to false so that the close event does not\n     *           bubble up to parents if there is no listener\n     */\n    this.trigger({ type: 'close', bubbles: false });\n  };\n\n  return CloseButton;\n}(Button);\n\nComponent.registerComponent('CloseButton', CloseButton);\n\n/**\n * @file play-toggle.js\n */\n/**\n * Button to toggle between play and pause.\n *\n * @extends Button\n */\n\nvar PlayToggle = function (_Button) {\n  inherits(PlayToggle, _Button);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function PlayToggle(player, options) {\n    classCallCheck(this, PlayToggle);\n\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    _this.on(player, 'play', _this.handlePlay);\n    _this.on(player, 'pause', _this.handlePause);\n    _this.on(player, 'ended', _this.handleEnded);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  PlayToggle.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-play-control ' + _Button.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * This gets called when an `PlayToggle` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  PlayToggle.prototype.handleClick = function handleClick(event) {\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  };\n\n  /**\n   * This gets called once after the video has ended and the user seeks so that\n   * we can change the replay button back to a play button.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#seeked\n   */\n\n\n  PlayToggle.prototype.handleSeeked = function handleSeeked(event) {\n    this.removeClass('vjs-ended');\n\n    if (this.player_.paused()) {\n      this.handlePause(event);\n    } else {\n      this.handlePlay(event);\n    }\n  };\n\n  /**\n   * Add the vjs-playing class to the element so it can change appearance.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#play\n   */\n\n\n  PlayToggle.prototype.handlePlay = function handlePlay(event) {\n    this.removeClass('vjs-ended');\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n    // change the button text to \"Pause\"\n    this.controlText('Pause');\n  };\n\n  /**\n   * Add the vjs-paused class to the element so it can change appearance.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#pause\n   */\n\n\n  PlayToggle.prototype.handlePause = function handlePause(event) {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    // change the button text to \"Play\"\n    this.controlText('Play');\n  };\n\n  /**\n   * Add the vjs-ended class to the element so it can change appearance\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#ended\n   */\n\n\n  PlayToggle.prototype.handleEnded = function handleEnded(event) {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-ended');\n    // change the button text to \"Replay\"\n    this.controlText('Replay');\n\n    // on the next seek remove the replay button\n    this.one(this.player_, 'seeked', this.handleSeeked);\n  };\n\n  return PlayToggle;\n}(Button);\n\n/**\n * The text that should display over the `PlayToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nPlayToggle.prototype.controlText_ = 'Play';\n\nComponent.registerComponent('PlayToggle', PlayToggle);\n\n/**\n * @file format-time.js\n * @module format-time\n */\n\n/**\n* Format seconds as a time string, H:MM:SS or M:SS. Supplying a guide (in seconds)\n* will force a number of leading zeros to cover the length of the guide.\n*\n* @param {number} seconds\n*        Number of seconds to be turned into a string\n*\n* @param {number} guide\n*        Number (in seconds) to model the string after\n*\n* @return {string}\n*         Time formatted as H:MM:SS or M:SS\n*/\nvar defaultImplementation = function defaultImplementation(seconds, guide) {\n  seconds = seconds < 0 ? 0 : seconds;\n  var s = Math.floor(seconds % 60);\n  var m = Math.floor(seconds / 60 % 60);\n  var h = Math.floor(seconds / 3600);\n  var gm = Math.floor(guide / 60 % 60);\n  var gh = Math.floor(guide / 3600);\n\n  // handle invalid times\n  if (isNaN(seconds) || seconds === Infinity) {\n    // '-' is false for all relational operators (e.g. <, >=) so this setting\n    // will add the minimum number of fields specified by the guide\n    h = m = s = '-';\n  }\n\n  // Check if we need to show hours\n  h = h > 0 || gh > 0 ? h + ':' : '';\n\n  // If hours are showing, we may need to add a leading zero.\n  // Always show at least one digit of minutes.\n  m = ((h || gm >= 10) && m < 10 ? '0' + m : m) + ':';\n\n  // Check if leading zero is need for seconds\n  s = s < 10 ? '0' + s : s;\n\n  return h + m + s;\n};\n\nvar implementation = defaultImplementation;\n\n/**\n * Replaces the default formatTime implementation with a custom implementation.\n *\n * @param {Function} customImplementation\n *        A function which will be used in place of the default formatTime implementation.\n *        Will receive the current time in seconds and the guide (in seconds) as arguments.\n */\nfunction setFormatTime(customImplementation) {\n  implementation = customImplementation;\n}\n\n/**\n * Resets formatTime to the default implementation.\n */\nfunction resetFormatTime() {\n  implementation = defaultImplementation;\n}\n\nvar formatTime = function (seconds) {\n  var guide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : seconds;\n\n  return implementation(seconds, guide);\n};\n\n/**\n * @file time-display.js\n */\n/**\n * Displays the time left in the video\n *\n * @extends Component\n */\n\nvar TimeDisplay = function (_Component) {\n  inherits(TimeDisplay, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function TimeDisplay(player, options) {\n    classCallCheck(this, TimeDisplay);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.throttledUpdateContent = throttle(bind(_this, _this.updateContent), 25);\n    _this.on(player, 'timeupdate', _this.throttledUpdateContent);\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  TimeDisplay.prototype.createEl = function createEl$$1(plainName) {\n    var className = this.buildCSSClass();\n    var el = _Component.prototype.createEl.call(this, 'div', {\n      className: className + ' vjs-time-control vjs-control',\n      innerHTML: '<span class=\"vjs-control-text\">' + this.localize(this.labelText_) + '\\xA0</span>'\n    });\n\n    this.contentEl_ = createEl('span', {\n      className: className + '-display'\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    });\n\n    this.updateTextNode_();\n    el.appendChild(this.contentEl_);\n    return el;\n  };\n\n  TimeDisplay.prototype.dispose = function dispose() {\n    this.contentEl_ = null;\n    this.textNode_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Updates the \"remaining time\" text node with new content using the\n   * contents of the `formattedTime_` property.\n   *\n   * @private\n   */\n\n\n  TimeDisplay.prototype.updateTextNode_ = function updateTextNode_() {\n    if (!this.contentEl_) {\n      return;\n    }\n\n    while (this.contentEl_.firstChild) {\n      this.contentEl_.removeChild(this.contentEl_.firstChild);\n    }\n\n    this.textNode_ = document.createTextNode(this.formattedTime_ || this.formatTime_(0));\n    this.contentEl_.appendChild(this.textNode_);\n  };\n\n  /**\n   * Generates a formatted time for this component to use in display.\n   *\n   * @param  {number} time\n   *         A numeric time, in seconds.\n   *\n   * @return {string}\n   *         A formatted time\n   *\n   * @private\n   */\n\n\n  TimeDisplay.prototype.formatTime_ = function formatTime_(time) {\n    return formatTime(time);\n  };\n\n  /**\n   * Updates the time display text node if it has what was passed in changed\n   * the formatted time.\n   *\n   * @param {number} time\n   *        The time to update to\n   *\n   * @private\n   */\n\n\n  TimeDisplay.prototype.updateFormattedTime_ = function updateFormattedTime_(time) {\n    var formattedTime = this.formatTime_(time);\n\n    if (formattedTime === this.formattedTime_) {\n      return;\n    }\n\n    this.formattedTime_ = formattedTime;\n    this.requestAnimationFrame(this.updateTextNode_);\n  };\n\n  /**\n   * To be filled out in the child class, should update the displayed time\n   * in accordance with the fact that the current time has changed.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate`  event that caused this to run.\n   *\n   * @listens Player#timeupdate\n   */\n\n\n  TimeDisplay.prototype.updateContent = function updateContent(event) {};\n\n  return TimeDisplay;\n}(Component);\n\n/**\n * The text that is added to the `TimeDisplay` for screen reader users.\n *\n * @type {string}\n * @private\n */\n\n\nTimeDisplay.prototype.labelText_ = 'Time';\n\n/**\n * The text that should display over the `TimeDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n *\n * @deprecated in v7; controlText_ is not used in non-active display Components\n */\nTimeDisplay.prototype.controlText_ = 'Time';\n\nComponent.registerComponent('TimeDisplay', TimeDisplay);\n\n/**\n * @file current-time-display.js\n */\n/**\n * Displays the current time\n *\n * @extends Component\n */\n\nvar CurrentTimeDisplay = function (_TimeDisplay) {\n  inherits(CurrentTimeDisplay, _TimeDisplay);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function CurrentTimeDisplay(player, options) {\n    classCallCheck(this, CurrentTimeDisplay);\n\n    var _this = possibleConstructorReturn(this, _TimeDisplay.call(this, player, options));\n\n    _this.on(player, 'ended', _this.handleEnded);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  CurrentTimeDisplay.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-current-time';\n  };\n\n  /**\n   * Update current time display\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate` event that caused this function to run.\n   *\n   * @listens Player#timeupdate\n   */\n\n\n  CurrentTimeDisplay.prototype.updateContent = function updateContent(event) {\n    // Allows for smooth scrubbing, when player can't keep up.\n    var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();\n\n    this.updateFormattedTime_(time);\n  };\n\n  /**\n   * When the player fires ended there should be no time left. Sadly\n   * this is not always the case, lets make it seem like that is the case\n   * for users.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `ended` event that caused this to run.\n   *\n   * @listens Player#ended\n   */\n\n\n  CurrentTimeDisplay.prototype.handleEnded = function handleEnded(event) {\n    if (!this.player_.duration()) {\n      return;\n    }\n    this.updateFormattedTime_(this.player_.duration());\n  };\n\n  return CurrentTimeDisplay;\n}(TimeDisplay);\n\n/**\n * The text that is added to the `CurrentTimeDisplay` for screen reader users.\n *\n * @type {string}\n * @private\n */\n\n\nCurrentTimeDisplay.prototype.labelText_ = 'Current Time';\n\n/**\n * The text that should display over the `CurrentTimeDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n *\n * @deprecated in v7; controlText_ is not used in non-active display Components\n */\nCurrentTimeDisplay.prototype.controlText_ = 'Current Time';\n\nComponent.registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);\n\n/**\n * @file duration-display.js\n */\n/**\n * Displays the duration\n *\n * @extends Component\n */\n\nvar DurationDisplay = function (_TimeDisplay) {\n  inherits(DurationDisplay, _TimeDisplay);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function DurationDisplay(player, options) {\n    classCallCheck(this, DurationDisplay);\n\n    // we do not want to/need to throttle duration changes,\n    // as they should always display the changed duration as\n    // it has changed\n    var _this = possibleConstructorReturn(this, _TimeDisplay.call(this, player, options));\n\n    _this.on(player, 'durationchange', _this.updateContent);\n\n    // Also listen for timeupdate (in the parent) and loadedmetadata because removing those\n    // listeners could have broken dependent applications/libraries. These\n    // can likely be removed for 7.0.\n    _this.on(player, 'loadedmetadata', _this.throttledUpdateContent);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  DurationDisplay.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-duration';\n  };\n\n  /**\n   * Update duration time display.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `durationchange`, `timeupdate`, or `loadedmetadata` event that caused\n   *        this function to be called.\n   *\n   * @listens Player#durationchange\n   * @listens Player#timeupdate\n   * @listens Player#loadedmetadata\n   */\n\n\n  DurationDisplay.prototype.updateContent = function updateContent(event) {\n    var duration = this.player_.duration();\n\n    if (duration && this.duration_ !== duration) {\n      this.duration_ = duration;\n      this.updateFormattedTime_(duration);\n    }\n  };\n\n  return DurationDisplay;\n}(TimeDisplay);\n\n/**\n * The text that is added to the `DurationDisplay` for screen reader users.\n *\n * @type {string}\n * @private\n */\n\n\nDurationDisplay.prototype.labelText_ = 'Duration';\n\n/**\n * The text that should display over the `DurationDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n *\n * @deprecated in v7; controlText_ is not used in non-active display Components\n */\nDurationDisplay.prototype.controlText_ = 'Duration';\n\nComponent.registerComponent('DurationDisplay', DurationDisplay);\n\n/**\n * @file time-divider.js\n */\n/**\n * The separator between the current time and duration.\n * Can be hidden if it's not needed in the design.\n *\n * @extends Component\n */\n\nvar TimeDivider = function (_Component) {\n  inherits(TimeDivider, _Component);\n\n  function TimeDivider() {\n    classCallCheck(this, TimeDivider);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  TimeDivider.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-time-control vjs-time-divider',\n      innerHTML: '<div><span>/</span></div>'\n    });\n  };\n\n  return TimeDivider;\n}(Component);\n\nComponent.registerComponent('TimeDivider', TimeDivider);\n\n/**\n * @file remaining-time-display.js\n */\n/**\n * Displays the time left in the video\n *\n * @extends Component\n */\n\nvar RemainingTimeDisplay = function (_TimeDisplay) {\n  inherits(RemainingTimeDisplay, _TimeDisplay);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function RemainingTimeDisplay(player, options) {\n    classCallCheck(this, RemainingTimeDisplay);\n\n    var _this = possibleConstructorReturn(this, _TimeDisplay.call(this, player, options));\n\n    _this.on(player, 'durationchange', _this.throttledUpdateContent);\n    _this.on(player, 'ended', _this.handleEnded);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  RemainingTimeDisplay.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-remaining-time';\n  };\n\n  /**\n   * The remaining time display prefixes numbers with a \"minus\" character.\n   *\n   * @param  {number} time\n   *         A numeric time, in seconds.\n   *\n   * @return {string}\n   *         A formatted time\n   *\n   * @private\n   */\n\n\n  RemainingTimeDisplay.prototype.formatTime_ = function formatTime_(time) {\n    // TODO: The \"-\" should be decorative, and not announced by a screen reader\n    return '-' + _TimeDisplay.prototype.formatTime_.call(this, time);\n  };\n\n  /**\n   * Update remaining time display.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate` or `durationchange` event that caused this to run.\n   *\n   * @listens Player#timeupdate\n   * @listens Player#durationchange\n   */\n\n\n  RemainingTimeDisplay.prototype.updateContent = function updateContent(event) {\n    if (!this.player_.duration()) {\n      return;\n    }\n\n    // @deprecated We should only use remainingTimeDisplay\n    // as of video.js 7\n    if (this.player_.remainingTimeDisplay) {\n      this.updateFormattedTime_(this.player_.remainingTimeDisplay());\n    } else {\n      this.updateFormattedTime_(this.player_.remainingTime());\n    }\n  };\n\n  /**\n   * When the player fires ended there should be no time left. Sadly\n   * this is not always the case, lets make it seem like that is the case\n   * for users.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `ended` event that caused this to run.\n   *\n   * @listens Player#ended\n   */\n\n\n  RemainingTimeDisplay.prototype.handleEnded = function handleEnded(event) {\n    if (!this.player_.duration()) {\n      return;\n    }\n    this.updateFormattedTime_(0);\n  };\n\n  return RemainingTimeDisplay;\n}(TimeDisplay);\n\n/**\n * The text that is added to the `RemainingTimeDisplay` for screen reader users.\n *\n * @type {string}\n * @private\n */\n\n\nRemainingTimeDisplay.prototype.labelText_ = 'Remaining Time';\n\n/**\n * The text that should display over the `RemainingTimeDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n *\n * @deprecated in v7; controlText_ is not used in non-active display Components\n */\nRemainingTimeDisplay.prototype.controlText_ = 'Remaining Time';\n\nComponent.registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);\n\n/**\n * @file live-display.js\n */\n// TODO - Future make it click to snap to live\n\n/**\n * Displays the live indicator when duration is Infinity.\n *\n * @extends Component\n */\n\nvar LiveDisplay = function (_Component) {\n  inherits(LiveDisplay, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function LiveDisplay(player, options) {\n    classCallCheck(this, LiveDisplay);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.updateShowing();\n    _this.on(_this.player(), 'durationchange', _this.updateShowing);\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  LiveDisplay.prototype.createEl = function createEl$$1() {\n    var el = _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-live-control vjs-control'\n    });\n\n    this.contentEl_ = createEl('div', {\n      className: 'vjs-live-display',\n      innerHTML: '<span class=\"vjs-control-text\">' + this.localize('Stream Type') + '\\xA0</span>' + this.localize('LIVE')\n    }, {\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  };\n\n  LiveDisplay.prototype.dispose = function dispose() {\n    this.contentEl_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Check the duration to see if the LiveDisplay should be showing or not. Then show/hide\n   * it accordingly\n   *\n   * @param {EventTarget~Event} [event]\n   *        The {@link Player#durationchange} event that caused this function to run.\n   *\n   * @listens Player#durationchange\n   */\n\n\n  LiveDisplay.prototype.updateShowing = function updateShowing(event) {\n    if (this.player().duration() === Infinity) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  };\n\n  return LiveDisplay;\n}(Component);\n\nComponent.registerComponent('LiveDisplay', LiveDisplay);\n\n/**\n * @file slider.js\n */\n/**\n * The base functionality for a slider. Can be vertical or horizontal.\n * For instance the volume bar or the seek bar on a video is a slider.\n *\n * @extends Component\n */\n\nvar Slider = function (_Component) {\n  inherits(Slider, _Component);\n\n  /**\n   * Create an instance of this class\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function Slider(player, options) {\n    classCallCheck(this, Slider);\n\n    // Set property names to bar to match with the child Slider class is looking for\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.bar = _this.getChild(_this.options_.barName);\n\n    // Set a horizontal or vertical class on the slider depending on the slider type\n    _this.vertical(!!_this.options_.vertical);\n\n    _this.enable();\n    return _this;\n  }\n\n  /**\n   * Are controls are currently enabled for this slider or not.\n   *\n   * @return {boolean}\n   *         true if controls are enabled, false otherwise\n   */\n\n\n  Slider.prototype.enabled = function enabled() {\n    return this.enabled_;\n  };\n\n  /**\n   * Enable controls for this slider if they are disabled\n   */\n\n\n  Slider.prototype.enable = function enable() {\n    if (this.enabled()) {\n      return;\n    }\n\n    this.on('mousedown', this.handleMouseDown);\n    this.on('touchstart', this.handleMouseDown);\n    this.on('focus', this.handleFocus);\n    this.on('blur', this.handleBlur);\n    this.on('click', this.handleClick);\n\n    this.on(this.player_, 'controlsvisible', this.update);\n\n    if (this.playerEvent) {\n      this.on(this.player_, this.playerEvent, this.update);\n    }\n\n    this.removeClass('disabled');\n    this.setAttribute('tabindex', 0);\n\n    this.enabled_ = true;\n  };\n\n  /**\n   * Disable controls for this slider if they are enabled\n   */\n\n\n  Slider.prototype.disable = function disable() {\n    if (!this.enabled()) {\n      return;\n    }\n    var doc = this.bar.el_.ownerDocument;\n\n    this.off('mousedown', this.handleMouseDown);\n    this.off('touchstart', this.handleMouseDown);\n    this.off('focus', this.handleFocus);\n    this.off('blur', this.handleBlur);\n    this.off('click', this.handleClick);\n    this.off(this.player_, 'controlsvisible', this.update);\n    this.off(doc, 'mousemove', this.handleMouseMove);\n    this.off(doc, 'mouseup', this.handleMouseUp);\n    this.off(doc, 'touchmove', this.handleMouseMove);\n    this.off(doc, 'touchend', this.handleMouseUp);\n    this.removeAttribute('tabindex');\n\n    this.addClass('disabled');\n\n    if (this.playerEvent) {\n      this.off(this.player_, this.playerEvent, this.update);\n    }\n    this.enabled_ = false;\n  };\n\n  /**\n   * Create the `Button`s DOM element.\n   *\n   * @param {string} type\n   *        Type of element to create.\n   *\n   * @param {Object} [props={}]\n   *        List of properties in Object form.\n   *\n   * @param {Object} [attributes={}]\n   *        list of attributes in Object form.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  Slider.prototype.createEl = function createEl$$1(type) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    // Add the slider element class to all sub classes\n    props.className = props.className + ' vjs-slider';\n    props = assign({\n      tabIndex: 0\n    }, props);\n\n    attributes = assign({\n      'role': 'slider',\n      'aria-valuenow': 0,\n      'aria-valuemin': 0,\n      'aria-valuemax': 100,\n      'tabIndex': 0\n    }, attributes);\n\n    return _Component.prototype.createEl.call(this, type, props, attributes);\n  };\n\n  /**\n   * Handle `mousedown` or `touchstart` events on the `Slider`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousedown\n   * @listens touchstart\n   * @fires Slider#slideractive\n   */\n\n\n  Slider.prototype.handleMouseDown = function handleMouseDown(event) {\n    var doc = this.bar.el_.ownerDocument;\n\n    if (event.type === 'mousedown') {\n      event.preventDefault();\n    }\n    // Do not call preventDefault() on touchstart in Chrome\n    // to avoid console warnings. Use a 'touch-action: none' style\n    // instead to prevent unintented scrolling.\n    // https://developers.google.com/web/updates/2017/01/scrolling-intervention\n    if (event.type === 'touchstart' && !IS_CHROME) {\n      event.preventDefault();\n    }\n    blockTextSelection();\n\n    this.addClass('vjs-sliding');\n    /**\n     * Triggered when the slider is in an active state\n     *\n     * @event Slider#slideractive\n     * @type {EventTarget~Event}\n     */\n    this.trigger('slideractive');\n\n    this.on(doc, 'mousemove', this.handleMouseMove);\n    this.on(doc, 'mouseup', this.handleMouseUp);\n    this.on(doc, 'touchmove', this.handleMouseMove);\n    this.on(doc, 'touchend', this.handleMouseUp);\n\n    this.handleMouseMove(event);\n  };\n\n  /**\n   * Handle the `mousemove`, `touchmove`, and `mousedown` events on this `Slider`.\n   * The `mousemove` and `touchmove` events will only only trigger this function during\n   * `mousedown` and `touchstart`. This is due to {@link Slider#handleMouseDown} and\n   * {@link Slider#handleMouseUp}.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown`, `mousemove`, `touchstart`, or `touchmove` event that triggered\n   *        this function\n   *\n   * @listens mousemove\n   * @listens touchmove\n   */\n\n\n  Slider.prototype.handleMouseMove = function handleMouseMove(event) {};\n\n  /**\n   * Handle `mouseup` or `touchend` events on the `Slider`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mouseup` or `touchend` event that triggered this function.\n   *\n   * @listens touchend\n   * @listens mouseup\n   * @fires Slider#sliderinactive\n   */\n\n\n  Slider.prototype.handleMouseUp = function handleMouseUp() {\n    var doc = this.bar.el_.ownerDocument;\n\n    unblockTextSelection();\n\n    this.removeClass('vjs-sliding');\n    /**\n     * Triggered when the slider is no longer in an active state.\n     *\n     * @event Slider#sliderinactive\n     * @type {EventTarget~Event}\n     */\n    this.trigger('sliderinactive');\n\n    this.off(doc, 'mousemove', this.handleMouseMove);\n    this.off(doc, 'mouseup', this.handleMouseUp);\n    this.off(doc, 'touchmove', this.handleMouseMove);\n    this.off(doc, 'touchend', this.handleMouseUp);\n\n    this.update();\n  };\n\n  /**\n   * Update the progress bar of the `Slider`.\n   *\n   * @returns {number}\n   *          The percentage of progress the progress bar represents as a\n   *          number from 0 to 1.\n   */\n\n\n  Slider.prototype.update = function update() {\n\n    // In VolumeBar init we have a setTimeout for update that pops and update\n    // to the end of the execution stack. The player is destroyed before then\n    // update will cause an error\n    if (!this.el_) {\n      return;\n    }\n\n    // If scrubbing, we could use a cached value to make the handle keep up\n    // with the user's mouse. On HTML5 browsers scrubbing is really smooth, but\n    // some flash players are slow, so we might want to utilize this later.\n    // var progress =  (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();\n    var progress = this.getPercent();\n    var bar = this.bar;\n\n    // If there's no bar...\n    if (!bar) {\n      return;\n    }\n\n    // Protect against no duration and other division issues\n    if (typeof progress !== 'number' || progress !== progress || progress < 0 || progress === Infinity) {\n      progress = 0;\n    }\n\n    // Convert to a percentage for setting\n    var percentage = (progress * 100).toFixed(2) + '%';\n    var style = bar.el().style;\n\n    // Set the new bar width or height\n    if (this.vertical()) {\n      style.height = percentage;\n    } else {\n      style.width = percentage;\n    }\n\n    return progress;\n  };\n\n  /**\n   * Calculate distance for slider\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to run.\n   *\n   * @return {number}\n   *         The current position of the Slider.\n   *         - postition.x for vertical `Slider`s\n   *         - postition.y for horizontal `Slider`s\n   */\n\n\n  Slider.prototype.calculateDistance = function calculateDistance(event) {\n    var position = getPointerPosition(this.el_, event);\n\n    if (this.vertical()) {\n      return position.y;\n    }\n    return position.x;\n  };\n\n  /**\n   * Handle a `focus` event on this `Slider`.\n   *\n   * @param {EventTarget~Event} event\n   *        The `focus` event that caused this function to run.\n   *\n   * @listens focus\n   */\n\n\n  Slider.prototype.handleFocus = function handleFocus() {\n    this.on(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress);\n  };\n\n  /**\n   * Handle a `keydown` event on the `Slider`. Watches for left, rigth, up, and down\n   * arrow keys. This function will only be called when the slider has focus. See\n   * {@link Slider#handleFocus} and {@link Slider#handleBlur}.\n   *\n   * @param {EventTarget~Event} event\n   *        the `keydown` event that caused this function to run.\n   *\n   * @listens keydown\n   */\n\n\n  Slider.prototype.handleKeyPress = function handleKeyPress(event) {\n    // Left and Down Arrows\n    if (event.which === 37 || event.which === 40) {\n      event.preventDefault();\n      this.stepBack();\n\n      // Up and Right Arrows\n    } else if (event.which === 38 || event.which === 39) {\n      event.preventDefault();\n      this.stepForward();\n    }\n  };\n\n  /**\n   * Handle a `blur` event on this `Slider`.\n   *\n   * @param {EventTarget~Event} event\n   *        The `blur` event that caused this function to run.\n   *\n   * @listens blur\n   */\n\n  Slider.prototype.handleBlur = function handleBlur() {\n    this.off(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress);\n  };\n\n  /**\n   * Listener for click events on slider, used to prevent clicks\n   *   from bubbling up to parent elements like button menus.\n   *\n   * @param {Object} event\n   *        Event that caused this object to run\n   */\n\n\n  Slider.prototype.handleClick = function handleClick(event) {\n    event.stopImmediatePropagation();\n    event.preventDefault();\n  };\n\n  /**\n   * Get/set if slider is horizontal for vertical\n   *\n   * @param {boolean} [bool]\n   *        - true if slider is vertical,\n   *        - false is horizontal\n   *\n   * @return {boolean}\n   *         - true if slider is vertical, and getting\n   *         - false if the slider is horizontal, and getting\n   */\n\n\n  Slider.prototype.vertical = function vertical(bool) {\n    if (bool === undefined) {\n      return this.vertical_ || false;\n    }\n\n    this.vertical_ = !!bool;\n\n    if (this.vertical_) {\n      this.addClass('vjs-slider-vertical');\n    } else {\n      this.addClass('vjs-slider-horizontal');\n    }\n  };\n\n  return Slider;\n}(Component);\n\nComponent.registerComponent('Slider', Slider);\n\n/**\n * @file load-progress-bar.js\n */\n/**\n * Shows loading progress\n *\n * @extends Component\n */\n\nvar LoadProgressBar = function (_Component) {\n  inherits(LoadProgressBar, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function LoadProgressBar(player, options) {\n    classCallCheck(this, LoadProgressBar);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.partEls_ = [];\n    _this.on(player, 'progress', _this.update);\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  LoadProgressBar.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-load-progress',\n      innerHTML: '<span class=\"vjs-control-text\"><span>' + this.localize('Loaded') + '</span>: 0%</span>'\n    });\n  };\n\n  LoadProgressBar.prototype.dispose = function dispose() {\n    this.partEls_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Update progress bar\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `progress` event that caused this function to run.\n   *\n   * @listens Player#progress\n   */\n\n\n  LoadProgressBar.prototype.update = function update(event) {\n    var buffered = this.player_.buffered();\n    var duration = this.player_.duration();\n    var bufferedEnd = this.player_.bufferedEnd();\n    var children = this.partEls_;\n\n    // get the percent width of a time compared to the total end\n    var percentify = function percentify(time, end) {\n      // no NaN\n      var percent = time / end || 0;\n\n      return (percent >= 1 ? 1 : percent) * 100 + '%';\n    };\n\n    // update the width of the progress bar\n    this.el_.style.width = percentify(bufferedEnd, duration);\n\n    // add child elements to represent the individual buffered time ranges\n    for (var i = 0; i < buffered.length; i++) {\n      var start = buffered.start(i);\n      var end = buffered.end(i);\n      var part = children[i];\n\n      if (!part) {\n        part = this.el_.appendChild(createEl());\n        children[i] = part;\n      }\n\n      // set the percent based on the width of the progress bar (bufferedEnd)\n      part.style.left = percentify(start, bufferedEnd);\n      part.style.width = percentify(end - start, bufferedEnd);\n    }\n\n    // remove unused buffered range elements\n    for (var _i = children.length; _i > buffered.length; _i--) {\n      this.el_.removeChild(children[_i - 1]);\n    }\n    children.length = buffered.length;\n  };\n\n  return LoadProgressBar;\n}(Component);\n\nComponent.registerComponent('LoadProgressBar', LoadProgressBar);\n\n/**\n * @file time-tooltip.js\n */\n/**\n * Time tooltips display a time above the progress bar.\n *\n * @extends Component\n */\n\nvar TimeTooltip = function (_Component) {\n  inherits(TimeTooltip, _Component);\n\n  function TimeTooltip() {\n    classCallCheck(this, TimeTooltip);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the time tooltip DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  TimeTooltip.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-time-tooltip'\n    });\n  };\n\n  /**\n   * Updates the position of the time tooltip relative to the `SeekBar`.\n   *\n   * @param {Object} seekBarRect\n   *        The `ClientRect` for the {@link SeekBar} element.\n   *\n   * @param {number} seekBarPoint\n   *        A number from 0 to 1, representing a horizontal reference point\n   *        from the left edge of the {@link SeekBar}\n   */\n\n\n  TimeTooltip.prototype.update = function update(seekBarRect, seekBarPoint, content) {\n    var tooltipRect = getBoundingClientRect(this.el_);\n    var playerRect = getBoundingClientRect(this.player_.el());\n    var seekBarPointPx = seekBarRect.width * seekBarPoint;\n\n    // do nothing if either rect isn't available\n    // for example, if the player isn't in the DOM for testing\n    if (!playerRect || !tooltipRect) {\n      return;\n    }\n\n    // This is the space left of the `seekBarPoint` available within the bounds\n    // of the player. We calculate any gap between the left edge of the player\n    // and the left edge of the `SeekBar` and add the number of pixels in the\n    // `SeekBar` before hitting the `seekBarPoint`\n    var spaceLeftOfPoint = seekBarRect.left - playerRect.left + seekBarPointPx;\n\n    // This is the space right of the `seekBarPoint` available within the bounds\n    // of the player. We calculate the number of pixels from the `seekBarPoint`\n    // to the right edge of the `SeekBar` and add to that any gap between the\n    // right edge of the `SeekBar` and the player.\n    var spaceRightOfPoint = seekBarRect.width - seekBarPointPx + (playerRect.right - seekBarRect.right);\n\n    // This is the number of pixels by which the tooltip will need to be pulled\n    // further to the right to center it over the `seekBarPoint`.\n    var pullTooltipBy = tooltipRect.width / 2;\n\n    // Adjust the `pullTooltipBy` distance to the left or right depending on\n    // the results of the space calculations above.\n    if (spaceLeftOfPoint < pullTooltipBy) {\n      pullTooltipBy += pullTooltipBy - spaceLeftOfPoint;\n    } else if (spaceRightOfPoint < pullTooltipBy) {\n      pullTooltipBy = spaceRightOfPoint;\n    }\n\n    // Due to the imprecision of decimal/ratio based calculations and varying\n    // rounding behaviors, there are cases where the spacing adjustment is off\n    // by a pixel or two. This adds insurance to these calculations.\n    if (pullTooltipBy < 0) {\n      pullTooltipBy = 0;\n    } else if (pullTooltipBy > tooltipRect.width) {\n      pullTooltipBy = tooltipRect.width;\n    }\n\n    this.el_.style.right = '-' + pullTooltipBy + 'px';\n    textContent(this.el_, content);\n  };\n\n  return TimeTooltip;\n}(Component);\n\nComponent.registerComponent('TimeTooltip', TimeTooltip);\n\n/**\n * @file play-progress-bar.js\n */\n/**\n * Used by {@link SeekBar} to display media playback progress as part of the\n * {@link ProgressControl}.\n *\n * @extends Component\n */\n\nvar PlayProgressBar = function (_Component) {\n  inherits(PlayProgressBar, _Component);\n\n  function PlayProgressBar() {\n    classCallCheck(this, PlayProgressBar);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the the DOM element for this class.\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  PlayProgressBar.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-play-progress vjs-slider-bar',\n      innerHTML: '<span class=\"vjs-control-text\"><span>' + this.localize('Progress') + '</span>: 0%</span>'\n    });\n  };\n\n  /**\n   * Enqueues updates to its own DOM as well as the DOM of its\n   * {@link TimeTooltip} child.\n   *\n   * @param {Object} seekBarRect\n   *        The `ClientRect` for the {@link SeekBar} element.\n   *\n   * @param {number} seekBarPoint\n   *        A number from 0 to 1, representing a horizontal reference point\n   *        from the left edge of the {@link SeekBar}\n   */\n\n\n  PlayProgressBar.prototype.update = function update(seekBarRect, seekBarPoint) {\n    var _this2 = this;\n\n    // If there is an existing rAF ID, cancel it so we don't over-queue.\n    if (this.rafId_) {\n      this.cancelAnimationFrame(this.rafId_);\n    }\n\n    this.rafId_ = this.requestAnimationFrame(function () {\n      var time = _this2.player_.scrubbing() ? _this2.player_.getCache().currentTime : _this2.player_.currentTime();\n\n      var content = formatTime(time, _this2.player_.duration());\n      var timeTooltip = _this2.getChild('timeTooltip');\n\n      if (timeTooltip) {\n        timeTooltip.update(seekBarRect, seekBarPoint, content);\n      }\n    });\n  };\n\n  return PlayProgressBar;\n}(Component);\n\n/**\n * Default options for {@link PlayProgressBar}.\n *\n * @type {Object}\n * @private\n */\n\n\nPlayProgressBar.prototype.options_ = {\n  children: []\n};\n\n// Time tooltips should not be added to a player on mobile devices or IE8\nif ((!IE_VERSION || IE_VERSION > 8) && !IS_IOS && !IS_ANDROID) {\n  PlayProgressBar.prototype.options_.children.push('timeTooltip');\n}\n\nComponent.registerComponent('PlayProgressBar', PlayProgressBar);\n\n/**\n * @file mouse-time-display.js\n */\n/**\n * The {@link MouseTimeDisplay} component tracks mouse movement over the\n * {@link ProgressControl}. It displays an indicator and a {@link TimeTooltip}\n * indicating the time which is represented by a given point in the\n * {@link ProgressControl}.\n *\n * @extends Component\n */\n\nvar MouseTimeDisplay = function (_Component) {\n  inherits(MouseTimeDisplay, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The {@link Player} that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function MouseTimeDisplay(player, options) {\n    classCallCheck(this, MouseTimeDisplay);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.update = throttle(bind(_this, _this.update), 25);\n    return _this;\n  }\n\n  /**\n   * Create the DOM element for this class.\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  MouseTimeDisplay.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-mouse-display'\n    });\n  };\n\n  /**\n   * Enqueues updates to its own DOM as well as the DOM of its\n   * {@link TimeTooltip} child.\n   *\n   * @param {Object} seekBarRect\n   *        The `ClientRect` for the {@link SeekBar} element.\n   *\n   * @param {number} seekBarPoint\n   *        A number from 0 to 1, representing a horizontal reference point\n   *        from the left edge of the {@link SeekBar}\n   */\n\n\n  MouseTimeDisplay.prototype.update = function update(seekBarRect, seekBarPoint) {\n    var _this2 = this;\n\n    // If there is an existing rAF ID, cancel it so we don't over-queue.\n    if (this.rafId_) {\n      this.cancelAnimationFrame(this.rafId_);\n    }\n\n    this.rafId_ = this.requestAnimationFrame(function () {\n      var duration = _this2.player_.duration();\n      var content = formatTime(seekBarPoint * duration, duration);\n\n      _this2.el_.style.left = seekBarRect.width * seekBarPoint + 'px';\n      _this2.getChild('timeTooltip').update(seekBarRect, seekBarPoint, content);\n    });\n  };\n\n  return MouseTimeDisplay;\n}(Component);\n\n/**\n * Default options for `MouseTimeDisplay`\n *\n * @type {Object}\n * @private\n */\n\n\nMouseTimeDisplay.prototype.options_ = {\n  children: ['timeTooltip']\n};\n\nComponent.registerComponent('MouseTimeDisplay', MouseTimeDisplay);\n\n/**\n * @file seek-bar.js\n */\n// The number of seconds the `step*` functions move the timeline.\nvar STEP_SECONDS = 5;\n\n// The interval at which the bar should update as it progresses.\nvar UPDATE_REFRESH_INTERVAL = 30;\n\n/**\n * Seek bar and container for the progress bars. Uses {@link PlayProgressBar}\n * as its `bar`.\n *\n * @extends Slider\n */\n\nvar SeekBar = function (_Slider) {\n  inherits(SeekBar, _Slider);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function SeekBar(player, options) {\n    classCallCheck(this, SeekBar);\n\n    var _this = possibleConstructorReturn(this, _Slider.call(this, player, options));\n\n    _this.setEventHandlers_();\n    return _this;\n  }\n\n  /**\n   * Sets the event handlers\n   *\n   * @private\n   */\n\n\n  SeekBar.prototype.setEventHandlers_ = function setEventHandlers_() {\n    var _this2 = this;\n\n    this.update = throttle(bind(this, this.update), UPDATE_REFRESH_INTERVAL);\n\n    this.on(this.player_, 'timeupdate', this.update);\n    this.on(this.player_, 'ended', this.handleEnded);\n\n    // when playing, let's ensure we smoothly update the play progress bar\n    // via an interval\n    this.updateInterval = null;\n\n    this.on(this.player_, ['playing'], function () {\n      _this2.clearInterval(_this2.updateInterval);\n\n      _this2.updateInterval = _this2.setInterval(function () {\n        _this2.requestAnimationFrame(function () {\n          _this2.update();\n        });\n      }, UPDATE_REFRESH_INTERVAL);\n    });\n\n    this.on(this.player_, ['ended', 'pause', 'waiting'], function () {\n      _this2.clearInterval(_this2.updateInterval);\n    });\n\n    this.on(this.player_, ['timeupdate', 'ended'], this.update);\n  };\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  SeekBar.prototype.createEl = function createEl$$1() {\n    return _Slider.prototype.createEl.call(this, 'div', {\n      className: 'vjs-progress-holder'\n    }, {\n      'aria-label': this.localize('Progress Bar')\n    });\n  };\n\n  /**\n   * This function updates the play progress bar and accessiblity\n   * attributes to whatever is passed in.\n   *\n   * @param {number} currentTime\n   *        The currentTime value that should be used for accessiblity\n   *\n   * @param {number} percent\n   *        The percentage as a decimal that the bar should be filled from 0-1.\n   *\n   * @private\n   */\n\n\n  SeekBar.prototype.update_ = function update_(currentTime, percent) {\n    var duration = this.player_.duration();\n\n    // machine readable value of progress bar (percentage complete)\n    this.el_.setAttribute('aria-valuenow', (percent * 100).toFixed(2));\n\n    // human readable value of progress bar (time complete)\n    this.el_.setAttribute('aria-valuetext', this.localize('progress bar timing: currentTime={1} duration={2}', [formatTime(currentTime, duration), formatTime(duration, duration)], '{1} of {2}'));\n\n    // Update the `PlayProgressBar`.\n    this.bar.update(getBoundingClientRect(this.el_), percent);\n  };\n\n  /**\n   * Update the seek bar's UI.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate` or `ended` event that caused this to run.\n   *\n   * @listens Player#timeupdate\n   *\n   * @returns {number}\n   *          The current percent at a number from 0-1\n   */\n\n\n  SeekBar.prototype.update = function update(event) {\n    var percent = _Slider.prototype.update.call(this);\n\n    this.update_(this.getCurrentTime_(), percent);\n    return percent;\n  };\n\n  /**\n   * Get the value of current time but allows for smooth scrubbing,\n   * when player can't keep up.\n   *\n   * @return {number}\n   *         The current time value to display\n   *\n   * @private\n   */\n\n\n  SeekBar.prototype.getCurrentTime_ = function getCurrentTime_() {\n    return this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();\n  };\n\n  /**\n   * We want the seek bar to be full on ended\n   * no matter what the actual internal values are. so we force it.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate` or `ended` event that caused this to run.\n   *\n   * @listens Player#ended\n   */\n\n\n  SeekBar.prototype.handleEnded = function handleEnded(event) {\n    this.update_(this.player_.duration(), 1);\n  };\n\n  /**\n   * Get the percentage of media played so far.\n   *\n   * @return {number}\n   *         The percentage of media played so far (0 to 1).\n   */\n\n\n  SeekBar.prototype.getPercent = function getPercent() {\n    var percent = this.getCurrentTime_() / this.player_.duration();\n\n    return percent >= 1 ? 1 : percent;\n  };\n\n  /**\n   * Handle mouse down on seek bar\n   *\n   * @param {EventTarget~Event} event\n   *        The `mousedown` event that caused this to run.\n   *\n   * @listens mousedown\n   */\n\n\n  SeekBar.prototype.handleMouseDown = function handleMouseDown(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    // Stop event propagation to prevent double fire in progress-control.js\n    event.stopPropagation();\n    this.player_.scrubbing(true);\n\n    this.videoWasPlaying = !this.player_.paused();\n    this.player_.pause();\n\n    _Slider.prototype.handleMouseDown.call(this, event);\n  };\n\n  /**\n   * Handle mouse move on seek bar\n   *\n   * @param {EventTarget~Event} event\n   *        The `mousemove` event that caused this to run.\n   *\n   * @listens mousemove\n   */\n\n\n  SeekBar.prototype.handleMouseMove = function handleMouseMove(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    var newTime = this.calculateDistance(event) * this.player_.duration();\n\n    // Don't let video end while scrubbing.\n    if (newTime === this.player_.duration()) {\n      newTime = newTime - 0.1;\n    }\n\n    // Set new time (tell player to seek to new time)\n    this.player_.currentTime(newTime);\n  };\n\n  SeekBar.prototype.enable = function enable() {\n    _Slider.prototype.enable.call(this);\n    var mouseTimeDisplay = this.getChild('mouseTimeDisplay');\n\n    if (!mouseTimeDisplay) {\n      return;\n    }\n\n    mouseTimeDisplay.show();\n  };\n\n  SeekBar.prototype.disable = function disable() {\n    _Slider.prototype.disable.call(this);\n    var mouseTimeDisplay = this.getChild('mouseTimeDisplay');\n\n    if (!mouseTimeDisplay) {\n      return;\n    }\n\n    mouseTimeDisplay.hide();\n  };\n\n  /**\n   * Handle mouse up on seek bar\n   *\n   * @param {EventTarget~Event} event\n   *        The `mouseup` event that caused this to run.\n   *\n   * @listens mouseup\n   */\n\n\n  SeekBar.prototype.handleMouseUp = function handleMouseUp(event) {\n    _Slider.prototype.handleMouseUp.call(this, event);\n\n    // Stop event propagation to prevent double fire in progress-control.js\n    if (event) {\n      event.stopPropagation();\n    }\n    this.player_.scrubbing(false);\n\n    /**\n     * Trigger timeupdate because we're done seeking and the time has changed.\n     * This is particularly useful for if the player is paused to time the time displays.\n     *\n     * @event Tech#timeupdate\n     * @type {EventTarget~Event}\n     */\n    this.player_.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n    if (this.videoWasPlaying) {\n      silencePromise(this.player_.play());\n    }\n  };\n\n  /**\n   * Move more quickly fast forward for keyboard-only users\n   */\n\n\n  SeekBar.prototype.stepForward = function stepForward() {\n    this.player_.currentTime(this.player_.currentTime() + STEP_SECONDS);\n  };\n\n  /**\n   * Move more quickly rewind for keyboard-only users\n   */\n\n\n  SeekBar.prototype.stepBack = function stepBack() {\n    this.player_.currentTime(this.player_.currentTime() - STEP_SECONDS);\n  };\n\n  /**\n   * Toggles the playback state of the player\n   * This gets called when enter or space is used on the seekbar\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown` event that caused this function to be called\n   *\n   */\n\n\n  SeekBar.prototype.handleAction = function handleAction(event) {\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  };\n\n  /**\n   * Called when this SeekBar has focus and a key gets pressed down. By\n   * default it will call `this.handleAction` when the key is space or enter.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown` event that caused this function to be called.\n   *\n   * @listens keydown\n   */\n\n\n  SeekBar.prototype.handleKeyPress = function handleKeyPress(event) {\n\n    // Support Space (32) or Enter (13) key operation to fire a click event\n    if (event.which === 32 || event.which === 13) {\n      event.preventDefault();\n      this.handleAction(event);\n    } else if (_Slider.prototype.handleKeyPress) {\n\n      // Pass keypress handling up for unsupported keys\n      _Slider.prototype.handleKeyPress.call(this, event);\n    }\n  };\n\n  return SeekBar;\n}(Slider);\n\n/**\n * Default options for the `SeekBar`\n *\n * @type {Object}\n * @private\n */\n\n\nSeekBar.prototype.options_ = {\n  children: ['loadProgressBar', 'playProgressBar'],\n  barName: 'playProgressBar'\n};\n\n// MouseTimeDisplay tooltips should not be added to a player on mobile devices or IE8\nif ((!IE_VERSION || IE_VERSION > 8) && !IS_IOS && !IS_ANDROID) {\n  SeekBar.prototype.options_.children.splice(1, 0, 'mouseTimeDisplay');\n}\n\n/**\n * Call the update event for this Slider when this event happens on the player.\n *\n * @type {string}\n */\nSeekBar.prototype.playerEvent = 'timeupdate';\n\nComponent.registerComponent('SeekBar', SeekBar);\n\n/**\n * @file progress-control.js\n */\n/**\n * The Progress Control component contains the seek bar, load progress,\n * and play progress.\n *\n * @extends Component\n */\n\nvar ProgressControl = function (_Component) {\n  inherits(ProgressControl, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function ProgressControl(player, options) {\n    classCallCheck(this, ProgressControl);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.handleMouseMove = throttle(bind(_this, _this.handleMouseMove), 25);\n    _this.throttledHandleMouseSeek = throttle(bind(_this, _this.handleMouseSeek), 25);\n\n    _this.enable();\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  ProgressControl.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-progress-control vjs-control'\n    });\n  };\n\n  /**\n   * When the mouse moves over the `ProgressControl`, the pointer position\n   * gets passed down to the `MouseTimeDisplay` component.\n   *\n   * @param {EventTarget~Event} event\n   *        The `mousemove` event that caused this function to run.\n   *\n   * @listen mousemove\n   */\n\n\n  ProgressControl.prototype.handleMouseMove = function handleMouseMove(event) {\n    var seekBar = this.getChild('seekBar');\n\n    if (seekBar) {\n      var mouseTimeDisplay = seekBar.getChild('mouseTimeDisplay');\n      var seekBarEl = seekBar.el();\n      var seekBarRect = getBoundingClientRect(seekBarEl);\n      var seekBarPoint = getPointerPosition(seekBarEl, event).x;\n\n      // The default skin has a gap on either side of the `SeekBar`. This means\n      // that it's possible to trigger this behavior outside the boundaries of\n      // the `SeekBar`. This ensures we stay within it at all times.\n      if (seekBarPoint > 1) {\n        seekBarPoint = 1;\n      } else if (seekBarPoint < 0) {\n        seekBarPoint = 0;\n      }\n\n      if (mouseTimeDisplay) {\n        mouseTimeDisplay.update(seekBarRect, seekBarPoint);\n      }\n    }\n  };\n\n  /**\n   * A throttled version of the {@link ProgressControl#handleMouseSeek} listener.\n   *\n   * @method ProgressControl#throttledHandleMouseSeek\n   * @param {EventTarget~Event} event\n   *        The `mousemove` event that caused this function to run.\n   *\n   * @listen mousemove\n   * @listen touchmove\n   */\n\n  /**\n   * Handle `mousemove` or `touchmove` events on the `ProgressControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousemove\n   * @listens touchmove\n   */\n\n\n  ProgressControl.prototype.handleMouseSeek = function handleMouseSeek(event) {\n    var seekBar = this.getChild('seekBar');\n\n    if (seekBar) {\n      seekBar.handleMouseMove(event);\n    }\n  };\n\n  /**\n   * Are controls are currently enabled for this progress control.\n   *\n   * @return {boolean}\n   *         true if controls are enabled, false otherwise\n   */\n\n\n  ProgressControl.prototype.enabled = function enabled() {\n    return this.enabled_;\n  };\n\n  /**\n   * Disable all controls on the progress control and its children\n   */\n\n\n  ProgressControl.prototype.disable = function disable() {\n    this.children().forEach(function (child) {\n      return child.disable && child.disable();\n    });\n\n    if (!this.enabled()) {\n      return;\n    }\n\n    this.off(['mousedown', 'touchstart'], this.handleMouseDown);\n    this.off(this.el_, 'mousemove', this.handleMouseMove);\n    this.handleMouseUp();\n\n    this.addClass('disabled');\n\n    this.enabled_ = false;\n  };\n\n  /**\n   * Enable all controls on the progress control and its children\n   */\n\n\n  ProgressControl.prototype.enable = function enable() {\n    this.children().forEach(function (child) {\n      return child.enable && child.enable();\n    });\n\n    if (this.enabled()) {\n      return;\n    }\n\n    this.on(['mousedown', 'touchstart'], this.handleMouseDown);\n    this.on(this.el_, 'mousemove', this.handleMouseMove);\n    this.removeClass('disabled');\n\n    this.enabled_ = true;\n  };\n\n  /**\n   * Handle `mousedown` or `touchstart` events on the `ProgressControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousedown\n   * @listens touchstart\n   */\n\n\n  ProgressControl.prototype.handleMouseDown = function handleMouseDown(event) {\n    var doc = this.el_.ownerDocument;\n    var seekBar = this.getChild('seekBar');\n\n    if (seekBar) {\n      seekBar.handleMouseDown(event);\n    }\n\n    this.on(doc, 'mousemove', this.throttledHandleMouseSeek);\n    this.on(doc, 'touchmove', this.throttledHandleMouseSeek);\n    this.on(doc, 'mouseup', this.handleMouseUp);\n    this.on(doc, 'touchend', this.handleMouseUp);\n  };\n\n  /**\n   * Handle `mouseup` or `touchend` events on the `ProgressControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mouseup` or `touchend` event that triggered this function.\n   *\n   * @listens touchend\n   * @listens mouseup\n   */\n\n\n  ProgressControl.prototype.handleMouseUp = function handleMouseUp(event) {\n    var doc = this.el_.ownerDocument;\n    var seekBar = this.getChild('seekBar');\n\n    if (seekBar) {\n      seekBar.handleMouseUp(event);\n    }\n\n    this.off(doc, 'mousemove', this.throttledHandleMouseSeek);\n    this.off(doc, 'touchmove', this.throttledHandleMouseSeek);\n    this.off(doc, 'mouseup', this.handleMouseUp);\n    this.off(doc, 'touchend', this.handleMouseUp);\n  };\n\n  return ProgressControl;\n}(Component);\n\n/**\n * Default options for `ProgressControl`\n *\n * @type {Object}\n * @private\n */\n\n\nProgressControl.prototype.options_ = {\n  children: ['seekBar']\n};\n\nComponent.registerComponent('ProgressControl', ProgressControl);\n\n/**\n * @file fullscreen-toggle.js\n */\n/**\n * Toggle fullscreen video\n *\n * @extends Button\n */\n\nvar FullscreenToggle = function (_Button) {\n  inherits(FullscreenToggle, _Button);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function FullscreenToggle(player, options) {\n    classCallCheck(this, FullscreenToggle);\n\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    _this.on(player, 'fullscreenchange', _this.handleFullscreenChange);\n\n    if (document[FullscreenApi.fullscreenEnabled] === false) {\n      _this.disable();\n    }\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  FullscreenToggle.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-fullscreen-control ' + _Button.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Handles fullscreenchange on the player and change control text accordingly.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The {@link Player#fullscreenchange} event that caused this function to be\n   *        called.\n   *\n   * @listens Player#fullscreenchange\n   */\n\n\n  FullscreenToggle.prototype.handleFullscreenChange = function handleFullscreenChange(event) {\n    if (this.player_.isFullscreen()) {\n      this.controlText('Non-Fullscreen');\n    } else {\n      this.controlText('Fullscreen');\n    }\n  };\n\n  /**\n   * This gets called when an `FullscreenToggle` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  FullscreenToggle.prototype.handleClick = function handleClick(event) {\n    if (!this.player_.isFullscreen()) {\n      this.player_.requestFullscreen();\n    } else {\n      this.player_.exitFullscreen();\n    }\n  };\n\n  return FullscreenToggle;\n}(Button);\n\n/**\n * The text that should display over the `FullscreenToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nFullscreenToggle.prototype.controlText_ = 'Fullscreen';\n\nComponent.registerComponent('FullscreenToggle', FullscreenToggle);\n\n/**\n * Check if volume control is supported and if it isn't hide the\n * `Component` that was passed  using the `vjs-hidden` class.\n *\n * @param {Component} self\n *        The component that should be hidden if volume is unsupported\n *\n * @param {Player} player\n *        A reference to the player\n *\n * @private\n */\nvar checkVolumeSupport = function checkVolumeSupport(self, player) {\n  // hide volume controls when they're not supported by the current tech\n  if (player.tech_ && !player.tech_.featuresVolumeControl) {\n    self.addClass('vjs-hidden');\n  }\n\n  self.on(player, 'loadstart', function () {\n    if (!player.tech_.featuresVolumeControl) {\n      self.addClass('vjs-hidden');\n    } else {\n      self.removeClass('vjs-hidden');\n    }\n  });\n};\n\n/**\n * @file volume-level.js\n */\n/**\n * Shows volume level\n *\n * @extends Component\n */\n\nvar VolumeLevel = function (_Component) {\n  inherits(VolumeLevel, _Component);\n\n  function VolumeLevel() {\n    classCallCheck(this, VolumeLevel);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  VolumeLevel.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-volume-level',\n      innerHTML: '<span class=\"vjs-control-text\"></span>'\n    });\n  };\n\n  return VolumeLevel;\n}(Component);\n\nComponent.registerComponent('VolumeLevel', VolumeLevel);\n\n/**\n * @file volume-bar.js\n */\n// Required children\n/**\n * The bar that contains the volume level and can be clicked on to adjust the level\n *\n * @extends Slider\n */\n\nvar VolumeBar = function (_Slider) {\n  inherits(VolumeBar, _Slider);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function VolumeBar(player, options) {\n    classCallCheck(this, VolumeBar);\n\n    var _this = possibleConstructorReturn(this, _Slider.call(this, player, options));\n\n    _this.on('slideractive', _this.updateLastVolume_);\n    _this.on(player, 'volumechange', _this.updateARIAAttributes);\n    player.ready(function () {\n      return _this.updateARIAAttributes();\n    });\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  VolumeBar.prototype.createEl = function createEl$$1() {\n    return _Slider.prototype.createEl.call(this, 'div', {\n      className: 'vjs-volume-bar vjs-slider-bar'\n    }, {\n      'aria-label': this.localize('Volume Level'),\n      'aria-live': 'polite'\n    });\n  };\n\n  /**\n   * Handle mouse down on volume bar\n   *\n   * @param {EventTarget~Event} event\n   *        The `mousedown` event that caused this to run.\n   *\n   * @listens mousedown\n   */\n\n\n  VolumeBar.prototype.handleMouseDown = function handleMouseDown(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    _Slider.prototype.handleMouseDown.call(this, event);\n  };\n\n  /**\n   * Handle movement events on the {@link VolumeMenuButton}.\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to run.\n   *\n   * @listens mousemove\n   */\n\n\n  VolumeBar.prototype.handleMouseMove = function handleMouseMove(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    this.checkMuted();\n    this.player_.volume(this.calculateDistance(event));\n  };\n\n  /**\n   * If the player is muted unmute it.\n   */\n\n\n  VolumeBar.prototype.checkMuted = function checkMuted() {\n    if (this.player_.muted()) {\n      this.player_.muted(false);\n    }\n  };\n\n  /**\n   * Get percent of volume level\n   *\n   * @return {number}\n   *         Volume level percent as a decimal number.\n   */\n\n\n  VolumeBar.prototype.getPercent = function getPercent() {\n    if (this.player_.muted()) {\n      return 0;\n    }\n    return this.player_.volume();\n  };\n\n  /**\n   * Increase volume level for keyboard users\n   */\n\n\n  VolumeBar.prototype.stepForward = function stepForward() {\n    this.checkMuted();\n    this.player_.volume(this.player_.volume() + 0.1);\n  };\n\n  /**\n   * Decrease volume level for keyboard users\n   */\n\n\n  VolumeBar.prototype.stepBack = function stepBack() {\n    this.checkMuted();\n    this.player_.volume(this.player_.volume() - 0.1);\n  };\n\n  /**\n   * Update ARIA accessibility attributes\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `volumechange` event that caused this function to run.\n   *\n   * @listens Player#volumechange\n   */\n\n\n  VolumeBar.prototype.updateARIAAttributes = function updateARIAAttributes(event) {\n    var ariaValue = this.player_.muted() ? 0 : this.volumeAsPercentage_();\n\n    this.el_.setAttribute('aria-valuenow', ariaValue);\n    this.el_.setAttribute('aria-valuetext', ariaValue + '%');\n  };\n\n  /**\n   * Returns the current value of the player volume as a percentage\n   *\n   * @private\n   */\n\n\n  VolumeBar.prototype.volumeAsPercentage_ = function volumeAsPercentage_() {\n    return Math.round(this.player_.volume() * 100);\n  };\n\n  /**\n   * When user starts dragging the VolumeBar, store the volume and listen for\n   * the end of the drag. When the drag ends, if the volume was set to zero,\n   * set lastVolume to the stored volume.\n   *\n   * @listens slideractive\n   * @private\n   */\n\n\n  VolumeBar.prototype.updateLastVolume_ = function updateLastVolume_() {\n    var _this2 = this;\n\n    var volumeBeforeDrag = this.player_.volume();\n\n    this.one('sliderinactive', function () {\n      if (_this2.player_.volume() === 0) {\n        _this2.player_.lastVolume_(volumeBeforeDrag);\n      }\n    });\n  };\n\n  return VolumeBar;\n}(Slider);\n\n/**\n * Default options for the `VolumeBar`\n *\n * @type {Object}\n * @private\n */\n\n\nVolumeBar.prototype.options_ = {\n  children: ['volumeLevel'],\n  barName: 'volumeLevel'\n};\n\n/**\n * Call the update event for this Slider when this event happens on the player.\n *\n * @type {string}\n */\nVolumeBar.prototype.playerEvent = 'volumechange';\n\nComponent.registerComponent('VolumeBar', VolumeBar);\n\n/**\n * @file volume-control.js\n */\n// Required children\n/**\n * The component for controlling the volume level\n *\n * @extends Component\n */\n\nvar VolumeControl = function (_Component) {\n  inherits(VolumeControl, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function VolumeControl(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, VolumeControl);\n\n    options.vertical = options.vertical || false;\n\n    // Pass the vertical option down to the VolumeBar if\n    // the VolumeBar is turned on.\n    if (typeof options.volumeBar === 'undefined' || isPlain(options.volumeBar)) {\n      options.volumeBar = options.volumeBar || {};\n      options.volumeBar.vertical = options.vertical;\n    }\n\n    // hide this control if volume support is missing\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    checkVolumeSupport(_this, player);\n\n    _this.throttledHandleMouseMove = throttle(bind(_this, _this.handleMouseMove), 25);\n\n    _this.on('mousedown', _this.handleMouseDown);\n    _this.on('touchstart', _this.handleMouseDown);\n\n    // while the slider is active (the mouse has been pressed down and\n    // is dragging) or in focus we do not want to hide the VolumeBar\n    _this.on(_this.volumeBar, ['focus', 'slideractive'], function () {\n      _this.volumeBar.addClass('vjs-slider-active');\n      _this.addClass('vjs-slider-active');\n      _this.trigger('slideractive');\n    });\n\n    _this.on(_this.volumeBar, ['blur', 'sliderinactive'], function () {\n      _this.volumeBar.removeClass('vjs-slider-active');\n      _this.removeClass('vjs-slider-active');\n      _this.trigger('sliderinactive');\n    });\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  VolumeControl.prototype.createEl = function createEl() {\n    var orientationClass = 'vjs-volume-horizontal';\n\n    if (this.options_.vertical) {\n      orientationClass = 'vjs-volume-vertical';\n    }\n\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-volume-control vjs-control ' + orientationClass\n    });\n  };\n\n  /**\n   * Handle `mousedown` or `touchstart` events on the `VolumeControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousedown\n   * @listens touchstart\n   */\n\n\n  VolumeControl.prototype.handleMouseDown = function handleMouseDown(event) {\n    var doc = this.el_.ownerDocument;\n\n    this.on(doc, 'mousemove', this.throttledHandleMouseMove);\n    this.on(doc, 'touchmove', this.throttledHandleMouseMove);\n    this.on(doc, 'mouseup', this.handleMouseUp);\n    this.on(doc, 'touchend', this.handleMouseUp);\n  };\n\n  /**\n   * Handle `mouseup` or `touchend` events on the `VolumeControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mouseup` or `touchend` event that triggered this function.\n   *\n   * @listens touchend\n   * @listens mouseup\n   */\n\n\n  VolumeControl.prototype.handleMouseUp = function handleMouseUp(event) {\n    var doc = this.el_.ownerDocument;\n\n    this.off(doc, 'mousemove', this.throttledHandleMouseMove);\n    this.off(doc, 'touchmove', this.throttledHandleMouseMove);\n    this.off(doc, 'mouseup', this.handleMouseUp);\n    this.off(doc, 'touchend', this.handleMouseUp);\n  };\n\n  /**\n   * Handle `mousedown` or `touchstart` events on the `VolumeControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousedown\n   * @listens touchstart\n   */\n\n\n  VolumeControl.prototype.handleMouseMove = function handleMouseMove(event) {\n    this.volumeBar.handleMouseMove(event);\n  };\n\n  return VolumeControl;\n}(Component);\n\n/**\n * Default options for the `VolumeControl`\n *\n * @type {Object}\n * @private\n */\n\n\nVolumeControl.prototype.options_ = {\n  children: ['volumeBar']\n};\n\nComponent.registerComponent('VolumeControl', VolumeControl);\n\n/**\n * Check if muting volume is supported and if it isn't hide the mute toggle\n * button.\n *\n * @param {Component} self\n *        A reference to the mute toggle button\n *\n * @param {Player} player\n *        A reference to the player\n *\n * @private\n */\nvar checkMuteSupport = function checkMuteSupport(self, player) {\n  // hide mute toggle button if it's not supported by the current tech\n  if (player.tech_ && !player.tech_.featuresMuteControl) {\n    self.addClass('vjs-hidden');\n  }\n\n  self.on(player, 'loadstart', function () {\n    if (!player.tech_.featuresMuteControl) {\n      self.addClass('vjs-hidden');\n    } else {\n      self.removeClass('vjs-hidden');\n    }\n  });\n};\n\n/**\n * @file mute-toggle.js\n */\n/**\n * A button component for muting the audio.\n *\n * @extends Button\n */\n\nvar MuteToggle = function (_Button) {\n  inherits(MuteToggle, _Button);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function MuteToggle(player, options) {\n    classCallCheck(this, MuteToggle);\n\n    // hide this control if volume support is missing\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    checkMuteSupport(_this, player);\n\n    _this.on(player, ['loadstart', 'volumechange'], _this.update);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  MuteToggle.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-mute-control ' + _Button.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * This gets called when an `MuteToggle` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  MuteToggle.prototype.handleClick = function handleClick(event) {\n    var vol = this.player_.volume();\n    var lastVolume = this.player_.lastVolume_();\n\n    if (vol === 0) {\n      var volumeToSet = lastVolume < 0.1 ? 0.1 : lastVolume;\n\n      this.player_.volume(volumeToSet);\n      this.player_.muted(false);\n    } else {\n      this.player_.muted(this.player_.muted() ? false : true);\n    }\n  };\n\n  /**\n   * Update the `MuteToggle` button based on the state of `volume` and `muted`\n   * on the player.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The {@link Player#loadstart} event if this function was called\n   *        through an event.\n   *\n   * @listens Player#loadstart\n   * @listens Player#volumechange\n   */\n\n\n  MuteToggle.prototype.update = function update(event) {\n    this.updateIcon_();\n    this.updateControlText_();\n  };\n\n  /**\n   * Update the appearance of the `MuteToggle` icon.\n   *\n   * Possible states (given `level` variable below):\n   * - 0: crossed out\n   * - 1: zero bars of volume\n   * - 2: one bar of volume\n   * - 3: two bars of volume\n   *\n   * @private\n   */\n\n\n  MuteToggle.prototype.updateIcon_ = function updateIcon_() {\n    var vol = this.player_.volume();\n    var level = 3;\n\n    // in iOS when a player is loaded with muted attribute\n    // and volume is changed with a native mute button\n    // we want to make sure muted state is updated\n    if (IS_IOS) {\n      this.player_.muted(this.player_.tech_.el_.muted);\n    }\n\n    if (vol === 0 || this.player_.muted()) {\n      level = 0;\n    } else if (vol < 0.33) {\n      level = 1;\n    } else if (vol < 0.67) {\n      level = 2;\n    }\n\n    // TODO improve muted icon classes\n    for (var i = 0; i < 4; i++) {\n      removeClass(this.el_, 'vjs-vol-' + i);\n    }\n    addClass(this.el_, 'vjs-vol-' + level);\n  };\n\n  /**\n   * If `muted` has changed on the player, update the control text\n   * (`title` attribute on `vjs-mute-control` element and content of\n   * `vjs-control-text` element).\n   *\n   * @private\n   */\n\n\n  MuteToggle.prototype.updateControlText_ = function updateControlText_() {\n    var soundOff = this.player_.muted() || this.player_.volume() === 0;\n    var text = soundOff ? 'Unmute' : 'Mute';\n\n    if (this.controlText() !== text) {\n      this.controlText(text);\n    }\n  };\n\n  return MuteToggle;\n}(Button);\n\n/**\n * The text that should display over the `MuteToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nMuteToggle.prototype.controlText_ = 'Mute';\n\nComponent.registerComponent('MuteToggle', MuteToggle);\n\n/**\n * @file volume-control.js\n */\n// Required children\n/**\n * A Component to contain the MuteToggle and VolumeControl so that\n * they can work together.\n *\n * @extends Component\n */\n\nvar VolumePanel = function (_Component) {\n  inherits(VolumePanel, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function VolumePanel(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, VolumePanel);\n\n    if (typeof options.inline !== 'undefined') {\n      options.inline = options.inline;\n    } else {\n      options.inline = true;\n    }\n\n    // pass the inline option down to the VolumeControl as vertical if\n    // the VolumeControl is on.\n    if (typeof options.volumeControl === 'undefined' || isPlain(options.volumeControl)) {\n      options.volumeControl = options.volumeControl || {};\n      options.volumeControl.vertical = !options.inline;\n    }\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.on(player, ['loadstart'], _this.volumePanelState_);\n\n    // while the slider is active (the mouse has been pressed down and\n    // is dragging) we do not want to hide the VolumeBar\n    _this.on(_this.volumeControl, ['slideractive'], _this.sliderActive_);\n\n    _this.on(_this.volumeControl, ['sliderinactive'], _this.sliderInactive_);\n    return _this;\n  }\n\n  /**\n   * Add vjs-slider-active class to the VolumePanel\n   *\n   * @listens VolumeControl#slideractive\n   * @private\n   */\n\n\n  VolumePanel.prototype.sliderActive_ = function sliderActive_() {\n    this.addClass('vjs-slider-active');\n  };\n\n  /**\n   * Removes vjs-slider-active class to the VolumePanel\n   *\n   * @listens VolumeControl#sliderinactive\n   * @private\n   */\n\n\n  VolumePanel.prototype.sliderInactive_ = function sliderInactive_() {\n    this.removeClass('vjs-slider-active');\n  };\n\n  /**\n   * Adds vjs-hidden or vjs-mute-toggle-only to the VolumePanel\n   * depending on MuteToggle and VolumeControl state\n   *\n   * @listens Player#loadstart\n   * @private\n   */\n\n\n  VolumePanel.prototype.volumePanelState_ = function volumePanelState_() {\n    // hide volume panel if neither volume control or mute toggle\n    // are displayed\n    if (this.volumeControl.hasClass('vjs-hidden') && this.muteToggle.hasClass('vjs-hidden')) {\n      this.addClass('vjs-hidden');\n    }\n\n    // if only mute toggle is visible we don't want\n    // volume panel expanding when hovered or active\n    if (this.volumeControl.hasClass('vjs-hidden') && !this.muteToggle.hasClass('vjs-hidden')) {\n      this.addClass('vjs-mute-toggle-only');\n    }\n  };\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  VolumePanel.prototype.createEl = function createEl() {\n    var orientationClass = 'vjs-volume-panel-horizontal';\n\n    if (!this.options_.inline) {\n      orientationClass = 'vjs-volume-panel-vertical';\n    }\n\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-volume-panel vjs-control ' + orientationClass\n    });\n  };\n\n  return VolumePanel;\n}(Component);\n\n/**\n * Default options for the `VolumeControl`\n *\n * @type {Object}\n * @private\n */\n\n\nVolumePanel.prototype.options_ = {\n  children: ['muteToggle', 'volumeControl']\n};\n\nComponent.registerComponent('VolumePanel', VolumePanel);\n\n/**\n * @file menu.js\n */\n/**\n * The Menu component is used to build popup menus, including subtitle and\n * captions selection menus.\n *\n * @extends Component\n */\n\nvar Menu = function (_Component) {\n  inherits(Menu, _Component);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Player} player\n   *        the player that this component should attach to\n   *\n   * @param {Object} [options]\n   *        Object of option names and values\n   *\n   */\n  function Menu(player, options) {\n    classCallCheck(this, Menu);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    if (options) {\n      _this.menuButton_ = options.menuButton;\n    }\n\n    _this.focusedChild_ = -1;\n\n    _this.on('keydown', _this.handleKeyPress);\n    return _this;\n  }\n\n  /**\n   * Add a {@link MenuItem} to the menu.\n   *\n   * @param {Object|string} component\n   *        The name or instance of the `MenuItem` to add.\n   *\n   */\n\n\n  Menu.prototype.addItem = function addItem(component) {\n    this.addChild(component);\n    component.on('click', bind(this, function (event) {\n      // Unpress the associated MenuButton, and move focus back to it\n      if (this.menuButton_) {\n        this.menuButton_.unpressButton();\n\n        // don't focus menu button if item is a caption settings item\n        // because focus will move elsewhere and it logs an error on IE8\n        if (component.name() !== 'CaptionSettingsMenuItem') {\n          this.menuButton_.focus();\n        }\n      }\n    }));\n  };\n\n  /**\n   * Create the `Menu`s DOM element.\n   *\n   * @return {Element}\n   *         the element that was created\n   */\n\n\n  Menu.prototype.createEl = function createEl$$1() {\n    var contentElType = this.options_.contentElType || 'ul';\n\n    this.contentEl_ = createEl(contentElType, {\n      className: 'vjs-menu-content'\n    });\n\n    this.contentEl_.setAttribute('role', 'menu');\n\n    var el = _Component.prototype.createEl.call(this, 'div', {\n      append: this.contentEl_,\n      className: 'vjs-menu'\n    });\n\n    el.appendChild(this.contentEl_);\n\n    // Prevent clicks from bubbling up. Needed for Menu Buttons,\n    // where a click on the parent is significant\n    on(el, 'click', function (event) {\n      event.preventDefault();\n      event.stopImmediatePropagation();\n    });\n\n    return el;\n  };\n\n  Menu.prototype.dispose = function dispose() {\n    this.contentEl_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Handle a `keydown` event on this menu. This listener is added in the constructor.\n   *\n   * @param {EventTarget~Event} event\n   *        A `keydown` event that happened on the menu.\n   *\n   * @listens keydown\n   */\n\n\n  Menu.prototype.handleKeyPress = function handleKeyPress(event) {\n    // Left and Down Arrows\n    if (event.which === 37 || event.which === 40) {\n      event.preventDefault();\n      this.stepForward();\n\n      // Up and Right Arrows\n    } else if (event.which === 38 || event.which === 39) {\n      event.preventDefault();\n      this.stepBack();\n    }\n  };\n\n  /**\n   * Move to next (lower) menu item for keyboard users.\n   */\n\n\n  Menu.prototype.stepForward = function stepForward() {\n    var stepChild = 0;\n\n    if (this.focusedChild_ !== undefined) {\n      stepChild = this.focusedChild_ + 1;\n    }\n    this.focus(stepChild);\n  };\n\n  /**\n   * Move to previous (higher) menu item for keyboard users.\n   */\n\n\n  Menu.prototype.stepBack = function stepBack() {\n    var stepChild = 0;\n\n    if (this.focusedChild_ !== undefined) {\n      stepChild = this.focusedChild_ - 1;\n    }\n    this.focus(stepChild);\n  };\n\n  /**\n   * Set focus on a {@link MenuItem} in the `Menu`.\n   *\n   * @param {Object|string} [item=0]\n   *        Index of child item set focus on.\n   */\n\n\n  Menu.prototype.focus = function focus() {\n    var item = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n    var children = this.children().slice();\n    var haveTitle = children.length && children[0].className && /vjs-menu-title/.test(children[0].className);\n\n    if (haveTitle) {\n      children.shift();\n    }\n\n    if (children.length > 0) {\n      if (item < 0) {\n        item = 0;\n      } else if (item >= children.length) {\n        item = children.length - 1;\n      }\n\n      this.focusedChild_ = item;\n\n      children[item].el_.focus();\n    }\n  };\n\n  return Menu;\n}(Component);\n\nComponent.registerComponent('Menu', Menu);\n\n/**\n * @file menu-button.js\n */\n/**\n * A `MenuButton` class for any popup {@link Menu}.\n *\n * @extends Component\n */\n\nvar MenuButton = function (_Component) {\n  inherits(MenuButton, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function MenuButton(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, MenuButton);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.menuButton_ = new Button(player, options);\n\n    _this.menuButton_.controlText(_this.controlText_);\n    _this.menuButton_.el_.setAttribute('aria-haspopup', 'true');\n\n    // Add buildCSSClass values to the button, not the wrapper\n    var buttonClass = Button.prototype.buildCSSClass();\n\n    _this.menuButton_.el_.className = _this.buildCSSClass() + ' ' + buttonClass;\n    _this.menuButton_.removeClass('vjs-control');\n\n    _this.addChild(_this.menuButton_);\n\n    _this.update();\n\n    _this.enabled_ = true;\n\n    _this.on(_this.menuButton_, 'tap', _this.handleClick);\n    _this.on(_this.menuButton_, 'click', _this.handleClick);\n    _this.on(_this.menuButton_, 'focus', _this.handleFocus);\n    _this.on(_this.menuButton_, 'blur', _this.handleBlur);\n\n    _this.on('keydown', _this.handleSubmenuKeyPress);\n    return _this;\n  }\n\n  /**\n   * Update the menu based on the current state of its items.\n   */\n\n\n  MenuButton.prototype.update = function update() {\n    var menu = this.createMenu();\n\n    if (this.menu) {\n      this.menu.dispose();\n      this.removeChild(this.menu);\n    }\n\n    this.menu = menu;\n    this.addChild(menu);\n\n    /**\n     * Track the state of the menu button\n     *\n     * @type {Boolean}\n     * @private\n     */\n    this.buttonPressed_ = false;\n    this.menuButton_.el_.setAttribute('aria-expanded', 'false');\n\n    if (this.items && this.items.length <= this.hideThreshold_) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  };\n\n  /**\n   * Create the menu and add all items to it.\n   *\n   * @return {Menu}\n   *         The constructed menu\n   */\n\n\n  MenuButton.prototype.createMenu = function createMenu() {\n    var menu = new Menu(this.player_, { menuButton: this });\n\n    /**\n     * Hide the menu if the number of items is less than or equal to this threshold. This defaults\n     * to 0 and whenever we add items which can be hidden to the menu we'll increment it. We list\n     * it here because every time we run `createMenu` we need to reset the value.\n     *\n     * @protected\n     * @type {Number}\n     */\n    this.hideThreshold_ = 0;\n\n    // Add a title list item to the top\n    if (this.options_.title) {\n      var title = createEl('li', {\n        className: 'vjs-menu-title',\n        innerHTML: toTitleCase(this.options_.title),\n        tabIndex: -1\n      });\n\n      this.hideThreshold_ += 1;\n\n      menu.children_.unshift(title);\n      prependTo(title, menu.contentEl());\n    }\n\n    this.items = this.createItems();\n\n    if (this.items) {\n      // Add menu items to the menu\n      for (var i = 0; i < this.items.length; i++) {\n        menu.addItem(this.items[i]);\n      }\n    }\n\n    return menu;\n  };\n\n  /**\n   * Create the list of menu items. Specific to each subclass.\n   *\n   * @abstract\n   */\n\n\n  MenuButton.prototype.createItems = function createItems() {};\n\n  /**\n   * Create the `MenuButtons`s DOM element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  MenuButton.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: this.buildWrapperCSSClass()\n    }, {});\n  };\n\n  /**\n   * Allow sub components to stack CSS class names for the wrapper element\n   *\n   * @return {string}\n   *         The constructed wrapper DOM `className`\n   */\n\n\n  MenuButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    var menuButtonClass = 'vjs-menu-button';\n\n    // If the inline option is passed, we want to use different styles altogether.\n    if (this.options_.inline === true) {\n      menuButtonClass += '-inline';\n    } else {\n      menuButtonClass += '-popup';\n    }\n\n    // TODO: Fix the CSS so that this isn't necessary\n    var buttonClass = Button.prototype.buildCSSClass();\n\n    return 'vjs-menu-button ' + menuButtonClass + ' ' + buttonClass + ' ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  MenuButton.prototype.buildCSSClass = function buildCSSClass() {\n    var menuButtonClass = 'vjs-menu-button';\n\n    // If the inline option is passed, we want to use different styles altogether.\n    if (this.options_.inline === true) {\n      menuButtonClass += '-inline';\n    } else {\n      menuButtonClass += '-popup';\n    }\n\n    return 'vjs-menu-button ' + menuButtonClass + ' ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Get or set the localized control text that will be used for accessibility.\n   *\n   * > NOTE: This will come from the internal `menuButton_` element.\n   *\n   * @param {string} [text]\n   *        Control text for element.\n   *\n   * @param {Element} [el=this.menuButton_.el()]\n   *        Element to set the title on.\n   *\n   * @return {string}\n   *         - The control text when getting\n   */\n\n\n  MenuButton.prototype.controlText = function controlText(text) {\n    var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.menuButton_.el();\n\n    return this.menuButton_.controlText(text, el);\n  };\n\n  /**\n   * Handle a click on a `MenuButton`.\n   * See {@link ClickableComponent#handleClick} for instances where this is called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  MenuButton.prototype.handleClick = function handleClick(event) {\n    // When you click the button it adds focus, which will show the menu.\n    // So we'll remove focus when the mouse leaves the button. Focus is needed\n    // for tab navigation.\n\n    this.one(this.menu.contentEl(), 'mouseleave', bind(this, function (e) {\n      this.unpressButton();\n      this.el_.blur();\n    }));\n    if (this.buttonPressed_) {\n      this.unpressButton();\n    } else {\n      this.pressButton();\n    }\n  };\n\n  /**\n   * Set the focus to the actual button, not to this element\n   */\n\n\n  MenuButton.prototype.focus = function focus() {\n    this.menuButton_.focus();\n  };\n\n  /**\n   * Remove the focus from the actual button, not this element\n   */\n\n\n  MenuButton.prototype.blur = function blur() {\n    this.menuButton_.blur();\n  };\n\n  /**\n   * This gets called when a `MenuButton` gains focus via a `focus` event.\n   * Turns on listening for `keydown` events. When they happen it\n   * calls `this.handleKeyPress`.\n   *\n   * @param {EventTarget~Event} event\n   *        The `focus` event that caused this function to be called.\n   *\n   * @listens focus\n   */\n\n\n  MenuButton.prototype.handleFocus = function handleFocus() {\n    on(document, 'keydown', bind(this, this.handleKeyPress));\n  };\n\n  /**\n   * Called when a `MenuButton` loses focus. Turns off the listener for\n   * `keydown` events. Which Stops `this.handleKeyPress` from getting called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `blur` event that caused this function to be called.\n   *\n   * @listens blur\n   */\n\n\n  MenuButton.prototype.handleBlur = function handleBlur() {\n    off(document, 'keydown', bind(this, this.handleKeyPress));\n  };\n\n  /**\n   * Handle tab, escape, down arrow, and up arrow keys for `MenuButton`. See\n   * {@link ClickableComponent#handleKeyPress} for instances where this is called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown` event that caused this function to be called.\n   *\n   * @listens keydown\n   */\n\n\n  MenuButton.prototype.handleKeyPress = function handleKeyPress(event) {\n\n    // Escape (27) key or Tab (9) key unpress the 'button'\n    if (event.which === 27 || event.which === 9) {\n      if (this.buttonPressed_) {\n        this.unpressButton();\n      }\n      // Don't preventDefault for Tab key - we still want to lose focus\n      if (event.which !== 9) {\n        event.preventDefault();\n        // Set focus back to the menu button's button\n        this.menuButton_.el_.focus();\n      }\n      // Up (38) key or Down (40) key press the 'button'\n    } else if (event.which === 38 || event.which === 40) {\n      if (!this.buttonPressed_) {\n        this.pressButton();\n        event.preventDefault();\n      }\n    }\n  };\n\n  /**\n   * Handle a `keydown` event on a sub-menu. The listener for this is added in\n   * the constructor.\n   *\n   * @param {EventTarget~Event} event\n   *        Key press event\n   *\n   * @listens keydown\n   */\n\n\n  MenuButton.prototype.handleSubmenuKeyPress = function handleSubmenuKeyPress(event) {\n\n    // Escape (27) key or Tab (9) key unpress the 'button'\n    if (event.which === 27 || event.which === 9) {\n      if (this.buttonPressed_) {\n        this.unpressButton();\n      }\n      // Don't preventDefault for Tab key - we still want to lose focus\n      if (event.which !== 9) {\n        event.preventDefault();\n        // Set focus back to the menu button's button\n        this.menuButton_.el_.focus();\n      }\n    }\n  };\n\n  /**\n   * Put the current `MenuButton` into a pressed state.\n   */\n\n\n  MenuButton.prototype.pressButton = function pressButton() {\n    if (this.enabled_) {\n      this.buttonPressed_ = true;\n      this.menu.lockShowing();\n      this.menuButton_.el_.setAttribute('aria-expanded', 'true');\n\n      // set the focus into the submenu, except on iOS where it is resulting in\n      // undesired scrolling behavior when the player is in an iframe\n      if (IS_IOS && isInFrame()) {\n        // Return early so that the menu isn't focused\n        return;\n      }\n\n      this.menu.focus();\n    }\n  };\n\n  /**\n   * Take the current `MenuButton` out of a pressed state.\n   */\n\n\n  MenuButton.prototype.unpressButton = function unpressButton() {\n    if (this.enabled_) {\n      this.buttonPressed_ = false;\n      this.menu.unlockShowing();\n      this.menuButton_.el_.setAttribute('aria-expanded', 'false');\n    }\n  };\n\n  /**\n   * Disable the `MenuButton`. Don't allow it to be clicked.\n   */\n\n\n  MenuButton.prototype.disable = function disable() {\n    this.unpressButton();\n\n    this.enabled_ = false;\n    this.addClass('vjs-disabled');\n\n    this.menuButton_.disable();\n  };\n\n  /**\n   * Enable the `MenuButton`. Allow it to be clicked.\n   */\n\n\n  MenuButton.prototype.enable = function enable() {\n    this.enabled_ = true;\n    this.removeClass('vjs-disabled');\n\n    this.menuButton_.enable();\n  };\n\n  return MenuButton;\n}(Component);\n\nComponent.registerComponent('MenuButton', MenuButton);\n\n/**\n * @file track-button.js\n */\n/**\n * The base class for buttons that toggle specific  track types (e.g. subtitles).\n *\n * @extends MenuButton\n */\n\nvar TrackButton = function (_MenuButton) {\n  inherits(TrackButton, _MenuButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function TrackButton(player, options) {\n    classCallCheck(this, TrackButton);\n\n    var tracks = options.tracks;\n\n    var _this = possibleConstructorReturn(this, _MenuButton.call(this, player, options));\n\n    if (_this.items.length <= 1) {\n      _this.hide();\n    }\n\n    if (!tracks) {\n      return possibleConstructorReturn(_this);\n    }\n\n    var updateHandler = bind(_this, _this.update);\n\n    tracks.addEventListener('removetrack', updateHandler);\n    tracks.addEventListener('addtrack', updateHandler);\n    _this.player_.on('ready', updateHandler);\n\n    _this.player_.on('dispose', function () {\n      tracks.removeEventListener('removetrack', updateHandler);\n      tracks.removeEventListener('addtrack', updateHandler);\n    });\n    return _this;\n  }\n\n  return TrackButton;\n}(MenuButton);\n\nComponent.registerComponent('TrackButton', TrackButton);\n\n/**\n * @file menu-item.js\n */\n/**\n * The component for a menu item. `<li>`\n *\n * @extends ClickableComponent\n */\n\nvar MenuItem = function (_ClickableComponent) {\n  inherits(MenuItem, _ClickableComponent);\n\n  /**\n   * Creates an instance of the this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   *\n   */\n  function MenuItem(player, options) {\n    classCallCheck(this, MenuItem);\n\n    var _this = possibleConstructorReturn(this, _ClickableComponent.call(this, player, options));\n\n    _this.selectable = options.selectable;\n    _this.isSelected_ = options.selected || false;\n    _this.multiSelectable = options.multiSelectable;\n\n    _this.selected(_this.isSelected_);\n\n    if (_this.selectable) {\n      if (_this.multiSelectable) {\n        _this.el_.setAttribute('role', 'menuitemcheckbox');\n      } else {\n        _this.el_.setAttribute('role', 'menuitemradio');\n      }\n    } else {\n      _this.el_.setAttribute('role', 'menuitem');\n    }\n    return _this;\n  }\n\n  /**\n   * Create the `MenuItem's DOM element\n   *\n   * @param {string} [type=li]\n   *        Element's node type, not actually used, always set to `li`.\n   *\n   * @param {Object} [props={}]\n   *        An object of properties that should be set on the element\n   *\n   * @param {Object} [attrs={}]\n   *        An object of attributes that should be set on the element\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  MenuItem.prototype.createEl = function createEl(type, props, attrs) {\n    // The control is textual, not just an icon\n    this.nonIconControl = true;\n\n    return _ClickableComponent.prototype.createEl.call(this, 'li', assign({\n      className: 'vjs-menu-item',\n      innerHTML: '<span class=\"vjs-menu-item-text\">' + this.localize(this.options_.label) + '</span>',\n      tabIndex: -1\n    }, props), attrs);\n  };\n\n  /**\n   * Any click on a `MenuItem` puts it into the selected state.\n   * See {@link ClickableComponent#handleClick} for instances where this is called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  MenuItem.prototype.handleClick = function handleClick(event) {\n    this.selected(true);\n  };\n\n  /**\n   * Set the state for this menu item as selected or not.\n   *\n   * @param {boolean} selected\n   *        if the menu item is selected or not\n   */\n\n\n  MenuItem.prototype.selected = function selected(_selected) {\n    if (this.selectable) {\n      if (_selected) {\n        this.addClass('vjs-selected');\n        this.el_.setAttribute('aria-checked', 'true');\n        // aria-checked isn't fully supported by browsers/screen readers,\n        // so indicate selected state to screen reader in the control text.\n        this.controlText(', selected');\n        this.isSelected_ = true;\n      } else {\n        this.removeClass('vjs-selected');\n        this.el_.setAttribute('aria-checked', 'false');\n        // Indicate un-selected state to screen reader\n        this.controlText('');\n        this.isSelected_ = false;\n      }\n    }\n  };\n\n  return MenuItem;\n}(ClickableComponent);\n\nComponent.registerComponent('MenuItem', MenuItem);\n\n/**\n * @file text-track-menu-item.js\n */\n/**\n * The specific menu item type for selecting a language within a text track kind\n *\n * @extends MenuItem\n */\n\nvar TextTrackMenuItem = function (_MenuItem) {\n  inherits(TextTrackMenuItem, _MenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function TextTrackMenuItem(player, options) {\n    classCallCheck(this, TextTrackMenuItem);\n\n    var track = options.track;\n    var tracks = player.textTracks();\n\n    // Modify options for parent MenuItem class's init.\n    options.label = track.label || track.language || 'Unknown';\n    options.selected = track.mode === 'showing';\n\n    var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n    _this.track = track;\n    var changeHandler = function changeHandler() {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      _this.handleTracksChange.apply(_this, args);\n    };\n    var selectedLanguageChangeHandler = function selectedLanguageChangeHandler() {\n      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      _this.handleSelectedLanguageChange.apply(_this, args);\n    };\n\n    player.on(['loadstart', 'texttrackchange'], changeHandler);\n    tracks.addEventListener('change', changeHandler);\n    tracks.addEventListener('selectedlanguagechange', selectedLanguageChangeHandler);\n    _this.on('dispose', function () {\n      player.off(['loadstart', 'texttrackchange'], changeHandler);\n      tracks.removeEventListener('change', changeHandler);\n      tracks.removeEventListener('selectedlanguagechange', selectedLanguageChangeHandler);\n    });\n\n    // iOS7 doesn't dispatch change events to TextTrackLists when an\n    // associated track's mode changes. Without something like\n    // Object.observe() (also not present on iOS7), it's not\n    // possible to detect changes to the mode attribute and polyfill\n    // the change event. As a poor substitute, we manually dispatch\n    // change events whenever the controls modify the mode.\n    if (tracks.onchange === undefined) {\n      var event = void 0;\n\n      _this.on(['tap', 'click'], function () {\n        if (_typeof(window.Event) !== 'object') {\n          // Android 2.3 throws an Illegal Constructor error for window.Event\n          try {\n            event = new window.Event('change');\n          } catch (err) {\n            // continue regardless of error\n          }\n        }\n\n        if (!event) {\n          event = document.createEvent('Event');\n          event.initEvent('change', true, true);\n        }\n\n        tracks.dispatchEvent(event);\n      });\n    }\n\n    // set the default state based on current tracks\n    _this.handleTracksChange();\n    return _this;\n  }\n\n  /**\n   * This gets called when an `TextTrackMenuItem` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  TextTrackMenuItem.prototype.handleClick = function handleClick(event) {\n    var kind = this.track.kind;\n    var kinds = this.track.kinds;\n    var tracks = this.player_.textTracks();\n\n    if (!kinds) {\n      kinds = [kind];\n    }\n\n    _MenuItem.prototype.handleClick.call(this, event);\n\n    if (!tracks) {\n      return;\n    }\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      if (track === this.track && kinds.indexOf(track.kind) > -1) {\n        if (track.mode !== 'showing') {\n          track.mode = 'showing';\n        }\n      } else if (track.mode !== 'disabled') {\n        track.mode = 'disabled';\n      }\n    }\n  };\n\n  /**\n   * Handle text track list change\n   *\n   * @param {EventTarget~Event} event\n   *        The `change` event that caused this function to be called.\n   *\n   * @listens TextTrackList#change\n   */\n\n\n  TextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {\n    var shouldBeSelected = this.track.mode === 'showing';\n\n    // Prevent redundant selected() calls because they may cause\n    // screen readers to read the appended control text unnecessarily\n    if (shouldBeSelected !== this.isSelected_) {\n      this.selected(shouldBeSelected);\n    }\n  };\n\n  TextTrackMenuItem.prototype.handleSelectedLanguageChange = function handleSelectedLanguageChange(event) {\n    if (this.track.mode === 'showing') {\n      var selectedLanguage = this.player_.cache_.selectedLanguage;\n\n      // Don't replace the kind of track across the same language\n      if (selectedLanguage && selectedLanguage.enabled && selectedLanguage.language === this.track.language && selectedLanguage.kind !== this.track.kind) {\n        return;\n      }\n\n      this.player_.cache_.selectedLanguage = {\n        enabled: true,\n        language: this.track.language,\n        kind: this.track.kind\n      };\n    }\n  };\n\n  TextTrackMenuItem.prototype.dispose = function dispose() {\n    // remove reference to track object on dispose\n    this.track = null;\n\n    _MenuItem.prototype.dispose.call(this);\n  };\n\n  return TextTrackMenuItem;\n}(MenuItem);\n\nComponent.registerComponent('TextTrackMenuItem', TextTrackMenuItem);\n\n/**\n * @file off-text-track-menu-item.js\n */\n/**\n * A special menu item for turning of a specific type of text track\n *\n * @extends TextTrackMenuItem\n */\n\nvar OffTextTrackMenuItem = function (_TextTrackMenuItem) {\n  inherits(OffTextTrackMenuItem, _TextTrackMenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function OffTextTrackMenuItem(player, options) {\n    classCallCheck(this, OffTextTrackMenuItem);\n\n    // Create pseudo track info\n    // Requires options['kind']\n    options.track = {\n      player: player,\n      kind: options.kind,\n      kinds: options.kinds,\n      'default': false,\n      mode: 'disabled'\n    };\n\n    if (!options.kinds) {\n      options.kinds = [options.kind];\n    }\n\n    if (options.label) {\n      options.track.label = options.label;\n    } else {\n      options.track.label = options.kinds.join(' and ') + ' off';\n    }\n\n    // MenuItem is selectable\n    options.selectable = true;\n    // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n    options.multiSelectable = false;\n\n    return possibleConstructorReturn(this, _TextTrackMenuItem.call(this, player, options));\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to run\n   */\n\n\n  OffTextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {\n    var tracks = this.player().textTracks();\n    var shouldBeSelected = true;\n\n    for (var i = 0, l = tracks.length; i < l; i++) {\n      var track = tracks[i];\n\n      if (this.options_.kinds.indexOf(track.kind) > -1 && track.mode === 'showing') {\n        shouldBeSelected = false;\n        break;\n      }\n    }\n\n    // Prevent redundant selected() calls because they may cause\n    // screen readers to read the appended control text unnecessarily\n    if (shouldBeSelected !== this.isSelected_) {\n      this.selected(shouldBeSelected);\n    }\n  };\n\n  OffTextTrackMenuItem.prototype.handleSelectedLanguageChange = function handleSelectedLanguageChange(event) {\n    var tracks = this.player().textTracks();\n    var allHidden = true;\n\n    for (var i = 0, l = tracks.length; i < l; i++) {\n      var track = tracks[i];\n\n      if (['captions', 'descriptions', 'subtitles'].indexOf(track.kind) > -1 && track.mode === 'showing') {\n        allHidden = false;\n        break;\n      }\n    }\n\n    if (allHidden) {\n      this.player_.cache_.selectedLanguage = {\n        enabled: false\n      };\n    }\n  };\n\n  return OffTextTrackMenuItem;\n}(TextTrackMenuItem);\n\nComponent.registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);\n\n/**\n * @file text-track-button.js\n */\n/**\n * The base class for buttons that toggle specific text track types (e.g. subtitles)\n *\n * @extends MenuButton\n */\n\nvar TextTrackButton = function (_TrackButton) {\n  inherits(TextTrackButton, _TrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function TextTrackButton(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, TextTrackButton);\n\n    options.tracks = player.textTracks();\n\n    return possibleConstructorReturn(this, _TrackButton.call(this, player, options));\n  }\n\n  /**\n   * Create a menu item for each text track\n   *\n   * @param {TextTrackMenuItem[]} [items=[]]\n   *        Existing array of items to use during creation\n   *\n   * @return {TextTrackMenuItem[]}\n   *         Array of menu items that were created\n   */\n\n\n  TextTrackButton.prototype.createItems = function createItems() {\n    var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    var TrackMenuItem = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : TextTrackMenuItem;\n\n\n    // Label is an overide for the [track] off label\n    // USed to localise captions/subtitles\n    var label = void 0;\n\n    if (this.label_) {\n      label = this.label_ + ' off';\n    }\n    // Add an OFF menu item to turn all tracks off\n    items.push(new OffTextTrackMenuItem(this.player_, {\n      kinds: this.kinds_,\n      kind: this.kind_,\n      label: label\n    }));\n\n    this.hideThreshold_ += 1;\n\n    var tracks = this.player_.textTracks();\n\n    if (!Array.isArray(this.kinds_)) {\n      this.kinds_ = [this.kind_];\n    }\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      // only add tracks that are of an appropriate kind and have a label\n      if (this.kinds_.indexOf(track.kind) > -1) {\n\n        var item = new TrackMenuItem(this.player_, {\n          track: track,\n          // MenuItem is selectable\n          selectable: true,\n          // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n          multiSelectable: false\n        });\n\n        item.addClass('vjs-' + track.kind + '-menu-item');\n        items.push(item);\n      }\n    }\n\n    return items;\n  };\n\n  return TextTrackButton;\n}(TrackButton);\n\nComponent.registerComponent('TextTrackButton', TextTrackButton);\n\n/**\n * @file chapters-track-menu-item.js\n */\n/**\n * The chapter track menu item\n *\n * @extends MenuItem\n */\n\nvar ChaptersTrackMenuItem = function (_MenuItem) {\n  inherits(ChaptersTrackMenuItem, _MenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function ChaptersTrackMenuItem(player, options) {\n    classCallCheck(this, ChaptersTrackMenuItem);\n\n    var track = options.track;\n    var cue = options.cue;\n    var currentTime = player.currentTime();\n\n    // Modify options for parent MenuItem class's init.\n    options.selectable = true;\n    options.multiSelectable = false;\n    options.label = cue.text;\n    options.selected = cue.startTime <= currentTime && currentTime < cue.endTime;\n\n    var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n    _this.track = track;\n    _this.cue = cue;\n    track.addEventListener('cuechange', bind(_this, _this.update));\n    return _this;\n  }\n\n  /**\n   * This gets called when an `ChaptersTrackMenuItem` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  ChaptersTrackMenuItem.prototype.handleClick = function handleClick(event) {\n    _MenuItem.prototype.handleClick.call(this);\n    this.player_.currentTime(this.cue.startTime);\n    this.update(this.cue.startTime);\n  };\n\n  /**\n   * Update chapter menu item\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `cuechange` event that caused this function to run.\n   *\n   * @listens TextTrack#cuechange\n   */\n\n\n  ChaptersTrackMenuItem.prototype.update = function update(event) {\n    var cue = this.cue;\n    var currentTime = this.player_.currentTime();\n\n    // vjs.log(currentTime, cue.startTime);\n    this.selected(cue.startTime <= currentTime && currentTime < cue.endTime);\n  };\n\n  return ChaptersTrackMenuItem;\n}(MenuItem);\n\nComponent.registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);\n\n/**\n * @file chapters-button.js\n */\n/**\n * The button component for toggling and selecting chapters\n * Chapters act much differently than other text tracks\n * Cues are navigation vs. other tracks of alternative languages\n *\n * @extends TextTrackButton\n */\n\nvar ChaptersButton = function (_TextTrackButton) {\n  inherits(ChaptersButton, _TextTrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when this function is ready.\n   */\n  function ChaptersButton(player, options, ready) {\n    classCallCheck(this, ChaptersButton);\n    return possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  ChaptersButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  ChaptersButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Update the menu based on the current state of its items.\n   *\n   * @param {EventTarget~Event} [event]\n   *        An event that triggered this function to run.\n   *\n   * @listens TextTrackList#addtrack\n   * @listens TextTrackList#removetrack\n   * @listens TextTrackList#change\n   */\n\n\n  ChaptersButton.prototype.update = function update(event) {\n    if (!this.track_ || event && (event.type === 'addtrack' || event.type === 'removetrack')) {\n      this.setTrack(this.findChaptersTrack());\n    }\n    _TextTrackButton.prototype.update.call(this);\n  };\n\n  /**\n   * Set the currently selected track for the chapters button.\n   *\n   * @param {TextTrack} track\n   *        The new track to select. Nothing will change if this is the currently selected\n   *        track.\n   */\n\n\n  ChaptersButton.prototype.setTrack = function setTrack(track) {\n    if (this.track_ === track) {\n      return;\n    }\n\n    if (!this.updateHandler_) {\n      this.updateHandler_ = this.update.bind(this);\n    }\n\n    // here this.track_ refers to the old track instance\n    if (this.track_) {\n      var remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);\n\n      if (remoteTextTrackEl) {\n        remoteTextTrackEl.removeEventListener('load', this.updateHandler_);\n      }\n\n      this.track_ = null;\n    }\n\n    this.track_ = track;\n\n    // here this.track_ refers to the new track instance\n    if (this.track_) {\n      this.track_.mode = 'hidden';\n\n      var _remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);\n\n      if (_remoteTextTrackEl) {\n        _remoteTextTrackEl.addEventListener('load', this.updateHandler_);\n      }\n    }\n  };\n\n  /**\n   * Find the track object that is currently in use by this ChaptersButton\n   *\n   * @return {TextTrack|undefined}\n   *         The current track or undefined if none was found.\n   */\n\n\n  ChaptersButton.prototype.findChaptersTrack = function findChaptersTrack() {\n    var tracks = this.player_.textTracks() || [];\n\n    for (var i = tracks.length - 1; i >= 0; i--) {\n      // We will always choose the last track as our chaptersTrack\n      var track = tracks[i];\n\n      if (track.kind === this.kind_) {\n        return track;\n      }\n    }\n  };\n\n  /**\n   * Get the caption for the ChaptersButton based on the track label. This will also\n   * use the current tracks localized kind as a fallback if a label does not exist.\n   *\n   * @return {string}\n   *         The tracks current label or the localized track kind.\n   */\n\n\n  ChaptersButton.prototype.getMenuCaption = function getMenuCaption() {\n    if (this.track_ && this.track_.label) {\n      return this.track_.label;\n    }\n    return this.localize(toTitleCase(this.kind_));\n  };\n\n  /**\n   * Create menu from chapter track\n   *\n   * @return {Menu}\n   *         New menu for the chapter buttons\n   */\n\n\n  ChaptersButton.prototype.createMenu = function createMenu() {\n    this.options_.title = this.getMenuCaption();\n    return _TextTrackButton.prototype.createMenu.call(this);\n  };\n\n  /**\n   * Create a menu item for each text track\n   *\n   * @return {TextTrackMenuItem[]}\n   *         Array of menu items\n   */\n\n\n  ChaptersButton.prototype.createItems = function createItems() {\n    var items = [];\n\n    if (!this.track_) {\n      return items;\n    }\n\n    var cues = this.track_.cues;\n\n    if (!cues) {\n      return items;\n    }\n\n    for (var i = 0, l = cues.length; i < l; i++) {\n      var cue = cues[i];\n      var mi = new ChaptersTrackMenuItem(this.player_, { track: this.track_, cue: cue });\n\n      items.push(mi);\n    }\n\n    return items;\n  };\n\n  return ChaptersButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nChaptersButton.prototype.kind_ = 'chapters';\n\n/**\n * The text that should display over the `ChaptersButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nChaptersButton.prototype.controlText_ = 'Chapters';\n\nComponent.registerComponent('ChaptersButton', ChaptersButton);\n\n/**\n * @file descriptions-button.js\n */\n/**\n * The button component for toggling and selecting descriptions\n *\n * @extends TextTrackButton\n */\n\nvar DescriptionsButton = function (_TextTrackButton) {\n  inherits(DescriptionsButton, _TextTrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when this component is ready.\n   */\n  function DescriptionsButton(player, options, ready) {\n    classCallCheck(this, DescriptionsButton);\n\n    var _this = possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n\n    var tracks = player.textTracks();\n    var changeHandler = bind(_this, _this.handleTracksChange);\n\n    tracks.addEventListener('change', changeHandler);\n    _this.on('dispose', function () {\n      tracks.removeEventListener('change', changeHandler);\n    });\n    return _this;\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to run\n   *\n   * @listens TextTrackList#change\n   */\n\n\n  DescriptionsButton.prototype.handleTracksChange = function handleTracksChange(event) {\n    var tracks = this.player().textTracks();\n    var disabled = false;\n\n    // Check whether a track of a different kind is showing\n    for (var i = 0, l = tracks.length; i < l; i++) {\n      var track = tracks[i];\n\n      if (track.kind !== this.kind_ && track.mode === 'showing') {\n        disabled = true;\n        break;\n      }\n    }\n\n    // If another track is showing, disable this menu button\n    if (disabled) {\n      this.disable();\n    } else {\n      this.enable();\n    }\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  DescriptionsButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-descriptions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  DescriptionsButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-descriptions-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  return DescriptionsButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nDescriptionsButton.prototype.kind_ = 'descriptions';\n\n/**\n * The text that should display over the `DescriptionsButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nDescriptionsButton.prototype.controlText_ = 'Descriptions';\n\nComponent.registerComponent('DescriptionsButton', DescriptionsButton);\n\n/**\n * @file subtitles-button.js\n */\n/**\n * The button component for toggling and selecting subtitles\n *\n * @extends TextTrackButton\n */\n\nvar SubtitlesButton = function (_TextTrackButton) {\n  inherits(SubtitlesButton, _TextTrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when this component is ready.\n   */\n  function SubtitlesButton(player, options, ready) {\n    classCallCheck(this, SubtitlesButton);\n    return possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  SubtitlesButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  SubtitlesButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  return SubtitlesButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nSubtitlesButton.prototype.kind_ = 'subtitles';\n\n/**\n * The text that should display over the `SubtitlesButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nSubtitlesButton.prototype.controlText_ = 'Subtitles';\n\nComponent.registerComponent('SubtitlesButton', SubtitlesButton);\n\n/**\n * @file caption-settings-menu-item.js\n */\n/**\n * The menu item for caption track settings menu\n *\n * @extends TextTrackMenuItem\n */\n\nvar CaptionSettingsMenuItem = function (_TextTrackMenuItem) {\n  inherits(CaptionSettingsMenuItem, _TextTrackMenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function CaptionSettingsMenuItem(player, options) {\n    classCallCheck(this, CaptionSettingsMenuItem);\n\n    options.track = {\n      player: player,\n      kind: options.kind,\n      label: options.kind + ' settings',\n      selectable: false,\n      'default': false,\n      mode: 'disabled'\n    };\n\n    // CaptionSettingsMenuItem has no concept of 'selected'\n    options.selectable = false;\n\n    options.name = 'CaptionSettingsMenuItem';\n\n    var _this = possibleConstructorReturn(this, _TextTrackMenuItem.call(this, player, options));\n\n    _this.addClass('vjs-texttrack-settings');\n    _this.controlText(', opens ' + options.kind + ' settings dialog');\n    return _this;\n  }\n\n  /**\n   * This gets called when an `CaptionSettingsMenuItem` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  CaptionSettingsMenuItem.prototype.handleClick = function handleClick(event) {\n    this.player().getChild('textTrackSettings').open();\n  };\n\n  return CaptionSettingsMenuItem;\n}(TextTrackMenuItem);\n\nComponent.registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);\n\n/**\n * @file captions-button.js\n */\n/**\n * The button component for toggling and selecting captions\n *\n * @extends TextTrackButton\n */\n\nvar CaptionsButton = function (_TextTrackButton) {\n  inherits(CaptionsButton, _TextTrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when this component is ready.\n   */\n  function CaptionsButton(player, options, ready) {\n    classCallCheck(this, CaptionsButton);\n    return possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  CaptionsButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-captions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  CaptionsButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-captions-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Create caption menu items\n   *\n   * @return {CaptionSettingsMenuItem[]}\n   *         The array of current menu items.\n   */\n\n\n  CaptionsButton.prototype.createItems = function createItems() {\n    var items = [];\n\n    if (!(this.player().tech_ && this.player().tech_.featuresNativeTextTracks) && this.player().getChild('textTrackSettings')) {\n      items.push(new CaptionSettingsMenuItem(this.player_, { kind: this.kind_ }));\n\n      this.hideThreshold_ += 1;\n    }\n\n    return _TextTrackButton.prototype.createItems.call(this, items);\n  };\n\n  return CaptionsButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nCaptionsButton.prototype.kind_ = 'captions';\n\n/**\n * The text that should display over the `CaptionsButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nCaptionsButton.prototype.controlText_ = 'Captions';\n\nComponent.registerComponent('CaptionsButton', CaptionsButton);\n\n/**\n * @file subs-caps-menu-item.js\n */\n/**\n * SubsCapsMenuItem has an [cc] icon to distinguish captions from subtitles\n * in the SubsCapsMenu.\n *\n * @extends TextTrackMenuItem\n */\n\nvar SubsCapsMenuItem = function (_TextTrackMenuItem) {\n  inherits(SubsCapsMenuItem, _TextTrackMenuItem);\n\n  function SubsCapsMenuItem() {\n    classCallCheck(this, SubsCapsMenuItem);\n    return possibleConstructorReturn(this, _TextTrackMenuItem.apply(this, arguments));\n  }\n\n  SubsCapsMenuItem.prototype.createEl = function createEl(type, props, attrs) {\n    var innerHTML = '<span class=\"vjs-menu-item-text\">' + this.localize(this.options_.label);\n\n    if (this.options_.track.kind === 'captions') {\n      innerHTML += '\\n        <span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>\\n        <span class=\"vjs-control-text\"> ' + this.localize('Captions') + '</span>\\n      ';\n    }\n\n    innerHTML += '</span>';\n\n    var el = _TextTrackMenuItem.prototype.createEl.call(this, type, assign({\n      innerHTML: innerHTML\n    }, props), attrs);\n\n    return el;\n  };\n\n  return SubsCapsMenuItem;\n}(TextTrackMenuItem);\n\nComponent.registerComponent('SubsCapsMenuItem', SubsCapsMenuItem);\n\n/**\n * @file sub-caps-button.js\n */\n/**\n * The button component for toggling and selecting captions and/or subtitles\n *\n * @extends TextTrackButton\n */\n\nvar SubsCapsButton = function (_TextTrackButton) {\n  inherits(SubsCapsButton, _TextTrackButton);\n\n  function SubsCapsButton(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, SubsCapsButton);\n\n    // Although North America uses \"captions\" in most cases for\n    // \"captions and subtitles\" other locales use \"subtitles\"\n    var _this = possibleConstructorReturn(this, _TextTrackButton.call(this, player, options));\n\n    _this.label_ = 'subtitles';\n    if (['en', 'en-us', 'en-ca', 'fr-ca'].indexOf(_this.player_.language_) > -1) {\n      _this.label_ = 'captions';\n    }\n    _this.menuButton_.controlText(toTitleCase(_this.label_));\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  SubsCapsButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-subs-caps-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  SubsCapsButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-subs-caps-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Create caption/subtitles menu items\n   *\n   * @return {CaptionSettingsMenuItem[]}\n   *         The array of current menu items.\n   */\n\n\n  SubsCapsButton.prototype.createItems = function createItems() {\n    var items = [];\n\n    if (!(this.player().tech_ && this.player().tech_.featuresNativeTextTracks) && this.player().getChild('textTrackSettings')) {\n      items.push(new CaptionSettingsMenuItem(this.player_, { kind: this.label_ }));\n\n      this.hideThreshold_ += 1;\n    }\n\n    items = _TextTrackButton.prototype.createItems.call(this, items, SubsCapsMenuItem);\n    return items;\n  };\n\n  return SubsCapsButton;\n}(TextTrackButton);\n\n/**\n * `kind`s of TextTrack to look for to associate it with this menu.\n *\n * @type {array}\n * @private\n */\n\n\nSubsCapsButton.prototype.kinds_ = ['captions', 'subtitles'];\n\n/**\n * The text that should display over the `SubsCapsButton`s controls.\n *\n *\n * @type {string}\n * @private\n */\nSubsCapsButton.prototype.controlText_ = 'Subtitles';\n\nComponent.registerComponent('SubsCapsButton', SubsCapsButton);\n\n/**\n * @file audio-track-menu-item.js\n */\n/**\n * An {@link AudioTrack} {@link MenuItem}\n *\n * @extends MenuItem\n */\n\nvar AudioTrackMenuItem = function (_MenuItem) {\n  inherits(AudioTrackMenuItem, _MenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function AudioTrackMenuItem(player, options) {\n    classCallCheck(this, AudioTrackMenuItem);\n\n    var track = options.track;\n    var tracks = player.audioTracks();\n\n    // Modify options for parent MenuItem class's init.\n    options.label = track.label || track.language || 'Unknown';\n    options.selected = track.enabled;\n\n    var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n    _this.track = track;\n\n    _this.addClass('vjs-' + track.kind + '-menu-item');\n\n    var changeHandler = function changeHandler() {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      _this.handleTracksChange.apply(_this, args);\n    };\n\n    tracks.addEventListener('change', changeHandler);\n    _this.on('dispose', function () {\n      tracks.removeEventListener('change', changeHandler);\n    });\n    return _this;\n  }\n\n  AudioTrackMenuItem.prototype.createEl = function createEl(type, props, attrs) {\n    var innerHTML = '<span class=\"vjs-menu-item-text\">' + this.localize(this.options_.label);\n\n    if (this.options_.track.kind === 'main-desc') {\n      innerHTML += '\\n        <span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>\\n        <span class=\"vjs-control-text\"> ' + this.localize('Descriptions') + '</span>\\n      ';\n    }\n\n    innerHTML += '</span>';\n\n    var el = _MenuItem.prototype.createEl.call(this, type, assign({\n      innerHTML: innerHTML\n    }, props), attrs);\n\n    return el;\n  };\n\n  /**\n   * This gets called when an `AudioTrackMenuItem is \"clicked\". See {@link ClickableComponent}\n   * for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  AudioTrackMenuItem.prototype.handleClick = function handleClick(event) {\n    var tracks = this.player_.audioTracks();\n\n    _MenuItem.prototype.handleClick.call(this, event);\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      track.enabled = track === this.track;\n    }\n  };\n\n  /**\n   * Handle any {@link AudioTrack} change.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The {@link AudioTrackList#change} event that caused this to run.\n   *\n   * @listens AudioTrackList#change\n   */\n\n\n  AudioTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {\n    this.selected(this.track.enabled);\n  };\n\n  return AudioTrackMenuItem;\n}(MenuItem);\n\nComponent.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);\n\n/**\n * @file audio-track-button.js\n */\n/**\n * The base class for buttons that toggle specific {@link AudioTrack} types.\n *\n * @extends TrackButton\n */\n\nvar AudioTrackButton = function (_TrackButton) {\n  inherits(AudioTrackButton, _TrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function AudioTrackButton(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, AudioTrackButton);\n\n    options.tracks = player.audioTracks();\n\n    return possibleConstructorReturn(this, _TrackButton.call(this, player, options));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  AudioTrackButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-audio-button ' + _TrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  AudioTrackButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-audio-button ' + _TrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Create a menu item for each audio track\n   *\n   * @param {AudioTrackMenuItem[]} [items=[]]\n   *        An array of existing menu items to use.\n   *\n   * @return {AudioTrackMenuItem[]}\n   *         An array of menu items\n   */\n\n\n  AudioTrackButton.prototype.createItems = function createItems() {\n    var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n    // if there's only one audio track, there no point in showing it\n    this.hideThreshold_ = 1;\n\n    var tracks = this.player_.audioTracks();\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      items.push(new AudioTrackMenuItem(this.player_, {\n        track: track,\n        // MenuItem is selectable\n        selectable: true,\n        // MenuItem is NOT multiSelectable (i.e. only one can be marked \"selected\" at a time)\n        multiSelectable: false\n      }));\n    }\n\n    return items;\n  };\n\n  return AudioTrackButton;\n}(TrackButton);\n\n/**\n * The text that should display over the `AudioTrackButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nAudioTrackButton.prototype.controlText_ = 'Audio Track';\nComponent.registerComponent('AudioTrackButton', AudioTrackButton);\n\n/**\n * @file playback-rate-menu-item.js\n */\n/**\n * The specific menu item type for selecting a playback rate.\n *\n * @extends MenuItem\n */\n\nvar PlaybackRateMenuItem = function (_MenuItem) {\n  inherits(PlaybackRateMenuItem, _MenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function PlaybackRateMenuItem(player, options) {\n    classCallCheck(this, PlaybackRateMenuItem);\n\n    var label = options.rate;\n    var rate = parseFloat(label, 10);\n\n    // Modify options for parent MenuItem class's init.\n    options.label = label;\n    options.selected = rate === 1;\n    options.selectable = true;\n    options.multiSelectable = false;\n\n    var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n    _this.label = label;\n    _this.rate = rate;\n\n    _this.on(player, 'ratechange', _this.update);\n    return _this;\n  }\n\n  /**\n   * This gets called when an `PlaybackRateMenuItem` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  PlaybackRateMenuItem.prototype.handleClick = function handleClick(event) {\n    _MenuItem.prototype.handleClick.call(this);\n    this.player().playbackRate(this.rate);\n  };\n\n  /**\n   * Update the PlaybackRateMenuItem when the playbackrate changes.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `ratechange` event that caused this function to run.\n   *\n   * @listens Player#ratechange\n   */\n\n\n  PlaybackRateMenuItem.prototype.update = function update(event) {\n    this.selected(this.player().playbackRate() === this.rate);\n  };\n\n  return PlaybackRateMenuItem;\n}(MenuItem);\n\n/**\n * The text that should display over the `PlaybackRateMenuItem`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nPlaybackRateMenuItem.prototype.contentElType = 'button';\n\nComponent.registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);\n\n/**\n * @file playback-rate-menu-button.js\n */\n/**\n * The component for controlling the playback rate.\n *\n * @extends MenuButton\n */\n\nvar PlaybackRateMenuButton = function (_MenuButton) {\n  inherits(PlaybackRateMenuButton, _MenuButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function PlaybackRateMenuButton(player, options) {\n    classCallCheck(this, PlaybackRateMenuButton);\n\n    var _this = possibleConstructorReturn(this, _MenuButton.call(this, player, options));\n\n    _this.updateVisibility();\n    _this.updateLabel();\n\n    _this.on(player, 'loadstart', _this.updateVisibility);\n    _this.on(player, 'ratechange', _this.updateLabel);\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  PlaybackRateMenuButton.prototype.createEl = function createEl$$1() {\n    var el = _MenuButton.prototype.createEl.call(this);\n\n    this.labelEl_ = createEl('div', {\n      className: 'vjs-playback-rate-value',\n      innerHTML: '1x'\n    });\n\n    el.appendChild(this.labelEl_);\n\n    return el;\n  };\n\n  PlaybackRateMenuButton.prototype.dispose = function dispose() {\n    this.labelEl_ = null;\n\n    _MenuButton.prototype.dispose.call(this);\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  PlaybackRateMenuButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-playback-rate ' + _MenuButton.prototype.buildCSSClass.call(this);\n  };\n\n  PlaybackRateMenuButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-playback-rate ' + _MenuButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Create the playback rate menu\n   *\n   * @return {Menu}\n   *         Menu object populated with {@link PlaybackRateMenuItem}s\n   */\n\n\n  PlaybackRateMenuButton.prototype.createMenu = function createMenu() {\n    var menu = new Menu(this.player());\n    var rates = this.playbackRates();\n\n    if (rates) {\n      for (var i = rates.length - 1; i >= 0; i--) {\n        menu.addChild(new PlaybackRateMenuItem(this.player(), { rate: rates[i] + 'x' }));\n      }\n    }\n\n    return menu;\n  };\n\n  /**\n   * Updates ARIA accessibility attributes\n   */\n\n\n  PlaybackRateMenuButton.prototype.updateARIAAttributes = function updateARIAAttributes() {\n    // Current playback rate\n    this.el().setAttribute('aria-valuenow', this.player().playbackRate());\n  };\n\n  /**\n   * This gets called when an `PlaybackRateMenuButton` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  PlaybackRateMenuButton.prototype.handleClick = function handleClick(event) {\n    // select next rate option\n    var currentRate = this.player().playbackRate();\n    var rates = this.playbackRates();\n\n    // this will select first one if the last one currently selected\n    var newRate = rates[0];\n\n    for (var i = 0; i < rates.length; i++) {\n      if (rates[i] > currentRate) {\n        newRate = rates[i];\n        break;\n      }\n    }\n    this.player().playbackRate(newRate);\n  };\n\n  /**\n   * Get possible playback rates\n   *\n   * @return {Array}\n   *         All possible playback rates\n   */\n\n\n  PlaybackRateMenuButton.prototype.playbackRates = function playbackRates() {\n    return this.options_.playbackRates || this.options_.playerOptions && this.options_.playerOptions.playbackRates;\n  };\n\n  /**\n   * Get whether playback rates is supported by the tech\n   * and an array of playback rates exists\n   *\n   * @return {boolean}\n   *         Whether changing playback rate is supported\n   */\n\n\n  PlaybackRateMenuButton.prototype.playbackRateSupported = function playbackRateSupported() {\n    return this.player().tech_ && this.player().tech_.featuresPlaybackRate && this.playbackRates() && this.playbackRates().length > 0;\n  };\n\n  /**\n   * Hide playback rate controls when they're no playback rate options to select\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#loadstart\n   */\n\n\n  PlaybackRateMenuButton.prototype.updateVisibility = function updateVisibility(event) {\n    if (this.playbackRateSupported()) {\n      this.removeClass('vjs-hidden');\n    } else {\n      this.addClass('vjs-hidden');\n    }\n  };\n\n  /**\n   * Update button label when rate changed\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#ratechange\n   */\n\n\n  PlaybackRateMenuButton.prototype.updateLabel = function updateLabel(event) {\n    if (this.playbackRateSupported()) {\n      this.labelEl_.innerHTML = this.player().playbackRate() + 'x';\n    }\n  };\n\n  return PlaybackRateMenuButton;\n}(MenuButton);\n\n/**\n * The text that should display over the `FullscreenToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nPlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';\n\nComponent.registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);\n\n/**\n * @file spacer.js\n */\n/**\n * Just an empty spacer element that can be used as an append point for plugins, etc.\n * Also can be used to create space between elements when necessary.\n *\n * @extends Component\n */\n\nvar Spacer = function (_Component) {\n  inherits(Spacer, _Component);\n\n  function Spacer() {\n    classCallCheck(this, Spacer);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n  Spacer.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-spacer ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  Spacer.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: this.buildCSSClass()\n    });\n  };\n\n  return Spacer;\n}(Component);\n\nComponent.registerComponent('Spacer', Spacer);\n\n/**\n * @file custom-control-spacer.js\n */\n/**\n * Spacer specifically meant to be used as an insertion point for new plugins, etc.\n *\n * @extends Spacer\n */\n\nvar CustomControlSpacer = function (_Spacer) {\n  inherits(CustomControlSpacer, _Spacer);\n\n  function CustomControlSpacer() {\n    classCallCheck(this, CustomControlSpacer);\n    return possibleConstructorReturn(this, _Spacer.apply(this, arguments));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n  CustomControlSpacer.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-custom-control-spacer ' + _Spacer.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  CustomControlSpacer.prototype.createEl = function createEl() {\n    var el = _Spacer.prototype.createEl.call(this, {\n      className: this.buildCSSClass()\n    });\n\n    // No-flex/table-cell mode requires there be some content\n    // in the cell to fill the remaining space of the table.\n    el.innerHTML = '\\xA0';\n    return el;\n  };\n\n  return CustomControlSpacer;\n}(Spacer);\n\nComponent.registerComponent('CustomControlSpacer', CustomControlSpacer);\n\n/**\n * @file control-bar.js\n */\n// Required children\n/**\n * Container of main controls.\n *\n * @extends Component\n */\n\nvar ControlBar = function (_Component) {\n  inherits(ControlBar, _Component);\n\n  function ControlBar() {\n    classCallCheck(this, ControlBar);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  ControlBar.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-control-bar',\n      dir: 'ltr'\n    });\n  };\n\n  return ControlBar;\n}(Component);\n\n/**\n * Default options for `ControlBar`\n *\n * @type {Object}\n * @private\n */\n\n\nControlBar.prototype.options_ = {\n  children: ['playToggle', 'volumePanel', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'descriptionsButton', 'subsCapsButton', 'audioTrackButton', 'fullscreenToggle']\n};\n\nComponent.registerComponent('ControlBar', ControlBar);\n\n/**\n * @file error-display.js\n */\n/**\n * A display that indicates an error has occurred. This means that the video\n * is unplayable.\n *\n * @extends ModalDialog\n */\n\nvar ErrorDisplay = function (_ModalDialog) {\n  inherits(ErrorDisplay, _ModalDialog);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param  {Player} player\n   *         The `Player` that this class should be attached to.\n   *\n   * @param  {Object} [options]\n   *         The key/value store of player options.\n   */\n  function ErrorDisplay(player, options) {\n    classCallCheck(this, ErrorDisplay);\n\n    var _this = possibleConstructorReturn(this, _ModalDialog.call(this, player, options));\n\n    _this.on(player, 'error', _this.open);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   *\n   * @deprecated Since version 5.\n   */\n\n\n  ErrorDisplay.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-error-display ' + _ModalDialog.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Gets the localized error message based on the `Player`s error.\n   *\n   * @return {string}\n   *         The `Player`s error message localized or an empty string.\n   */\n\n\n  ErrorDisplay.prototype.content = function content() {\n    var error = this.player().error();\n\n    return error ? this.localize(error.message) : '';\n  };\n\n  return ErrorDisplay;\n}(ModalDialog);\n\n/**\n * The default options for an `ErrorDisplay`.\n *\n * @private\n */\n\n\nErrorDisplay.prototype.options_ = mergeOptions(ModalDialog.prototype.options_, {\n  pauseOnOpen: false,\n  fillAlways: true,\n  temporary: false,\n  uncloseable: true\n});\n\nComponent.registerComponent('ErrorDisplay', ErrorDisplay);\n\n/**\n * @file text-track-settings.js\n */\nvar LOCAL_STORAGE_KEY = 'vjs-text-track-settings';\n\nvar COLOR_BLACK = ['#000', 'Black'];\nvar COLOR_BLUE = ['#00F', 'Blue'];\nvar COLOR_CYAN = ['#0FF', 'Cyan'];\nvar COLOR_GREEN = ['#0F0', 'Green'];\nvar COLOR_MAGENTA = ['#F0F', 'Magenta'];\nvar COLOR_RED = ['#F00', 'Red'];\nvar COLOR_WHITE = ['#FFF', 'White'];\nvar COLOR_YELLOW = ['#FF0', 'Yellow'];\n\nvar OPACITY_OPAQUE = ['1', 'Opaque'];\nvar OPACITY_SEMI = ['0.5', 'Semi-Transparent'];\nvar OPACITY_TRANS = ['0', 'Transparent'];\n\n// Configuration for the various <select> elements in the DOM of this component.\n//\n// Possible keys include:\n//\n// `default`:\n//   The default option index. Only needs to be provided if not zero.\n// `parser`:\n//   A function which is used to parse the value from the selected option in\n//   a customized way.\n// `selector`:\n//   The selector used to find the associated <select> element.\nvar selectConfigs = {\n  backgroundColor: {\n    selector: '.vjs-bg-color > select',\n    id: 'captions-background-color-%s',\n    label: 'Color',\n    options: [COLOR_BLACK, COLOR_WHITE, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN]\n  },\n\n  backgroundOpacity: {\n    selector: '.vjs-bg-opacity > select',\n    id: 'captions-background-opacity-%s',\n    label: 'Transparency',\n    options: [OPACITY_OPAQUE, OPACITY_SEMI, OPACITY_TRANS]\n  },\n\n  color: {\n    selector: '.vjs-fg-color > select',\n    id: 'captions-foreground-color-%s',\n    label: 'Color',\n    options: [COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN]\n  },\n\n  edgeStyle: {\n    selector: '.vjs-edge-style > select',\n    id: '%s',\n    label: 'Text Edge Style',\n    options: [['none', 'None'], ['raised', 'Raised'], ['depressed', 'Depressed'], ['uniform', 'Uniform'], ['dropshadow', 'Dropshadow']]\n  },\n\n  fontFamily: {\n    selector: '.vjs-font-family > select',\n    id: 'captions-font-family-%s',\n    label: 'Font Family',\n    options: [['proportionalSansSerif', 'Proportional Sans-Serif'], ['monospaceSansSerif', 'Monospace Sans-Serif'], ['proportionalSerif', 'Proportional Serif'], ['monospaceSerif', 'Monospace Serif'], ['casual', 'Casual'], ['script', 'Script'], ['small-caps', 'Small Caps']]\n  },\n\n  fontPercent: {\n    selector: '.vjs-font-percent > select',\n    id: 'captions-font-size-%s',\n    label: 'Font Size',\n    options: [['0.50', '50%'], ['0.75', '75%'], ['1.00', '100%'], ['1.25', '125%'], ['1.50', '150%'], ['1.75', '175%'], ['2.00', '200%'], ['3.00', '300%'], ['4.00', '400%']],\n    'default': 2,\n    parser: function parser(v) {\n      return v === '1.00' ? null : Number(v);\n    }\n  },\n\n  textOpacity: {\n    selector: '.vjs-text-opacity > select',\n    id: 'captions-foreground-opacity-%s',\n    label: 'Transparency',\n    options: [OPACITY_OPAQUE, OPACITY_SEMI]\n  },\n\n  // Options for this object are defined below.\n  windowColor: {\n    selector: '.vjs-window-color > select',\n    id: 'captions-window-color-%s',\n    label: 'Color'\n  },\n\n  // Options for this object are defined below.\n  windowOpacity: {\n    selector: '.vjs-window-opacity > select',\n    id: 'captions-window-opacity-%s',\n    label: 'Transparency',\n    options: [OPACITY_TRANS, OPACITY_SEMI, OPACITY_OPAQUE]\n  }\n};\n\nselectConfigs.windowColor.options = selectConfigs.backgroundColor.options;\n\n/**\n * Get the actual value of an option.\n *\n * @param  {string} value\n *         The value to get\n *\n * @param  {Function} [parser]\n *         Optional function to adjust the value.\n *\n * @return {Mixed}\n *         - Will be `undefined` if no value exists\n *         - Will be `undefined` if the given value is \"none\".\n *         - Will be the actual value otherwise.\n *\n * @private\n */\nfunction parseOptionValue(value, parser) {\n  if (parser) {\n    value = parser(value);\n  }\n\n  if (value && value !== 'none') {\n    return value;\n  }\n}\n\n/**\n * Gets the value of the selected <option> element within a <select> element.\n *\n * @param  {Element} el\n *         the element to look in\n *\n * @param  {Function} [parser]\n *         Optional function to adjust the value.\n *\n * @return {Mixed}\n *         - Will be `undefined` if no value exists\n *         - Will be `undefined` if the given value is \"none\".\n *         - Will be the actual value otherwise.\n *\n * @private\n */\nfunction getSelectedOptionValue(el, parser) {\n  var value = el.options[el.options.selectedIndex].value;\n\n  return parseOptionValue(value, parser);\n}\n\n/**\n * Sets the selected <option> element within a <select> element based on a\n * given value.\n *\n * @param {Element} el\n *        The element to look in.\n *\n * @param {string} value\n *        the property to look on.\n *\n * @param {Function} [parser]\n *        Optional function to adjust the value before comparing.\n *\n * @private\n */\nfunction setSelectedOption(el, value, parser) {\n  if (!value) {\n    return;\n  }\n\n  for (var i = 0; i < el.options.length; i++) {\n    if (parseOptionValue(el.options[i].value, parser) === value) {\n      el.selectedIndex = i;\n      break;\n    }\n  }\n}\n\n/**\n * Manipulate Text Tracks settings.\n *\n * @extends ModalDialog\n */\n\nvar TextTrackSettings = function (_ModalDialog) {\n  inherits(TextTrackSettings, _ModalDialog);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *         The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *         The key/value store of player options.\n   */\n  function TextTrackSettings(player, options) {\n    classCallCheck(this, TextTrackSettings);\n\n    options.temporary = false;\n\n    var _this = possibleConstructorReturn(this, _ModalDialog.call(this, player, options));\n\n    _this.updateDisplay = bind(_this, _this.updateDisplay);\n\n    // fill the modal and pretend we have opened it\n    _this.fill();\n    _this.hasBeenOpened_ = _this.hasBeenFilled_ = true;\n\n    _this.endDialog = createEl('p', {\n      className: 'vjs-control-text',\n      textContent: _this.localize('End of dialog window.')\n    });\n    _this.el().appendChild(_this.endDialog);\n\n    _this.setDefaults();\n\n    // Grab `persistTextTrackSettings` from the player options if not passed in child options\n    if (options.persistTextTrackSettings === undefined) {\n      _this.options_.persistTextTrackSettings = _this.options_.playerOptions.persistTextTrackSettings;\n    }\n\n    _this.on(_this.$('.vjs-done-button'), 'click', function () {\n      _this.saveSettings();\n      _this.close();\n    });\n\n    _this.on(_this.$('.vjs-default-button'), 'click', function () {\n      _this.setDefaults();\n      _this.updateDisplay();\n    });\n\n    each(selectConfigs, function (config) {\n      _this.on(_this.$(config.selector), 'change', _this.updateDisplay);\n    });\n\n    if (_this.options_.persistTextTrackSettings) {\n      _this.restoreSettings();\n    }\n    return _this;\n  }\n\n  TextTrackSettings.prototype.dispose = function dispose() {\n    this.endDialog = null;\n\n    _ModalDialog.prototype.dispose.call(this);\n  };\n\n  /**\n   * Create a <select> element with configured options.\n   *\n   * @param {string} key\n   *        Configuration key to use during creation.\n   *\n   * @return {string}\n   *         An HTML string.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElSelect_ = function createElSelect_(key) {\n    var _this2 = this;\n\n    var legendId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n    var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'label';\n\n    var config = selectConfigs[key];\n    var id = config.id.replace('%s', this.id_);\n    var selectLabelledbyIds = [legendId, id].join(' ').trim();\n\n    return ['<' + type + ' id=\"' + id + '\" class=\"' + (type === 'label' ? 'vjs-label' : '') + '\">', this.localize(config.label), '</' + type + '>', '<select aria-labelledby=\"' + selectLabelledbyIds + '\">'].concat(config.options.map(function (o) {\n      var optionId = id + '-' + o[1].replace(/\\W+/g, '');\n\n      return ['<option id=\"' + optionId + '\" value=\"' + o[0] + '\" ', 'aria-labelledby=\"' + selectLabelledbyIds + ' ' + optionId + '\">', _this2.localize(o[1]), '</option>'].join('');\n    })).concat('</select>').join('');\n  };\n\n  /**\n   * Create foreground color element for the component\n   *\n   * @return {string}\n   *         An HTML string.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElFgColor_ = function createElFgColor_() {\n    var legendId = 'captions-text-legend-' + this.id_;\n\n    return ['<fieldset class=\"vjs-fg-color vjs-track-setting\">', '<legend id=\"' + legendId + '\">', this.localize('Text'), '</legend>', this.createElSelect_('color', legendId), '<span class=\"vjs-text-opacity vjs-opacity\">', this.createElSelect_('textOpacity', legendId), '</span>', '</fieldset>'].join('');\n  };\n\n  /**\n   * Create background color element for the component\n   *\n   * @return {string}\n   *         An HTML string.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElBgColor_ = function createElBgColor_() {\n    var legendId = 'captions-background-' + this.id_;\n\n    return ['<fieldset class=\"vjs-bg-color vjs-track-setting\">', '<legend id=\"' + legendId + '\">', this.localize('Background'), '</legend>', this.createElSelect_('backgroundColor', legendId), '<span class=\"vjs-bg-opacity vjs-opacity\">', this.createElSelect_('backgroundOpacity', legendId), '</span>', '</fieldset>'].join('');\n  };\n\n  /**\n   * Create window color element for the component\n   *\n   * @return {string}\n   *         An HTML string.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElWinColor_ = function createElWinColor_() {\n    var legendId = 'captions-window-' + this.id_;\n\n    return ['<fieldset class=\"vjs-window-color vjs-track-setting\">', '<legend id=\"' + legendId + '\">', this.localize('Window'), '</legend>', this.createElSelect_('windowColor', legendId), '<span class=\"vjs-window-opacity vjs-opacity\">', this.createElSelect_('windowOpacity', legendId), '</span>', '</fieldset>'].join('');\n  };\n\n  /**\n   * Create color elements for the component\n   *\n   * @return {Element}\n   *         The element that was created\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElColors_ = function createElColors_() {\n    return createEl('div', {\n      className: 'vjs-track-settings-colors',\n      innerHTML: [this.createElFgColor_(), this.createElBgColor_(), this.createElWinColor_()].join('')\n    });\n  };\n\n  /**\n   * Create font elements for the component\n   *\n   * @return {Element}\n   *         The element that was created.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElFont_ = function createElFont_() {\n    return createEl('div', {\n      className: 'vjs-track-settings-font',\n      innerHTML: ['<fieldset class=\"vjs-font-percent vjs-track-setting\">', this.createElSelect_('fontPercent', '', 'legend'), '</fieldset>', '<fieldset class=\"vjs-edge-style vjs-track-setting\">', this.createElSelect_('edgeStyle', '', 'legend'), '</fieldset>', '<fieldset class=\"vjs-font-family vjs-track-setting\">', this.createElSelect_('fontFamily', '', 'legend'), '</fieldset>'].join('')\n    });\n  };\n\n  /**\n   * Create controls for the component\n   *\n   * @return {Element}\n   *         The element that was created.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElControls_ = function createElControls_() {\n    var defaultsDescription = this.localize('restore all settings to the default values');\n\n    return createEl('div', {\n      className: 'vjs-track-settings-controls',\n      innerHTML: ['<button class=\"vjs-default-button\" title=\"' + defaultsDescription + '\">', this.localize('Reset'), '<span class=\"vjs-control-text\"> ' + defaultsDescription + '</span>', '</button>', '<button class=\"vjs-done-button\">' + this.localize('Done') + '</button>'].join('')\n    });\n  };\n\n  TextTrackSettings.prototype.content = function content() {\n    return [this.createElColors_(), this.createElFont_(), this.createElControls_()];\n  };\n\n  TextTrackSettings.prototype.label = function label() {\n    return this.localize('Caption Settings Dialog');\n  };\n\n  TextTrackSettings.prototype.description = function description() {\n    return this.localize('Beginning of dialog window. Escape will cancel and close the window.');\n  };\n\n  TextTrackSettings.prototype.buildCSSClass = function buildCSSClass() {\n    return _ModalDialog.prototype.buildCSSClass.call(this) + ' vjs-text-track-settings';\n  };\n\n  /**\n   * Gets an object of text track settings (or null).\n   *\n   * @return {Object}\n   *         An object with config values parsed from the DOM or localStorage.\n   */\n\n\n  TextTrackSettings.prototype.getValues = function getValues() {\n    var _this3 = this;\n\n    return reduce(selectConfigs, function (accum, config, key) {\n      var value = getSelectedOptionValue(_this3.$(config.selector), config.parser);\n\n      if (value !== undefined) {\n        accum[key] = value;\n      }\n\n      return accum;\n    }, {});\n  };\n\n  /**\n   * Sets text track settings from an object of values.\n   *\n   * @param {Object} values\n   *        An object with config values parsed from the DOM or localStorage.\n   */\n\n\n  TextTrackSettings.prototype.setValues = function setValues(values) {\n    var _this4 = this;\n\n    each(selectConfigs, function (config, key) {\n      setSelectedOption(_this4.$(config.selector), values[key], config.parser);\n    });\n  };\n\n  /**\n   * Sets all `<select>` elements to their default values.\n   */\n\n\n  TextTrackSettings.prototype.setDefaults = function setDefaults() {\n    var _this5 = this;\n\n    each(selectConfigs, function (config) {\n      var index = config.hasOwnProperty('default') ? config['default'] : 0;\n\n      _this5.$(config.selector).selectedIndex = index;\n    });\n  };\n\n  /**\n   * Restore texttrack settings from localStorage\n   */\n\n\n  TextTrackSettings.prototype.restoreSettings = function restoreSettings() {\n    var values = void 0;\n\n    try {\n      values = JSON.parse(window.localStorage.getItem(LOCAL_STORAGE_KEY));\n    } catch (err) {\n      log$1.warn(err);\n    }\n\n    if (values) {\n      this.setValues(values);\n    }\n  };\n\n  /**\n   * Save text track settings to localStorage\n   */\n\n\n  TextTrackSettings.prototype.saveSettings = function saveSettings() {\n    if (!this.options_.persistTextTrackSettings) {\n      return;\n    }\n\n    var values = this.getValues();\n\n    try {\n      if (Object.keys(values).length) {\n        window.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(values));\n      } else {\n        window.localStorage.removeItem(LOCAL_STORAGE_KEY);\n      }\n    } catch (err) {\n      log$1.warn(err);\n    }\n  };\n\n  /**\n   * Update display of text track settings\n   */\n\n\n  TextTrackSettings.prototype.updateDisplay = function updateDisplay() {\n    var ttDisplay = this.player_.getChild('textTrackDisplay');\n\n    if (ttDisplay) {\n      ttDisplay.updateDisplay();\n    }\n  };\n\n  /**\n   * conditionally blur the element and refocus the captions button\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.conditionalBlur_ = function conditionalBlur_() {\n    this.previouslyActiveEl_ = null;\n    this.off(document, 'keydown', this.handleKeyDown);\n\n    var cb = this.player_.controlBar;\n    var subsCapsBtn = cb && cb.subsCapsButton;\n    var ccBtn = cb && cb.captionsButton;\n\n    if (subsCapsBtn) {\n      subsCapsBtn.focus();\n    } else if (ccBtn) {\n      ccBtn.focus();\n    }\n  };\n\n  return TextTrackSettings;\n}(ModalDialog);\n\nComponent.registerComponent('TextTrackSettings', TextTrackSettings);\n\n/**\n * @file resize-manager.js\n */\n/**\n * A Resize Manager. It is in charge of triggering `playerresize` on the player in the right conditions.\n *\n * It'll either create an iframe and use a debounced resize handler on it or use the new {@link https://wicg.github.io/ResizeObserver/|ResizeObserver}.\n *\n * If the ResizeObserver is available natively, it will be used. A polyfill can be passed in as an option.\n * If a `playerresize` event is not needed, the ResizeManager component can be removed from the player, see the example below.\n * @example <caption>How to disable the resize manager</caption>\n * const player = videojs('#vid', {\n *   resizeManager: false\n * });\n *\n * @see {@link https://wicg.github.io/ResizeObserver/|ResizeObserver specification}\n *\n * @extends Component\n */\n\nvar ResizeManager = function (_Component) {\n  inherits(ResizeManager, _Component);\n\n  /**\n   * Create the ResizeManager.\n   *\n   * @param {Object} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of ResizeManager options.\n   *\n   * @param {Object} [options.ResizeObserver]\n   *        A polyfill for ResizeObserver can be passed in here.\n   *        If this is set to null it will ignore the native ResizeObserver and fall back to the iframe fallback.\n   */\n  function ResizeManager(player, options) {\n    classCallCheck(this, ResizeManager);\n\n    var RESIZE_OBSERVER_AVAILABLE = options.ResizeObserver || window.ResizeObserver;\n\n    // if `null` was passed, we want to disable the ResizeObserver\n    if (options.ResizeObserver === null) {\n      RESIZE_OBSERVER_AVAILABLE = false;\n    }\n\n    // Only create an element when ResizeObserver isn't available\n    var options_ = mergeOptions({ createEl: !RESIZE_OBSERVER_AVAILABLE }, options);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options_));\n\n    _this.ResizeObserver = options.ResizeObserver || window.ResizeObserver;\n    _this.loadListener_ = null;\n    _this.resizeObserver_ = null;\n    _this.debouncedHandler_ = debounce(function () {\n      _this.resizeHandler();\n    }, 100, false, player);\n\n    if (RESIZE_OBSERVER_AVAILABLE) {\n      _this.resizeObserver_ = new _this.ResizeObserver(_this.debouncedHandler_);\n      _this.resizeObserver_.observe(player.el());\n    } else {\n      _this.loadListener_ = function () {\n        if (_this.el_.contentWindow) {\n          on(_this.el_.contentWindow, 'resize', _this.debouncedHandler_);\n        }\n        _this.off('load', _this.loadListener_);\n      };\n\n      _this.on('load', _this.loadListener_);\n    }\n    return _this;\n  }\n\n  ResizeManager.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'iframe', {\n      className: 'vjs-resize-manager'\n    });\n  };\n\n  /**\n   * Called when a resize is triggered on the iframe or a resize is observed via the ResizeObserver\n   *\n   * @fires Player#playerresize\n   */\n\n\n  ResizeManager.prototype.resizeHandler = function resizeHandler() {\n    /**\n     * Called when the player size has changed\n     *\n     * @event Player#playerresize\n     * @type {EventTarget~Event}\n     */\n    this.player_.trigger('playerresize');\n  };\n\n  ResizeManager.prototype.dispose = function dispose() {\n    if (this.resizeObserver_) {\n      if (this.player_.el()) {\n        this.resizeObserver_.unobserve(this.player_.el());\n      }\n      this.resizeObserver_.disconnect();\n    }\n\n    if (this.el_ && this.el_.contentWindow) {\n      off(this.el_.contentWindow, 'resize', this.debouncedHandler_);\n    }\n\n    if (this.loadListener_) {\n      this.off('load', this.loadListener_);\n    }\n\n    this.ResizeObserver = null;\n    this.resizeObserver = null;\n    this.debouncedHandler_ = null;\n    this.loadListener_ = null;\n  };\n\n  return ResizeManager;\n}(Component);\n\nComponent.registerComponent('ResizeManager', ResizeManager);\n\n/**\n * This function is used to fire a sourceset when there is something\n * similar to `mediaEl.load()` being called. It will try to find the source via\n * the `src` attribute and then the `<source>` elements. It will then fire `sourceset`\n * with the source that was found or empty string if we cannot know. If it cannot\n * find a source then `sourceset` will not be fired.\n *\n * @param {Html5} tech\n *        The tech object that sourceset was setup on\n *\n * @return {boolean}\n *         returns false if the sourceset was not fired and true otherwise.\n */\nvar sourcesetLoad = function sourcesetLoad(tech) {\n  var el = tech.el();\n\n  // if `el.src` is set, that source will be loaded.\n  if (el.hasAttribute('src')) {\n    tech.triggerSourceset(el.src);\n    return true;\n  }\n\n  /**\n   * Since there isn't a src property on the media element, source elements will be used for\n   * implementing the source selection algorithm. This happens asynchronously and\n   * for most cases were there is more than one source we cannot tell what source will\n   * be loaded, without re-implementing the source selection algorithm. At this time we are not\n   * going to do that. There are three special cases that we do handle here though:\n   *\n   * 1. If there are no sources, do not fire `sourceset`.\n   * 2. If there is only one `<source>` with a `src` property/attribute that is our `src`\n   * 3. If there is more than one `<source>` but all of them have the same `src` url.\n   *    That will be our src.\n   */\n  var sources = tech.$$('source');\n  var srcUrls = [];\n  var src = '';\n\n  // if there are no sources, do not fire sourceset\n  if (!sources.length) {\n    return false;\n  }\n\n  // only count valid/non-duplicate source elements\n  for (var i = 0; i < sources.length; i++) {\n    var url = sources[i].src;\n\n    if (url && srcUrls.indexOf(url) === -1) {\n      srcUrls.push(url);\n    }\n  }\n\n  // there were no valid sources\n  if (!srcUrls.length) {\n    return false;\n  }\n\n  // there is only one valid source element url\n  // use that\n  if (srcUrls.length === 1) {\n    src = srcUrls[0];\n  }\n\n  tech.triggerSourceset(src);\n  return true;\n};\n\n/**\n * our implementation of an `innerHTML` descriptor for browsers\n * that do not have one.\n */\nvar innerHTMLDescriptorPolyfill = {};\n\nif (!IS_IE8) {\n  innerHTMLDescriptorPolyfill = Object.defineProperty({}, 'innerHTML', {\n    get: function get() {\n      return this.cloneNode(true).innerHTML;\n    },\n    set: function set(v) {\n      // make a dummy node to use innerHTML on\n      var dummy = document.createElement(this.nodeName.toLowerCase());\n\n      // set innerHTML to the value provided\n      dummy.innerHTML = v;\n\n      // make a document fragment to hold the nodes from dummy\n      var docFrag = document.createDocumentFragment();\n\n      // copy all of the nodes created by the innerHTML on dummy\n      // to the document fragment\n      while (dummy.childNodes.length) {\n        docFrag.appendChild(dummy.childNodes[0]);\n      }\n\n      // remove content\n      this.innerText = '';\n\n      // now we add all of that html in one by appending the\n      // document fragment. This is how innerHTML does it.\n      window.Element.prototype.appendChild.call(this, docFrag);\n\n      // then return the result that innerHTML's setter would\n      return this.innerHTML;\n    }\n  });\n}\n/**\n * Get a property descriptor given a list of priorities and the\n * property to get.\n */\nvar getDescriptor = function getDescriptor(priority, prop) {\n  var descriptor = {};\n\n  for (var i = 0; i < priority.length; i++) {\n    descriptor = Object.getOwnPropertyDescriptor(priority[i], prop);\n\n    if (descriptor && descriptor.set && descriptor.get) {\n      break;\n    }\n  }\n\n  descriptor.enumerable = true;\n  descriptor.configurable = true;\n\n  return descriptor;\n};\n\nvar getInnerHTMLDescriptor = function getInnerHTMLDescriptor(tech) {\n  return getDescriptor([tech.el(), window.HTMLMediaElement.prototype, window.Element.prototype, innerHTMLDescriptorPolyfill], 'innerHTML');\n};\n\n/**\n * Patches browser internal functions so that we can tell syncronously\n * if a `<source>` was appended to the media element. For some reason this\n * causes a `sourceset` if the the media element is ready and has no source.\n * This happens when:\n * - The page has just loaded and the media element does not have a source.\n * - The media element was emptied of all sources, then `load()` was called.\n *\n * It does this by patching the following functions/properties when they are supported:\n *\n * - `append()` - can be used to add a `<source>` element to the media element\n * - `appendChild()` - can be used to add a `<source>` element to the media element\n * - `insertAdjacentHTML()` -  can be used to add a `<source>` element to the media element\n * - `innerHTML` -  can be used to add a `<source>` element to the media element\n *\n * @param {Html5} tech\n *        The tech object that sourceset is being setup on.\n */\nvar firstSourceWatch = function firstSourceWatch(tech) {\n  var el = tech.el();\n\n  // make sure firstSourceWatch isn't setup twice.\n  if (el.resetSourceWatch_) {\n    return;\n  }\n\n  var old = {};\n  var innerDescriptor = getInnerHTMLDescriptor(tech);\n  var appendWrapper = function appendWrapper(appendFn) {\n    return function () {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      var retval = appendFn.apply(el, args);\n\n      sourcesetLoad(tech);\n\n      return retval;\n    };\n  };\n\n  ['append', 'appendChild', 'insertAdjacentHTML'].forEach(function (k) {\n    if (!el[k]) {\n      return;\n    }\n\n    // store the old function\n    old[k] = el[k];\n\n    // call the old function with a sourceset if a source\n    // was loaded\n    el[k] = appendWrapper(old[k]);\n  });\n\n  Object.defineProperty(el, 'innerHTML', mergeOptions(innerDescriptor, {\n    set: appendWrapper(innerDescriptor.set)\n  }));\n\n  el.resetSourceWatch_ = function () {\n    el.resetSourceWatch_ = null;\n    Object.keys(old).forEach(function (k) {\n      el[k] = old[k];\n    });\n\n    Object.defineProperty(el, 'innerHTML', innerDescriptor);\n  };\n\n  // on the first sourceset, we need to revert our changes\n  tech.one('sourceset', el.resetSourceWatch_);\n};\n\n/**\n * our implementation of a `src` descriptor for browsers\n * that do not have one.\n */\n\nvar srcDescriptorPolyfill = {};\n\nif (!IS_IE8) {\n  srcDescriptorPolyfill = Object.defineProperty({}, 'src', {\n    get: function get() {\n      if (this.hasAttribute('src')) {\n        return getAbsoluteURL(window.Element.prototype.getAttribute.call(this, 'src'));\n      }\n\n      return '';\n    },\n    set: function set(v) {\n      window.Element.prototype.setAttribute.call(this, 'src', v);\n\n      return v;\n    }\n  });\n}\n\nvar getSrcDescriptor = function getSrcDescriptor(tech) {\n  return getDescriptor([tech.el(), window.HTMLMediaElement.prototype, srcDescriptorPolyfill], 'src');\n};\n\n/**\n * setup `sourceset` handling on the `Html5` tech. This function\n * patches the following element properties/functions:\n *\n * - `src` - to determine when `src` is set\n * - `setAttribute()` - to determine when `src` is set\n * - `load()` - this re-triggers the source selection algorithm, and can\n *              cause a sourceset.\n *\n * If there is no source when we are adding `sourceset` support or during a `load()`\n * we also patch the functions listed in `firstSourceWatch`.\n *\n * @param {Html5} tech\n *        The tech to patch\n */\nvar setupSourceset = function setupSourceset(tech) {\n  if (!tech.featuresSourceset) {\n    return;\n  }\n\n  var el = tech.el();\n\n  // make sure sourceset isn't setup twice.\n  if (el.resetSourceset_) {\n    return;\n  }\n\n  var srcDescriptor = getSrcDescriptor(tech);\n  var oldSetAttribute = el.setAttribute;\n  var oldLoad = el.load;\n\n  Object.defineProperty(el, 'src', mergeOptions(srcDescriptor, {\n    set: function set(v) {\n      var retval = srcDescriptor.set.call(el, v);\n\n      // we use the getter here to get the actual value set on src\n      tech.triggerSourceset(el.src);\n\n      return retval;\n    }\n  }));\n\n  el.setAttribute = function (n, v) {\n    var retval = oldSetAttribute.call(el, n, v);\n\n    if (/src/i.test(n)) {\n      tech.triggerSourceset(el.src);\n    }\n\n    return retval;\n  };\n\n  el.load = function () {\n    var retval = oldLoad.call(el);\n\n    // if load was called, but there was no source to fire\n    // sourceset on. We have to watch for a source append\n    // as that can trigger a `sourceset` when the media element\n    // has no source\n    if (!sourcesetLoad(tech)) {\n      tech.triggerSourceset('');\n      firstSourceWatch(tech);\n    }\n\n    return retval;\n  };\n\n  if (el.currentSrc) {\n    tech.triggerSourceset(el.currentSrc);\n  } else if (!sourcesetLoad(tech)) {\n    firstSourceWatch(tech);\n  }\n\n  el.resetSourceset_ = function () {\n    el.resetSourceset_ = null;\n    el.load = oldLoad;\n    el.setAttribute = oldSetAttribute;\n    Object.defineProperty(el, 'src', srcDescriptor);\n    if (el.resetSourceWatch_) {\n      el.resetSourceWatch_();\n    }\n  };\n};\n\nvar _templateObject$2 = taggedTemplateLiteralLoose(['Text Tracks are being loaded from another origin but the crossorigin attribute isn\\'t used.\\n            This may prevent text tracks from loading.'], ['Text Tracks are being loaded from another origin but the crossorigin attribute isn\\'t used.\\n            This may prevent text tracks from loading.']);\n\n/**\n * @file html5.js\n */\n/**\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n *\n * @mixes Tech~SouceHandlerAdditions\n * @extends Tech\n */\n\nvar Html5 = function (_Tech) {\n  inherits(Html5, _Tech);\n\n  /**\n   * Create an instance of this Tech.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} ready\n   *        Callback function to call when the `HTML5` Tech is ready.\n   */\n  function Html5(options, ready) {\n    classCallCheck(this, Html5);\n\n    var _this = possibleConstructorReturn(this, _Tech.call(this, options, ready));\n\n    var source = options.source;\n    var crossoriginTracks = false;\n\n    // Set the source if one is provided\n    // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)\n    // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source\n    // anyway so the error gets fired.\n    if (source && (_this.el_.currentSrc !== source.src || options.tag && options.tag.initNetworkState_ === 3)) {\n      _this.setSource(source);\n    } else {\n      _this.handleLateInit_(_this.el_);\n    }\n\n    // setup sourceset after late sourceset/init\n    if (options.enableSourceset) {\n      _this.setupSourcesetHandling_();\n    }\n\n    if (_this.el_.hasChildNodes()) {\n\n      var nodes = _this.el_.childNodes;\n      var nodesLength = nodes.length;\n      var removeNodes = [];\n\n      while (nodesLength--) {\n        var node = nodes[nodesLength];\n        var nodeName = node.nodeName.toLowerCase();\n\n        if (nodeName === 'track') {\n          if (!_this.featuresNativeTextTracks) {\n            // Empty video tag tracks so the built-in player doesn't use them also.\n            // This may not be fast enough to stop HTML5 browsers from reading the tags\n            // so we'll need to turn off any default tracks if we're manually doing\n            // captions and subtitles. videoElement.textTracks\n            removeNodes.push(node);\n          } else {\n            // store HTMLTrackElement and TextTrack to remote list\n            _this.remoteTextTrackEls().addTrackElement_(node);\n            _this.remoteTextTracks().addTrack(node.track);\n            _this.textTracks().addTrack(node.track);\n            if (!crossoriginTracks && !_this.el_.hasAttribute('crossorigin') && isCrossOrigin(node.src)) {\n              crossoriginTracks = true;\n            }\n          }\n        }\n      }\n\n      for (var i = 0; i < removeNodes.length; i++) {\n        _this.el_.removeChild(removeNodes[i]);\n      }\n    }\n\n    _this.proxyNativeTracks_();\n    if (_this.featuresNativeTextTracks && crossoriginTracks) {\n      log$1.warn(tsml(_templateObject$2));\n    }\n\n    // prevent iOS Safari from disabling metadata text tracks during native playback\n    _this.restoreMetadataTracksInIOSNativePlayer_();\n\n    // Determine if native controls should be used\n    // Our goal should be to get the custom controls on mobile solid everywhere\n    // so we can remove this all together. Right now this will block custom\n    // controls on touch enabled laptops like the Chrome Pixel\n    if ((TOUCH_ENABLED || IS_IPHONE || IS_NATIVE_ANDROID) && options.nativeControlsForTouch === true) {\n      _this.setControls(true);\n    }\n\n    // on iOS, we want to proxy `webkitbeginfullscreen` and `webkitendfullscreen`\n    // into a `fullscreenchange` event\n    _this.proxyWebkitFullscreen_();\n\n    _this.triggerReady();\n    return _this;\n  }\n\n  /**\n   * Dispose of `HTML5` media element and remove all tracks.\n   */\n\n\n  Html5.prototype.dispose = function dispose() {\n    if (this.el_ && this.el_.resetSourceset_) {\n      this.el_.resetSourceset_();\n    }\n    Html5.disposeMediaElement(this.el_);\n    this.options_ = null;\n\n    // tech will handle clearing of the emulated track list\n    _Tech.prototype.dispose.call(this);\n  };\n\n  /**\n   * Modify the media element so that we can detect when\n   * the source is changed. Fires `sourceset` just after the source has changed\n   */\n\n\n  Html5.prototype.setupSourcesetHandling_ = function setupSourcesetHandling_() {\n    setupSourceset(this);\n  };\n\n  /**\n   * When a captions track is enabled in the iOS Safari native player, all other\n   * tracks are disabled (including metadata tracks), which nulls all of their\n   * associated cue points. This will restore metadata tracks to their pre-fullscreen\n   * state in those cases so that cue points are not needlessly lost.\n   *\n   * @private\n   */\n\n\n  Html5.prototype.restoreMetadataTracksInIOSNativePlayer_ = function restoreMetadataTracksInIOSNativePlayer_() {\n    var textTracks = this.textTracks();\n    var metadataTracksPreFullscreenState = void 0;\n\n    // captures a snapshot of every metadata track's current state\n    var takeMetadataTrackSnapshot = function takeMetadataTrackSnapshot() {\n      metadataTracksPreFullscreenState = [];\n\n      for (var i = 0; i < textTracks.length; i++) {\n        var track = textTracks[i];\n\n        if (track.kind === 'metadata') {\n          metadataTracksPreFullscreenState.push({\n            track: track,\n            storedMode: track.mode\n          });\n        }\n      }\n    };\n\n    // snapshot each metadata track's initial state, and update the snapshot\n    // each time there is a track 'change' event\n    takeMetadataTrackSnapshot();\n    textTracks.addEventListener('change', takeMetadataTrackSnapshot);\n\n    this.on('dispose', function () {\n      return textTracks.removeEventListener('change', takeMetadataTrackSnapshot);\n    });\n\n    var restoreTrackMode = function restoreTrackMode() {\n      for (var i = 0; i < metadataTracksPreFullscreenState.length; i++) {\n        var storedTrack = metadataTracksPreFullscreenState[i];\n\n        if (storedTrack.track.mode === 'disabled' && storedTrack.track.mode !== storedTrack.storedMode) {\n          storedTrack.track.mode = storedTrack.storedMode;\n        }\n      }\n      // we only want this handler to be executed on the first 'change' event\n      textTracks.removeEventListener('change', restoreTrackMode);\n    };\n\n    // when we enter fullscreen playback, stop updating the snapshot and\n    // restore all track modes to their pre-fullscreen state\n    this.on('webkitbeginfullscreen', function () {\n      textTracks.removeEventListener('change', takeMetadataTrackSnapshot);\n\n      // remove the listener before adding it just in case it wasn't previously removed\n      textTracks.removeEventListener('change', restoreTrackMode);\n      textTracks.addEventListener('change', restoreTrackMode);\n    });\n\n    // start updating the snapshot again after leaving fullscreen\n    this.on('webkitendfullscreen', function () {\n      // remove the listener before adding it just in case it wasn't previously removed\n      textTracks.removeEventListener('change', takeMetadataTrackSnapshot);\n      textTracks.addEventListener('change', takeMetadataTrackSnapshot);\n\n      // remove the restoreTrackMode handler in case it wasn't triggered during fullscreen playback\n      textTracks.removeEventListener('change', restoreTrackMode);\n    });\n  };\n\n  /**\n   * Proxy all native track list events to our track lists if the browser we are playing\n   * in supports that type of track list.\n   *\n   * @private\n   */\n\n\n  Html5.prototype.proxyNativeTracks_ = function proxyNativeTracks_() {\n    var _this2 = this;\n\n    NORMAL.names.forEach(function (name) {\n      var props = NORMAL[name];\n      var elTracks = _this2.el()[props.getterName];\n      var techTracks = _this2[props.getterName]();\n\n      if (!_this2['featuresNative' + props.capitalName + 'Tracks'] || !elTracks || !elTracks.addEventListener) {\n        return;\n      }\n      var listeners = {\n        change: function change(e) {\n          techTracks.trigger({\n            type: 'change',\n            target: techTracks,\n            currentTarget: techTracks,\n            srcElement: techTracks\n          });\n        },\n        addtrack: function addtrack(e) {\n          techTracks.addTrack(e.track);\n        },\n        removetrack: function removetrack(e) {\n          techTracks.removeTrack(e.track);\n        }\n      };\n      var removeOldTracks = function removeOldTracks() {\n        var removeTracks = [];\n\n        for (var i = 0; i < techTracks.length; i++) {\n          var found = false;\n\n          for (var j = 0; j < elTracks.length; j++) {\n            if (elTracks[j] === techTracks[i]) {\n              found = true;\n              break;\n            }\n          }\n\n          if (!found) {\n            removeTracks.push(techTracks[i]);\n          }\n        }\n\n        while (removeTracks.length) {\n          techTracks.removeTrack(removeTracks.shift());\n        }\n      };\n\n      Object.keys(listeners).forEach(function (eventName) {\n        var listener = listeners[eventName];\n\n        elTracks.addEventListener(eventName, listener);\n        _this2.on('dispose', function (e) {\n          return elTracks.removeEventListener(eventName, listener);\n        });\n      });\n\n      // Remove (native) tracks that are not used anymore\n      _this2.on('loadstart', removeOldTracks);\n      _this2.on('dispose', function (e) {\n        return _this2.off('loadstart', removeOldTracks);\n      });\n    });\n  };\n\n  /**\n   * Create the `Html5` Tech's DOM element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  Html5.prototype.createEl = function createEl$$1() {\n    var el = this.options_.tag;\n\n    // Check if this browser supports moving the element into the box.\n    // On the iPhone video will break if you move the element,\n    // So we have to create a brand new element.\n    // If we ingested the player div, we do not need to move the media element.\n    if (!el || !(this.options_.playerElIngest || this.movingMediaElementInDOM)) {\n\n      // If the original tag is still there, clone and remove it.\n      if (el) {\n        var clone = el.cloneNode(true);\n\n        if (el.parentNode) {\n          el.parentNode.insertBefore(clone, el);\n        }\n        Html5.disposeMediaElement(el);\n        el = clone;\n      } else {\n        el = document.createElement('video');\n\n        // determine if native controls should be used\n        var tagAttributes = this.options_.tag && getAttributes(this.options_.tag);\n        var attributes = mergeOptions({}, tagAttributes);\n\n        if (!TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {\n          delete attributes.controls;\n        }\n\n        setAttributes(el, assign(attributes, {\n          id: this.options_.techId,\n          'class': 'vjs-tech'\n        }));\n      }\n\n      el.playerId = this.options_.playerId;\n    }\n\n    if (typeof this.options_.preload !== 'undefined') {\n      setAttribute(el, 'preload', this.options_.preload);\n    }\n\n    // Update specific tag settings, in case they were overridden\n    // `autoplay` has to be *last* so that `muted` and `playsinline` are present\n    // when iOS/Safari or other browsers attempt to autoplay.\n    var settingsAttrs = ['loop', 'muted', 'playsinline', 'autoplay'];\n\n    for (var i = 0; i < settingsAttrs.length; i++) {\n      var attr = settingsAttrs[i];\n      var value = this.options_[attr];\n\n      if (typeof value !== 'undefined') {\n        if (value) {\n          setAttribute(el, attr, attr);\n        } else {\n          removeAttribute(el, attr);\n        }\n        el[attr] = value;\n      }\n    }\n\n    return el;\n  };\n\n  /**\n   * This will be triggered if the loadstart event has already fired, before videojs was\n   * ready. Two known examples of when this can happen are:\n   * 1. If we're loading the playback object after it has started loading\n   * 2. The media is already playing the (often with autoplay on) then\n   *\n   * This function will fire another loadstart so that videojs can catchup.\n   *\n   * @fires Tech#loadstart\n   *\n   * @return {undefined}\n   *         returns nothing.\n   */\n\n\n  Html5.prototype.handleLateInit_ = function handleLateInit_(el) {\n    if (el.networkState === 0 || el.networkState === 3) {\n      // The video element hasn't started loading the source yet\n      // or didn't find a source\n      return;\n    }\n\n    if (el.readyState === 0) {\n      // NetworkState is set synchronously BUT loadstart is fired at the\n      // end of the current stack, usually before setInterval(fn, 0).\n      // So at this point we know loadstart may have already fired or is\n      // about to fire, and either way the player hasn't seen it yet.\n      // We don't want to fire loadstart prematurely here and cause a\n      // double loadstart so we'll wait and see if it happens between now\n      // and the next loop, and fire it if not.\n      // HOWEVER, we also want to make sure it fires before loadedmetadata\n      // which could also happen between now and the next loop, so we'll\n      // watch for that also.\n      var loadstartFired = false;\n      var setLoadstartFired = function setLoadstartFired() {\n        loadstartFired = true;\n      };\n\n      this.on('loadstart', setLoadstartFired);\n\n      var triggerLoadstart = function triggerLoadstart() {\n        // We did miss the original loadstart. Make sure the player\n        // sees loadstart before loadedmetadata\n        if (!loadstartFired) {\n          this.trigger('loadstart');\n        }\n      };\n\n      this.on('loadedmetadata', triggerLoadstart);\n\n      this.ready(function () {\n        this.off('loadstart', setLoadstartFired);\n        this.off('loadedmetadata', triggerLoadstart);\n\n        if (!loadstartFired) {\n          // We did miss the original native loadstart. Fire it now.\n          this.trigger('loadstart');\n        }\n      });\n\n      return;\n    }\n\n    // From here on we know that loadstart already fired and we missed it.\n    // The other readyState events aren't as much of a problem if we double\n    // them, so not going to go to as much trouble as loadstart to prevent\n    // that unless we find reason to.\n    var eventsToTrigger = ['loadstart'];\n\n    // loadedmetadata: newly equal to HAVE_METADATA (1) or greater\n    eventsToTrigger.push('loadedmetadata');\n\n    // loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater\n    if (el.readyState >= 2) {\n      eventsToTrigger.push('loadeddata');\n    }\n\n    // canplay: newly increased to HAVE_FUTURE_DATA (3) or greater\n    if (el.readyState >= 3) {\n      eventsToTrigger.push('canplay');\n    }\n\n    // canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)\n    if (el.readyState >= 4) {\n      eventsToTrigger.push('canplaythrough');\n    }\n\n    // We still need to give the player time to add event listeners\n    this.ready(function () {\n      eventsToTrigger.forEach(function (type) {\n        this.trigger(type);\n      }, this);\n    });\n  };\n\n  /**\n   * Set current time for the `HTML5` tech.\n   *\n   * @param {number} seconds\n   *        Set the current time of the media to this.\n   */\n\n\n  Html5.prototype.setCurrentTime = function setCurrentTime(seconds) {\n    try {\n      this.el_.currentTime = seconds;\n    } catch (e) {\n      log$1(e, 'Video is not ready. (Video.js)');\n      // this.warning(VideoJS.warnings.videoNotReady);\n    }\n  };\n\n  /**\n   * Get the current duration of the HTML5 media element.\n   *\n   * @return {number}\n   *         The duration of the media or 0 if there is no duration.\n   */\n\n\n  Html5.prototype.duration = function duration() {\n    var _this3 = this;\n\n    // Android Chrome will report duration as Infinity for VOD HLS until after\n    // playback has started, which triggers the live display erroneously.\n    // Return NaN if playback has not started and trigger a durationupdate once\n    // the duration can be reliably known.\n    if (this.el_.duration === Infinity && IS_ANDROID && IS_CHROME && this.el_.currentTime === 0) {\n      // Wait for the first `timeupdate` with currentTime > 0 - there may be\n      // several with 0\n      var checkProgress = function checkProgress() {\n        if (_this3.el_.currentTime > 0) {\n          // Trigger durationchange for genuinely live video\n          if (_this3.el_.duration === Infinity) {\n            _this3.trigger('durationchange');\n          }\n          _this3.off('timeupdate', checkProgress);\n        }\n      };\n\n      this.on('timeupdate', checkProgress);\n      return NaN;\n    }\n    return this.el_.duration || NaN;\n  };\n\n  /**\n   * Get the current width of the HTML5 media element.\n   *\n   * @return {number}\n   *         The width of the HTML5 media element.\n   */\n\n\n  Html5.prototype.width = function width() {\n    return this.el_.offsetWidth;\n  };\n\n  /**\n   * Get the current height of the HTML5 media element.\n   *\n   * @return {number}\n   *         The heigth of the HTML5 media element.\n   */\n\n\n  Html5.prototype.height = function height() {\n    return this.el_.offsetHeight;\n  };\n\n  /**\n   * Proxy iOS `webkitbeginfullscreen` and `webkitendfullscreen` into\n   * `fullscreenchange` event.\n   *\n   * @private\n   * @fires fullscreenchange\n   * @listens webkitendfullscreen\n   * @listens webkitbeginfullscreen\n   * @listens webkitbeginfullscreen\n   */\n\n\n  Html5.prototype.proxyWebkitFullscreen_ = function proxyWebkitFullscreen_() {\n    var _this4 = this;\n\n    if (!('webkitDisplayingFullscreen' in this.el_)) {\n      return;\n    }\n\n    var endFn = function endFn() {\n      this.trigger('fullscreenchange', { isFullscreen: false });\n    };\n\n    var beginFn = function beginFn() {\n      if ('webkitPresentationMode' in this.el_ && this.el_.webkitPresentationMode !== 'picture-in-picture') {\n        this.one('webkitendfullscreen', endFn);\n\n        this.trigger('fullscreenchange', { isFullscreen: true });\n      }\n    };\n\n    this.on('webkitbeginfullscreen', beginFn);\n    this.on('dispose', function () {\n      _this4.off('webkitbeginfullscreen', beginFn);\n      _this4.off('webkitendfullscreen', endFn);\n    });\n  };\n\n  /**\n   * Check if fullscreen is supported on the current playback device.\n   *\n   * @return {boolean}\n   *         - True if fullscreen is supported.\n   *         - False if fullscreen is not supported.\n   */\n\n\n  Html5.prototype.supportsFullScreen = function supportsFullScreen() {\n    if (typeof this.el_.webkitEnterFullScreen === 'function') {\n      var userAgent = window.navigator && window.navigator.userAgent || '';\n\n      // Seems to be broken in Chromium/Chrome && Safari in Leopard\n      if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  /**\n   * Request that the `HTML5` Tech enter fullscreen.\n   */\n\n\n  Html5.prototype.enterFullScreen = function enterFullScreen() {\n    var video = this.el_;\n\n    if (video.paused && video.networkState <= video.HAVE_METADATA) {\n      // attempt to prime the video element for programmatic access\n      // this isn't necessary on the desktop but shouldn't hurt\n      this.el_.play();\n\n      // playing and pausing synchronously during the transition to fullscreen\n      // can get iOS ~6.1 devices into a play/pause loop\n      this.setTimeout(function () {\n        video.pause();\n        video.webkitEnterFullScreen();\n      }, 0);\n    } else {\n      video.webkitEnterFullScreen();\n    }\n  };\n\n  /**\n   * Request that the `HTML5` Tech exit fullscreen.\n   */\n\n\n  Html5.prototype.exitFullScreen = function exitFullScreen() {\n    this.el_.webkitExitFullScreen();\n  };\n\n  /**\n   * A getter/setter for the `Html5` Tech's source object.\n   * > Note: Please use {@link Html5#setSource}\n   *\n   * @param {Tech~SourceObject} [src]\n   *        The source object you want to set on the `HTML5` techs element.\n   *\n   * @return {Tech~SourceObject|undefined}\n   *         - The current source object when a source is not passed in.\n   *         - undefined when setting\n   *\n   * @deprecated Since version 5.\n   */\n\n\n  Html5.prototype.src = function src(_src) {\n    if (_src === undefined) {\n      return this.el_.src;\n    }\n\n    // Setting src through `src` instead of `setSrc` will be deprecated\n    this.setSrc(_src);\n  };\n\n  /**\n   * Reset the tech by removing all sources and then calling\n   * {@link Html5.resetMediaElement}.\n   */\n\n\n  Html5.prototype.reset = function reset() {\n    Html5.resetMediaElement(this.el_);\n  };\n\n  /**\n   * Get the current source on the `HTML5` Tech. Falls back to returning the source from\n   * the HTML5 media element.\n   *\n   * @return {Tech~SourceObject}\n   *         The current source object from the HTML5 tech. With a fallback to the\n   *         elements source.\n   */\n\n\n  Html5.prototype.currentSrc = function currentSrc() {\n    if (this.currentSource_) {\n      return this.currentSource_.src;\n    }\n    return this.el_.currentSrc;\n  };\n\n  /**\n   * Set controls attribute for the HTML5 media Element.\n   *\n   * @param {string} val\n   *        Value to set the controls attribute to\n   */\n\n\n  Html5.prototype.setControls = function setControls(val) {\n    this.el_.controls = !!val;\n  };\n\n  /**\n   * Create and returns a remote {@link TextTrack} object.\n   *\n   * @param {string} kind\n   *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata)\n   *\n   * @param {string} [label]\n   *        Label to identify the text track\n   *\n   * @param {string} [language]\n   *        Two letter language abbreviation\n   *\n   * @return {TextTrack}\n   *         The TextTrack that gets created.\n   */\n\n\n  Html5.prototype.addTextTrack = function addTextTrack(kind, label, language) {\n    if (!this.featuresNativeTextTracks) {\n      return _Tech.prototype.addTextTrack.call(this, kind, label, language);\n    }\n\n    return this.el_.addTextTrack(kind, label, language);\n  };\n\n  /**\n   * Creates either native TextTrack or an emulated TextTrack depending\n   * on the value of `featuresNativeTextTracks`\n   *\n   * @param {Object} options\n   *        The object should contain the options to intialize the TextTrack with.\n   *\n   * @param {string} [options.kind]\n   *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata).\n   *\n   * @param {string} [options.label].\n   *        Label to identify the text track\n   *\n   * @param {string} [options.language]\n   *        Two letter language abbreviation.\n   *\n   * @param {boolean} [options.default]\n   *        Default this track to on.\n   *\n   * @param {string} [options.id]\n   *        The internal id to assign this track.\n   *\n   * @param {string} [options.src]\n   *        A source url for the track.\n   *\n   * @return {HTMLTrackElement}\n   *         The track element that gets created.\n   */\n\n\n  Html5.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) {\n    if (!this.featuresNativeTextTracks) {\n      return _Tech.prototype.createRemoteTextTrack.call(this, options);\n    }\n    var htmlTrackElement = document.createElement('track');\n\n    if (options.kind) {\n      htmlTrackElement.kind = options.kind;\n    }\n    if (options.label) {\n      htmlTrackElement.label = options.label;\n    }\n    if (options.language || options.srclang) {\n      htmlTrackElement.srclang = options.language || options.srclang;\n    }\n    if (options['default']) {\n      htmlTrackElement['default'] = options['default'];\n    }\n    if (options.id) {\n      htmlTrackElement.id = options.id;\n    }\n    if (options.src) {\n      htmlTrackElement.src = options.src;\n    }\n\n    return htmlTrackElement;\n  };\n\n  /**\n   * Creates a remote text track object and returns an html track element.\n   *\n   * @param {Object} options The object should contain values for\n   * kind, language, label, and src (location of the WebVTT file)\n   * @param {Boolean} [manualCleanup=true] if set to false, the TextTrack will be\n   * automatically removed from the video element whenever the source changes\n   * @return {HTMLTrackElement} An Html Track Element.\n   * This can be an emulated {@link HTMLTrackElement} or a native one.\n   * @deprecated The default value of the \"manualCleanup\" parameter will default\n   * to \"false\" in upcoming versions of Video.js\n   */\n\n\n  Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) {\n    var htmlTrackElement = _Tech.prototype.addRemoteTextTrack.call(this, options, manualCleanup);\n\n    if (this.featuresNativeTextTracks) {\n      this.el().appendChild(htmlTrackElement);\n    }\n\n    return htmlTrackElement;\n  };\n\n  /**\n   * Remove remote `TextTrack` from `TextTrackList` object\n   *\n   * @param {TextTrack} track\n   *        `TextTrack` object to remove\n   */\n\n\n  Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {\n    _Tech.prototype.removeRemoteTextTrack.call(this, track);\n\n    if (this.featuresNativeTextTracks) {\n      var tracks = this.$$('track');\n\n      var i = tracks.length;\n\n      while (i--) {\n        if (track === tracks[i] || track === tracks[i].track) {\n          this.el().removeChild(tracks[i]);\n        }\n      }\n    }\n  };\n\n  /**\n   * Gets available media playback quality metrics as specified by the W3C's Media\n   * Playback Quality API.\n   *\n   * @see [Spec]{@link https://wicg.github.io/media-playback-quality}\n   *\n   * @return {Object}\n   *         An object with supported media playback quality metrics\n   */\n\n\n  Html5.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() {\n    if (typeof this.el().getVideoPlaybackQuality === 'function') {\n      return this.el().getVideoPlaybackQuality();\n    }\n\n    var videoPlaybackQuality = {};\n\n    if (typeof this.el().webkitDroppedFrameCount !== 'undefined' && typeof this.el().webkitDecodedFrameCount !== 'undefined') {\n      videoPlaybackQuality.droppedVideoFrames = this.el().webkitDroppedFrameCount;\n      videoPlaybackQuality.totalVideoFrames = this.el().webkitDecodedFrameCount;\n    }\n\n    if (window.performance && typeof window.performance.now === 'function') {\n      videoPlaybackQuality.creationTime = window.performance.now();\n    } else if (window.performance && window.performance.timing && typeof window.performance.timing.navigationStart === 'number') {\n      videoPlaybackQuality.creationTime = window.Date.now() - window.performance.timing.navigationStart;\n    }\n\n    return videoPlaybackQuality;\n  };\n\n  return Html5;\n}(Tech);\n\n/* HTML5 Support Testing ---------------------------------------------------- */\n\nif (isReal()) {\n\n  /**\n   * Element for testing browser HTML5 media capabilities\n   *\n   * @type {Element}\n   * @constant\n   * @private\n   */\n  Html5.TEST_VID = document.createElement('video');\n  var track = document.createElement('track');\n\n  track.kind = 'captions';\n  track.srclang = 'en';\n  track.label = 'English';\n  Html5.TEST_VID.appendChild(track);\n}\n\n/**\n * Check if HTML5 media is supported by this browser/device.\n *\n * @return {boolean}\n *         - True if HTML5 media is supported.\n *         - False if HTML5 media is not supported.\n */\nHtml5.isSupported = function () {\n  // IE9 with no Media Player is a LIAR! (#984)\n  try {\n    Html5.TEST_VID.volume = 0.5;\n  } catch (e) {\n    return false;\n  }\n\n  return !!(Html5.TEST_VID && Html5.TEST_VID.canPlayType);\n};\n\n/**\n * Check if the tech can support the given type\n *\n * @param {string} type\n *        The mimetype to check\n * @return {string} 'probably', 'maybe', or '' (empty string)\n */\nHtml5.canPlayType = function (type) {\n  return Html5.TEST_VID.canPlayType(type);\n};\n\n/**\n * Check if the tech can support the given source\n * @param {Object} srcObj\n *        The source object\n * @param {Object} options\n *        The options passed to the tech\n * @return {string} 'probably', 'maybe', or '' (empty string)\n */\nHtml5.canPlaySource = function (srcObj, options) {\n  return Html5.canPlayType(srcObj.type);\n};\n\n/**\n * Check if the volume can be changed in this browser/device.\n * Volume cannot be changed in a lot of mobile devices.\n * Specifically, it can't be changed from 1 on iOS.\n *\n * @return {boolean}\n *         - True if volume can be controlled\n *         - False otherwise\n */\nHtml5.canControlVolume = function () {\n  // IE will error if Windows Media Player not installed #3315\n  try {\n    var volume = Html5.TEST_VID.volume;\n\n    Html5.TEST_VID.volume = volume / 2 + 0.1;\n    return volume !== Html5.TEST_VID.volume;\n  } catch (e) {\n    return false;\n  }\n};\n\n/**\n * Check if the volume can be muted in this browser/device.\n * Some devices, e.g. iOS, don't allow changing volume\n * but permits muting/unmuting.\n *\n * @return {bolean}\n *      - True if volume can be muted\n *      - False otherwise\n */\nHtml5.canMuteVolume = function () {\n  try {\n    var muted = Html5.TEST_VID.muted;\n\n    // in some versions of iOS muted property doesn't always\n    // work, so we want to set both property and attribute\n    Html5.TEST_VID.muted = !muted;\n    if (Html5.TEST_VID.muted) {\n      setAttribute(Html5.TEST_VID, 'muted', 'muted');\n    } else {\n      removeAttribute(Html5.TEST_VID, 'muted', 'muted');\n    }\n    return muted !== Html5.TEST_VID.muted;\n  } catch (e) {\n    return false;\n  }\n};\n\n/**\n * Check if the playback rate can be changed in this browser/device.\n *\n * @return {boolean}\n *         - True if playback rate can be controlled\n *         - False otherwise\n */\nHtml5.canControlPlaybackRate = function () {\n  // Playback rate API is implemented in Android Chrome, but doesn't do anything\n  // https://github.com/videojs/video.js/issues/3180\n  if (IS_ANDROID && IS_CHROME && CHROME_VERSION < 58) {\n    return false;\n  }\n  // IE will error if Windows Media Player not installed #3315\n  try {\n    var playbackRate = Html5.TEST_VID.playbackRate;\n\n    Html5.TEST_VID.playbackRate = playbackRate / 2 + 0.1;\n    return playbackRate !== Html5.TEST_VID.playbackRate;\n  } catch (e) {\n    return false;\n  }\n};\n\n/**\n * Check if we can override a video/audio elements attributes, with\n * Object.defineProperty.\n *\n * @return {boolean}\n *         - True if builtin attributes can be overriden\n *         - False otherwise\n */\nHtml5.canOverrideAttributes = function () {\n  if (IS_IE8) {\n    return false;\n  }\n  // if we cannot overwrite the src/innerHTML property, there is no support\n  // iOS 7 safari for instance cannot do this.\n  try {\n    var noop = function noop() {};\n\n    Object.defineProperty(document.createElement('video'), 'src', { get: noop, set: noop });\n    Object.defineProperty(document.createElement('audio'), 'src', { get: noop, set: noop });\n    Object.defineProperty(document.createElement('video'), 'innerHTML', { get: noop, set: noop });\n    Object.defineProperty(document.createElement('audio'), 'innerHTML', { get: noop, set: noop });\n  } catch (e) {\n    return false;\n  }\n\n  return true;\n};\n\n/**\n * Check to see if native `TextTrack`s are supported by this browser/device.\n *\n * @return {boolean}\n *         - True if native `TextTrack`s are supported.\n *         - False otherwise\n */\nHtml5.supportsNativeTextTracks = function () {\n  return IS_ANY_SAFARI || IS_IOS && IS_CHROME;\n};\n\n/**\n * Check to see if native `VideoTrack`s are supported by this browser/device\n *\n * @return {boolean}\n *        - True if native `VideoTrack`s are supported.\n *        - False otherwise\n */\nHtml5.supportsNativeVideoTracks = function () {\n  return !!(Html5.TEST_VID && Html5.TEST_VID.videoTracks);\n};\n\n/**\n * Check to see if native `AudioTrack`s are supported by this browser/device\n *\n * @return {boolean}\n *        - True if native `AudioTrack`s are supported.\n *        - False otherwise\n */\nHtml5.supportsNativeAudioTracks = function () {\n  return !!(Html5.TEST_VID && Html5.TEST_VID.audioTracks);\n};\n\n/**\n * An array of events available on the Html5 tech.\n *\n * @private\n * @type {Array}\n */\nHtml5.Events = ['loadstart', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange', 'timeupdate', 'progress', 'play', 'pause', 'ratechange', 'resize', 'volumechange'];\n\n/**\n * Boolean indicating whether the `Tech` supports volume control.\n *\n * @type {boolean}\n * @default {@link Html5.canControlVolume}\n */\nHtml5.prototype.featuresVolumeControl = Html5.canControlVolume();\n\n/**\n * Boolean indicating whether the `Tech` supports muting volume.\n *\n * @type {bolean}\n * @default {@link Html5.canMuteVolume}\n */\nHtml5.prototype.featuresMuteControl = Html5.canMuteVolume();\n\n/**\n * Boolean indicating whether the `Tech` supports changing the speed at which the media\n * plays. Examples:\n *   - Set player to play 2x (twice) as fast\n *   - Set player to play 0.5x (half) as fast\n *\n * @type {boolean}\n * @default {@link Html5.canControlPlaybackRate}\n */\nHtml5.prototype.featuresPlaybackRate = Html5.canControlPlaybackRate();\n\n/**\n * Boolean indicating wether the `Tech` supports the `sourceset` event.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.featuresSourceset = Html5.canOverrideAttributes();\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports the media element\n * moving in the DOM. iOS breaks if you move the media element, so this is set this to\n * false there. Everywhere else this should be true.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.movingMediaElementInDOM = !IS_IOS;\n\n// TODO: Previous comment: No longer appears to be used. Can probably be removed.\n//       Is this true?\n/**\n * Boolean indicating whether the `HTML5` tech currently supports automatic media resize\n * when going into fullscreen.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.featuresFullscreenResize = true;\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports the progress event.\n * If this is false, manual `progress` events will be triggred instead.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.featuresProgressEvents = true;\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports the timeupdate event.\n * If this is false, manual `timeupdate` events will be triggred instead.\n *\n * @default\n */\nHtml5.prototype.featuresTimeupdateEvents = true;\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports native `TextTrack`s.\n *\n * @type {boolean}\n * @default {@link Html5.supportsNativeTextTracks}\n */\nHtml5.prototype.featuresNativeTextTracks = Html5.supportsNativeTextTracks();\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports native `VideoTrack`s.\n *\n * @type {boolean}\n * @default {@link Html5.supportsNativeVideoTracks}\n */\nHtml5.prototype.featuresNativeVideoTracks = Html5.supportsNativeVideoTracks();\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports native `AudioTrack`s.\n *\n * @type {boolean}\n * @default {@link Html5.supportsNativeAudioTracks}\n */\nHtml5.prototype.featuresNativeAudioTracks = Html5.supportsNativeAudioTracks();\n\n// HTML5 Feature detection and Device Fixes --------------------------------- //\nvar canPlayType = Html5.TEST_VID && Html5.TEST_VID.constructor.prototype.canPlayType;\nvar mpegurlRE = /^application\\/(?:x-|vnd\\.apple\\.)mpegurl/i;\nvar mp4RE = /^video\\/mp4/i;\n\nHtml5.patchCanPlayType = function () {\n\n  // Android 4.0 and above can play HLS to some extent but it reports being unable to do so\n  // Firefox and Chrome report correctly\n  if (ANDROID_VERSION >= 4.0 && !IS_FIREFOX && !IS_CHROME) {\n    Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {\n      if (type && mpegurlRE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n\n    // Override Android 2.2 and less canPlayType method which is broken\n  } else if (IS_OLD_ANDROID) {\n    Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {\n      if (type && mp4RE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n  }\n};\n\nHtml5.unpatchCanPlayType = function () {\n  var r = Html5.TEST_VID.constructor.prototype.canPlayType;\n\n  Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;\n  return r;\n};\n\n// by default, patch the media element\nHtml5.patchCanPlayType();\n\nHtml5.disposeMediaElement = function (el) {\n  if (!el) {\n    return;\n  }\n\n  if (el.parentNode) {\n    el.parentNode.removeChild(el);\n  }\n\n  // remove any child track or source nodes to prevent their loading\n  while (el.hasChildNodes()) {\n    el.removeChild(el.firstChild);\n  }\n\n  // remove any src reference. not setting `src=''` because that causes a warning\n  // in firefox\n  el.removeAttribute('src');\n\n  // force the media element to update its loading state by calling load()\n  // however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)\n  if (typeof el.load === 'function') {\n    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)\n    (function () {\n      try {\n        el.load();\n      } catch (e) {\n        // not supported\n      }\n    })();\n  }\n};\n\nHtml5.resetMediaElement = function (el) {\n  if (!el) {\n    return;\n  }\n\n  var sources = el.querySelectorAll('source');\n  var i = sources.length;\n\n  while (i--) {\n    el.removeChild(sources[i]);\n  }\n\n  // remove any src reference.\n  // not setting `src=''` because that throws an error\n  el.removeAttribute('src');\n\n  if (typeof el.load === 'function') {\n    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)\n    (function () {\n      try {\n        el.load();\n      } catch (e) {\n        // satisfy linter\n      }\n    })();\n  }\n};\n\n/* Native HTML5 element property wrapping ----------------------------------- */\n// Wrap native boolean attributes with getters that check both property and attribute\n// The list is as followed:\n// muted, defaultMuted, autoplay, controls, loop, playsinline\n[\n/**\n * Get the value of `muted` from the media element. `muted` indicates\n * that the volume for the media should be set to silent. This does not actually change\n * the `volume` attribute.\n *\n * @method Html5#muted\n * @return {boolean}\n *         - True if the value of `volume` should be ignored and the audio set to silent.\n *         - False if the value of `volume` should be used.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-muted}\n */\n'muted',\n\n/**\n * Get the value of `defaultMuted` from the media element. `defaultMuted` indicates\n * whether the media should start muted or not. Only changes the default state of the\n * media. `muted` and `defaultMuted` can have different values. {@link Html5#muted} indicates the\n * current state.\n *\n * @method Html5#defaultMuted\n * @return {boolean}\n *         - The value of `defaultMuted` from the media element.\n *         - True indicates that the media should start muted.\n *         - False indicates that the media should not start muted\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-defaultmuted}\n */\n'defaultMuted',\n\n/**\n * Get the value of `autoplay` from the media element. `autoplay` indicates\n * that the media should start to play as soon as the page is ready.\n *\n * @method Html5#autoplay\n * @return {boolean}\n *         - The value of `autoplay` from the media element.\n *         - True indicates that the media should start as soon as the page loads.\n *         - False indicates that the media should not start as soon as the page loads.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-autoplay}\n */\n'autoplay',\n\n/**\n * Get the value of `controls` from the media element. `controls` indicates\n * whether the native media controls should be shown or hidden.\n *\n * @method Html5#controls\n * @return {boolean}\n *         - The value of `controls` from the media element.\n *         - True indicates that native controls should be showing.\n *         - False indicates that native controls should be hidden.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-controls}\n */\n'controls',\n\n/**\n * Get the value of `loop` from the media element. `loop` indicates\n * that the media should return to the start of the media and continue playing once\n * it reaches the end.\n *\n * @method Html5#loop\n * @return {boolean}\n *         - The value of `loop` from the media element.\n *         - True indicates that playback should seek back to start once\n *           the end of a media is reached.\n *         - False indicates that playback should not loop back to the start when the\n *           end of the media is reached.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-loop}\n */\n'loop',\n\n/**\n * Get the value of `playsinline` from the media element. `playsinline` indicates\n * to the browser that non-fullscreen playback is preferred when fullscreen\n * playback is the native default, such as in iOS Safari.\n *\n * @method Html5#playsinline\n * @return {boolean}\n *         - The value of `playsinline` from the media element.\n *         - True indicates that the media should play inline.\n *         - False indicates that the media should not play inline.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/#attr-video-playsinline}\n */\n'playsinline'].forEach(function (prop) {\n  Html5.prototype[prop] = function () {\n    return this.el_[prop] || this.el_.hasAttribute(prop);\n  };\n});\n\n// Wrap native boolean attributes with setters that set both property and attribute\n// The list is as followed:\n// setMuted, setDefaultMuted, setAutoplay, setLoop, setPlaysinline\n// setControls is special-cased above\n[\n/**\n * Set the value of `muted` on the media element. `muted` indicates that the current\n * audio level should be silent.\n *\n * @method Html5#setMuted\n * @param {boolean} muted\n *        - True if the audio should be set to silent\n *        - False otherwise\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-muted}\n */\n'muted',\n\n/**\n * Set the value of `defaultMuted` on the media element. `defaultMuted` indicates that the current\n * audio level should be silent, but will only effect the muted level on intial playback..\n *\n * @method Html5.prototype.setDefaultMuted\n * @param {boolean} defaultMuted\n *        - True if the audio should be set to silent\n *        - False otherwise\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-defaultmuted}\n */\n'defaultMuted',\n\n/**\n * Set the value of `autoplay` on the media element. `autoplay` indicates\n * that the media should start to play as soon as the page is ready.\n *\n * @method Html5#setAutoplay\n * @param {boolean} autoplay\n *         - True indicates that the media should start as soon as the page loads.\n *         - False indicates that the media should not start as soon as the page loads.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-autoplay}\n */\n'autoplay',\n\n/**\n * Set the value of `loop` on the media element. `loop` indicates\n * that the media should return to the start of the media and continue playing once\n * it reaches the end.\n *\n * @method Html5#setLoop\n * @param {boolean} loop\n *         - True indicates that playback should seek back to start once\n *           the end of a media is reached.\n *         - False indicates that playback should not loop back to the start when the\n *           end of the media is reached.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-loop}\n */\n'loop',\n\n/**\n * Set the value of `playsinline` from the media element. `playsinline` indicates\n * to the browser that non-fullscreen playback is preferred when fullscreen\n * playback is the native default, such as in iOS Safari.\n *\n * @method Html5#setPlaysinline\n * @param {boolean} playsinline\n *         - True indicates that the media should play inline.\n *         - False indicates that the media should not play inline.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/#attr-video-playsinline}\n */\n'playsinline'].forEach(function (prop) {\n  Html5.prototype['set' + toTitleCase(prop)] = function (v) {\n    this.el_[prop] = v;\n\n    if (v) {\n      this.el_.setAttribute(prop, prop);\n    } else {\n      this.el_.removeAttribute(prop);\n    }\n  };\n});\n\n// Wrap native properties with a getter\n// The list is as followed\n// paused, currentTime, buffered, volume, poster, preload, error, seeking\n// seekable, ended, playbackRate, defaultPlaybackRate, played, networkState\n// readyState, videoWidth, videoHeight\n[\n/**\n * Get the value of `paused` from the media element. `paused` indicates whether the media element\n * is currently paused or not.\n *\n * @method Html5#paused\n * @return {boolean}\n *         The value of `paused` from the media element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-paused}\n */\n'paused',\n\n/**\n * Get the value of `currentTime` from the media element. `currentTime` indicates\n * the current second that the media is at in playback.\n *\n * @method Html5#currentTime\n * @return {number}\n *         The value of `currentTime` from the media element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-currenttime}\n */\n'currentTime',\n\n/**\n * Get the value of `buffered` from the media element. `buffered` is a `TimeRange`\n * object that represents the parts of the media that are already downloaded and\n * available for playback.\n *\n * @method Html5#buffered\n * @return {TimeRange}\n *         The value of `buffered` from the media element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-buffered}\n */\n'buffered',\n\n/**\n * Get the value of `volume` from the media element. `volume` indicates\n * the current playback volume of audio for a media. `volume` will be a value from 0\n * (silent) to 1 (loudest and default).\n *\n * @method Html5#volume\n * @return {number}\n *         The value of `volume` from the media element. Value will be between 0-1.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-a-volume}\n */\n'volume',\n\n/**\n * Get the value of `poster` from the media element. `poster` indicates\n * that the url of an image file that can/will be shown when no media data is available.\n *\n * @method Html5#poster\n * @return {string}\n *         The value of `poster` from the media element. Value will be a url to an\n *         image.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-video-poster}\n */\n'poster',\n\n/**\n * Get the value of `preload` from the media element. `preload` indicates\n * what should download before the media is interacted with. It can have the following\n * values:\n * - none: nothing should be downloaded\n * - metadata: poster and the first few frames of the media may be downloaded to get\n *   media dimensions and other metadata\n * - auto: allow the media and metadata for the media to be downloaded before\n *    interaction\n *\n * @method Html5#preload\n * @return {string}\n *         The value of `preload` from the media element. Will be 'none', 'metadata',\n *         or 'auto'.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-preload}\n */\n'preload',\n\n/**\n * Get the value of the `error` from the media element. `error` indicates any\n * MediaError that may have occured during playback. If error returns null there is no\n * current error.\n *\n * @method Html5#error\n * @return {MediaError|null}\n *         The value of `error` from the media element. Will be `MediaError` if there\n *         is a current error and null otherwise.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-error}\n */\n'error',\n\n/**\n * Get the value of `seeking` from the media element. `seeking` indicates whether the\n * media is currently seeking to a new position or not.\n *\n * @method Html5#seeking\n * @return {boolean}\n *         - The value of `seeking` from the media element.\n *         - True indicates that the media is currently seeking to a new position.\n *         - Flase indicates that the media is not seeking to a new position at this time.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-seeking}\n */\n'seeking',\n\n/**\n * Get the value of `seekable` from the media element. `seekable` returns a\n * `TimeRange` object indicating ranges of time that can currently be `seeked` to.\n *\n * @method Html5#seekable\n * @return {TimeRange}\n *         The value of `seekable` from the media element. A `TimeRange` object\n *         indicating the current ranges of time that can be seeked to.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-seekable}\n */\n'seekable',\n\n/**\n * Get the value of `ended` from the media element. `ended` indicates whether\n * the media has reached the end or not.\n *\n * @method Html5#ended\n * @return {boolean}\n *         - The value of `ended` from the media element.\n *         - True indicates that the media has ended.\n *         - False indicates that the media has not ended.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-ended}\n */\n'ended',\n\n/**\n * Get the value of `playbackRate` from the media element. `playbackRate` indicates\n * the rate at which the media is currently playing back. Examples:\n *   - if playbackRate is set to 2, media will play twice as fast.\n *   - if playbackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5#playbackRate\n * @return {number}\n *         The value of `playbackRate` from the media element. A number indicating\n *         the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-playbackrate}\n */\n'playbackRate',\n\n/**\n * Get the value of `defaultPlaybackRate` from the media element. `defaultPlaybackRate` indicates\n * the rate at which the media is currently playing back. This value will not indicate the current\n * `playbackRate` after playback has started, use {@link Html5#playbackRate} for that.\n *\n * Examples:\n *   - if defaultPlaybackRate is set to 2, media will play twice as fast.\n *   - if defaultPlaybackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5.prototype.defaultPlaybackRate\n * @return {number}\n *         The value of `defaultPlaybackRate` from the media element. A number indicating\n *         the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-playbackrate}\n */\n'defaultPlaybackRate',\n\n/**\n * Get the value of `played` from the media element. `played` returns a `TimeRange`\n * object representing points in the media timeline that have been played.\n *\n * @method Html5#played\n * @return {TimeRange}\n *         The value of `played` from the media element. A `TimeRange` object indicating\n *         the ranges of time that have been played.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-played}\n */\n'played',\n\n/**\n * Get the value of `networkState` from the media element. `networkState` indicates\n * the current network state. It returns an enumeration from the following list:\n * - 0: NETWORK_EMPTY\n * - 1: NEWORK_IDLE\n * - 2: NETWORK_LOADING\n * - 3: NETWORK_NO_SOURCE\n *\n * @method Html5#networkState\n * @return {number}\n *         The value of `networkState` from the media element. This will be a number\n *         from the list in the description.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-networkstate}\n */\n'networkState',\n\n/**\n * Get the value of `readyState` from the media element. `readyState` indicates\n * the current state of the media element. It returns an enumeration from the\n * following list:\n * - 0: HAVE_NOTHING\n * - 1: HAVE_METADATA\n * - 2: HAVE_CURRENT_DATA\n * - 3: HAVE_FUTURE_DATA\n * - 4: HAVE_ENOUGH_DATA\n *\n * @method Html5#readyState\n * @return {number}\n *         The value of `readyState` from the media element. This will be a number\n *         from the list in the description.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#ready-states}\n */\n'readyState',\n\n/**\n * Get the value of `videoWidth` from the video element. `videoWidth` indicates\n * the current width of the video in css pixels.\n *\n * @method Html5#videoWidth\n * @return {number}\n *         The value of `videoWidth` from the video element. This will be a number\n *         in css pixels.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-video-videowidth}\n */\n'videoWidth',\n\n/**\n * Get the value of `videoHeight` from the video element. `videoHeigth` indicates\n * the current height of the video in css pixels.\n *\n * @method Html5#videoHeight\n * @return {number}\n *         The value of `videoHeight` from the video element. This will be a number\n *         in css pixels.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-video-videowidth}\n */\n'videoHeight'].forEach(function (prop) {\n  Html5.prototype[prop] = function () {\n    return this.el_[prop];\n  };\n});\n\n// Wrap native properties with a setter in this format:\n// set + toTitleCase(name)\n// The list is as follows:\n// setVolume, setSrc, setPoster, setPreload, setPlaybackRate, setDefaultPlaybackRate\n[\n/**\n * Set the value of `volume` on the media element. `volume` indicates the current\n * audio level as a percentage in decimal form. This means that 1 is 100%, 0.5 is 50%, and\n * so on.\n *\n * @method Html5#setVolume\n * @param {number} percentAsDecimal\n *        The volume percent as a decimal. Valid range is from 0-1.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-a-volume}\n */\n'volume',\n\n/**\n * Set the value of `src` on the media element. `src` indicates the current\n * {@link Tech~SourceObject} for the media.\n *\n * @method Html5#setSrc\n * @param {Tech~SourceObject} src\n *        The source object to set as the current source.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-src}\n */\n'src',\n\n/**\n * Set the value of `poster` on the media element. `poster` is the url to\n * an image file that can/will be shown when no media data is available.\n *\n * @method Html5#setPoster\n * @param {string} poster\n *        The url to an image that should be used as the `poster` for the media\n *        element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-poster}\n */\n'poster',\n\n/**\n * Set the value of `preload` on the media element. `preload` indicates\n * what should download before the media is interacted with. It can have the following\n * values:\n * - none: nothing should be downloaded\n * - metadata: poster and the first few frames of the media may be downloaded to get\n *   media dimensions and other metadata\n * - auto: allow the media and metadata for the media to be downloaded before\n *    interaction\n *\n * @method Html5#setPreload\n * @param {string} preload\n *         The value of `preload` to set on the media element. Must be 'none', 'metadata',\n *         or 'auto'.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-preload}\n */\n'preload',\n\n/**\n * Set the value of `playbackRate` on the media element. `playbackRate` indicates\n * the rate at which the media should play back. Examples:\n *   - if playbackRate is set to 2, media will play twice as fast.\n *   - if playbackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5#setPlaybackRate\n * @return {number}\n *         The value of `playbackRate` from the media element. A number indicating\n *         the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-playbackrate}\n */\n'playbackRate',\n\n/**\n * Set the value of `defaultPlaybackRate` on the media element. `defaultPlaybackRate` indicates\n * the rate at which the media should play back upon initial startup. Changing this value\n * after a video has started will do nothing. Instead you should used {@link Html5#setPlaybackRate}.\n *\n * Example Values:\n *   - if playbackRate is set to 2, media will play twice as fast.\n *   - if playbackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5.prototype.setDefaultPlaybackRate\n * @return {number}\n *         The value of `defaultPlaybackRate` from the media element. A number indicating\n *         the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-defaultplaybackrate}\n */\n'defaultPlaybackRate'].forEach(function (prop) {\n  Html5.prototype['set' + toTitleCase(prop)] = function (v) {\n    this.el_[prop] = v;\n  };\n});\n\n// wrap native functions with a function\n// The list is as follows:\n// pause, load play\n[\n/**\n * A wrapper around the media elements `pause` function. This will call the `HTML5`\n * media elements `pause` function.\n *\n * @method Html5#pause\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-pause}\n */\n'pause',\n\n/**\n * A wrapper around the media elements `load` function. This will call the `HTML5`s\n * media element `load` function.\n *\n * @method Html5#load\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-load}\n */\n'load',\n\n/**\n * A wrapper around the media elements `play` function. This will call the `HTML5`s\n * media element `play` function.\n *\n * @method Html5#play\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-play}\n */\n'play'].forEach(function (prop) {\n  Html5.prototype[prop] = function () {\n    return this.el_[prop]();\n  };\n});\n\nTech.withSourceHandlers(Html5);\n\n/**\n * Native source handler for Html5, simply passes the source to the media element.\n *\n * @proprety {Tech~SourceObject} source\n *        The source object\n *\n * @proprety {Html5} tech\n *        The instance of the HTML5 tech.\n */\nHtml5.nativeSourceHandler = {};\n\n/**\n * Check if the media element can play the given mime type.\n *\n * @param {string} type\n *        The mimetype to check\n *\n * @return {string}\n *         'probably', 'maybe', or '' (empty string)\n */\nHtml5.nativeSourceHandler.canPlayType = function (type) {\n  // IE9 on Windows 7 without MediaPlayer throws an error here\n  // https://github.com/videojs/video.js/issues/519\n  try {\n    return Html5.TEST_VID.canPlayType(type);\n  } catch (e) {\n    return '';\n  }\n};\n\n/**\n * Check if the media element can handle a source natively.\n *\n * @param {Tech~SourceObject} source\n *         The source object\n *\n * @param {Object} [options]\n *         Options to be passed to the tech.\n *\n * @return {string}\n *         'probably', 'maybe', or '' (empty string).\n */\nHtml5.nativeSourceHandler.canHandleSource = function (source, options) {\n\n  // If a type was provided we should rely on that\n  if (source.type) {\n    return Html5.nativeSourceHandler.canPlayType(source.type);\n\n    // If no type, fall back to checking 'video/[EXTENSION]'\n  } else if (source.src) {\n    var ext = getFileExtension(source.src);\n\n    return Html5.nativeSourceHandler.canPlayType('video/' + ext);\n  }\n\n  return '';\n};\n\n/**\n * Pass the source to the native media element.\n *\n * @param {Tech~SourceObject} source\n *        The source object\n *\n * @param {Html5} tech\n *        The instance of the Html5 tech\n *\n * @param {Object} [options]\n *        The options to pass to the source\n */\nHtml5.nativeSourceHandler.handleSource = function (source, tech, options) {\n  tech.setSrc(source.src);\n};\n\n/**\n * A noop for the native dispose function, as cleanup is not needed.\n */\nHtml5.nativeSourceHandler.dispose = function () {};\n\n// Register the native source handler\nHtml5.registerSourceHandler(Html5.nativeSourceHandler);\n\nTech.registerTech('Html5', Html5);\n\nvar _templateObject$1 = taggedTemplateLiteralLoose(['\\n        Using the tech directly can be dangerous. I hope you know what you\\'re doing.\\n        See https://github.com/videojs/video.js/issues/2617 for more info.\\n      '], ['\\n        Using the tech directly can be dangerous. I hope you know what you\\'re doing.\\n        See https://github.com/videojs/video.js/issues/2617 for more info.\\n      ']);\n\n/**\n * @file player.js\n */\n// Subclasses Component\n// The following imports are used only to ensure that the corresponding modules\n// are always included in the video.js package. Importing the modules will\n// execute them and they will register themselves with video.js.\n// Import Html5 tech, at least for disposing the original video tag.\n// The following tech events are simply re-triggered\n// on the player when they happen\nvar TECH_EVENTS_RETRIGGER = [\n/**\n * Fired while the user agent is downloading media data.\n *\n * @event Player#progress\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `progress` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechProgress_\n * @fires Player#progress\n * @listens Tech#progress\n */\n'progress',\n\n/**\n * Fires when the loading of an audio/video is aborted.\n *\n * @event Player#abort\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `abort` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechAbort_\n * @fires Player#abort\n * @listens Tech#abort\n */\n'abort',\n\n/**\n * Fires when the browser is intentionally not getting media data.\n *\n * @event Player#suspend\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `suspend` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechSuspend_\n * @fires Player#suspend\n * @listens Tech#suspend\n */\n'suspend',\n\n/**\n * Fires when the current playlist is empty.\n *\n * @event Player#emptied\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `emptied` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechEmptied_\n * @fires Player#emptied\n * @listens Tech#emptied\n */\n'emptied',\n/**\n * Fires when the browser is trying to get media data, but data is not available.\n *\n * @event Player#stalled\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `stalled` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechStalled_\n * @fires Player#stalled\n * @listens Tech#stalled\n */\n'stalled',\n\n/**\n * Fires when the browser has loaded meta data for the audio/video.\n *\n * @event Player#loadedmetadata\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `stalled` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechLoadedmetadata_\n * @fires Player#loadedmetadata\n * @listens Tech#loadedmetadata\n */\n'loadedmetadata',\n\n/**\n * Fires when the browser has loaded the current frame of the audio/video.\n *\n * @event Player#loadeddata\n * @type {event}\n */\n/**\n * Retrigger the `loadeddata` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechLoaddeddata_\n * @fires Player#loadeddata\n * @listens Tech#loadeddata\n */\n'loadeddata',\n\n/**\n * Fires when the current playback position has changed.\n *\n * @event Player#timeupdate\n * @type {event}\n */\n/**\n * Retrigger the `timeupdate` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechTimeUpdate_\n * @fires Player#timeupdate\n * @listens Tech#timeupdate\n */\n'timeupdate',\n\n/**\n * Fires when the video's intrinsic dimensions change\n *\n * @event Player#resize\n * @type {event}\n */\n/**\n * Retrigger the `resize` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechResize_\n * @fires Player#resize\n * @listens Tech#resize\n */\n'resize',\n\n/**\n * Fires when the volume has been changed\n *\n * @event Player#volumechange\n * @type {event}\n */\n/**\n * Retrigger the `volumechange` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechVolumechange_\n * @fires Player#volumechange\n * @listens Tech#volumechange\n */\n'volumechange',\n\n/**\n * Fires when the text track has been changed\n *\n * @event Player#texttrackchange\n * @type {event}\n */\n/**\n * Retrigger the `texttrackchange` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechTexttrackchange_\n * @fires Player#texttrackchange\n * @listens Tech#texttrackchange\n */\n'texttrackchange'];\n\n// events to queue when playback rate is zero\n// this is a hash for the sole purpose of mapping non-camel-cased event names\n// to camel-cased function names\nvar TECH_EVENTS_QUEUE = {\n  canplay: 'CanPlay',\n  canplaythrough: 'CanPlayThrough',\n  playing: 'Playing',\n  seeked: 'Seeked'\n};\n\n/**\n * An instance of the `Player` class is created when any of the Video.js setup methods\n * are used to initialize a video.\n *\n * After an instance has been created it can be accessed globally in two ways:\n * 1. By calling `videojs('example_video_1');`\n * 2. By using it directly via  `videojs.players.example_video_1;`\n *\n * @extends Component\n */\n\nvar Player = function (_Component) {\n  inherits(Player, _Component);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Element} tag\n   *        The original video DOM element used for configuring options.\n   *\n   * @param {Object} [options]\n   *        Object of option names and values.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        Ready callback function.\n   */\n  function Player(tag, options, ready) {\n    classCallCheck(this, Player);\n\n    // Make sure tag ID exists\n    tag.id = tag.id || options.id || 'vjs_video_' + newGUID();\n\n    // Set Options\n    // The options argument overrides options set in the video tag\n    // which overrides globally set options.\n    // This latter part coincides with the load order\n    // (tag must exist before Player)\n    options = assign(Player.getTagSettings(tag), options);\n\n    // Delay the initialization of children because we need to set up\n    // player properties first, and can't use `this` before `super()`\n    options.initChildren = false;\n\n    // Same with creating the element\n    options.createEl = false;\n\n    // don't auto mixin the evented mixin\n    options.evented = false;\n\n    // we don't want the player to report touch activity on itself\n    // see enableTouchActivity in Component\n    options.reportTouchActivity = false;\n\n    // If language is not set, get the closest lang attribute\n    if (!options.language) {\n      if (typeof tag.closest === 'function') {\n        var closest = tag.closest('[lang]');\n\n        if (closest && closest.getAttribute) {\n          options.language = closest.getAttribute('lang');\n        }\n      } else {\n        var element = tag;\n\n        while (element && element.nodeType === 1) {\n          if (getAttributes(element).hasOwnProperty('lang')) {\n            options.language = element.getAttribute('lang');\n            break;\n          }\n          element = element.parentNode;\n        }\n      }\n    }\n\n    // Run base component initializing with new options\n\n    // Tracks when a tech changes the poster\n    var _this = possibleConstructorReturn(this, _Component.call(this, null, options, ready));\n\n    _this.isPosterFromTech_ = false;\n\n    // Holds callback info that gets queued when playback rate is zero\n    // and a seek is happening\n    _this.queuedCallbacks_ = [];\n\n    // Turn off API access because we're loading a new tech that might load asynchronously\n    _this.isReady_ = false;\n\n    // Init state hasStarted_\n    _this.hasStarted_ = false;\n\n    // Init state userActive_\n    _this.userActive_ = false;\n\n    // if the global option object was accidentally blown away by\n    // someone, bail early with an informative error\n    if (!_this.options_ || !_this.options_.techOrder || !_this.options_.techOrder.length) {\n      throw new Error('No techOrder specified. Did you overwrite ' + 'videojs.options instead of just changing the ' + 'properties you want to override?');\n    }\n\n    // Store the original tag used to set options\n    _this.tag = tag;\n\n    // Store the tag attributes used to restore html5 element\n    _this.tagAttributes = tag && getAttributes(tag);\n\n    // Update current language\n    _this.language(_this.options_.language);\n\n    // Update Supported Languages\n    if (options.languages) {\n      // Normalise player option languages to lowercase\n      var languagesToLower = {};\n\n      Object.getOwnPropertyNames(options.languages).forEach(function (name$$1) {\n        languagesToLower[name$$1.toLowerCase()] = options.languages[name$$1];\n      });\n      _this.languages_ = languagesToLower;\n    } else {\n      _this.languages_ = Player.prototype.options_.languages;\n    }\n\n    // Cache for video property values.\n    _this.cache_ = {};\n\n    // Set poster\n    _this.poster_ = options.poster || '';\n\n    // Set controls\n    _this.controls_ = !!options.controls;\n\n    // Set default values for lastVolume\n    _this.cache_.lastVolume = 1;\n\n    // Original tag settings stored in options\n    // now remove immediately so native controls don't flash.\n    // May be turned back on by HTML5 tech if nativeControlsForTouch is true\n    tag.controls = false;\n    tag.removeAttribute('controls');\n\n    // the attribute overrides the option\n    if (tag.hasAttribute('autoplay')) {\n      _this.options_.autoplay = true;\n    } else {\n      // otherwise use the setter to validate and\n      // set the correct value.\n      _this.autoplay(_this.options_.autoplay);\n    }\n\n    /*\n     * Store the internal state of scrubbing\n     *\n     * @private\n     * @return {Boolean} True if the user is scrubbing\n     */\n    _this.scrubbing_ = false;\n\n    _this.el_ = _this.createEl();\n\n    // Set default value for lastPlaybackRate\n    _this.cache_.lastPlaybackRate = _this.defaultPlaybackRate();\n\n    // Make this an evented object and use `el_` as its event bus.\n    evented(_this, { eventBusKey: 'el_' });\n\n    // We also want to pass the original player options to each component and plugin\n    // as well so they don't need to reach back into the player for options later.\n    // We also need to do another copy of this.options_ so we don't end up with\n    // an infinite loop.\n    var playerOptionsCopy = mergeOptions(_this.options_);\n\n    // Load plugins\n    if (options.plugins) {\n      var plugins = options.plugins;\n\n      Object.keys(plugins).forEach(function (name$$1) {\n        if (typeof this[name$$1] === 'function') {\n          this[name$$1](plugins[name$$1]);\n        } else {\n          throw new Error('plugin \"' + name$$1 + '\" does not exist');\n        }\n      }, _this);\n    }\n\n    _this.options_.playerOptions = playerOptionsCopy;\n\n    _this.middleware_ = [];\n\n    _this.initChildren();\n\n    // Set isAudio based on whether or not an audio tag was used\n    _this.isAudio(tag.nodeName.toLowerCase() === 'audio');\n\n    // Update controls className. Can't do this when the controls are initially\n    // set because the element doesn't exist yet.\n    if (_this.controls()) {\n      _this.addClass('vjs-controls-enabled');\n    } else {\n      _this.addClass('vjs-controls-disabled');\n    }\n\n    // Set ARIA label and region role depending on player type\n    _this.el_.setAttribute('role', 'region');\n    if (_this.isAudio()) {\n      _this.el_.setAttribute('aria-label', _this.localize('Audio Player'));\n    } else {\n      _this.el_.setAttribute('aria-label', _this.localize('Video Player'));\n    }\n\n    if (_this.isAudio()) {\n      _this.addClass('vjs-audio');\n    }\n\n    if (_this.flexNotSupported_()) {\n      _this.addClass('vjs-no-flex');\n    }\n\n    // TODO: Make this smarter. Toggle user state between touching/mousing\n    // using events, since devices can have both touch and mouse events.\n    // if (browser.TOUCH_ENABLED) {\n    //   this.addClass('vjs-touch-enabled');\n    // }\n\n    // iOS Safari has broken hover handling\n    if (!IS_IOS) {\n      _this.addClass('vjs-workinghover');\n    }\n\n    // Make player easily findable by ID\n    Player.players[_this.id_] = _this;\n\n    // Add a major version class to aid css in plugins\n    var majorVersion = version.split('.')[0];\n\n    _this.addClass('vjs-v' + majorVersion);\n\n    // When the player is first initialized, trigger activity so components\n    // like the control bar show themselves if needed\n    _this.userActive(true);\n    _this.reportUserActivity();\n\n    _this.one('play', _this.listenForUserActivity_);\n    _this.on('fullscreenchange', _this.handleFullscreenChange_);\n    _this.on('stageclick', _this.handleStageClick_);\n\n    _this.changingSrc_ = false;\n    _this.playWaitingForReady_ = false;\n    _this.playOnLoadstart_ = null;\n    return _this;\n  }\n\n  /**\n   * Destroys the video player and does any necessary cleanup.\n   *\n   * This is especially helpful if you are dynamically adding and removing videos\n   * to/from the DOM.\n   *\n   * @fires Player#dispose\n   */\n\n\n  Player.prototype.dispose = function dispose() {\n    /**\n     * Called when the player is being disposed of.\n     *\n     * @event Player#dispose\n     * @type {EventTarget~Event}\n     */\n    this.trigger('dispose');\n    // prevent dispose from being called twice\n    this.off('dispose');\n\n    if (this.styleEl_ && this.styleEl_.parentNode) {\n      this.styleEl_.parentNode.removeChild(this.styleEl_);\n      this.styleEl_ = null;\n    }\n\n    // Kill reference to this player\n    Player.players[this.id_] = null;\n\n    if (this.tag && this.tag.player) {\n      this.tag.player = null;\n    }\n\n    if (this.el_ && this.el_.player) {\n      this.el_.player = null;\n    }\n\n    if (this.tech_) {\n      this.tech_.dispose();\n      this.isPosterFromTech_ = false;\n      this.poster_ = '';\n    }\n\n    if (this.playerElIngest_) {\n      this.playerElIngest_ = null;\n    }\n\n    if (this.tag) {\n      this.tag = null;\n    }\n\n    clearCacheForPlayer(this);\n\n    // the actual .el_ is removed here\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Create the `Player`'s DOM element.\n   *\n   * @return {Element}\n   *         The DOM element that gets created.\n   */\n\n\n  Player.prototype.createEl = function createEl$$1() {\n    var tag = this.tag;\n    var el = void 0;\n    var playerElIngest = this.playerElIngest_ = tag.parentNode && tag.parentNode.hasAttribute && tag.parentNode.hasAttribute('data-vjs-player');\n    var divEmbed = this.tag.tagName.toLowerCase() === 'video-js';\n\n    if (playerElIngest) {\n      el = this.el_ = tag.parentNode;\n    } else if (!divEmbed) {\n      el = this.el_ = _Component.prototype.createEl.call(this, 'div');\n    }\n\n    // Copy over all the attributes from the tag, including ID and class\n    // ID will now reference player box, not the video tag\n    var attrs = getAttributes(tag);\n\n    if (divEmbed) {\n      el = this.el_ = tag;\n      tag = this.tag = document.createElement('video');\n      while (el.children.length) {\n        tag.appendChild(el.firstChild);\n      }\n\n      if (!hasClass(el, 'video-js')) {\n        addClass(el, 'video-js');\n      }\n\n      el.appendChild(tag);\n\n      playerElIngest = this.playerElIngest_ = el;\n\n      // copy over properties from the video-js element\n      // ie8 doesn't support Object.keys nor hasOwnProperty\n      // on dom elements so we have to specify properties individually\n      ['autoplay', 'controls', 'crossOrigin', 'defaultMuted', 'defaultPlaybackRate', 'loop', 'muted', 'playbackRate', 'src', 'volume'].forEach(function (prop) {\n        if (typeof el[prop] !== 'undefined') {\n          tag[prop] = el[prop];\n        }\n      });\n    }\n\n    // set tabindex to -1 to remove the video element from the focus order\n    tag.setAttribute('tabindex', '-1');\n    // Workaround for #4583 (JAWS+IE doesn't announce BPB or play button)\n    // See https://github.com/FreedomScientific/VFO-standards-support/issues/78\n    // Note that we can't detect if JAWS is being used, but this ARIA attribute\n    //  doesn't change behavior of IE11 if JAWS is not being used\n    if (IE_VERSION) {\n      tag.setAttribute('role', 'application');\n    }\n\n    // Remove width/height attrs from tag so CSS can make it 100% width/height\n    tag.removeAttribute('width');\n    tag.removeAttribute('height');\n\n    Object.getOwnPropertyNames(attrs).forEach(function (attr) {\n      // workaround so we don't totally break IE7\n      // http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7\n      if (attr === 'class') {\n        el.className += ' ' + attrs[attr];\n\n        if (divEmbed) {\n          tag.className += ' ' + attrs[attr];\n        }\n      } else {\n        el.setAttribute(attr, attrs[attr]);\n\n        if (divEmbed) {\n          tag.setAttribute(attr, attrs[attr]);\n        }\n      }\n    });\n\n    // Update tag id/class for use as HTML5 playback tech\n    // Might think we should do this after embedding in container so .vjs-tech class\n    // doesn't flash 100% width/height, but class only applies with .video-js parent\n    tag.playerId = tag.id;\n    tag.id += '_html5_api';\n    tag.className = 'vjs-tech';\n\n    // Make player findable on elements\n    tag.player = el.player = this;\n    // Default state of video is paused\n    this.addClass('vjs-paused');\n\n    // Add a style element in the player that we'll use to set the width/height\n    // of the player in a way that's still overrideable by CSS, just like the\n    // video element\n    if (window.VIDEOJS_NO_DYNAMIC_STYLE !== true) {\n      this.styleEl_ = createStyleElement('vjs-styles-dimensions');\n      var defaultsStyleEl = $('.vjs-styles-defaults');\n      var head = $('head');\n\n      head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);\n    }\n\n    // Pass in the width/height/aspectRatio options which will update the style el\n    this.width(this.options_.width);\n    this.height(this.options_.height);\n    this.fluid(this.options_.fluid);\n    this.aspectRatio(this.options_.aspectRatio);\n\n    // Hide any links within the video/audio tag, because IE doesn't hide them completely.\n    var links = tag.getElementsByTagName('a');\n\n    for (var i = 0; i < links.length; i++) {\n      var linkEl = links.item(i);\n\n      addClass(linkEl, 'vjs-hidden');\n      linkEl.setAttribute('hidden', 'hidden');\n    }\n\n    // insertElFirst seems to cause the networkState to flicker from 3 to 2, so\n    // keep track of the original for later so we can know if the source originally failed\n    tag.initNetworkState_ = tag.networkState;\n\n    // Wrap video tag in div (el/box) container\n    if (tag.parentNode && !playerElIngest) {\n      tag.parentNode.insertBefore(el, tag);\n    }\n\n    // insert the tag as the first child of the player element\n    // then manually add it to the children array so that this.addChild\n    // will work properly for other components\n    //\n    // Breaks iPhone, fixed in HTML5 setup.\n    prependTo(tag, el);\n    this.children_.unshift(tag);\n\n    // Set lang attr on player to ensure CSS :lang() in consistent with player\n    // if it's been set to something different to the doc\n    this.el_.setAttribute('lang', this.language_);\n\n    this.el_ = el;\n\n    return el;\n  };\n\n  /**\n   * A getter/setter for the `Player`'s width. Returns the player's configured value.\n   * To get the current width use `currentWidth()`.\n   *\n   * @param {number} [value]\n   *        The value to set the `Player`'s width to.\n   *\n   * @return {number}\n   *         The current width of the `Player` when getting.\n   */\n\n\n  Player.prototype.width = function width(value) {\n    return this.dimension('width', value);\n  };\n\n  /**\n   * A getter/setter for the `Player`'s height. Returns the player's configured value.\n   * To get the current height use `currentheight()`.\n   *\n   * @param {number} [value]\n   *        The value to set the `Player`'s heigth to.\n   *\n   * @return {number}\n   *         The current height of the `Player` when getting.\n   */\n\n\n  Player.prototype.height = function height(value) {\n    return this.dimension('height', value);\n  };\n\n  /**\n   * A getter/setter for the `Player`'s width & height.\n   *\n   * @param {string} dimension\n   *        This string can be:\n   *        - 'width'\n   *        - 'height'\n   *\n   * @param {number} [value]\n   *        Value for dimension specified in the first argument.\n   *\n   * @return {number}\n   *         The dimension arguments value when getting (width/height).\n   */\n\n\n  Player.prototype.dimension = function dimension(_dimension, value) {\n    var privDimension = _dimension + '_';\n\n    if (value === undefined) {\n      return this[privDimension] || 0;\n    }\n\n    if (value === '') {\n      // If an empty string is given, reset the dimension to be automatic\n      this[privDimension] = undefined;\n      this.updateStyleEl_();\n      return;\n    }\n\n    var parsedVal = parseFloat(value);\n\n    if (isNaN(parsedVal)) {\n      log$1.error('Improper value \"' + value + '\" supplied for for ' + _dimension);\n      return;\n    }\n\n    this[privDimension] = parsedVal;\n    this.updateStyleEl_();\n  };\n\n  /**\n   * A getter/setter/toggler for the vjs-fluid `className` on the `Player`.\n   *\n   * @param {boolean} [bool]\n   *        - A value of true adds the class.\n   *        - A value of false removes the class.\n   *        - No value will toggle the fluid class.\n   *\n   * @return {boolean|undefined}\n   *         - The value of fluid when getting.\n   *         - `undefined` when setting.\n   */\n\n\n  Player.prototype.fluid = function fluid(bool) {\n    if (bool === undefined) {\n      return !!this.fluid_;\n    }\n\n    this.fluid_ = !!bool;\n\n    if (bool) {\n      this.addClass('vjs-fluid');\n    } else {\n      this.removeClass('vjs-fluid');\n    }\n\n    this.updateStyleEl_();\n  };\n\n  /**\n   * Get/Set the aspect ratio\n   *\n   * @param {string} [ratio]\n   *        Aspect ratio for player\n   *\n   * @return {string|undefined}\n   *         returns the current aspect ratio when getting\n   */\n\n  /**\n   * A getter/setter for the `Player`'s aspect ratio.\n   *\n   * @param {string} [ratio]\n   *        The value to set the `Player's aspect ratio to.\n   *\n   * @return {string|undefined}\n   *         - The current aspect ratio of the `Player` when getting.\n   *         - undefined when setting\n   */\n\n\n  Player.prototype.aspectRatio = function aspectRatio(ratio) {\n    if (ratio === undefined) {\n      return this.aspectRatio_;\n    }\n\n    // Check for width:height format\n    if (!/^\\d+\\:\\d+$/.test(ratio)) {\n      throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');\n    }\n    this.aspectRatio_ = ratio;\n\n    // We're assuming if you set an aspect ratio you want fluid mode,\n    // because in fixed mode you could calculate width and height yourself.\n    this.fluid(true);\n\n    this.updateStyleEl_();\n  };\n\n  /**\n   * Update styles of the `Player` element (height, width and aspect ratio).\n   *\n   * @private\n   * @listens Tech#loadedmetadata\n   */\n\n\n  Player.prototype.updateStyleEl_ = function updateStyleEl_() {\n    if (window.VIDEOJS_NO_DYNAMIC_STYLE === true) {\n      var _width = typeof this.width_ === 'number' ? this.width_ : this.options_.width;\n      var _height = typeof this.height_ === 'number' ? this.height_ : this.options_.height;\n      var techEl = this.tech_ && this.tech_.el();\n\n      if (techEl) {\n        if (_width >= 0) {\n          techEl.width = _width;\n        }\n        if (_height >= 0) {\n          techEl.height = _height;\n        }\n      }\n\n      return;\n    }\n\n    var width = void 0;\n    var height = void 0;\n    var aspectRatio = void 0;\n    var idClass = void 0;\n\n    // The aspect ratio is either used directly or to calculate width and height.\n    if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {\n      // Use any aspectRatio that's been specifically set\n      aspectRatio = this.aspectRatio_;\n    } else if (this.videoWidth() > 0) {\n      // Otherwise try to get the aspect ratio from the video metadata\n      aspectRatio = this.videoWidth() + ':' + this.videoHeight();\n    } else {\n      // Or use a default. The video element's is 2:1, but 16:9 is more common.\n      aspectRatio = '16:9';\n    }\n\n    // Get the ratio as a decimal we can use to calculate dimensions\n    var ratioParts = aspectRatio.split(':');\n    var ratioMultiplier = ratioParts[1] / ratioParts[0];\n\n    if (this.width_ !== undefined) {\n      // Use any width that's been specifically set\n      width = this.width_;\n    } else if (this.height_ !== undefined) {\n      // Or calulate the width from the aspect ratio if a height has been set\n      width = this.height_ / ratioMultiplier;\n    } else {\n      // Or use the video's metadata, or use the video el's default of 300\n      width = this.videoWidth() || 300;\n    }\n\n    if (this.height_ !== undefined) {\n      // Use any height that's been specifically set\n      height = this.height_;\n    } else {\n      // Otherwise calculate the height from the ratio and the width\n      height = width * ratioMultiplier;\n    }\n\n    // Ensure the CSS class is valid by starting with an alpha character\n    if (/^[^a-zA-Z]/.test(this.id())) {\n      idClass = 'dimensions-' + this.id();\n    } else {\n      idClass = this.id() + '-dimensions';\n    }\n\n    // Ensure the right class is still on the player for the style element\n    this.addClass(idClass);\n\n    setTextContent(this.styleEl_, '\\n      .' + idClass + ' {\\n        width: ' + width + 'px;\\n        height: ' + height + 'px;\\n      }\\n\\n      .' + idClass + '.vjs-fluid {\\n        padding-top: ' + ratioMultiplier * 100 + '%;\\n      }\\n    ');\n  };\n\n  /**\n   * Load/Create an instance of playback {@link Tech} including element\n   * and API methods. Then append the `Tech` element in `Player` as a child.\n   *\n   * @param {string} techName\n   *        name of the playback technology\n   *\n   * @param {string} source\n   *        video source\n   *\n   * @private\n   */\n\n\n  Player.prototype.loadTech_ = function loadTech_(techName, source) {\n    var _this2 = this;\n\n    // Pause and remove current playback technology\n    if (this.tech_) {\n      this.unloadTech_();\n    }\n\n    var titleTechName = toTitleCase(techName);\n    var camelTechName = techName.charAt(0).toLowerCase() + techName.slice(1);\n\n    // get rid of the HTML5 video tag as soon as we are using another tech\n    if (titleTechName !== 'Html5' && this.tag) {\n      Tech.getTech('Html5').disposeMediaElement(this.tag);\n      this.tag.player = null;\n      this.tag = null;\n    }\n\n    this.techName_ = titleTechName;\n\n    // Turn off API access because we're loading a new tech that might load asynchronously\n    this.isReady_ = false;\n\n    // if autoplay is a string we pass false to the tech\n    // because the player is going to handle autoplay on `loadstart`\n    var autoplay = typeof this.autoplay() === 'string' ? false : this.autoplay();\n\n    // Grab tech-specific options from player options and add source and parent element to use.\n    var techOptions = {\n      source: source,\n      autoplay: autoplay,\n      'nativeControlsForTouch': this.options_.nativeControlsForTouch,\n      'playerId': this.id(),\n      'techId': this.id() + '_' + titleTechName + '_api',\n      'playsinline': this.options_.playsinline,\n      'preload': this.options_.preload,\n      'loop': this.options_.loop,\n      'muted': this.options_.muted,\n      'poster': this.poster(),\n      'language': this.language(),\n      'playerElIngest': this.playerElIngest_ || false,\n      'vtt.js': this.options_['vtt.js'],\n      'canOverridePoster': !!this.options_.techCanOverridePoster,\n      'enableSourceset': this.options_.enableSourceset\n    };\n\n    ALL.names.forEach(function (name$$1) {\n      var props = ALL[name$$1];\n\n      techOptions[props.getterName] = _this2[props.privateName];\n    });\n\n    assign(techOptions, this.options_[titleTechName]);\n    assign(techOptions, this.options_[camelTechName]);\n    assign(techOptions, this.options_[techName.toLowerCase()]);\n\n    if (this.tag) {\n      techOptions.tag = this.tag;\n    }\n\n    if (source && source.src === this.cache_.src && this.cache_.currentTime > 0) {\n      techOptions.startTime = this.cache_.currentTime;\n    }\n\n    // Initialize tech instance\n    var TechClass = Tech.getTech(techName);\n\n    if (!TechClass) {\n      throw new Error('No Tech named \\'' + titleTechName + '\\' exists! \\'' + titleTechName + '\\' should be registered using videojs.registerTech()\\'');\n    }\n\n    this.tech_ = new TechClass(techOptions);\n\n    // player.triggerReady is always async, so don't need this to be async\n    this.tech_.ready(bind(this, this.handleTechReady_), true);\n\n    textTrackConverter.jsonToTextTracks(this.textTracksJson_ || [], this.tech_);\n\n    // Listen to all HTML5-defined events and trigger them on the player\n    TECH_EVENTS_RETRIGGER.forEach(function (event) {\n      _this2.on(_this2.tech_, event, _this2['handleTech' + toTitleCase(event) + '_']);\n    });\n\n    Object.keys(TECH_EVENTS_QUEUE).forEach(function (event) {\n      _this2.on(_this2.tech_, event, function (eventObj) {\n        if (_this2.tech_.playbackRate() === 0 && _this2.tech_.seeking()) {\n          _this2.queuedCallbacks_.push({\n            callback: _this2['handleTech' + TECH_EVENTS_QUEUE[event] + '_'].bind(_this2),\n            event: eventObj\n          });\n          return;\n        }\n        _this2['handleTech' + TECH_EVENTS_QUEUE[event] + '_'](eventObj);\n      });\n    });\n\n    this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);\n    this.on(this.tech_, 'sourceset', this.handleTechSourceset_);\n    this.on(this.tech_, 'waiting', this.handleTechWaiting_);\n    this.on(this.tech_, 'ended', this.handleTechEnded_);\n    this.on(this.tech_, 'seeking', this.handleTechSeeking_);\n    this.on(this.tech_, 'play', this.handleTechPlay_);\n    this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);\n    this.on(this.tech_, 'pause', this.handleTechPause_);\n    this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);\n    this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);\n    this.on(this.tech_, 'error', this.handleTechError_);\n    this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);\n    this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);\n    this.on(this.tech_, 'textdata', this.handleTechTextData_);\n    this.on(this.tech_, 'ratechange', this.handleTechRateChange_);\n\n    this.usingNativeControls(this.techGet_('controls'));\n\n    if (this.controls() && !this.usingNativeControls()) {\n      this.addTechControlsListeners_();\n    }\n\n    // Add the tech element in the DOM if it was not already there\n    // Make sure to not insert the original video element if using Html5\n    if (this.tech_.el().parentNode !== this.el() && (titleTechName !== 'Html5' || !this.tag)) {\n      prependTo(this.tech_.el(), this.el());\n    }\n\n    // Get rid of the original video tag reference after the first tech is loaded\n    if (this.tag) {\n      this.tag.player = null;\n      this.tag = null;\n    }\n  };\n\n  /**\n   * Unload and dispose of the current playback {@link Tech}.\n   *\n   * @private\n   */\n\n\n  Player.prototype.unloadTech_ = function unloadTech_() {\n    var _this3 = this;\n\n    // Save the current text tracks so that we can reuse the same text tracks with the next tech\n    ALL.names.forEach(function (name$$1) {\n      var props = ALL[name$$1];\n\n      _this3[props.privateName] = _this3[props.getterName]();\n    });\n    this.textTracksJson_ = textTrackConverter.textTracksToJson(this.tech_);\n\n    this.isReady_ = false;\n\n    this.tech_.dispose();\n\n    this.tech_ = false;\n\n    if (this.isPosterFromTech_) {\n      this.poster_ = '';\n      this.trigger('posterchange');\n    }\n\n    this.isPosterFromTech_ = false;\n  };\n\n  /**\n   * Return a reference to the current {@link Tech}.\n   * It will print a warning by default about the danger of using the tech directly\n   * but any argument that is passed in will silence the warning.\n   *\n   * @param {*} [safety]\n   *        Anything passed in to silence the warning\n   *\n   * @return {Tech}\n   *         The Tech\n   */\n\n\n  Player.prototype.tech = function tech(safety) {\n    if (safety === undefined) {\n      log$1.warn(tsml(_templateObject$1));\n    }\n\n    return this.tech_;\n  };\n\n  /**\n   * Set up click and touch listeners for the playback element\n   *\n   * - On desktops: a click on the video itself will toggle playback\n   * - On mobile devices: a click on the video toggles controls\n   *   which is done by toggling the user state between active and\n   *   inactive\n   * - A tap can signal that a user has become active or has become inactive\n   *   e.g. a quick tap on an iPhone movie should reveal the controls. Another\n   *   quick tap should hide them again (signaling the user is in an inactive\n   *   viewing state)\n   * - In addition to this, we still want the user to be considered inactive after\n   *   a few seconds of inactivity.\n   *\n   * > Note: the only part of iOS interaction we can't mimic with this setup\n   * is a touch and hold on the video element counting as activity in order to\n   * keep the controls showing, but that shouldn't be an issue. A touch and hold\n   * on any controls will still keep the user active\n   *\n   * @private\n   */\n\n\n  Player.prototype.addTechControlsListeners_ = function addTechControlsListeners_() {\n    // Make sure to remove all the previous listeners in case we are called multiple times.\n    this.removeTechControlsListeners_();\n\n    // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do\n    // trigger mousedown/up.\n    // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object\n    // Any touch events are set to block the mousedown event from happening\n    this.on(this.tech_, 'mousedown', this.handleTechClick_);\n\n    // If the controls were hidden we don't want that to change without a tap event\n    // so we'll check if the controls were already showing before reporting user\n    // activity\n    this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);\n\n    // The tap listener needs to come after the touchend listener because the tap\n    // listener cancels out any reportedUserActivity when setting userActive(false)\n    this.on(this.tech_, 'tap', this.handleTechTap_);\n  };\n\n  /**\n   * Remove the listeners used for click and tap controls. This is needed for\n   * toggling to controls disabled, where a tap/touch should do nothing.\n   *\n   * @private\n   */\n\n\n  Player.prototype.removeTechControlsListeners_ = function removeTechControlsListeners_() {\n    // We don't want to just use `this.off()` because there might be other needed\n    // listeners added by techs that extend this.\n    this.off(this.tech_, 'tap', this.handleTechTap_);\n    this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);\n    this.off(this.tech_, 'mousedown', this.handleTechClick_);\n  };\n\n  /**\n   * Player waits for the tech to be ready\n   *\n   * @private\n   */\n\n\n  Player.prototype.handleTechReady_ = function handleTechReady_() {\n    this.triggerReady();\n\n    // Keep the same volume as before\n    if (this.cache_.volume) {\n      this.techCall_('setVolume', this.cache_.volume);\n    }\n\n    // Look if the tech found a higher resolution poster while loading\n    this.handleTechPosterChange_();\n\n    // Update the duration if available\n    this.handleTechDurationChange_();\n\n    // Chrome and Safari both have issues with autoplay.\n    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.\n    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)\n    // This fixes both issues. Need to wait for API, so it updates displays correctly\n    if ((this.src() || this.currentSrc()) && this.tag && this.options_.autoplay && this.paused()) {\n      try {\n        // Chrome Fix. Fixed in Chrome v16.\n        delete this.tag.poster;\n      } catch (e) {\n        log$1('deleting tag.poster throws in some browsers', e);\n      }\n    }\n  };\n\n  /**\n   * Retrigger the `loadstart` event that was triggered by the {@link Tech}. This\n   * function will also trigger {@link Player#firstplay} if it is the first loadstart\n   * for a video.\n   *\n   * @fires Player#loadstart\n   * @fires Player#firstplay\n   * @listens Tech#loadstart\n   * @private\n   */\n\n\n  Player.prototype.handleTechLoadStart_ = function handleTechLoadStart_() {\n    // TODO: Update to use `emptied` event instead. See #1277.\n\n    this.removeClass('vjs-ended');\n    this.removeClass('vjs-seeking');\n\n    // reset the error state\n    this.error(null);\n\n    // If it's already playing we want to trigger a firstplay event now.\n    // The firstplay event relies on both the play and loadstart events\n    // which can happen in any order for a new source\n    if (!this.paused()) {\n      /**\n       * Fired when the user agent begins looking for media data\n       *\n       * @event Player#loadstart\n       * @type {EventTarget~Event}\n       */\n      this.trigger('loadstart');\n      this.trigger('firstplay');\n    } else {\n      // reset the hasStarted state\n      this.hasStarted(false);\n      this.trigger('loadstart');\n    }\n\n    // autoplay happens after loadstart for the browser,\n    // so we mimic that behavior\n    this.manualAutoplay_(this.autoplay());\n  };\n\n  /**\n   * Handle autoplay string values, rather than the typical boolean\n   * values that should be handled by the tech. Note that this is not\n   * part of any specification. Valid values and what they do can be\n   * found on the autoplay getter at Player#autoplay()\n   */\n\n\n  Player.prototype.manualAutoplay_ = function manualAutoplay_(type) {\n    var _this4 = this;\n\n    if (!this.tech_ || typeof type !== 'string') {\n      return;\n    }\n\n    var muted = function muted() {\n      var previouslyMuted = _this4.muted();\n\n      _this4.muted(true);\n\n      var playPromise = _this4.play();\n\n      if (!playPromise || !playPromise.then || !playPromise['catch']) {\n        return;\n      }\n\n      return playPromise['catch'](function (e) {\n        // restore old value of muted on failure\n        _this4.muted(previouslyMuted);\n      });\n    };\n\n    var promise = void 0;\n\n    if (type === 'any') {\n      promise = this.play();\n\n      if (promise && promise.then && promise['catch']) {\n        promise['catch'](function () {\n          return muted();\n        });\n      }\n    } else if (type === 'muted') {\n      promise = muted();\n    } else {\n      promise = this.play();\n    }\n\n    if (!promise || !promise.then || !promise['catch']) {\n      return;\n    }\n\n    return promise.then(function () {\n      _this4.trigger({ type: 'autoplay-success', autoplay: type });\n    })['catch'](function (e) {\n      _this4.trigger({ type: 'autoplay-failure', autoplay: type });\n    });\n  };\n\n  /**\n   * Update the internal source caches so that we return the correct source from\n   * `src()`, `currentSource()`, and `currentSources()`.\n   *\n   * > Note: `currentSources` will not be updated if the source that is passed in exists\n   *         in the current `currentSources` cache.\n   *\n   *\n   * @param {Tech~SourceObject} srcObj\n   *        A string or object source to update our caches to.\n   */\n\n\n  Player.prototype.updateSourceCaches_ = function updateSourceCaches_() {\n    var srcObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n\n    var src = srcObj;\n    var type = '';\n\n    if (typeof src !== 'string') {\n      src = srcObj.src;\n      type = srcObj.type;\n    }\n\n    // if we are a blob url, don't update the source cache\n    // blob urls can arise when playback is done via Media Source Extension (MSE)\n    // such as m3u8 sources with @videojs/http-streaming (VHS)\n    if (/^blob:/.test(src)) {\n      return;\n    }\n\n    // make sure all the caches are set to default values\n    // to prevent null checking\n    this.cache_.source = this.cache_.source || {};\n    this.cache_.sources = this.cache_.sources || [];\n\n    // try to get the type of the src that was passed in\n    if (src && !type) {\n      type = findMimetype(this, src);\n    }\n\n    // update `currentSource` cache always\n    this.cache_.source = mergeOptions({}, srcObj, { src: src, type: type });\n\n    var matchingSources = this.cache_.sources.filter(function (s) {\n      return s.src && s.src === src;\n    });\n    var sourceElSources = [];\n    var sourceEls = this.$$('source');\n    var matchingSourceEls = [];\n\n    for (var i = 0; i < sourceEls.length; i++) {\n      var sourceObj = getAttributes(sourceEls[i]);\n\n      sourceElSources.push(sourceObj);\n\n      if (sourceObj.src && sourceObj.src === src) {\n        matchingSourceEls.push(sourceObj.src);\n      }\n    }\n\n    // if we have matching source els but not matching sources\n    // the current source cache is not up to date\n    if (matchingSourceEls.length && !matchingSources.length) {\n      this.cache_.sources = sourceElSources;\n      // if we don't have matching source or source els set the\n      // sources cache to the `currentSource` cache\n    } else if (!matchingSources.length) {\n      this.cache_.sources = [this.cache_.source];\n    }\n\n    // update the tech `src` cache\n    this.cache_.src = src;\n  };\n\n  /**\n   * *EXPERIMENTAL* Fired when the source is set or changed on the {@link Tech}\n   * causing the media element to reload.\n   *\n   * It will fire for the initial source and each subsequent source.\n   * This event is a custom event from Video.js and is triggered by the {@link Tech}.\n   *\n   * The event object for this event contains a `src` property that will contain the source\n   * that was available when the event was triggered. This is generally only necessary if Video.js\n   * is switching techs while the source was being changed.\n   *\n   * It is also fired when `load` is called on the player (or media element)\n   * because the {@link https://html.spec.whatwg.org/multipage/media.html#dom-media-load|specification for `load`}\n   * says that the resource selection algorithm needs to be aborted and restarted.\n   * In this case, it is very likely that the `src` property will be set to the\n   * empty string `\"\"` to indicate we do not know what the source will be but\n   * that it is changing.\n   *\n   * *This event is currently still experimental and may change in minor releases.*\n   * __To use this, pass `enableSourceset` option to the player.__\n   *\n   * @event Player#sourceset\n   * @type {EventTarget~Event}\n   * @prop {string} src\n   *                The source url available when the `sourceset` was triggered.\n   *                It will be an empty string if we cannot know what the source is\n   *                but know that the source will change.\n   */\n  /**\n   * Retrigger the `sourceset` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#sourceset\n   * @listens Tech#sourceset\n   * @private\n   */\n\n\n  Player.prototype.handleTechSourceset_ = function handleTechSourceset_(event) {\n    var _this5 = this;\n\n    // only update the source cache when the source\n    // was not updated using the player api\n    if (!this.changingSrc_) {\n      // update the source to the intial source right away\n      // in some cases this will be empty string\n      this.updateSourceCaches_(event.src);\n\n      // if the `sourceset` `src` was an empty string\n      // wait for a `loadstart` to update the cache to `currentSrc`.\n      // If a sourceset happens before a `loadstart`, we reset the state\n      // as this function will be called again.\n      if (!event.src) {\n        var updateCache = function updateCache(e) {\n          if (e.type !== 'sourceset') {\n            _this5.updateSourceCaches_(_this5.techGet_('currentSrc'));\n          }\n\n          _this5.tech_.off(['sourceset', 'loadstart'], updateCache);\n        };\n\n        this.tech_.one(['sourceset', 'loadstart'], updateCache);\n      }\n    }\n\n    this.trigger({\n      src: event.src,\n      type: 'sourceset'\n    });\n  };\n\n  /**\n   * Add/remove the vjs-has-started class\n   *\n   * @fires Player#firstplay\n   *\n   * @param {boolean} request\n   *        - true: adds the class\n   *        - false: remove the class\n   *\n   * @return {boolean}\n   *         the boolean value of hasStarted_\n   */\n\n\n  Player.prototype.hasStarted = function hasStarted(request) {\n    if (request === undefined) {\n      // act as getter, if we have no request to change\n      return this.hasStarted_;\n    }\n\n    if (request === this.hasStarted_) {\n      return;\n    }\n\n    this.hasStarted_ = request;\n\n    if (this.hasStarted_) {\n      this.addClass('vjs-has-started');\n      this.trigger('firstplay');\n    } else {\n      this.removeClass('vjs-has-started');\n    }\n  };\n\n  /**\n   * Fired whenever the media begins or resumes playback\n   *\n   * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play}\n   * @fires Player#play\n   * @listens Tech#play\n   * @private\n   */\n\n\n  Player.prototype.handleTechPlay_ = function handleTechPlay_() {\n    this.removeClass('vjs-ended');\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n\n    // hide the poster when the user hits play\n    this.hasStarted(true);\n    /**\n     * Triggered whenever an {@link Tech#play} event happens. Indicates that\n     * playback has started or resumed.\n     *\n     * @event Player#play\n     * @type {EventTarget~Event}\n     */\n    this.trigger('play');\n  };\n\n  /**\n   * Retrigger the `ratechange` event that was triggered by the {@link Tech}.\n   *\n   * If there were any events queued while the playback rate was zero, fire\n   * those events now.\n   *\n   * @private\n   * @method Player#handleTechRateChange_\n   * @fires Player#ratechange\n   * @listens Tech#ratechange\n   */\n\n\n  Player.prototype.handleTechRateChange_ = function handleTechRateChange_() {\n    if (this.tech_.playbackRate() > 0 && this.cache_.lastPlaybackRate === 0) {\n      this.queuedCallbacks_.forEach(function (queued) {\n        return queued.callback(queued.event);\n      });\n      this.queuedCallbacks_ = [];\n    }\n    this.cache_.lastPlaybackRate = this.tech_.playbackRate();\n    /**\n     * Fires when the playing speed of the audio/video is changed\n     *\n     * @event Player#ratechange\n     * @type {event}\n     */\n    this.trigger('ratechange');\n  };\n\n  /**\n   * Retrigger the `waiting` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#waiting\n   * @listens Tech#waiting\n   * @private\n   */\n\n\n  Player.prototype.handleTechWaiting_ = function handleTechWaiting_() {\n    var _this6 = this;\n\n    this.addClass('vjs-waiting');\n    /**\n     * A readyState change on the DOM element has caused playback to stop.\n     *\n     * @event Player#waiting\n     * @type {EventTarget~Event}\n     */\n    this.trigger('waiting');\n    this.one('timeupdate', function () {\n      return _this6.removeClass('vjs-waiting');\n    });\n  };\n\n  /**\n   * Retrigger the `canplay` event that was triggered by the {@link Tech}.\n   * > Note: This is not consistent between browsers. See #1351\n   *\n   * @fires Player#canplay\n   * @listens Tech#canplay\n   * @private\n   */\n\n\n  Player.prototype.handleTechCanPlay_ = function handleTechCanPlay_() {\n    this.removeClass('vjs-waiting');\n    /**\n     * The media has a readyState of HAVE_FUTURE_DATA or greater.\n     *\n     * @event Player#canplay\n     * @type {EventTarget~Event}\n     */\n    this.trigger('canplay');\n  };\n\n  /**\n   * Retrigger the `canplaythrough` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#canplaythrough\n   * @listens Tech#canplaythrough\n   * @private\n   */\n\n\n  Player.prototype.handleTechCanPlayThrough_ = function handleTechCanPlayThrough_() {\n    this.removeClass('vjs-waiting');\n    /**\n     * The media has a readyState of HAVE_ENOUGH_DATA or greater. This means that the\n     * entire media file can be played without buffering.\n     *\n     * @event Player#canplaythrough\n     * @type {EventTarget~Event}\n     */\n    this.trigger('canplaythrough');\n  };\n\n  /**\n   * Retrigger the `playing` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#playing\n   * @listens Tech#playing\n   * @private\n   */\n\n\n  Player.prototype.handleTechPlaying_ = function handleTechPlaying_() {\n    this.removeClass('vjs-waiting');\n    /**\n     * The media is no longer blocked from playback, and has started playing.\n     *\n     * @event Player#playing\n     * @type {EventTarget~Event}\n     */\n    this.trigger('playing');\n  };\n\n  /**\n   * Retrigger the `seeking` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#seeking\n   * @listens Tech#seeking\n   * @private\n   */\n\n\n  Player.prototype.handleTechSeeking_ = function handleTechSeeking_() {\n    this.addClass('vjs-seeking');\n    /**\n     * Fired whenever the player is jumping to a new time\n     *\n     * @event Player#seeking\n     * @type {EventTarget~Event}\n     */\n    this.trigger('seeking');\n  };\n\n  /**\n   * Retrigger the `seeked` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#seeked\n   * @listens Tech#seeked\n   * @private\n   */\n\n\n  Player.prototype.handleTechSeeked_ = function handleTechSeeked_() {\n    this.removeClass('vjs-seeking');\n    /**\n     * Fired when the player has finished jumping to a new time\n     *\n     * @event Player#seeked\n     * @type {EventTarget~Event}\n     */\n    this.trigger('seeked');\n  };\n\n  /**\n   * Retrigger the `firstplay` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#firstplay\n   * @listens Tech#firstplay\n   * @deprecated As of 6.0 firstplay event is deprecated.\n   *             As of 6.0 passing the `starttime` option to the player and the firstplay event are deprecated.\n   * @private\n   */\n\n\n  Player.prototype.handleTechFirstPlay_ = function handleTechFirstPlay_() {\n    // If the first starttime attribute is specified\n    // then we will start at the given offset in seconds\n    if (this.options_.starttime) {\n      log$1.warn('Passing the `starttime` option to the player will be deprecated in 6.0');\n      this.currentTime(this.options_.starttime);\n    }\n\n    this.addClass('vjs-has-started');\n    /**\n     * Fired the first time a video is played. Not part of the HLS spec, and this is\n     * probably not the best implementation yet, so use sparingly. If you don't have a\n     * reason to prevent playback, use `myPlayer.one('play');` instead.\n     *\n     * @event Player#firstplay\n     * @deprecated As of 6.0 firstplay event is deprecated.\n     * @type {EventTarget~Event}\n     */\n    this.trigger('firstplay');\n  };\n\n  /**\n   * Retrigger the `pause` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#pause\n   * @listens Tech#pause\n   * @private\n   */\n\n\n  Player.prototype.handleTechPause_ = function handleTechPause_() {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    /**\n     * Fired whenever the media has been paused\n     *\n     * @event Player#pause\n     * @type {EventTarget~Event}\n     */\n    this.trigger('pause');\n  };\n\n  /**\n   * Retrigger the `ended` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#ended\n   * @listens Tech#ended\n   * @private\n   */\n\n\n  Player.prototype.handleTechEnded_ = function handleTechEnded_() {\n    this.addClass('vjs-ended');\n    if (this.options_.loop) {\n      this.currentTime(0);\n      this.play();\n    } else if (!this.paused()) {\n      this.pause();\n    }\n\n    /**\n     * Fired when the end of the media resource is reached (currentTime == duration)\n     *\n     * @event Player#ended\n     * @type {EventTarget~Event}\n     */\n    this.trigger('ended');\n  };\n\n  /**\n   * Fired when the duration of the media resource is first known or changed\n   *\n   * @listens Tech#durationchange\n   * @private\n   */\n\n\n  Player.prototype.handleTechDurationChange_ = function handleTechDurationChange_() {\n    this.duration(this.techGet_('duration'));\n  };\n\n  /**\n   * Handle a click on the media element to play/pause\n   *\n   * @param {EventTarget~Event} event\n   *        the event that caused this function to trigger\n   *\n   * @listens Tech#mousedown\n   * @private\n   */\n\n\n  Player.prototype.handleTechClick_ = function handleTechClick_(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    // When controls are disabled a click should not toggle playback because\n    // the click is considered a control\n    if (!this.controls_) {\n      return;\n    }\n\n    if (this.paused()) {\n      silencePromise(this.play());\n    } else {\n      this.pause();\n    }\n  };\n\n  /**\n   * Handle a tap on the media element. It will toggle the user\n   * activity state, which hides and shows the controls.\n   *\n   * @listens Tech#tap\n   * @private\n   */\n\n\n  Player.prototype.handleTechTap_ = function handleTechTap_() {\n    this.userActive(!this.userActive());\n  };\n\n  /**\n   * Handle touch to start\n   *\n   * @listens Tech#touchstart\n   * @private\n   */\n\n\n  Player.prototype.handleTechTouchStart_ = function handleTechTouchStart_() {\n    this.userWasActive = this.userActive();\n  };\n\n  /**\n   * Handle touch to move\n   *\n   * @listens Tech#touchmove\n   * @private\n   */\n\n\n  Player.prototype.handleTechTouchMove_ = function handleTechTouchMove_() {\n    if (this.userWasActive) {\n      this.reportUserActivity();\n    }\n  };\n\n  /**\n   * Handle touch to end\n   *\n   * @param {EventTarget~Event} event\n   *        the touchend event that triggered\n   *        this function\n   *\n   * @listens Tech#touchend\n   * @private\n   */\n\n\n  Player.prototype.handleTechTouchEnd_ = function handleTechTouchEnd_(event) {\n    // Stop the mouse events from also happening\n    event.preventDefault();\n  };\n\n  /**\n   * Fired when the player switches in or out of fullscreen mode\n   *\n   * @private\n   * @listens Player#fullscreenchange\n   */\n\n\n  Player.prototype.handleFullscreenChange_ = function handleFullscreenChange_() {\n    if (this.isFullscreen()) {\n      this.addClass('vjs-fullscreen');\n    } else {\n      this.removeClass('vjs-fullscreen');\n    }\n  };\n\n  /**\n   * native click events on the SWF aren't triggered on IE11, Win8.1RT\n   * use stageclick events triggered from inside the SWF instead\n   *\n   * @private\n   * @listens stageclick\n   */\n\n\n  Player.prototype.handleStageClick_ = function handleStageClick_() {\n    this.reportUserActivity();\n  };\n\n  /**\n   * Handle Tech Fullscreen Change\n   *\n   * @param {EventTarget~Event} event\n   *        the fullscreenchange event that triggered this function\n   *\n   * @param {Object} data\n   *        the data that was sent with the event\n   *\n   * @private\n   * @listens Tech#fullscreenchange\n   * @fires Player#fullscreenchange\n   */\n\n\n  Player.prototype.handleTechFullscreenChange_ = function handleTechFullscreenChange_(event, data) {\n    if (data) {\n      this.isFullscreen(data.isFullscreen);\n    }\n    /**\n     * Fired when going in and out of fullscreen.\n     *\n     * @event Player#fullscreenchange\n     * @type {EventTarget~Event}\n     */\n    this.trigger('fullscreenchange');\n  };\n\n  /**\n   * Fires when an error occurred during the loading of an audio/video.\n   *\n   * @private\n   * @listens Tech#error\n   */\n\n\n  Player.prototype.handleTechError_ = function handleTechError_() {\n    var error = this.tech_.error();\n\n    this.error(error);\n  };\n\n  /**\n   * Retrigger the `textdata` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#textdata\n   * @listens Tech#textdata\n   * @private\n   */\n\n\n  Player.prototype.handleTechTextData_ = function handleTechTextData_() {\n    var data = null;\n\n    if (arguments.length > 1) {\n      data = arguments[1];\n    }\n\n    /**\n     * Fires when we get a textdata event from tech\n     *\n     * @event Player#textdata\n     * @type {EventTarget~Event}\n     */\n    this.trigger('textdata', data);\n  };\n\n  /**\n   * Get object for cached values.\n   *\n   * @return {Object}\n   *         get the current object cache\n   */\n\n\n  Player.prototype.getCache = function getCache() {\n    return this.cache_;\n  };\n\n  /**\n   * Pass values to the playback tech\n   *\n   * @param {string} [method]\n   *        the method to call\n   *\n   * @param {Object} arg\n   *        the argument to pass\n   *\n   * @private\n   */\n\n\n  Player.prototype.techCall_ = function techCall_(method, arg) {\n    // If it's not ready yet, call method when it is\n\n    this.ready(function () {\n      if (method in allowedSetters) {\n        return set$1(this.middleware_, this.tech_, method, arg);\n      } else if (method in allowedMediators) {\n        return mediate(this.middleware_, this.tech_, method, arg);\n      }\n\n      try {\n        if (this.tech_) {\n          this.tech_[method](arg);\n        }\n      } catch (e) {\n        log$1(e);\n        throw e;\n      }\n    }, true);\n  };\n\n  /**\n   * Get calls can't wait for the tech, and sometimes don't need to.\n   *\n   * @param {string} method\n   *        Tech method\n   *\n   * @return {Function|undefined}\n   *         the method or undefined\n   *\n   * @private\n   */\n\n\n  Player.prototype.techGet_ = function techGet_(method) {\n    if (!this.tech_ || !this.tech_.isReady_) {\n      return;\n    }\n\n    if (method in allowedGetters) {\n      return get$1(this.middleware_, this.tech_, method);\n    } else if (method in allowedMediators) {\n      return mediate(this.middleware_, this.tech_, method);\n    }\n\n    // Flash likes to die and reload when you hide or reposition it.\n    // In these cases the object methods go away and we get errors.\n    // When that happens we'll catch the errors and inform tech that it's not ready any more.\n    try {\n      return this.tech_[method]();\n    } catch (e) {\n\n      // When building additional tech libs, an expected method may not be defined yet\n      if (this.tech_[method] === undefined) {\n        log$1('Video.js: ' + method + ' method not defined for ' + this.techName_ + ' playback technology.', e);\n        throw e;\n      }\n\n      // When a method isn't available on the object it throws a TypeError\n      if (e.name === 'TypeError') {\n        log$1('Video.js: ' + method + ' unavailable on ' + this.techName_ + ' playback technology element.', e);\n        this.tech_.isReady_ = false;\n        throw e;\n      }\n\n      // If error unknown, just log and throw\n      log$1(e);\n      throw e;\n    }\n  };\n\n  /**\n   * Attempt to begin playback at the first opportunity.\n   *\n   * @return {Promise|undefined}\n   *         Returns a promise if the browser supports Promises (or one\n   *         was passed in as an option). This promise will be resolved on\n   *         the return value of play. If this is undefined it will fulfill the\n   *         promise chain otherwise the promise chain will be fulfilled when\n   *         the promise from play is fulfilled.\n   */\n\n\n  Player.prototype.play = function play() {\n    var _this7 = this;\n\n    var PromiseClass = this.options_.Promise || window.Promise;\n\n    if (PromiseClass) {\n      return new PromiseClass(function (resolve) {\n        _this7.play_(resolve);\n      });\n    }\n\n    return this.play_();\n  };\n\n  /**\n   * The actual logic for play, takes a callback that will be resolved on the\n   * return value of play. This allows us to resolve to the play promise if there\n   * is one on modern browsers.\n   *\n   * @private\n   * @param {Function} [callback]\n   *        The callback that should be called when the techs play is actually called\n   */\n\n\n  Player.prototype.play_ = function play_() {\n    var _this8 = this;\n\n    var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : silencePromise;\n\n    // If this is called while we have a play queued up on a loadstart, remove\n    // that listener to avoid getting in a potentially bad state.\n    if (this.playOnLoadstart_) {\n      this.off('loadstart', this.playOnLoadstart_);\n    }\n\n    // If the player/tech is not ready, queue up another call to `play()` for\n    // when it is. This will loop back into this method for another attempt at\n    // playback when the tech is ready.\n    if (!this.isReady_) {\n\n      // Bail out if we're already waiting for `ready`!\n      if (this.playWaitingForReady_) {\n        return;\n      }\n\n      this.playWaitingForReady_ = true;\n      this.ready(function () {\n        _this8.playWaitingForReady_ = false;\n        callback(_this8.play());\n      });\n\n      // If the player/tech is ready and we have a source, we can attempt playback.\n    } else if (!this.changingSrc_ && (this.src() || this.currentSrc())) {\n      callback(this.techGet_('play'));\n      return;\n\n      // If the tech is ready, but we do not have a source, we'll need to wait\n      // for both the `ready` and a `loadstart` when the source is finally\n      // resolved by middleware and set on the player.\n      //\n      // This can happen if `play()` is called while changing sources or before\n      // one has been set on the player.\n    } else {\n\n      this.playOnLoadstart_ = function () {\n        _this8.playOnLoadstart_ = null;\n        callback(_this8.play());\n      };\n\n      this.one('loadstart', this.playOnLoadstart_);\n    }\n  };\n\n  /**\n   * Pause the video playback\n   *\n   * @return {Player}\n   *         A reference to the player object this function was called on\n   */\n\n\n  Player.prototype.pause = function pause() {\n    this.techCall_('pause');\n  };\n\n  /**\n   * Check if the player is paused or has yet to play\n   *\n   * @return {boolean}\n   *         - false: if the media is currently playing\n   *         - true: if media is not currently playing\n   */\n\n\n  Player.prototype.paused = function paused() {\n    // The initial state of paused should be true (in Safari it's actually false)\n    return this.techGet_('paused') === false ? false : true;\n  };\n\n  /**\n   * Get a TimeRange object representing the current ranges of time that the user\n   * has played.\n   *\n   * @return {TimeRange}\n   *         A time range object that represents all the increments of time that have\n   *         been played.\n   */\n\n\n  Player.prototype.played = function played() {\n    return this.techGet_('played') || createTimeRanges(0, 0);\n  };\n\n  /**\n   * Returns whether or not the user is \"scrubbing\". Scrubbing is\n   * when the user has clicked the progress bar handle and is\n   * dragging it along the progress bar.\n   *\n   * @param {boolean} [isScrubbing]\n   *        wether the user is or is not scrubbing\n   *\n   * @return {boolean}\n   *         The value of scrubbing when getting\n   */\n\n\n  Player.prototype.scrubbing = function scrubbing(isScrubbing) {\n    if (typeof isScrubbing === 'undefined') {\n      return this.scrubbing_;\n    }\n    this.scrubbing_ = !!isScrubbing;\n\n    if (isScrubbing) {\n      this.addClass('vjs-scrubbing');\n    } else {\n      this.removeClass('vjs-scrubbing');\n    }\n  };\n\n  /**\n   * Get or set the current time (in seconds)\n   *\n   * @param {number|string} [seconds]\n   *        The time to seek to in seconds\n   *\n   * @return {number}\n   *         - the current time in seconds when getting\n   */\n\n\n  Player.prototype.currentTime = function currentTime(seconds) {\n    if (typeof seconds !== 'undefined') {\n      if (seconds < 0) {\n        seconds = 0;\n      }\n      this.techCall_('setCurrentTime', seconds);\n      return;\n    }\n\n    // cache last currentTime and return. default to 0 seconds\n    //\n    // Caching the currentTime is meant to prevent a massive amount of reads on the tech's\n    // currentTime when scrubbing, but may not provide much performance benefit afterall.\n    // Should be tested. Also something has to read the actual current time or the cache will\n    // never get updated.\n    this.cache_.currentTime = this.techGet_('currentTime') || 0;\n    return this.cache_.currentTime;\n  };\n\n  /**\n   * Normally gets the length in time of the video in seconds;\n   * in all but the rarest use cases an argument will NOT be passed to the method\n   *\n   * > **NOTE**: The video must have started loading before the duration can be\n   * known, and in the case of Flash, may not be known until the video starts\n   * playing.\n   *\n   * @fires Player#durationchange\n   *\n   * @param {number} [seconds]\n   *        The duration of the video to set in seconds\n   *\n   * @return {number}\n   *         - The duration of the video in seconds when getting\n   */\n\n\n  Player.prototype.duration = function duration(seconds) {\n    if (seconds === undefined) {\n      // return NaN if the duration is not known\n      return this.cache_.duration !== undefined ? this.cache_.duration : NaN;\n    }\n\n    seconds = parseFloat(seconds);\n\n    // Standardize on Inifity for signaling video is live\n    if (seconds < 0) {\n      seconds = Infinity;\n    }\n\n    if (seconds !== this.cache_.duration) {\n      // Cache the last set value for optimized scrubbing (esp. Flash)\n      this.cache_.duration = seconds;\n\n      if (seconds === Infinity) {\n        this.addClass('vjs-live');\n      } else {\n        this.removeClass('vjs-live');\n      }\n      /**\n       * @event Player#durationchange\n       * @type {EventTarget~Event}\n       */\n      this.trigger('durationchange');\n    }\n  };\n\n  /**\n   * Calculates how much time is left in the video. Not part\n   * of the native video API.\n   *\n   * @return {number}\n   *         The time remaining in seconds\n   */\n\n\n  Player.prototype.remainingTime = function remainingTime() {\n    return this.duration() - this.currentTime();\n  };\n\n  /**\n   * A remaining time function that is intented to be used when\n   * the time is to be displayed directly to the user.\n   *\n   * @return {number}\n   *         The rounded time remaining in seconds\n   */\n\n\n  Player.prototype.remainingTimeDisplay = function remainingTimeDisplay() {\n    return Math.floor(this.duration()) - Math.floor(this.currentTime());\n  };\n\n  //\n  // Kind of like an array of portions of the video that have been downloaded.\n\n  /**\n   * Get a TimeRange object with an array of the times of the video\n   * that have been downloaded. If you just want the percent of the\n   * video that's been downloaded, use bufferedPercent.\n   *\n   * @see [Buffered Spec]{@link http://dev.w3.org/html5/spec/video.html#dom-media-buffered}\n   *\n   * @return {TimeRange}\n   *         A mock TimeRange object (following HTML spec)\n   */\n\n\n  Player.prototype.buffered = function buffered() {\n    var buffered = this.techGet_('buffered');\n\n    if (!buffered || !buffered.length) {\n      buffered = createTimeRanges(0, 0);\n    }\n\n    return buffered;\n  };\n\n  /**\n   * Get the percent (as a decimal) of the video that's been downloaded.\n   * This method is not a part of the native HTML video API.\n   *\n   * @return {number}\n   *         A decimal between 0 and 1 representing the percent\n   *         that is bufferred 0 being 0% and 1 being 100%\n   */\n\n\n  Player.prototype.bufferedPercent = function bufferedPercent$$1() {\n    return bufferedPercent(this.buffered(), this.duration());\n  };\n\n  /**\n   * Get the ending time of the last buffered time range\n   * This is used in the progress bar to encapsulate all time ranges.\n   *\n   * @return {number}\n   *         The end of the last buffered time range\n   */\n\n\n  Player.prototype.bufferedEnd = function bufferedEnd() {\n    var buffered = this.buffered();\n    var duration = this.duration();\n    var end = buffered.end(buffered.length - 1);\n\n    if (end > duration) {\n      end = duration;\n    }\n\n    return end;\n  };\n\n  /**\n   * Get or set the current volume of the media\n   *\n   * @param  {number} [percentAsDecimal]\n   *         The new volume as a decimal percent:\n   *         - 0 is muted/0%/off\n   *         - 1.0 is 100%/full\n   *         - 0.5 is half volume or 50%\n   *\n   * @return {number}\n   *         The current volume as a percent when getting\n   */\n\n\n  Player.prototype.volume = function volume(percentAsDecimal) {\n    var vol = void 0;\n\n    if (percentAsDecimal !== undefined) {\n      // Force value to between 0 and 1\n      vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal)));\n      this.cache_.volume = vol;\n      this.techCall_('setVolume', vol);\n\n      if (vol > 0) {\n        this.lastVolume_(vol);\n      }\n\n      return;\n    }\n\n    // Default to 1 when returning current volume.\n    vol = parseFloat(this.techGet_('volume'));\n    return isNaN(vol) ? 1 : vol;\n  };\n\n  /**\n   * Get the current muted state, or turn mute on or off\n   *\n   * @param {boolean} [muted]\n   *        - true to mute\n   *        - false to unmute\n   *\n   * @return {boolean}\n   *         - true if mute is on and getting\n   *         - false if mute is off and getting\n   */\n\n\n  Player.prototype.muted = function muted(_muted) {\n    if (_muted !== undefined) {\n      this.techCall_('setMuted', _muted);\n      return;\n    }\n    return this.techGet_('muted') || false;\n  };\n\n  /**\n   * Get the current defaultMuted state, or turn defaultMuted on or off. defaultMuted\n   * indicates the state of muted on intial playback.\n   *\n   * ```js\n   *   var myPlayer = videojs('some-player-id');\n   *\n   *   myPlayer.src(\"http://www.example.com/path/to/video.mp4\");\n   *\n   *   // get, should be false\n   *   console.log(myPlayer.defaultMuted());\n   *   // set to true\n   *   myPlayer.defaultMuted(true);\n   *   // get should be true\n   *   console.log(myPlayer.defaultMuted());\n   * ```\n   *\n   * @param {boolean} [defaultMuted]\n   *        - true to mute\n   *        - false to unmute\n   *\n   * @return {boolean|Player}\n   *         - true if defaultMuted is on and getting\n   *         - false if defaultMuted is off and getting\n   *         - A reference to the current player when setting\n   */\n\n\n  Player.prototype.defaultMuted = function defaultMuted(_defaultMuted) {\n    if (_defaultMuted !== undefined) {\n      return this.techCall_('setDefaultMuted', _defaultMuted);\n    }\n    return this.techGet_('defaultMuted') || false;\n  };\n\n  /**\n   * Get the last volume, or set it\n   *\n   * @param  {number} [percentAsDecimal]\n   *         The new last volume as a decimal percent:\n   *         - 0 is muted/0%/off\n   *         - 1.0 is 100%/full\n   *         - 0.5 is half volume or 50%\n   *\n   * @return {number}\n   *         the current value of lastVolume as a percent when getting\n   *\n   * @private\n   */\n\n\n  Player.prototype.lastVolume_ = function lastVolume_(percentAsDecimal) {\n    if (percentAsDecimal !== undefined && percentAsDecimal !== 0) {\n      this.cache_.lastVolume = percentAsDecimal;\n      return;\n    }\n    return this.cache_.lastVolume;\n  };\n\n  /**\n   * Check if current tech can support native fullscreen\n   * (e.g. with built in controls like iOS, so not our flash swf)\n   *\n   * @return {boolean}\n   *         if native fullscreen is supported\n   */\n\n\n  Player.prototype.supportsFullScreen = function supportsFullScreen() {\n    return this.techGet_('supportsFullScreen') || false;\n  };\n\n  /**\n   * Check if the player is in fullscreen mode or tell the player that it\n   * is or is not in fullscreen mode.\n   *\n   * > NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official\n   * property and instead document.fullscreenElement is used. But isFullscreen is\n   * still a valuable property for internal player workings.\n   *\n   * @param  {boolean} [isFS]\n   *         Set the players current fullscreen state\n   *\n   * @return {boolean}\n   *         - true if fullscreen is on and getting\n   *         - false if fullscreen is off and getting\n   */\n\n\n  Player.prototype.isFullscreen = function isFullscreen(isFS) {\n    if (isFS !== undefined) {\n      this.isFullscreen_ = !!isFS;\n      return;\n    }\n    return !!this.isFullscreen_;\n  };\n\n  /**\n   * Increase the size of the video to full screen\n   * In some browsers, full screen is not supported natively, so it enters\n   * \"full window mode\", where the video fills the browser window.\n   * In browsers and devices that support native full screen, sometimes the\n   * browser's default controls will be shown, and not the Video.js custom skin.\n   * This includes most mobile devices (iOS, Android) and older versions of\n   * Safari.\n   *\n   * @fires Player#fullscreenchange\n   */\n\n\n  Player.prototype.requestFullscreen = function requestFullscreen() {\n    var fsApi = FullscreenApi;\n\n    this.isFullscreen(true);\n\n    if (fsApi.requestFullscreen) {\n      // the browser supports going fullscreen at the element level so we can\n      // take the controls fullscreen as well as the video\n\n      // Trigger fullscreenchange event after change\n      // We have to specifically add this each time, and remove\n      // when canceling fullscreen. Otherwise if there's multiple\n      // players on a page, they would all be reacting to the same fullscreen\n      // events\n      on(document, fsApi.fullscreenchange, bind(this, function documentFullscreenChange(e) {\n        this.isFullscreen(document[fsApi.fullscreenElement]);\n\n        // If cancelling fullscreen, remove event listener.\n        if (this.isFullscreen() === false) {\n          off(document, fsApi.fullscreenchange, documentFullscreenChange);\n        }\n        /**\n         * @event Player#fullscreenchange\n         * @type {EventTarget~Event}\n         */\n        this.trigger('fullscreenchange');\n      }));\n\n      this.el_[fsApi.requestFullscreen]();\n    } else if (this.tech_.supportsFullScreen()) {\n      // we can't take the video.js controls fullscreen but we can go fullscreen\n      // with native controls\n      this.techCall_('enterFullScreen');\n    } else {\n      // fullscreen isn't supported so we'll just stretch the video element to\n      // fill the viewport\n      this.enterFullWindow();\n      /**\n       * @event Player#fullscreenchange\n       * @type {EventTarget~Event}\n       */\n      this.trigger('fullscreenchange');\n    }\n  };\n\n  /**\n   * Return the video to its normal size after having been in full screen mode\n   *\n   * @fires Player#fullscreenchange\n   */\n\n\n  Player.prototype.exitFullscreen = function exitFullscreen() {\n    var fsApi = FullscreenApi;\n\n    this.isFullscreen(false);\n\n    // Check for browser element fullscreen support\n    if (fsApi.requestFullscreen) {\n      document[fsApi.exitFullscreen]();\n    } else if (this.tech_.supportsFullScreen()) {\n      this.techCall_('exitFullScreen');\n    } else {\n      this.exitFullWindow();\n      /**\n       * @event Player#fullscreenchange\n       * @type {EventTarget~Event}\n       */\n      this.trigger('fullscreenchange');\n    }\n  };\n\n  /**\n   * When fullscreen isn't supported we can stretch the\n   * video container to as wide as the browser will let us.\n   *\n   * @fires Player#enterFullWindow\n   */\n\n\n  Player.prototype.enterFullWindow = function enterFullWindow() {\n    this.isFullWindow = true;\n\n    // Storing original doc overflow value to return to when fullscreen is off\n    this.docOrigOverflow = document.documentElement.style.overflow;\n\n    // Add listener for esc key to exit fullscreen\n    on(document, 'keydown', bind(this, this.fullWindowOnEscKey));\n\n    // Hide any scroll bars\n    document.documentElement.style.overflow = 'hidden';\n\n    // Apply fullscreen styles\n    addClass(document.body, 'vjs-full-window');\n\n    /**\n     * @event Player#enterFullWindow\n     * @type {EventTarget~Event}\n     */\n    this.trigger('enterFullWindow');\n  };\n\n  /**\n   * Check for call to either exit full window or\n   * full screen on ESC key\n   *\n   * @param {string} event\n   *        Event to check for key press\n   */\n\n\n  Player.prototype.fullWindowOnEscKey = function fullWindowOnEscKey(event) {\n    if (event.keyCode === 27) {\n      if (this.isFullscreen() === true) {\n        this.exitFullscreen();\n      } else {\n        this.exitFullWindow();\n      }\n    }\n  };\n\n  /**\n   * Exit full window\n   *\n   * @fires Player#exitFullWindow\n   */\n\n\n  Player.prototype.exitFullWindow = function exitFullWindow() {\n    this.isFullWindow = false;\n    off(document, 'keydown', this.fullWindowOnEscKey);\n\n    // Unhide scroll bars.\n    document.documentElement.style.overflow = this.docOrigOverflow;\n\n    // Remove fullscreen styles\n    removeClass(document.body, 'vjs-full-window');\n\n    // Resize the box, controller, and poster to original sizes\n    // this.positionAll();\n    /**\n     * @event Player#exitFullWindow\n     * @type {EventTarget~Event}\n     */\n    this.trigger('exitFullWindow');\n  };\n\n  /**\n   * Check whether the player can play a given mimetype\n   *\n   * @see https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype\n   *\n   * @param {string} type\n   *        The mimetype to check\n   *\n   * @return {string}\n   *         'probably', 'maybe', or '' (empty string)\n   */\n\n\n  Player.prototype.canPlayType = function canPlayType(type) {\n    var can = void 0;\n\n    // Loop through each playback technology in the options order\n    for (var i = 0, j = this.options_.techOrder; i < j.length; i++) {\n      var techName = j[i];\n      var tech = Tech.getTech(techName);\n\n      // Support old behavior of techs being registered as components.\n      // Remove once that deprecated behavior is removed.\n      if (!tech) {\n        tech = Component.getComponent(techName);\n      }\n\n      // Check if the current tech is defined before continuing\n      if (!tech) {\n        log$1.error('The \"' + techName + '\" tech is undefined. Skipped browser support check for that tech.');\n        continue;\n      }\n\n      // Check if the browser supports this technology\n      if (tech.isSupported()) {\n        can = tech.canPlayType(type);\n\n        if (can) {\n          return can;\n        }\n      }\n    }\n\n    return '';\n  };\n\n  /**\n   * Select source based on tech-order or source-order\n   * Uses source-order selection if `options.sourceOrder` is truthy. Otherwise,\n   * defaults to tech-order selection\n   *\n   * @param {Array} sources\n   *        The sources for a media asset\n   *\n   * @return {Object|boolean}\n   *         Object of source and tech order or false\n   */\n\n\n  Player.prototype.selectSource = function selectSource(sources) {\n    var _this9 = this;\n\n    // Get only the techs specified in `techOrder` that exist and are supported by the\n    // current platform\n    var techs = this.options_.techOrder.map(function (techName) {\n      return [techName, Tech.getTech(techName)];\n    }).filter(function (_ref) {\n      var techName = _ref[0],\n          tech = _ref[1];\n\n      // Check if the current tech is defined before continuing\n      if (tech) {\n        // Check if the browser supports this technology\n        return tech.isSupported();\n      }\n\n      log$1.error('The \"' + techName + '\" tech is undefined. Skipped browser support check for that tech.');\n      return false;\n    });\n\n    // Iterate over each `innerArray` element once per `outerArray` element and execute\n    // `tester` with both. If `tester` returns a non-falsy value, exit early and return\n    // that value.\n    var findFirstPassingTechSourcePair = function findFirstPassingTechSourcePair(outerArray, innerArray, tester) {\n      var found = void 0;\n\n      outerArray.some(function (outerChoice) {\n        return innerArray.some(function (innerChoice) {\n          found = tester(outerChoice, innerChoice);\n\n          if (found) {\n            return true;\n          }\n        });\n      });\n\n      return found;\n    };\n\n    var foundSourceAndTech = void 0;\n    var flip = function flip(fn) {\n      return function (a, b) {\n        return fn(b, a);\n      };\n    };\n    var finder = function finder(_ref2, source) {\n      var techName = _ref2[0],\n          tech = _ref2[1];\n\n      if (tech.canPlaySource(source, _this9.options_[techName.toLowerCase()])) {\n        return { source: source, tech: techName };\n      }\n    };\n\n    // Depending on the truthiness of `options.sourceOrder`, we swap the order of techs and sources\n    // to select from them based on their priority.\n    if (this.options_.sourceOrder) {\n      // Source-first ordering\n      foundSourceAndTech = findFirstPassingTechSourcePair(sources, techs, flip(finder));\n    } else {\n      // Tech-first ordering\n      foundSourceAndTech = findFirstPassingTechSourcePair(techs, sources, finder);\n    }\n\n    return foundSourceAndTech || false;\n  };\n\n  /**\n   * Get or set the video source.\n   *\n   * @param {Tech~SourceObject|Tech~SourceObject[]|string} [source]\n   *        A SourceObject, an array of SourceObjects, or a string referencing\n   *        a URL to a media source. It is _highly recommended_ that an object\n   *        or array of objects is used here, so that source selection\n   *        algorithms can take the `type` into account.\n   *\n   *        If not provided, this method acts as a getter.\n   *\n   * @return {string|undefined}\n   *         If the `source` argument is missing, returns the current source\n   *         URL. Otherwise, returns nothing/undefined.\n   */\n\n\n  Player.prototype.src = function src(source) {\n    var _this10 = this;\n\n    // getter usage\n    if (typeof source === 'undefined') {\n      return this.cache_.src || '';\n    }\n    // filter out invalid sources and turn our source into\n    // an array of source objects\n    var sources = filterSource(source);\n\n    // if a source was passed in then it is invalid because\n    // it was filtered to a zero length Array. So we have to\n    // show an error\n    if (!sources.length) {\n      this.setTimeout(function () {\n        this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });\n      }, 0);\n      return;\n    }\n\n    // intial sources\n    this.changingSrc_ = true;\n\n    this.cache_.sources = sources;\n    this.updateSourceCaches_(sources[0]);\n\n    // middlewareSource is the source after it has been changed by middleware\n    setSource(this, sources[0], function (middlewareSource, mws) {\n      _this10.middleware_ = mws;\n\n      // since sourceSet is async we have to update the cache again after we select a source since\n      // the source that is selected could be out of order from the cache update above this callback.\n      _this10.cache_.sources = sources;\n      _this10.updateSourceCaches_(middlewareSource);\n\n      var err = _this10.src_(middlewareSource);\n\n      if (err) {\n        if (sources.length > 1) {\n          return _this10.src(sources.slice(1));\n        }\n\n        _this10.changingSrc_ = false;\n\n        // We need to wrap this in a timeout to give folks a chance to add error event handlers\n        _this10.setTimeout(function () {\n          this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });\n        }, 0);\n\n        // we could not find an appropriate tech, but let's still notify the delegate that this is it\n        // this needs a better comment about why this is needed\n        _this10.triggerReady();\n\n        return;\n      }\n\n      setTech(mws, _this10.tech_);\n    });\n  };\n\n  /**\n   * Set the source object on the tech, returns a boolean that indicates wether\n   * there is a tech that can play the source or not\n   *\n   * @param {Tech~SourceObject} source\n   *        The source object to set on the Tech\n   *\n   * @return {Boolean}\n   *         - True if there is no Tech to playback this source\n   *         - False otherwise\n   *\n   * @private\n   */\n\n\n  Player.prototype.src_ = function src_(source) {\n    var _this11 = this;\n\n    var sourceTech = this.selectSource([source]);\n\n    if (!sourceTech) {\n      return true;\n    }\n\n    if (!titleCaseEquals(sourceTech.tech, this.techName_)) {\n      this.changingSrc_ = true;\n      // load this technology with the chosen source\n      this.loadTech_(sourceTech.tech, sourceTech.source);\n      this.tech_.ready(function () {\n        _this11.changingSrc_ = false;\n      });\n      return false;\n    }\n\n    // wait until the tech is ready to set the source\n    // and set it synchronously if possible (#2326)\n    this.ready(function () {\n\n      // The setSource tech method was added with source handlers\n      // so older techs won't support it\n      // We need to check the direct prototype for the case where subclasses\n      // of the tech do not support source handlers\n      if (this.tech_.constructor.prototype.hasOwnProperty('setSource')) {\n        this.techCall_('setSource', source);\n      } else {\n        this.techCall_('src', source.src);\n      }\n\n      this.changingSrc_ = false;\n    }, true);\n\n    return false;\n  };\n\n  /**\n   * Begin loading the src data.\n   */\n\n\n  Player.prototype.load = function load() {\n    this.techCall_('load');\n  };\n\n  /**\n   * Reset the player. Loads the first tech in the techOrder,\n   * and calls `reset` on the tech`.\n   */\n\n\n  Player.prototype.reset = function reset() {\n    if (this.tech_) {\n      this.tech_.clearTracks('text');\n    }\n    this.loadTech_(this.options_.techOrder[0], null);\n    this.techCall_('reset');\n  };\n\n  /**\n   * Returns all of the current source objects.\n   *\n   * @return {Tech~SourceObject[]}\n   *         The current source objects\n   */\n\n\n  Player.prototype.currentSources = function currentSources() {\n    var source = this.currentSource();\n    var sources = [];\n\n    // assume `{}` or `{ src }`\n    if (Object.keys(source).length !== 0) {\n      sources.push(source);\n    }\n\n    return this.cache_.sources || sources;\n  };\n\n  /**\n   * Returns the current source object.\n   *\n   * @return {Tech~SourceObject}\n   *         The current source object\n   */\n\n\n  Player.prototype.currentSource = function currentSource() {\n    return this.cache_.source || {};\n  };\n\n  /**\n   * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4\n   * Can be used in conjuction with `currentType` to assist in rebuilding the current source object.\n   *\n   * @return {string}\n   *         The current source\n   */\n\n\n  Player.prototype.currentSrc = function currentSrc() {\n    return this.currentSource() && this.currentSource().src || '';\n  };\n\n  /**\n   * Get the current source type e.g. video/mp4\n   * This can allow you rebuild the current source object so that you could load the same\n   * source and tech later\n   *\n   * @return {string}\n   *         The source MIME type\n   */\n\n\n  Player.prototype.currentType = function currentType() {\n    return this.currentSource() && this.currentSource().type || '';\n  };\n\n  /**\n   * Get or set the preload attribute\n   *\n   * @param {boolean} [value]\n   *        - true means that we should preload\n   *        - false maens that we should not preload\n   *\n   * @return {string}\n   *         The preload attribute value when getting\n   */\n\n\n  Player.prototype.preload = function preload(value) {\n    if (value !== undefined) {\n      this.techCall_('setPreload', value);\n      this.options_.preload = value;\n      return;\n    }\n    return this.techGet_('preload');\n  };\n\n  /**\n   * Get or set the autoplay option. When this is a boolean it will\n   * modify the attribute on the tech. When this is a string the attribute on\n   * the tech will be removed and `Player` will handle autoplay on loadstarts.\n   *\n   * @param {boolean|string} [value]\n   *        - true: autoplay using the browser behavior\n   *        - false: do not autoplay\n   *        - 'play': call play() on every loadstart\n   *        - 'muted': call muted() then play() on every loadstart\n   *        - 'any': call play() on every loadstart. if that fails call muted() then play().\n   *        - *: values other than those listed here will be set `autoplay` to true\n   *\n   * @return {boolean|string}\n   *         The current value of autoplay when getting\n   */\n\n\n  Player.prototype.autoplay = function autoplay(value) {\n    // getter usage\n    if (value === undefined) {\n      return this.options_.autoplay || false;\n    }\n\n    var techAutoplay = void 0;\n\n    // if the value is a valid string set it to that\n    if (typeof value === 'string' && /(any|play|muted)/.test(value)) {\n      this.options_.autoplay = value;\n      this.manualAutoplay_(value);\n      techAutoplay = false;\n\n      // any falsy value sets autoplay to false in the browser,\n      // lets do the same\n    } else if (!value) {\n      this.options_.autoplay = false;\n\n      // any other value (ie truthy) sets autoplay to true\n    } else {\n      this.options_.autoplay = true;\n    }\n\n    techAutoplay = techAutoplay || this.options_.autoplay;\n\n    // if we don't have a tech then we do not queue up\n    // a setAutoplay call on tech ready. We do this because the\n    // autoplay option will be passed in the constructor and we\n    // do not need to set it twice\n    if (this.tech_) {\n      this.techCall_('setAutoplay', techAutoplay);\n    }\n  };\n\n  /**\n   * Set or unset the playsinline attribute.\n   * Playsinline tells the browser that non-fullscreen playback is preferred.\n   *\n   * @param {boolean} [value]\n   *        - true means that we should try to play inline by default\n   *        - false means that we should use the browser's default playback mode,\n   *          which in most cases is inline. iOS Safari is a notable exception\n   *          and plays fullscreen by default.\n   *\n   * @return {string|Player}\n   *         - the current value of playsinline\n   *         - the player when setting\n   *\n   * @see [Spec]{@link https://html.spec.whatwg.org/#attr-video-playsinline}\n   */\n\n\n  Player.prototype.playsinline = function playsinline(value) {\n    if (value !== undefined) {\n      this.techCall_('setPlaysinline', value);\n      this.options_.playsinline = value;\n      return this;\n    }\n    return this.techGet_('playsinline');\n  };\n\n  /**\n   * Get or set the loop attribute on the video element.\n   *\n   * @param {boolean} [value]\n   *        - true means that we should loop the video\n   *        - false means that we should not loop the video\n   *\n   * @return {string}\n   *         The current value of loop when getting\n   */\n\n\n  Player.prototype.loop = function loop(value) {\n    if (value !== undefined) {\n      this.techCall_('setLoop', value);\n      this.options_.loop = value;\n      return;\n    }\n    return this.techGet_('loop');\n  };\n\n  /**\n   * Get or set the poster image source url\n   *\n   * @fires Player#posterchange\n   *\n   * @param {string} [src]\n   *        Poster image source URL\n   *\n   * @return {string}\n   *         The current value of poster when getting\n   */\n\n\n  Player.prototype.poster = function poster(src) {\n    if (src === undefined) {\n      return this.poster_;\n    }\n\n    // The correct way to remove a poster is to set as an empty string\n    // other falsey values will throw errors\n    if (!src) {\n      src = '';\n    }\n\n    if (src === this.poster_) {\n      return;\n    }\n\n    // update the internal poster variable\n    this.poster_ = src;\n\n    // update the tech's poster\n    this.techCall_('setPoster', src);\n\n    this.isPosterFromTech_ = false;\n\n    // alert components that the poster has been set\n    /**\n     * This event fires when the poster image is changed on the player.\n     *\n     * @event Player#posterchange\n     * @type {EventTarget~Event}\n     */\n    this.trigger('posterchange');\n  };\n\n  /**\n   * Some techs (e.g. YouTube) can provide a poster source in an\n   * asynchronous way. We want the poster component to use this\n   * poster source so that it covers up the tech's controls.\n   * (YouTube's play button). However we only want to use this\n   * source if the player user hasn't set a poster through\n   * the normal APIs.\n   *\n   * @fires Player#posterchange\n   * @listens Tech#posterchange\n   * @private\n   */\n\n\n  Player.prototype.handleTechPosterChange_ = function handleTechPosterChange_() {\n    if ((!this.poster_ || this.options_.techCanOverridePoster) && this.tech_ && this.tech_.poster) {\n      var newPoster = this.tech_.poster() || '';\n\n      if (newPoster !== this.poster_) {\n        this.poster_ = newPoster;\n        this.isPosterFromTech_ = true;\n\n        // Let components know the poster has changed\n        this.trigger('posterchange');\n      }\n    }\n  };\n\n  /**\n   * Get or set whether or not the controls are showing.\n   *\n   * @fires Player#controlsenabled\n   *\n   * @param {boolean} [bool]\n   *        - true to turn controls on\n   *        - false to turn controls off\n   *\n   * @return {boolean}\n   *         The current value of controls when getting\n   */\n\n\n  Player.prototype.controls = function controls(bool) {\n    if (bool === undefined) {\n      return !!this.controls_;\n    }\n\n    bool = !!bool;\n\n    // Don't trigger a change event unless it actually changed\n    if (this.controls_ === bool) {\n      return;\n    }\n\n    this.controls_ = bool;\n\n    if (this.usingNativeControls()) {\n      this.techCall_('setControls', bool);\n    }\n\n    if (this.controls_) {\n      this.removeClass('vjs-controls-disabled');\n      this.addClass('vjs-controls-enabled');\n      /**\n       * @event Player#controlsenabled\n       * @type {EventTarget~Event}\n       */\n      this.trigger('controlsenabled');\n      if (!this.usingNativeControls()) {\n        this.addTechControlsListeners_();\n      }\n    } else {\n      this.removeClass('vjs-controls-enabled');\n      this.addClass('vjs-controls-disabled');\n      /**\n       * @event Player#controlsdisabled\n       * @type {EventTarget~Event}\n       */\n      this.trigger('controlsdisabled');\n      if (!this.usingNativeControls()) {\n        this.removeTechControlsListeners_();\n      }\n    }\n  };\n\n  /**\n   * Toggle native controls on/off. Native controls are the controls built into\n   * devices (e.g. default iPhone controls), Flash, or other techs\n   * (e.g. Vimeo Controls)\n   * **This should only be set by the current tech, because only the tech knows\n   * if it can support native controls**\n   *\n   * @fires Player#usingnativecontrols\n   * @fires Player#usingcustomcontrols\n   *\n   * @param {boolean} [bool]\n   *        - true to turn native controls on\n   *        - false to turn native controls off\n   *\n   * @return {boolean}\n   *         The current value of native controls when getting\n   */\n\n\n  Player.prototype.usingNativeControls = function usingNativeControls(bool) {\n    if (bool === undefined) {\n      return !!this.usingNativeControls_;\n    }\n\n    bool = !!bool;\n\n    // Don't trigger a change event unless it actually changed\n    if (this.usingNativeControls_ === bool) {\n      return;\n    }\n\n    this.usingNativeControls_ = bool;\n\n    if (this.usingNativeControls_) {\n      this.addClass('vjs-using-native-controls');\n\n      /**\n       * player is using the native device controls\n       *\n       * @event Player#usingnativecontrols\n       * @type {EventTarget~Event}\n       */\n      this.trigger('usingnativecontrols');\n    } else {\n      this.removeClass('vjs-using-native-controls');\n\n      /**\n       * player is using the custom HTML controls\n       *\n       * @event Player#usingcustomcontrols\n       * @type {EventTarget~Event}\n       */\n      this.trigger('usingcustomcontrols');\n    }\n  };\n\n  /**\n   * Set or get the current MediaError\n   *\n   * @fires Player#error\n   *\n   * @param  {MediaError|string|number} [err]\n   *         A MediaError or a string/number to be turned\n   *         into a MediaError\n   *\n   * @return {MediaError|null}\n   *         The current MediaError when getting (or null)\n   */\n\n\n  Player.prototype.error = function error(err) {\n    if (err === undefined) {\n      return this.error_ || null;\n    }\n\n    // restoring to default\n    if (err === null) {\n      this.error_ = err;\n      this.removeClass('vjs-error');\n      if (this.errorDisplay) {\n        this.errorDisplay.close();\n      }\n      return;\n    }\n\n    this.error_ = new MediaError(err);\n\n    // add the vjs-error classname to the player\n    this.addClass('vjs-error');\n\n    // log the name of the error type and any message\n    // ie8 just logs \"[object object]\" if you just log the error object\n    log$1.error('(CODE:' + this.error_.code + ' ' + MediaError.errorTypes[this.error_.code] + ')', this.error_.message, this.error_);\n\n    /**\n     * @event Player#error\n     * @type {EventTarget~Event}\n     */\n    this.trigger('error');\n\n    return;\n  };\n\n  /**\n   * Report user activity\n   *\n   * @param {Object} event\n   *        Event object\n   */\n\n\n  Player.prototype.reportUserActivity = function reportUserActivity(event) {\n    this.userActivity_ = true;\n  };\n\n  /**\n   * Get/set if user is active\n   *\n   * @fires Player#useractive\n   * @fires Player#userinactive\n   *\n   * @param {boolean} [bool]\n   *        - true if the user is active\n   *        - false if the user is inactive\n   *\n   * @return {boolean}\n   *         The current value of userActive when getting\n   */\n\n\n  Player.prototype.userActive = function userActive(bool) {\n    if (bool === undefined) {\n      return this.userActive_;\n    }\n\n    bool = !!bool;\n\n    if (bool === this.userActive_) {\n      return;\n    }\n\n    this.userActive_ = bool;\n\n    if (this.userActive_) {\n      this.userActivity_ = true;\n      this.removeClass('vjs-user-inactive');\n      this.addClass('vjs-user-active');\n      /**\n       * @event Player#useractive\n       * @type {EventTarget~Event}\n       */\n      this.trigger('useractive');\n      return;\n    }\n\n    // Chrome/Safari/IE have bugs where when you change the cursor it can\n    // trigger a mousemove event. This causes an issue when you're hiding\n    // the cursor when the user is inactive, and a mousemove signals user\n    // activity. Making it impossible to go into inactive mode. Specifically\n    // this happens in fullscreen when we really need to hide the cursor.\n    //\n    // When this gets resolved in ALL browsers it can be removed\n    // https://code.google.com/p/chromium/issues/detail?id=103041\n    if (this.tech_) {\n      this.tech_.one('mousemove', function (e) {\n        e.stopPropagation();\n        e.preventDefault();\n      });\n    }\n\n    this.userActivity_ = false;\n    this.removeClass('vjs-user-active');\n    this.addClass('vjs-user-inactive');\n    /**\n     * @event Player#userinactive\n     * @type {EventTarget~Event}\n     */\n    this.trigger('userinactive');\n  };\n\n  /**\n   * Listen for user activity based on timeout value\n   *\n   * @private\n   */\n\n\n  Player.prototype.listenForUserActivity_ = function listenForUserActivity_() {\n    var mouseInProgress = void 0;\n    var lastMoveX = void 0;\n    var lastMoveY = void 0;\n    var handleActivity = bind(this, this.reportUserActivity);\n\n    var handleMouseMove = function handleMouseMove(e) {\n      // #1068 - Prevent mousemove spamming\n      // Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970\n      if (e.screenX !== lastMoveX || e.screenY !== lastMoveY) {\n        lastMoveX = e.screenX;\n        lastMoveY = e.screenY;\n        handleActivity();\n      }\n    };\n\n    var handleMouseDown = function handleMouseDown() {\n      handleActivity();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(mouseInProgress);\n      // Setting userActivity=true now and setting the interval to the same time\n      // as the activityCheck interval (250) should ensure we never miss the\n      // next activityCheck\n      mouseInProgress = this.setInterval(handleActivity, 250);\n    };\n\n    var handleMouseUp = function handleMouseUp(event) {\n      handleActivity();\n      // Stop the interval that maintains activity if the mouse/touch is down\n      this.clearInterval(mouseInProgress);\n    };\n\n    // Any mouse movement will be considered user activity\n    this.on('mousedown', handleMouseDown);\n    this.on('mousemove', handleMouseMove);\n    this.on('mouseup', handleMouseUp);\n\n    // Listen for keyboard navigation\n    // Shouldn't need to use inProgress interval because of key repeat\n    this.on('keydown', handleActivity);\n    this.on('keyup', handleActivity);\n\n    // Run an interval every 250 milliseconds instead of stuffing everything into\n    // the mousemove/touchmove function itself, to prevent performance degradation.\n    // `this.reportUserActivity` simply sets this.userActivity_ to true, which\n    // then gets picked up by this loop\n    // http://ejohn.org/blog/learning-from-twitter/\n    var inactivityTimeout = void 0;\n\n    this.setInterval(function () {\n      // Check to see if mouse/touch activity has happened\n      if (!this.userActivity_) {\n        return;\n      }\n\n      // Reset the activity tracker\n      this.userActivity_ = false;\n\n      // If the user state was inactive, set the state to active\n      this.userActive(true);\n\n      // Clear any existing inactivity timeout to start the timer over\n      this.clearTimeout(inactivityTimeout);\n\n      var timeout = this.options_.inactivityTimeout;\n\n      if (timeout <= 0) {\n        return;\n      }\n\n      // In <timeout> milliseconds, if no more activity has occurred the\n      // user will be considered inactive\n      inactivityTimeout = this.setTimeout(function () {\n        // Protect against the case where the inactivityTimeout can trigger just\n        // before the next user activity is picked up by the activity check loop\n        // causing a flicker\n        if (!this.userActivity_) {\n          this.userActive(false);\n        }\n      }, timeout);\n    }, 250);\n  };\n\n  /**\n   * Gets or sets the current playback rate. A playback rate of\n   * 1.0 represents normal speed and 0.5 would indicate half-speed\n   * playback, for instance.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate\n   *\n   * @param {number} [rate]\n   *       New playback rate to set.\n   *\n   * @return {number}\n   *         The current playback rate when getting or 1.0\n   */\n\n\n  Player.prototype.playbackRate = function playbackRate(rate) {\n    if (rate !== undefined) {\n      // NOTE: this.cache_.lastPlaybackRate is set from the tech handler\n      // that is registered above\n      this.techCall_('setPlaybackRate', rate);\n      return;\n    }\n\n    if (this.tech_ && this.tech_.featuresPlaybackRate) {\n      return this.cache_.lastPlaybackRate || this.techGet_('playbackRate');\n    }\n    return 1.0;\n  };\n\n  /**\n   * Gets or sets the current default playback rate. A default playback rate of\n   * 1.0 represents normal speed and 0.5 would indicate half-speed playback, for instance.\n   * defaultPlaybackRate will only represent what the intial playbackRate of a video was, not\n   * not the current playbackRate.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-defaultplaybackrate\n   *\n   * @param {number} [rate]\n   *       New default playback rate to set.\n   *\n   * @return {number|Player}\n   *         - The default playback rate when getting or 1.0\n   *         - the player when setting\n   */\n\n\n  Player.prototype.defaultPlaybackRate = function defaultPlaybackRate(rate) {\n    if (rate !== undefined) {\n      return this.techCall_('setDefaultPlaybackRate', rate);\n    }\n\n    if (this.tech_ && this.tech_.featuresPlaybackRate) {\n      return this.techGet_('defaultPlaybackRate');\n    }\n    return 1.0;\n  };\n\n  /**\n   * Gets or sets the audio flag\n   *\n   * @param {boolean} bool\n   *        - true signals that this is an audio player\n   *        - false signals that this is not an audio player\n   *\n   * @return {boolean}\n   *         The current value of isAudio when getting\n   */\n\n\n  Player.prototype.isAudio = function isAudio(bool) {\n    if (bool !== undefined) {\n      this.isAudio_ = !!bool;\n      return;\n    }\n\n    return !!this.isAudio_;\n  };\n\n  /**\n   * A helper method for adding a {@link TextTrack} to our\n   * {@link TextTrackList}.\n   *\n   * In addition to the W3C settings we allow adding additional info through options.\n   *\n   * @see http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack\n   *\n   * @param {string} [kind]\n   *        the kind of TextTrack you are adding\n   *\n   * @param {string} [label]\n   *        the label to give the TextTrack label\n   *\n   * @param {string} [language]\n   *        the language to set on the TextTrack\n   *\n   * @return {TextTrack|undefined}\n   *         the TextTrack that was added or undefined\n   *         if there is no tech\n   */\n\n\n  Player.prototype.addTextTrack = function addTextTrack(kind, label, language) {\n    if (this.tech_) {\n      return this.tech_.addTextTrack(kind, label, language);\n    }\n  };\n\n  /**\n   * Create a remote {@link TextTrack} and an {@link HTMLTrackElement}. It will\n   * automatically removed from the video element whenever the source changes, unless\n   * manualCleanup is set to false.\n   *\n   * @param {Object} options\n   *        Options to pass to {@link HTMLTrackElement} during creation. See\n   *        {@link HTMLTrackElement} for object properties that you should use.\n   *\n   * @param {boolean} [manualCleanup=true] if set to false, the TextTrack will be\n   *\n   * @return {HtmlTrackElement}\n   *         the HTMLTrackElement that was created and added\n   *         to the HtmlTrackElementList and the remote\n   *         TextTrackList\n   *\n   * @deprecated The default value of the \"manualCleanup\" parameter will default\n   *             to \"false\" in upcoming versions of Video.js\n   */\n\n\n  Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) {\n    if (this.tech_) {\n      return this.tech_.addRemoteTextTrack(options, manualCleanup);\n    }\n  };\n\n  /**\n   * Remove a remote {@link TextTrack} from the respective\n   * {@link TextTrackList} and {@link HtmlTrackElementList}.\n   *\n   * @param {Object} track\n   *        Remote {@link TextTrack} to remove\n   *\n   * @return {undefined}\n   *         does not return anything\n   */\n\n\n  Player.prototype.removeRemoteTextTrack = function removeRemoteTextTrack() {\n    var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        _ref3$track = _ref3.track,\n        track = _ref3$track === undefined ? arguments[0] : _ref3$track;\n\n    // destructure the input into an object with a track argument, defaulting to arguments[0]\n    // default the whole argument to an empty object if nothing was passed in\n\n    if (this.tech_) {\n      return this.tech_.removeRemoteTextTrack(track);\n    }\n  };\n\n  /**\n   * Gets available media playback quality metrics as specified by the W3C's Media\n   * Playback Quality API.\n   *\n   * @see [Spec]{@link https://wicg.github.io/media-playback-quality}\n   *\n   * @return {Object|undefined}\n   *         An object with supported media playback quality metrics or undefined if there\n   *         is no tech or the tech does not support it.\n   */\n\n\n  Player.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() {\n    return this.techGet_('getVideoPlaybackQuality');\n  };\n\n  /**\n   * Get video width\n   *\n   * @return {number}\n   *         current video width\n   */\n\n\n  Player.prototype.videoWidth = function videoWidth() {\n    return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;\n  };\n\n  /**\n   * Get video height\n   *\n   * @return {number}\n   *         current video height\n   */\n\n\n  Player.prototype.videoHeight = function videoHeight() {\n    return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;\n  };\n\n  /**\n   * The player's language code\n   * NOTE: The language should be set in the player options if you want the\n   * the controls to be built with a specific language. Changing the lanugage\n   * later will not update controls text.\n   *\n   * @param {string} [code]\n   *        the language code to set the player to\n   *\n   * @return {string}\n   *         The current language code when getting\n   */\n\n\n  Player.prototype.language = function language(code) {\n    if (code === undefined) {\n      return this.language_;\n    }\n\n    this.language_ = String(code).toLowerCase();\n  };\n\n  /**\n   * Get the player's language dictionary\n   * Merge every time, because a newly added plugin might call videojs.addLanguage() at any time\n   * Languages specified directly in the player options have precedence\n   *\n   * @return {Array}\n   *         An array of of supported languages\n   */\n\n\n  Player.prototype.languages = function languages() {\n    return mergeOptions(Player.prototype.options_.languages, this.languages_);\n  };\n\n  /**\n   * returns a JavaScript object reperesenting the current track\n   * information. **DOES not return it as JSON**\n   *\n   * @return {Object}\n   *         Object representing the current of track info\n   */\n\n\n  Player.prototype.toJSON = function toJSON() {\n    var options = mergeOptions(this.options_);\n    var tracks = options.tracks;\n\n    options.tracks = [];\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      // deep merge tracks and null out player so no circular references\n      track = mergeOptions(track);\n      track.player = undefined;\n      options.tracks[i] = track;\n    }\n\n    return options;\n  };\n\n  /**\n   * Creates a simple modal dialog (an instance of the {@link ModalDialog}\n   * component) that immediately overlays the player with arbitrary\n   * content and removes itself when closed.\n   *\n   * @param {string|Function|Element|Array|null} content\n   *        Same as {@link ModalDialog#content}'s param of the same name.\n   *        The most straight-forward usage is to provide a string or DOM\n   *        element.\n   *\n   * @param {Object} [options]\n   *        Extra options which will be passed on to the {@link ModalDialog}.\n   *\n   * @return {ModalDialog}\n   *         the {@link ModalDialog} that was created\n   */\n\n\n  Player.prototype.createModal = function createModal(content, options) {\n    var _this12 = this;\n\n    options = options || {};\n    options.content = content || '';\n\n    var modal = new ModalDialog(this, options);\n\n    this.addChild(modal);\n    modal.on('dispose', function () {\n      _this12.removeChild(modal);\n    });\n\n    modal.open();\n    return modal;\n  };\n\n  /**\n   * Gets tag settings\n   *\n   * @param {Element} tag\n   *        The player tag\n   *\n   * @return {Object}\n   *         An object containing all of the settings\n   *         for a player tag\n   */\n\n\n  Player.getTagSettings = function getTagSettings(tag) {\n    var baseOptions = {\n      sources: [],\n      tracks: []\n    };\n\n    var tagOptions = getAttributes(tag);\n    var dataSetup = tagOptions['data-setup'];\n\n    if (hasClass(tag, 'vjs-fluid')) {\n      tagOptions.fluid = true;\n    }\n\n    // Check if data-setup attr exists.\n    if (dataSetup !== null) {\n      // Parse options JSON\n      // If empty string, make it a parsable json object.\n      var _safeParseTuple = safeParseTuple(dataSetup || '{}'),\n          err = _safeParseTuple[0],\n          data = _safeParseTuple[1];\n\n      if (err) {\n        log$1.error(err);\n      }\n      assign(tagOptions, data);\n    }\n\n    assign(baseOptions, tagOptions);\n\n    // Get tag children settings\n    if (tag.hasChildNodes()) {\n      var children = tag.childNodes;\n\n      for (var i = 0, j = children.length; i < j; i++) {\n        var child = children[i];\n        // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/\n        var childName = child.nodeName.toLowerCase();\n\n        if (childName === 'source') {\n          baseOptions.sources.push(getAttributes(child));\n        } else if (childName === 'track') {\n          baseOptions.tracks.push(getAttributes(child));\n        }\n      }\n    }\n\n    return baseOptions;\n  };\n\n  /**\n   * Determine wether or not flexbox is supported\n   *\n   * @return {boolean}\n   *         - true if flexbox is supported\n   *         - false if flexbox is not supported\n   */\n\n\n  Player.prototype.flexNotSupported_ = function flexNotSupported_() {\n    var elem = document.createElement('i');\n\n    // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more\n    // common flex features that we can rely on when checking for flex support.\n    return !('flexBasis' in elem.style || 'webkitFlexBasis' in elem.style || 'mozFlexBasis' in elem.style || 'msFlexBasis' in elem.style ||\n    // IE10-specific (2012 flex spec)\n    'msFlexOrder' in elem.style);\n  };\n\n  return Player;\n}(Component);\n\n/**\n * Get the {@link VideoTrackList}\n * @link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist\n *\n * @return {VideoTrackList}\n *         the current video track list\n *\n * @method Player.prototype.videoTracks\n */\n\n/**\n * Get the {@link AudioTrackList}\n * @link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist\n *\n * @return {AudioTrackList}\n *         the current audio track list\n *\n * @method Player.prototype.audioTracks\n */\n\n/**\n * Get the {@link TextTrackList}\n *\n * @link http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks\n *\n * @return {TextTrackList}\n *         the current text track list\n *\n * @method Player.prototype.textTracks\n */\n\n/**\n * Get the remote {@link TextTrackList}\n *\n * @return {TextTrackList}\n *         The current remote text track list\n *\n * @method Player.prototype.remoteTextTracks\n */\n\n/**\n * Get the remote {@link HtmlTrackElementList} tracks.\n *\n * @return {HtmlTrackElementList}\n *         The current remote text track element list\n *\n * @method Player.prototype.remoteTextTrackEls\n */\n\nALL.names.forEach(function (name$$1) {\n  var props = ALL[name$$1];\n\n  Player.prototype[props.getterName] = function () {\n    if (this.tech_) {\n      return this.tech_[props.getterName]();\n    }\n\n    // if we have not yet loadTech_, we create {video,audio,text}Tracks_\n    // these will be passed to the tech during loading\n    this[props.privateName] = this[props.privateName] || new props.ListClass();\n    return this[props.privateName];\n  };\n});\n\n/**\n * Global player list\n *\n * @type {Object}\n */\nPlayer.players = {};\n\nvar navigator = window.navigator;\n\n/*\n * Player instance options, surfaced using options\n * options = Player.prototype.options_\n * Make changes in options, not here.\n *\n * @type {Object}\n * @private\n */\nPlayer.prototype.options_ = {\n  // Default order of fallback technology\n  techOrder: Tech.defaultTechOrder_,\n\n  html5: {},\n  flash: {},\n\n  // default inactivity timeout\n  inactivityTimeout: 2000,\n\n  // default playback rates\n  playbackRates: [],\n  // Add playback rate selection by adding rates\n  // 'playbackRates': [0.5, 1, 1.5, 2],\n\n  // Included control sets\n  children: ['mediaLoader', 'posterImage', 'textTrackDisplay', 'loadingSpinner', 'bigPlayButton', 'controlBar', 'errorDisplay', 'textTrackSettings'],\n\n  language: navigator && (navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language) || 'en',\n\n  // locales and their language translations\n  languages: {},\n\n  // Default message to show when a video cannot be played.\n  notSupportedMessage: 'No compatible source was found for this media.'\n};\n\nif (!IS_IE8) {\n  Player.prototype.options_.children.push('resizeManager');\n}\n\n[\n/**\n * Returns whether or not the player is in the \"ended\" state.\n *\n * @return {Boolean} True if the player is in the ended state, false if not.\n * @method Player#ended\n */\n'ended',\n/**\n * Returns whether or not the player is in the \"seeking\" state.\n *\n * @return {Boolean} True if the player is in the seeking state, false if not.\n * @method Player#seeking\n */\n'seeking',\n/**\n * Returns the TimeRanges of the media that are currently available\n * for seeking to.\n *\n * @return {TimeRanges} the seekable intervals of the media timeline\n * @method Player#seekable\n */\n'seekable',\n/**\n * Returns the current state of network activity for the element, from\n * the codes in the list below.\n * - NETWORK_EMPTY (numeric value 0)\n *   The element has not yet been initialised. All attributes are in\n *   their initial states.\n * - NETWORK_IDLE (numeric value 1)\n *   The element's resource selection algorithm is active and has\n *   selected a resource, but it is not actually using the network at\n *   this time.\n * - NETWORK_LOADING (numeric value 2)\n *   The user agent is actively trying to download data.\n * - NETWORK_NO_SOURCE (numeric value 3)\n *   The element's resource selection algorithm is active, but it has\n *   not yet found a resource to use.\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states\n * @return {number} the current network activity state\n * @method Player#networkState\n */\n'networkState',\n/**\n * Returns a value that expresses the current state of the element\n * with respect to rendering the current playback position, from the\n * codes in the list below.\n * - HAVE_NOTHING (numeric value 0)\n *   No information regarding the media resource is available.\n * - HAVE_METADATA (numeric value 1)\n *   Enough of the resource has been obtained that the duration of the\n *   resource is available.\n * - HAVE_CURRENT_DATA (numeric value 2)\n *   Data for the immediate current playback position is available.\n * - HAVE_FUTURE_DATA (numeric value 3)\n *   Data for the immediate current playback position is available, as\n *   well as enough data for the user agent to advance the current\n *   playback position in the direction of playback.\n * - HAVE_ENOUGH_DATA (numeric value 4)\n *   The user agent estimates that enough data is available for\n *   playback to proceed uninterrupted.\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate\n * @return {number} the current playback rendering state\n * @method Player#readyState\n */\n'readyState'].forEach(function (fn) {\n  Player.prototype[fn] = function () {\n    return this.techGet_(fn);\n  };\n});\n\nTECH_EVENTS_RETRIGGER.forEach(function (event) {\n  Player.prototype['handleTech' + toTitleCase(event) + '_'] = function () {\n    return this.trigger(event);\n  };\n});\n\n/**\n * Fired when the player has initial duration and dimension information\n *\n * @event Player#loadedmetadata\n * @type {EventTarget~Event}\n */\n\n/**\n * Fired when the player has downloaded data at the current playback position\n *\n * @event Player#loadeddata\n * @type {EventTarget~Event}\n */\n\n/**\n * Fired when the current playback position has changed *\n * During playback this is fired every 15-250 milliseconds, depending on the\n * playback technology in use.\n *\n * @event Player#timeupdate\n * @type {EventTarget~Event}\n */\n\n/**\n * Fired when the volume changes\n *\n * @event Player#volumechange\n * @type {EventTarget~Event}\n */\n\n/**\n * Reports whether or not a player has a plugin available.\n *\n * This does not report whether or not the plugin has ever been initialized\n * on this player. For that, [usingPlugin]{@link Player#usingPlugin}.\n *\n * @method Player#hasPlugin\n * @param  {string}  name\n *         The name of a plugin.\n *\n * @return {boolean}\n *         Whether or not this player has the requested plugin available.\n */\n\n/**\n * Reports whether or not a player is using a plugin by name.\n *\n * For basic plugins, this only reports whether the plugin has _ever_ been\n * initialized on this player.\n *\n * @method Player#usingPlugin\n * @param  {string} name\n *         The name of a plugin.\n *\n * @return {boolean}\n *         Whether or not this player is using the requested plugin.\n */\n\nComponent.registerComponent('Player', Player);\n\n/**\n * @file plugin.js\n */\n/**\n * The base plugin name.\n *\n * @private\n * @constant\n * @type {string}\n */\nvar BASE_PLUGIN_NAME = 'plugin';\n\n/**\n * The key on which a player's active plugins cache is stored.\n *\n * @private\n * @constant\n * @type     {string}\n */\nvar PLUGIN_CACHE_KEY = 'activePlugins_';\n\n/**\n * Stores registered plugins in a private space.\n *\n * @private\n * @type    {Object}\n */\nvar pluginStorage = {};\n\n/**\n * Reports whether or not a plugin has been registered.\n *\n * @private\n * @param   {string} name\n *          The name of a plugin.\n *\n * @returns {boolean}\n *          Whether or not the plugin has been registered.\n */\nvar pluginExists = function pluginExists(name) {\n  return pluginStorage.hasOwnProperty(name);\n};\n\n/**\n * Get a single registered plugin by name.\n *\n * @private\n * @param   {string} name\n *          The name of a plugin.\n *\n * @returns {Function|undefined}\n *          The plugin (or undefined).\n */\nvar getPlugin = function getPlugin(name) {\n  return pluginExists(name) ? pluginStorage[name] : undefined;\n};\n\n/**\n * Marks a plugin as \"active\" on a player.\n *\n * Also, ensures that the player has an object for tracking active plugins.\n *\n * @private\n * @param   {Player} player\n *          A Video.js player instance.\n *\n * @param   {string} name\n *          The name of a plugin.\n */\nvar markPluginAsActive = function markPluginAsActive(player, name) {\n  player[PLUGIN_CACHE_KEY] = player[PLUGIN_CACHE_KEY] || {};\n  player[PLUGIN_CACHE_KEY][name] = true;\n};\n\n/**\n * Triggers a pair of plugin setup events.\n *\n * @private\n * @param  {Player} player\n *         A Video.js player instance.\n *\n * @param  {Plugin~PluginEventHash} hash\n *         A plugin event hash.\n *\n * @param  {Boolean} [before]\n *         If true, prefixes the event name with \"before\". In other words,\n *         use this to trigger \"beforepluginsetup\" instead of \"pluginsetup\".\n */\nvar triggerSetupEvent = function triggerSetupEvent(player, hash, before) {\n  var eventName = (before ? 'before' : '') + 'pluginsetup';\n\n  player.trigger(eventName, hash);\n  player.trigger(eventName + ':' + hash.name, hash);\n};\n\n/**\n * Takes a basic plugin function and returns a wrapper function which marks\n * on the player that the plugin has been activated.\n *\n * @private\n * @param   {string} name\n *          The name of the plugin.\n *\n * @param   {Function} plugin\n *          The basic plugin.\n *\n * @returns {Function}\n *          A wrapper function for the given plugin.\n */\nvar createBasicPlugin = function createBasicPlugin(name, plugin) {\n  var basicPluginWrapper = function basicPluginWrapper() {\n\n    // We trigger the \"beforepluginsetup\" and \"pluginsetup\" events on the player\n    // regardless, but we want the hash to be consistent with the hash provided\n    // for advanced plugins.\n    //\n    // The only potentially counter-intuitive thing here is the `instance` in\n    // the \"pluginsetup\" event is the value returned by the `plugin` function.\n    triggerSetupEvent(this, { name: name, plugin: plugin, instance: null }, true);\n\n    var instance = plugin.apply(this, arguments);\n\n    markPluginAsActive(this, name);\n    triggerSetupEvent(this, { name: name, plugin: plugin, instance: instance });\n\n    return instance;\n  };\n\n  Object.keys(plugin).forEach(function (prop) {\n    basicPluginWrapper[prop] = plugin[prop];\n  });\n\n  return basicPluginWrapper;\n};\n\n/**\n * Takes a plugin sub-class and returns a factory function for generating\n * instances of it.\n *\n * This factory function will replace itself with an instance of the requested\n * sub-class of Plugin.\n *\n * @private\n * @param   {string} name\n *          The name of the plugin.\n *\n * @param   {Plugin} PluginSubClass\n *          The advanced plugin.\n *\n * @returns {Function}\n */\nvar createPluginFactory = function createPluginFactory(name, PluginSubClass) {\n\n  // Add a `name` property to the plugin prototype so that each plugin can\n  // refer to itself by name.\n  PluginSubClass.prototype.name = name;\n\n  return function () {\n    triggerSetupEvent(this, { name: name, plugin: PluginSubClass, instance: null }, true);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    var instance = new (Function.prototype.bind.apply(PluginSubClass, [null].concat([this].concat(args))))();\n\n    // The plugin is replaced by a function that returns the current instance.\n    this[name] = function () {\n      return instance;\n    };\n\n    triggerSetupEvent(this, instance.getEventHash());\n\n    return instance;\n  };\n};\n\n/**\n * Parent class for all advanced plugins.\n *\n * @mixes   module:evented~EventedMixin\n * @mixes   module:stateful~StatefulMixin\n * @fires   Player#beforepluginsetup\n * @fires   Player#beforepluginsetup:$name\n * @fires   Player#pluginsetup\n * @fires   Player#pluginsetup:$name\n * @listens Player#dispose\n * @throws  {Error}\n *          If attempting to instantiate the base {@link Plugin} class\n *          directly instead of via a sub-class.\n */\n\nvar Plugin = function () {\n\n  /**\n   * Creates an instance of this class.\n   *\n   * Sub-classes should call `super` to ensure plugins are properly initialized.\n   *\n   * @param {Player} player\n   *        A Video.js player instance.\n   */\n  function Plugin(player) {\n    classCallCheck(this, Plugin);\n\n    if (this.constructor === Plugin) {\n      throw new Error('Plugin must be sub-classed; not directly instantiated.');\n    }\n\n    this.player = player;\n\n    // Make this object evented, but remove the added `trigger` method so we\n    // use the prototype version instead.\n    evented(this);\n    delete this.trigger;\n\n    stateful(this, this.constructor.defaultState);\n    markPluginAsActive(player, this.name);\n\n    // Auto-bind the dispose method so we can use it as a listener and unbind\n    // it later easily.\n    this.dispose = bind(this, this.dispose);\n\n    // If the player is disposed, dispose the plugin.\n    player.on('dispose', this.dispose);\n  }\n\n  /**\n   * Get the version of the plugin that was set on <pluginName>.VERSION\n   */\n\n\n  Plugin.prototype.version = function version() {\n    return this.constructor.VERSION;\n  };\n\n  /**\n   * Each event triggered by plugins includes a hash of additional data with\n   * conventional properties.\n   *\n   * This returns that object or mutates an existing hash.\n   *\n   * @param   {Object} [hash={}]\n   *          An object to be used as event an event hash.\n   *\n   * @returns {Plugin~PluginEventHash}\n   *          An event hash object with provided properties mixed-in.\n   */\n\n\n  Plugin.prototype.getEventHash = function getEventHash() {\n    var hash = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    hash.name = this.name;\n    hash.plugin = this.constructor;\n    hash.instance = this;\n    return hash;\n  };\n\n  /**\n   * Triggers an event on the plugin object and overrides\n   * {@link module:evented~EventedMixin.trigger|EventedMixin.trigger}.\n   *\n   * @param   {string|Object} event\n   *          An event type or an object with a type property.\n   *\n   * @param   {Object} [hash={}]\n   *          Additional data hash to merge with a\n   *          {@link Plugin~PluginEventHash|PluginEventHash}.\n   *\n   * @returns {boolean}\n   *          Whether or not default was prevented.\n   */\n\n\n  Plugin.prototype.trigger = function trigger$$1(event) {\n    var hash = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    return trigger(this.eventBusEl_, event, this.getEventHash(hash));\n  };\n\n  /**\n   * Handles \"statechanged\" events on the plugin. No-op by default, override by\n   * subclassing.\n   *\n   * @abstract\n   * @param    {Event} e\n   *           An event object provided by a \"statechanged\" event.\n   *\n   * @param    {Object} e.changes\n   *           An object describing changes that occurred with the \"statechanged\"\n   *           event.\n   */\n\n\n  Plugin.prototype.handleStateChanged = function handleStateChanged(e) {};\n\n  /**\n   * Disposes a plugin.\n   *\n   * Subclasses can override this if they want, but for the sake of safety,\n   * it's probably best to subscribe the \"dispose\" event.\n   *\n   * @fires Plugin#dispose\n   */\n\n\n  Plugin.prototype.dispose = function dispose() {\n    var name = this.name,\n        player = this.player;\n\n    /**\n     * Signals that a advanced plugin is about to be disposed.\n     *\n     * @event Plugin#dispose\n     * @type  {EventTarget~Event}\n     */\n\n    this.trigger('dispose');\n    this.off();\n    player.off('dispose', this.dispose);\n\n    // Eliminate any possible sources of leaking memory by clearing up\n    // references between the player and the plugin instance and nulling out\n    // the plugin's state and replacing methods with a function that throws.\n    player[PLUGIN_CACHE_KEY][name] = false;\n    this.player = this.state = null;\n\n    // Finally, replace the plugin name on the player with a new factory\n    // function, so that the plugin is ready to be set up again.\n    player[name] = createPluginFactory(name, pluginStorage[name]);\n  };\n\n  /**\n   * Determines if a plugin is a basic plugin (i.e. not a sub-class of `Plugin`).\n   *\n   * @param   {string|Function} plugin\n   *          If a string, matches the name of a plugin. If a function, will be\n   *          tested directly.\n   *\n   * @returns {boolean}\n   *          Whether or not a plugin is a basic plugin.\n   */\n\n\n  Plugin.isBasic = function isBasic(plugin) {\n    var p = typeof plugin === 'string' ? getPlugin(plugin) : plugin;\n\n    return typeof p === 'function' && !Plugin.prototype.isPrototypeOf(p.prototype);\n  };\n\n  /**\n   * Register a Video.js plugin.\n   *\n   * @param   {string} name\n   *          The name of the plugin to be registered. Must be a string and\n   *          must not match an existing plugin or a method on the `Player`\n   *          prototype.\n   *\n   * @param   {Function} plugin\n   *          A sub-class of `Plugin` or a function for basic plugins.\n   *\n   * @returns {Function}\n   *          For advanced plugins, a factory function for that plugin. For\n   *          basic plugins, a wrapper function that initializes the plugin.\n   */\n\n\n  Plugin.registerPlugin = function registerPlugin(name, plugin) {\n    if (typeof name !== 'string') {\n      throw new Error('Illegal plugin name, \"' + name + '\", must be a string, was ' + (typeof name === 'undefined' ? 'undefined' : _typeof(name)) + '.');\n    }\n\n    if (pluginExists(name)) {\n      log$1.warn('A plugin named \"' + name + '\" already exists. You may want to avoid re-registering plugins!');\n    } else if (Player.prototype.hasOwnProperty(name)) {\n      throw new Error('Illegal plugin name, \"' + name + '\", cannot share a name with an existing player method!');\n    }\n\n    if (typeof plugin !== 'function') {\n      throw new Error('Illegal plugin for \"' + name + '\", must be a function, was ' + (typeof plugin === 'undefined' ? 'undefined' : _typeof(plugin)) + '.');\n    }\n\n    pluginStorage[name] = plugin;\n\n    // Add a player prototype method for all sub-classed plugins (but not for\n    // the base Plugin class).\n    if (name !== BASE_PLUGIN_NAME) {\n      if (Plugin.isBasic(plugin)) {\n        Player.prototype[name] = createBasicPlugin(name, plugin);\n      } else {\n        Player.prototype[name] = createPluginFactory(name, plugin);\n      }\n    }\n\n    return plugin;\n  };\n\n  /**\n   * De-register a Video.js plugin.\n   *\n   * @param {string} name\n   *        The name of the plugin to be deregistered.\n   */\n\n\n  Plugin.deregisterPlugin = function deregisterPlugin(name) {\n    if (name === BASE_PLUGIN_NAME) {\n      throw new Error('Cannot de-register base plugin.');\n    }\n    if (pluginExists(name)) {\n      delete pluginStorage[name];\n      delete Player.prototype[name];\n    }\n  };\n\n  /**\n   * Gets an object containing multiple Video.js plugins.\n   *\n   * @param   {Array} [names]\n   *          If provided, should be an array of plugin names. Defaults to _all_\n   *          plugin names.\n   *\n   * @returns {Object|undefined}\n   *          An object containing plugin(s) associated with their name(s) or\n   *          `undefined` if no matching plugins exist).\n   */\n\n\n  Plugin.getPlugins = function getPlugins() {\n    var names = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Object.keys(pluginStorage);\n\n    var result = void 0;\n\n    names.forEach(function (name) {\n      var plugin = getPlugin(name);\n\n      if (plugin) {\n        result = result || {};\n        result[name] = plugin;\n      }\n    });\n\n    return result;\n  };\n\n  /**\n   * Gets a plugin's version, if available\n   *\n   * @param   {string} name\n   *          The name of a plugin.\n   *\n   * @returns {string}\n   *          The plugin's version or an empty string.\n   */\n\n\n  Plugin.getPluginVersion = function getPluginVersion(name) {\n    var plugin = getPlugin(name);\n\n    return plugin && plugin.VERSION || '';\n  };\n\n  return Plugin;\n}();\n\n/**\n * Gets a plugin by name if it exists.\n *\n * @static\n * @method   getPlugin\n * @memberOf Plugin\n * @param    {string} name\n *           The name of a plugin.\n *\n * @returns  {Function|undefined}\n *           The plugin (or `undefined`).\n */\n\n\nPlugin.getPlugin = getPlugin;\n\n/**\n * The name of the base plugin class as it is registered.\n *\n * @type {string}\n */\nPlugin.BASE_PLUGIN_NAME = BASE_PLUGIN_NAME;\n\nPlugin.registerPlugin(BASE_PLUGIN_NAME, Plugin);\n\n/**\n * Documented in player.js\n *\n * @ignore\n */\nPlayer.prototype.usingPlugin = function (name) {\n  return !!this[PLUGIN_CACHE_KEY] && this[PLUGIN_CACHE_KEY][name] === true;\n};\n\n/**\n * Documented in player.js\n *\n * @ignore\n */\nPlayer.prototype.hasPlugin = function (name) {\n  return !!pluginExists(name);\n};\n\n/**\n * Signals that a plugin is about to be set up on a player.\n *\n * @event    Player#beforepluginsetup\n * @type     {Plugin~PluginEventHash}\n */\n\n/**\n * Signals that a plugin is about to be set up on a player - by name. The name\n * is the name of the plugin.\n *\n * @event    Player#beforepluginsetup:$name\n * @type     {Plugin~PluginEventHash}\n */\n\n/**\n * Signals that a plugin has just been set up on a player.\n *\n * @event    Player#pluginsetup\n * @type     {Plugin~PluginEventHash}\n */\n\n/**\n * Signals that a plugin has just been set up on a player - by name. The name\n * is the name of the plugin.\n *\n * @event    Player#pluginsetup:$name\n * @type     {Plugin~PluginEventHash}\n */\n\n/**\n * @typedef  {Object} Plugin~PluginEventHash\n *\n * @property {string} instance\n *           For basic plugins, the return value of the plugin function. For\n *           advanced plugins, the plugin instance on which the event is fired.\n *\n * @property {string} name\n *           The name of the plugin.\n *\n * @property {string} plugin\n *           For basic plugins, the plugin function. For advanced plugins, the\n *           plugin class/constructor.\n */\n\n/**\n * @file extend.js\n * @module extend\n */\n\n/**\n * A combination of node inherits and babel's inherits (after transpile).\n * Both work the same but node adds `super_` to the subClass\n * and Bable adds the superClass as __proto__. Both seem useful.\n *\n * @param {Object} subClass\n *        The class to inherit to\n *\n * @param {Object} superClass\n *        The class to inherit from\n *\n * @private\n */\nvar _inherits = function _inherits(subClass, superClass) {\n  if (typeof superClass !== 'function' && superClass !== null) {\n    throw new TypeError('Super expression must either be null or a function, not ' + (typeof superClass === 'undefined' ? 'undefined' : _typeof(superClass)));\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n\n  if (superClass) {\n    // node\n    subClass.super_ = superClass;\n  }\n};\n\n/**\n * Function for subclassing using the same inheritance that\n * videojs uses internally\n *\n * @static\n * @const\n *\n * @param {Object} superClass\n *        The class to inherit from\n *\n * @param {Object} [subClassMethods={}]\n *        The class to inherit to\n *\n * @return {Object}\n *         The new object with subClassMethods that inherited superClass.\n */\nvar extendFn = function extendFn(superClass) {\n  var subClassMethods = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  var subClass = function subClass() {\n    superClass.apply(this, arguments);\n  };\n\n  var methods = {};\n\n  if ((typeof subClassMethods === 'undefined' ? 'undefined' : _typeof(subClassMethods)) === 'object') {\n    if (subClassMethods.constructor !== Object.prototype.constructor) {\n      subClass = subClassMethods.constructor;\n    }\n    methods = subClassMethods;\n  } else if (typeof subClassMethods === 'function') {\n    subClass = subClassMethods;\n  }\n\n  _inherits(subClass, superClass);\n\n  // Extend subObj's prototype with functions and other properties from props\n  for (var name in methods) {\n    if (methods.hasOwnProperty(name)) {\n      subClass.prototype[name] = methods[name];\n    }\n  }\n\n  return subClass;\n};\n\n/**\n * @file video.js\n * @module videojs\n */\n// Include the built-in techs\n// HTML5 Element Shim for IE8\nif (typeof HTMLVideoElement === 'undefined' && isReal()) {\n  document.createElement('video');\n  document.createElement('audio');\n  document.createElement('track');\n  document.createElement('video-js');\n}\n\n/**\n * Normalize an `id` value by trimming off a leading `#`\n *\n * @param   {string} id\n *          A string, maybe with a leading `#`.\n *\n * @returns {string}\n *          The string, without any leading `#`.\n */\nvar normalizeId = function normalizeId(id) {\n  return id.indexOf('#') === 0 ? id.slice(1) : id;\n};\n\n/**\n * Doubles as the main function for users to create a player instance and also\n * the main library object.\n * The `videojs` function can be used to initialize or retrieve a player.\n  *\n * @param {string|Element} id\n *        Video element or video element ID\n *\n * @param {Object} [options]\n *        Optional options object for config/settings\n *\n * @param {Component~ReadyCallback} [ready]\n *        Optional ready callback\n *\n * @return {Player}\n *         A player instance\n */\nfunction videojs(id, options, ready) {\n  var player = videojs.getPlayer(id);\n\n  if (player) {\n    if (options) {\n      log$1.warn('Player \"' + id + '\" is already initialised. Options will not be applied.');\n    }\n    if (ready) {\n      player.ready(ready);\n    }\n    return player;\n  }\n\n  var el = typeof id === 'string' ? $('#' + normalizeId(id)) : id;\n\n  if (!isEl(el)) {\n    throw new TypeError('The element or ID supplied is not valid. (videojs)');\n  }\n\n  if (!document.body.contains(el)) {\n    log$1.warn('The element supplied is not included in the DOM');\n  }\n\n  options = options || {};\n\n  videojs.hooks('beforesetup').forEach(function (hookFunction) {\n    var opts = hookFunction(el, mergeOptions(options));\n\n    if (!isObject(opts) || Array.isArray(opts)) {\n      log$1.error('please return an object in beforesetup hooks');\n      return;\n    }\n\n    options = mergeOptions(options, opts);\n  });\n\n  // We get the current \"Player\" component here in case an integration has\n  // replaced it with a custom player.\n  var PlayerComponent = Component.getComponent('Player');\n\n  player = new PlayerComponent(el, options, ready);\n\n  videojs.hooks('setup').forEach(function (hookFunction) {\n    return hookFunction(player);\n  });\n\n  return player;\n}\n\n/**\n * An Object that contains lifecycle hooks as keys which point to an array\n * of functions that are run when a lifecycle is triggered\n */\nvideojs.hooks_ = {};\n\n/**\n * Get a list of hooks for a specific lifecycle\n * @function videojs.hooks\n *\n * @param {string} type\n *        the lifecyle to get hooks from\n *\n * @param {Function|Function[]} [fn]\n *        Optionally add a hook (or hooks) to the lifecycle that your are getting.\n *\n * @return {Array}\n *         an array of hooks, or an empty array if there are none.\n */\nvideojs.hooks = function (type, fn) {\n  videojs.hooks_[type] = videojs.hooks_[type] || [];\n  if (fn) {\n    videojs.hooks_[type] = videojs.hooks_[type].concat(fn);\n  }\n  return videojs.hooks_[type];\n};\n\n/**\n * Add a function hook to a specific videojs lifecycle.\n *\n * @param {string} type\n *        the lifecycle to hook the function to.\n *\n * @param {Function|Function[]}\n *        The function or array of functions to attach.\n */\nvideojs.hook = function (type, fn) {\n  videojs.hooks(type, fn);\n};\n\n/**\n * Add a function hook that will only run once to a specific videojs lifecycle.\n *\n * @param {string} type\n *        the lifecycle to hook the function to.\n *\n * @param {Function|Function[]}\n *        The function or array of functions to attach.\n */\nvideojs.hookOnce = function (type, fn) {\n  videojs.hooks(type, [].concat(fn).map(function (original) {\n    var wrapper = function wrapper() {\n      videojs.removeHook(type, wrapper);\n      return original.apply(undefined, arguments);\n    };\n\n    return wrapper;\n  }));\n};\n\n/**\n * Remove a hook from a specific videojs lifecycle.\n *\n * @param {string} type\n *        the lifecycle that the function hooked to\n *\n * @param {Function} fn\n *        The hooked function to remove\n *\n * @return {boolean}\n *         The function that was removed or undef\n */\nvideojs.removeHook = function (type, fn) {\n  var index = videojs.hooks(type).indexOf(fn);\n\n  if (index <= -1) {\n    return false;\n  }\n\n  videojs.hooks_[type] = videojs.hooks_[type].slice();\n  videojs.hooks_[type].splice(index, 1);\n\n  return true;\n};\n\n// Add default styles\nif (window.VIDEOJS_NO_DYNAMIC_STYLE !== true && isReal()) {\n  var style = $('.vjs-styles-defaults');\n\n  if (!style) {\n    style = createStyleElement('vjs-styles-defaults');\n    var head = $('head');\n\n    if (head) {\n      head.insertBefore(style, head.firstChild);\n    }\n    setTextContent(style, '\\n      .video-js {\\n        width: 300px;\\n        height: 150px;\\n      }\\n\\n      .vjs-fluid {\\n        padding-top: 56.25%\\n      }\\n    ');\n  }\n}\n\n// Run Auto-load players\n// You have to wait at least once in case this script is loaded after your\n// video in the DOM (weird behavior only with minified version)\nautoSetupTimeout(1, videojs);\n\n/**\n * Current software version. Follows semver.\n *\n * @type {string}\n */\nvideojs.VERSION = version;\n\n/**\n * The global options object. These are the settings that take effect\n * if no overrides are specified when the player is created.\n *\n * @type {Object}\n */\nvideojs.options = Player.prototype.options_;\n\n/**\n * Get an object with the currently created players, keyed by player ID\n *\n * @return {Object}\n *         The created players\n */\nvideojs.getPlayers = function () {\n  return Player.players;\n};\n\n/**\n * Get a single player based on an ID or DOM element.\n *\n * This is useful if you want to check if an element or ID has an associated\n * Video.js player, but not create one if it doesn't.\n *\n * @param   {string|Element} id\n *          An HTML element - `<video>`, `<audio>`, or `<video-js>` -\n *          or a string matching the `id` of such an element.\n *\n * @returns {Player|undefined}\n *          A player instance or `undefined` if there is no player instance\n *          matching the argument.\n */\nvideojs.getPlayer = function (id) {\n  var players = Player.players;\n  var tag = void 0;\n\n  if (typeof id === 'string') {\n    var nId = normalizeId(id);\n    var player = players[nId];\n\n    if (player) {\n      return player;\n    }\n\n    tag = $('#' + nId);\n  } else {\n    tag = id;\n  }\n\n  if (isEl(tag)) {\n    var _tag = tag,\n        _player = _tag.player,\n        playerId = _tag.playerId;\n\n    // Element may have a `player` property referring to an already created\n    // player instance. If so, return that.\n\n    if (_player || players[playerId]) {\n      return _player || players[playerId];\n    }\n  }\n};\n\n/**\n * Returns an array of all current players.\n *\n * @return {Array}\n *         An array of all players. The array will be in the order that\n *         `Object.keys` provides, which could potentially vary between\n *         JavaScript engines.\n *\n */\nvideojs.getAllPlayers = function () {\n  return (\n\n    // Disposed players leave a key with a `null` value, so we need to make sure\n    // we filter those out.\n    Object.keys(Player.players).map(function (k) {\n      return Player.players[k];\n    }).filter(Boolean)\n  );\n};\n\n/**\n * Expose players object.\n *\n * @memberOf videojs\n * @property {Object} players\n */\nvideojs.players = Player.players;\n\n/**\n * Get a component class object by name\n *\n * @borrows Component.getComponent as videojs.getComponent\n */\nvideojs.getComponent = Component.getComponent;\n\n/**\n * Register a component so it can referred to by name. Used when adding to other\n * components, either through addChild `component.addChild('myComponent')` or through\n * default children options  `{ children: ['myComponent'] }`.\n *\n * > NOTE: You could also just initialize the component before adding.\n * `component.addChild(new MyComponent());`\n *\n * @param {string} name\n *        The class name of the component\n *\n * @param {Component} comp\n *        The component class\n *\n * @return {Component}\n *         The newly registered component\n */\nvideojs.registerComponent = function (name$$1, comp) {\n  if (Tech.isTech(comp)) {\n    log$1.warn('The ' + name$$1 + ' tech was registered as a component. It should instead be registered using videojs.registerTech(name, tech)');\n  }\n\n  Component.registerComponent.call(Component, name$$1, comp);\n};\n\n/**\n * Get a Tech class object by name\n *\n * @borrows Tech.getTech as videojs.getTech\n */\nvideojs.getTech = Tech.getTech;\n\n/**\n * Register a Tech so it can referred to by name.\n * This is used in the tech order for the player.\n *\n * @borrows Tech.registerTech as videojs.registerTech\n */\nvideojs.registerTech = Tech.registerTech;\n\n/**\n * Register a middleware to a source type.\n *\n * @param {String} type A string representing a MIME type.\n * @param {function(player):object} middleware A middleware factory that takes a player.\n */\nvideojs.use = use;\n\n/**\n * An object that can be returned by a middleware to signify\n * that the middleware is being terminated.\n *\n * @type {object}\n * @memberOf {videojs}\n * @property {object} middleware.TERMINATOR\n */\n// Object.defineProperty is not available in IE8\nif (!IS_IE8 && Object.defineProperty) {\n  Object.defineProperty(videojs, 'middleware', {\n    value: {},\n    writeable: false,\n    enumerable: true\n  });\n\n  Object.defineProperty(videojs.middleware, 'TERMINATOR', {\n    value: TERMINATOR,\n    writeable: false,\n    enumerable: true\n  });\n} else {\n  videojs.middleware = { TERMINATOR: TERMINATOR };\n}\n\n/**\n * A suite of browser and device tests from {@link browser}.\n *\n * @type {Object}\n * @private\n */\nvideojs.browser = browser;\n\n/**\n * Whether or not the browser supports touch events. Included for backward\n * compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`\n * instead going forward.\n *\n * @deprecated since version 5.0\n * @type {boolean}\n */\nvideojs.TOUCH_ENABLED = TOUCH_ENABLED;\n\n/**\n * Subclass an existing class\n * Mimics ES6 subclassing with the `extend` keyword\n *\n * @borrows extend:extendFn as videojs.extend\n */\nvideojs.extend = extendFn;\n\n/**\n * Merge two options objects recursively\n * Performs a deep merge like lodash.merge but **only merges plain objects**\n * (not arrays, elements, anything else)\n * Other values will be copied directly from the second object.\n *\n * @borrows merge-options:mergeOptions as videojs.mergeOptions\n */\nvideojs.mergeOptions = mergeOptions;\n\n/**\n * Change the context (this) of a function\n *\n * > NOTE: as of v5.0 we require an ES5 shim, so you should use the native\n * `function() {}.bind(newContext);` instead of this.\n *\n * @borrows fn:bind as videojs.bind\n */\nvideojs.bind = bind;\n\n/**\n * Register a Video.js plugin.\n *\n * @borrows plugin:registerPlugin as videojs.registerPlugin\n * @method registerPlugin\n *\n * @param  {string} name\n *         The name of the plugin to be registered. Must be a string and\n *         must not match an existing plugin or a method on the `Player`\n *         prototype.\n *\n * @param  {Function} plugin\n *         A sub-class of `Plugin` or a function for basic plugins.\n *\n * @return {Function}\n *         For advanced plugins, a factory function for that plugin. For\n *         basic plugins, a wrapper function that initializes the plugin.\n */\nvideojs.registerPlugin = Plugin.registerPlugin;\n\n/**\n * Deregister a Video.js plugin.\n *\n * @borrows plugin:deregisterPlugin as videojs.deregisterPlugin\n * @method deregisterPlugin\n *\n * @param  {string} name\n *         The name of the plugin to be deregistered. Must be a string and\n *         must match an existing plugin or a method on the `Player`\n *         prototype.\n *\n */\nvideojs.deregisterPlugin = Plugin.deregisterPlugin;\n\n/**\n * Deprecated method to register a plugin with Video.js\n *\n * @deprecated\n *        videojs.plugin() is deprecated; use videojs.registerPlugin() instead\n *\n * @param {string} name\n *        The plugin name\n *\n * @param {Plugin|Function} plugin\n *         The plugin sub-class or function\n */\nvideojs.plugin = function (name$$1, plugin) {\n  log$1.warn('videojs.plugin() is deprecated; use videojs.registerPlugin() instead');\n  return Plugin.registerPlugin(name$$1, plugin);\n};\n\n/**\n * Gets an object containing multiple Video.js plugins.\n *\n * @param  {Array} [names]\n *         If provided, should be an array of plugin names. Defaults to _all_\n *         plugin names.\n *\n * @return {Object|undefined}\n *         An object containing plugin(s) associated with their name(s) or\n *         `undefined` if no matching plugins exist).\n */\nvideojs.getPlugins = Plugin.getPlugins;\n\n/**\n * Gets a plugin by name if it exists.\n *\n * @param  {string} name\n *         The name of a plugin.\n *\n * @return {Function|undefined}\n *         The plugin (or `undefined`).\n */\nvideojs.getPlugin = Plugin.getPlugin;\n\n/**\n * Gets a plugin's version, if available\n *\n * @param  {string} name\n *         The name of a plugin.\n *\n * @return {string}\n *         The plugin's version or an empty string.\n */\nvideojs.getPluginVersion = Plugin.getPluginVersion;\n\n/**\n * Adding languages so that they're available to all players.\n * Example: `videojs.addLanguage('es', { 'Hello': 'Hola' });`\n *\n * @param {string} code\n *        The language code or dictionary property\n *\n * @param {Object} data\n *        The data values to be translated\n *\n * @return {Object}\n *         The resulting language dictionary object\n */\nvideojs.addLanguage = function (code, data) {\n  var _mergeOptions;\n\n  code = ('' + code).toLowerCase();\n\n  videojs.options.languages = mergeOptions(videojs.options.languages, (_mergeOptions = {}, _mergeOptions[code] = data, _mergeOptions));\n\n  return videojs.options.languages[code];\n};\n\n/**\n * Log messages\n *\n * @borrows log:log as videojs.log\n */\nvideojs.log = log$1;\n\n/**\n * Creates an emulated TimeRange object.\n *\n * @borrows time-ranges:createTimeRanges as videojs.createTimeRange\n */\n/**\n * @borrows time-ranges:createTimeRanges as videojs.createTimeRanges\n */\nvideojs.createTimeRange = videojs.createTimeRanges = createTimeRanges;\n\n/**\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n *\n * @borrows format-time:formatTime as videojs.formatTime\n */\nvideojs.formatTime = formatTime;\n\n/**\n * Replaces format-time with a custom implementation, to be used in place of the default.\n *\n * @borrows format-time:setFormatTime as videojs.setFormatTime\n *\n * @method setFormatTime\n *\n * @param {Function} customFn\n *        A custom format-time function which will be called with the current time and guide (in seconds) as arguments.\n *        Passed fn should return a string.\n */\nvideojs.setFormatTime = setFormatTime;\n\n/**\n * Resets format-time to the default implementation.\n *\n * @borrows format-time:resetFormatTime as videojs.resetFormatTime\n *\n * @method resetFormatTime\n */\nvideojs.resetFormatTime = resetFormatTime;\n\n/**\n * Resolve and parse the elements of a URL\n *\n * @borrows url:parseUrl as videojs.parseUrl\n *\n */\nvideojs.parseUrl = parseUrl;\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @borrows url:isCrossOrigin as videojs.isCrossOrigin\n */\nvideojs.isCrossOrigin = isCrossOrigin;\n\n/**\n * Event target class.\n *\n * @borrows EventTarget as videojs.EventTarget\n */\nvideojs.EventTarget = EventTarget;\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @borrows events:on as videojs.on\n */\nvideojs.on = on;\n\n/**\n * Trigger a listener only once for an event\n *\n * @borrows events:one as videojs.one\n */\nvideojs.one = one;\n\n/**\n * Removes event listeners from an element\n *\n * @borrows events:off as videojs.off\n */\nvideojs.off = off;\n\n/**\n * Trigger an event for an element\n *\n * @borrows events:trigger as videojs.trigger\n */\nvideojs.trigger = trigger;\n\n/**\n * A cross-browser XMLHttpRequest wrapper. Here's a simple example:\n *\n * @param {Object} options\n *        settings for the request.\n *\n * @return {XMLHttpRequest|XDomainRequest}\n *         The request object.\n *\n * @see https://github.com/Raynos/xhr\n */\nvideojs.xhr = xhr;\n\n/**\n * TextTrack class\n *\n * @borrows TextTrack as videojs.TextTrack\n */\nvideojs.TextTrack = TextTrack;\n\n/**\n * export the AudioTrack class so that source handlers can create\n * AudioTracks and then add them to the players AudioTrackList\n *\n * @borrows AudioTrack as videojs.AudioTrack\n */\nvideojs.AudioTrack = AudioTrack;\n\n/**\n * export the VideoTrack class so that source handlers can create\n * VideoTracks and then add them to the players VideoTrackList\n *\n * @borrows VideoTrack as videojs.VideoTrack\n */\nvideojs.VideoTrack = VideoTrack;\n\n/**\n * Determines, via duck typing, whether or not a value is a DOM element.\n *\n * @borrows dom:isEl as videojs.isEl\n * @deprecated Use videojs.dom.isEl() instead\n */\n\n/**\n * Determines, via duck typing, whether or not a value is a text node.\n *\n * @borrows dom:isTextNode as videojs.isTextNode\n * @deprecated Use videojs.dom.isTextNode() instead\n */\n\n/**\n * Creates an element and applies properties.\n *\n * @borrows dom:createEl as videojs.createEl\n * @deprecated Use videojs.dom.createEl() instead\n */\n\n/**\n * Check if an element has a CSS class\n *\n * @borrows dom:hasElClass as videojs.hasClass\n * @deprecated Use videojs.dom.hasClass() instead\n */\n\n/**\n * Add a CSS class name to an element\n *\n * @borrows dom:addElClass as videojs.addClass\n * @deprecated Use videojs.dom.addClass() instead\n */\n\n/**\n * Remove a CSS class name from an element\n *\n * @borrows dom:removeElClass as videojs.removeClass\n * @deprecated Use videojs.dom.removeClass() instead\n */\n\n/**\n * Adds or removes a CSS class name on an element depending on an optional\n * condition or the presence/absence of the class name.\n *\n * @borrows dom:toggleElClass as videojs.toggleClass\n * @deprecated Use videojs.dom.toggleClass() instead\n */\n\n/**\n * Apply attributes to an HTML element.\n *\n * @borrows dom:setElAttributes as videojs.setAttribute\n * @deprecated Use videojs.dom.setAttributes() instead\n */\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributes are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n *\n * @borrows dom:getElAttributes as videojs.getAttributes\n * @deprecated Use videojs.dom.getAttributes() instead\n */\n\n/**\n * Empties the contents of an element.\n *\n * @borrows dom:emptyEl as videojs.emptyEl\n * @deprecated Use videojs.dom.emptyEl() instead\n */\n\n/**\n * Normalizes and appends content to an element.\n *\n * The content for an element can be passed in multiple types and\n * combinations, whose behavior is as follows:\n *\n * - String\n *   Normalized into a text node.\n *\n * - Element, TextNode\n *   Passed through.\n *\n * - Array\n *   A one-dimensional array of strings, elements, nodes, or functions (which\n *   return single strings, elements, or nodes).\n *\n * - Function\n *   If the sole argument, is expected to produce a string, element,\n *   node, or array.\n *\n * @borrows dom:appendContents as videojs.appendContet\n * @deprecated Use videojs.dom.appendContent() instead\n */\n\n/**\n * Normalizes and inserts content into an element; this is identical to\n * `appendContent()`, except it empties the element first.\n *\n * The content for an element can be passed in multiple types and\n * combinations, whose behavior is as follows:\n *\n * - String\n *   Normalized into a text node.\n *\n * - Element, TextNode\n *   Passed through.\n *\n * - Array\n *   A one-dimensional array of strings, elements, nodes, or functions (which\n *   return single strings, elements, or nodes).\n *\n * - Function\n *   If the sole argument, is expected to produce a string, element,\n *   node, or array.\n *\n * @borrows dom:insertContent as videojs.insertContent\n * @deprecated Use videojs.dom.insertContent() instead\n */\n['isEl', 'isTextNode', 'createEl', 'hasClass', 'addClass', 'removeClass', 'toggleClass', 'setAttributes', 'getAttributes', 'emptyEl', 'appendContent', 'insertContent'].forEach(function (k) {\n  videojs[k] = function () {\n    log$1.warn('videojs.' + k + '() is deprecated; use videojs.dom.' + k + '() instead');\n    return Dom[k].apply(null, arguments);\n  };\n});\n\n/**\n * A safe getComputedStyle with an IE8 fallback.\n *\n * This is because in Firefox, if the player is loaded in an iframe with `display:none`,\n * then `getComputedStyle` returns `null`, so, we do a null-check to make sure\n * that the player doesn't break in these cases.\n * See https://bugzilla.mozilla.org/show_bug.cgi?id=548397 for more details.\n *\n * @borrows computed-style:computedStyle as videojs.computedStyle\n */\nvideojs.computedStyle = computedStyle;\n\n/**\n * Export the Dom utilities for use in external plugins\n * and Tech's\n */\nvideojs.dom = Dom;\n\n/**\n * Export the Url utilities for use in external plugins\n * and Tech's\n */\nvideojs.url = Url;\n\nmodule.exports = videojs;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvLmpzQDYuMTIuMUB2aWRlby5qcy9kaXN0L3ZpZGVvLmNqcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmlkZW8uanNANi4xMi4xQHZpZGVvLmpzL2Rpc3QvdmlkZW8uY2pzLmpzPzY3NjciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogVmlkZW8uanMgNi4xMi4xIDxodHRwOi8vdmlkZW9qcy5jb20vPlxuICogQ29weXJpZ2h0IEJyaWdodGNvdmUsIEluYy4gPGh0dHBzOi8vd3d3LmJyaWdodGNvdmUuY29tLz5cbiAqIEF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMFxuICogPGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0U+XG4gKlxuICogSW5jbHVkZXMgdnR0LmpzIDxodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS92dHQuanM+XG4gKiBBdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjBcbiAqIDxodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS92dHQuanMvYmxvYi9tYXN0ZXIvTElDRU5TRT5cbiAqL1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIHdpbmRvdyA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdnbG9iYWwvd2luZG93JykpO1xudmFyIGRvY3VtZW50ID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ2dsb2JhbC9kb2N1bWVudCcpKTtcbnZhciB0c21sID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ3RzbWwnKSk7XG52YXIgc2FmZVBhcnNlVHVwbGUgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnc2FmZS1qc29uLXBhcnNlL3R1cGxlJykpO1xudmFyIHhociA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCd4aHInKSk7XG52YXIgdnR0ID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ3ZpZGVvanMtdnR0LmpzJykpO1xuXG52YXIgdmVyc2lvbiA9IFwiNi4xMi4xXCI7XG5cbi8qKlxuICogQGZpbGUgYnJvd3Nlci5qc1xuICogQG1vZHVsZSBicm93c2VyXG4gKi9cbnZhciBVU0VSX0FHRU5UID0gd2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbnZhciB3ZWJraXRWZXJzaW9uTWFwID0gL0FwcGxlV2ViS2l0XFwvKFtcXGQuXSspL2kuZXhlYyhVU0VSX0FHRU5UKTtcbnZhciBhcHBsZVdlYmtpdFZlcnNpb24gPSB3ZWJraXRWZXJzaW9uTWFwID8gcGFyc2VGbG9hdCh3ZWJraXRWZXJzaW9uTWFwLnBvcCgpKSA6IG51bGw7XG5cbi8qXG4gKiBEZXZpY2UgaXMgYW4gaVBob25lXG4gKlxuICogQHR5cGUge0Jvb2xlYW59XG4gKiBAY29uc3RhbnRcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBJU19JUEFEID0gL2lQYWQvaS50ZXN0KFVTRVJfQUdFTlQpO1xuXG4vLyBUaGUgRmFjZWJvb2sgYXBwJ3MgVUlXZWJWaWV3IGlkZW50aWZpZXMgYXMgYm90aCBhbiBpUGhvbmUgYW5kIGlQYWQsIHNvXG4vLyB0byBpZGVudGlmeSBpUGhvbmVzLCB3ZSBuZWVkIHRvIGV4Y2x1ZGUgaVBhZHMuXG4vLyBodHRwOi8vYXJ0c3kuZ2l0aHViLmlvL2Jsb2cvMjAxMi8xMC8xOC90aGUtcGVyaWxzLW9mLWlvcy11c2VyLWFnZW50LXNuaWZmaW5nL1xudmFyIElTX0lQSE9ORSA9IC9pUGhvbmUvaS50ZXN0KFVTRVJfQUdFTlQpICYmICFJU19JUEFEO1xudmFyIElTX0lQT0QgPSAvaVBvZC9pLnRlc3QoVVNFUl9BR0VOVCk7XG52YXIgSVNfSU9TID0gSVNfSVBIT05FIHx8IElTX0lQQUQgfHwgSVNfSVBPRDtcblxudmFyIElPU19WRVJTSU9OID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbWF0Y2ggPSBVU0VSX0FHRU5ULm1hdGNoKC9PUyAoXFxkKylfL2kpO1xuXG4gIGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xuICAgIHJldHVybiBtYXRjaFsxXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn0oKTtcblxudmFyIElTX0FORFJPSUQgPSAvQW5kcm9pZC9pLnRlc3QoVVNFUl9BR0VOVCk7XG52YXIgQU5EUk9JRF9WRVJTSU9OID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaGlzIG1hdGNoZXMgQW5kcm9pZCBNYWpvci5NaW5vci5QYXRjaCB2ZXJzaW9uc1xuICAvLyBBTkRST0lEX1ZFUlNJT04gaXMgTWFqb3IuTWlub3IgYXMgYSBOdW1iZXIsIGlmIE1pbm9yIGlzbid0IGF2YWlsYWJsZSwgdGhlbiBvbmx5IE1ham9yIGlzIHJldHVybmVkXG4gIHZhciBtYXRjaCA9IFVTRVJfQUdFTlQubWF0Y2goL0FuZHJvaWQgKFxcZCspKD86XFwuKFxcZCspKT8oPzpcXC4oXFxkKykpKi9pKTtcblxuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWFqb3IgPSBtYXRjaFsxXSAmJiBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIG1pbm9yID0gbWF0Y2hbMl0gJiYgcGFyc2VGbG9hdChtYXRjaFsyXSk7XG5cbiAgaWYgKG1ham9yICYmIG1pbm9yKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hbMV0gKyAnLicgKyBtYXRjaFsyXSk7XG4gIH0gZWxzZSBpZiAobWFqb3IpIHtcbiAgICByZXR1cm4gbWFqb3I7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59KCk7XG5cbi8vIE9sZCBBbmRyb2lkIGlzIGRlZmluZWQgYXMgVmVyc2lvbiBvbGRlciB0aGFuIDIuMywgYW5kIHJlcXVpcmluZyBhIHdlYmtpdCB2ZXJzaW9uIG9mIHRoZSBhbmRyb2lkIGJyb3dzZXJcbnZhciBJU19PTERfQU5EUk9JRCA9IElTX0FORFJPSUQgJiYgL3dlYmtpdC9pLnRlc3QoVVNFUl9BR0VOVCkgJiYgQU5EUk9JRF9WRVJTSU9OIDwgMi4zO1xudmFyIElTX05BVElWRV9BTkRST0lEID0gSVNfQU5EUk9JRCAmJiBBTkRST0lEX1ZFUlNJT04gPCA1ICYmIGFwcGxlV2Via2l0VmVyc2lvbiA8IDUzNztcblxudmFyIElTX0ZJUkVGT1ggPSAvRmlyZWZveC9pLnRlc3QoVVNFUl9BR0VOVCk7XG52YXIgSVNfRURHRSA9IC9FZGdlL2kudGVzdChVU0VSX0FHRU5UKTtcbnZhciBJU19DSFJPTUUgPSAhSVNfRURHRSAmJiAoL0Nocm9tZS9pLnRlc3QoVVNFUl9BR0VOVCkgfHwgL0NyaU9TL2kudGVzdChVU0VSX0FHRU5UKSk7XG52YXIgQ0hST01FX1ZFUlNJT04gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBtYXRjaCA9IFVTRVJfQUdFTlQubWF0Y2goLyhDaHJvbWV8Q3JpT1MpXFwvKFxcZCspLyk7XG5cbiAgaWYgKG1hdGNoICYmIG1hdGNoWzJdKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hbMl0pO1xuICB9XG4gIHJldHVybiBudWxsO1xufSgpO1xudmFyIElTX0lFOCA9IC9NU0lFXFxzOFxcLjAvLnRlc3QoVVNFUl9BR0VOVCk7XG52YXIgSUVfVkVSU0lPTiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlc3VsdCA9IC9NU0lFXFxzKFxcZCspXFwuXFxkLy5leGVjKFVTRVJfQUdFTlQpO1xuICB2YXIgdmVyc2lvbiA9IHJlc3VsdCAmJiBwYXJzZUZsb2F0KHJlc3VsdFsxXSk7XG5cbiAgaWYgKCF2ZXJzaW9uICYmIC9UcmlkZW50XFwvNy4wL2kudGVzdChVU0VSX0FHRU5UKSAmJiAvcnY6MTEuMC8udGVzdChVU0VSX0FHRU5UKSkge1xuICAgIC8vIElFIDExIGhhcyBhIGRpZmZlcmVudCB1c2VyIGFnZW50IHN0cmluZyB0aGFuIG90aGVyIElFIHZlcnNpb25zXG4gICAgdmVyc2lvbiA9IDExLjA7XG4gIH1cblxuICByZXR1cm4gdmVyc2lvbjtcbn0oKTtcblxudmFyIElTX1NBRkFSSSA9IC9TYWZhcmkvaS50ZXN0KFVTRVJfQUdFTlQpICYmICFJU19DSFJPTUUgJiYgIUlTX0FORFJPSUQgJiYgIUlTX0VER0U7XG52YXIgSVNfQU5ZX1NBRkFSSSA9IChJU19TQUZBUkkgfHwgSVNfSU9TKSAmJiAhSVNfQ0hST01FO1xuXG52YXIgVE9VQ0hfRU5BQkxFRCA9IGlzUmVhbCgpICYmICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cgfHwgd2luZG93Lm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCB3aW5kb3cuRG9jdW1lbnRUb3VjaCAmJiB3aW5kb3cuZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCk7XG5cbnZhciBCQUNLR1JPVU5EX1NJWkVfU1VQUE9SVEVEID0gaXNSZWFsKCkgJiYgJ2JhY2tncm91bmRTaXplJyBpbiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKS5zdHlsZTtcblxudmFyIGJyb3dzZXIgPSAoT2JqZWN0LmZyZWV6ZSB8fCBPYmplY3QpKHtcblx0SVNfSVBBRDogSVNfSVBBRCxcblx0SVNfSVBIT05FOiBJU19JUEhPTkUsXG5cdElTX0lQT0Q6IElTX0lQT0QsXG5cdElTX0lPUzogSVNfSU9TLFxuXHRJT1NfVkVSU0lPTjogSU9TX1ZFUlNJT04sXG5cdElTX0FORFJPSUQ6IElTX0FORFJPSUQsXG5cdEFORFJPSURfVkVSU0lPTjogQU5EUk9JRF9WRVJTSU9OLFxuXHRJU19PTERfQU5EUk9JRDogSVNfT0xEX0FORFJPSUQsXG5cdElTX05BVElWRV9BTkRST0lEOiBJU19OQVRJVkVfQU5EUk9JRCxcblx0SVNfRklSRUZPWDogSVNfRklSRUZPWCxcblx0SVNfRURHRTogSVNfRURHRSxcblx0SVNfQ0hST01FOiBJU19DSFJPTUUsXG5cdENIUk9NRV9WRVJTSU9OOiBDSFJPTUVfVkVSU0lPTixcblx0SVNfSUU4OiBJU19JRTgsXG5cdElFX1ZFUlNJT046IElFX1ZFUlNJT04sXG5cdElTX1NBRkFSSTogSVNfU0FGQVJJLFxuXHRJU19BTllfU0FGQVJJOiBJU19BTllfU0FGQVJJLFxuXHRUT1VDSF9FTkFCTEVEOiBUT1VDSF9FTkFCTEVELFxuXHRCQUNLR1JPVU5EX1NJWkVfU1VQUE9SVEVEOiBCQUNLR1JPVU5EX1NJWkVfU1VQUE9SVEVEXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UgPSBmdW5jdGlvbiAoc3RyaW5ncywgcmF3KSB7XG4gIHN0cmluZ3MucmF3ID0gcmF3O1xuICByZXR1cm4gc3RyaW5ncztcbn07XG5cbi8qKlxuICogQGZpbGUgb2JqLmpzXG4gKiBAbW9kdWxlIG9ialxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIG9iajpFYWNoQ2FsbGJhY2tcbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogICAgICAgIFRoZSBjdXJyZW50IGtleSBmb3IgdGhlIG9iamVjdCB0aGF0IGlzIGJlaW5nIGl0ZXJhdGVkIG92ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogICAgICAgIFRoZSBjdXJyZW50IGtleS12YWx1ZSBmb3Igb2JqZWN0IHRoYXQgaXMgYmVpbmcgaXRlcmF0ZWQgb3ZlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIG9iajpSZWR1Y2VDYWxsYmFja1xuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGFjY3VtXG4gKiAgICAgICAgVGhlIHZhbHVlIHRoYXQgaXMgYWNjdW11bGF0aW5nIG92ZXIgdGhlIHJlZHVjZSBsb29wLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gKiAgICAgICAgVGhlIGN1cnJlbnQga2V5IGZvciB0aGUgb2JqZWN0IHRoYXQgaXMgYmVpbmcgaXRlcmF0ZWQgb3Zlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiAgICAgICAgVGhlIGN1cnJlbnQga2V5LXZhbHVlIGZvciBvYmplY3QgdGhhdCBpcyBiZWluZyBpdGVyYXRlZCBvdmVyXG4gKlxuICogQHJldHVybiB7TWl4ZWR9XG4gKiAgICAgICAgIFRoZSBuZXcgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKi9cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogR2V0IHRoZSBrZXlzIG9mIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogICAgICAgIFRoZSBPYmplY3QgdG8gZ2V0IHRoZSBrZXlzIGZyb21cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqICAgICAgICAgQW4gYXJyYXkgb2YgdGhlIGtleXMgZnJvbSB0aGUgb2JqZWN0LiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZVxuICogICAgICAgICBvYmplY3QgcGFzc2VkIGluIHdhcyBpbnZhbGlkIG9yIGhhZCBubyBrZXlzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBrZXlzID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9iamVjdCkgPyBPYmplY3Qua2V5cyhvYmplY3QpIDogW107XG59O1xuXG4vKipcbiAqIEFycmF5LWxpa2UgaXRlcmF0aW9uIGZvciBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqICAgICAgICBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3ZlclxuICpcbiAqIEBwYXJhbSB7b2JqOkVhY2hDYWxsYmFja30gZm5cbiAqICAgICAgICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGZvciBlYWNoIGtleSBpbiB0aGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBlYWNoKG9iamVjdCwgZm4pIHtcbiAga2V5cyhvYmplY3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBmbihvYmplY3Rba2V5XSwga2V5KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXJyYXktbGlrZSByZWR1Y2UgZm9yIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogICAgICAgIFRoZSBPYmplY3QgdGhhdCB5b3Ugd2FudCB0byByZWR1Y2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqICAgICAgICAgQSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgZm9yIGVhY2gga2V5IGluIHRoZSBvYmplY3QuIEl0XG4gKiAgICAgICAgIHJlY2VpdmVzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBhbmQgdGhlIHBlci1pdGVyYXRpb24gdmFsdWUgYW5kIGtleVxuICogICAgICAgICBhcyBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gW2luaXRpYWwgPSAwXVxuICogICAgICAgIFN0YXJ0aW5nIHZhbHVlXG4gKlxuICogQHJldHVybiB7TWl4ZWR9XG4gKiAgICAgICAgIFRoZSBmaW5hbCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlKG9iamVjdCwgZm4pIHtcbiAgdmFyIGluaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgcmV0dXJuIGtleXMob2JqZWN0KS5yZWR1Y2UoZnVuY3Rpb24gKGFjY3VtLCBrZXkpIHtcbiAgICByZXR1cm4gZm4oYWNjdW0sIG9iamVjdFtrZXldLCBrZXkpO1xuICB9LCBpbml0aWFsKTtcbn1cblxuLyoqXG4gKiBPYmplY3QuYXNzaWduLXN0eWxlIG9iamVjdCBzaGFsbG93IG1lcmdlL2V4dGVuZC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldFxuICogQHBhcmFtICB7T2JqZWN0fSAuLi5zb3VyY2VzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHNvdXJjZXMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc291cmNlc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoT2JqZWN0LmFzc2lnbikge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduLmFwcGx5KE9iamVjdCwgW3RhcmdldF0uY29uY2F0KHNvdXJjZXMpKTtcbiAgfVxuXG4gIHNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlYWNoKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgYW4gb2JqZWN0IG9mIGFueSBraW5kIC0gaW5jbHVkaW5nIERPTSBub2RlcyxcbiAqIGFycmF5cywgcmVndWxhciBleHByZXNzaW9ucywgZXRjLiBOb3QgZnVuY3Rpb25zLCB0aG91Z2guXG4gKlxuICogVGhpcyBhdm9pZHMgdGhlIGdvdGNoYSB3aGVyZSB1c2luZyBgdHlwZW9mYCBvbiBhIGBudWxsYCB2YWx1ZVxuICogcmVzdWx0cyBpbiBgJ29iamVjdCdgLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHZhbHVlKSkgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhbiBvYmplY3QgYXBwZWFycyB0byBiZSBhIFwicGxhaW5cIiBvYmplY3QgLSB0aGF0IGlzLCBhXG4gKiBkaXJlY3QgaW5zdGFuY2Ugb2YgYE9iamVjdGAuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xufVxuXG4vKipcbiAqIEBmaWxlIGxvZy5qc1xuICogQG1vZHVsZSBsb2dcbiAqL1xudmFyIGxvZyA9IHZvaWQgMDtcblxuLy8gVGhpcyBpcyB0aGUgcHJpdmF0ZSB0cmFja2luZyB2YXJpYWJsZSBmb3IgbG9nZ2luZyBsZXZlbC5cbnZhciBsZXZlbCA9ICdpbmZvJztcblxuLy8gVGhpcyBpcyB0aGUgcHJpdmF0ZSB0cmFja2luZyB2YXJpYWJsZSBmb3IgdGhlIGxvZ2dpbmcgaGlzdG9yeS5cbnZhciBoaXN0b3J5ID0gW107XG5cbi8qKlxuICogTG9nIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlIGFuZCBoaXN0b3J5IGJhc2VkIG9uIHRoZSB0eXBlIG9mIG1lc3NhZ2VcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjb25zb2xlIG1ldGhvZCB0byB1c2UuXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IGFyZ3NcbiAqICAgICAgICAgVGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIG1hdGNoaW5nIGNvbnNvbGUgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSAge2Jvb2xlYW59IFtzdHJpbmdpZnldXG4gKiAgICAgICAgIEJ5IGRlZmF1bHQsIG9ubHkgb2xkIElFcyBzaG91bGQgZ2V0IGNvbnNvbGUgYXJndW1lbnQgc3RyaW5naWZpY2F0aW9uLFxuICogICAgICAgICBidXQgdGhpcyBpcyBleHBvc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGZhY2lsaXRhdGUgdGVzdGluZy5cbiAqL1xudmFyIGxvZ0J5VHlwZSA9IGZ1bmN0aW9uIGxvZ0J5VHlwZSh0eXBlLCBhcmdzKSB7XG4gIHZhciBzdHJpbmdpZnkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICEhSUVfVkVSU0lPTiAmJiBJRV9WRVJTSU9OIDwgMTE7XG5cbiAgdmFyIGx2bCA9IGxvZy5sZXZlbHNbbGV2ZWxdO1xuICB2YXIgbHZsUmVnRXhwID0gbmV3IFJlZ0V4cCgnXignICsgbHZsICsgJykkJyk7XG5cbiAgaWYgKHR5cGUgIT09ICdsb2cnKSB7XG5cbiAgICAvLyBBZGQgdGhlIHR5cGUgdG8gdGhlIGZyb250IG9mIHRoZSBtZXNzYWdlIHdoZW4gaXQncyBub3QgXCJsb2dcIi5cbiAgICBhcmdzLnVuc2hpZnQodHlwZS50b1VwcGVyQ2FzZSgpICsgJzonKTtcbiAgfVxuXG4gIC8vIEFkZCBhIGNsb25lIG9mIHRoZSBhcmdzIGF0IHRoaXMgcG9pbnQgdG8gaGlzdG9yeS5cbiAgaWYgKGhpc3RvcnkpIHtcbiAgICBoaXN0b3J5LnB1c2goW10uY29uY2F0KGFyZ3MpKTtcbiAgfVxuXG4gIC8vIEFkZCBjb25zb2xlIHByZWZpeCBhZnRlciBhZGRpbmcgdG8gaGlzdG9yeS5cbiAgYXJncy51bnNoaWZ0KCdWSURFT0pTOicpO1xuXG4gIC8vIElmIHRoZXJlJ3Mgbm8gY29uc29sZSB0aGVuIGRvbid0IHRyeSB0byBvdXRwdXQgbWVzc2FnZXMsIGJ1dCB0aGV5IHdpbGxcbiAgLy8gc3RpbGwgYmUgc3RvcmVkIGluIGhpc3RvcnkuXG4gIGlmICghd2luZG93LmNvbnNvbGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXYXMgc2V0dGluZyB0aGVzZSBvbmNlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbiwgYnV0IGNvbnRhaW5pbmcgdGhlbVxuICAvLyBpbiB0aGUgZnVuY3Rpb24gbWFrZXMgaXQgZWFzaWVyIHRvIHRlc3QgY2FzZXMgd2hlcmUgY29uc29sZSBkb2Vzbid0IGV4aXN0XG4gIC8vIHdoZW4gdGhlIG1vZHVsZSBpcyBleGVjdXRlZC5cbiAgdmFyIGZuID0gd2luZG93LmNvbnNvbGVbdHlwZV07XG5cbiAgaWYgKCFmbiAmJiB0eXBlID09PSAnZGVidWcnKSB7XG4gICAgLy8gQ2VydGFpbiBicm93c2VycyBkb24ndCBoYXZlIHN1cHBvcnQgZm9yIGNvbnNvbGUuZGVidWcuIEZvciB0aG9zZSwgd2VcbiAgICAvLyBzaG91bGQgZGVmYXVsdCB0byB0aGUgY2xvc2VzdCBjb21wYXJhYmxlIGxvZy5cbiAgICBmbiA9IHdpbmRvdy5jb25zb2xlLmluZm8gfHwgd2luZG93LmNvbnNvbGUubG9nO1xuICB9XG5cbiAgLy8gQmFpbCBvdXQgaWYgdGhlcmUncyBubyBjb25zb2xlIG9yIGlmIHRoaXMgdHlwZSBpcyBub3QgYWxsb3dlZCBieSB0aGVcbiAgLy8gY3VycmVudCBsb2dnaW5nIGxldmVsLlxuICBpZiAoIWZuIHx8ICFsdmwgfHwgIWx2bFJlZ0V4cC50ZXN0KHR5cGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSUVzIHByZXZpb3VzIHRvIDExIGxvZyBvYmplY3RzIHVzZWxlc3NseSBhcyBcIltvYmplY3QgT2JqZWN0XVwiOyBzbywgSlNPTmlmeVxuICAvLyBvYmplY3RzIGFuZCBhcnJheXMgZm9yIHRob3NlIGxlc3MtY2FwYWJsZSBicm93c2Vycy5cbiAgaWYgKHN0cmluZ2lmeSkge1xuICAgIGFyZ3MgPSBhcmdzLm1hcChmdW5jdGlvbiAoYSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGEpIHx8IEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENhc3QgdG8gc3RyaW5nIGJlZm9yZSBqb2luaW5nLCBzbyB3ZSBnZXQgbnVsbCBhbmQgdW5kZWZpbmVkIGV4cGxpY2l0bHlcbiAgICAgIC8vIGluY2x1ZGVkIGluIG91dHB1dCAoYXMgd2Ugd291bGQgaW4gYSBtb2Rlcm4gY29uc29sZSkuXG4gICAgICByZXR1cm4gU3RyaW5nKGEpO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8vIE9sZCBJRSB2ZXJzaW9ucyBkbyBub3QgYWxsb3cgLmFwcGx5KCkgZm9yIGNvbnNvbGUgbWV0aG9kcyAodGhleSBhcmVcbiAgLy8gcmVwb3J0ZWQgYXMgb2JqZWN0cyByYXRoZXIgdGhhbiBmdW5jdGlvbnMpLlxuICBpZiAoIWZuLmFwcGx5KSB7XG4gICAgZm4oYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgZm5bQXJyYXkuaXNBcnJheShhcmdzKSA/ICdhcHBseScgOiAnY2FsbCddKHdpbmRvdy5jb25zb2xlLCBhcmdzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBMb2dzIHBsYWluIGRlYnVnIG1lc3NhZ2VzLiBTaW1pbGFyIHRvIGBjb25zb2xlLmxvZ2AuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0gICAge01peGVkW119IGFyZ3NcbiAqICAgICAgICAgICBPbmUgb3IgbW9yZSBtZXNzYWdlcyBvciBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZC5cbiAqL1xubG9nID0gZnVuY3Rpb24gbG9nKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBsb2dCeVR5cGUoJ2xvZycsIGFyZ3MpO1xufTtcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBhdmFpbGFibGUgbG9nZ2luZyBsZXZlbHMsIHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUgbGV2ZWwgbmFtZXNcbiAqIGFuZCB0aGUgdmFsdWVzIGFyZSBgfGAtc2VwYXJhdGVkIHN0cmluZ3MgY29udGFpbmluZyBsb2dnaW5nIG1ldGhvZHMgYWxsb3dlZFxuICogaW4gdGhhdCBsb2dnaW5nIGxldmVsLiBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvblxuICogbWF0Y2hpbmcgdGhlIGZ1bmN0aW9uIG5hbWUgYmVpbmcgY2FsbGVkLlxuICpcbiAqIExldmVscyBwcm92aWRlZCBieSB2aWRlby5qcyBhcmU6XG4gKlxuICogLSBgb2ZmYDogTWF0Y2hlcyBubyBjYWxscy4gQW55IHZhbHVlIHRoYXQgY2FuIGJlIGNhc3QgdG8gYGZhbHNlYCB3aWxsIGhhdmVcbiAqICAgdGhpcyBlZmZlY3QuIFRoZSBtb3N0IHJlc3RyaWN0aXZlLlxuICogLSBgYWxsYDogTWF0Y2hlcyBvbmx5IFZpZGVvLmpzLXByb3ZpZGVkIGZ1bmN0aW9ucyAoYGRlYnVnYCwgYGxvZ2AsXG4gKiAgIGBsb2cud2FybmAsIGFuZCBgbG9nLmVycm9yYCkuXG4gKiAtIGBkZWJ1Z2A6IE1hdGNoZXMgYGxvZy5kZWJ1Z2AsIGBsb2dgLCBgbG9nLndhcm5gLCBhbmQgYGxvZy5lcnJvcmAgY2FsbHMuXG4gKiAtIGBpbmZvYCAoZGVmYXVsdCk6IE1hdGNoZXMgYGxvZ2AsIGBsb2cud2FybmAsIGFuZCBgbG9nLmVycm9yYCBjYWxscy5cbiAqIC0gYHdhcm5gOiBNYXRjaGVzIGBsb2cud2FybmAgYW5kIGBsb2cuZXJyb3JgIGNhbGxzLlxuICogLSBgZXJyb3JgOiBNYXRjaGVzIG9ubHkgYGxvZy5lcnJvcmAgY2FsbHMuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xubG9nLmxldmVscyA9IHtcbiAgYWxsOiAnZGVidWd8bG9nfHdhcm58ZXJyb3InLFxuICBvZmY6ICcnLFxuICBkZWJ1ZzogJ2RlYnVnfGxvZ3x3YXJufGVycm9yJyxcbiAgaW5mbzogJ2xvZ3x3YXJufGVycm9yJyxcbiAgd2FybjogJ3dhcm58ZXJyb3InLFxuICBlcnJvcjogJ2Vycm9yJyxcbiAgREVGQVVMVDogbGV2ZWxcbn07XG5cbi8qKlxuICogR2V0IG9yIHNldCB0aGUgY3VycmVudCBsb2dnaW5nIGxldmVsLiBJZiBhIHN0cmluZyBtYXRjaGluZyBhIGtleSBmcm9tXG4gKiB7QGxpbmsgbG9nLmxldmVsc30gaXMgcHJvdmlkZWQsIGFjdHMgYXMgYSBzZXR0ZXIuIFJlZ2FyZGxlc3Mgb2YgYXJndW1lbnQsXG4gKiByZXR1cm5zIHRoZSBjdXJyZW50IGxvZ2dpbmcgbGV2ZWwuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBbbHZsXVxuICogICAgICAgICBQYXNzIHRvIHNldCBhIG5ldyBsb2dnaW5nIGxldmVsLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgVGhlIGN1cnJlbnQgbG9nZ2luZyBsZXZlbC5cbiAqL1xubG9nLmxldmVsID0gZnVuY3Rpb24gKGx2bCkge1xuICBpZiAodHlwZW9mIGx2bCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIWxvZy5sZXZlbHMuaGFzT3duUHJvcGVydHkobHZsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBsdmwgKyAnXCIgaW4gbm90IGEgdmFsaWQgbG9nIGxldmVsJyk7XG4gICAgfVxuICAgIGxldmVsID0gbHZsO1xuICB9XG4gIHJldHVybiBsZXZlbDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGV2ZXJ5dGhpbmcgdGhhdCBoYXMgYmVlbiBsb2dnZWQgdG8gdGhlIGhpc3RvcnkuXG4gKlxuICogVGhpcyBhcnJheSBpcyBhIHNoYWxsb3cgY2xvbmUgb2YgdGhlIGludGVybmFsIGhpc3RvcnkgcmVjb3JkLiBIb3dldmVyLCBpdHNcbiAqIGNvbnRlbnRzIGFyZSBfbm90XyBjbG9uZWQ7IHNvLCBtdXRhdGluZyBvYmplY3RzIGluc2lkZSB0aGlzIGFycmF5IHdpbGxcbiAqIG11dGF0ZSB0aGVtIGluIGhpc3RvcnkuXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmxvZy5oaXN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaGlzdG9yeSA/IFtdLmNvbmNhdChoaXN0b3J5KSA6IFtdO1xufTtcblxuLyoqXG4gKiBDbGVhcnMgdGhlIGludGVybmFsIGhpc3RvcnkgdHJhY2tpbmcsIGJ1dCBkb2VzIG5vdCBwcmV2ZW50IGZ1cnRoZXIgaGlzdG9yeVxuICogdHJhY2tpbmcuXG4gKi9cbmxvZy5oaXN0b3J5LmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICBpZiAoaGlzdG9yeSkge1xuICAgIGhpc3RvcnkubGVuZ3RoID0gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBEaXNhYmxlIGhpc3RvcnkgdHJhY2tpbmcgaWYgaXQgaXMgY3VycmVudGx5IGVuYWJsZWQuXG4gKi9cbmxvZy5oaXN0b3J5LmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChoaXN0b3J5ICE9PSBudWxsKSB7XG4gICAgaGlzdG9yeS5sZW5ndGggPSAwO1xuICAgIGhpc3RvcnkgPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIEVuYWJsZSBoaXN0b3J5IHRyYWNraW5nIGlmIGl0IGlzIGN1cnJlbnRseSBkaXNhYmxlZC5cbiAqL1xubG9nLmhpc3RvcnkuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICBpZiAoaGlzdG9yeSA9PT0gbnVsbCkge1xuICAgIGhpc3RvcnkgPSBbXTtcbiAgfVxufTtcblxuLyoqXG4gKiBMb2dzIGVycm9yIG1lc3NhZ2VzLiBTaW1pbGFyIHRvIGBjb25zb2xlLmVycm9yYC5cbiAqXG4gKiBAcGFyYW0ge01peGVkW119IGFyZ3NcbiAqICAgICAgICBPbmUgb3IgbW9yZSBtZXNzYWdlcyBvciBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZCBhcyBhbiBlcnJvclxuICovXG5sb2cuZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG5cbiAgcmV0dXJuIGxvZ0J5VHlwZSgnZXJyb3InLCBhcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyB3YXJuaW5nIG1lc3NhZ2VzLiBTaW1pbGFyIHRvIGBjb25zb2xlLndhcm5gLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWRbXX0gYXJnc1xuICogICAgICAgIE9uZSBvciBtb3JlIG1lc3NhZ2VzIG9yIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbG9nZ2VkIGFzIGEgd2FybmluZy5cbiAqL1xubG9nLndhcm4gPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICB9XG5cbiAgcmV0dXJuIGxvZ0J5VHlwZSgnd2FybicsIGFyZ3MpO1xufTtcblxuLyoqXG4gKiBMb2dzIGRlYnVnIG1lc3NhZ2VzLiBTaW1pbGFyIHRvIGBjb25zb2xlLmRlYnVnYCwgYnV0IG1heSBhbHNvIGFjdCBhcyBhIGNvbXBhcmFibGVcbiAqIGxvZyBpZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZVxuICpcbiAqIEBwYXJhbSB7TWl4ZWRbXX0gYXJnc1xuICogICAgICAgIE9uZSBvciBtb3JlIG1lc3NhZ2VzIG9yIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgbG9nZ2VkIGFzIGRlYnVnLlxuICovXG5sb2cuZGVidWcgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuICB9XG5cbiAgcmV0dXJuIGxvZ0J5VHlwZSgnZGVidWcnLCBhcmdzKTtcbn07XG5cbnZhciBsb2ckMSA9IGxvZztcblxuLyoqXG4gKiBAZmlsZSBjb21wdXRlZC1zdHlsZS5qc1xuICogQG1vZHVsZSBjb21wdXRlZC1zdHlsZVxuICovXG4vKipcbiAqIEEgc2FmZSBnZXRDb21wdXRlZFN0eWxlIHdpdGggYW4gSUU4IGZhbGxiYWNrLlxuICpcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4gRmlyZWZveCwgaWYgdGhlIHBsYXllciBpcyBsb2FkZWQgaW4gYW4gaWZyYW1lIHdpdGhcbiAqIGBkaXNwbGF5Om5vbmVgLCB0aGVuIGBnZXRDb21wdXRlZFN0eWxlYCByZXR1cm5zIGBudWxsYCwgc28sIHdlIGRvIGEgbnVsbC1jaGVjayB0b1xuICogbWFrZSBzdXJlICB0aGF0IHRoZSBwbGF5ZXIgZG9lc24ndCBicmVhayBpbiB0aGVzZSBjYXNlcy5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgVGhlIGVsZW1lbnQgeW91IHdhbnQgdGhlIGNvbXB1dGVkIHN0eWxlIG9mXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BcbiAqICAgICAgICBUaGUgcHJvcGVydHkgbmFtZSB5b3Ugd2FudFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQ4Mzk3XG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVkU3R5bGUoZWwsIHByb3ApIHtcbiAgaWYgKCFlbCB8fCAhcHJvcCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG5cbiAgICByZXR1cm4gY3MgPyBjc1twcm9wXSA6ICcnO1xuICB9XG5cbiAgcmV0dXJuIGVsLmN1cnJlbnRTdHlsZVtwcm9wXSB8fCAnJztcbn1cblxudmFyIF90ZW1wbGF0ZU9iamVjdCA9IHRhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnU2V0dGluZyBhdHRyaWJ1dGVzIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgY3JlYXRlRWwoKVxcbiAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgdGhlIHRoaXJkIGFyZ3VtZW50IGluc3RlYWQuXFxuICAgICAgICAgICAgICAgIGNyZWF0ZUVsKHR5cGUsIHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMpLiBBdHRlbXB0aW5nIHRvIHNldCAnLCAnIHRvICcsICcuJ10sIFsnU2V0dGluZyBhdHRyaWJ1dGVzIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgY3JlYXRlRWwoKVxcbiAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgdGhlIHRoaXJkIGFyZ3VtZW50IGluc3RlYWQuXFxuICAgICAgICAgICAgICAgIGNyZWF0ZUVsKHR5cGUsIHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMpLiBBdHRlbXB0aW5nIHRvIHNldCAnLCAnIHRvICcsICcuJ10pO1xuXG4vKipcbiAqIEBmaWxlIGRvbS5qc1xuICogQG1vZHVsZSBkb21cbiAqL1xuLyoqXG4gKiBEZXRlY3QgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZyB3aXRoIGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqICAgICAgICBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgbm9uLWJsYW5rXG4gKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICovXG5mdW5jdGlvbiBpc05vbkJsYW5rU3RyaW5nKHN0cikge1xuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgL1xcUy8udGVzdChzdHIpO1xufVxuXG4vKipcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcGFzc2VkIHN0cmluZyBoYXMgd2hpdGVzcGFjZS4gVGhpcyBpcyB1c2VkIGJ5XG4gKiBjbGFzcyBtZXRob2RzIHRvIGJlIHJlbGF0aXZlbHkgY29uc2lzdGVudCB3aXRoIHRoZSBjbGFzc0xpc3QgQVBJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqICAgICAgICAgVGhlIHN0cmluZyB0byBjaGVjayBmb3Igd2hpdGVzcGFjZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqICAgICAgICAgVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIHdoaXRlc3BhY2UgaW4gdGhlIHN0cmluZy5cbiAqXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZXaGl0ZXNwYWNlKHN0cikge1xuICBpZiAoL1xccy8udGVzdChzdHIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzcyBoYXMgaWxsZWdhbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMnKTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2R1Y2UgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGEgY2xhc3NOYW1lIHdpdGhpbiBhbiBlbGVtZW50cyBjbGFzc05hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICogICAgICAgICBUaGUgY2xhc3NOYW1lIHRvIGdlbmVyYXRlIHRoZSBSZWdFeHAgZm9yLlxuICpcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqICAgICAgICAgVGhlIFJlZ0V4cCB0aGF0IHdpbGwgY2hlY2sgZm9yIGEgc3BlY2lmaWMgYGNsYXNzTmFtZWAgaW4gYW4gZWxlbWVudHNcbiAqICAgICAgICAgY2xhc3NOYW1lLlxuICovXG5mdW5jdGlvbiBjbGFzc1JlZ0V4cChjbGFzc05hbWUpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoJyhefFxcXFxzKScgKyBjbGFzc05hbWUgKyAnKCR8XFxcXHMpJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBET00gaW50ZXJmYWNlIGFwcGVhcnMgdG8gYmUgcmVhbC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc1JlYWwoKSB7XG4gIHJldHVybiAoXG5cbiAgICAvLyBCb3RoIGRvY3VtZW50IGFuZCB3aW5kb3cgd2lsbCBuZXZlciBiZSB1bmRlZmluZWQgdGhhbmtzIHRvIGBnbG9iYWxgLlxuICAgIGRvY3VtZW50ID09PSB3aW5kb3cuZG9jdW1lbnQgJiZcblxuICAgIC8vIEluIElFIDwgOSwgRE9NIG1ldGhvZHMgcmV0dXJuIFwib2JqZWN0XCIgYXMgdGhlaXIgdHlwZSwgc28gYWxsIHdlIGNhblxuICAgIC8vIGNvbmZpZGVudGx5IGNoZWNrIGlzIHRoYXQgaXQgZXhpc3RzLlxuICAgIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJ1xuICApO1xufVxuXG4vKipcbiAqIERldGVybWluZXMsIHZpYSBkdWNrIHR5cGluZywgd2hldGhlciBvciBub3QgYSB2YWx1ZSBpcyBhIERPTSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gKiAgICAgICAgVGhlIHRoaW5nIHRvIGNoZWNrXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIGl0IGlzIGEgRE9NIGVsZW1lbnRcbiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuZnVuY3Rpb24gaXNFbCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIHZhbHVlLm5vZGVUeXBlID09PSAxO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgRE9NIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZS5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICpcbiAqL1xuZnVuY3Rpb24gaXNJbkZyYW1lKCkge1xuXG4gIC8vIFdlIG5lZWQgYSB0cnkvY2F0Y2ggaGVyZSBiZWNhdXNlIFNhZmFyaSB3aWxsIHRocm93IGVycm9ycyB3aGVuIGF0dGVtcHRpbmdcbiAgLy8gdG8gZ2V0IGVpdGhlciBgcGFyZW50YCBvciBgc2VsZmBcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LnBhcmVudCAhPT0gd2luZG93LnNlbGY7XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgZnVuY3Rpb25zIHRvIHF1ZXJ5IHRoZSBET00gdXNpbmcgYSBnaXZlbiBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFxuICogICAgICAgICBUaGUgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcXVlcnkgd2l0aC5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqICAgICAgICAgVGhlIHF1ZXJ5IG1ldGhvZFxuICovXG5mdW5jdGlvbiBjcmVhdGVRdWVyaWVyKG1ldGhvZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKCFpc05vbkJsYW5rU3RyaW5nKHNlbGVjdG9yKSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50W21ldGhvZF0obnVsbCk7XG4gICAgfVxuICAgIGlmIChpc05vbkJsYW5rU3RyaW5nKGNvbnRleHQpKSB7XG4gICAgICBjb250ZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250ZXh0KTtcbiAgICB9XG5cbiAgICB2YXIgY3R4ID0gaXNFbChjb250ZXh0KSA/IGNvbnRleHQgOiBkb2N1bWVudDtcblxuICAgIHJldHVybiBjdHhbbWV0aG9kXSAmJiBjdHhbbWV0aG9kXShzZWxlY3Rvcik7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlbGVtZW50IGFuZCBhcHBsaWVzIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWdOYW1lPSdkaXYnXVxuICogICAgICAgICBOYW1lIG9mIHRhZyB0byBiZSBjcmVhdGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV1cbiAqICAgICAgICAgRWxlbWVudCBwcm9wZXJ0aWVzIHRvIGJlIGFwcGxpZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFthdHRyaWJ1dGVzPXt9XVxuICogICAgICAgICBFbGVtZW50IGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xFbGVtZW50fFRleHROb2RlfEFycmF5fEZ1bmN0aW9ufSBbY29udGVudF1cbiAqICAgICAgICAgQ29udGVudHMgZm9yIHRoZSBlbGVtZW50IChzZWU6IHtAbGluayBkb206bm9ybWFsaXplQ29udGVudH0pXG4gKlxuICogQHJldHVybiB7RWxlbWVudH1cbiAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWwoKSB7XG4gIHZhciB0YWdOYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnZGl2JztcbiAgdmFyIHByb3BlcnRpZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gIHZhciBjb250ZW50ID0gYXJndW1lbnRzWzNdO1xuXG4gIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICB2YXIgdmFsID0gcHJvcGVydGllc1twcm9wTmFtZV07XG5cbiAgICAvLyBTZWUgIzIxNzZcbiAgICAvLyBXZSBvcmlnaW5hbGx5IHdlcmUgYWNjZXB0aW5nIGJvdGggcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcyBpbiB0aGVcbiAgICAvLyBzYW1lIG9iamVjdCwgYnV0IHRoYXQgZG9lc24ndCB3b3JrIHNvIHdlbGwuXG4gICAgaWYgKHByb3BOYW1lLmluZGV4T2YoJ2FyaWEtJykgIT09IC0xIHx8IHByb3BOYW1lID09PSAncm9sZScgfHwgcHJvcE5hbWUgPT09ICd0eXBlJykge1xuICAgICAgbG9nJDEud2Fybih0c21sKF90ZW1wbGF0ZU9iamVjdCwgcHJvcE5hbWUsIHZhbCkpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKHByb3BOYW1lLCB2YWwpO1xuXG4gICAgICAvLyBIYW5kbGUgdGV4dENvbnRlbnQgc2luY2UgaXQncyBub3Qgc3VwcG9ydGVkIGV2ZXJ5d2hlcmUgYW5kIHdlIGhhdmUgYVxuICAgICAgLy8gbWV0aG9kIGZvciBpdC5cbiAgICB9IGVsc2UgaWYgKHByb3BOYW1lID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0ZXh0Q29udGVudChlbCwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxbcHJvcE5hbWVdID0gdmFsO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoYXR0ck5hbWUpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJpYnV0ZXNbYXR0ck5hbWVdKTtcbiAgfSk7XG5cbiAgaWYgKGNvbnRlbnQpIHtcbiAgICBhcHBlbmRDb250ZW50KGVsLCBjb250ZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbDtcbn1cblxuLyoqXG4gKiBJbmplY3RzIHRleHQgaW50byBhbiBlbGVtZW50LCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIGNvbnRlbnRzIGVudGlyZWx5LlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBUaGUgZWxlbWVudCB0byBhZGQgdGV4dCBjb250ZW50IGludG9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogICAgICAgIFRoZSB0ZXh0IGNvbnRlbnQgdG8gYWRkLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKiAgICAgICAgIFRoZSBlbGVtZW50IHdpdGggYWRkZWQgdGV4dCBjb250ZW50LlxuICovXG5mdW5jdGlvbiB0ZXh0Q29udGVudChlbCwgdGV4dCkge1xuICBpZiAodHlwZW9mIGVsLnRleHRDb250ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIGVsLmlubmVyVGV4dCA9IHRleHQ7XG4gIH0gZWxzZSB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG4gIHJldHVybiBlbDtcbn1cblxuLyoqXG4gKiBJbnNlcnQgYW4gZWxlbWVudCBhcyB0aGUgZmlyc3QgY2hpbGQgbm9kZSBvZiBhbm90aGVyXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBjaGlsZFxuICogICAgICAgIEVsZW1lbnQgdG8gaW5zZXJ0XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBwYXJlbnRcbiAqICAgICAgICBFbGVtZW50IHRvIGluc2VydCBjaGlsZCBpbnRvXG4gKi9cbmZ1bmN0aW9uIHByZXBlbmRUbyhjaGlsZCwgcGFyZW50KSB7XG4gIGlmIChwYXJlbnQuZmlyc3RDaGlsZCkge1xuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHBhcmVudC5maXJzdENoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqICAgICAgICBFbGVtZW50IHRvIGNoZWNrXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzVG9DaGVja1xuICogICAgICAgIENsYXNzIG5hbWUgdG8gY2hlY2sgZm9yXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIHRoZSBlbGVtZW50IGhhZCB0aGUgY2xhc3NcbiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHRocm93cyB7RXJyb3J9XG4gKiAgICAgICAgIFRocm93cyBhbiBlcnJvciBpZiBgY2xhc3NUb0NoZWNrYCBoYXMgd2hpdGUgc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzVG9DaGVjaykge1xuICB0aHJvd0lmV2hpdGVzcGFjZShjbGFzc1RvQ2hlY2spO1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NUb0NoZWNrKTtcbiAgfVxuICByZXR1cm4gY2xhc3NSZWdFeHAoY2xhc3NUb0NoZWNrKS50ZXN0KGVsZW1lbnQuY2xhc3NOYW1lKTtcbn1cblxuLyoqXG4gKiBBZGQgYSBDU1MgY2xhc3MgbmFtZSB0byBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiAgICAgICAgRWxlbWVudCB0byBhZGQgY2xhc3MgbmFtZSB0by5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb0FkZFxuICogICAgICAgIENsYXNzIG5hbWUgdG8gYWRkLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKiAgICAgICAgIFRoZSBkb20gZWxlbWVudCB3aXRoIHRoZSBhZGRlZCBjbGFzcyBuYW1lLlxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc1RvQWRkKSB7XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc1RvQWRkKTtcblxuICAgIC8vIERvbid0IG5lZWQgdG8gYHRocm93SWZXaGl0ZXNwYWNlYCBoZXJlIGJlY2F1c2UgYGhhc0VsQ2xhc3NgIHdpbGwgZG8gaXRcbiAgICAvLyBpbiB0aGUgY2FzZSBvZiBjbGFzc0xpc3Qgbm90IGJlaW5nIHN1cHBvcnRlZC5cbiAgfSBlbHNlIGlmICghaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NUb0FkZCkpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IChlbGVtZW50LmNsYXNzTmFtZSArICcgJyArIGNsYXNzVG9BZGQpLnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIENTUyBjbGFzcyBuYW1lIGZyb20gYW4gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogICAgICAgIEVsZW1lbnQgdG8gcmVtb3ZlIGEgY2xhc3MgbmFtZSBmcm9tLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1RvUmVtb3ZlXG4gKiAgICAgICAgQ2xhc3MgbmFtZSB0byByZW1vdmVcbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICogICAgICAgICBUaGUgZG9tIGVsZW1lbnQgd2l0aCBjbGFzcyBuYW1lIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzVG9SZW1vdmUpIHtcbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzVG9SZW1vdmUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93SWZXaGl0ZXNwYWNlKGNsYXNzVG9SZW1vdmUpO1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoL1xccysvKS5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjICE9PSBjbGFzc1RvUmVtb3ZlO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIFRoZSBjYWxsYmFjayBkZWZpbml0aW9uIGZvciB0b2dnbGVFbENsYXNzLlxuICpcbiAqIEBjYWxsYmFjayBEb21+UHJlZGljYXRlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogICAgICAgIFRoZSBET00gZWxlbWVudCBvZiB0aGUgQ29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1RvVG9nZ2xlXG4gKiAgICAgICAgVGhlIGBjbGFzc05hbWVgIHRoYXQgd2FudHMgdG8gYmUgdG9nZ2xlZFxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfVxuICogICAgICAgICAtIElmIHRydWUgdGhlIGBjbGFzc1RvVG9nZ2xlYCB3aWxsIGdldCBhZGRlZCB0byBgZWxlbWVudGAuXG4gKiAgICAgICAgIC0gSWYgZmFsc2UgdGhlIGBjbGFzc1RvVG9nZ2xlYCB3aWxsIGdldCByZW1vdmVkIGZyb20gYGVsZW1lbnRgLlxuICogICAgICAgICAtIElmIHVuZGVmaW5lZCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgaWdub3JlZFxuICovXG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIGEgQ1NTIGNsYXNzIG5hbWUgb24gYW4gZWxlbWVudCBkZXBlbmRpbmcgb24gYW4gb3B0aW9uYWxcbiAqIGNvbmRpdGlvbiBvciB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiB0aGUgY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqICAgICAgICBUaGUgZWxlbWVudCB0byB0b2dnbGUgYSBjbGFzcyBuYW1lIG9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1RvVG9nZ2xlXG4gKiAgICAgICAgVGhlIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHRvZ2dsZWRcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW58UHJlZGljYXRlQ2FsbGJhY2t9IFtwcmVkaWNhdGVdXG4gKiAgICAgICAgU2VlIHRoZSByZXR1cm4gdmFsdWUgZm9yIHtAbGluayBEb21+UHJlZGljYXRlQ2FsbGJhY2t9XG4gKlxuICogQHJldHVybiB7RWxlbWVudH1cbiAqICAgICAgICAgVGhlIGVsZW1lbnQgd2l0aCBhIGNsYXNzIHRoYXQgaGFzIGJlZW4gdG9nZ2xlZC5cbiAqL1xuZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSwgcHJlZGljYXRlKSB7XG5cbiAgLy8gVGhpcyBDQU5OT1QgdXNlIGBjbGFzc0xpc3RgIGludGVybmFsbHkgYmVjYXVzZSBJRSBkb2VzIG5vdCBzdXBwb3J0IHRoZVxuICAvLyBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZSBgY2xhc3NMaXN0LnRvZ2dsZSgpYCBtZXRob2QhIFdoaWNoIGlzIGZpbmUgYmVjYXVzZVxuICAvLyBgY2xhc3NMaXN0YCB3aWxsIGJlIHVzZWQgYnkgdGhlIGFkZC9yZW1vdmUgZnVuY3Rpb25zLlxuICB2YXIgaGFzID0gaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSk7XG5cbiAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcHJlZGljYXRlID0gIWhhcztcbiAgfVxuXG4gIC8vIElmIHRoZSBuZWNlc3NhcnkgY2xhc3Mgb3BlcmF0aW9uIG1hdGNoZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlXG4gIC8vIGVsZW1lbnQsIG5vIGFjdGlvbiBpcyByZXF1aXJlZC5cbiAgaWYgKHByZWRpY2F0ZSA9PT0gaGFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByZWRpY2F0ZSkge1xuICAgIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzVG9Ub2dnbGUpO1xuICB9IGVsc2Uge1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzVG9Ub2dnbGUpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQXBwbHkgYXR0cmlidXRlcyB0byBhbiBIVE1MIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIEVsZW1lbnQgdG8gYWRkIGF0dHJpYnV0ZXMgdG8uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFthdHRyaWJ1dGVzXVxuICogICAgICAgIEF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZC5cbiAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhlbCwgYXR0cmlidXRlcykge1xuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyTmFtZSkge1xuICAgIHZhciBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTtcblxuICAgIGlmIChhdHRyVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGF0dHJWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgYXR0clZhbHVlID09PSBmYWxzZSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUgPT09IHRydWUgPyAnJyA6IGF0dHJWYWx1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYW4gZWxlbWVudCdzIGF0dHJpYnV0ZSB2YWx1ZXMsIGFzIGRlZmluZWQgb24gdGhlIEhUTUwgdGFnXG4gKiBBdHRyaWJ1dGVzIGFyZSBub3QgdGhlIHNhbWUgYXMgcHJvcGVydGllcy4gVGhleSdyZSBkZWZpbmVkIG9uIHRoZSB0YWdcbiAqIG9yIHdpdGggc2V0QXR0cmlidXRlICh3aGljaCBzaG91bGRuJ3QgYmUgdXNlZCB3aXRoIEhUTUwpXG4gKiBUaGlzIHdpbGwgcmV0dXJuIHRydWUgb3IgZmFsc2UgZm9yIGJvb2xlYW4gYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhZ1xuICogICAgICAgIEVsZW1lbnQgZnJvbSB3aGljaCB0byBnZXQgdGFnIGF0dHJpYnV0ZXMuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cmlidXRlcyh0YWcpIHtcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIC8vIGtub3duIGJvb2xlYW4gYXR0cmlidXRlc1xuICAvLyB3ZSBjYW4gY2hlY2sgZm9yIG1hdGNoaW5nIGJvb2xlYW4gcHJvcGVydGllcywgYnV0IG9sZGVyIGJyb3dzZXJzXG4gIC8vIHdvbid0IGtub3cgYWJvdXQgSFRNTDUgYm9vbGVhbiBhdHRyaWJ1dGVzIHRoYXQgd2Ugc3RpbGwgcmVhZCBmcm9tXG4gIHZhciBrbm93bkJvb2xlYW5zID0gJywnICsgJ2F1dG9wbGF5LGNvbnRyb2xzLHBsYXlzaW5saW5lLGxvb3AsbXV0ZWQsZGVmYXVsdCxkZWZhdWx0TXV0ZWQnICsgJywnO1xuXG4gIGlmICh0YWcgJiYgdGFnLmF0dHJpYnV0ZXMgJiYgdGFnLmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgIHZhciBhdHRycyA9IHRhZy5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgYXR0ck5hbWUgPSBhdHRyc1tpXS5uYW1lO1xuICAgICAgdmFyIGF0dHJWYWwgPSBhdHRyc1tpXS52YWx1ZTtcblxuICAgICAgLy8gY2hlY2sgZm9yIGtub3duIGJvb2xlYW5zXG4gICAgICAvLyB0aGUgbWF0Y2hpbmcgZWxlbWVudCBwcm9wZXJ0eSB3aWxsIHJldHVybiBhIHZhbHVlIGZvciB0eXBlb2ZcbiAgICAgIGlmICh0eXBlb2YgdGFnW2F0dHJOYW1lXSA9PT0gJ2Jvb2xlYW4nIHx8IGtub3duQm9vbGVhbnMuaW5kZXhPZignLCcgKyBhdHRyTmFtZSArICcsJykgIT09IC0xKSB7XG4gICAgICAgIC8vIHRoZSB2YWx1ZSBvZiBhbiBpbmNsdWRlZCBib29sZWFuIGF0dHJpYnV0ZSBpcyB0eXBpY2FsbHkgYW4gZW1wdHlcbiAgICAgICAgLy8gc3RyaW5nICgnJykgd2hpY2ggd291bGQgZXF1YWwgZmFsc2UgaWYgd2UganVzdCBjaGVjayBmb3IgYSBmYWxzZSB2YWx1ZS5cbiAgICAgICAgLy8gd2UgYWxzbyBkb24ndCB3YW50IHN1cHBvcnQgYmFkIGNvZGUgbGlrZSBhdXRvcGxheT0nZmFsc2UnXG4gICAgICAgIGF0dHJWYWwgPSBhdHRyVmFsICE9PSBudWxsID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBvYmpbYXR0ck5hbWVdID0gYXR0clZhbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCdzIGF0dHJpYnV0ZVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBBIERPTSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICogICAgICAgIEF0dHJpYnV0ZSB0byBnZXQgdGhlIHZhbHVlIG9mXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICogICAgICAgICB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlXG4gKi9cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZShlbCwgYXR0cmlidXRlKSB7XG4gIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQncyBhdHRyaWJ1dGVcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgQSBET00gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAqICAgICAgICBBdHRyaWJ1dGUgdG8gc2V0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiAgICAgICAgVmFsdWUgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgdG9cbiAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlKGVsLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIGVsLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYW4gZWxlbWVudCdzIGF0dHJpYnV0ZVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBBIERPTSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICogICAgICAgIEF0dHJpYnV0ZSB0byByZW1vdmVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlKGVsLCBhdHRyaWJ1dGUpIHtcbiAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBibG9jayB0aGUgYWJpbGl0eSB0byBzZWxlY3QgdGV4dCB3aGlsZSBkcmFnZ2luZyBjb250cm9sc1xuICovXG5mdW5jdGlvbiBibG9ja1RleHRTZWxlY3Rpb24oKSB7XG4gIGRvY3VtZW50LmJvZHkuZm9jdXMoKTtcbiAgZG9jdW1lbnQub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbi8qKlxuICogVHVybiBvZmYgdGV4dCBzZWxlY3Rpb24gYmxvY2tpbmdcbiAqL1xuZnVuY3Rpb24gdW5ibG9ja1RleHRTZWxlY3Rpb24oKSB7XG4gIGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbi8qKlxuICogSWRlbnRpY2FsIHRvIHRoZSBuYXRpdmUgYGdldEJvdW5kaW5nQ2xpZW50UmVjdGAgZnVuY3Rpb24sIGJ1dCBlbnN1cmVzIHRoYXRcbiAqIHRoZSBtZXRob2QgaXMgc3VwcG9ydGVkIGF0IGFsbCAoaXQgaXMgaW4gYWxsIGJyb3dzZXJzIHdlIGNsYWltIHRvIHN1cHBvcnQpXG4gKiBhbmQgdGhhdCB0aGUgZWxlbWVudCBpcyBpbiB0aGUgRE9NIGJlZm9yZSBjb250aW51aW5nLlxuICpcbiAqIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBhbHNvIHNoaW1zIHByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBwcm92aWRlZCBieSBzb21lXG4gKiBvbGRlciBicm93c2VycyAobmFtZWx5LCBJRTgpLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgc29tZSBicm93c2VycyBkbyBub3Qgc3VwcG9ydCBhZGRpbmcgcHJvcGVydGllcyB0byBhXG4gKiBgQ2xpZW50UmVjdGAvYERPTVJlY3RgIG9iamVjdDsgc28sIHdlIHNoYWxsb3ctY29weSBpdCB3aXRoIHRoZSBzdGFuZGFyZFxuICogcHJvcGVydGllcyAoZXhjZXB0IGB4YCBhbmQgYHlgIHdoaWNoIGFyZSBub3Qgd2lkZWx5IHN1cHBvcnRlZCkuIFRoaXMgaGVscHNcbiAqIGF2b2lkIGltcGxlbWVudGF0aW9ucyB3aGVyZSBrZXlzIGFyZSBub24tZW51bWVyYWJsZS5cbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICogICAgICAgICBFbGVtZW50IHdob3NlIGBDbGllbnRSZWN0YCB3ZSB3YW50IHRvIGNhbGN1bGF0ZS5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfVxuICogICAgICAgICBBbHdheXMgcmV0dXJucyBhIHBsYWluXG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbCkge1xuICBpZiAoZWwgJiYgZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIGVsLnBhcmVudE5vZGUpIHtcbiAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgIFsnYm90dG9tJywgJ2hlaWdodCcsICdsZWZ0JywgJ3JpZ2h0JywgJ3RvcCcsICd3aWR0aCddLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIGlmIChyZWN0W2tdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVjdFtrXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0LmhlaWdodCkge1xuICAgICAgcmVzdWx0LmhlaWdodCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZShlbCwgJ2hlaWdodCcpKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC53aWR0aCkge1xuICAgICAgcmVzdWx0LndpZHRoID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlKGVsLCAnd2lkdGgnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBwb3N0aW9uIG9mIGEgRE9NIGVsZW1lbnQgb24gdGhlIHBhZ2UuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gbW9kdWxlOmRvbX5Qb3NpdGlvblxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0XG4gKiAgICAgICAgICAgUGl4ZWxzIHRvIHRoZSBsZWZ0XG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcFxuICogICAgICAgICAgIFBpeGVscyBvbiB0b3BcbiAqL1xuXG4vKipcbiAqIE9mZnNldCBMZWZ0LlxuICogZ2V0Qm91bmRpbmdDbGllbnRSZWN0IHRlY2huaXF1ZSBmcm9tXG4gKiBKb2huIFJlc2lnXG4gKlxuICogQHNlZSBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvZ2V0Ym91bmRpbmdjbGllbnRyZWN0LWlzLWF3ZXNvbWUvXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIEVsZW1lbnQgZnJvbSB3aGljaCB0byBnZXQgb2Zmc2V0XG4gKlxuICogQHJldHVybiB7bW9kdWxlOmRvbX5Qb3NpdGlvbn1cbiAqICAgICAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHBhc3NlZCBpbi5cbiAqL1xuZnVuY3Rpb24gZmluZFBvc2l0aW9uKGVsKSB7XG4gIHZhciBib3ggPSB2b2lkIDA7XG5cbiAgaWYgKGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiBlbC5wYXJlbnROb2RlKSB7XG4gICAgYm94ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH1cblxuICBpZiAoIWJveCkge1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfTtcbiAgfVxuXG4gIHZhciBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXG4gIHZhciBjbGllbnRMZWZ0ID0gZG9jRWwuY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgYm9keS5zY3JvbGxMZWZ0O1xuICB2YXIgbGVmdCA9IGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCAtIGNsaWVudExlZnQ7XG5cbiAgdmFyIGNsaWVudFRvcCA9IGRvY0VsLmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRvcCB8fCAwO1xuICB2YXIgc2Nyb2xsVG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGJvZHkuc2Nyb2xsVG9wO1xuICB2YXIgdG9wID0gYm94LnRvcCArIHNjcm9sbFRvcCAtIGNsaWVudFRvcDtcblxuICAvLyBBbmRyb2lkIHNvbWV0aW1lcyByZXR1cm5zIHNsaWdodGx5IG9mZiBkZWNpbWFsIHZhbHVlcywgc28gbmVlZCB0byByb3VuZFxuICByZXR1cm4ge1xuICAgIGxlZnQ6IE1hdGgucm91bmQobGVmdCksXG4gICAgdG9wOiBNYXRoLnJvdW5kKHRvcClcbiAgfTtcbn1cblxuLyoqXG4gKiB4IGFuZCB5IGNvb3JkaW5hdGVzIGZvciBhIGRvbSBlbGVtZW50IG9yIG1vdXNlIHBvaW50ZXJcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEb21+Q29vcmRpbmF0ZXNcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0geFxuICogICAgICAgICAgIHggY29vcmRpbmF0ZSBpbiBwaXhlbHNcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0geVxuICogICAgICAgICAgIHkgY29vcmRpbmF0ZSBpbiBwaXhlbHNcbiAqL1xuXG4vKipcbiAqIEdldCBwb2ludGVyIHBvc2l0aW9uIGluIGVsZW1lbnRcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggeCBhbmQgeSBjb29yZGluYXRlcy5cbiAqIFRoZSBiYXNlIG9uIHRoZSBjb29yZGluYXRlcyBhcmUgdGhlIGJvdHRvbSBsZWZ0IG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBFbGVtZW50IG9uIHdoaWNoIHRvIGdldCB0aGUgcG9pbnRlciBwb3NpdGlvbiBvblxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gKiAgICAgICAgRXZlbnQgb2JqZWN0XG4gKlxuICogQHJldHVybiB7RG9tfkNvb3JkaW5hdGVzfVxuICogICAgICAgICBBIENvb3JkaW5hdGVzIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtb3VzZSBwb3NpdGlvbi5cbiAqXG4gKi9cbmZ1bmN0aW9uIGdldFBvaW50ZXJQb3NpdGlvbihlbCwgZXZlbnQpIHtcbiAgdmFyIHBvc2l0aW9uID0ge307XG4gIHZhciBib3ggPSBmaW5kUG9zaXRpb24oZWwpO1xuICB2YXIgYm94VyA9IGVsLm9mZnNldFdpZHRoO1xuICB2YXIgYm94SCA9IGVsLm9mZnNldEhlaWdodDtcblxuICB2YXIgYm94WSA9IGJveC50b3A7XG4gIHZhciBib3hYID0gYm94LmxlZnQ7XG4gIHZhciBwYWdlWSA9IGV2ZW50LnBhZ2VZO1xuICB2YXIgcGFnZVggPSBldmVudC5wYWdlWDtcblxuICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXMpIHtcbiAgICBwYWdlWCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO1xuICAgIHBhZ2VZID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVk7XG4gIH1cblxuICBwb3NpdGlvbi55ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKGJveFkgLSBwYWdlWSArIGJveEgpIC8gYm94SCkpO1xuICBwb3NpdGlvbi54ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHBhZ2VYIC0gYm94WCkgLyBib3hXKSk7XG5cbiAgcmV0dXJuIHBvc2l0aW9uO1xufVxuXG4vKipcbiAqIERldGVybWluZXMsIHZpYSBkdWNrIHR5cGluZywgd2hldGhlciBvciBub3QgYSB2YWx1ZSBpcyBhIHRleHQgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogICAgICAgIENoZWNrIGlmIHRoaXMgdmFsdWUgaXMgYSB0ZXh0IG5vZGUuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIGl0IGlzIGEgdGV4dCBub2RlXG4gKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGlzVGV4dE5vZGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHZhbHVlKSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMztcbn1cblxuLyoqXG4gKiBFbXB0aWVzIHRoZSBjb250ZW50cyBvZiBhbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBUaGUgZWxlbWVudCB0byBlbXB0eSBjaGlsZHJlbiBmcm9tXG4gKlxuICogQHJldHVybiB7RWxlbWVudH1cbiAqICAgICAgICAgVGhlIGVsZW1lbnQgd2l0aCBubyBjaGlsZHJlblxuICovXG5mdW5jdGlvbiBlbXB0eUVsKGVsKSB7XG4gIHdoaWxlIChlbC5maXJzdENoaWxkKSB7XG4gICAgZWwucmVtb3ZlQ2hpbGQoZWwuZmlyc3RDaGlsZCk7XG4gIH1cbiAgcmV0dXJuIGVsO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgY29udGVudCBmb3IgZXZlbnR1YWwgaW5zZXJ0aW9uIGludG8gdGhlIERPTS5cbiAqXG4gKiBUaGlzIGFsbG93cyBhIHdpZGUgcmFuZ2Ugb2YgY29udGVudCBkZWZpbml0aW9uIG1ldGhvZHMsIGJ1dCBwcm90ZWN0c1xuICogZnJvbSBmYWxsaW5nIGludG8gdGhlIHRyYXAgb2Ygc2ltcGx5IHdyaXRpbmcgdG8gYGlubmVySFRNTGAsIHdoaWNoIGlzXG4gKiBhbiBYU1MgY29uY2Vybi5cbiAqXG4gKiBUaGUgY29udGVudCBmb3IgYW4gZWxlbWVudCBjYW4gYmUgcGFzc2VkIGluIG11bHRpcGxlIHR5cGVzIGFuZFxuICogY29tYmluYXRpb25zLCB3aG9zZSBiZWhhdmlvciBpcyBhcyBmb2xsb3dzOlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEVsZW1lbnR8VGV4dE5vZGV8QXJyYXl8RnVuY3Rpb259IGNvbnRlbnRcbiAqICAgICAgICAtIFN0cmluZzogTm9ybWFsaXplZCBpbnRvIGEgdGV4dCBub2RlLlxuICogICAgICAgIC0gRWxlbWVudC9UZXh0Tm9kZTogUGFzc2VkIHRocm91Z2guXG4gKiAgICAgICAgLSBBcnJheTogQSBvbmUtZGltZW5zaW9uYWwgYXJyYXkgb2Ygc3RyaW5ncywgZWxlbWVudHMsIG5vZGVzLCBvciBmdW5jdGlvbnNcbiAqICAgICAgICAgICh3aGljaCByZXR1cm4gc2luZ2xlIHN0cmluZ3MsIGVsZW1lbnRzLCBvciBub2RlcykuXG4gKiAgICAgICAgLSBGdW5jdGlvbjogSWYgdGhlIHNvbGUgYXJndW1lbnQsIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBzdHJpbmcsIGVsZW1lbnQsXG4gKiAgICAgICAgICBub2RlLCBvciBhcnJheSBhcyBkZWZpbmVkIGFib3ZlLlxuICpcbiAqIEByZXR1cm4ge0FycmF5fVxuICogICAgICAgICBBbGwgb2YgdGhlIGNvbnRlbnQgdGhhdCB3YXMgcGFzc2VkIGluIG5vcm1hbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRlbnQoY29udGVudCkge1xuXG4gIC8vIEZpcnN0LCBpbnZva2UgY29udGVudCBpZiBpdCBpcyBhIGZ1bmN0aW9uLiBJZiBpdCBwcm9kdWNlcyBhbiBhcnJheSxcbiAgLy8gdGhhdCBuZWVkcyB0byBoYXBwZW4gYmVmb3JlIG5vcm1hbGl6YXRpb24uXG4gIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnRlbnQgPSBjb250ZW50KCk7XG4gIH1cblxuICAvLyBOZXh0IHVwLCBub3JtYWxpemUgdG8gYW4gYXJyYXksIHNvIG9uZSBvciBtYW55IGl0ZW1zIGNhbiBiZSBub3JtYWxpemVkLFxuICAvLyBmaWx0ZXJlZCwgYW5kIHJldHVybmVkLlxuICByZXR1cm4gKEFycmF5LmlzQXJyYXkoY29udGVudCkgPyBjb250ZW50IDogW2NvbnRlbnRdKS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG5cbiAgICAvLyBGaXJzdCwgaW52b2tlIHZhbHVlIGlmIGl0IGlzIGEgZnVuY3Rpb24gdG8gcHJvZHVjZSBhIG5ldyB2YWx1ZSxcbiAgICAvLyB3aGljaCB3aWxsIGJlIHN1YnNlcXVlbnRseSBub3JtYWxpemVkIHRvIGEgTm9kZSBvZiBzb21lIGtpbmQuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZSgpO1xuICAgIH1cblxuICAgIGlmIChpc0VsKHZhbHVlKSB8fCBpc1RleHROb2RlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9cXFMvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xuICAgIH1cbiAgfSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbmQgYXBwZW5kcyBjb250ZW50IHRvIGFuIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIEVsZW1lbnQgdG8gYXBwZW5kIG5vcm1hbGl6ZWQgY29udGVudCB0by5cbiAqXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RWxlbWVudHxUZXh0Tm9kZXxBcnJheXxGdW5jdGlvbn0gY29udGVudFxuICogICAgICAgIFNlZSB0aGUgYGNvbnRlbnRgIGFyZ3VtZW50IG9mIHtAbGluayBkb206bm9ybWFsaXplQ29udGVudH1cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICogICAgICAgICBUaGUgZWxlbWVudCB3aXRoIGFwcGVuZGVkIG5vcm1hbGl6ZWQgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kQ29udGVudChlbCwgY29udGVudCkge1xuICBub3JtYWxpemVDb250ZW50KGNvbnRlbnQpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gZWwuYXBwZW5kQ2hpbGQobm9kZSk7XG4gIH0pO1xuICByZXR1cm4gZWw7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbmQgaW5zZXJ0cyBjb250ZW50IGludG8gYW4gZWxlbWVudDsgdGhpcyBpcyBpZGVudGljYWwgdG9cbiAqIGBhcHBlbmRDb250ZW50KClgLCBleGNlcHQgaXQgZW1wdGllcyB0aGUgZWxlbWVudCBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgRWxlbWVudCB0byBpbnNlcnQgbm9ybWFsaXplZCBjb250ZW50IGludG8uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RWxlbWVudHxUZXh0Tm9kZXxBcnJheXxGdW5jdGlvbn0gY29udGVudFxuICogICAgICAgIFNlZSB0aGUgYGNvbnRlbnRgIGFyZ3VtZW50IG9mIHtAbGluayBkb206bm9ybWFsaXplQ29udGVudH1cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICogICAgICAgICBUaGUgZWxlbWVudCB3aXRoIGluc2VydGVkIG5vcm1hbGl6ZWQgY29udGVudC5cbiAqXG4gKi9cbmZ1bmN0aW9uIGluc2VydENvbnRlbnQoZWwsIGNvbnRlbnQpIHtcbiAgcmV0dXJuIGFwcGVuZENvbnRlbnQoZW1wdHlFbChlbCksIGNvbnRlbnQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGV2ZW50IHdhcyBhIHNpbmdsZSBsZWZ0IGNsaWNrXG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAqICAgICAgICBFdmVudCBvYmplY3RcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRydWUgaWYgYSBsZWZ0IGNsaWNrXG4gKiAgICAgICAgIC0gRmFsc2UgaWYgbm90IGEgbGVmdCBjbGlja1xuICovXG5mdW5jdGlvbiBpc1NpbmdsZUxlZnRDbGljayhldmVudCkge1xuICAvLyBOb3RlOiBpZiB5b3UgY3JlYXRlIHNvbWV0aGluZyBkcmFnZ2FibGUsIGJlIHN1cmUgdG9cbiAgLy8gY2FsbCBpdCBvbiBib3RoIGBtb3VzZWRvd25gIGFuZCBgbW91c2Vtb3ZlYCBldmVudCxcbiAgLy8gb3RoZXJ3aXNlIGBtb3VzZWRvd25gIHNob3VsZCBiZSBlbm91Z2ggZm9yIGEgYnV0dG9uXG5cbiAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gdW5kZWZpbmVkICYmIGV2ZW50LmJ1dHRvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFdoeSBkbyB3ZSBuZWVkIGBidXR0b25zYCA/XG4gICAgLy8gQmVjYXVzZSwgbWlkZGxlIG1vdXNlIHNvbWV0aW1lcyBoYXZlIHRoaXM6XG4gICAgLy8gZS5idXR0b24gPT09IDAgYW5kIGUuYnV0dG9ucyA9PT0gNFxuICAgIC8vIEZ1cnRoZXJtb3JlLCB3ZSB3YW50IHRvIHByZXZlbnQgY29tYmluYXRpb24gY2xpY2ssIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gSE9MRCBtaWRkbGVtb3VzZSB0aGVuIGxlZnQgY2xpY2ssIHRoYXQgd291bGQgYmVcbiAgICAvLyBlLmJ1dHRvbiA9PT0gMCwgZS5idXR0b25zID09PSA1XG4gICAgLy8ganVzdCBgYnV0dG9uYCBpcyBub3QgZ29ubmEgd29ya1xuXG4gICAgLy8gQWxyaWdodCwgdGhlbiB3aGF0IHRoaXMgYmxvY2sgZG9lcyA/XG4gICAgLy8gdGhpcyBpcyBmb3IgY2hyb21lIGBzaW11bGF0ZSBtb2JpbGUgZGV2aWNlc2BcbiAgICAvLyBJIHdhbnQgdG8gc3VwcG9ydCB0aGlzIGFzIHdlbGxcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5idXR0b25zID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBUb3VjaCBzY3JlZW4sIHNvbWV0aW1lcyBvbiBzb21lIHNwZWNpZmljIGRldmljZSwgYGJ1dHRvbnNgXG4gICAgLy8gZG9lc24ndCBoYXZlIGFueXRoaW5nIChzYWZhcmkgb24gaW9zLCBibGFja2JlcnJ5Li4uKVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoSUVfVkVSU0lPTiA9PT0gOSkge1xuICAgIC8vIElnbm9yZSBJRTlcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5idXR0b25zICE9PSAxKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcmVhc29uIHdlIGhhdmUgdGhvc2UgaWYgZWxzZSBibG9jayBhYm92ZVxuICAgIC8vIGlmIGFueSBzcGVjaWFsIGNhc2Ugd2UgY2FuIGNhdGNoIGFuZCBsZXQgaXQgc2xpZGVcbiAgICAvLyB3ZSBkbyBpdCBhYm92ZSwgd2hlbiBnZXQgdG8gaGVyZSwgdGhpcyBkZWZpbml0ZWx5XG4gICAgLy8gaXMtbm90LWxlZnQtY2xpY2tcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEZpbmRzIGEgc2luZ2xlIERPTSBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAgd2l0aGluIHRoZSBvcHRpb25hbFxuICogYGNvbnRleHRgIG9mIGFub3RoZXIgRE9NIGVsZW1lbnQgKGRlZmF1bHRpbmcgdG8gYGRvY3VtZW50YCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gKiAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yYC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBbY29udGV4dD1kb2N1bWVudF1cbiAqICAgICAgICBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBxdWVyeS4gQ2FuIGFsc28gYmUgYSBzZWxlY3RvclxuICogICAgICAgIHN0cmluZyBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IHdpbGwgYmUgdXNlZFxuICogICAgICAgIGFzIGNvbnRleHQuIElmIG1pc3NpbmcgKG9yIG5vIGVsZW1lbnQgbWF0Y2hlcyBzZWxlY3RvciksIGZhbGxzXG4gKiAgICAgICAgYmFjayB0byBgZG9jdW1lbnRgLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgZm91bmQgb3IgbnVsbC5cbiAqL1xudmFyICQgPSBjcmVhdGVRdWVyaWVyKCdxdWVyeVNlbGVjdG9yJyk7XG5cbi8qKlxuICogRmluZHMgYSBhbGwgRE9NIGVsZW1lbnRzIG1hdGNoaW5nIGBzZWxlY3RvcmAgd2l0aGluIHRoZSBvcHRpb25hbFxuICogYGNvbnRleHRgIG9mIGFub3RoZXIgRE9NIGVsZW1lbnQgKGRlZmF1bHRpbmcgdG8gYGRvY3VtZW50YCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gKiAgICAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yQWxsYC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBbY29udGV4dD1kb2N1bWVudF1cbiAqICAgICAgICAgICBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBxdWVyeS4gQ2FuIGFsc28gYmUgYSBzZWxlY3RvclxuICogICAgICAgICAgIHN0cmluZyBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IHdpbGwgYmUgdXNlZFxuICogICAgICAgICAgIGFzIGNvbnRleHQuIElmIG1pc3NpbmcgKG9yIG5vIGVsZW1lbnQgbWF0Y2hlcyBzZWxlY3RvciksIGZhbGxzXG4gKiAgICAgICAgICAgYmFjayB0byBgZG9jdW1lbnRgLlxuICpcbiAqIEByZXR1cm4ge05vZGVMaXN0fVxuICogICAgICAgICBBIGVsZW1lbnQgbGlzdCBvZiBlbGVtZW50cyB0aGF0IHdlcmUgZm91bmQuIFdpbGwgYmUgZW1wdHkgaWYgbm9uZSB3ZXJlIGZvdW5kLlxuICpcbiAqL1xudmFyICQkID0gY3JlYXRlUXVlcmllcigncXVlcnlTZWxlY3RvckFsbCcpO1xuXG5cblxudmFyIERvbSA9IChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkoe1xuXHRpc1JlYWw6IGlzUmVhbCxcblx0aXNFbDogaXNFbCxcblx0aXNJbkZyYW1lOiBpc0luRnJhbWUsXG5cdGNyZWF0ZUVsOiBjcmVhdGVFbCxcblx0dGV4dENvbnRlbnQ6IHRleHRDb250ZW50LFxuXHRwcmVwZW5kVG86IHByZXBlbmRUbyxcblx0aGFzQ2xhc3M6IGhhc0NsYXNzLFxuXHRhZGRDbGFzczogYWRkQ2xhc3MsXG5cdHJlbW92ZUNsYXNzOiByZW1vdmVDbGFzcyxcblx0dG9nZ2xlQ2xhc3M6IHRvZ2dsZUNsYXNzLFxuXHRzZXRBdHRyaWJ1dGVzOiBzZXRBdHRyaWJ1dGVzLFxuXHRnZXRBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzLFxuXHRnZXRBdHRyaWJ1dGU6IGdldEF0dHJpYnV0ZSxcblx0c2V0QXR0cmlidXRlOiBzZXRBdHRyaWJ1dGUsXG5cdHJlbW92ZUF0dHJpYnV0ZTogcmVtb3ZlQXR0cmlidXRlLFxuXHRibG9ja1RleHRTZWxlY3Rpb246IGJsb2NrVGV4dFNlbGVjdGlvbixcblx0dW5ibG9ja1RleHRTZWxlY3Rpb246IHVuYmxvY2tUZXh0U2VsZWN0aW9uLFxuXHRnZXRCb3VuZGluZ0NsaWVudFJlY3Q6IGdldEJvdW5kaW5nQ2xpZW50UmVjdCxcblx0ZmluZFBvc2l0aW9uOiBmaW5kUG9zaXRpb24sXG5cdGdldFBvaW50ZXJQb3NpdGlvbjogZ2V0UG9pbnRlclBvc2l0aW9uLFxuXHRpc1RleHROb2RlOiBpc1RleHROb2RlLFxuXHRlbXB0eUVsOiBlbXB0eUVsLFxuXHRub3JtYWxpemVDb250ZW50OiBub3JtYWxpemVDb250ZW50LFxuXHRhcHBlbmRDb250ZW50OiBhcHBlbmRDb250ZW50LFxuXHRpbnNlcnRDb250ZW50OiBpbnNlcnRDb250ZW50LFxuXHRpc1NpbmdsZUxlZnRDbGljazogaXNTaW5nbGVMZWZ0Q2xpY2ssXG5cdCQ6ICQsXG5cdCQkOiAkJFxufSk7XG5cbi8qKlxuICogQGZpbGUgZ3VpZC5qc1xuICogQG1vZHVsZSBndWlkXG4gKi9cblxuLyoqXG4gKiBVbmlxdWUgSUQgZm9yIGFuIGVsZW1lbnQgb3IgZnVuY3Rpb25cbiAqIEB0eXBlIHtOdW1iZXJ9XG4gKi9cbnZhciBfZ3VpZCA9IDE7XG5cbi8qKlxuICogR2V0IGEgdW5pcXVlIGF1dG8taW5jcmVtZW50aW5nIElEIGJ5IG51bWJlciB0aGF0IGhhcyBub3QgYmVlbiByZXR1cm5lZCBiZWZvcmUuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBBIG5ldyB1bmlxdWUgSUQuXG4gKi9cbmZ1bmN0aW9uIG5ld0dVSUQoKSB7XG4gIHJldHVybiBfZ3VpZCsrO1xufVxuXG4vKipcbiAqIEBmaWxlIGRvbS1kYXRhLmpzXG4gKiBAbW9kdWxlIGRvbS1kYXRhXG4gKi9cbi8qKlxuICogRWxlbWVudCBEYXRhIFN0b3JlLlxuICpcbiAqIEFsbG93cyBmb3IgYmluZGluZyBkYXRhIHRvIGFuIGVsZW1lbnQgd2l0aG91dCBwdXR0aW5nIGl0IGRpcmVjdGx5IG9uIHRoZVxuICogZWxlbWVudC4gRXguIEV2ZW50IGxpc3RlbmVycyBhcmUgc3RvcmVkIGhlcmUuXG4gKiAoYWxzbyBmcm9tIGpzbmluamEuY29tLCBzbGlnaHRseSBtb2RpZmllZCBhbmQgdXBkYXRlZCBmb3IgY2xvc3VyZSBjb21waWxlcilcbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByaXZhdGVcbiAqL1xudmFyIGVsRGF0YSA9IHt9O1xuXG4vKlxuICogVW5pcXVlIGF0dHJpYnV0ZSBuYW1lIHRvIHN0b3JlIGFuIGVsZW1lbnQncyBndWlkIGluXG4gKlxuICogQHR5cGUge1N0cmluZ31cbiAqIEBjb25zdGFudFxuICogQHByaXZhdGVcbiAqL1xudmFyIGVsSWRBdHRyID0gJ3ZkYXRhJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhY2hlIG9iamVjdCB3aGVyZSBkYXRhIGZvciBhbiBlbGVtZW50IGlzIHN0b3JlZFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqICAgICAgICBFbGVtZW50IHRvIHN0b3JlIGRhdGEgZm9yLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqICAgICAgICAgVGhlIGNhY2hlIG9iamVjdCBmb3IgdGhhdCBlbCB0aGF0IHdhcyBwYXNzZWQgaW4uXG4gKi9cbmZ1bmN0aW9uIGdldERhdGEoZWwpIHtcbiAgdmFyIGlkID0gZWxbZWxJZEF0dHJdO1xuXG4gIGlmICghaWQpIHtcbiAgICBpZCA9IGVsW2VsSWRBdHRyXSA9IG5ld0dVSUQoKTtcbiAgfVxuXG4gIGlmICghZWxEYXRhW2lkXSkge1xuICAgIGVsRGF0YVtpZF0gPSB7fTtcbiAgfVxuXG4gIHJldHVybiBlbERhdGFbaWRdO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBoYXMgY2FjaGVkIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgQ2hlY2sgaWYgdGhpcyBlbGVtZW50IGhhcyBjYWNoZWQgZGF0YS5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRydWUgaWYgdGhlIERPTSBlbGVtZW50IGhhcyBjYWNoZWQgZGF0YS5cbiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIGhhc0RhdGEoZWwpIHtcbiAgdmFyIGlkID0gZWxbZWxJZEF0dHJdO1xuXG4gIGlmICghaWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gISFPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlbERhdGFbaWRdKS5sZW5ndGg7XG59XG5cbi8qKlxuICogRGVsZXRlIGRhdGEgZm9yIHRoZSBlbGVtZW50IGZyb20gdGhlIGNhY2hlIGFuZCB0aGUgZ3VpZCBhdHRyIGZyb20gZ2V0RWxlbWVudEJ5SWRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgUmVtb3ZlIGNhY2hlZCBkYXRhIGZvciB0aGlzIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZURhdGEoZWwpIHtcbiAgdmFyIGlkID0gZWxbZWxJZEF0dHJdO1xuXG4gIGlmICghaWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIHN0b3JlZCBkYXRhXG4gIGRlbGV0ZSBlbERhdGFbaWRdO1xuXG4gIC8vIFJlbW92ZSB0aGUgZWxJZEF0dHIgcHJvcGVydHkgZnJvbSB0aGUgRE9NIG5vZGVcbiAgdHJ5IHtcbiAgICBkZWxldGUgZWxbZWxJZEF0dHJdO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGVsLnJlbW92ZUF0dHJpYnV0ZSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGVsSWRBdHRyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSUUgZG9lc24ndCBhcHBlYXIgdG8gc3VwcG9ydCByZW1vdmVBdHRyaWJ1dGUgb24gdGhlIGRvY3VtZW50IGVsZW1lbnRcbiAgICAgIGVsW2VsSWRBdHRyXSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGZpbGUgZXZlbnRzLmpzLiBBbiBFdmVudCBTeXN0ZW0gKEpvaG4gUmVzaWcgLSBTZWNyZXRzIG9mIGEgSlMgTmluamEgaHR0cDovL2pzbmluamEuY29tLylcbiAqIChPcmlnaW5hbCBib29rIHZlcnNpb24gd2Fzbid0IGNvbXBsZXRlbHkgdXNhYmxlLCBzbyBmaXhlZCBzb21lIHRoaW5ncyBhbmQgbWFkZSBDbG9zdXJlIENvbXBpbGVyIGNvbXBhdGlibGUpXG4gKiBUaGlzIHNob3VsZCB3b3JrIHZlcnkgc2ltaWxhcmx5IHRvIGpRdWVyeSdzIGV2ZW50cywgaG93ZXZlciBpdCdzIGJhc2VkIG9mZiB0aGUgYm9vayB2ZXJzaW9uIHdoaWNoIGlzbid0IGFzXG4gKiByb2J1c3QgYXMganF1ZXJ5J3MsIHNvIHRoZXJlJ3MgcHJvYmFibHkgc29tZSBkaWZmZXJlbmNlcy5cbiAqXG4gKiBAbW9kdWxlIGV2ZW50c1xuICovXG5cbi8qKlxuICogQ2xlYW4gdXAgdGhlIGxpc3RlbmVyIGNhY2hlIGFuZCBkaXNwYXRjaGVyc1xuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW1cbiAqICAgICAgICBFbGVtZW50IHRvIGNsZWFuIHVwXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICBUeXBlIG9mIGV2ZW50IHRvIGNsZWFuIHVwXG4gKi9cbmZ1bmN0aW9uIF9jbGVhblVwRXZlbnRzKGVsZW0sIHR5cGUpIHtcbiAgdmFyIGRhdGEgPSBnZXREYXRhKGVsZW0pO1xuXG4gIC8vIFJlbW92ZSB0aGUgZXZlbnRzIG9mIGEgcGFydGljdWxhciB0eXBlIGlmIHRoZXJlIGFyZSBub25lIGxlZnRcbiAgaWYgKGRhdGEuaGFuZGxlcnNbdHlwZV0ubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGRhdGEuaGFuZGxlcnNbdHlwZV07XG4gICAgLy8gZGF0YS5oYW5kbGVyc1t0eXBlXSA9IG51bGw7XG4gICAgLy8gU2V0dGluZyB0byBudWxsIHdhcyBjYXVzaW5nIGFuIGVycm9yIHdpdGggZGF0YS5oYW5kbGVyc1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBtZXRhLWhhbmRsZXIgZnJvbSB0aGUgZWxlbWVudFxuICAgIGlmIChlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBkYXRhLmRpc3BhdGNoZXIsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGVsZW0uZGV0YWNoRXZlbnQpIHtcbiAgICAgIGVsZW0uZGV0YWNoRXZlbnQoJ29uJyArIHR5cGUsIGRhdGEuZGlzcGF0Y2hlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlIHRoZSBldmVudHMgb2JqZWN0IGlmIHRoZXJlIGFyZSBubyB0eXBlcyBsZWZ0XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhLmhhbmRsZXJzKS5sZW5ndGggPD0gMCkge1xuICAgIGRlbGV0ZSBkYXRhLmhhbmRsZXJzO1xuICAgIGRlbGV0ZSBkYXRhLmRpc3BhdGNoZXI7XG4gICAgZGVsZXRlIGRhdGEuZGlzYWJsZWQ7XG4gIH1cblxuICAvLyBGaW5hbGx5IHJlbW92ZSB0aGUgZWxlbWVudCBkYXRhIGlmIHRoZXJlIGlzIG5vIGRhdGEgbGVmdFxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVtb3ZlRGF0YShlbGVtKTtcbiAgfVxufVxuXG4vKipcbiAqIExvb3BzIHRocm91Z2ggYW4gYXJyYXkgb2YgZXZlbnQgdHlwZXMgYW5kIGNhbGxzIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIGZvciBlYWNoIHR5cGUuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqICAgICAgICBUaGUgZXZlbnQgbWV0aG9kIHdlIHdhbnQgdG8gdXNlLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW1cbiAqICAgICAgICBFbGVtZW50IG9yIG9iamVjdCB0byBiaW5kIGxpc3RlbmVycyB0b1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiAgICAgICAgVHlwZSBvZiBldmVudCB0byBiaW5kIHRvLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnRMaXN0ZW5lcn0gY2FsbGJhY2tcbiAqICAgICAgICBFdmVudCBsaXN0ZW5lci5cbiAqL1xuZnVuY3Rpb24gX2hhbmRsZU11bHRpcGxlRXZlbnRzKGZuLCBlbGVtLCB0eXBlcywgY2FsbGJhY2spIHtcbiAgdHlwZXMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIC8vIENhbGwgdGhlIGV2ZW50IG1ldGhvZCBmb3IgZWFjaCBvbmUgb2YgdGhlIHR5cGVzXG4gICAgZm4oZWxlbSwgdHlwZSwgY2FsbGJhY2spO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGaXggYSBuYXRpdmUgZXZlbnQgdG8gaGF2ZSBzdGFuZGFyZCBwcm9wZXJ0eSB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAqICAgICAgICBFdmVudCBvYmplY3QgdG8gZml4LlxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqICAgICAgICAgRml4ZWQgZXZlbnQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmaXhFdmVudChldmVudCkge1xuXG4gIGZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUZXN0IGlmIGZpeGluZyB1cCBpcyBuZWVkZWRcbiAgLy8gVXNlZCB0byBjaGVjayBpZiAhZXZlbnQuc3RvcFByb3BhZ2F0aW9uIGluc3RlYWQgb2YgaXNQcm9wYWdhdGlvblN0b3BwZWRcbiAgLy8gQnV0IG5hdGl2ZSBldmVudHMgcmV0dXJuIHRydWUgZm9yIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGRvbid0IGhhdmVcbiAgLy8gb3RoZXIgZXhwZWN0ZWQgbWV0aG9kcyBsaWtlIGlzUHJvcGFnYXRpb25TdG9wcGVkLiBTZWVtcyB0byBiZSBhIHByb2JsZW1cbiAgLy8gd2l0aCB0aGUgSmF2YXNjcmlwdCBOaW5qYSBjb2RlLiBTbyB3ZSdyZSBqdXN0IG92ZXJyaWRpbmcgYWxsIGV2ZW50cyBub3cuXG4gIGlmICghZXZlbnQgfHwgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKSB7XG4gICAgdmFyIG9sZCA9IGV2ZW50IHx8IHdpbmRvdy5ldmVudDtcblxuICAgIGV2ZW50ID0ge307XG4gICAgLy8gQ2xvbmUgdGhlIG9sZCBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gbW9kaWZ5IHRoZSB2YWx1ZXMgZXZlbnQgPSB7fTtcbiAgICAvLyBJRTggRG9lc24ndCBsaWtlIHdoZW4geW91IG1lc3Mgd2l0aCBuYXRpdmUgZXZlbnQgcHJvcGVydGllc1xuICAgIC8vIEZpcmVmb3ggcmV0dXJucyBmYWxzZSBmb3IgZXZlbnQuaGFzT3duUHJvcGVydHkoJ3R5cGUnKSBhbmQgb3RoZXIgcHJvcHNcbiAgICAvLyAgd2hpY2ggbWFrZXMgY29weWluZyBtb3JlIGRpZmZpY3VsdC5cbiAgICAvLyBUT0RPOiBQcm9iYWJseSBiZXN0IHRvIGNyZWF0ZSBhIHdoaXRlbGlzdCBvZiBldmVudCBwcm9wc1xuICAgIGZvciAodmFyIGtleSBpbiBvbGQpIHtcbiAgICAgIC8vIFNhZmFyaSA2LjAuMyB3YXJucyB5b3UgaWYgeW91IHRyeSB0byBjb3B5IGRlcHJlY2F0ZWQgbGF5ZXJYL1lcbiAgICAgIC8vIENocm9tZSB3YXJucyB5b3UgaWYgeW91IHRyeSB0byBjb3B5IGRlcHJlY2F0ZWQga2V5Ym9hcmRFdmVudC5rZXlMb2NhdGlvblxuICAgICAgLy8gYW5kIHdlYmtpdE1vdmVtZW50WC9ZXG4gICAgICBpZiAoa2V5ICE9PSAnbGF5ZXJYJyAmJiBrZXkgIT09ICdsYXllclknICYmIGtleSAhPT0gJ2tleUxvY2F0aW9uJyAmJiBrZXkgIT09ICd3ZWJraXRNb3ZlbWVudFgnICYmIGtleSAhPT0gJ3dlYmtpdE1vdmVtZW50WScpIHtcbiAgICAgICAgLy8gQ2hyb21lIDMyKyB3YXJucyBpZiB5b3UgdHJ5IHRvIGNvcHkgZGVwcmVjYXRlZCByZXR1cm5WYWx1ZSwgYnV0XG4gICAgICAgIC8vIHdlIHN0aWxsIHdhbnQgdG8gaWYgcHJldmVudERlZmF1bHQgaXNuJ3Qgc3VwcG9ydGVkIChJRTgpLlxuICAgICAgICBpZiAoIShrZXkgPT09ICdyZXR1cm5WYWx1ZScgJiYgb2xkLnByZXZlbnREZWZhdWx0KSkge1xuICAgICAgICAgIGV2ZW50W2tleV0gPSBvbGRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBldmVudCBvY2N1cnJlZCBvbiB0aGlzIGVsZW1lbnRcbiAgICBpZiAoIWV2ZW50LnRhcmdldCkge1xuICAgICAgZXZlbnQudGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgd2hpY2ggb3RoZXIgZWxlbWVudCB0aGUgZXZlbnQgaXMgcmVsYXRlZCB0b1xuICAgIGlmICghZXZlbnQucmVsYXRlZFRhcmdldCkge1xuICAgICAgZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBTdG9wIHRoZSBkZWZhdWx0IGJyb3dzZXIgYWN0aW9uXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob2xkLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIG9sZC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIG9sZC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcblxuICAgIC8vIFN0b3AgdGhlIGV2ZW50IGZyb20gYnViYmxpbmdcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob2xkLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBvbGQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgb2xkLmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgfTtcblxuICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuRmFsc2U7XG5cbiAgICAvLyBTdG9wIHRoZSBldmVudCBmcm9tIGJ1YmJsaW5nIGFuZCBleGVjdXRpbmcgb3RoZXIgaGFuZGxlcnNcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob2xkLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikge1xuICAgICAgICBvbGQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5GYWxzZTtcblxuICAgIC8vIEhhbmRsZSBtb3VzZSBwb3NpdGlvblxuICAgIGlmIChldmVudC5jbGllbnRYICE9PSBudWxsICYmIGV2ZW50LmNsaWVudFggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcblxuICAgICAgZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7XG4gICAgICBldmVudC5wYWdlWSA9IGV2ZW50LmNsaWVudFkgKyAoZG9jICYmIGRvYy5zY3JvbGxUb3AgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudFRvcCB8fCBib2R5ICYmIGJvZHkuY2xpZW50VG9wIHx8IDApO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBrZXkgcHJlc3Nlc1xuICAgIGV2ZW50LndoaWNoID0gZXZlbnQuY2hhckNvZGUgfHwgZXZlbnQua2V5Q29kZTtcblxuICAgIC8vIEZpeCBidXR0b24gZm9yIG1vdXNlIGNsaWNrczpcbiAgICAvLyAwID09IGxlZnQ7IDEgPT0gbWlkZGxlOyAyID09IHJpZ2h0XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gbnVsbCAmJiBldmVudC5idXR0b24gIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIGRpc2FibGVkIGJlY2F1c2UgaXQgZG9lcyBub3QgcGFzcyB2aWRlb2pzLXN0YW5kYXJkXG4gICAgICAvLyBhbmQuLi4geWlrZXMuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgICAgZXZlbnQuYnV0dG9uID0gZXZlbnQuYnV0dG9uICYgMSA/IDAgOiBldmVudC5idXR0b24gJiA0ID8gMSA6IGV2ZW50LmJ1dHRvbiAmIDIgPyAyIDogMDtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGZpeGVkLXVwIGluc3RhbmNlXG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXJzIGFyZSBzdXBwb3J0ZWRcbiAqL1xudmFyIF9zdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgX3N1cHBvcnRzUGFzc2l2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIG9wdHMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBkaXNyZWdhcmRcbiAgfVxufSkoKTtcblxuLyoqXG4gKiBUb3VjaCBldmVudHMgQ2hyb21lIGV4cGVjdHMgdG8gYmUgcGFzc2l2ZVxuICovXG52YXIgcGFzc2l2ZUV2ZW50cyA9IFsndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnXTtcblxuLyoqXG4gKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gZWxlbWVudFxuICogSXQgc3RvcmVzIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGluIGEgc2VwYXJhdGUgY2FjaGUgb2JqZWN0XG4gKiBhbmQgYWRkcyBhIGdlbmVyaWMgaGFuZGxlciB0byB0aGUgZWxlbWVudCdzIGV2ZW50LFxuICogYWxvbmcgd2l0aCBhIHVuaXF1ZSBpZCAoZ3VpZCkgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbVxuICogICAgICAgIEVsZW1lbnQgb3Igb2JqZWN0IHRvIGJpbmQgbGlzdGVuZXJzIHRvXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHR5cGVcbiAqICAgICAgICBUeXBlIG9mIGV2ZW50IHRvIGJpbmQgdG8uXG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudExpc3RlbmVyfSBmblxuICogICAgICAgIEV2ZW50IGxpc3RlbmVyLlxuICovXG5mdW5jdGlvbiBvbihlbGVtLCB0eXBlLCBmbikge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgIHJldHVybiBfaGFuZGxlTXVsdGlwbGVFdmVudHMob24sIGVsZW0sIHR5cGUsIGZuKTtcbiAgfVxuXG4gIHZhciBkYXRhID0gZ2V0RGF0YShlbGVtKTtcblxuICAvLyBXZSBuZWVkIGEgcGxhY2UgdG8gc3RvcmUgYWxsIG91ciBoYW5kbGVyIGRhdGFcbiAgaWYgKCFkYXRhLmhhbmRsZXJzKSB7XG4gICAgZGF0YS5oYW5kbGVycyA9IHt9O1xuICB9XG5cbiAgaWYgKCFkYXRhLmhhbmRsZXJzW3R5cGVdKSB7XG4gICAgZGF0YS5oYW5kbGVyc1t0eXBlXSA9IFtdO1xuICB9XG5cbiAgaWYgKCFmbi5ndWlkKSB7XG4gICAgZm4uZ3VpZCA9IG5ld0dVSUQoKTtcbiAgfVxuXG4gIGRhdGEuaGFuZGxlcnNbdHlwZV0ucHVzaChmbik7XG5cbiAgaWYgKCFkYXRhLmRpc3BhdGNoZXIpIHtcbiAgICBkYXRhLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBkYXRhLmRpc3BhdGNoZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGhhc2gpIHtcblxuICAgICAgaWYgKGRhdGEuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudCA9IGZpeEV2ZW50KGV2ZW50KTtcblxuICAgICAgdmFyIGhhbmRsZXJzID0gZGF0YS5oYW5kbGVyc1tldmVudC50eXBlXTtcblxuICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgIC8vIENvcHkgaGFuZGxlcnMgc28gaWYgaGFuZGxlcnMgYXJlIGFkZGVkL3JlbW92ZWQgZHVyaW5nIHRoZSBwcm9jZXNzIGl0IGRvZXNuJ3QgdGhyb3cgZXZlcnl0aGluZyBvZmYuXG4gICAgICAgIHZhciBoYW5kbGVyc0NvcHkgPSBoYW5kbGVycy5zbGljZSgwKTtcblxuICAgICAgICBmb3IgKHZhciBtID0gMCwgbiA9IGhhbmRsZXJzQ29weS5sZW5ndGg7IG0gPCBuOyBtKyspIHtcbiAgICAgICAgICBpZiAoZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGhhbmRsZXJzQ29weVttXS5jYWxsKGVsZW0sIGV2ZW50LCBoYXNoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgbG9nJDEuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmhhbmRsZXJzW3R5cGVdLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmIChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHZhciBvcHRpb25zID0gZmFsc2U7XG5cbiAgICAgIGlmIChfc3VwcG9ydHNQYXNzaXZlICYmIHBhc3NpdmVFdmVudHMuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBkYXRhLmRpc3BhdGNoZXIsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkge1xuICAgICAgZWxlbS5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgZGF0YS5kaXNwYXRjaGVyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50IGxpc3RlbmVycyBmcm9tIGFuIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtXG4gKiAgICAgICAgT2JqZWN0IHRvIHJlbW92ZSBsaXN0ZW5lcnMgZnJvbS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3R5cGVdXG4gKiAgICAgICAgVHlwZSBvZiBsaXN0ZW5lciB0byByZW1vdmUuIERvbid0IGluY2x1ZGUgdG8gcmVtb3ZlIGFsbCBldmVudHMgZnJvbSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnRMaXN0ZW5lcn0gW2ZuXVxuICogICAgICAgIFNwZWNpZmljIGxpc3RlbmVyIHRvIHJlbW92ZS4gRG9uJ3QgaW5jbHVkZSB0byByZW1vdmUgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICogICAgICAgIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIG9mZihlbGVtLCB0eXBlLCBmbikge1xuICAvLyBEb24ndCB3YW50IHRvIGFkZCBhIGNhY2hlIG9iamVjdCB0aHJvdWdoIGdldEVsRGF0YSBpZiBub3QgbmVlZGVkXG4gIGlmICghaGFzRGF0YShlbGVtKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkYXRhID0gZ2V0RGF0YShlbGVtKTtcblxuICAvLyBJZiBubyBldmVudHMgZXhpc3QsIG5vdGhpbmcgdG8gdW5iaW5kXG4gIGlmICghZGF0YS5oYW5kbGVycykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIF9oYW5kbGVNdWx0aXBsZUV2ZW50cyhvZmYsIGVsZW0sIHR5cGUsIGZuKTtcbiAgfVxuXG4gIC8vIFV0aWxpdHkgZnVuY3Rpb25cbiAgdmFyIHJlbW92ZVR5cGUgPSBmdW5jdGlvbiByZW1vdmVUeXBlKGVsLCB0KSB7XG4gICAgZGF0YS5oYW5kbGVyc1t0XSA9IFtdO1xuICAgIF9jbGVhblVwRXZlbnRzKGVsLCB0KTtcbiAgfTtcblxuICAvLyBBcmUgd2UgcmVtb3ZpbmcgYWxsIGJvdW5kIGV2ZW50cz9cbiAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAodmFyIHQgaW4gZGF0YS5oYW5kbGVycykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLmhhbmRsZXJzIHx8IHt9LCB0KSkge1xuICAgICAgICByZW1vdmVUeXBlKGVsZW0sIHQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaGFuZGxlcnMgPSBkYXRhLmhhbmRsZXJzW3R5cGVdO1xuXG4gIC8vIElmIG5vIGhhbmRsZXJzIGV4aXN0LCBub3RoaW5nIHRvIHVuYmluZFxuICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgbm8gbGlzdGVuZXIgd2FzIHByb3ZpZGVkLCByZW1vdmUgYWxsIGxpc3RlbmVycyBmb3IgdHlwZVxuICBpZiAoIWZuKSB7XG4gICAgcmVtb3ZlVHlwZShlbGVtLCB0eXBlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXZSdyZSBvbmx5IHJlbW92aW5nIGEgc2luZ2xlIGhhbmRsZXJcbiAgaWYgKGZuLmd1aWQpIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IGhhbmRsZXJzLmxlbmd0aDsgbisrKSB7XG4gICAgICBpZiAoaGFuZGxlcnNbbl0uZ3VpZCA9PT0gZm4uZ3VpZCkge1xuICAgICAgICBoYW5kbGVycy5zcGxpY2Uobi0tLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfY2xlYW5VcEV2ZW50cyhlbGVtLCB0eXBlKTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGFuIGV2ZW50IGZvciBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbVxuICogICAgICAgIEVsZW1lbnQgdG8gdHJpZ2dlciBhbiBldmVudCBvblxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR8c3RyaW5nfSBldmVudFxuICogICAgICAgIEEgc3RyaW5nICh0aGUgdHlwZSkgb3IgYW4gZXZlbnQgb2JqZWN0IHdpdGggYSB0eXBlIGF0dHJpYnV0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbaGFzaF1cbiAqICAgICAgICBkYXRhIGhhc2ggdG8gcGFzcyBhbG9uZyB3aXRoIHRoZSBldmVudFxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfVxuICogICAgICAgICAtIFJldHVybnMgdGhlIG9wcG9zaXRlIG9mIGBkZWZhdWx0UHJldmVudGVkYCBpZiBkZWZhdWx0IHdhcyBwcmV2ZW50ZWRcbiAqICAgICAgICAgLSBPdGhlcndpc2UgcmV0dXJucyB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gdHJpZ2dlcihlbGVtLCBldmVudCwgaGFzaCkge1xuICAvLyBGZXRjaGVzIGVsZW1lbnQgZGF0YSBhbmQgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCAoZm9yIGJ1YmJsaW5nKS5cbiAgLy8gRG9uJ3Qgd2FudCB0byBhZGQgYSBkYXRhIG9iamVjdCB0byBjYWNoZSBmb3IgZXZlcnkgcGFyZW50LFxuICAvLyBzbyBjaGVja2luZyBoYXNFbERhdGEgZmlyc3QuXG4gIHZhciBlbGVtRGF0YSA9IGhhc0RhdGEoZWxlbSkgPyBnZXREYXRhKGVsZW0pIDoge307XG4gIHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25lckRvY3VtZW50O1xuICAvLyB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudCxcbiAgLy8gaGFuZGxlcjtcblxuICAvLyBJZiBhbiBldmVudCBuYW1lIHdhcyBwYXNzZWQgYXMgYSBzdHJpbmcsIGNyZWF0ZXMgYW4gZXZlbnQgb3V0IG9mIGl0XG4gIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgZXZlbnQgPSB7IHR5cGU6IGV2ZW50LCB0YXJnZXQ6IGVsZW0gfTtcbiAgfSBlbHNlIGlmICghZXZlbnQudGFyZ2V0KSB7XG4gICAgZXZlbnQudGFyZ2V0ID0gZWxlbTtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZXMgdGhlIGV2ZW50IHByb3BlcnRpZXMuXG4gIGV2ZW50ID0gZml4RXZlbnQoZXZlbnQpO1xuXG4gIC8vIElmIHRoZSBwYXNzZWQgZWxlbWVudCBoYXMgYSBkaXNwYXRjaGVyLCBleGVjdXRlcyB0aGUgZXN0YWJsaXNoZWQgaGFuZGxlcnMuXG4gIGlmIChlbGVtRGF0YS5kaXNwYXRjaGVyKSB7XG4gICAgZWxlbURhdGEuZGlzcGF0Y2hlci5jYWxsKGVsZW0sIGV2ZW50LCBoYXNoKTtcbiAgfVxuXG4gIC8vIFVubGVzcyBleHBsaWNpdGx5IHN0b3BwZWQgb3IgdGhlIGV2ZW50IGRvZXMgbm90IGJ1YmJsZSAoZS5nLiBtZWRpYSBldmVudHMpXG4gIC8vIHJlY3Vyc2l2ZWx5IGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gYnViYmxlIHRoZSBldmVudCB1cCB0aGUgRE9NLlxuICBpZiAocGFyZW50ICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICYmIGV2ZW50LmJ1YmJsZXMgPT09IHRydWUpIHtcbiAgICB0cmlnZ2VyLmNhbGwobnVsbCwgcGFyZW50LCBldmVudCwgaGFzaCk7XG5cbiAgICAvLyBJZiBhdCB0aGUgdG9wIG9mIHRoZSBET00sIHRyaWdnZXJzIHRoZSBkZWZhdWx0IGFjdGlvbiB1bmxlc3MgZGlzYWJsZWQuXG4gIH0gZWxzZSBpZiAoIXBhcmVudCAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgIHZhciB0YXJnZXREYXRhID0gZ2V0RGF0YShldmVudC50YXJnZXQpO1xuXG4gICAgLy8gQ2hlY2tzIGlmIHRoZSB0YXJnZXQgaGFzIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnRhcmdldFtldmVudC50eXBlXSkge1xuICAgICAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgZXZlbnQgZGlzcGF0Y2hpbmcgb24gdGhlIHRhcmdldCBhcyB3ZSBoYXZlIGFscmVhZHkgZXhlY3V0ZWQgdGhlIGhhbmRsZXIuXG4gICAgICB0YXJnZXREYXRhLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIC8vIEV4ZWN1dGVzIHRoZSBkZWZhdWx0IGFjdGlvbi5cbiAgICAgIGlmICh0eXBlb2YgZXZlbnQudGFyZ2V0W2V2ZW50LnR5cGVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGV2ZW50LnRhcmdldFtldmVudC50eXBlXSgpO1xuICAgICAgfVxuICAgICAgLy8gUmUtZW5hYmxlcyBldmVudCBkaXNwYXRjaGluZy5cbiAgICAgIHRhcmdldERhdGEuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBJbmZvcm0gdGhlIHRyaWdnZXJlciBpZiB0aGUgZGVmYXVsdCB3YXMgcHJldmVudGVkIGJ5IHJldHVybmluZyBmYWxzZVxuICByZXR1cm4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG59XG5cbi8qKlxuICogVHJpZ2dlciBhIGxpc3RlbmVyIG9ubHkgb25jZSBmb3IgYW4gZXZlbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtXG4gKiAgICAgICAgRWxlbWVudCBvciBvYmplY3QgdG8gYmluZCB0by5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gdHlwZVxuICogICAgICAgIE5hbWUvdHlwZSBvZiBldmVudFxuICpcbiAqIEBwYXJhbSB7RXZlbnR+RXZlbnRMaXN0ZW5lcn0gZm5cbiAqICAgICAgICBFdmVudCBMaXN0ZW5lciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBvbmUoZWxlbSwgdHlwZSwgZm4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICByZXR1cm4gX2hhbmRsZU11bHRpcGxlRXZlbnRzKG9uZSwgZWxlbSwgdHlwZSwgZm4pO1xuICB9XG4gIHZhciBmdW5jID0gZnVuY3Rpb24gZnVuYygpIHtcbiAgICBvZmYoZWxlbSwgdHlwZSwgZnVuYyk7XG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcblxuICAvLyBjb3B5IHRoZSBndWlkIHRvIHRoZSBuZXcgZnVuY3Rpb24gc28gaXQgY2FuIHJlbW92ZWQgdXNpbmcgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uJ3MgSURcbiAgZnVuYy5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgbmV3R1VJRCgpO1xuICBvbihlbGVtLCB0eXBlLCBmdW5jKTtcbn1cblxudmFyIEV2ZW50cyA9IChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkoe1xuXHRmaXhFdmVudDogZml4RXZlbnQsXG5cdG9uOiBvbixcblx0b2ZmOiBvZmYsXG5cdHRyaWdnZXI6IHRyaWdnZXIsXG5cdG9uZTogb25lXG59KTtcblxuLyoqXG4gKiBAZmlsZSBzZXR1cC5qcyAtIEZ1bmN0aW9ucyBmb3Igc2V0dGluZyB1cCBhIHBsYXllciB3aXRob3V0XG4gKiB1c2VyIGludGVyYWN0aW9uIGJhc2VkIG9uIHRoZSBkYXRhLXNldHVwIGBhdHRyaWJ1dGVgIG9mIHRoZSB2aWRlbyB0YWcuXG4gKlxuICogQG1vZHVsZSBzZXR1cFxuICovXG52YXIgX3dpbmRvd0xvYWRlZCA9IGZhbHNlO1xudmFyIHZpZGVvanMkMiA9IHZvaWQgMDtcblxuLyoqXG4gKiBTZXQgdXAgYW55IHRhZ3MgdGhhdCBoYXZlIGEgZGF0YS1zZXR1cCBgYXR0cmlidXRlYCB3aGVuIHRoZSBwbGF5ZXIgaXMgc3RhcnRlZC5cbiAqL1xudmFyIGF1dG9TZXR1cCA9IGZ1bmN0aW9uIGF1dG9TZXR1cCgpIHtcblxuICAvLyBQcm90ZWN0IGFnYWluc3QgYnJlYWthZ2UgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzIGFuZCBjaGVjayBnbG9iYWwgYXV0b1NldHVwIG9wdGlvbi5cbiAgaWYgKCFpc1JlYWwoKSB8fCB2aWRlb2pzJDIub3B0aW9ucy5hdXRvU2V0dXAgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT25lIGRheSwgd2hlbiB3ZSBzdG9wIHN1cHBvcnRpbmcgSUU4LCBnbyBiYWNrIHRvIHRoaXMsIGJ1dCBpbiB0aGUgbWVhbnRpbWUuLi4qaGFjayBoYWNrIGhhY2sqXG4gIC8vIHZhciB2aWRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJykpO1xuICAvLyB2YXIgYXVkaW9zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2F1ZGlvJykpO1xuICAvLyB2YXIgbWVkaWFFbHMgPSB2aWRzLmNvbmNhdChhdWRpb3MpO1xuXG4gIC8vIEJlY2F1c2UgSUU4IGRvZXNuJ3Qgc3VwcG9ydCBjYWxsaW5nIHNsaWNlIG9uIGEgbm9kZSBsaXN0LCB3ZSBuZWVkIHRvIGxvb3BcbiAgLy8gdGhyb3VnaCBlYWNoIGxpc3Qgb2YgZWxlbWVudHMgdG8gYnVpbGQgdXAgYSBuZXcsIGNvbWJpbmVkIGxpc3Qgb2YgZWxlbWVudHMuXG4gIHZhciB2aWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7XG4gIHZhciBhdWRpb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYXVkaW8nKTtcbiAgdmFyIGRpdnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8tanMnKTtcbiAgdmFyIG1lZGlhRWxzID0gW107XG5cbiAgaWYgKHZpZHMgJiYgdmlkcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGUgPSB2aWRzLmxlbmd0aDsgaSA8IGU7IGkrKykge1xuICAgICAgbWVkaWFFbHMucHVzaCh2aWRzW2ldKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXVkaW9zICYmIGF1ZGlvcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBfZSA9IGF1ZGlvcy5sZW5ndGg7IF9pIDwgX2U7IF9pKyspIHtcbiAgICAgIG1lZGlhRWxzLnB1c2goYXVkaW9zW19pXSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRpdnMgJiYgZGl2cy5sZW5ndGggPiAwKSB7XG4gICAgZm9yICh2YXIgX2kyID0gMCwgX2UyID0gZGl2cy5sZW5ndGg7IF9pMiA8IF9lMjsgX2kyKyspIHtcbiAgICAgIG1lZGlhRWxzLnB1c2goZGl2c1tfaTJdKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiBhbnkgbWVkaWEgZWxlbWVudHMgZXhpc3RcbiAgaWYgKG1lZGlhRWxzICYmIG1lZGlhRWxzLmxlbmd0aCA+IDApIHtcblxuICAgIGZvciAodmFyIF9pMyA9IDAsIF9lMyA9IG1lZGlhRWxzLmxlbmd0aDsgX2kzIDwgX2UzOyBfaTMrKykge1xuICAgICAgdmFyIG1lZGlhRWwgPSBtZWRpYUVsc1tfaTNdO1xuXG4gICAgICAvLyBDaGVjayBpZiBlbGVtZW50IGV4aXN0cywgaGFzIGdldEF0dHJpYnV0ZSBmdW5jLlxuICAgICAgLy8gSUUgc2VlbXMgdG8gY29uc2lkZXIgdHlwZW9mIGVsLmdldEF0dHJpYnV0ZSA9PSAnb2JqZWN0JyBpbnN0ZWFkIG9mXG4gICAgICAvLyAnZnVuY3Rpb24nIGxpa2UgZXhwZWN0ZWQsIGF0IGxlYXN0IHdoZW4gbG9hZGluZyB0aGUgcGxheWVyIGltbWVkaWF0ZWx5LlxuICAgICAgaWYgKG1lZGlhRWwgJiYgbWVkaWFFbC5nZXRBdHRyaWJ1dGUpIHtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBwbGF5ZXIgaGFzbid0IGFscmVhZHkgYmVlbiBzZXQgdXAuXG4gICAgICAgIGlmIChtZWRpYUVsLnBsYXllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSBtZWRpYUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZXR1cCcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YS1zZXR1cCBhdHRyIGV4aXN0cy5cbiAgICAgICAgICAvLyBXZSBvbmx5IGF1dG8tc2V0dXAgaWYgdGhleSd2ZSBhZGRlZCB0aGUgZGF0YS1zZXR1cCBhdHRyLlxuICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpZGVvLmpzIGluc3RhbmNlLlxuICAgICAgICAgICAgdmlkZW9qcyQyKG1lZGlhRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGdldEF0dHJpYnV0ZSBpc24ndCBkZWZpbmVkLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBET00uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdXRvU2V0dXBUaW1lb3V0KDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyB2aWRlb3Mgd2VyZSBmb3VuZCwgc28ga2VlcCBsb29waW5nIHVubGVzcyBwYWdlIGlzIGZpbmlzaGVkIGxvYWRpbmcuXG4gIH0gZWxzZSBpZiAoIV93aW5kb3dMb2FkZWQpIHtcbiAgICBhdXRvU2V0dXBUaW1lb3V0KDEpO1xuICB9XG59O1xuXG4vKipcbiAqIFdhaXQgdW50aWwgdGhlIHBhZ2UgaXMgbG9hZGVkIGJlZm9yZSBydW5uaW5nIGF1dG9TZXR1cC4gVGhpcyB3aWxsIGJlIGNhbGxlZCBpblxuICogYXV0b1NldHVwIGlmIGBoYXNMb2FkZWRgIHJldHVybnMgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHdhaXRcbiAqICAgICAgICBIb3cgbG9uZyB0byB3YWl0IGluIG1zXG4gKlxuICogQHBhcmFtIHttb2R1bGU6dmlkZW9qc30gW3Zqc11cbiAqICAgICAgICBUaGUgdmlkZW9qcyBsaWJyYXJ5IGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGF1dG9TZXR1cFRpbWVvdXQod2FpdCwgdmpzKSB7XG4gIGlmICh2anMpIHtcbiAgICB2aWRlb2pzJDIgPSB2anM7XG4gIH1cblxuICB3aW5kb3cuc2V0VGltZW91dChhdXRvU2V0dXAsIHdhaXQpO1xufVxuXG5pZiAoaXNSZWFsKCkgJiYgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICBfd2luZG93TG9hZGVkID0gdHJ1ZTtcbn0gZWxzZSB7XG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIHRoZSBsb2FkIGV2ZW50IG9uIHdpbmRvdywgYW5kIHNldCBfd2luZG93TG9hZGVkIHRvIHRydWUuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGxvYWRcbiAgICovXG4gIG9uZSh3aW5kb3csICdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgIF93aW5kb3dMb2FkZWQgPSB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZmlsZSBzdHlsZXNoZWV0LmpzXG4gKiBAbW9kdWxlIHN0eWxlc2hlZXRcbiAqL1xuLyoqXG4gKiBDcmVhdGUgYSBET00gc3lsZSBlbGVtZW50IGdpdmVuIGEgY2xhc3NOYW1lIGZvciBpdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gKiAgICAgICAgVGhlIGNsYXNzTmFtZSB0byBhZGQgdG8gdGhlIGNyZWF0ZWQgc3R5bGUgZWxlbWVudC5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICovXG52YXIgY3JlYXRlU3R5bGVFbGVtZW50ID0gZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KGNsYXNzTmFtZSkge1xuICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXG4gIHN0eWxlLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcblxuICByZXR1cm4gc3R5bGU7XG59O1xuXG4vKipcbiAqIEFkZCB0ZXh0IHRvIGEgRE9NIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIFRoZSBFbGVtZW50IHRvIGFkZCB0ZXh0IGNvbnRlbnQgdG8uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAqICAgICAgICBUaGUgdGV4dCB0byBhZGQgdG8gdGhlIGVsZW1lbnQuXG4gKi9cbnZhciBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIHNldFRleHRDb250ZW50KGVsLCBjb250ZW50KSB7XG4gIGlmIChlbC5zdHlsZVNoZWV0KSB7XG4gICAgZWwuc3R5bGVTaGVldC5jc3NUZXh0ID0gY29udGVudDtcbiAgfSBlbHNlIHtcbiAgICBlbC50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gIH1cbn07XG5cbi8qKlxuICogQGZpbGUgZm4uanNcbiAqIEBtb2R1bGUgZm5cbiAqL1xuLyoqXG4gKiBCaW5kIChhLmsuYSBwcm94eSBvciBDb250ZXh0KS4gQSBzaW1wbGUgbWV0aG9kIGZvciBjaGFuZ2luZyB0aGUgY29udGV4dCBvZiBhIGZ1bmN0aW9uXG4gKiBJdCBhbHNvIHN0b3JlcyBhIHVuaXF1ZSBpZCBvbiB0aGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGVhc2lseSByZW1vdmVkIGZyb20gZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGNvbnRleHRcbiAqICAgICAgICBUaGUgb2JqZWN0IHRvIGJpbmQgYXMgc2NvcGUuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gYmUgYm91bmQgdG8gYSBzY29wZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW3VpZF1cbiAqICAgICAgICBBbiBvcHRpb25hbCB1bmlxdWUgSUQgZm9yIHRoZSBmdW5jdGlvbiB0byBiZSBzZXRcbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqICAgICAgICAgVGhlIG5ldyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgYm91bmQgaW50byB0aGUgY29udGV4dCBnaXZlblxuICovXG52YXIgYmluZCA9IGZ1bmN0aW9uIGJpbmQoY29udGV4dCwgZm4sIHVpZCkge1xuICAvLyBNYWtlIHN1cmUgdGhlIGZ1bmN0aW9uIGhhcyBhIHVuaXF1ZSBJRFxuICBpZiAoIWZuLmd1aWQpIHtcbiAgICBmbi5ndWlkID0gbmV3R1VJRCgpO1xuICB9XG5cbiAgLy8gQ3JlYXRlIHRoZSBuZXcgZnVuY3Rpb24gdGhhdCBjaGFuZ2VzIHRoZSBjb250ZXh0XG4gIHZhciBib3VuZCA9IGZ1bmN0aW9uIGJvdW5kKCkge1xuICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIC8vIEFsbG93IGZvciB0aGUgYWJpbGl0eSB0byBpbmRpdmlkdWFsaXplIHRoaXMgZnVuY3Rpb25cbiAgLy8gTmVlZGVkIGluIHRoZSBjYXNlIHdoZXJlIG11bHRpcGxlIG9iamVjdHMgbWlnaHQgc2hhcmUgdGhlIHNhbWUgcHJvdG90eXBlXG4gIC8vIElGIGJvdGggaXRlbXMgYWRkIGFuIGV2ZW50IGxpc3RlbmVyIHdpdGggdGhlIHNhbWUgZnVuY3Rpb24sIHRoZW4geW91IHRyeSB0byByZW1vdmUganVzdCBvbmVcbiAgLy8gaXQgd2lsbCByZW1vdmUgYm90aCBiZWNhdXNlIHRoZXkgYm90aCBoYXZlIHRoZSBzYW1lIGd1aWQuXG4gIC8vIHdoZW4gdXNpbmcgdGhpcywgeW91IG5lZWQgdG8gdXNlIHRoZSBiaW5kIG1ldGhvZCB3aGVuIHlvdSByZW1vdmUgdGhlIGxpc3RlbmVyIGFzIHdlbGwuXG4gIC8vIGN1cnJlbnRseSB1c2VkIGluIHRleHQgdHJhY2tzXG4gIGJvdW5kLmd1aWQgPSB1aWQgPyB1aWQgKyAnXycgKyBmbi5ndWlkIDogZm4uZ3VpZDtcblxuICByZXR1cm4gYm91bmQ7XG59O1xuXG4vKipcbiAqIFdyYXBzIHRoZSBnaXZlbiBmdW5jdGlvbiwgYGZuYCwgd2l0aCBhIG5ldyBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZm5gXG4gKiBhdCBtb3N0IG9uY2UgcGVyIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuXG4gKiAgICAgICAgIFRoZSBmdW5jdGlvbiB0byBiZSB0aHJvdHRsZWQuXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSAgIHdhaXRcbiAqICAgICAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYnkgd2hpY2ggdG8gdGhyb3R0bGUuXG4gKlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbnZhciB0aHJvdHRsZSA9IGZ1bmN0aW9uIHRocm90dGxlKGZuLCB3YWl0KSB7XG4gIHZhciBsYXN0ID0gRGF0ZS5ub3coKTtcblxuICB2YXIgdGhyb3R0bGVkID0gZnVuY3Rpb24gdGhyb3R0bGVkKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKG5vdyAtIGxhc3QgPj0gd2FpdCkge1xuICAgICAgZm4uYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgbGFzdCA9IG5vdztcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHRocm90dGxlZDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuXG4gKlxuICogSW5zcGlyZWQgYnkgbG9kYXNoIGFuZCB1bmRlcnNjb3JlIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZnVuY1xuICogICAgICAgICBUaGUgZnVuY3Rpb24gdG8gd3JhcCB3aXRoIGRlYm91bmNlIGJlaGF2aW9yLlxuICpcbiAqIEBwYXJhbSAge251bWJlcn0gd2FpdFxuICogICAgICAgICBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGFmdGVyIHRoZSBsYXN0IGludm9jYXRpb24uXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gW2ltbWVkaWF0ZV1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseSB1cG9uIGNyZWF0aW9uLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gW2NvbnRleHQ9d2luZG93XVxuICogICAgICAgICBUaGUgXCJjb250ZXh0XCIgaW4gd2hpY2ggdGhlIGRlYm91bmNlZCBmdW5jdGlvbiBzaG91bGQgZGVib3VuY2UuIEZvclxuICogICAgICAgICBleGFtcGxlLCBpZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB0aWVkIHRvIGEgVmlkZW8uanMgcGxheWVyLFxuICogICAgICAgICB0aGUgcGxheWVyIGNhbiBiZSBwYXNzZWQgaGVyZS4gQWx0ZXJuYXRpdmVseSwgZGVmYXVsdHMgdG8gdGhlXG4gKiAgICAgICAgIGdsb2JhbCBgd2luZG93YCBvYmplY3QuXG4gKlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiAgICAgICAgIEEgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICovXG52YXIgZGVib3VuY2UgPSBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHdpbmRvdztcblxuICB2YXIgdGltZW91dCA9IHZvaWQgMDtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXRoaXMgKi9cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgX2xhdGVyID0gZnVuY3Rpb24gbGF0ZXIoKSB7XG4gICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgIF9sYXRlciA9IG51bGw7XG4gICAgICBpZiAoIWltbWVkaWF0ZSkge1xuICAgICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIXRpbWVvdXQgJiYgaW1tZWRpYXRlKSB7XG4gICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnRleHQuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQoX2xhdGVyLCB3YWl0KTtcbiAgfTtcbiAgLyogZXNsaW50LWVuYWJsZSBjb25zaXN0ZW50LXRoaXMgKi9cbn07XG5cbi8qKlxuICogQGZpbGUgc3JjL2pzL2V2ZW50LXRhcmdldC5qc1xuICovXG4vKipcbiAqIGBFdmVudFRhcmdldGAgaXMgYSBjbGFzcyB0aGF0IGNhbiBoYXZlIHRoZSBzYW1lIEFQSSBhcyB0aGUgRE9NIGBFdmVudFRhcmdldGAuIEl0XG4gKiBhZGRzIHNob3J0aGFuZCBmdW5jdGlvbnMgdGhhdCB3cmFwIGFyb3VuZCBsZW5ndGh5IGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gKiB0aGUgYG9uYCBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgYXJvdW5kIGBhZGRFdmVudExpc3RlbmVyYC5cbiAqXG4gKiBAc2VlIFtFdmVudFRhcmdldCBTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItRXZlbnRzL2V2ZW50cy5odG1sI0V2ZW50cy1FdmVudFRhcmdldH1cbiAqIEBjbGFzcyBFdmVudFRhcmdldFxuICovXG52YXIgRXZlbnRUYXJnZXQgPSBmdW5jdGlvbiBFdmVudFRhcmdldCgpIHt9O1xuXG4vKipcbiAqIEEgQ3VzdG9tIERPTSBldmVudC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudFRhcmdldH5FdmVudFxuICogQHNlZSBbUHJvcGVydGllc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50fVxuICovXG5cbi8qKlxuICogQWxsIGV2ZW50IGxpc3RlbmVycyBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgZm9ybWF0LlxuICpcbiAqIEBjYWxsYmFjayBFdmVudFRhcmdldH5FdmVudExpc3RlbmVyXG4gKiBAdGhpcyB7RXZlbnRUYXJnZXR9XG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAqICAgICAgICB0aGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbaGFzaF1cbiAqICAgICAgICBoYXNoIG9mIGRhdGEgc2VudCBkdXJpbmcgdGhlIGV2ZW50XG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBldmVudCBuYW1lcyBhcyBrZXlzIGFuZCBib29sZWFucyBhcyB2YWx1ZXMuXG4gKlxuICogPiBOT1RFOiBJZiBhbiBldmVudCBuYW1lIGlzIHNldCB0byBhIHRydWUgdmFsdWUgaGVyZSB7QGxpbmsgRXZlbnRUYXJnZXQjdHJpZ2dlcn1cbiAqICAgICAgICAgd2lsbCBoYXZlIGV4dHJhIGZ1bmN0aW9uYWxpdHkuIFNlZSB0aGF0IGZ1bmN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSBFdmVudFRhcmdldC5wcm90b3R5cGUuYWxsb3dlZEV2ZW50c19cbiAqIEBwcml2YXRlXG4gKi9cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHt9O1xuXG4vKipcbiAqIEFkZHMgYW4gYGV2ZW50IGxpc3RlbmVyYCB0byBhbiBpbnN0YW5jZSBvZiBhbiBgRXZlbnRUYXJnZXRgLiBBbiBgZXZlbnQgbGlzdGVuZXJgIGlzIGFcbiAqIGZ1bmN0aW9uIHRoYXQgd2lsbCBnZXQgY2FsbGVkIHdoZW4gYW4gZXZlbnQgd2l0aCBhIGNlcnRhaW4gbmFtZSBnZXRzIHRyaWdnZXJlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gdHlwZVxuICogICAgICAgIEFuIGV2ZW50IG5hbWUgb3IgYW4gYXJyYXkgb2YgZXZlbnQgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudExpc3RlbmVyfSBmblxuICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdpdGggYEV2ZW50VGFyZ2V0YHNcbiAqL1xuRXZlbnRUYXJnZXQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7XG4gIC8vIFJlbW92ZSB0aGUgYWRkRXZlbnRMaXN0ZW5lciBhbGlhcyBiZWZvcmUgY2FsbGluZyBFdmVudHMub25cbiAgLy8gc28gd2UgZG9uJ3QgZ2V0IGludG8gYW4gaW5maW5pdGUgdHlwZSBsb29wXG4gIHZhciBhZWwgPSB0aGlzLmFkZEV2ZW50TGlzdGVuZXI7XG5cbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKCkge307XG4gIG9uKHRoaXMsIHR5cGUsIGZuKTtcbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gYWVsO1xufTtcblxuLyoqXG4gKiBBbiBhbGlhcyBvZiB7QGxpbmsgRXZlbnRUYXJnZXQjb259LiBBbGxvd3MgYEV2ZW50VGFyZ2V0YCB0byBtaW1pY1xuICogdGhlIHN0YW5kYXJkIERPTSBBUEkuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2VlIHtAbGluayBFdmVudFRhcmdldCNvbn1cbiAqL1xuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBFdmVudFRhcmdldC5wcm90b3R5cGUub247XG5cbi8qKlxuICogUmVtb3ZlcyBhbiBgZXZlbnQgbGlzdGVuZXJgIGZvciBhIHNwZWNpZmljIGV2ZW50IGZyb20gYW4gaW5zdGFuY2Ugb2YgYEV2ZW50VGFyZ2V0YC5cbiAqIFRoaXMgbWFrZXMgaXQgc28gdGhhdCB0aGUgYGV2ZW50IGxpc3RlbmVyYCB3aWxsIG5vIGxvbmdlciBnZXQgY2FsbGVkIHdoZW4gdGhlXG4gKiBuYW1lZCBldmVudCBoYXBwZW5zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSB0eXBlXG4gKiAgICAgICAgQW4gZXZlbnQgbmFtZSBvciBhbiBhcnJheSBvZiBldmVudCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJ9IGZuXG4gKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRvIHJlbW92ZS5cbiAqL1xuRXZlbnRUYXJnZXQucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICBvZmYodGhpcywgdHlwZSwgZm4pO1xufTtcblxuLyoqXG4gKiBBbiBhbGlhcyBvZiB7QGxpbmsgRXZlbnRUYXJnZXQjb2ZmfS4gQWxsb3dzIGBFdmVudFRhcmdldGAgdG8gbWltaWNcbiAqIHRoZSBzdGFuZGFyZCBET00gQVBJLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHNlZSB7QGxpbmsgRXZlbnRUYXJnZXQjb2ZmfVxuICovXG5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5vZmY7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGFkZCBhbiBgZXZlbnQgbGlzdGVuZXJgIHRoYXQgZ2V0cyB0cmlnZ2VyZWQgb25seSBvbmNlLiBBZnRlciB0aGVcbiAqIGZpcnN0IHRyaWdnZXIgaXQgd2lsbCBnZXQgcmVtb3ZlZC4gVGhpcyBpcyBsaWtlIGFkZGluZyBhbiBgZXZlbnQgbGlzdGVuZXJgXG4gKiB3aXRoIHtAbGluayBFdmVudFRhcmdldCNvbn0gdGhhdCBjYWxscyB7QGxpbmsgRXZlbnRUYXJnZXQjb2ZmfSBvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHR5cGVcbiAqICAgICAgICBBbiBldmVudCBuYW1lIG9yIGFuIGFycmF5IG9mIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnRMaXN0ZW5lcn0gZm5cbiAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZXZlbnQgbmFtZS5cbiAqL1xuRXZlbnRUYXJnZXQucHJvdG90eXBlLm9uZSA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICAvLyBSZW1vdmUgdGhlIGFkZEV2ZW50TGlzdGVuZXIgYWxpYWxpbmcgRXZlbnRzLm9uXG4gIC8vIHNvIHdlIGRvbid0IGdldCBpbnRvIGFuIGluZmluaXRlIHR5cGUgbG9vcFxuICB2YXIgYWVsID0gdGhpcy5hZGRFdmVudExpc3RlbmVyO1xuXG4gIHRoaXMuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHt9O1xuICBvbmUodGhpcywgdHlwZSwgZm4pO1xuICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgPSBhZWw7XG59O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2F1c2VzIGFuIGV2ZW50IHRvIGhhcHBlbi4gVGhpcyB3aWxsIHRoZW4gY2F1c2UgYW55IGBldmVudCBsaXN0ZW5lcnNgXG4gKiB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGF0IGV2ZW50LCB0byBnZXQgY2FsbGVkLiBJZiB0aGVyZSBhcmUgbm8gYGV2ZW50IGxpc3RlbmVyc2BcbiAqIGZvciBhbiBldmVudCB0aGVuIG5vdGhpbmcgd2lsbCBoYXBwZW4uXG4gKlxuICogSWYgdGhlIG5hbWUgb2YgdGhlIGBFdmVudGAgdGhhdCBpcyBiZWluZyB0cmlnZ2VyZWQgaXMgaW4gYEV2ZW50VGFyZ2V0LmFsbG93ZWRFdmVudHNfYC5cbiAqIFRyaWdnZXIgd2lsbCBhbHNvIGNhbGwgdGhlIGBvbmAgKyBgdXBwZXJjYXNlRXZlbnROYW1lYCBmdW5jdGlvbi5cbiAqXG4gKiBFeGFtcGxlOlxuICogJ2NsaWNrJyBpcyBpbiBgRXZlbnRUYXJnZXQuYWxsb3dlZEV2ZW50c19gLCBzbywgdHJpZ2dlciB3aWxsIGF0dGVtcHQgdG8gY2FsbFxuICogYG9uQ2xpY2tgIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xFdmVudFRhcmdldH5FdmVudHxPYmplY3R9IGV2ZW50XG4gKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGV2ZW50LCBhbiBgRXZlbnRgLCBvciBhbiBvYmplY3Qgd2l0aCBhIGtleSBvZiB0eXBlIHNldCB0b1xuICogICAgICAgIGFuIGV2ZW50IG5hbWUuXG4gKi9cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgIGV2ZW50ID0geyB0eXBlOiB0eXBlIH07XG4gIH1cbiAgZXZlbnQgPSBmaXhFdmVudChldmVudCk7XG5cbiAgaWYgKHRoaXMuYWxsb3dlZEV2ZW50c19bdHlwZV0gJiYgdGhpc1snb24nICsgdHlwZV0pIHtcbiAgICB0aGlzWydvbicgKyB0eXBlXShldmVudCk7XG4gIH1cblxuICB0cmlnZ2VyKHRoaXMsIGV2ZW50KTtcbn07XG5cbi8qKlxuICogQW4gYWxpYXMgb2Yge0BsaW5rIEV2ZW50VGFyZ2V0I3RyaWdnZXJ9LiBBbGxvd3MgYEV2ZW50VGFyZ2V0YCB0byBtaW1pY1xuICogdGhlIHN0YW5kYXJkIERPTSBBUEkuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2VlIHtAbGluayBFdmVudFRhcmdldCN0cmlnZ2VyfVxuICovXG5FdmVudFRhcmdldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IEV2ZW50VGFyZ2V0LnByb3RvdHlwZS50cmlnZ2VyO1xuXG4vKipcbiAqIEBmaWxlIG1peGlucy9ldmVudGVkLmpzXG4gKiBAbW9kdWxlIGV2ZW50ZWRcbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBoYXMgaGFkIHRoZSBldmVudGVkIG1peGluIGFwcGxpZWQuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBvYmplY3RcbiAqICAgICAgICAgQW4gb2JqZWN0IHRvIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIG9iamVjdCBhcHBlYXJzIHRvIGJlIGV2ZW50ZWQuXG4gKi9cbnZhciBpc0V2ZW50ZWQgPSBmdW5jdGlvbiBpc0V2ZW50ZWQob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBFdmVudFRhcmdldCB8fCAhIW9iamVjdC5ldmVudEJ1c0VsXyAmJiBbJ29uJywgJ29uZScsICdvZmYnLCAndHJpZ2dlciddLmV2ZXJ5KGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmplY3Rba10gPT09ICdmdW5jdGlvbic7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgdmFsdWUgaXMgYSB2YWxpZCBldmVudCB0eXBlIC0gbm9uLWVtcHR5IHN0cmluZyBvciBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7c3RyaW5nfEFycmF5fSB0eXBlXG4gKiAgICAgICAgIFRoZSB0eXBlIHZhbHVlIHRvIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIHR5cGUgaXMgYSB2YWxpZCBldmVudCB0eXBlLlxuICovXG52YXIgaXNWYWxpZEV2ZW50VHlwZSA9IGZ1bmN0aW9uIGlzVmFsaWRFdmVudFR5cGUodHlwZSkge1xuICByZXR1cm4gKFxuICAgIC8vIFRoZSByZWdleCBoZXJlIHZlcmlmaWVzIHRoYXQgdGhlIGB0eXBlYCBjb250YWlucyBhdCBsZWFzdCBvbmUgbm9uLVxuICAgIC8vIHdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICAgIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyAmJiAvXFxTLy50ZXN0KHR5cGUpIHx8IEFycmF5LmlzQXJyYXkodHlwZSkgJiYgISF0eXBlLmxlbmd0aFxuICApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSB2YWxpZCBldmVudCB0YXJnZXQuIFRocm93cyBpZiBub3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfVxuICogICAgICAgICBJZiB0aGUgdGFyZ2V0IGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGV2ZW50IHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldFxuICogICAgICAgICBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKi9cbnZhciB2YWxpZGF0ZVRhcmdldCA9IGZ1bmN0aW9uIHZhbGlkYXRlVGFyZ2V0KHRhcmdldCkge1xuICBpZiAoIXRhcmdldC5ub2RlTmFtZSAmJiAhaXNFdmVudGVkKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGFyZ2V0OyBtdXN0IGJlIGEgRE9NIG5vZGUgb3IgZXZlbnRlZCBvYmplY3QuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgdmFsaWQgZXZlbnQgdGFyZ2V0LiBUaHJvd3MgaWYgbm90LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqICAgICAgICAgSWYgdGhlIHR5cGUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgZXZlbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl9IHR5cGVcbiAqICAgICAgICAgVGhlIHR5cGUgdG8gdGVzdC5cbiAqL1xudmFyIHZhbGlkYXRlRXZlbnRUeXBlID0gZnVuY3Rpb24gdmFsaWRhdGVFdmVudFR5cGUodHlwZSkge1xuICBpZiAoIWlzVmFsaWRFdmVudFR5cGUodHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZTsgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYXJyYXkuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgdmFsaWQgbGlzdGVuZXIuIFRocm93cyBpZiBub3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfVxuICogICAgICAgICBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgICAgICAgIFRoZSBsaXN0ZW5lciB0byB0ZXN0LlxuICovXG52YXIgdmFsaWRhdGVMaXN0ZW5lciA9IGZ1bmN0aW9uIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0ZW5lcjsgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG59O1xuXG4vKipcbiAqIFRha2VzIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBnaXZlbiB0byBgb24oKWAgb3IgYG9uZSgpYCwgdmFsaWRhdGVzIHRoZW0sIGFuZFxuICogbm9ybWFsaXplcyB0aGVtIGludG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHNlbGZcbiAqICAgICAgICAgVGhlIGV2ZW50ZWQgb2JqZWN0IG9uIHdoaWNoIGBvbigpYCBvciBgb25lKClgIHdhcyBjYWxsZWQuIFRoaXNcbiAqICAgICAgICAgb2JqZWN0IHdpbGwgYmUgYm91bmQgYXMgdGhlIGB0aGlzYCB2YWx1ZSBmb3IgdGhlIGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSAge0FycmF5fSBhcmdzXG4gKiAgICAgICAgIEFuIGFycmF5IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gYG9uKClgIG9yIGBvbmUoKWAuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyB1c2VmdWwgdmFsdWVzIGZvciBgb24oKWAgb3IgYG9uZSgpYCBjYWxscy5cbiAqL1xudmFyIG5vcm1hbGl6ZUxpc3RlbkFyZ3MgPSBmdW5jdGlvbiBub3JtYWxpemVMaXN0ZW5BcmdzKHNlbGYsIGFyZ3MpIHtcblxuICAvLyBJZiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBsZXNzIHRoYW4gMywgdGhlIHRhcmdldCBpcyBhbHdheXMgdGhlXG4gIC8vIGV2ZW50ZWQgb2JqZWN0IGl0c2VsZi5cbiAgdmFyIGlzVGFyZ2V0aW5nU2VsZiA9IGFyZ3MubGVuZ3RoIDwgMyB8fCBhcmdzWzBdID09PSBzZWxmIHx8IGFyZ3NbMF0gPT09IHNlbGYuZXZlbnRCdXNFbF87XG4gIHZhciB0YXJnZXQgPSB2b2lkIDA7XG4gIHZhciB0eXBlID0gdm9pZCAwO1xuICB2YXIgbGlzdGVuZXIgPSB2b2lkIDA7XG5cbiAgaWYgKGlzVGFyZ2V0aW5nU2VsZikge1xuICAgIHRhcmdldCA9IHNlbGYuZXZlbnRCdXNFbF87XG5cbiAgICAvLyBEZWFsIHdpdGggY2FzZXMgd2hlcmUgd2UgZ290IDMgYXJndW1lbnRzLCBidXQgd2UgYXJlIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHRoZSBldmVudGVkIG9iamVjdCBpdHNlbGYuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID49IDMpIHtcbiAgICAgIGFyZ3Muc2hpZnQoKTtcbiAgICB9XG5cbiAgICB0eXBlID0gYXJnc1swXTtcbiAgICBsaXN0ZW5lciA9IGFyZ3NbMV07XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0ID0gYXJnc1swXTtcbiAgICB0eXBlID0gYXJnc1sxXTtcbiAgICBsaXN0ZW5lciA9IGFyZ3NbMl07XG4gIH1cblxuICB2YWxpZGF0ZVRhcmdldCh0YXJnZXQpO1xuICB2YWxpZGF0ZUV2ZW50VHlwZSh0eXBlKTtcbiAgdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgbGlzdGVuZXIgPSBiaW5kKHNlbGYsIGxpc3RlbmVyKTtcblxuICByZXR1cm4geyBpc1RhcmdldGluZ1NlbGY6IGlzVGFyZ2V0aW5nU2VsZiwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xufTtcblxuLyoqXG4gKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgZXZlbnQgdHlwZShzKSBvbiB0aGUgdGFyZ2V0LCBub3JtYWxpemluZyBmb3JcbiAqIHRoZSB0eXBlIG9mIHRhcmdldC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7RWxlbWVudHxPYmplY3R9IHRhcmdldFxuICogICAgICAgICBBIERPTSBub2RlIG9yIGV2ZW50ZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gbWV0aG9kXG4gKiAgICAgICAgIFRoZSBldmVudCBiaW5kaW5nIG1ldGhvZCB0byB1c2UgKFwib25cIiBvciBcIm9uZVwiKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl9IHR5cGVcbiAqICAgICAgICAgT25lIG9yIG1vcmUgZXZlbnQgdHlwZShzKS5cbiAqXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgICAgICAgQSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqL1xudmFyIGxpc3RlbiA9IGZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIG1ldGhvZCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFsaWRhdGVUYXJnZXQodGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0Lm5vZGVOYW1lKSB7XG4gICAgRXZlbnRzW21ldGhvZF0odGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcik7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0W21ldGhvZF0odHlwZSwgbGlzdGVuZXIpO1xuICB9XG59O1xuXG4vKipcbiAqIENvbnRhaW5zIG1ldGhvZHMgdGhhdCBwcm92aWRlIGV2ZW50IGNhcGFiaWxpdGVzIHRvIGFuIG9iamVjdCB3aGljaCBpcyBwYXNzZWRcbiAqIHRvIHtAbGluayBtb2R1bGU6ZXZlbnRlZHxldmVudGVkfS5cbiAqXG4gKiBAbWl4aW4gRXZlbnRlZE1peGluXG4gKi9cbnZhciBFdmVudGVkTWl4aW4gPSB7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIGFuIGV2ZW50IChvciBldmVudHMpIG9uIHRoaXMgb2JqZWN0IG9yIGFub3RoZXIgZXZlbnRlZFxuICAgKiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ3xBcnJheXxFbGVtZW50fE9iamVjdH0gdGFyZ2V0T3JUeXBlXG4gICAqICAgICAgICAgSWYgdGhpcyBpcyBhIHN0cmluZyBvciBhcnJheSwgaXQgcmVwcmVzZW50cyB0aGUgZXZlbnQgdHlwZShzKVxuICAgKiAgICAgICAgIHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBsaXN0ZW5lci5cbiAgICpcbiAgICogICAgICAgICBBbm90aGVyIGV2ZW50ZWQgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaGVyZSBpbnN0ZWFkLCB3aGljaCB3aWxsXG4gICAqICAgICAgICAgY2F1c2UgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBmb3IgZXZlbnRzIG9uIF90aGF0XyBvYmplY3QuXG4gICAqXG4gICAqICAgICAgICAgSW4gZWl0aGVyIGNhc2UsIHRoZSBsaXN0ZW5lcidzIGB0aGlzYCB2YWx1ZSB3aWxsIGJlIGJvdW5kIHRvXG4gICAqICAgICAgICAgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ3xBcnJheXxGdW5jdGlvbn0gdHlwZU9yTGlzdGVuZXJcbiAgICogICAgICAgICBJZiB0aGUgZmlyc3QgYXJndW1lbnQgd2FzIGEgc3RyaW5nIG9yIGFycmF5LCB0aGlzIHNob3VsZCBiZSB0aGVcbiAgICogICAgICAgICBsaXN0ZW5lciBmdW5jdGlvbi4gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgc3RyaW5nIG9yIGFycmF5IG9mIGV2ZW50XG4gICAqICAgICAgICAgdHlwZShzKS5cbiAgICpcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IFtsaXN0ZW5lcl1cbiAgICogICAgICAgICBJZiB0aGUgZmlyc3QgYXJndW1lbnQgd2FzIGFub3RoZXIgZXZlbnRlZCBvYmplY3QsIHRoaXMgd2lsbCBiZVxuICAgKiAgICAgICAgIHRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAgICovXG4gIG9uOiBmdW5jdGlvbiBvbiQkMSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIF9ub3JtYWxpemVMaXN0ZW5BcmdzID0gbm9ybWFsaXplTGlzdGVuQXJncyh0aGlzLCBhcmdzKSxcbiAgICAgICAgaXNUYXJnZXRpbmdTZWxmID0gX25vcm1hbGl6ZUxpc3RlbkFyZ3MuaXNUYXJnZXRpbmdTZWxmLFxuICAgICAgICB0YXJnZXQgPSBfbm9ybWFsaXplTGlzdGVuQXJncy50YXJnZXQsXG4gICAgICAgIHR5cGUgPSBfbm9ybWFsaXplTGlzdGVuQXJncy50eXBlLFxuICAgICAgICBsaXN0ZW5lciA9IF9ub3JtYWxpemVMaXN0ZW5BcmdzLmxpc3RlbmVyO1xuXG4gICAgbGlzdGVuKHRhcmdldCwgJ29uJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgbGlzdGVuaW5nIHRvIGFub3RoZXIgZXZlbnRlZCBvYmplY3QuXG4gICAgaWYgKCFpc1RhcmdldGluZ1NlbGYpIHtcblxuICAgICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgbGlzdGVuZXIuXG4gICAgICB2YXIgcmVtb3ZlTGlzdGVuZXJPbkRpc3Bvc2UgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lck9uRGlzcG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLm9mZih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFVzZSB0aGUgc2FtZSBmdW5jdGlvbiBJRCBhcyB0aGUgbGlzdGVuZXIgc28gd2UgY2FuIHJlbW92ZSBpdCBsYXRlciBpdFxuICAgICAgLy8gdXNpbmcgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lci5cbiAgICAgIHJlbW92ZUxpc3RlbmVyT25EaXNwb3NlLmd1aWQgPSBsaXN0ZW5lci5ndWlkO1xuXG4gICAgICAvLyBBZGQgYSBsaXN0ZW5lciB0byB0aGUgdGFyZ2V0J3MgZGlzcG9zZSBldmVudCBhcyB3ZWxsLiBUaGlzIGVuc3VyZXNcbiAgICAgIC8vIHRoYXQgaWYgdGhlIHRhcmdldCBpcyBkaXNwb3NlZCBCRUZPUkUgdGhpcyBvYmplY3QsIHdlIHJlbW92ZSB0aGVcbiAgICAgIC8vIHJlbW92YWwgbGlzdGVuZXIgdGhhdCB3YXMganVzdCBhZGRlZC4gT3RoZXJ3aXNlLCB3ZSBjcmVhdGUgYSBtZW1vcnkgbGVhay5cbiAgICAgIHZhciByZW1vdmVSZW1vdmVyT25UYXJnZXREaXNwb3NlID0gZnVuY3Rpb24gcmVtb3ZlUmVtb3Zlck9uVGFyZ2V0RGlzcG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLm9mZignZGlzcG9zZScsIHJlbW92ZUxpc3RlbmVyT25EaXNwb3NlKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFVzZSB0aGUgc2FtZSBmdW5jdGlvbiBJRCBhcyB0aGUgbGlzdGVuZXIgc28gd2UgY2FuIHJlbW92ZSBpdCBsYXRlclxuICAgICAgLy8gaXQgdXNpbmcgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lci5cbiAgICAgIHJlbW92ZVJlbW92ZXJPblRhcmdldERpc3Bvc2UuZ3VpZCA9IGxpc3RlbmVyLmd1aWQ7XG5cbiAgICAgIGxpc3Rlbih0aGlzLCAnb24nLCAnZGlzcG9zZScsIHJlbW92ZUxpc3RlbmVyT25EaXNwb3NlKTtcbiAgICAgIGxpc3Rlbih0YXJnZXQsICdvbicsICdkaXNwb3NlJywgcmVtb3ZlUmVtb3Zlck9uVGFyZ2V0RGlzcG9zZSk7XG4gICAgfVxuICB9LFxuXG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIGFuIGV2ZW50IChvciBldmVudHMpIG9uIHRoaXMgb2JqZWN0IG9yIGFub3RoZXIgZXZlbnRlZFxuICAgKiBvYmplY3QuIFRoZSBsaXN0ZW5lciB3aWxsIG9ubHkgYmUgY2FsbGVkIG9uY2UgYW5kIHRoZW4gcmVtb3ZlZC5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEVsZW1lbnR8T2JqZWN0fSB0YXJnZXRPclR5cGVcbiAgICogICAgICAgICBJZiB0aGlzIGlzIGEgc3RyaW5nIG9yIGFycmF5LCBpdCByZXByZXNlbnRzIHRoZSBldmVudCB0eXBlKHMpXG4gICAqICAgICAgICAgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGxpc3RlbmVyLlxuICAgKlxuICAgKiAgICAgICAgIEFub3RoZXIgZXZlbnRlZCBvYmplY3QgY2FuIGJlIHBhc3NlZCBoZXJlIGluc3RlYWQsIHdoaWNoIHdpbGxcbiAgICogICAgICAgICBjYXVzZSB0aGUgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBldmVudHMgb24gX3RoYXRfIG9iamVjdC5cbiAgICpcbiAgICogICAgICAgICBJbiBlaXRoZXIgY2FzZSwgdGhlIGxpc3RlbmVyJ3MgYHRoaXNgIHZhbHVlIHdpbGwgYmUgYm91bmQgdG9cbiAgICogICAgICAgICB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEZ1bmN0aW9ufSB0eXBlT3JMaXN0ZW5lclxuICAgKiAgICAgICAgIElmIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgYSBzdHJpbmcgb3IgYXJyYXksIHRoaXMgc2hvdWxkIGJlIHRoZVxuICAgKiAgICAgICAgIGxpc3RlbmVyIGZ1bmN0aW9uLiBPdGhlcndpc2UsIHRoaXMgaXMgYSBzdHJpbmcgb3IgYXJyYXkgb2YgZXZlbnRcbiAgICogICAgICAgICB0eXBlKHMpLlxuICAgKlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW2xpc3RlbmVyXVxuICAgKiAgICAgICAgIElmIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgYW5vdGhlciBldmVudGVkIG9iamVjdCwgdGhpcyB3aWxsIGJlXG4gICAqICAgICAgICAgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICAgKi9cbiAgb25lOiBmdW5jdGlvbiBvbmUkJDEoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHZhciBfbm9ybWFsaXplTGlzdGVuQXJnczIgPSBub3JtYWxpemVMaXN0ZW5BcmdzKHRoaXMsIGFyZ3MpLFxuICAgICAgICBpc1RhcmdldGluZ1NlbGYgPSBfbm9ybWFsaXplTGlzdGVuQXJnczIuaXNUYXJnZXRpbmdTZWxmLFxuICAgICAgICB0YXJnZXQgPSBfbm9ybWFsaXplTGlzdGVuQXJnczIudGFyZ2V0LFxuICAgICAgICB0eXBlID0gX25vcm1hbGl6ZUxpc3RlbkFyZ3MyLnR5cGUsXG4gICAgICAgIGxpc3RlbmVyID0gX25vcm1hbGl6ZUxpc3RlbkFyZ3MyLmxpc3RlbmVyO1xuXG4gICAgLy8gVGFyZ2V0aW5nIHRoaXMgZXZlbnRlZCBvYmplY3QuXG5cblxuICAgIGlmIChpc1RhcmdldGluZ1NlbGYpIHtcbiAgICAgIGxpc3Rlbih0YXJnZXQsICdvbmUnLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFRhcmdldGluZyBhbm90aGVyIGV2ZW50ZWQgb2JqZWN0LlxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgd3JhcHBlciA9IGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgbGFyZ3MgPSBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICAgIGxhcmdzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIub2ZmKHRhcmdldCwgdHlwZSwgd3JhcHBlcik7XG4gICAgICAgIGxpc3RlbmVyLmFwcGx5KG51bGwsIGxhcmdzKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFVzZSB0aGUgc2FtZSBmdW5jdGlvbiBJRCBhcyB0aGUgbGlzdGVuZXIgc28gd2UgY2FuIHJlbW92ZSBpdCBsYXRlclxuICAgICAgLy8gaXQgdXNpbmcgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lci5cbiAgICAgIHdyYXBwZXIuZ3VpZCA9IGxpc3RlbmVyLmd1aWQ7XG4gICAgICBsaXN0ZW4odGFyZ2V0LCAnb25lJywgdHlwZSwgd3JhcHBlcik7XG4gICAgfVxuICB9LFxuXG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgbGlzdGVuZXIocykgZnJvbSBldmVudChzKSBvbiBhbiBldmVudGVkIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEVsZW1lbnR8T2JqZWN0fSBbdGFyZ2V0T3JUeXBlXVxuICAgKiAgICAgICAgIElmIHRoaXMgaXMgYSBzdHJpbmcgb3IgYXJyYXksIGl0IHJlcHJlc2VudHMgdGhlIGV2ZW50IHR5cGUocykuXG4gICAqXG4gICAqICAgICAgICAgQW5vdGhlciBldmVudGVkIG9iamVjdCBjYW4gYmUgcGFzc2VkIGhlcmUgaW5zdGVhZCwgaW4gd2hpY2ggY2FzZVxuICAgKiAgICAgICAgIEFMTCAzIGFyZ3VtZW50cyBhcmUgX3JlcXVpcmVkXy5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEZ1bmN0aW9ufSBbdHlwZU9yTGlzdGVuZXJdXG4gICAqICAgICAgICAgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHdhcyBhIHN0cmluZyBvciBhcnJheSwgdGhpcyBtYXkgYmUgdGhlXG4gICAqICAgICAgICAgbGlzdGVuZXIgZnVuY3Rpb24uIE90aGVyd2lzZSwgdGhpcyBpcyBhIHN0cmluZyBvciBhcnJheSBvZiBldmVudFxuICAgKiAgICAgICAgIHR5cGUocykuXG4gICAqXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBbbGlzdGVuZXJdXG4gICAqICAgICAgICAgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHdhcyBhbm90aGVyIGV2ZW50ZWQgb2JqZWN0LCB0aGlzIHdpbGwgYmVcbiAgICogICAgICAgICB0aGUgbGlzdGVuZXIgZnVuY3Rpb247IG90aGVyd2lzZSwgX2FsbF8gbGlzdGVuZXJzIGJvdW5kIHRvIHRoZVxuICAgKiAgICAgICAgIGV2ZW50IHR5cGUocykgd2lsbCBiZSByZW1vdmVkLlxuICAgKi9cbiAgb2ZmOiBmdW5jdGlvbiBvZmYkJDEodGFyZ2V0T3JUeXBlLCB0eXBlT3JMaXN0ZW5lciwgbGlzdGVuZXIpIHtcblxuICAgIC8vIFRhcmdldGluZyB0aGlzIGV2ZW50ZWQgb2JqZWN0LlxuICAgIGlmICghdGFyZ2V0T3JUeXBlIHx8IGlzVmFsaWRFdmVudFR5cGUodGFyZ2V0T3JUeXBlKSkge1xuICAgICAgb2ZmKHRoaXMuZXZlbnRCdXNFbF8sIHRhcmdldE9yVHlwZSwgdHlwZU9yTGlzdGVuZXIpO1xuXG4gICAgICAvLyBUYXJnZXRpbmcgYW5vdGhlciBldmVudGVkIG9iamVjdC5cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhcmdldCA9IHRhcmdldE9yVHlwZTtcbiAgICAgIHZhciB0eXBlID0gdHlwZU9yTGlzdGVuZXI7XG5cbiAgICAgIC8vIEZhaWwgZmFzdCBhbmQgaW4gYSBtZWFuaW5nZnVsIHdheSFcbiAgICAgIHZhbGlkYXRlVGFyZ2V0KHRhcmdldCk7XG4gICAgICB2YWxpZGF0ZUV2ZW50VHlwZSh0eXBlKTtcbiAgICAgIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlcmUncyBhdCBsZWFzdCBhIGd1aWQsIGV2ZW4gaWYgdGhlIGZ1bmN0aW9uIGhhc24ndCBiZWVuIHVzZWRcbiAgICAgIGxpc3RlbmVyID0gYmluZCh0aGlzLCBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgZGlzcG9zZSBsaXN0ZW5lciBvbiB0aGlzIGV2ZW50ZWQgb2JqZWN0LCB3aGljaCB3YXMgZ2l2ZW5cbiAgICAgIC8vIHRoZSBzYW1lIGd1aWQgYXMgdGhlIGV2ZW50IGxpc3RlbmVyIGluIG9uKCkuXG4gICAgICB0aGlzLm9mZignZGlzcG9zZScsIGxpc3RlbmVyKTtcblxuICAgICAgaWYgKHRhcmdldC5ub2RlTmFtZSkge1xuICAgICAgICBvZmYodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgIG9mZih0YXJnZXQsICdkaXNwb3NlJywgbGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIGlmIChpc0V2ZW50ZWQodGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQub2ZmKHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgICAgdGFyZ2V0Lm9mZignZGlzcG9zZScsIGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cblxuICAvKipcbiAgICogRmlyZSBhbiBldmVudCBvbiB0aGlzIGV2ZW50ZWQgb2JqZWN0LCBjYXVzaW5nIGl0cyBsaXN0ZW5lcnMgdG8gYmUgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gICB7c3RyaW5nfE9iamVjdH0gZXZlbnRcbiAgICogICAgICAgICAgQW4gZXZlbnQgdHlwZSBvciBhbiBvYmplY3Qgd2l0aCBhIHR5cGUgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSAgIHtPYmplY3R9IFtoYXNoXVxuICAgKiAgICAgICAgICBBbiBhZGRpdGlvbmFsIG9iamVjdCB0byBwYXNzIGFsb25nIHRvIGxpc3RlbmVycy5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdhcyBwcmV2ZW50ZWQuXG4gICAqL1xuICB0cmlnZ2VyOiBmdW5jdGlvbiB0cmlnZ2VyJCQxKGV2ZW50LCBoYXNoKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIodGhpcy5ldmVudEJ1c0VsXywgZXZlbnQsIGhhc2gpO1xuICB9XG59O1xuXG4vKipcbiAqIEFwcGxpZXMge0BsaW5rIG1vZHVsZTpldmVudGVkfkV2ZW50ZWRNaXhpbnxFdmVudGVkTWl4aW59IHRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldFxuICogICAgICAgICBUaGUgb2JqZWN0IHRvIHdoaWNoIHRvIGFkZCBldmVudCBtZXRob2RzLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gW29wdGlvbnM9e31dXG4gKiAgICAgICAgIE9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHRoZSBtaXhpbiBiZWhhdmlvci5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IFtvcHRpb25zLmV2ZW50QnVzS2V5XVxuICogICAgICAgICBCeSBkZWZhdWx0LCBhZGRzIGEgYGV2ZW50QnVzRWxfYCBET00gZWxlbWVudCB0byB0aGUgdGFyZ2V0IG9iamVjdCxcbiAqICAgICAgICAgd2hpY2ggaXMgdXNlZCBhcyBhbiBldmVudCBidXMuIElmIHRoZSB0YXJnZXQgb2JqZWN0IGFscmVhZHkgaGFzIGFcbiAqICAgICAgICAgRE9NIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCwgcGFzcyBpdHMga2V5IGhlcmUuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBUaGUgdGFyZ2V0IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZXZlbnRlZCh0YXJnZXQpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgZXZlbnRCdXNLZXkgPSBvcHRpb25zLmV2ZW50QnVzS2V5O1xuXG4gIC8vIFNldCBvciBjcmVhdGUgdGhlIGV2ZW50QnVzRWxfLlxuXG4gIGlmIChldmVudEJ1c0tleSkge1xuICAgIGlmICghdGFyZ2V0W2V2ZW50QnVzS2V5XS5ub2RlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZXZlbnRCdXNLZXkgXCInICsgZXZlbnRCdXNLZXkgKyAnXCIgZG9lcyBub3QgcmVmZXIgdG8gYW4gZWxlbWVudC4nKTtcbiAgICB9XG4gICAgdGFyZ2V0LmV2ZW50QnVzRWxfID0gdGFyZ2V0W2V2ZW50QnVzS2V5XTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuZXZlbnRCdXNFbF8gPSBjcmVhdGVFbCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndmpzLWV2ZW50LWJ1cycgfSk7XG4gIH1cblxuICBhc3NpZ24odGFyZ2V0LCBFdmVudGVkTWl4aW4pO1xuXG4gIC8vIFdoZW4gYW55IGV2ZW50ZWQgb2JqZWN0IGlzIGRpc3Bvc2VkLCBpdCByZW1vdmVzIGFsbCBpdHMgbGlzdGVuZXJzLlxuICB0YXJnZXQub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGFyZ2V0Lm9mZigpO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRhcmdldC5ldmVudEJ1c0VsXyA9IG51bGw7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogQGZpbGUgbWl4aW5zL3N0YXRlZnVsLmpzXG4gKiBAbW9kdWxlIHN0YXRlZnVsXG4gKi9cbi8qKlxuICogQ29udGFpbnMgbWV0aG9kcyB0aGF0IHByb3ZpZGUgc3RhdGVmdWxuZXNzIHRvIGFuIG9iamVjdCB3aGljaCBpcyBwYXNzZWRcbiAqIHRvIHtAbGluayBtb2R1bGU6c3RhdGVmdWx9LlxuICpcbiAqIEBtaXhpbiBTdGF0ZWZ1bE1peGluXG4gKi9cbnZhciBTdGF0ZWZ1bE1peGluID0ge1xuXG4gIC8qKlxuICAgKiBBIGhhc2ggY29udGFpbmluZyBhcmJpdHJhcnkga2V5cyBhbmQgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2ZcbiAgICogdGhlIG9iamVjdC5cbiAgICpcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRlOiB7fSxcblxuICAvKipcbiAgICogU2V0IHRoZSBzdGF0ZSBvZiBhbiBvYmplY3QgYnkgbXV0YXRpbmcgaXRzXG4gICAqIHtAbGluayBtb2R1bGU6c3RhdGVmdWx+U3RhdGVmdWxNaXhpbi5zdGF0ZXxzdGF0ZX0gb2JqZWN0IGluIHBsYWNlLlxuICAgKlxuICAgKiBAZmlyZXMgICBtb2R1bGU6c3RhdGVmdWx+U3RhdGVmdWxNaXhpbiNzdGF0ZWNoYW5nZWRcbiAgICogQHBhcmFtICAge09iamVjdHxGdW5jdGlvbn0gc3RhdGVVcGRhdGVzXG4gICAqICAgICAgICAgIEEgbmV3IHNldCBvZiBwcm9wZXJ0aWVzIHRvIHNoYWxsb3ctbWVyZ2UgaW50byB0aGUgcGx1Z2luIHN0YXRlLlxuICAgKiAgICAgICAgICBDYW4gYmUgYSBwbGFpbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBwbGFpbiBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQuIElmIG5vIGNoYW5nZXNcbiAgICogICAgICAgICAgb2NjdXJyZWQsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBzZXRTdGF0ZTogZnVuY3Rpb24gc2V0U3RhdGUoc3RhdGVVcGRhdGVzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIC8vIFN1cHBvcnQgcHJvdmlkaW5nIHRoZSBgc3RhdGVVcGRhdGVzYCBzdGF0ZSBhcyBhIGZ1bmN0aW9uLlxuICAgIGlmICh0eXBlb2Ygc3RhdGVVcGRhdGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0ZVVwZGF0ZXMgPSBzdGF0ZVVwZGF0ZXMoKTtcbiAgICB9XG5cbiAgICB2YXIgY2hhbmdlcyA9IHZvaWQgMDtcblxuICAgIGVhY2goc3RhdGVVcGRhdGVzLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuXG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYW5nZSBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gd2hhdCdzIGluIHRoZVxuICAgICAgLy8gY3VycmVudCBzdGF0ZS5cbiAgICAgIGlmIChfdGhpcy5zdGF0ZVtrZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcyB8fCB7fTtcbiAgICAgICAgY2hhbmdlc1trZXldID0ge1xuICAgICAgICAgIGZyb206IF90aGlzLnN0YXRlW2tleV0sXG4gICAgICAgICAgdG86IHZhbHVlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnN0YXRlW2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIC8vIE9ubHkgdHJpZ2dlciBcInN0YXRlY2hhbmdlXCIgaWYgdGhlcmUgd2VyZSBjaGFuZ2VzIEFORCB3ZSBoYXZlIGEgdHJpZ2dlclxuICAgIC8vIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyB1cyB0byBub3QgcmVxdWlyZSB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0IGJlIGFuXG4gICAgLy8gZXZlbnRlZCBvYmplY3QuXG4gICAgaWYgKGNoYW5nZXMgJiYgaXNFdmVudGVkKHRoaXMpKSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogQW4gZXZlbnQgdHJpZ2dlcmVkIG9uIGFuIG9iamVjdCB0aGF0IGlzIGJvdGhcbiAgICAgICAqIHtAbGluayBtb2R1bGU6c3RhdGVmdWx8c3RhdGVmdWx9IGFuZCB7QGxpbmsgbW9kdWxlOmV2ZW50ZWR8ZXZlbnRlZH1cbiAgICAgICAqIGluZGljYXRpbmcgdGhhdCBpdHMgc3RhdGUgaGFzIGNoYW5nZWQuXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50ICAgIG1vZHVsZTpzdGF0ZWZ1bH5TdGF0ZWZ1bE1peGluI3N0YXRlY2hhbmdlZFxuICAgICAgICogQHR5cGUgICAgIHtPYmplY3R9XG4gICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY2hhbmdlc1xuICAgICAgICogICAgICAgICAgIEEgaGFzaCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBjaGFuZ2VkIGFuZFxuICAgICAgICogICAgICAgICAgIHRoZSB2YWx1ZXMgdGhleSB3ZXJlIGNoYW5nZWQgYGZyb21gIGFuZCBgdG9gLlxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoe1xuICAgICAgICBjaGFuZ2VzOiBjaGFuZ2VzLFxuICAgICAgICB0eXBlOiAnc3RhdGVjaGFuZ2VkJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cbn07XG5cbi8qKlxuICogQXBwbGllcyB7QGxpbmsgbW9kdWxlOnN0YXRlZnVsflN0YXRlZnVsTWl4aW58U3RhdGVmdWxNaXhpbn0gdG8gYSB0YXJnZXRcbiAqIG9iamVjdC5cbiAqXG4gKiBJZiB0aGUgdGFyZ2V0IG9iamVjdCBpcyB7QGxpbmsgbW9kdWxlOmV2ZW50ZWR8ZXZlbnRlZH0gYW5kIGhhcyBhXG4gKiBgaGFuZGxlU3RhdGVDaGFuZ2VkYCBtZXRob2QsIHRoYXQgbWV0aG9kIHdpbGwgYmUgYXV0b21hdGljYWxseSBib3VuZCB0byB0aGVcbiAqIGBzdGF0ZWNoYW5nZWRgIGV2ZW50IG9uIGl0c2VsZi5cbiAqXG4gKiBAcGFyYW0gICB7T2JqZWN0fSB0YXJnZXRcbiAqICAgICAgICAgIFRoZSBvYmplY3QgdG8gYmUgbWFkZSBzdGF0ZWZ1bC5cbiAqXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBbZGVmYXVsdFN0YXRlXVxuICogICAgICAgICAgQSBkZWZhdWx0IHNldCBvZiBwcm9wZXJ0aWVzIHRvIHBvcHVsYXRlIHRoZSBuZXdseS1zdGF0ZWZ1bCBvYmplY3Qnc1xuICogICAgICAgICAgYHN0YXRlYCBwcm9wZXJ0eS5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICogICAgICAgICAgUmV0dXJucyB0aGUgYHRhcmdldGAuXG4gKi9cbmZ1bmN0aW9uIHN0YXRlZnVsKHRhcmdldCwgZGVmYXVsdFN0YXRlKSB7XG4gIGFzc2lnbih0YXJnZXQsIFN0YXRlZnVsTWl4aW4pO1xuXG4gIC8vIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgbWl4aW5nLWluIGJlY2F1c2Ugd2UgbmVlZCB0byByZXBsYWNlIHRoZSBgc3RhdGVgXG4gIC8vIGFkZGVkIGluIHRoYXQgc3RlcC5cbiAgdGFyZ2V0LnN0YXRlID0gYXNzaWduKHt9LCB0YXJnZXQuc3RhdGUsIGRlZmF1bHRTdGF0ZSk7XG5cbiAgLy8gQXV0by1iaW5kIHRoZSBgaGFuZGxlU3RhdGVDaGFuZ2VkYCBtZXRob2Qgb2YgdGhlIHRhcmdldCBvYmplY3QgaWYgaXQgZXhpc3RzLlxuICBpZiAodHlwZW9mIHRhcmdldC5oYW5kbGVTdGF0ZUNoYW5nZWQgPT09ICdmdW5jdGlvbicgJiYgaXNFdmVudGVkKHRhcmdldCkpIHtcbiAgICB0YXJnZXQub24oJ3N0YXRlY2hhbmdlZCcsIHRhcmdldC5oYW5kbGVTdGF0ZUNoYW5nZWQpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqXG4gKiBAZmlsZSB0by10aXRsZS1jYXNlLmpzXG4gKiBAbW9kdWxlIHRvLXRpdGxlLWNhc2VcbiAqL1xuXG4vKipcbiAqIFVwcGVyY2FzZSB0aGUgZmlyc3QgbGV0dGVyIG9mIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqICAgICAgICBTdHJpbmcgdG8gYmUgdXBwZXJjYXNlZFxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgVGhlIHN0cmluZyB3aXRoIGFuIHVwcGVyY2FzZWQgZmlyc3QgbGV0dGVyXG4gKi9cbmZ1bmN0aW9uIHRvVGl0bGVDYXNlKHN0cmluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0aGUgVGl0bGVDYXNlIHZlcnNpb25zIG9mIHRoZSB0d28gc3RyaW5ncyBmb3IgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cjFcbiAqICAgICAgICBUaGUgZmlyc3Qgc3RyaW5nIHRvIGNvbXBhcmVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyMlxuICogICAgICAgIFRoZSBzZWNvbmQgc3RyaW5nIHRvIGNvbXBhcmVcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICBXaGV0aGVyIHRoZSBUaXRsZUNhc2UgdmVyc2lvbnMgb2YgdGhlIHN0cmluZ3MgYXJlIGVxdWFsXG4gKi9cbmZ1bmN0aW9uIHRpdGxlQ2FzZUVxdWFscyhzdHIxLCBzdHIyKSB7XG4gIHJldHVybiB0b1RpdGxlQ2FzZShzdHIxKSA9PT0gdG9UaXRsZUNhc2Uoc3RyMik7XG59XG5cbi8qKlxuICogQGZpbGUgbWVyZ2Utb3B0aW9ucy5qc1xuICogQG1vZHVsZSBtZXJnZS1vcHRpb25zXG4gKi9cbi8qKlxuICogRGVlcC1tZXJnZSBvbmUgb3IgbW9yZSBvcHRpb25zIG9iamVjdHMsIHJlY3Vyc2l2ZWx5IG1lcmdpbmcgKipvbmx5KiogcGxhaW5cbiAqIG9iamVjdCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSAgIHtPYmplY3RbXX0gc291cmNlc1xuICogICAgICAgICAgT25lIG9yIG1vcmUgb2JqZWN0cyB0byBtZXJnZSBpbnRvIGEgbmV3IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICogICAgICAgICAgQSBuZXcgb2JqZWN0IHRoYXQgaXMgdGhlIG1lcmdlZCByZXN1bHQgb2YgYWxsIHNvdXJjZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucygpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzb3VyY2VzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc291cmNlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlYWNoKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICghaXNQbGFpbih2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzUGxhaW4ocmVzdWx0W2tleV0pKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0ge307XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2VPcHRpb25zKHJlc3VsdFtrZXldLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGxheWVyIENvbXBvbmVudCAtIEJhc2UgY2xhc3MgZm9yIGFsbCBVSSBvYmplY3RzXG4gKlxuICogQGZpbGUgY29tcG9uZW50LmpzXG4gKi9cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIFVJIENvbXBvbmVudHMuXG4gKiBDb21wb25lbnRzIGFyZSBVSSBvYmplY3RzIHdoaWNoIHJlcHJlc2VudCBib3RoIGEgamF2YXNjcmlwdCBvYmplY3QgYW5kIGFuIGVsZW1lbnRcbiAqIGluIHRoZSBET00uIFRoZXkgY2FuIGJlIGNoaWxkcmVuIG9mIG90aGVyIGNvbXBvbmVudHMsIGFuZCBjYW4gaGF2ZVxuICogY2hpbGRyZW4gdGhlbXNlbHZlcy5cbiAqXG4gKiBDb21wb25lbnRzIGNhbiBhbHNvIHVzZSBtZXRob2RzIGZyb20ge0BsaW5rIEV2ZW50VGFyZ2V0fVxuICovXG5cbnZhciBDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvbmVudCBpcyByZWFkeS4gRG9lcyBub3QgaGF2ZSBhbnlcbiAgICogcGFyYW10ZXJzIGFuZCBhbnkgY2FsbGJhY2sgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLlxuICAgKlxuICAgKiBAY2FsbGJhY2sgQ29tcG9uZW50flJlYWR5Q2FsbGJhY2tcbiAgICogQHRoaXMgQ29tcG9uZW50XG4gICAqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5jaGlsZHJlbl1cbiAgICogICAgICAgIEFuIGFycmF5IG9mIGNoaWxkcmVuIG9iamVjdHMgdG8gaW50aWFsaXplIHRoaXMgY29tcG9uZW50IHdpdGguIENoaWxkcmVuIG9iamVjdHMgaGF2ZVxuICAgKiAgICAgICAgYSBuYW1lIHByb3BlcnR5IHRoYXQgd2lsbCBiZSB1c2VkIGlmIG1vcmUgdGhhbiBvbmUgY29tcG9uZW50IG9mIHRoZSBzYW1lIHR5cGUgbmVlZHMgdG8gYmVcbiAgICogICAgICAgIGFkZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSBbcmVhZHldXG4gICAqICAgICAgICBGdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW4gdGhlIGBDb21wb25lbnRgIGlzIHJlYWR5LlxuICAgKi9cbiAgZnVuY3Rpb24gQ29tcG9uZW50KHBsYXllciwgb3B0aW9ucywgcmVhZHkpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb25lbnQpO1xuXG5cbiAgICAvLyBUaGUgY29tcG9uZW50IG1pZ2h0IGJlIHRoZSBwbGF5ZXIgaXRzZWxmIGFuZCB3ZSBjYW4ndCBwYXNzIGB0aGlzYCB0byBzdXBlclxuICAgIGlmICghcGxheWVyICYmIHRoaXMucGxheSkge1xuICAgICAgdGhpcy5wbGF5ZXJfID0gcGxheWVyID0gdGhpczsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXllcl8gPSBwbGF5ZXI7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBhIGNvcHkgb2YgcHJvdG90eXBlLm9wdGlvbnNfIHRvIHByb3RlY3QgYWdhaW5zdCBvdmVycmlkaW5nIGRlZmF1bHRzXG4gICAgdGhpcy5vcHRpb25zXyA9IG1lcmdlT3B0aW9ucyh7fSwgdGhpcy5vcHRpb25zXyk7XG5cbiAgICAvLyBVcGRhdGVkIG9wdGlvbnMgd2l0aCBzdXBwbGllZCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uc18gPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zXywgb3B0aW9ucyk7XG5cbiAgICAvLyBHZXQgSUQgZnJvbSBvcHRpb25zIG9yIG9wdGlvbnMgZWxlbWVudCBpZiBvbmUgaXMgc3VwcGxpZWRcbiAgICB0aGlzLmlkXyA9IG9wdGlvbnMuaWQgfHwgb3B0aW9ucy5lbCAmJiBvcHRpb25zLmVsLmlkO1xuXG4gICAgLy8gSWYgdGhlcmUgd2FzIG5vIElEIGZyb20gdGhlIG9wdGlvbnMsIGdlbmVyYXRlIG9uZVxuICAgIGlmICghdGhpcy5pZF8pIHtcbiAgICAgIC8vIERvbid0IHJlcXVpcmUgdGhlIHBsYXllciBJRCBmdW5jdGlvbiBpbiB0aGUgY2FzZSBvZiBtb2NrIHBsYXllcnNcbiAgICAgIHZhciBpZCA9IHBsYXllciAmJiBwbGF5ZXIuaWQgJiYgcGxheWVyLmlkKCkgfHwgJ25vX3BsYXllcic7XG5cbiAgICAgIHRoaXMuaWRfID0gaWQgKyAnX2NvbXBvbmVudF8nICsgbmV3R1VJRCgpO1xuICAgIH1cblxuICAgIHRoaXMubmFtZV8gPSBvcHRpb25zLm5hbWUgfHwgbnVsbDtcblxuICAgIC8vIENyZWF0ZSBlbGVtZW50IGlmIG9uZSB3YXNuJ3QgcHJvdmlkZWQgaW4gb3B0aW9uc1xuICAgIGlmIChvcHRpb25zLmVsKSB7XG4gICAgICB0aGlzLmVsXyA9IG9wdGlvbnMuZWw7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmNyZWF0ZUVsICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbF8gPSB0aGlzLmNyZWF0ZUVsKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgZXZlbnRlZCBpcyBhbnl0aGluZyBleGNlcHQgZmFsc2UsIHdlIHdhbnQgdG8gbWl4aW4gaW4gZXZlbnRlZFxuICAgIGlmIChvcHRpb25zLmV2ZW50ZWQgIT09IGZhbHNlKSB7XG4gICAgICAvLyBNYWtlIHRoaXMgYW4gZXZlbnRlZCBvYmplY3QgYW5kIHVzZSBgZWxfYCwgaWYgYXZhaWxhYmxlLCBhcyBpdHMgZXZlbnQgYnVzXG4gICAgICBldmVudGVkKHRoaXMsIHsgZXZlbnRCdXNLZXk6IHRoaXMuZWxfID8gJ2VsXycgOiBudWxsIH0pO1xuICAgIH1cbiAgICBzdGF0ZWZ1bCh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yLmRlZmF1bHRTdGF0ZSk7XG5cbiAgICB0aGlzLmNoaWxkcmVuXyA9IFtdO1xuICAgIHRoaXMuY2hpbGRJbmRleF8gPSB7fTtcbiAgICB0aGlzLmNoaWxkTmFtZUluZGV4XyA9IHt9O1xuXG4gICAgLy8gQWRkIGFueSBjaGlsZCBjb21wb25lbnRzIGluIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucy5pbml0Q2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmluaXRDaGlsZHJlbigpO1xuICAgIH1cblxuICAgIHRoaXMucmVhZHkocmVhZHkpO1xuICAgIC8vIERvbid0IHdhbnQgdG8gdHJpZ2dlciByZWFkeSBoZXJlIG9yIGl0IHdpbGwgYmVmb3JlIGluaXQgaXMgYWN0dWFsbHlcbiAgICAvLyBmaW5pc2hlZCBmb3IgYWxsIGNoaWxkcmVuIHRoYXQgcnVuIHRoaXMgY29uc3RydWN0b3JcblxuICAgIGlmIChvcHRpb25zLnJlcG9ydFRvdWNoQWN0aXZpdHkgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmVuYWJsZVRvdWNoQWN0aXZpdHkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSBvZiB0aGUgYENvbXBvbmVudGAgYW5kIGFsbCBjaGlsZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAZmlyZXMgQ29tcG9uZW50I2Rpc3Bvc2VcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBgQ29tcG9uZW50YCBpcyBkaXNwb3NlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCBDb21wb25lbnQjZGlzcG9zZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2J1YmJsZXM9ZmFsc2VdXG4gICAgICogICAgICAgICAgIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZSBjbG9zZSBldmVudCBkb2VzIG5vdFxuICAgICAqICAgICAgICAgICBidWJibGUgdXBcbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAnZGlzcG9zZScsIGJ1YmJsZXM6IGZhbHNlIH0pO1xuXG4gICAgLy8gRGlzcG9zZSBhbGwgY2hpbGRyZW4uXG4gICAgaWYgKHRoaXMuY2hpbGRyZW5fKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5jaGlsZHJlbl8ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5fW2ldLmRpc3Bvc2UpIHtcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuX1tpXS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWxldGUgY2hpbGQgcmVmZXJlbmNlc1xuICAgIHRoaXMuY2hpbGRyZW5fID0gbnVsbDtcbiAgICB0aGlzLmNoaWxkSW5kZXhfID0gbnVsbDtcbiAgICB0aGlzLmNoaWxkTmFtZUluZGV4XyA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5lbF8pIHtcbiAgICAgIC8vIFJlbW92ZSBlbGVtZW50IGZyb20gRE9NXG4gICAgICBpZiAodGhpcy5lbF8ucGFyZW50Tm9kZSkge1xuICAgICAgICB0aGlzLmVsXy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWxfKTtcbiAgICAgIH1cblxuICAgICAgcmVtb3ZlRGF0YSh0aGlzLmVsXyk7XG4gICAgICB0aGlzLmVsXyA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgcGxheWVyIGFmdGVyIGRpc3Bvc2luZyBvZiB0aGUgZWxlbWVudFxuICAgIHRoaXMucGxheWVyXyA9IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUge0BsaW5rIFBsYXllcn0gdGhhdCB0aGUgYENvbXBvbmVudGAgaGFzIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9XG4gICAqICAgICAgICAgVGhlIHBsYXllciB0aGF0IHRoaXMgYENvbXBvbmVudGAgaGFzIGF0dGFjaGVkIHRvLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUucGxheWVyID0gZnVuY3Rpb24gcGxheWVyKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllcl87XG4gIH07XG5cbiAgLyoqXG4gICAqIERlZXAgbWVyZ2Ugb2Ygb3B0aW9ucyBvYmplY3RzIHdpdGggbmV3IG9wdGlvbnMuXG4gICAqID4gTm90ZTogV2hlbiBib3RoIGBvYmpgIGFuZCBgb3B0aW9uc2AgY29udGFpbiBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgb2JqZWN0cy5cbiAgICogICAgICAgICBUaGUgdHdvIHByb3BlcnRpZXMgZ2V0IG1lcmdlZCB1c2luZyB7QGxpbmsgbW9kdWxlOm1lcmdlT3B0aW9uc31cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgKiAgICAgICAgVGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIG5ldyBvcHRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqICAgICAgICAgQSBuZXcgb2JqZWN0IG9mIGB0aGlzLm9wdGlvbnNfYCBhbmQgYG9iamAgbWVyZ2VkIHRvZ2V0aGVyLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDVcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLm9wdGlvbnMgPSBmdW5jdGlvbiBvcHRpb25zKG9iaikge1xuICAgIGxvZyQxLndhcm4oJ3RoaXMub3B0aW9ucygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGluIDYuMCcpO1xuXG4gICAgaWYgKCFvYmopIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNfO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9uc18gPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zXywgb2JqKTtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zXztcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBgQ29tcG9uZW50YHMgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgRE9NIGVsZW1lbnQgZm9yIHRoaXMgYENvbXBvbmVudGAuXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5lbCA9IGZ1bmN0aW9uIGVsKCkge1xuICAgIHJldHVybiB0aGlzLmVsXztcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnTmFtZV1cbiAgICogICAgICAgIEVsZW1lbnQncyBET00gbm9kZSB0eXBlLiBlLmcuICdkaXYnXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc11cbiAgICogICAgICAgIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNldC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFthdHRyaWJ1dGVzXVxuICAgKiAgICAgICAgQW4gb2JqZWN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgc2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSh0YWdOYW1lLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsKHRhZ05hbWUsIHByb3BlcnRpZXMsIGF0dHJpYnV0ZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMb2NhbGl6ZSBhIHN0cmluZyBnaXZlbiB0aGUgc3RyaW5nIGluIGVuZ2xpc2guXG4gICAqXG4gICAqIElmIHRva2VucyBhcmUgcHJvdmlkZWQsIGl0J2xsIHRyeSBhbmQgcnVuIGEgc2ltcGxlIHRva2VuIHJlcGxhY2VtZW50IG9uIHRoZSBwcm92aWRlZCBzdHJpbmcuXG4gICAqIFRoZSB0b2tlbnMgaXQgbG9va3MgZm9yIGxvb2sgbGlrZSBgezF9YCB3aXRoIHRoZSBpbmRleCBiZWluZyAxLWluZGV4ZWQgaW50byB0aGUgdG9rZW5zIGFycmF5LlxuICAgKlxuICAgKiBJZiBhIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBpdCdsbCB1c2UgdGhhdCBvdmVyIGBzdHJpbmdgLFxuICAgKiBpZiBhIHZhbHVlIGlzbid0IGZvdW5kIGluIHByb3ZpZGVkIGxhbmd1YWdlIGZpbGVzLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGVzY3JpcHRpdmUga2V5IGZvciB0b2tlbiByZXBsYWNlbWVudFxuICAgKiBidXQgaGF2ZSBhIHN1Y2NpbmN0IGxvY2FsaXplZCBzdHJpbmcgYW5kIG5vdCByZXF1aXJlIGBlbi5qc29uYCB0byBiZSBpbmNsdWRlZC5cbiAgICpcbiAgICogQ3VycmVudGx5LCBpdCBpcyB1c2VkIGZvciB0aGUgcHJvZ3Jlc3MgYmFyIHRpbWluZy5cbiAgICogYGBganNcbiAgICoge1xuICAgKiAgIFwicHJvZ3Jlc3MgYmFyIHRpbWluZzogY3VycmVudFRpbWU9ezF9IGR1cmF0aW9uPXsyfVwiOiBcInsxfSBvZiB7Mn1cIlxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBJdCBpcyB0aGVuIHVzZWQgbGlrZSBzbzpcbiAgICogYGBganNcbiAgICogdGhpcy5sb2NhbGl6ZSgncHJvZ3Jlc3MgYmFyIHRpbWluZzogY3VycmVudFRpbWU9ezF9IGR1cmF0aW9uezJ9JyxcbiAgICogICAgICAgICAgICAgICBbdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCksIHRoaXMucGxheWVyXy5kdXJhdGlvbigpXSxcbiAgICogICAgICAgICAgICAgICAnezF9IG9mIHsyfScpO1xuICAgKiBgYGBcbiAgICpcbiAgICogV2hpY2ggb3V0cHV0cyBzb21ldGhpbmcgbGlrZTogYDAxOjIzIG9mIDI0OjU2YC5cbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiAgICAgICAgVGhlIHN0cmluZyB0byBsb2NhbGl6ZSBhbmQgdGhlIGtleSB0byBsb29rdXAgaW4gdGhlIGxhbmd1YWdlIGZpbGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdG9rZW5zXVxuICAgKiAgICAgICAgSWYgdGhlIGN1cnJlbnQgaXRlbSBoYXMgdG9rZW4gcmVwbGFjZW1lbnRzLCBwcm92aWRlIHRoZSB0b2tlbnMgaGVyZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZWZhdWx0VmFsdWVdXG4gICAqICAgICAgICBEZWZhdWx0cyB0byBgc3RyaW5nYC4gQ2FuIGJlIGEgZGVmYXVsdCB2YWx1ZSB0byB1c2UgZm9yIHRva2VuIHJlcGxhY2VtZW50XG4gICAqICAgICAgICBpZiB0aGUgbG9va3VwIGtleSBpcyBuZWVkZWQgdG8gYmUgc2VwYXJhdGUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgbG9jYWxpemVkIHN0cmluZyBvciBpZiBubyBsb2NhbGl6YXRpb24gZXhpc3RzIHRoZSBlbmdsaXNoIHN0cmluZy5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmxvY2FsaXplID0gZnVuY3Rpb24gbG9jYWxpemUoc3RyaW5nLCB0b2tlbnMpIHtcbiAgICB2YXIgZGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBzdHJpbmc7XG5cbiAgICB2YXIgY29kZSA9IHRoaXMucGxheWVyXy5sYW5ndWFnZSAmJiB0aGlzLnBsYXllcl8ubGFuZ3VhZ2UoKTtcbiAgICB2YXIgbGFuZ3VhZ2VzID0gdGhpcy5wbGF5ZXJfLmxhbmd1YWdlcyAmJiB0aGlzLnBsYXllcl8ubGFuZ3VhZ2VzKCk7XG4gICAgdmFyIGxhbmd1YWdlID0gbGFuZ3VhZ2VzICYmIGxhbmd1YWdlc1tjb2RlXTtcbiAgICB2YXIgcHJpbWFyeUNvZGUgPSBjb2RlICYmIGNvZGUuc3BsaXQoJy0nKVswXTtcbiAgICB2YXIgcHJpbWFyeUxhbmcgPSBsYW5ndWFnZXMgJiYgbGFuZ3VhZ2VzW3ByaW1hcnlDb2RlXTtcblxuICAgIHZhciBsb2NhbGl6ZWRTdHJpbmcgPSBkZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAobGFuZ3VhZ2UgJiYgbGFuZ3VhZ2Vbc3RyaW5nXSkge1xuICAgICAgbG9jYWxpemVkU3RyaW5nID0gbGFuZ3VhZ2Vbc3RyaW5nXTtcbiAgICB9IGVsc2UgaWYgKHByaW1hcnlMYW5nICYmIHByaW1hcnlMYW5nW3N0cmluZ10pIHtcbiAgICAgIGxvY2FsaXplZFN0cmluZyA9IHByaW1hcnlMYW5nW3N0cmluZ107XG4gICAgfVxuXG4gICAgaWYgKHRva2Vucykge1xuICAgICAgbG9jYWxpemVkU3RyaW5nID0gbG9jYWxpemVkU3RyaW5nLnJlcGxhY2UoL1xceyhcXGQrKVxcfS9nLCBmdW5jdGlvbiAobWF0Y2gsIGluZGV4KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRva2Vuc1tpbmRleCAtIDFdO1xuICAgICAgICB2YXIgcmV0ID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXQgPSBtYXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9jYWxpemVkU3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGBDb21wb25lbnRgcyBET00gZWxlbWVudC4gVGhpcyBpcyB3aGVyZSBjaGlsZHJlbiBnZXQgaW5zZXJ0ZWQuXG4gICAqIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHRoZSB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCByZXR1cm5lZCBpbiB7QGxpbmsgQ29tcG9uZW50I2VsfS5cbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgY29udGVudCBlbGVtZW50IGZvciB0aGlzIGBDb21wb25lbnRgLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY29udGVudEVsID0gZnVuY3Rpb24gY29udGVudEVsKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRFbF8gfHwgdGhpcy5lbF87XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGlzIGBDb21wb25lbnRgcyBJRFxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIGlkIG9mIHRoaXMgYENvbXBvbmVudGBcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmlkID0gZnVuY3Rpb24gaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWRfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGBDb21wb25lbnRgcyBuYW1lLiBUaGUgbmFtZSBnZXRzIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBgQ29tcG9uZW50YFxuICAgKiBhbmQgaXMgc2V0IGR1cmluZyByZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgbmFtZSBvZiB0aGlzIGBDb21wb25lbnRgLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uIG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZV87XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiBhbGwgY2hpbGQgY29tcG9uZW50c1xuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICogICAgICAgICBUaGUgY2hpbGRyZW5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmNoaWxkcmVuID0gZnVuY3Rpb24gY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5fO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjaGlsZCBgQ29tcG9uZW50YCB3aXRoIHRoZSBnaXZlbiBgaWRgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICogICAgICAgIFRoZSBpZCBvZiB0aGUgY2hpbGQgYENvbXBvbmVudGAgdG8gZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIFRoZSBjaGlsZCBgQ29tcG9uZW50YCB3aXRoIHRoZSBnaXZlbiBgaWRgIG9yIHVuZGVmaW5lZC5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmdldENoaWxkQnlJZCA9IGZ1bmN0aW9uIGdldENoaWxkQnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkSW5kZXhfW2lkXTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hpbGQgYENvbXBvbmVudGAgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNoaWxkIGBDb21wb25lbnRgIHRvIGdldC5cbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fHVuZGVmaW5lZH1cbiAgICogICAgICAgICBUaGUgY2hpbGQgYENvbXBvbmVudGAgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgIG9yIHVuZGVmaW5lZC5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gZ2V0Q2hpbGQobmFtZSkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5hbWUgPSB0b1RpdGxlQ2FzZShuYW1lKTtcblxuICAgIHJldHVybiB0aGlzLmNoaWxkTmFtZUluZGV4X1tuYW1lXTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGEgY2hpbGQgYENvbXBvbmVudGAgaW5zaWRlIHRoZSBjdXJyZW50IGBDb21wb25lbnRgLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xDb21wb25lbnR9IGNoaWxkXG4gICAqICAgICAgICBUaGUgbmFtZSBvciBpbnN0YW5jZSBvZiBhIGNoaWxkIHRvIGFkZC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBvcHRpb25zIHRoYXQgd2lsbCBnZXQgcGFzc2VkIHRvIGNoaWxkcmVuIG9mXG4gICAqICAgICAgICB0aGUgY2hpbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaW5kZXg9dGhpcy5jaGlsZHJlbl8ubGVuZ3RoXVxuICAgKiAgICAgICAgVGhlIGluZGV4IHRvIGF0dGVtcHQgdG8gYWRkIGEgY2hpbGQgaW50by5cbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiAgICAgICAgIFRoZSBgQ29tcG9uZW50YCB0aGF0IGdldHMgYWRkZWQgYXMgYSBjaGlsZC4gV2hlbiB1c2luZyBhIHN0cmluZyB0aGVcbiAgICogICAgICAgICBgQ29tcG9uZW50YCB3aWxsIGdldCBjcmVhdGVkIGJ5IHRoaXMgcHJvY2Vzcy5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24gYWRkQ2hpbGQoY2hpbGQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdmFyIGluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0aGlzLmNoaWxkcmVuXy5sZW5ndGg7XG5cbiAgICB2YXIgY29tcG9uZW50ID0gdm9pZCAwO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gdm9pZCAwO1xuXG4gICAgLy8gSWYgY2hpbGQgaXMgYSBzdHJpbmcsIGNyZWF0ZSBjb21wb25lbnQgd2l0aCBvcHRpb25zXG4gICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSB0b1RpdGxlQ2FzZShjaGlsZCk7XG5cbiAgICAgIHZhciBjb21wb25lbnRDbGFzc05hbWUgPSBvcHRpb25zLmNvbXBvbmVudENsYXNzIHx8IGNvbXBvbmVudE5hbWU7XG5cbiAgICAgIC8vIFNldCBuYW1lIHRocm91Z2ggb3B0aW9uc1xuICAgICAgb3B0aW9ucy5uYW1lID0gY29tcG9uZW50TmFtZTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCAmIGVsZW1lbnQgZm9yIHRoaXMgY29udHJvbHMgc2V0XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIC5wbGF5ZXJfLCB0aGlzIGlzIGEgcGxheWVyXG4gICAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KGNvbXBvbmVudENsYXNzTmFtZSk7XG5cbiAgICAgIGlmICghQ29tcG9uZW50Q2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgJyArIGNvbXBvbmVudENsYXNzTmFtZSArICcgZG9lcyBub3QgZXhpc3QnKTtcbiAgICAgIH1cblxuICAgICAgLy8gZGF0YSBzdG9yZWQgZGlyZWN0bHkgb24gdGhlIHZpZGVvanMgb2JqZWN0IG1heSBiZVxuICAgICAgLy8gbWlzaWRlbnRpZmllZCBhcyBhIGNvbXBvbmVudCB0byByZXRhaW5cbiAgICAgIC8vIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggNC54LiBjaGVjayB0byBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb21wb25lbnQgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZC5cbiAgICAgIGlmICh0eXBlb2YgQ29tcG9uZW50Q2xhc3MgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRDbGFzcyh0aGlzLnBsYXllcl8gfHwgdGhpcywgb3B0aW9ucyk7XG5cbiAgICAgIC8vIGNoaWxkIGlzIGEgY29tcG9uZW50IGluc3RhbmNlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudCA9IGNoaWxkO1xuICAgIH1cblxuICAgIHRoaXMuY2hpbGRyZW5fLnNwbGljZShpbmRleCwgMCwgY29tcG9uZW50KTtcblxuICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmNoaWxkSW5kZXhfW2NvbXBvbmVudC5pZCgpXSA9IGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBhIG5hbWUgd2Fzbid0IHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQsIGNoZWNrIGlmIHdlIGNhbiB1c2UgdGhlXG4gICAgLy8gbmFtZSBmdW5jdGlvbiBvZiB0aGUgY29tcG9uZW50XG4gICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgY29tcG9uZW50Lm5hbWUgJiYgdG9UaXRsZUNhc2UoY29tcG9uZW50Lm5hbWUoKSk7XG5cbiAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgdGhpcy5jaGlsZE5hbWVJbmRleF9bY29tcG9uZW50TmFtZV0gPSBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBVSSBvYmplY3QncyBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgZGl2IChib3gpXG4gICAgLy8gSGF2aW5nIGFuIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZWwgPT09ICdmdW5jdGlvbicgJiYgY29tcG9uZW50LmVsKCkpIHtcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gdGhpcy5jb250ZW50RWwoKS5jaGlsZHJlbjtcbiAgICAgIHZhciByZWZOb2RlID0gY2hpbGROb2Rlc1tpbmRleF0gfHwgbnVsbDtcblxuICAgICAgdGhpcy5jb250ZW50RWwoKS5pbnNlcnRCZWZvcmUoY29tcG9uZW50LmVsKCksIHJlZk5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBzbyBpdCBjYW4gc3RvcmVkIG9uIHBhcmVudCBvYmplY3QgaWYgZGVzaXJlZC5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjaGlsZCBgQ29tcG9uZW50YCBmcm9tIHRoaXMgYENvbXBvbmVudGBzIGxpc3Qgb2YgY2hpbGRyZW4uIEFsc28gcmVtb3Zlc1xuICAgKiB0aGUgY2hpbGQgYENvbXBvbmVudGBzIGVsZW1lbnQgZnJvbSB0aGlzIGBDb21wb25lbnRgcyBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50XG4gICAqICAgICAgICBUaGUgY2hpbGQgYENvbXBvbmVudGAgdG8gcmVtb3ZlLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiByZW1vdmVDaGlsZChjb21wb25lbnQpIHtcbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbXBvbmVudCA9IHRoaXMuZ2V0Q2hpbGQoY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5jaGlsZHJlbl8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRGb3VuZCA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IHRoaXMuY2hpbGRyZW5fLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodGhpcy5jaGlsZHJlbl9baV0gPT09IGNvbXBvbmVudCkge1xuICAgICAgICBjaGlsZEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbl8uc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkRm91bmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNoaWxkSW5kZXhfW2NvbXBvbmVudC5pZCgpXSA9IG51bGw7XG4gICAgdGhpcy5jaGlsZE5hbWVJbmRleF9bY29tcG9uZW50Lm5hbWUoKV0gPSBudWxsO1xuXG4gICAgdmFyIGNvbXBFbCA9IGNvbXBvbmVudC5lbCgpO1xuXG4gICAgaWYgKGNvbXBFbCAmJiBjb21wRWwucGFyZW50Tm9kZSA9PT0gdGhpcy5jb250ZW50RWwoKSkge1xuICAgICAgdGhpcy5jb250ZW50RWwoKS5yZW1vdmVDaGlsZChjb21wb25lbnQuZWwoKSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYW5kIGluaXRpYWxpemUgZGVmYXVsdCBjaGlsZCBgQ29tcG9uZW50YHMgYmFzZWQgdXBvbiBvcHRpb25zLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdENoaWxkcmVuID0gZnVuY3Rpb24gaW5pdENoaWxkcmVuKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLm9wdGlvbnNfLmNoaWxkcmVuO1xuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAvLyBgdGhpc2AgaXMgYHBhcmVudGBcbiAgICAgIHZhciBwYXJlbnRPcHRpb25zID0gdGhpcy5vcHRpb25zXztcblxuICAgICAgdmFyIGhhbmRsZUFkZCA9IGZ1bmN0aW9uIGhhbmRsZUFkZChjaGlsZCkge1xuICAgICAgICB2YXIgbmFtZSA9IGNoaWxkLm5hbWU7XG4gICAgICAgIHZhciBvcHRzID0gY2hpbGQub3B0cztcblxuICAgICAgICAvLyBBbGxvdyBvcHRpb25zIGZvciBjaGlsZHJlbiB0byBiZSBzZXQgYXQgdGhlIHBhcmVudCBvcHRpb25zXG4gICAgICAgIC8vIGUuZy4gdmlkZW9qcyhpZCwgeyBjb250cm9sQmFyOiBmYWxzZSB9KTtcbiAgICAgICAgLy8gaW5zdGVhZCBvZiB2aWRlb2pzKGlkLCB7IGNoaWxkcmVuOiB7IGNvbnRyb2xCYXI6IGZhbHNlIH0pO1xuICAgICAgICBpZiAocGFyZW50T3B0aW9uc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3B0cyA9IHBhcmVudE9wdGlvbnNbbmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBmb3IgZGlzYWJsaW5nIGRlZmF1bHQgY29tcG9uZW50c1xuICAgICAgICAvLyBlLmcuIG9wdGlvbnNbJ2NoaWxkcmVuJ11bJ3Bvc3RlckltYWdlJ10gPSBmYWxzZVxuICAgICAgICBpZiAob3B0cyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGxvdyBvcHRpb25zIHRvIGJlIHBhc3NlZCBhcyBhIHNpbXBsZSBib29sZWFuIGlmIG5vIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgLy8gaXMgbmVjZXNzYXJ5LlxuICAgICAgICBpZiAob3B0cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGFsc28gd2FudCB0byBwYXNzIHRoZSBvcmlnaW5hbCBwbGF5ZXIgb3B0aW9uc1xuICAgICAgICAvLyB0byBlYWNoIGNvbXBvbmVudCBhcyB3ZWxsIHNvIHRoZXkgZG9uJ3QgbmVlZCB0b1xuICAgICAgICAvLyByZWFjaCBiYWNrIGludG8gdGhlIHBsYXllciBmb3Igb3B0aW9ucyBsYXRlci5cbiAgICAgICAgb3B0cy5wbGF5ZXJPcHRpb25zID0gX3RoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucztcblxuICAgICAgICAvLyBDcmVhdGUgYW5kIGFkZCB0aGUgY2hpbGQgY29tcG9uZW50LlxuICAgICAgICAvLyBBZGQgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBjaGlsZCBieSBuYW1lIG9uIHRoZSBwYXJlbnQgaW5zdGFuY2UuXG4gICAgICAgIC8vIElmIHR3byBvZiB0aGUgc2FtZSBjb21wb25lbnQgYXJlIHVzZWQsIGRpZmZlcmVudCBuYW1lcyBzaG91bGQgYmUgc3VwcGxpZWRcbiAgICAgICAgLy8gZm9yIGVhY2hcbiAgICAgICAgdmFyIG5ld0NoaWxkID0gX3RoaXMuYWRkQ2hpbGQobmFtZSwgb3B0cyk7XG5cbiAgICAgICAgaWYgKG5ld0NoaWxkKSB7XG4gICAgICAgICAgX3RoaXNbbmFtZV0gPSBuZXdDaGlsZDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gQWxsb3cgZm9yIGFuIGFycmF5IG9mIGNoaWxkcmVuIGRldGFpbHMgdG8gcGFzc2VkIGluIHRoZSBvcHRpb25zXG4gICAgICB2YXIgd29ya2luZ0NoaWxkcmVuID0gdm9pZCAwO1xuICAgICAgdmFyIFRlY2ggPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KCdUZWNoJyk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICB3b3JraW5nQ2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdvcmtpbmdDaGlsZHJlbiA9IE9iamVjdC5rZXlzKGNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgd29ya2luZ0NoaWxkcmVuXG4gICAgICAvLyBjaGlsZHJlbiB0aGF0IGFyZSBpbiB0aGlzLm9wdGlvbnNfIGJ1dCBhbHNvIGluIHdvcmtpbmdDaGlsZHJlbiAgd291bGRcbiAgICAgIC8vIGdpdmUgdXMgZXh0cmEgY2hpbGRyZW4gd2UgZG8gbm90IHdhbnQuIFNvLCB3ZSB3YW50IHRvIGZpbHRlciB0aGVtIG91dC5cbiAgICAgIC5jb25jYXQoT2JqZWN0LmtleXModGhpcy5vcHRpb25zXykuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gIXdvcmtpbmdDaGlsZHJlbi5zb21lKGZ1bmN0aW9uICh3Y2hpbGQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHdjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZCA9PT0gd2NoaWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2hpbGQgPT09IHdjaGlsZC5uYW1lO1xuICAgICAgICB9KTtcbiAgICAgIH0pKS5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBuYW1lID0gdm9pZCAwO1xuICAgICAgICB2YXIgb3B0cyA9IHZvaWQgMDtcblxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG5hbWUgPSBjaGlsZDtcbiAgICAgICAgICBvcHRzID0gY2hpbGRyZW5bbmFtZV0gfHwgX3RoaXMub3B0aW9uc19bbmFtZV0gfHwge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmFtZSA9IGNoaWxkLm5hbWU7XG4gICAgICAgICAgb3B0cyA9IGNoaWxkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogbmFtZSwgb3B0czogb3B0cyB9O1xuICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAvLyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IGNoaWxkLm5hbWUgaXNuJ3QgaW4gdGhlIHRlY2hPcmRlciBzaW5jZVxuICAgICAgICAvLyB0ZWNocyBhcmUgcmVnaXN0ZXJkIGFzIENvbXBvbmVudHMgYnV0IGNhbid0IGFyZW4ndCBjb21wYXRpYmxlXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdmlkZW9qcy92aWRlby5qcy9pc3N1ZXMvMjc3MlxuICAgICAgICB2YXIgYyA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoY2hpbGQub3B0cy5jb21wb25lbnRDbGFzcyB8fCB0b1RpdGxlQ2FzZShjaGlsZC5uYW1lKSk7XG5cbiAgICAgICAgcmV0dXJuIGMgJiYgIVRlY2guaXNUZWNoKGMpO1xuICAgICAgfSkuZm9yRWFjaChoYW5kbGVBZGQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBjbGFzcyBuYW1lLiBTaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IHN1Yi1jb21wb25lbnRzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBjbGFzcyBuYW1lIGZvciB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICAvLyBDaGlsZCBjbGFzc2VzIGNhbiBpbmNsdWRlIGEgZnVuY3Rpb24gdGhhdCBkb2VzOlxuICAgIC8vIHJldHVybiAnQ0xBU1MgTkFNRScgKyB0aGlzLl9zdXBlcigpO1xuICAgIHJldHVybiAnJztcbiAgfTtcblxuICAvKipcbiAgICogQmluZCBhIGxpc3RlbmVyIHRvIHRoZSBjb21wb25lbnQncyByZWFkeSBzdGF0ZS5cbiAgICogRGlmZmVyZW50IGZyb20gZXZlbnQgbGlzdGVuZXJzIGluIHRoYXQgaWYgdGhlIHJlYWR5IGV2ZW50IGhhcyBhbHJlYWR5IGhhcHBlbmVkXG4gICAqIGl0IHdpbGwgdHJpZ2dlciB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAgICogICAgICAgICBSZXR1cm5zIGl0c2VsZjsgbWV0aG9kIGNhbiBiZSBjaGFpbmVkLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUucmVhZHkgPSBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIHZhciBzeW5jID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNSZWFkeV8pIHtcbiAgICAgIHRoaXMucmVhZHlRdWV1ZV8gPSB0aGlzLnJlYWR5UXVldWVfIHx8IFtdO1xuICAgICAgdGhpcy5yZWFkeVF1ZXVlXy5wdXNoKGZuKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgZm4uY2FsbCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gYXN5bmNocm9ub3VzbHkgYnkgZGVmYXVsdCBmb3IgY29uc2lzdGVuY3lcbiAgICAgIHRoaXMuc2V0VGltZW91dChmbiwgMSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFsbCB0aGUgcmVhZHkgbGlzdGVuZXJzIGZvciB0aGlzIGBDb21wb25lbnRgLlxuICAgKlxuICAgKiBAZmlyZXMgQ29tcG9uZW50I3JlYWR5XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS50cmlnZ2VyUmVhZHkgPSBmdW5jdGlvbiB0cmlnZ2VyUmVhZHkoKSB7XG4gICAgdGhpcy5pc1JlYWR5XyA9IHRydWU7XG5cbiAgICAvLyBFbnN1cmUgcmVhZHkgaXMgdHJpZ2dlcmVkIGFzeW5jaHJvbm91c2x5XG4gICAgdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByZWFkeVF1ZXVlID0gdGhpcy5yZWFkeVF1ZXVlXztcblxuICAgICAgLy8gUmVzZXQgUmVhZHkgUXVldWVcbiAgICAgIHRoaXMucmVhZHlRdWV1ZV8gPSBbXTtcblxuICAgICAgaWYgKHJlYWR5UXVldWUgJiYgcmVhZHlRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlYWR5UXVldWUuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICBmbi5jYWxsKHRoaXMpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWxsb3cgZm9yIHVzaW5nIGV2ZW50IGxpc3RlbmVycyBhbHNvXG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgYENvbXBvbmVudGAgaXMgcmVhZHkuXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50IENvbXBvbmVudCNyZWFkeVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ3JlYWR5Jyk7XG4gICAgfSwgMSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBzaW5nbGUgRE9NIGVsZW1lbnQgbWF0Y2hpbmcgYSBgc2VsZWN0b3JgLiBUaGlzIGNhbiBiZSB3aXRoaW4gdGhlIGBDb21wb25lbnRgc1xuICAgKiBgY29udGVudEVsKClgIG9yIGFub3RoZXIgY3VzdG9tIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yYC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gW2NvbnRleHQ9dGhpcy5jb250ZW50RWwoKV1cbiAgICogICAgICAgIEEgRE9NIGVsZW1lbnQgd2l0aGluIHdoaWNoIHRvIHF1ZXJ5LiBDYW4gYWxzbyBiZSBhIHNlbGVjdG9yIHN0cmluZyBpblxuICAgKiAgICAgICAgd2hpY2ggY2FzZSB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCB3aWxsIGdldCB1c2VkIGFzIGNvbnRleHQuIElmXG4gICAqICAgICAgICBtaXNzaW5nIGB0aGlzLmNvbnRlbnRFbCgpYCBnZXRzIHVzZWQuIElmICBgdGhpcy5jb250ZW50RWwoKWAgcmV0dXJuc1xuICAgKiAgICAgICAgbm90aGluZyBpdCBmYWxscyBiYWNrIHRvIGBkb2N1bWVudGAuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICogICAgICAgICB0aGUgZG9tIGVsZW1lbnQgdGhhdCB3YXMgZm91bmQsIG9yIG51bGxcbiAgICpcbiAgICogQHNlZSBbSW5mb3JtYXRpb24gb24gQ1NTIFNlbGVjdG9yc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvR3VpZGUvQ1NTL0dldHRpbmdfU3RhcnRlZC9TZWxlY3RvcnMpXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS4kID0gZnVuY3Rpb24gJCQkMShzZWxlY3RvciwgY29udGV4dCkge1xuICAgIHJldHVybiAkKHNlbGVjdG9yLCBjb250ZXh0IHx8IHRoaXMuY29udGVudEVsKCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgRE9NIGVsZW1lbnQgbWF0Y2hpbmcgYSBgc2VsZWN0b3JgLiBUaGlzIGNhbiBiZSB3aXRoaW4gdGhlIGBDb21wb25lbnRgc1xuICAgKiBgY29udGVudEVsKClgIG9yIGFub3RoZXIgY3VzdG9tIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yQWxsYC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gW2NvbnRleHQ9dGhpcy5jb250ZW50RWwoKV1cbiAgICogICAgICAgIEEgRE9NIGVsZW1lbnQgd2l0aGluIHdoaWNoIHRvIHF1ZXJ5LiBDYW4gYWxzbyBiZSBhIHNlbGVjdG9yIHN0cmluZyBpblxuICAgKiAgICAgICAgd2hpY2ggY2FzZSB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCB3aWxsIGdldCB1c2VkIGFzIGNvbnRleHQuIElmXG4gICAqICAgICAgICBtaXNzaW5nIGB0aGlzLmNvbnRlbnRFbCgpYCBnZXRzIHVzZWQuIElmICBgdGhpcy5jb250ZW50RWwoKWAgcmV0dXJuc1xuICAgKiAgICAgICAgbm90aGluZyBpdCBmYWxscyBiYWNrIHRvIGBkb2N1bWVudGAuXG4gICAqXG4gICAqIEByZXR1cm4ge05vZGVMaXN0fVxuICAgKiAgICAgICAgIGEgbGlzdCBvZiBkb20gZWxlbWVudHMgdGhhdCB3ZXJlIGZvdW5kXG4gICAqXG4gICAqIEBzZWUgW0luZm9ybWF0aW9uIG9uIENTUyBTZWxlY3RvcnNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0d1aWRlL0NTUy9HZXR0aW5nX1N0YXJ0ZWQvU2VsZWN0b3JzKVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuJCQgPSBmdW5jdGlvbiAkJCQkMShzZWxlY3RvciwgY29udGV4dCkge1xuICAgIHJldHVybiAkJChzZWxlY3RvciwgY29udGV4dCB8fCB0aGlzLmNvbnRlbnRFbCgpKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQncyBlbGVtZW50IGhhcyBhIENTUyBjbGFzcyBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb0NoZWNrXG4gICAqICAgICAgICBDU1MgY2xhc3MgbmFtZSB0byBjaGVjay5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICAtIFRydWUgaWYgdGhlIGBDb21wb25lbnRgIGhhcyB0aGUgY2xhc3MuXG4gICAqICAgICAgICAgLSBGYWxzZSBpZiB0aGUgYENvbXBvbmVudGAgZG9lcyBub3QgaGF2ZSB0aGUgY2xhc3NgXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5oYXNDbGFzcyA9IGZ1bmN0aW9uIGhhc0NsYXNzJCQxKGNsYXNzVG9DaGVjaykge1xuICAgIHJldHVybiBoYXNDbGFzcyh0aGlzLmVsXywgY2xhc3NUb0NoZWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGEgQ1NTIGNsYXNzIG5hbWUgdG8gdGhlIGBDb21wb25lbnRgcyBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb0FkZFxuICAgKiAgICAgICAgQ1NTIGNsYXNzIG5hbWUgdG8gYWRkXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5hZGRDbGFzcyA9IGZ1bmN0aW9uIGFkZENsYXNzJCQxKGNsYXNzVG9BZGQpIHtcbiAgICBhZGRDbGFzcyh0aGlzLmVsXywgY2xhc3NUb0FkZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIENTUyBjbGFzcyBuYW1lIGZyb20gdGhlIGBDb21wb25lbnRgcyBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb1JlbW92ZVxuICAgKiAgICAgICAgQ1NTIGNsYXNzIG5hbWUgdG8gcmVtb3ZlXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIHJlbW92ZUNsYXNzJCQxKGNsYXNzVG9SZW1vdmUpIHtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmVsXywgY2xhc3NUb1JlbW92ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBvciByZW1vdmUgYSBDU1MgY2xhc3MgbmFtZSBmcm9tIHRoZSBjb21wb25lbnQncyBlbGVtZW50LlxuICAgKiAtIGBjbGFzc1RvVG9nZ2xlYCBnZXRzIGFkZGVkIHdoZW4ge0BsaW5rIENvbXBvbmVudCNoYXNDbGFzc30gd291bGQgcmV0dXJuIGZhbHNlLlxuICAgKiAtIGBjbGFzc1RvVG9nZ2xlYCBnZXRzIHJlbW92ZWQgd2hlbiB7QGxpbmsgQ29tcG9uZW50I2hhc0NsYXNzfSB3b3VsZCByZXR1cm4gdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSBjbGFzc1RvVG9nZ2xlXG4gICAqICAgICAgICAgVGhlIGNsYXNzIHRvIGFkZCBvciByZW1vdmUgYmFzZWQgb24gKEBsaW5rIENvbXBvbmVudCNoYXNDbGFzc31cbiAgICpcbiAgICogQHBhcmFtICB7Ym9vbGVhbnxEb21+cHJlZGljYXRlfSBbcHJlZGljYXRlXVxuICAgKiAgICAgICAgIEFuIHtAbGluayBEb21+cHJlZGljYXRlfSBmdW5jdGlvbiBvciBhIGJvb2xlYW5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLnRvZ2dsZUNsYXNzID0gZnVuY3Rpb24gdG9nZ2xlQ2xhc3MkJDEoY2xhc3NUb1RvZ2dsZSwgcHJlZGljYXRlKSB7XG4gICAgdG9nZ2xlQ2xhc3ModGhpcy5lbF8sIGNsYXNzVG9Ub2dnbGUsIHByZWRpY2F0ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIGBDb21wb25lbnRgcyBlbGVtZW50IGlmIGl0IGlzIGhpZGRlbiBieSByZW1vdmluZyB0aGVcbiAgICogJ3Zqcy1oaWRkZW4nIGNsYXNzIG5hbWUgZnJvbSBpdC5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiBzaG93KCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgfTtcblxuICAvKipcbiAgICogSGlkZSB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQgaWYgaXQgaXMgY3VycmVudGx5IHNob3dpbmcgYnkgYWRkaW5nIHRoZVxuICAgKiAndmpzLWhpZGRlbmAgY2xhc3MgbmFtZSB0byBpdC5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkge1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgfTtcblxuICAvKipcbiAgICogTG9jayBhIGBDb21wb25lbnRgcyBlbGVtZW50IGluIGl0cyB2aXNpYmxlIHN0YXRlIGJ5IGFkZGluZyB0aGUgJ3Zqcy1sb2NrLXNob3dpbmcnXG4gICAqIGNsYXNzIG5hbWUgdG8gaXQuIFVzZWQgZHVyaW5nIGZhZGVJbi9mYWRlT3V0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUubG9ja1Nob3dpbmcgPSBmdW5jdGlvbiBsb2NrU2hvd2luZygpIHtcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtbG9jay1zaG93aW5nJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVubG9jayBhIGBDb21wb25lbnRgcyBlbGVtZW50IGZyb20gaXRzIHZpc2libGUgc3RhdGUgYnkgcmVtb3ZpbmcgdGhlICd2anMtbG9jay1zaG93aW5nJ1xuICAgKiBjbGFzcyBuYW1lIGZyb20gaXQuIFVzZWQgZHVyaW5nIGZhZGVJbi9mYWRlT3V0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUudW5sb2NrU2hvd2luZyA9IGZ1bmN0aW9uIHVubG9ja1Nob3dpbmcoKSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWxvY2stc2hvd2luZycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBvbiB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBnZXQgdGhlIHZhbHVlIGZyb20uXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCB3YXMgYXNrZWQgZm9yLlxuICAgKiAgICAgICAgIC0gQ2FuIGJlIGFuIGVtcHR5IHN0cmluZyBvbiBzb21lIGJyb3dzZXJzIGlmIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgZXhpc3RcbiAgICogICAgICAgICAgIG9yIGhhcyBubyB2YWx1ZVxuICAgKiAgICAgICAgIC0gTW9zdCBicm93c2VycyB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBhdHRpYnV0ZSBkb2VzIG5vdCBleGlzdCBvciBoYXNcbiAgICogICAgICAgICAgIG5vIHZhbHVlLlxuICAgKlxuICAgKiBAc2VlIFtET00gQVBJXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRBdHRyaWJ1dGV9XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBnZXRBdHRyaWJ1dGUkJDEoYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0aGlzLmVsXywgYXR0cmlidXRlKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb24gdGhlIGBDb21wb25lbnRgJ3MgZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqICAgICAgICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogICAgICAgIFZhbHVlIHRvIHNldCB0aGUgYXR0cmlidXRlIHRvLlxuICAgKlxuICAgKiBAc2VlIFtET00gQVBJXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9zZXRBdHRyaWJ1dGV9XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBzZXRBdHRyaWJ1dGUkJDEoYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIHNldEF0dHJpYnV0ZSh0aGlzLmVsXywgYXR0cmlidXRlLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUuXG4gICAqXG4gICAqIEBzZWUgW0RPTSBBUElde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3JlbW92ZUF0dHJpYnV0ZX1cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZSQkMShhdHRyaWJ1dGUpIHtcbiAgICByZW1vdmVBdHRyaWJ1dGUodGhpcy5lbF8sIGF0dHJpYnV0ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIHdpZHRoIG9mIHRoZSBjb21wb25lbnQgYmFzZWQgdXBvbiB0aGUgQ1NTIHN0eWxlcy5cbiAgICogU2VlIHtAbGluayBDb21wb25lbnQjZGltZW5zaW9ufSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBbbnVtXVxuICAgKiAgICAgICAgVGhlIHdpZHRoIHRoYXQgeW91IHdhbnQgdG8gc2V0IHBvc3RmaXhlZCB3aXRoICclJywgJ3B4JyBvciBub3RoaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwTGlzdGVuZXJzXVxuICAgKiAgICAgICAgU2tpcCB0aGUgY29tcG9uZW50cmVzaXplIGV2ZW50IHRyaWdnZXJcbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfHN0cmluZ31cbiAgICogICAgICAgICBUaGUgd2lkdGggd2hlbiBnZXR0aW5nLCB6ZXJvIGlmIHRoZXJlIGlzIG5vIHdpZHRoLiBDYW4gYmUgYSBzdHJpbmdcbiAgICogICAgICAgICAgIHBvc3RwaXhlZCB3aXRoICclJyBvciAncHgnLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbiB3aWR0aChudW0sIHNraXBMaXN0ZW5lcnMpIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24oJ3dpZHRoJywgbnVtLCBza2lwTGlzdGVuZXJzKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IG9yIHNldCB0aGUgaGVpZ2h0IG9mIHRoZSBjb21wb25lbnQgYmFzZWQgdXBvbiB0aGUgQ1NTIHN0eWxlcy5cbiAgICogU2VlIHtAbGluayBDb21wb25lbnQjZGltZW5zaW9ufSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBbbnVtXVxuICAgKiAgICAgICAgVGhlIGhlaWdodCB0aGF0IHlvdSB3YW50IHRvIHNldCBwb3N0Zml4ZWQgd2l0aCAnJScsICdweCcgb3Igbm90aGluZy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbc2tpcExpc3RlbmVyc11cbiAgICogICAgICAgIFNraXAgdGhlIGNvbXBvbmVudHJlc2l6ZSBldmVudCB0cmlnZ2VyXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcnxzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIHdpZHRoIHdoZW4gZ2V0dGluZywgemVybyBpZiB0aGVyZSBpcyBubyB3aWR0aC4gQ2FuIGJlIGEgc3RyaW5nXG4gICAqICAgICAgICAgcG9zdHBpeGVkIHdpdGggJyUnIG9yICdweCcuXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlvbiBoZWlnaHQobnVtLCBza2lwTGlzdGVuZXJzKSB7XG4gICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uKCdoZWlnaHQnLCBudW0sIHNraXBMaXN0ZW5lcnMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgYm90aCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYENvbXBvbmVudGAgZWxlbWVudCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0gIHtudW1iZXJ8c3RyaW5nfSB3aWR0aFxuICAgKiAgICAgICAgIFdpZHRoIHRvIHNldCB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSAge251bWJlcnxzdHJpbmd9IGhlaWdodFxuICAgKiAgICAgICAgIEhlaWdodCB0byBzZXQgdGhlIGBDb21wb25lbnRgcyBlbGVtZW50IHRvLlxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuZGltZW5zaW9ucyA9IGZ1bmN0aW9uIGRpbWVuc2lvbnMod2lkdGgsIGhlaWdodCkge1xuICAgIC8vIFNraXAgY29tcG9uZW50cmVzaXplIGxpc3RlbmVycyBvbiB3aWR0aCBmb3Igb3B0aW1pemF0aW9uXG4gICAgdGhpcy53aWR0aCh3aWR0aCwgdHJ1ZSk7XG4gICAgdGhpcy5oZWlnaHQoaGVpZ2h0KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGBDb21wb25lbnRgIGVsZW1lbnQuIFRoaXMgaXMgdGhlIHNoYXJlZCBjb2RlXG4gICAqIGZvciB0aGUge0BsaW5rIENvbXBvbmVudCN3aWR0aH0gYW5kIHtAbGluayBDb21wb25lbnQjaGVpZ2h0fS5cbiAgICpcbiAgICogVGhpbmdzIHRvIGtub3c6XG4gICAqIC0gSWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpbiBhbiBudW1iZXIgdGhpcyB3aWxsIHJldHVybiB0aGUgbnVtYmVyIHBvc3RmaXhlZCB3aXRoICdweCcuXG4gICAqIC0gSWYgdGhlIHdpZHRoL2hlaWdodCBpcyBhIHBlcmNlbnQgdGhpcyB3aWxsIHJldHVybiB0aGUgcGVyY2VudCBwb3N0Zml4ZWQgd2l0aCAnJSdcbiAgICogLSBIaWRkZW4gZWxlbWVudHMgaGF2ZSBhIHdpZHRoIG9mIDAgd2l0aCBgd2luZG93LmdldENvbXB1dGVkU3R5bGVgLiBUaGlzIGZ1bmN0aW9uXG4gICAqICAgZGVmYXVsdHMgdG8gdGhlIGBDb21wb25lbnRgcyBgc3R5bGUud2lkdGhgIGFuZCBmYWxscyBiYWNrIHRvIGB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZWAuXG4gICAqICAgU2VlIFt0aGlzXXtAbGluayBodHRwOi8vd3d3LmZvbGlvdGVrLmNvbS9kZXZibG9nL2dldHRpbmctdGhlLXdpZHRoLW9mLWEtaGlkZGVuLWVsZW1lbnQtd2l0aC1qcXVlcnktdXNpbmctd2lkdGgvfVxuICAgKiAgIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAqIC0gSWYgeW91IHdhbnQgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIHRoZSBjb21wb25lbnQsIHVzZSB7QGxpbmsgQ29tcG9uZW50I2N1cnJlbnRXaWR0aH1cbiAgICogICBhbmQge0BsaW5rIHtDb21wb25lbnQjY3VycmVudEhlaWdodH1cbiAgICpcbiAgICogQGZpcmVzIENvbXBvbmVudCNjb21wb25lbnRyZXNpemVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdpZHRoT3JIZWlnaHRcbiAgIDggICAgICAgICd3aWR0aCcgb3IgJ2hlaWdodCdcbiAgICpcbiAgICogQHBhcmFtICB7bnVtYmVyfHN0cmluZ30gW251bV1cbiAgIDggICAgICAgICBOZXcgZGltZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IFtza2lwTGlzdGVuZXJzXVxuICAgKiAgICAgICAgIFNraXAgY29tcG9uZW50cmVzaXplIGV2ZW50IHRyaWdnZXJcbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFRoZSBkaW1lbnNpb24gd2hlbiBnZXR0aW5nIG9yIDAgaWYgdW5zZXRcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmRpbWVuc2lvbiA9IGZ1bmN0aW9uIGRpbWVuc2lvbih3aWR0aE9ySGVpZ2h0LCBudW0sIHNraXBMaXN0ZW5lcnMpIHtcbiAgICBpZiAobnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFNldCB0byB6ZXJvIGlmIG51bGwgb3IgbGl0ZXJhbGx5IE5hTiAoTmFOICE9PSBOYU4pXG4gICAgICBpZiAobnVtID09PSBudWxsIHx8IG51bSAhPT0gbnVtKSB7XG4gICAgICAgIG51bSA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHVzaW5nIGNzcyB3aWR0aC9oZWlnaHQgKCUgb3IgcHgpIGFuZCBhZGp1c3RcbiAgICAgIGlmICgoJycgKyBudW0pLmluZGV4T2YoJyUnKSAhPT0gLTEgfHwgKCcnICsgbnVtKS5pbmRleE9mKCdweCcpICE9PSAtMSkge1xuICAgICAgICB0aGlzLmVsXy5zdHlsZVt3aWR0aE9ySGVpZ2h0XSA9IG51bTtcbiAgICAgIH0gZWxzZSBpZiAobnVtID09PSAnYXV0bycpIHtcbiAgICAgICAgdGhpcy5lbF8uc3R5bGVbd2lkdGhPckhlaWdodF0gPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWxfLnN0eWxlW3dpZHRoT3JIZWlnaHRdID0gbnVtICsgJ3B4JztcbiAgICAgIH1cblxuICAgICAgLy8gc2tpcExpc3RlbmVycyBhbGxvd3MgdXMgdG8gYXZvaWQgdHJpZ2dlcmluZyB0aGUgcmVzaXplIGV2ZW50IHdoZW4gc2V0dGluZyBib3RoIHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgIGlmICghc2tpcExpc3RlbmVycykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjb21wb25lbnQgaXMgcmVzaXplZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IENvbXBvbmVudCNjb21wb25lbnRyZXNpemVcbiAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdjb21wb25lbnRyZXNpemUnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vdCBzZXR0aW5nIGEgdmFsdWUsIHNvIGdldHRpbmcgaXRcbiAgICAvLyBNYWtlIHN1cmUgZWxlbWVudCBleGlzdHNcbiAgICBpZiAoIXRoaXMuZWxfKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBHZXQgZGltZW5zaW9uIHZhbHVlIGZyb20gc3R5bGVcbiAgICB2YXIgdmFsID0gdGhpcy5lbF8uc3R5bGVbd2lkdGhPckhlaWdodF07XG4gICAgdmFyIHB4SW5kZXggPSB2YWwuaW5kZXhPZigncHgnKTtcblxuICAgIGlmIChweEluZGV4ICE9PSAtMSkge1xuICAgICAgLy8gUmV0dXJuIHRoZSBwaXhlbCB2YWx1ZSB3aXRoIG5vICdweCdcbiAgICAgIHJldHVybiBwYXJzZUludCh2YWwuc2xpY2UoMCwgcHhJbmRleCksIDEwKTtcbiAgICB9XG5cbiAgICAvLyBObyBweCBzbyB1c2luZyAlIG9yIG5vIHN0eWxlIHdhcyBzZXQsIHNvIGZhbGxpbmcgYmFjayB0byBvZmZzZXRXaWR0aC9oZWlnaHRcbiAgICAvLyBJZiBjb21wb25lbnQgaGFzIGRpc3BsYXk6bm9uZSwgb2Zmc2V0IHdpbGwgcmV0dXJuIDBcbiAgICAvLyBUT0RPOiBoYW5kbGUgZGlzcGxheTpub25lIGFuZCBubyBkaW1lbnNpb24gc3R5bGUgdXNpbmcgcHhcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5lbF9bJ29mZnNldCcgKyB0b1RpdGxlQ2FzZSh3aWR0aE9ySGVpZ2h0KV0sIDEwKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSB3aWR0aCBvciB0aGUgaGVpZ2h0IG9mIHRoZSBgQ29tcG9uZW50YCBlbGVtZW50cyBjb21wdXRlZCBzdHlsZS4gVXNlc1xuICAgKiBgd2luZG93LmdldENvbXB1dGVkU3R5bGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2lkdGhPckhlaWdodFxuICAgKiAgICAgICAgQSBzdHJpbmcgY29udGFpbmluZyAnd2lkdGgnIG9yICdoZWlnaHQnLiBXaGljaGV2ZXIgb25lIHlvdSB3YW50IHRvIGdldC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFRoZSBkaW1lbnNpb24gdGhhdCBnZXRzIGFza2VkIGZvciBvciAwIGlmIG5vdGhpbmcgd2FzIHNldFxuICAgKiAgICAgICAgIGZvciB0aGF0IGRpbWVuc2lvbi5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmN1cnJlbnREaW1lbnNpb24gPSBmdW5jdGlvbiBjdXJyZW50RGltZW5zaW9uKHdpZHRoT3JIZWlnaHQpIHtcbiAgICB2YXIgY29tcHV0ZWRXaWR0aE9ySGVpZ2h0ID0gMDtcblxuICAgIGlmICh3aWR0aE9ySGVpZ2h0ICE9PSAnd2lkdGgnICYmIHdpZHRoT3JIZWlnaHQgIT09ICdoZWlnaHQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2N1cnJlbnREaW1lbnNpb24gb25seSBhY2NlcHRzIHdpZHRoIG9yIGhlaWdodCB2YWx1ZScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbF8pO1xuXG4gICAgICBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUod2lkdGhPckhlaWdodCkgfHwgY29tcHV0ZWRTdHlsZVt3aWR0aE9ySGVpZ2h0XTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgJ3B4JyBmcm9tIHZhcmlhYmxlIGFuZCBwYXJzZSBhcyBpbnRlZ2VyXG4gICAgY29tcHV0ZWRXaWR0aE9ySGVpZ2h0ID0gcGFyc2VGbG9hdChjb21wdXRlZFdpZHRoT3JIZWlnaHQpO1xuXG4gICAgLy8gaWYgdGhlIGNvbXB1dGVkIHZhbHVlIGlzIHN0aWxsIDAsIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgYnJvd3NlciBpcyBseWluZ1xuICAgIC8vIGFuZCB3ZSB3YW50IHRvIGNoZWNrIHRoZSBvZmZzZXQgdmFsdWVzLlxuICAgIC8vIFRoaXMgY29kZSBhbHNvIHJ1bnMgb24gSUU4IGFuZCB3aGVyZXZlciBnZXRDb21wdXRlZFN0eWxlIGRvZXNuJ3QgZXhpc3QuXG4gICAgaWYgKGNvbXB1dGVkV2lkdGhPckhlaWdodCA9PT0gMCkge1xuICAgICAgdmFyIHJ1bGUgPSAnb2Zmc2V0JyArIHRvVGl0bGVDYXNlKHdpZHRoT3JIZWlnaHQpO1xuXG4gICAgICBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSB0aGlzLmVsX1tydWxlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcHV0ZWRXaWR0aE9ySGVpZ2h0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyBvZiB0aGUgYENvbXBvbmVudGBzXG4gICAqIGNvbXB1dGVkIHN0eWxlLiBVc2VzIGB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZWAuXG4gICAqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENvbXBvbmVudH5EaW1lbnNpb25PYmplY3RcbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoXG4gICAqICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIGBDb21wb25lbnRgcyBjb21wdXRlZCBzdHlsZS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodFxuICAgKiAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgYENvbXBvbmVudGBzIGNvbXB1dGVkIHN0eWxlLlxuICAgKi9cblxuICAvKipcbiAgICogR2V0IGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIG9mIHRoZSBgQ29tcG9uZW50YHNcbiAgICogY29tcHV0ZWQgc3R5bGUuXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH5EaW1lbnNpb25PYmplY3R9XG4gICAqICAgICAgICAgVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGNvbXBvbmVudHMgZWxlbWVudFxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY3VycmVudERpbWVuc2lvbnMgPSBmdW5jdGlvbiBjdXJyZW50RGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMuY3VycmVudERpbWVuc2lvbignd2lkdGgnKSxcbiAgICAgIGhlaWdodDogdGhpcy5jdXJyZW50RGltZW5zaW9uKCdoZWlnaHQnKVxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2lkdGggb2YgdGhlIGBDb21wb25lbnRgcyBjb21wdXRlZCBzdHlsZS4gVXNlcyBgd2luZG93LmdldENvbXB1dGVkU3R5bGVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IHdpZHRoXG4gICAqICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIGBDb21wb25lbnRgcyBjb21wdXRlZCBzdHlsZS5cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmN1cnJlbnRXaWR0aCA9IGZ1bmN0aW9uIGN1cnJlbnRXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RGltZW5zaW9uKCd3aWR0aCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhlaWdodCBvZiB0aGUgYENvbXBvbmVudGBzIGNvbXB1dGVkIHN0eWxlLiBVc2VzIGB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn0gaGVpZ2h0XG4gICAqICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBgQ29tcG9uZW50YHMgY29tcHV0ZWQgc3R5bGUuXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5jdXJyZW50SGVpZ2h0ID0gZnVuY3Rpb24gY3VycmVudEhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RGltZW5zaW9uKCdoZWlnaHQnKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSBmb2N1cyB0byB0aGlzIGNvbXBvbmVudFxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuZm9jdXMgPSBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICB0aGlzLmVsXy5mb2N1cygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGZvY3VzIGZyb20gdGhpcyBjb21wb25lbnRcbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmJsdXIgPSBmdW5jdGlvbiBibHVyKCkge1xuICAgIHRoaXMuZWxfLmJsdXIoKTtcbiAgfTtcblxuICAvKipcbiAgICogRW1pdCBhICd0YXAnIGV2ZW50cyB3aGVuIHRvdWNoIGV2ZW50IHN1cHBvcnQgZ2V0cyBkZXRlY3RlZC4gVGhpcyBnZXRzIHVzZWQgdG9cbiAgICogc3VwcG9ydCB0b2dnbGluZyB0aGUgY29udHJvbHMgdGhyb3VnaCBhIHRhcCBvbiB0aGUgdmlkZW8uIFRoZXkgZ2V0IGVuYWJsZWRcbiAgICogYmVjYXVzZSBldmVyeSBzdWItY29tcG9uZW50IHdvdWxkIGhhdmUgZXh0cmEgb3ZlcmhlYWQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAZmlyZXMgQ29tcG9uZW50I3RhcFxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjdG91Y2hzdGFydFxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjdG91Y2htb3ZlXG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGxlYXZlXG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGNhbmNlbFxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjdG91Y2hlbmRcbiAgICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5lbWl0VGFwRXZlbnRzID0gZnVuY3Rpb24gZW1pdFRhcEV2ZW50cygpIHtcbiAgICAvLyBUcmFjayB0aGUgc3RhcnQgdGltZSBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGhvdyBsb25nIHRoZSB0b3VjaCBsYXN0ZWRcbiAgICB2YXIgdG91Y2hTdGFydCA9IDA7XG4gICAgdmFyIGZpcnN0VG91Y2ggPSBudWxsO1xuXG4gICAgLy8gTWF4aW11bSBtb3ZlbWVudCBhbGxvd2VkIGR1cmluZyBhIHRvdWNoIGV2ZW50IHRvIHN0aWxsIGJlIGNvbnNpZGVyZWQgYSB0YXBcbiAgICAvLyBPdGhlciBwb3B1bGFyIGxpYnMgdXNlIGFueXdoZXJlIGZyb20gMiAoaGFtbWVyLmpzKSB0byAxNSxcbiAgICAvLyBzbyAxMCBzZWVtcyBsaWtlIGEgbmljZSwgcm91bmQgbnVtYmVyLlxuICAgIHZhciB0YXBNb3ZlbWVudFRocmVzaG9sZCA9IDEwO1xuXG4gICAgLy8gVGhlIG1heGltdW0gbGVuZ3RoIGEgdG91Y2ggY2FuIGJlIHdoaWxlIHN0aWxsIGJlaW5nIGNvbnNpZGVyZWQgYSB0YXBcbiAgICB2YXIgdG91Y2hUaW1lVGhyZXNob2xkID0gMjAwO1xuXG4gICAgdmFyIGNvdWxkQmVUYXAgPSB2b2lkIDA7XG5cbiAgICB0aGlzLm9uKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGZpbmdlciwgZG9uJ3QgY29uc2lkZXIgdHJlYXRpbmcgdGhpcyBhcyBhIGNsaWNrXG4gICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gQ29weSBwYWdlWC9wYWdlWSBmcm9tIHRoZSBvYmplY3RcbiAgICAgICAgZmlyc3RUb3VjaCA9IHtcbiAgICAgICAgICBwYWdlWDogZXZlbnQudG91Y2hlc1swXS5wYWdlWCxcbiAgICAgICAgICBwYWdlWTogZXZlbnQudG91Y2hlc1swXS5wYWdlWVxuICAgICAgICB9O1xuICAgICAgICAvLyBSZWNvcmQgc3RhcnQgdGltZSBzbyB3ZSBjYW4gZGV0ZWN0IGEgdGFwIHZzLiBcInRvdWNoIGFuZCBob2xkXCJcbiAgICAgICAgdG91Y2hTdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAvLyBSZXNldCBjb3VsZEJlVGFwIHRyYWNraW5nXG4gICAgICAgIGNvdWxkQmVUYXAgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vbigndG91Y2htb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGZpbmdlciwgZG9uJ3QgY29uc2lkZXIgdHJlYXRpbmcgdGhpcyBhcyBhIGNsaWNrXG4gICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvdWxkQmVUYXAgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZmlyc3RUb3VjaCkge1xuICAgICAgICAvLyBTb21lIGRldmljZXMgd2lsbCB0aHJvdyB0b3VjaG1vdmVzIGZvciBhbGwgYnV0IHRoZSBzbGlnaHRlc3Qgb2YgdGFwcy5cbiAgICAgICAgLy8gU28sIGlmIHdlIG1vdmVkIG9ubHkgYSBzbWFsbCBkaXN0YW5jZSwgdGhpcyBjb3VsZCBzdGlsbCBiZSBhIHRhcFxuICAgICAgICB2YXIgeGRpZmYgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZmlyc3RUb3VjaC5wYWdlWDtcbiAgICAgICAgdmFyIHlkaWZmID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGZpcnN0VG91Y2gucGFnZVk7XG4gICAgICAgIHZhciB0b3VjaERpc3RhbmNlID0gTWF0aC5zcXJ0KHhkaWZmICogeGRpZmYgKyB5ZGlmZiAqIHlkaWZmKTtcblxuICAgICAgICBpZiAodG91Y2hEaXN0YW5jZSA+IHRhcE1vdmVtZW50VGhyZXNob2xkKSB7XG4gICAgICAgICAgY291bGRCZVRhcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgbm9UYXAgPSBmdW5jdGlvbiBub1RhcCgpIHtcbiAgICAgIGNvdWxkQmVUYXAgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLy8gVE9ETzogTGlzdGVuIHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuIGh0dHA6Ly95b3V0dS5iZS9EdWpmcFhPS1VwOD90PTEzbThzXG4gICAgdGhpcy5vbigndG91Y2hsZWF2ZScsIG5vVGFwKTtcbiAgICB0aGlzLm9uKCd0b3VjaGNhbmNlbCcsIG5vVGFwKTtcblxuICAgIC8vIFdoZW4gdGhlIHRvdWNoIGVuZHMsIG1lYXN1cmUgaG93IGxvbmcgaXQgdG9vayBhbmQgdHJpZ2dlciB0aGUgYXBwcm9wcmlhdGVcbiAgICAvLyBldmVudFxuICAgIHRoaXMub24oJ3RvdWNoZW5kJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBmaXJzdFRvdWNoID0gbnVsbDtcbiAgICAgIC8vIFByb2NlZWQgb25seSBpZiB0aGUgdG91Y2htb3ZlL2xlYXZlL2NhbmNlbCBldmVudCBkaWRuJ3QgaGFwcGVuXG4gICAgICBpZiAoY291bGRCZVRhcCA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBNZWFzdXJlIGhvdyBsb25nIHRoZSB0b3VjaCBsYXN0ZWRcbiAgICAgICAgdmFyIHRvdWNoVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdG91Y2hTdGFydDtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRvdWNoIHdhcyBsZXNzIHRoYW4gdGhlIHRocmVzaG9sZCB0byBiZSBjb25zaWRlcmVkIGEgdGFwXG4gICAgICAgIGlmICh0b3VjaFRpbWUgPCB0b3VjaFRpbWVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAvLyBEb24ndCBsZXQgYnJvd3NlciB0dXJuIHRoaXMgaW50byBhIGNsaWNrXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGBDb21wb25lbnRgIGlzIHRhcHBlZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBldmVudCBDb21wb25lbnQjdGFwXG4gICAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMudHJpZ2dlcigndGFwJyk7XG4gICAgICAgICAgLy8gSXQgbWF5IGJlIGdvb2QgdG8gY29weSB0aGUgdG91Y2hlbmQgZXZlbnQgb2JqZWN0IGFuZCBjaGFuZ2UgdGhlXG4gICAgICAgICAgLy8gdHlwZSB0byB0YXAsIGlmIHRoZSBvdGhlciBldmVudCBwcm9wZXJ0aWVzIGFyZW4ndCBleGFjdCBhZnRlclxuICAgICAgICAgIC8vIEV2ZW50cy5maXhFdmVudCBydW5zIChlLmcuIGV2ZW50LnRhcmdldClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlcG9ydHMgdXNlciBhY3Rpdml0eSB3aGVuZXZlciB0b3VjaCBldmVudHMgaGFwcGVuLiBUaGlzIGNhbiBnZXRcbiAgICogdHVybmVkIG9mZiBieSBhbnkgc3ViLWNvbXBvbmVudHMgdGhhdCB3YW50cyB0b3VjaCBldmVudHMgdG8gYWN0IGFub3RoZXIgd2F5LlxuICAgKlxuICAgKiBSZXBvcnQgdXNlciB0b3VjaCBhY3Rpdml0eSB3aGVuIHRvdWNoIGV2ZW50cyBvY2N1ci4gVXNlciBhY3Rpdml0eSBnZXRzIHVzZWQgdG9cbiAgICogZGV0ZXJtaW5lIHdoZW4gY29udHJvbHMgc2hvdWxkIHNob3cvaGlkZS4gSXQgaXMgc2ltcGxlIHdoZW4gaXQgY29tZXMgdG8gbW91c2VcbiAgICogZXZlbnRzLCBiZWNhdXNlIGFueSBtb3VzZSBldmVudCBzaG91bGQgc2hvdyB0aGUgY29udHJvbHMuIFNvIHdlIGNhcHR1cmUgbW91c2VcbiAgICogZXZlbnRzIHRoYXQgYnViYmxlIHVwIHRvIHRoZSBwbGF5ZXIgYW5kIHJlcG9ydCBhY3Rpdml0eSB3aGVuIHRoYXQgaGFwcGVucy5cbiAgICogV2l0aCB0b3VjaCBldmVudHMgaXQgaXNuJ3QgYXMgZWFzeSBhcyBgdG91Y2hzdGFydGAgYW5kIGB0b3VjaGVuZGAgdG9nZ2xlIHBsYXllclxuICAgKiBjb250cm9scy4gU28gdG91Y2ggZXZlbnRzIGNhbid0IGhlbHAgdXMgYXQgdGhlIHBsYXllciBsZXZlbCBlaXRoZXIuXG4gICAqXG4gICAqIFVzZXIgYWN0aXZpdHkgZ2V0cyBjaGVja2VkIGFzeW5jaHJvbm91c2x5LiBTbyB3aGF0IGNvdWxkIGhhcHBlbiBpcyBhIHRhcCBldmVudFxuICAgKiBvbiB0aGUgdmlkZW8gdHVybnMgdGhlIGNvbnRyb2xzIG9mZi4gVGhlbiB0aGUgYHRvdWNoZW5kYCBldmVudCBidWJibGVzIHVwIHRvXG4gICAqIHRoZSBwbGF5ZXIuIFdoaWNoLCBpZiBpdCByZXBvcnRlZCB1c2VyIGFjdGl2aXR5LCB3b3VsZCB0dXJuIHRoZSBjb250cm9scyByaWdodFxuICAgKiBiYWNrIG9uLiBXZSBhbHNvIGRvbid0IHdhbnQgdG8gY29tcGxldGVseSBibG9jayB0b3VjaCBldmVudHMgZnJvbSBidWJibGluZyB1cC5cbiAgICogRnVydGhlcm1vcmUgYSBgdG91Y2htb3ZlYCBldmVudCBhbmQgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHRhcCwgc2hvdWxkIG5vdCB0dXJuXG4gICAqIGNvbnRyb2xzIGJhY2sgb24uXG4gICAqXG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaHN0YXJ0XG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaG1vdmVcbiAgICogQGxpc3RlbnMgQ29tcG9uZW50I3RvdWNoZW5kXG4gICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGNhbmNlbFxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuZW5hYmxlVG91Y2hBY3Rpdml0eSA9IGZ1bmN0aW9uIGVuYWJsZVRvdWNoQWN0aXZpdHkoKSB7XG4gICAgLy8gRG9uJ3QgY29udGludWUgaWYgdGhlIHJvb3QgcGxheWVyIGRvZXNuJ3Qgc3VwcG9ydCByZXBvcnRpbmcgdXNlciBhY3Rpdml0eVxuICAgIGlmICghdGhpcy5wbGF5ZXIoKSB8fCAhdGhpcy5wbGF5ZXIoKS5yZXBvcnRVc2VyQWN0aXZpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBsaXN0ZW5lciBmb3IgcmVwb3J0aW5nIHRoYXQgdGhlIHVzZXIgaXMgYWN0aXZlXG4gICAgdmFyIHJlcG9ydCA9IGJpbmQodGhpcy5wbGF5ZXIoKSwgdGhpcy5wbGF5ZXIoKS5yZXBvcnRVc2VyQWN0aXZpdHkpO1xuXG4gICAgdmFyIHRvdWNoSG9sZGluZyA9IHZvaWQgMDtcblxuICAgIHRoaXMub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXBvcnQoKTtcbiAgICAgIC8vIEZvciBhcyBsb25nIGFzIHRoZSB0aGV5IGFyZSB0b3VjaGluZyB0aGUgZGV2aWNlIG9yIGhhdmUgdGhlaXIgbW91c2UgZG93bixcbiAgICAgIC8vIHdlIGNvbnNpZGVyIHRoZW0gYWN0aXZlIGV2ZW4gaWYgdGhleSdyZSBub3QgbW92aW5nIHRoZWlyIGZpbmdlciBvciBtb3VzZS5cbiAgICAgIC8vIFNvIHdlIHdhbnQgdG8gY29udGludWUgdG8gdXBkYXRlIHRoYXQgdGhleSBhcmUgYWN0aXZlXG4gICAgICB0aGlzLmNsZWFySW50ZXJ2YWwodG91Y2hIb2xkaW5nKTtcbiAgICAgIC8vIHJlcG9ydCBhdCB0aGUgc2FtZSBpbnRlcnZhbCBhcyBhY3Rpdml0eUNoZWNrXG4gICAgICB0b3VjaEhvbGRpbmcgPSB0aGlzLnNldEludGVydmFsKHJlcG9ydCwgMjUwKTtcbiAgICB9KTtcblxuICAgIHZhciB0b3VjaEVuZCA9IGZ1bmN0aW9uIHRvdWNoRW5kKGV2ZW50KSB7XG4gICAgICByZXBvcnQoKTtcbiAgICAgIC8vIHN0b3AgdGhlIGludGVydmFsIHRoYXQgbWFpbnRhaW5zIGFjdGl2aXR5IGlmIHRoZSB0b3VjaCBpcyBob2xkaW5nXG4gICAgICB0aGlzLmNsZWFySW50ZXJ2YWwodG91Y2hIb2xkaW5nKTtcbiAgICB9O1xuXG4gICAgdGhpcy5vbigndG91Y2htb3ZlJywgcmVwb3J0KTtcbiAgICB0aGlzLm9uKCd0b3VjaGVuZCcsIHRvdWNoRW5kKTtcbiAgICB0aGlzLm9uKCd0b3VjaGNhbmNlbCcsIHRvdWNoRW5kKTtcbiAgfTtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayB0aGF0IGhhcyBubyBwYXJhbWV0ZXJzIGFuZCBpcyBib3VuZCBpbnRvIGBDb21wb25lbnRgcyBjb250ZXh0LlxuICAgKlxuICAgKiBAY2FsbGJhY2sgQ29tcG9uZW50fkdlbmVyaWNDYWxsYmFja1xuICAgKiBAdGhpcyBDb21wb25lbnRcbiAgICovXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJ1bnMgYWZ0ZXIgYW4gYHhgIG1pbGxpc2Vjb25kIHRpbWVvdXQuIFRoaXMgZnVuY3Rpb24gaXMgYVxuICAgKiB3cmFwcGVyIGFyb3VuZCBgd2luZG93LnNldFRpbWVvdXRgLiBUaGVyZSBhcmUgYSBmZXcgcmVhc29ucyB0byB1c2UgdGhpcyBvbmVcbiAgICogaW5zdGVhZCB0aG91Z2g6XG4gICAqIDEuIEl0IGdldHMgY2xlYXJlZCB2aWEgIHtAbGluayBDb21wb25lbnQjY2xlYXJUaW1lb3V0fSB3aGVuXG4gICAqICAgIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0gZ2V0cyBjYWxsZWQuXG4gICAqIDIuIFRoZSBmdW5jdGlvbiBjYWxsYmFjayB3aWxsIGdldHMgdHVybmVkIGludG8gYSB7QGxpbmsgQ29tcG9uZW50fkdlbmVyaWNDYWxsYmFja31cbiAgICpcbiAgICogPiBOb3RlOiBZb3UgY2FuJ3QgdXNlIGB3aW5kb3cuY2xlYXJUaW1lb3V0YCBvbiB0aGUgaWQgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4gVGhpc1xuICAgKiAgICAgICAgIHdpbGwgY2F1c2UgaXRzIGRpc3Bvc2UgbGlzdGVuZXIgbm90IHRvIGdldCBjbGVhbmVkIHVwISBQbGVhc2UgdXNlXG4gICAqICAgICAgICAge0BsaW5rIENvbXBvbmVudCNjbGVhclRpbWVvdXR9IG9yIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0gaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21wb25lbnR+R2VuZXJpY0NhbGxiYWNrfSBmblxuICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gYWZ0ZXIgYHRpbWVvdXRgLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKiAgICAgICAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIGV4ZWN1dGluZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgUmV0dXJucyBhIHRpbWVvdXQgSUQgdGhhdCBnZXRzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRpbWVvdXQuIEl0IGNhbiBhbHNvXG4gICAqICAgICAgICAgZ2V0IHVzZWQgaW4ge0BsaW5rIENvbXBvbmVudCNjbGVhclRpbWVvdXR9IHRvIGNsZWFyIHRoZSB0aW1lb3V0IHRoYXRcbiAgICogICAgICAgICB3YXMgc2V0LlxuICAgKlxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjZGlzcG9zZVxuICAgKiBAc2VlIFtTaW1pbGFyIHRvXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93VGltZXJzL3NldFRpbWVvdXR9XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gc2V0VGltZW91dChmbiwgdGltZW91dCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgLy8gZGVjbGFyZSBhcyB2YXJpYWJsZXMgc28gdGhleSBhcmUgcHJvcGVybHkgYXZhaWxhYmxlIGluIHRpbWVvdXQgZnVuY3Rpb25cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB2YXIgdGltZW91dElkLCBkaXNwb3NlRm47XG5cbiAgICBmbiA9IGJpbmQodGhpcywgZm4pO1xuXG4gICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLm9mZignZGlzcG9zZScsIGRpc3Bvc2VGbik7XG4gICAgICBmbigpO1xuICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkge1xuICAgICAgcmV0dXJuIF90aGlzMi5jbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICB9O1xuXG4gICAgZGlzcG9zZUZuLmd1aWQgPSAndmpzLXRpbWVvdXQtJyArIHRpbWVvdXRJZDtcblxuICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pO1xuXG4gICAgcmV0dXJuIHRpbWVvdXRJZDtcbiAgfTtcblxuICAvKipcbiAgICogQ2xlYXJzIGEgdGltZW91dCB0aGF0IGdldHMgY3JlYXRlZCB2aWEgYHdpbmRvdy5zZXRUaW1lb3V0YCBvclxuICAgKiB7QGxpbmsgQ29tcG9uZW50I3NldFRpbWVvdXR9LiBJZiB5b3Ugc2V0IGEgdGltZW91dCB2aWEge0BsaW5rIENvbXBvbmVudCNzZXRUaW1lb3V0fVxuICAgKiB1c2UgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIGB3aW5kb3cuY2xlYXJUaW1vdXRgLiBJZiB5b3UgZG9uJ3QgeW91ciBkaXNwb3NlXG4gICAqIGxpc3RlbmVyIHdpbGwgbm90IGdldCBjbGVhbmVkIHVwIHVudGlsIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0hXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0SWRcbiAgICogICAgICAgIFRoZSBpZCBvZiB0aGUgdGltZW91dCB0byBjbGVhci4gVGhlIHJldHVybiB2YWx1ZSBvZlxuICAgKiAgICAgICAge0BsaW5rIENvbXBvbmVudCNzZXRUaW1lb3V0fSBvciBgd2luZG93LnNldFRpbWVvdXRgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgUmV0dXJucyB0aGUgdGltZW91dCBpZCB0aGF0IHdhcyBjbGVhcmVkLlxuICAgKlxuICAgKiBAc2VlIFtTaW1pbGFyIHRvXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93VGltZXJzL2NsZWFyVGltZW91dH1cbiAgICovXG5cblxuICBDb21wb25lbnQucHJvdG90eXBlLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpIHtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICB2YXIgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkge307XG5cbiAgICBkaXNwb3NlRm4uZ3VpZCA9ICd2anMtdGltZW91dC0nICsgdGltZW91dElkO1xuXG4gICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pO1xuXG4gICAgcmV0dXJuIHRpbWVvdXRJZDtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyBydW4gZXZlcnkgYHhgIG1pbGxpc2Vjb25kcy4gVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXJcbiAgICogYXJvdW5kIGB3aW5kb3cuc2V0SW50ZXJ2YWxgLiBUaGVyZSBhcmUgYSBmZXcgcmVhc29ucyB0byB1c2UgdGhpcyBvbmUgaW5zdGVhZCB0aG91Z2guXG4gICAqIDEuIEl0IGdldHMgY2xlYXJlZCB2aWEgIHtAbGluayBDb21wb25lbnQjY2xlYXJJbnRlcnZhbH0gd2hlblxuICAgKiAgICB7QGxpbmsgQ29tcG9uZW50I2Rpc3Bvc2V9IGdldHMgY2FsbGVkLlxuICAgKiAyLiBUaGUgZnVuY3Rpb24gY2FsbGJhY2sgd2lsbCBiZSBhIHtAbGluayBDb21wb25lbnR+R2VuZXJpY0NhbGxiYWNrfVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH5HZW5lcmljQ2FsbGJhY2t9IGZuXG4gICAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gcnVuIGV2ZXJ5IGB4YCBzZWNvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW50ZXJ2YWxcbiAgICogICAgICAgIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBldmVyeSBgeGAgbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgUmV0dXJucyBhbiBpZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnRlcnZhbC4gSXQgY2FuIGFsc28gYmUgYmUgdXNlZCBpblxuICAgKiAgICAgICAgIHtAbGluayBDb21wb25lbnQjY2xlYXJJbnRlcnZhbH0gdG8gY2xlYXIgdGhlIGludGVydmFsLlxuICAgKlxuICAgKiBAbGlzdGVucyBDb21wb25lbnQjZGlzcG9zZVxuICAgKiBAc2VlIFtTaW1pbGFyIHRvXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93VGltZXJzL3NldEludGVydmFsfVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbiBzZXRJbnRlcnZhbChmbiwgaW50ZXJ2YWwpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIGZuID0gYmluZCh0aGlzLCBmbik7XG5cbiAgICB2YXIgaW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbChmbiwgaW50ZXJ2YWwpO1xuXG4gICAgdmFyIGRpc3Bvc2VGbiA9IGZ1bmN0aW9uIGRpc3Bvc2VGbigpIHtcbiAgICAgIHJldHVybiBfdGhpczMuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICB9O1xuXG4gICAgZGlzcG9zZUZuLmd1aWQgPSAndmpzLWludGVydmFsLScgKyBpbnRlcnZhbElkO1xuXG4gICAgdGhpcy5vbignZGlzcG9zZScsIGRpc3Bvc2VGbik7XG5cbiAgICByZXR1cm4gaW50ZXJ2YWxJZDtcbiAgfTtcblxuICAvKipcbiAgICogQ2xlYXJzIGFuIGludGVydmFsIHRoYXQgZ2V0cyBjcmVhdGVkIHZpYSBgd2luZG93LnNldEludGVydmFsYCBvclxuICAgKiB7QGxpbmsgQ29tcG9uZW50I3NldEludGVydmFsfS4gSWYgeW91IHNldCBhbiBpbnRldmFsIHZpYSB7QGxpbmsgQ29tcG9uZW50I3NldEludGVydmFsfVxuICAgKiB1c2UgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIGB3aW5kb3cuY2xlYXJJbnRlcnZhbGAuIElmIHlvdSBkb24ndCB5b3VyIGRpc3Bvc2VcbiAgICogbGlzdGVuZXIgd2lsbCBub3QgZ2V0IGNsZWFuZWQgdXAgdW50aWwge0BsaW5rIENvbXBvbmVudCNkaXNwb3NlfSFcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGludGVydmFsSWRcbiAgICogICAgICAgIFRoZSBpZCBvZiB0aGUgaW50ZXJ2YWwgdG8gY2xlYXIuIFRoZSByZXR1cm4gdmFsdWUgb2ZcbiAgICogICAgICAgIHtAbGluayBDb21wb25lbnQjc2V0SW50ZXJ2YWx9IG9yIGB3aW5kb3cuc2V0SW50ZXJ2YWxgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgUmV0dXJucyB0aGUgaW50ZXJ2YWwgaWQgdGhhdCB3YXMgY2xlYXJlZC5cbiAgICpcbiAgICogQHNlZSBbU2ltaWxhciB0b117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd1RpbWVycy9jbGVhckludGVydmFsfVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCkge1xuICAgIHdpbmRvdy5jbGVhckludGVydmFsKGludGVydmFsSWQpO1xuXG4gICAgdmFyIGRpc3Bvc2VGbiA9IGZ1bmN0aW9uIGRpc3Bvc2VGbigpIHt9O1xuXG4gICAgZGlzcG9zZUZuLmd1aWQgPSAndmpzLWludGVydmFsLScgKyBpbnRlcnZhbElkO1xuXG4gICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pO1xuXG4gICAgcmV0dXJuIGludGVydmFsSWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyB1cCBhIGNhbGxiYWNrIHRvIGJlIHBhc3NlZCB0byByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKHJBRiksIGJ1dFxuICAgKiB3aXRoIGEgZmV3IGV4dHJhIGJvbnVzZXM6XG4gICAqXG4gICAqIC0gU3VwcG9ydHMgYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCByQUYgYnkgZmFsbGluZyBiYWNrIHRvXG4gICAqICAge0BsaW5rIENvbXBvbmVudCNzZXRUaW1lb3V0fS5cbiAgICpcbiAgICogLSBUaGUgY2FsbGJhY2sgaXMgdHVybmVkIGludG8gYSB7QGxpbmsgQ29tcG9uZW50fkdlbmVyaWNDYWxsYmFja30gKGkuZS5cbiAgICogICBib3VuZCB0byB0aGUgY29tcG9uZW50KS5cbiAgICpcbiAgICogLSBBdXRvbWF0aWMgY2FuY2VsbGF0aW9uIG9mIHRoZSByQUYgY2FsbGJhY2sgaXMgaGFuZGxlZCBpZiB0aGUgY29tcG9uZW50XG4gICAqICAgaXMgZGlzcG9zZWQgYmVmb3JlIGl0IGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtICB7Q29tcG9uZW50fkdlbmVyaWNDYWxsYmFja30gZm5cbiAgICogICAgICAgICBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBib3VuZCB0byB0aGlzIGNvbXBvbmVudCBhbmQgZXhlY3V0ZWQganVzdFxuICAgKiAgICAgICAgIGJlZm9yZSB0aGUgYnJvd3NlcidzIG5leHQgcmVwYWludC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFJldHVybnMgYW4gckFGIElEIHRoYXQgZ2V0cyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0aW1lb3V0LiBJdCBjYW5cbiAgICogICAgICAgICBhbHNvIGJlIHVzZWQgaW4ge0BsaW5rIENvbXBvbmVudCNjYW5jZWxBbmltYXRpb25GcmFtZX0gdG8gY2FuY2VsXG4gICAqICAgICAgICAgdGhlIGFuaW1hdGlvbiBmcmFtZSBjYWxsYmFjay5cbiAgICpcbiAgICogQGxpc3RlbnMgQ29tcG9uZW50I2Rpc3Bvc2VcbiAgICogQHNlZSBbU2ltaWxhciB0b117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy9yZXF1ZXN0QW5pbWF0aW9uRnJhbWV9XG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnByb3RvdHlwZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIC8vIGRlY2xhcmUgYXMgdmFyaWFibGVzIHNvIHRoZXkgYXJlIHByb3Blcmx5IGF2YWlsYWJsZSBpbiByQUYgZnVuY3Rpb25cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB2YXIgaWQsIGRpc3Bvc2VGbjtcblxuICAgIGlmICh0aGlzLnN1cHBvcnRzUmFmXykge1xuICAgICAgZm4gPSBiaW5kKHRoaXMsIGZuKTtcblxuICAgICAgaWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXM0Lm9mZignZGlzcG9zZScsIGRpc3Bvc2VGbik7XG4gICAgICAgIGZuKCk7XG4gICAgICB9KTtcblxuICAgICAgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkge1xuICAgICAgICByZXR1cm4gX3RoaXM0LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTtcbiAgICAgIH07XG5cbiAgICAgIGRpc3Bvc2VGbi5ndWlkID0gJ3Zqcy1yYWYtJyArIGlkO1xuICAgICAgdGhpcy5vbignZGlzcG9zZScsIGRpc3Bvc2VGbik7XG5cbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gdXNpbmcgYSB0aW1lci5cbiAgICByZXR1cm4gdGhpcy5zZXRUaW1lb3V0KGZuLCAxMDAwIC8gNjApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGEgcXVldWVkIGNhbGxiYWNrIHBhc3NlZCB0byB7QGxpbmsgQ29tcG9uZW50I3JlcXVlc3RBbmltYXRpb25GcmFtZX1cbiAgICogKHJBRikuXG4gICAqXG4gICAqIElmIHlvdSBxdWV1ZSBhbiByQUYgY2FsbGJhY2sgdmlhIHtAbGluayBDb21wb25lbnQjcmVxdWVzdEFuaW1hdGlvbkZyYW1lfSxcbiAgICogdXNlIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lYC4gSWYgeW91IGRvbid0LFxuICAgKiB5b3VyIGRpc3Bvc2UgbGlzdGVuZXIgd2lsbCBub3QgZ2V0IGNsZWFuZWQgdXAgdW50aWwge0BsaW5rIENvbXBvbmVudCNkaXNwb3NlfSFcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkXG4gICAqICAgICAgICBUaGUgckFGIElEIHRvIGNsZWFyLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBDb21wb25lbnQjcmVxdWVzdEFuaW1hdGlvbkZyYW1lfS5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFJldHVybnMgdGhlIHJBRiBJRCB0aGF0IHdhcyBjbGVhcmVkLlxuICAgKlxuICAgKiBAc2VlIFtTaW1pbGFyIHRvXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvd2luZG93L2NhbmNlbEFuaW1hdGlvbkZyYW1lfVxuICAgKi9cblxuXG4gIENvbXBvbmVudC5wcm90b3R5cGUuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiBjYW5jZWxBbmltYXRpb25GcmFtZShpZCkge1xuICAgIGlmICh0aGlzLnN1cHBvcnRzUmFmXykge1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTtcblxuICAgICAgdmFyIGRpc3Bvc2VGbiA9IGZ1bmN0aW9uIGRpc3Bvc2VGbigpIHt9O1xuXG4gICAgICBkaXNwb3NlRm4uZ3VpZCA9ICd2anMtcmFmLScgKyBpZDtcblxuICAgICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pO1xuXG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHVzaW5nIGEgdGltZXIuXG4gICAgcmV0dXJuIHRoaXMuY2xlYXJUaW1lb3V0KGlkKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBgQ29tcG9uZW50YCB3aXRoIGB2aWRlb2pzYCBnaXZlbiB0aGUgbmFtZSBhbmQgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogPiBOT1RFOiB7QGxpbmsgVGVjaH1zIHNob3VsZCBub3QgYmUgcmVnaXN0ZXJlZCBhcyBhIGBDb21wb25lbnRgLiB7QGxpbmsgVGVjaH1zXG4gICAqICAgICAgICAgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdXNpbmcge0BsaW5rIFRlY2gucmVnaXN0ZXJUZWNofSBvclxuICAgKiAgICAgICAgIHtAbGluayB2aWRlb2pzOnZpZGVvanMucmVnaXN0ZXJUZWNofS5cbiAgICpcbiAgICogPiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHNlZW4gb24gdmlkZW9qcyBhc1xuICAgKiAgICAgICAgIHtAbGluayB2aWRlb2pzOnZpZGVvanMucmVnaXN0ZXJDb21wb25lbnR9LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGBDb21wb25lbnRgIHRvIHJlZ2lzdGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gQ29tcG9uZW50VG9SZWdpc3RlclxuICAgKiAgICAgICAgVGhlIGBDb21wb25lbnRgIGNsYXNzIHRvIHJlZ2lzdGVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqICAgICAgICAgVGhlIGBDb21wb25lbnRgIHRoYXQgd2FzIHJlZ2lzdGVyZWQuXG4gICAqL1xuXG5cbiAgQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50ID0gZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnQobmFtZSwgQ29tcG9uZW50VG9SZWdpc3Rlcikge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBjb21wb25lbnQgbmFtZSwgXCInICsgbmFtZSArICdcIjsgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgfVxuXG4gICAgdmFyIFRlY2ggPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KCdUZWNoJyk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGNoZWNrIGlzIG9ubHkgZG9uZSBpZiBUZWNoIGhhcyBiZWVuIHJlZ2lzdGVyZWQuXG4gICAgdmFyIGlzVGVjaCA9IFRlY2ggJiYgVGVjaC5pc1RlY2goQ29tcG9uZW50VG9SZWdpc3Rlcik7XG4gICAgdmFyIGlzQ29tcCA9IENvbXBvbmVudCA9PT0gQ29tcG9uZW50VG9SZWdpc3RlciB8fCBDb21wb25lbnQucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoQ29tcG9uZW50VG9SZWdpc3Rlci5wcm90b3R5cGUpO1xuXG4gICAgaWYgKGlzVGVjaCB8fCAhaXNDb21wKSB7XG4gICAgICB2YXIgcmVhc29uID0gdm9pZCAwO1xuXG4gICAgICBpZiAoaXNUZWNoKSB7XG4gICAgICAgIHJlYXNvbiA9ICd0ZWNocyBtdXN0IGJlIHJlZ2lzdGVyZWQgdXNpbmcgVGVjaC5yZWdpc3RlclRlY2goKSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWFzb24gPSAnbXVzdCBiZSBhIENvbXBvbmVudCBzdWJjbGFzcyc7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBjb21wb25lbnQsIFwiJyArIG5hbWUgKyAnXCI7ICcgKyByZWFzb24gKyAnLicpO1xuICAgIH1cblxuICAgIG5hbWUgPSB0b1RpdGxlQ2FzZShuYW1lKTtcblxuICAgIGlmICghQ29tcG9uZW50LmNvbXBvbmVudHNfKSB7XG4gICAgICBDb21wb25lbnQuY29tcG9uZW50c18gPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgUGxheWVyID0gQ29tcG9uZW50LmdldENvbXBvbmVudCgnUGxheWVyJyk7XG5cbiAgICBpZiAobmFtZSA9PT0gJ1BsYXllcicgJiYgUGxheWVyICYmIFBsYXllci5wbGF5ZXJzKSB7XG4gICAgICB2YXIgcGxheWVycyA9IFBsYXllci5wbGF5ZXJzO1xuICAgICAgdmFyIHBsYXllck5hbWVzID0gT2JqZWN0LmtleXMocGxheWVycyk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgcGxheWVycyB0aGF0IHdlcmUgZGlzcG9zZWQsIHRoZW4gdGhlaXIgbmFtZSB3aWxsIHN0aWxsIGJlXG4gICAgICAvLyBpbiBQbGF5ZXJzLnBsYXllcnMuIFNvLCB3ZSBtdXN0IGxvb3AgdGhyb3VnaCBhbmQgdmVyaWZ5IHRoYXQgdGhlIHZhbHVlXG4gICAgICAvLyBmb3IgZWFjaCBpdGVtIGlzIG5vdCBudWxsLiBUaGlzIGFsbG93cyByZWdpc3RyYXRpb24gb2YgdGhlIFBsYXllciBjb21wb25lbnRcbiAgICAgIC8vIGFmdGVyIGFsbCBwbGF5ZXJzIGhhdmUgYmVlbiBkaXNwb3NlZCBvciBiZWZvcmUgYW55IHdlcmUgY3JlYXRlZC5cbiAgICAgIGlmIChwbGF5ZXJzICYmIHBsYXllck5hbWVzLmxlbmd0aCA+IDAgJiYgcGxheWVyTmFtZXMubWFwKGZ1bmN0aW9uIChwbmFtZSkge1xuICAgICAgICByZXR1cm4gcGxheWVyc1twbmFtZV07XG4gICAgICB9KS5ldmVyeShCb29sZWFuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgcmVnaXN0ZXIgUGxheWVyIGNvbXBvbmVudCBhZnRlciBwbGF5ZXIgaGFzIGJlZW4gY3JlYXRlZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21wb25lbnQuY29tcG9uZW50c19bbmFtZV0gPSBDb21wb25lbnRUb1JlZ2lzdGVyO1xuXG4gICAgcmV0dXJuIENvbXBvbmVudFRvUmVnaXN0ZXI7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIGBDb21wb25lbnRgIGJhc2VkIG9uIHRoZSBuYW1lIGl0IHdhcyByZWdpc3RlcmVkIHdpdGguXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqICAgICAgICBUaGUgTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGdldC5cbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiAgICAgICAgIFRoZSBgQ29tcG9uZW50YCB0aGF0IGdvdCByZWdpc3RlcmVkIHVuZGVyIHRoZSBnaXZlbiBuYW1lLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBJbiBgdmlkZW9qc2AgNiB0aGlzIHdpbGwgbm90IHJldHVybiBgQ29tcG9uZW50YHMgdGhhdCB3ZXJlIG5vdFxuICAgKiAgICAgICAgICAgICByZWdpc3RlcmVkIHVzaW5nIHtAbGluayBDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnR9LiBDdXJyZW50bHkgd2VcbiAgICogICAgICAgICAgICAgY2hlY2sgdGhlIGdsb2JhbCBgdmlkZW9qc2Agb2JqZWN0IGZvciBhIGBDb21wb25lbnRgIG5hbWUgYW5kXG4gICAqICAgICAgICAgICAgIHJldHVybiB0aGF0IGlmIGl0IGV4aXN0cy5cbiAgICovXG5cblxuICBDb21wb25lbnQuZ2V0Q29tcG9uZW50ID0gZnVuY3Rpb24gZ2V0Q29tcG9uZW50KG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7XG5cbiAgICBpZiAoQ29tcG9uZW50LmNvbXBvbmVudHNfICYmIENvbXBvbmVudC5jb21wb25lbnRzX1tuYW1lXSkge1xuICAgICAgcmV0dXJuIENvbXBvbmVudC5jb21wb25lbnRzX1tuYW1lXTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIENvbXBvbmVudDtcbn0oKTtcblxuLyoqXG4gKiBXaGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvbmVudCBzdXBwb3J0cyBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC5cbiAqXG4gKiBUaGlzIGlzIGV4cG9zZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuc3VwcG9ydHNSYWZfID0gdHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDb21wb25lbnQnLCBDb21wb25lbnQpO1xuXG4vKipcbiAqIEBmaWxlIHRpbWUtcmFuZ2VzLmpzXG4gKiBAbW9kdWxlIHRpbWUtcmFuZ2VzXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0aW1lIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGF0IHRoZSBzdGFydCBvciBlbmRcbiAqIG9mIGEgVGltZVJhbmdlIG9iamVjdC5cbiAqXG4gKiBAZnVuY3Rpb24gdGltZS1yYW5nZXM6aW5kZXhGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW5kZXg9MF1cbiAqICAgICAgICBUaGUgcmFuZ2UgbnVtYmVyIHRvIHJldHVybiB0aGUgdGltZSBmb3IuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdGltZSB0aGF0IG9mZnNldCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICpcbiAqIEBkZXByaWNhdGVkIGluZGV4IG11c3QgYmUgc2V0IHRvIGEgdmFsdWUsIGluIHRoZSBmdXR1cmUgdGhpcyB3aWxsIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgcmFuZ2VzIG9mIHRpbWUgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUaW1lUmFuZ2VcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuZ3RoXG4gKiAgICAgICAgICAgVGhlIG51bWJlciBvZiB0aW1lIHJhbmdlcyByZXByZXNlbnRlZCBieSB0aGlzIE9iamVjdFxuICpcbiAqIEBwcm9wZXJ0eSB7dGltZS1yYW5nZXM6aW5kZXhGdW5jdGlvbn0gc3RhcnRcbiAqICAgICAgICAgICBSZXR1cm5zIHRoZSB0aW1lIG9mZnNldCBhdCB3aGljaCBhIHNwZWNpZmllZCB0aW1lIHJhbmdlIGJlZ2lucy5cbiAqXG4gKiBAcHJvcGVydHkge3RpbWUtcmFuZ2VzOmluZGV4RnVuY3Rpb259IGVuZFxuICogICAgICAgICAgIFJldHVybnMgdGhlIHRpbWUgb2Zmc2V0IGF0IHdoaWNoIGEgc3BlY2lmaWVkIHRpbWUgcmFuZ2UgZW5kcy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UaW1lUmFuZ2VzXG4gKi9cblxuLyoqXG4gKiBDaGVjayBpZiBhbnkgb2YgdGhlIHRpbWUgcmFuZ2VzIGFyZSBvdmVyIHRoZSBtYXhpbXVtIGluZGV4LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbk5hbWVcbiAqICAgICAgICBUaGUgZnVuY3Rpb24gbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqICAgICAgICBUaGUgaW5kZXggdG8gY2hlY2tcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4SW5kZXhcbiAqICAgICAgICBUaGUgbWF4aW11bSBwb3NzaWJsZSBpbmRleFxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgdGltZVJhbmdlcyBwcm92aWRlZCBhcmUgb3ZlciB0aGUgbWF4SW5kZXhcbiAqL1xuZnVuY3Rpb24gcmFuZ2VDaGVjayhmbk5hbWUsIGluZGV4LCBtYXhJbmRleCkge1xuICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJyB8fCBpbmRleCA8IDAgfHwgaW5kZXggPiBtYXhJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGV4ZWN1dGUgXFwnJyArIGZuTmFtZSArICdcXCcgb24gXFwnVGltZVJhbmdlc1xcJzogVGhlIGluZGV4IHByb3ZpZGVkICgnICsgaW5kZXggKyAnKSBpcyBub24tbnVtZXJpYyBvciBvdXQgb2YgYm91bmRzICgwLScgKyBtYXhJbmRleCArICcpLicpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSB0aW1lIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGF0IHRoZSBzdGFydCBvciBlbmRcbiAqIG9mIGEgVGltZVJhbmdlIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm5OYW1lXG4gKiAgICAgICAgVGhlIGZ1bmN0aW9uIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlSW5kZXhcbiAqICAgICAgICBUaGUgcHJvcHJldHkgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBnZXQgdGhlIHRpbWUuIHNob3VsZCBiZSAnc3RhcnQnIG9yICdlbmQnXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcmFuZ2VzXG4gKiAgICAgICAgQW4gYXJyYXkgb2YgdGltZSByYW5nZXNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBbcmFuZ2VJbmRleD0wXVxuICogICAgICAgIFRoZSBpbmRleCB0byBzdGFydCB0aGUgc2VhcmNoIGF0XG4gKlxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdGltZSB0aGF0IG9mZnNldCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICpcbiAqXG4gKiBAZGVwcmljYXRlZCByYW5nZUluZGV4IG11c3QgYmUgc2V0IHRvIGEgdmFsdWUsIGluIHRoZSBmdXR1cmUgdGhpcyB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHJhbmdlSW5kZXggaXMgbW9yZSB0aGFuIHRoZSBsZW5ndGggb2YgcmFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGdldFJhbmdlKGZuTmFtZSwgdmFsdWVJbmRleCwgcmFuZ2VzLCByYW5nZUluZGV4KSB7XG4gIHJhbmdlQ2hlY2soZm5OYW1lLCByYW5nZUluZGV4LCByYW5nZXMubGVuZ3RoIC0gMSk7XG4gIHJldHVybiByYW5nZXNbcmFuZ2VJbmRleF1bdmFsdWVJbmRleF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgdGltZSByYW5nZSBvYmplY3QgZ2l2ZW4gcmFuZ2VzIG9mIHRpbWUuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gW3Jhbmdlc11cbiAqICAgICAgICBBbiBhcnJheSBvZiB0aW1lIHJhbmdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVGltZVJhbmdlc09iaihyYW5nZXMpIHtcbiAgaWYgKHJhbmdlcyA9PT0gdW5kZWZpbmVkIHx8IHJhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgVGltZVJhbmdlcyBvYmplY3QgaXMgZW1wdHknKTtcbiAgICAgIH0sXG4gICAgICBlbmQ6IGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIFRpbWVSYW5nZXMgb2JqZWN0IGlzIGVtcHR5Jyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGxlbmd0aDogcmFuZ2VzLmxlbmd0aCxcbiAgICBzdGFydDogZ2V0UmFuZ2UuYmluZChudWxsLCAnc3RhcnQnLCAwLCByYW5nZXMpLFxuICAgIGVuZDogZ2V0UmFuZ2UuYmluZChudWxsLCAnZW5kJywgMSwgcmFuZ2VzKVxuICB9O1xufVxuXG4vKipcbiAqIFNob3VsZCBjcmVhdGUgYSBmYWtlIGBUaW1lUmFuZ2VgIG9iamVjdCB3aGljaCBtaW1pY3MgYW4gSFRNTDUgdGltZSByYW5nZSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxBcnJheX0gc3RhcnRcbiAqICAgICAgICBUaGUgc3RhcnQgb2YgYSBzaW5nbGUgcmFuZ2Ugb3IgYW4gYXJyYXkgb2YgcmFuZ2VzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICogICAgICAgIFRoZSBlbmQgb2YgYSBzaW5nbGUgcmFuZ2UuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlVGltZVJhbmdlcyhzdGFydCwgZW5kKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXJ0KSkge1xuICAgIHJldHVybiBjcmVhdGVUaW1lUmFuZ2VzT2JqKHN0YXJ0KTtcbiAgfSBlbHNlIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVSYW5nZXNPYmooKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlVGltZVJhbmdlc09iaihbW3N0YXJ0LCBlbmRdXSk7XG59XG5cbi8qKlxuICogQGZpbGUgYnVmZmVyLmpzXG4gKiBAbW9kdWxlIGJ1ZmZlclxuICovXG4vKipcbiAqIENvbXB1dGUgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIG1lZGlhIHRoYXQgaGFzIGJlZW4gYnVmZmVyZWQuXG4gKlxuICogQHBhcmFtIHtUaW1lUmFuZ2V9IGJ1ZmZlcmVkXG4gKiAgICAgICAgVGhlIGN1cnJlbnQgYFRpbWVSYW5nZWAgb2JqZWN0IHJlcHJlc2VudGluZyBidWZmZXJlZCB0aW1lIHJhbmdlc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvblxuICogICAgICAgIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBtZWRpYVxuICpcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgUGVyY2VudCBidWZmZXJlZCBvZiB0aGUgdG90YWwgZHVyYXRpb24gaW4gZGVjaW1hbCBmb3JtLlxuICovXG5mdW5jdGlvbiBidWZmZXJlZFBlcmNlbnQoYnVmZmVyZWQsIGR1cmF0aW9uKSB7XG4gIHZhciBidWZmZXJlZER1cmF0aW9uID0gMDtcbiAgdmFyIHN0YXJ0ID0gdm9pZCAwO1xuICB2YXIgZW5kID0gdm9pZCAwO1xuXG4gIGlmICghZHVyYXRpb24pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmICghYnVmZmVyZWQgfHwgIWJ1ZmZlcmVkLmxlbmd0aCkge1xuICAgIGJ1ZmZlcmVkID0gY3JlYXRlVGltZVJhbmdlcygwLCAwKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICBzdGFydCA9IGJ1ZmZlcmVkLnN0YXJ0KGkpO1xuICAgIGVuZCA9IGJ1ZmZlcmVkLmVuZChpKTtcblxuICAgIC8vIGJ1ZmZlcmVkIGVuZCBjYW4gYmUgYmlnZ2VyIHRoYW4gZHVyYXRpb24gYnkgYSB2ZXJ5IHNtYWxsIGZyYWN0aW9uXG4gICAgaWYgKGVuZCA+IGR1cmF0aW9uKSB7XG4gICAgICBlbmQgPSBkdXJhdGlvbjtcbiAgICB9XG5cbiAgICBidWZmZXJlZER1cmF0aW9uICs9IGVuZCAtIHN0YXJ0O1xuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlcmVkRHVyYXRpb24gLyBkdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBAZmlsZSBmdWxsc2NyZWVuLWFwaS5qc1xuICogQG1vZHVsZSBmdWxsc2NyZWVuLWFwaVxuICogQHByaXZhdGVcbiAqL1xuLyoqXG4gKiBTdG9yZSB0aGUgYnJvd3Nlci1zcGVjaWZpYyBtZXRob2RzIGZvciB0aGUgZnVsbHNjcmVlbiBBUEkuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBzZWUgW1NwZWNpZmljYXRpb25de0BsaW5rIGh0dHBzOi8vZnVsbHNjcmVlbi5zcGVjLndoYXR3Zy5vcmd9XG4gKiBAc2VlIFtNYXAgQXBwcm9hY2ggRnJvbSBTY3JlZW5mdWxsLmpzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3NjcmVlbmZ1bGwuanN9XG4gKi9cbnZhciBGdWxsc2NyZWVuQXBpID0ge307XG5cbi8vIGJyb3dzZXIgQVBJIG1ldGhvZHNcbnZhciBhcGlNYXAgPSBbWydyZXF1ZXN0RnVsbHNjcmVlbicsICdleGl0RnVsbHNjcmVlbicsICdmdWxsc2NyZWVuRWxlbWVudCcsICdmdWxsc2NyZWVuRW5hYmxlZCcsICdmdWxsc2NyZWVuY2hhbmdlJywgJ2Z1bGxzY3JlZW5lcnJvciddLFxuLy8gV2ViS2l0XG5bJ3dlYmtpdFJlcXVlc3RGdWxsc2NyZWVuJywgJ3dlYmtpdEV4aXRGdWxsc2NyZWVuJywgJ3dlYmtpdEZ1bGxzY3JlZW5FbGVtZW50JywgJ3dlYmtpdEZ1bGxzY3JlZW5FbmFibGVkJywgJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmVycm9yJ10sXG4vLyBPbGQgV2ViS2l0IChTYWZhcmkgNS4xKVxuWyd3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbicsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCcsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmVycm9yJ10sXG4vLyBNb3ppbGxhXG5bJ21velJlcXVlc3RGdWxsU2NyZWVuJywgJ21vekNhbmNlbEZ1bGxTY3JlZW4nLCAnbW96RnVsbFNjcmVlbkVsZW1lbnQnLCAnbW96RnVsbFNjcmVlbkVuYWJsZWQnLCAnbW96ZnVsbHNjcmVlbmNoYW5nZScsICdtb3pmdWxsc2NyZWVuZXJyb3InXSxcbi8vIE1pY3Jvc29mdFxuWydtc1JlcXVlc3RGdWxsc2NyZWVuJywgJ21zRXhpdEZ1bGxzY3JlZW4nLCAnbXNGdWxsc2NyZWVuRWxlbWVudCcsICdtc0Z1bGxzY3JlZW5FbmFibGVkJywgJ01TRnVsbHNjcmVlbkNoYW5nZScsICdNU0Z1bGxzY3JlZW5FcnJvciddXTtcblxudmFyIHNwZWNBcGkgPSBhcGlNYXBbMF07XG52YXIgYnJvd3NlckFwaSA9IHZvaWQgMDtcblxuLy8gZGV0ZXJtaW5lIHRoZSBzdXBwb3J0ZWQgc2V0IG9mIGZ1bmN0aW9uc1xuZm9yICh2YXIgaSA9IDA7IGkgPCBhcGlNYXAubGVuZ3RoOyBpKyspIHtcbiAgLy8gY2hlY2sgZm9yIGV4aXRGdWxsc2NyZWVuIGZ1bmN0aW9uXG4gIGlmIChhcGlNYXBbaV1bMV0gaW4gZG9jdW1lbnQpIHtcbiAgICBicm93c2VyQXBpID0gYXBpTWFwW2ldO1xuICAgIGJyZWFrO1xuICB9XG59XG5cbi8vIG1hcCB0aGUgYnJvd3NlciBBUEkgbmFtZXMgdG8gdGhlIHNwZWMgQVBJIG5hbWVzXG5pZiAoYnJvd3NlckFwaSkge1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYnJvd3NlckFwaS5sZW5ndGg7IF9pKyspIHtcbiAgICBGdWxsc2NyZWVuQXBpW3NwZWNBcGlbX2ldXSA9IGJyb3dzZXJBcGlbX2ldO1xuICB9XG59XG5cbi8qKlxuICogQGZpbGUgbWVkaWEtZXJyb3IuanNcbiAqL1xuLyoqXG4gKiBBIEN1c3RvbSBgTWVkaWFFcnJvcmAgY2xhc3Mgd2hpY2ggbWltaWNzIHRoZSBzdGFuZGFyZCBIVE1MNSBgTWVkaWFFcnJvcmAgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfE9iamVjdHxNZWRpYUVycm9yfSB2YWx1ZVxuICogICAgICAgIFRoaXMgY2FuIGJlIG9mIG11bHRpcGxlIHR5cGVzOlxuICogICAgICAgIC0gbnVtYmVyOiBzaG91bGQgYmUgYSBzdGFuZGFyZCBlcnJvciBjb2RlXG4gKiAgICAgICAgLSBzdHJpbmc6IGFuIGVycm9yIG1lc3NhZ2UgKHRoZSBjb2RlIHdpbGwgYmUgMClcbiAqICAgICAgICAtIE9iamVjdDogYXJiaXRyYXJ5IHByb3BlcnRpZXNcbiAqICAgICAgICAtIGBNZWRpYUVycm9yYCAobmF0aXZlKTogdXNlZCB0byBwb3B1bGF0ZSBhIHZpZGVvLmpzIGBNZWRpYUVycm9yYCBvYmplY3RcbiAqICAgICAgICAtIGBNZWRpYUVycm9yYCAodmlkZW8uanMpOiB3aWxsIHJldHVybiBpdHNlbGYgaWYgaXQncyBhbHJlYWR5IGFcbiAqICAgICAgICAgIHZpZGVvLmpzIGBNZWRpYUVycm9yYCBvYmplY3QuXG4gKlxuICogQHNlZSBbTWVkaWFFcnJvciBTcGVjXXtAbGluayBodHRwczovL2Rldi53My5vcmcvaHRtbDUvc3BlYy1hdXRob3Itdmlldy92aWRlby5odG1sI21lZGlhZXJyb3J9XG4gKiBAc2VlIFtFbmNyeXB0ZWQgTWVkaWFFcnJvciBTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1lbmNyeXB0ZWQtbWVkaWEtMjAxMzA1MTAvI2Vycm9yLWNvZGVzfVxuICpcbiAqIEBjbGFzcyBNZWRpYUVycm9yXG4gKi9cbmZ1bmN0aW9uIE1lZGlhRXJyb3IodmFsdWUpIHtcblxuICAvLyBBbGxvdyByZWR1bmRhbnQgY2FsbHMgdG8gdGhpcyBjb25zdHJ1Y3RvciB0byBhdm9pZCBoYXZpbmcgYGluc3RhbmNlb2ZgXG4gIC8vIGNoZWNrcyBwZXBwZXJlZCBhcm91bmQgdGhlIGNvZGUuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1lZGlhRXJyb3IpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRoaXMuY29kZSA9IHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBkZWZhdWx0IGNvZGUgaXMgemVybywgc28gdGhpcyBpcyBhIGN1c3RvbSBlcnJvclxuICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuXG4gICAgLy8gV2UgYXNzaWduIHRoZSBgY29kZWAgcHJvcGVydHkgbWFudWFsbHkgYmVjYXVzZSBuYXRpdmUgYE1lZGlhRXJyb3JgIG9iamVjdHNcbiAgICAvLyBkbyBub3QgZXhwb3NlIGl0IGFzIGFuIG93bi9lbnVtZXJhYmxlIHByb3BlcnR5IG9mIHRoZSBvYmplY3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZS5jb2RlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5jb2RlID0gdmFsdWUuY29kZTtcbiAgICB9XG5cbiAgICBhc3NpZ24odGhpcywgdmFsdWUpO1xuICB9XG5cbiAgaWYgKCF0aGlzLm1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBNZWRpYUVycm9yLmRlZmF1bHRNZXNzYWdlc1t0aGlzLmNvZGVdIHx8ICcnO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGVycm9yIGNvZGUgdGhhdCByZWZlcnMgdHdvIG9uZSBvZiB0aGUgZGVmaW5lZCBgTWVkaWFFcnJvcmAgdHlwZXNcbiAqXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5NZWRpYUVycm9yLnByb3RvdHlwZS5jb2RlID0gMDtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBtZXNzYWdlIHRoYXQgdG8gc2hvdyB3aXRoIHRoZSBlcnJvci4gTWVzc2FnZSBpcyBub3QgcGFydCBvZiB0aGUgSFRNTDVcbiAqIHZpZGVvIHNwZWMgYnV0IGFsbG93cyBmb3IgbW9yZSBpbmZvcm1hdGl2ZSBjdXN0b20gZXJyb3JzLlxuICpcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKi9cbk1lZGlhRXJyb3IucHJvdG90eXBlLm1lc3NhZ2UgPSAnJztcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBzdGF0dXMgY29kZSB0aGF0IGNhbiBiZSBzZXQgYnkgcGx1Z2lucyB0byBhbGxvdyBldmVuIG1vcmUgZGV0YWlsIGFib3V0XG4gKiB0aGUgZXJyb3IuIEZvciBleGFtcGxlIGEgcGx1Z2luIG1pZ2h0IHByb3ZpZGUgYSBzcGVjaWZpYyBIVFRQIHN0YXR1cyBjb2RlIGFuZCBhblxuICogZXJyb3IgbWVzc2FnZSBmb3IgdGhhdCBjb2RlLiBUaGVuIHdoZW4gdGhlIHBsdWdpbiBnZXRzIHRoYXQgZXJyb3IgdGhpcyBjbGFzcyB3aWxsXG4gKiBrbm93IGhvdyB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgZm9yIGl0LiBUaGlzIGFsbG93cyBhIGN1c3RvbSBtZXNzYWdlIHRvIHNob3dcbiAqIHVwIG9uIHRoZSBgUGxheWVyYCBlcnJvciBvdmVybGF5LlxuICpcbiAqIEB0eXBlIHtBcnJheX1cbiAqL1xuTWVkaWFFcnJvci5wcm90b3R5cGUuc3RhdHVzID0gbnVsbDtcblxuLyoqXG4gKiBFcnJvcnMgaW5kZXhlZCBieSB0aGUgVzNDIHN0YW5kYXJkLiBUaGUgb3JkZXIgKipDQU5OT1QgQ0hBTkdFKiohIFNlZSB0aGVcbiAqIHNwZWNpZmljYXRpb24gbGlzdGVkIHVuZGVyIHtAbGluayBNZWRpYUVycm9yfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAZW51bSB7YXJyYXl9XG4gKiBAcmVhZG9ubHlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSAwIC0gTUVESUFfRVJSX0NVU1RPTVxuICogQHByb3BlcnR5IHtzdHJpbmd9IDEgLSBNRURJQV9FUlJfQ1VTVE9NXG4gKiBAcHJvcGVydHkge3N0cmluZ30gMiAtIE1FRElBX0VSUl9BQk9SVEVEXG4gKiBAcHJvcGVydHkge3N0cmluZ30gMyAtIE1FRElBX0VSUl9ORVRXT1JLXG4gKiBAcHJvcGVydHkge3N0cmluZ30gNCAtIE1FRElBX0VSUl9TUkNfTk9UX1NVUFBPUlRFRFxuICogQHByb3BlcnR5IHtzdHJpbmd9IDUgLSBNRURJQV9FUlJfRU5DUllQVEVEXG4gKi9cbk1lZGlhRXJyb3IuZXJyb3JUeXBlcyA9IFsnTUVESUFfRVJSX0NVU1RPTScsICdNRURJQV9FUlJfQUJPUlRFRCcsICdNRURJQV9FUlJfTkVUV09SSycsICdNRURJQV9FUlJfREVDT0RFJywgJ01FRElBX0VSUl9TUkNfTk9UX1NVUFBPUlRFRCcsICdNRURJQV9FUlJfRU5DUllQVEVEJ107XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgYE1lZGlhRXJyb3JgIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZSB7QGxpbmsgTWVkaWFFcnJvci5lcnJvclR5cGVzfS5cbiAqXG4gKiBAdHlwZSB7QXJyYXl9XG4gKiBAY29uc3RhbnRcbiAqL1xuTWVkaWFFcnJvci5kZWZhdWx0TWVzc2FnZXMgPSB7XG4gIDE6ICdZb3UgYWJvcnRlZCB0aGUgbWVkaWEgcGxheWJhY2snLFxuICAyOiAnQSBuZXR3b3JrIGVycm9yIGNhdXNlZCB0aGUgbWVkaWEgZG93bmxvYWQgdG8gZmFpbCBwYXJ0LXdheS4nLFxuICAzOiAnVGhlIG1lZGlhIHBsYXliYWNrIHdhcyBhYm9ydGVkIGR1ZSB0byBhIGNvcnJ1cHRpb24gcHJvYmxlbSBvciBiZWNhdXNlIHRoZSBtZWRpYSB1c2VkIGZlYXR1cmVzIHlvdXIgYnJvd3NlciBkaWQgbm90IHN1cHBvcnQuJyxcbiAgNDogJ1RoZSBtZWRpYSBjb3VsZCBub3QgYmUgbG9hZGVkLCBlaXRoZXIgYmVjYXVzZSB0aGUgc2VydmVyIG9yIG5ldHdvcmsgZmFpbGVkIG9yIGJlY2F1c2UgdGhlIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLicsXG4gIDU6ICdUaGUgbWVkaWEgaXMgZW5jcnlwdGVkIGFuZCB3ZSBkbyBub3QgaGF2ZSB0aGUga2V5cyB0byBkZWNyeXB0IGl0Lidcbn07XG5cbi8vIEFkZCB0eXBlcyBhcyBwcm9wZXJ0aWVzIG9uIE1lZGlhRXJyb3Jcbi8vIGUuZy4gTWVkaWFFcnJvci5NRURJQV9FUlJfU1JDX05PVF9TVVBQT1JURUQgPSA0O1xuZm9yICh2YXIgZXJyTnVtID0gMDsgZXJyTnVtIDwgTWVkaWFFcnJvci5lcnJvclR5cGVzLmxlbmd0aDsgZXJyTnVtKyspIHtcbiAgTWVkaWFFcnJvcltNZWRpYUVycm9yLmVycm9yVHlwZXNbZXJyTnVtXV0gPSBlcnJOdW07XG4gIC8vIHZhbHVlcyBzaG91bGQgYmUgYWNjZXNzaWJsZSBvbiBib3RoIHRoZSBjbGFzcyBhbmQgaW5zdGFuY2VcbiAgTWVkaWFFcnJvci5wcm90b3R5cGVbTWVkaWFFcnJvci5lcnJvclR5cGVzW2Vyck51bV1dID0gZXJyTnVtO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhbiBvYmplY3QgaXMgYFByb21pc2VgLWxpa2UgKGkuZS4gaGFzIGEgYHRoZW5gIG1ldGhvZCkuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSAgdmFsdWVcbiAqICAgICAgICAgQW4gb2JqZWN0IHRoYXQgbWF5IG9yIG1heSBub3QgYmUgYFByb21pc2VgLWxpa2UuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIG9iamVjdCBpcyBgUHJvbWlzZWAtbGlrZS5cbiAqL1xuZnVuY3Rpb24gaXNQcm9taXNlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFNpbGVuY2UgYSBQcm9taXNlLWxpa2Ugb2JqZWN0LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBhdm9pZGluZyBub24taGFybWZ1bCwgYnV0IHBvdGVudGlhbGx5IGNvbmZ1c2luZyBcInVuY2F1Z2h0XG4gKiBwbGF5IHByb21pc2VcIiByZWplY3Rpb24gZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSB2YWx1ZVxuICogICAgICAgICBBbiBvYmplY3QgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBgUHJvbWlzZWAtbGlrZS5cbiAqL1xuZnVuY3Rpb24gc2lsZW5jZVByb21pc2UodmFsdWUpIHtcbiAgaWYgKGlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAgICB2YWx1ZS50aGVuKG51bGwsIGZ1bmN0aW9uIChlKSB7fSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZmlsZSB0ZXh0LXRyYWNrLWxpc3QtY29udmVydGVyLmpzIFV0aWxpdGllcyBmb3IgY2FwdHVyaW5nIHRleHQgdHJhY2sgc3RhdGUgYW5kXG4gKiByZS1jcmVhdGluZyB0cmFja3MgYmFzZWQgb24gYSBjYXB0dXJlLlxuICpcbiAqIEBtb2R1bGUgdGV4dC10cmFjay1saXN0LWNvbnZlcnRlclxuICovXG5cbi8qKlxuICogRXhhbWluZSBhIHNpbmdsZSB7QGxpbmsgVGV4dFRyYWNrfSBhbmQgcmV0dXJuIGEgSlNPTi1jb21wYXRpYmxlIGphdmFzY3JpcHQgb2JqZWN0IHRoYXRcbiAqIHJlcHJlc2VudHMgdGhlIHtAbGluayBUZXh0VHJhY2t9J3Mgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gKiAgICAgICAgVGhlIHRleHQgdHJhY2sgdG8gcXVlcnkuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBBIHNlcmlhbGl6YWJsZSBqYXZhc2NyaXB0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUZXh0VHJhY2suXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgdHJhY2tUb0pzb25fID0gZnVuY3Rpb24gdHJhY2tUb0pzb25fKHRyYWNrKSB7XG4gIHZhciByZXQgPSBbJ2tpbmQnLCAnbGFiZWwnLCAnbGFuZ3VhZ2UnLCAnaWQnLCAnaW5CYW5kTWV0YWRhdGFUcmFja0Rpc3BhdGNoVHlwZScsICdtb2RlJywgJ3NyYyddLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwcm9wLCBpKSB7XG5cbiAgICBpZiAodHJhY2tbcHJvcF0pIHtcbiAgICAgIGFjY1twcm9wXSA9IHRyYWNrW3Byb3BdO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHtcbiAgICBjdWVzOiB0cmFjay5jdWVzICYmIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0cmFjay5jdWVzLCBmdW5jdGlvbiAoY3VlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydFRpbWU6IGN1ZS5zdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IGN1ZS5lbmRUaW1lLFxuICAgICAgICB0ZXh0OiBjdWUudGV4dCxcbiAgICAgICAgaWQ6IGN1ZS5pZFxuICAgICAgfTtcbiAgICB9KVxuICB9KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBFeGFtaW5lIGEge0BsaW5rIFRlY2h9IGFuZCByZXR1cm4gYSBKU09OLWNvbXBhdGlibGUgamF2YXNjcmlwdCBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlXG4gKiBzdGF0ZSBvZiBhbGwge0BsaW5rIFRleHRUcmFja31zIGN1cnJlbnRseSBjb25maWd1cmVkLiBUaGUgcmV0dXJuIGFycmF5IGlzIGNvbXBhdGlibGUgd2l0aFxuICoge0BsaW5rIHRleHQtdHJhY2stbGlzdC1jb252ZXJ0ZXI6anNvblRvVGV4dFRyYWNrc30uXG4gKlxuICogQHBhcmFtIHtUZWNofSB0ZWNoXG4gKiAgICAgICAgVGhlIHRlY2ggb2JqZWN0IHRvIHF1ZXJ5XG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKiAgICAgICAgIEEgc2VyaWFsaXphYmxlIGphdmFzY3JpcHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBUZWNofXNcbiAqICAgICAgICAge0BsaW5rIFRleHRUcmFja0xpc3R9LlxuICovXG52YXIgdGV4dFRyYWNrc1RvSnNvbiA9IGZ1bmN0aW9uIHRleHRUcmFja3NUb0pzb24odGVjaCkge1xuXG4gIHZhciB0cmFja0VscyA9IHRlY2guJCQoJ3RyYWNrJyk7XG5cbiAgdmFyIHRyYWNrT2JqcyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0cmFja0VscywgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC50cmFjaztcbiAgfSk7XG4gIHZhciB0cmFja3MgPSBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwodHJhY2tFbHMsIGZ1bmN0aW9uICh0cmFja0VsKSB7XG4gICAgdmFyIGpzb24gPSB0cmFja1RvSnNvbl8odHJhY2tFbC50cmFjayk7XG5cbiAgICBpZiAodHJhY2tFbC5zcmMpIHtcbiAgICAgIGpzb24uc3JjID0gdHJhY2tFbC5zcmM7XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xuICB9KTtcblxuICByZXR1cm4gdHJhY2tzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodGVjaC50ZXh0VHJhY2tzKCksIGZ1bmN0aW9uICh0cmFjaykge1xuICAgIHJldHVybiB0cmFja09ianMuaW5kZXhPZih0cmFjaykgPT09IC0xO1xuICB9KS5tYXAodHJhY2tUb0pzb25fKSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHNldCBvZiByZW1vdGUge0BsaW5rIFRleHRUcmFja31zIG9uIGEge0BsaW5rIFRlY2h9IGJhc2VkIG9uIGFuIGFycmF5IG9mIGphdmFzY3JpcHRcbiAqIG9iamVjdCB7QGxpbmsgVGV4dFRyYWNrfSByZXByZXNlbnRhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0ganNvblxuICogICAgICAgIEFuIGFycmF5IG9mIGBUZXh0VHJhY2tgIHJlcHJlc2VudGF0aW9uIG9iamVjdHMsIGxpa2UgdGhvc2UgdGhhdCB3b3VsZCBiZVxuICogICAgICAgIHByb2R1Y2VkIGJ5IGB0ZXh0VHJhY2tzVG9Kc29uYC5cbiAqXG4gKiBAcGFyYW0ge1RlY2h9IHRlY2hcbiAqICAgICAgICBUaGUgYFRlY2hgIHRvIGNyZWF0ZSB0aGUgYFRleHRUcmFja2BzIG9uLlxuICovXG52YXIganNvblRvVGV4dFRyYWNrcyA9IGZ1bmN0aW9uIGpzb25Ub1RleHRUcmFja3MoanNvbiwgdGVjaCkge1xuICBqc29uLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7XG4gICAgdmFyIGFkZGVkVHJhY2sgPSB0ZWNoLmFkZFJlbW90ZVRleHRUcmFjayh0cmFjaykudHJhY2s7XG5cbiAgICBpZiAoIXRyYWNrLnNyYyAmJiB0cmFjay5jdWVzKSB7XG4gICAgICB0cmFjay5jdWVzLmZvckVhY2goZnVuY3Rpb24gKGN1ZSkge1xuICAgICAgICByZXR1cm4gYWRkZWRUcmFjay5hZGRDdWUoY3VlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRlY2gudGV4dFRyYWNrcygpO1xufTtcblxudmFyIHRleHRUcmFja0NvbnZlcnRlciA9IHsgdGV4dFRyYWNrc1RvSnNvbjogdGV4dFRyYWNrc1RvSnNvbiwganNvblRvVGV4dFRyYWNrczoganNvblRvVGV4dFRyYWNrcywgdHJhY2tUb0pzb25fOiB0cmFja1RvSnNvbl8gfTtcblxuLyoqXG4gKiBAZmlsZSBtb2RhbC1kaWFsb2cuanNcbiAqL1xudmFyIE1PREFMX0NMQVNTX05BTUUgPSAndmpzLW1vZGFsLWRpYWxvZyc7XG52YXIgRVNDID0gMjc7XG5cbi8qKlxuICogVGhlIGBNb2RhbERpYWxvZ2AgZGlzcGxheXMgb3ZlciB0aGUgdmlkZW8gYW5kIGl0cyBjb250cm9scywgd2hpY2ggYmxvY2tzXG4gKiBpbnRlcmFjdGlvbiB3aXRoIHRoZSBwbGF5ZXIgdW50aWwgaXQgaXMgY2xvc2VkLlxuICpcbiAqIE1vZGFsIGRpYWxvZ3MgaW5jbHVkZSBhIFwiQ2xvc2VcIiBidXR0b24gYW5kIHdpbGwgY2xvc2Ugd2hlbiB0aGF0IGJ1dHRvblxuICogaXMgYWN0aXZhdGVkIC0gb3Igd2hlbiBFU0MgaXMgcHJlc3NlZCBhbnl3aGVyZS5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgTW9kYWxEaWFsb2cgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhNb2RhbERpYWxvZywgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gW29wdGlvbnMuY29udGVudD11bmRlZmluZWRdXG4gICAqICAgICAgICBQcm92aWRlIGN1c3RvbWl6ZWQgY29udGVudCBmb3IgdGhpcyBtb2RhbC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRlc2NyaXB0aW9uXVxuICAgKiAgICAgICAgQSB0ZXh0IGRlc2NyaXB0aW9uIGZvciB0aGUgbW9kYWwsIHByaW1hcmlseSBmb3IgYWNjZXNzaWJpbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5maWxsQWx3YXlzPWZhbHNlXVxuICAgKiAgICAgICAgTm9ybWFsbHksIG1vZGFscyBhcmUgYXV0b21hdGljYWxseSBmaWxsZWQgb25seSB0aGUgZmlyc3QgdGltZVxuICAgKiAgICAgICAgdGhleSBvcGVuLiBUaGlzIHRlbGxzIHRoZSBtb2RhbCB0byByZWZyZXNoIGl0cyBjb250ZW50XG4gICAqICAgICAgICBldmVyeSB0aW1lIGl0IG9wZW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdXG4gICAqICAgICAgICBBIHRleHQgbGFiZWwgZm9yIHRoZSBtb2RhbCwgcHJpbWFyaWx5IGZvciBhY2Nlc3NpYmlsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRlbXBvcmFyeT10cnVlXVxuICAgKiAgICAgICAgSWYgYHRydWVgLCB0aGUgbW9kYWwgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2U7IGl0IHdpbGwgYmVcbiAgICogICAgICAgIGRpc3Bvc2VkIGFzIHNvb24gYXMgaXQncyBjbG9zZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudW5jbG9zZWFibGU9ZmFsc2VdXG4gICAqICAgICAgICBJZiBgdHJ1ZWAsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gY2xvc2UgdGhlIG1vZGFsXG4gICAqICAgICAgICB0aHJvdWdoIHRoZSBVSSBpbiB0aGUgbm9ybWFsIHdheXMuIFByb2dyYW1tYXRpYyBjbG9zaW5nIGlzXG4gICAqICAgICAgICBzdGlsbCBwb3NzaWJsZS5cbiAgICovXG4gIGZ1bmN0aW9uIE1vZGFsRGlhbG9nKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1vZGFsRGlhbG9nKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMub3BlbmVkXyA9IF90aGlzLmhhc0JlZW5PcGVuZWRfID0gX3RoaXMuaGFzQmVlbkZpbGxlZF8gPSBmYWxzZTtcblxuICAgIF90aGlzLmNsb3NlYWJsZSghX3RoaXMub3B0aW9uc18udW5jbG9zZWFibGUpO1xuICAgIF90aGlzLmNvbnRlbnQoX3RoaXMub3B0aW9uc18uY29udGVudCk7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRlbnRFbCBpcyBkZWZpbmVkIEFGVEVSIGFueSBjaGlsZHJlbiBhcmUgaW5pdGlhbGl6ZWRcbiAgICAvLyBiZWNhdXNlIHdlIG9ubHkgd2FudCB0aGUgY29udGVudHMgb2YgdGhlIG1vZGFsIGluIHRoZSBjb250ZW50RWxcbiAgICAvLyAobm90IHRoZSBVSSBlbGVtZW50cyBsaWtlIHRoZSBjbG9zZSBidXR0b24pLlxuICAgIF90aGlzLmNvbnRlbnRFbF8gPSBjcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiBNT0RBTF9DTEFTU19OQU1FICsgJy1jb250ZW50J1xuICAgIH0sIHtcbiAgICAgIHJvbGU6ICdkb2N1bWVudCdcbiAgICB9KTtcblxuICAgIF90aGlzLmRlc2NFbF8gPSBjcmVhdGVFbCgncCcsIHtcbiAgICAgIGNsYXNzTmFtZTogTU9EQUxfQ0xBU1NfTkFNRSArICctZGVzY3JpcHRpb24gdmpzLWNvbnRyb2wtdGV4dCcsXG4gICAgICBpZDogX3RoaXMuZWwoKS5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKVxuICAgIH0pO1xuXG4gICAgdGV4dENvbnRlbnQoX3RoaXMuZGVzY0VsXywgX3RoaXMuZGVzY3JpcHRpb24oKSk7XG4gICAgX3RoaXMuZWxfLmFwcGVuZENoaWxkKF90aGlzLmRlc2NFbF8pO1xuICAgIF90aGlzLmVsXy5hcHBlbmRDaGlsZChfdGhpcy5jb250ZW50RWxfKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgTW9kYWxEaWFsb2dgJ3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgRE9NIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5idWlsZENTU0NsYXNzKCksXG4gICAgICB0YWJJbmRleDogLTFcbiAgICB9LCB7XG4gICAgICAnYXJpYS1kZXNjcmliZWRieSc6IHRoaXMuaWQoKSArICdfZGVzY3JpcHRpb24nLFxuICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLFxuICAgICAgJ2FyaWEtbGFiZWwnOiB0aGlzLmxhYmVsKCksXG4gICAgICAncm9sZSc6ICdkaWFsb2cnXG4gICAgfSk7XG4gIH07XG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHRoaXMuY29udGVudEVsXyA9IG51bGw7XG4gICAgdGhpcy5kZXNjRWxfID0gbnVsbDtcbiAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBudWxsO1xuXG4gICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiBNT0RBTF9DTEFTU19OQU1FICsgJyB2anMtaGlkZGVuICcgKyBfQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYGtleWRvd25gIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQsIGxvb2tpbmcgZm9yIEVTQywgd2hpY2ggY2xvc2VzXG4gICAqIHRoZSBtb2RhbC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZVxuICAgKiAgICAgICAgVGhlIGtleXByZXNzIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZXZlbnQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVLZXlQcmVzcyhlKSB7XG4gICAgaWYgKGUud2hpY2ggPT09IEVTQyAmJiB0aGlzLmNsb3NlYWJsZSgpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYWJlbCBzdHJpbmcgZm9yIHRoaXMgbW9kYWwuIFByaW1hcmlseSB1c2VkIGZvciBhY2Nlc3NpYmlsaXR5LlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgdGhlIGxvY2FsaXplZCBvciByYXcgbGFiZWwgb2YgdGhpcyBtb2RhbC5cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUubGFiZWwgPSBmdW5jdGlvbiBsYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGl6ZSh0aGlzLm9wdGlvbnNfLmxhYmVsIHx8ICdNb2RhbCBXaW5kb3cnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciB0aGlzIG1vZGFsLiBQcmltYXJpbHkgdXNlZCBmb3JcbiAgICogYWNjZXNzaWJpbGl0eS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBsb2NhbGl6ZWQgb3IgcmF3IGRlc2NyaXB0aW9uIG9mIHRoaXMgbW9kYWwuXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmRlc2NyaXB0aW9uID0gZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7XG4gICAgdmFyIGRlc2MgPSB0aGlzLm9wdGlvbnNfLmRlc2NyaXB0aW9uIHx8IHRoaXMubG9jYWxpemUoJ1RoaXMgaXMgYSBtb2RhbCB3aW5kb3cuJyk7XG5cbiAgICAvLyBBcHBlbmQgYSB1bml2ZXJzYWwgY2xvc2VhYmlsaXR5IG1lc3NhZ2UgaWYgdGhlIG1vZGFsIGlzIGNsb3NlYWJsZS5cbiAgICBpZiAodGhpcy5jbG9zZWFibGUoKSkge1xuICAgICAgZGVzYyArPSAnICcgKyB0aGlzLmxvY2FsaXplKCdUaGlzIG1vZGFsIGNhbiBiZSBjbG9zZWQgYnkgcHJlc3NpbmcgdGhlIEVzY2FwZSBrZXkgb3IgYWN0aXZhdGluZyB0aGUgY2xvc2UgYnV0dG9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBkZXNjO1xuICB9O1xuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgbW9kYWwuXG4gICAqXG4gICAqIEBmaXJlcyBNb2RhbERpYWxvZyNiZWZvcmVtb2RhbG9wZW5cbiAgICogQGZpcmVzIE1vZGFsRGlhbG9nI21vZGFsb3BlblxuICAgKi9cblxuXG4gIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24gb3BlbigpIHtcbiAgICBpZiAoIXRoaXMub3BlbmVkXykge1xuICAgICAgdmFyIHBsYXllciA9IHRoaXMucGxheWVyKCk7XG5cbiAgICAgIC8qKlxuICAgICAgICAqIEZpcmVkIGp1c3QgYmVmb3JlIGEgYE1vZGFsRGlhbG9nYCBpcyBvcGVuZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxvcGVuXG4gICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAqL1xuICAgICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVtb2RhbG9wZW4nKTtcbiAgICAgIHRoaXMub3BlbmVkXyA9IHRydWU7XG5cbiAgICAgIC8vIEZpbGwgY29udGVudCBpZiB0aGUgbW9kYWwgaGFzIG5ldmVyIG9wZW5lZCBiZWZvcmUgYW5kXG4gICAgICAvLyBuZXZlciBiZWVuIGZpbGxlZC5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnNfLmZpbGxBbHdheXMgfHwgIXRoaXMuaGFzQmVlbk9wZW5lZF8gJiYgIXRoaXMuaGFzQmVlbkZpbGxlZF8pIHtcbiAgICAgICAgdGhpcy5maWxsKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBwbGF5ZXIgd2FzIHBsYXlpbmcsIHBhdXNlIGl0IGFuZCB0YWtlIG5vdGUgb2YgaXRzIHByZXZpb3VzbHlcbiAgICAgIC8vIHBsYXlpbmcgc3RhdGUuXG4gICAgICB0aGlzLndhc1BsYXlpbmdfID0gIXBsYXllci5wYXVzZWQoKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9uc18ucGF1c2VPbk9wZW4gJiYgdGhpcy53YXNQbGF5aW5nXykge1xuICAgICAgICBwbGF5ZXIucGF1c2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2xvc2VhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5vbih0aGlzLmVsXy5vd25lckRvY3VtZW50LCAna2V5ZG93bicsIGJpbmQodGhpcywgdGhpcy5oYW5kbGVLZXlQcmVzcykpO1xuICAgICAgfVxuXG4gICAgICAvLyBIaWRlIGNvbnRyb2xzIGFuZCBub3RlIGlmIHRoZXkgd2VyZSBlbmFibGVkLlxuICAgICAgdGhpcy5oYWRDb250cm9sc18gPSBwbGF5ZXIuY29udHJvbHMoKTtcbiAgICAgIHBsYXllci5jb250cm9scyhmYWxzZSk7XG5cbiAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgdGhpcy5jb25kaXRpb25hbEZvY3VzXygpO1xuICAgICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcblxuICAgICAgLyoqXG4gICAgICAgICogRmlyZWQganVzdCBhZnRlciBhIGBNb2RhbERpYWxvZ2AgaXMgb3BlbmVkLlxuICAgICAgICAqXG4gICAgICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI21vZGFsb3BlblxuICAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAgKi9cbiAgICAgIHRoaXMudHJpZ2dlcignbW9kYWxvcGVuJyk7XG4gICAgICB0aGlzLmhhc0JlZW5PcGVuZWRfID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIHRoZSBgTW9kYWxEaWFsb2dgIGlzIGN1cnJlbnRseSBvcGVuIG9yIGNsb3NlZC5cbiAgICpcbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gW3ZhbHVlXVxuICAgKiAgICAgICAgIElmIGdpdmVuLCBpdCB3aWxsIG9wZW4gKGB0cnVlYCkgb3IgY2xvc2UgKGBmYWxzZWApIHRoZSBtb2RhbC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICB0aGUgY3VycmVudCBvcGVuIHN0YXRlIG9mIHRoZSBtb2RhbGRpYWxvZ1xuICAgKi9cblxuXG4gIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5vcGVuZWQgPSBmdW5jdGlvbiBvcGVuZWQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXNbdmFsdWUgPyAnb3BlbicgOiAnY2xvc2UnXSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcGVuZWRfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG1vZGFsLCBkb2VzIG5vdGhpbmcgaWYgdGhlIGBNb2RhbERpYWxvZ2AgaXNcbiAgICogbm90IG9wZW4uXG4gICAqXG4gICAqIEBmaXJlcyBNb2RhbERpYWxvZyNiZWZvcmVtb2RhbGNsb3NlXG4gICAqIEBmaXJlcyBNb2RhbERpYWxvZyNtb2RhbGNsb3NlXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLm9wZW5lZF8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBsYXllciA9IHRoaXMucGxheWVyKCk7XG5cbiAgICAvKipcbiAgICAgICogRmlyZWQganVzdCBiZWZvcmUgYSBgTW9kYWxEaWFsb2dgIGlzIGNsb3NlZC5cbiAgICAgICpcbiAgICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI2JlZm9yZW1vZGFsY2xvc2VcbiAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ2JlZm9yZW1vZGFsY2xvc2UnKTtcbiAgICB0aGlzLm9wZW5lZF8gPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLndhc1BsYXlpbmdfICYmIHRoaXMub3B0aW9uc18ucGF1c2VPbk9wZW4pIHtcbiAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xvc2VhYmxlKCkpIHtcbiAgICAgIHRoaXMub2ZmKHRoaXMuZWxfLm93bmVyRG9jdW1lbnQsICdrZXlkb3duJywgYmluZCh0aGlzLCB0aGlzLmhhbmRsZUtleVByZXNzKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFkQ29udHJvbHNfKSB7XG4gICAgICBwbGF5ZXIuY29udHJvbHModHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5oaWRlKCk7XG4gICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgLyoqXG4gICAgICAqIEZpcmVkIGp1c3QgYWZ0ZXIgYSBgTW9kYWxEaWFsb2dgIGlzIGNsb3NlZC5cbiAgICAgICpcbiAgICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI21vZGFsY2xvc2VcbiAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ21vZGFsY2xvc2UnKTtcbiAgICB0aGlzLmNvbmRpdGlvbmFsQmx1cl8oKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnNfLnRlbXBvcmFyeSkge1xuICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGBNb2RhbERpYWxvZ2AgaXMgY2xvc2VhYmxlIHZpYSB0aGUgVUkuXG4gICAqXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IFt2YWx1ZV1cbiAgICogICAgICAgICBJZiBnaXZlbiBhcyBhIGJvb2xlYW4sIGl0IHdpbGwgc2V0IHRoZSBgY2xvc2VhYmxlYCBvcHRpb24uXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqICAgICAgICAgUmV0dXJucyB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIGNsb3NhYmxlIG9wdGlvbi5cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuY2xvc2VhYmxlID0gZnVuY3Rpb24gY2xvc2VhYmxlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB2YXIgY2xvc2VhYmxlID0gdGhpcy5jbG9zZWFibGVfID0gISF2YWx1ZTtcbiAgICAgIHZhciBjbG9zZSA9IHRoaXMuZ2V0Q2hpbGQoJ2Nsb3NlQnV0dG9uJyk7XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgYmVpbmcgbWFkZSBjbG9zZWFibGUgYW5kIGhhcyBubyBjbG9zZSBidXR0b24sIGFkZCBvbmUuXG4gICAgICBpZiAoY2xvc2VhYmxlICYmICFjbG9zZSkge1xuXG4gICAgICAgIC8vIFRoZSBjbG9zZSBidXR0b24gc2hvdWxkIGJlIGEgY2hpbGQgb2YgdGhlIG1vZGFsIC0gbm90IGl0c1xuICAgICAgICAvLyBjb250ZW50IGVsZW1lbnQsIHNvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgY29udGVudCBlbGVtZW50LlxuICAgICAgICB2YXIgdGVtcCA9IHRoaXMuY29udGVudEVsXztcblxuICAgICAgICB0aGlzLmNvbnRlbnRFbF8gPSB0aGlzLmVsXztcbiAgICAgICAgY2xvc2UgPSB0aGlzLmFkZENoaWxkKCdjbG9zZUJ1dHRvbicsIHsgY29udHJvbFRleHQ6ICdDbG9zZSBNb2RhbCBEaWFsb2cnIH0pO1xuICAgICAgICB0aGlzLmNvbnRlbnRFbF8gPSB0ZW1wO1xuICAgICAgICB0aGlzLm9uKGNsb3NlLCAnY2xvc2UnLCB0aGlzLmNsb3NlKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhpcyBpcyBiZWluZyBtYWRlIHVuY2xvc2VhYmxlIGFuZCBoYXMgYSBjbG9zZSBidXR0b24sIHJlbW92ZSBpdC5cbiAgICAgIGlmICghY2xvc2VhYmxlICYmIGNsb3NlKSB7XG4gICAgICAgIHRoaXMub2ZmKGNsb3NlLCAnY2xvc2UnLCB0aGlzLmNsb3NlKTtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChjbG9zZSk7XG4gICAgICAgIGNsb3NlLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VhYmxlXztcbiAgfTtcblxuICAvKipcbiAgICogRmlsbCB0aGUgbW9kYWwncyBjb250ZW50IGVsZW1lbnQgd2l0aCB0aGUgbW9kYWwncyBcImNvbnRlbnRcIiBvcHRpb24uXG4gICAqIFRoZSBjb250ZW50IGVsZW1lbnQgd2lsbCBiZSBlbXB0aWVkIGJlZm9yZSB0aGlzIGNoYW5nZSB0YWtlcyBwbGFjZS5cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwoKSB7XG4gICAgdGhpcy5maWxsV2l0aCh0aGlzLmNvbnRlbnQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpbGwgdGhlIG1vZGFsJ3MgY29udGVudCBlbGVtZW50IHdpdGggYXJiaXRyYXJ5IGNvbnRlbnQuXG4gICAqIFRoZSBjb250ZW50IGVsZW1lbnQgd2lsbCBiZSBlbXB0aWVkIGJlZm9yZSB0aGlzIGNoYW5nZSB0YWtlcyBwbGFjZS5cbiAgICpcbiAgICogQGZpcmVzIE1vZGFsRGlhbG9nI2JlZm9yZW1vZGFsZmlsbFxuICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjbW9kYWxmaWxsXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IFtjb250ZW50XVxuICAgKiAgICAgICAgVGhlIHNhbWUgcnVsZXMgYXBwbHkgdG8gdGhpcyBhcyBhcHBseSB0byB0aGUgYGNvbnRlbnRgIG9wdGlvbi5cbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuZmlsbFdpdGggPSBmdW5jdGlvbiBmaWxsV2l0aChjb250ZW50KSB7XG4gICAgdmFyIGNvbnRlbnRFbCA9IHRoaXMuY29udGVudEVsKCk7XG4gICAgdmFyIHBhcmVudEVsID0gY29udGVudEVsLnBhcmVudE5vZGU7XG4gICAgdmFyIG5leHRTaWJsaW5nRWwgPSBjb250ZW50RWwubmV4dFNpYmxpbmc7XG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBqdXN0IGJlZm9yZSBhIGBNb2RhbERpYWxvZ2AgaXMgZmlsbGVkIHdpdGggY29udGVudC5cbiAgICAgKlxuICAgICAqIEBldmVudCBNb2RhbERpYWxvZyNiZWZvcmVtb2RhbGZpbGxcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVtb2RhbGZpbGwnKTtcbiAgICB0aGlzLmhhc0JlZW5GaWxsZWRfID0gdHJ1ZTtcblxuICAgIC8vIERldGFjaCB0aGUgY29udGVudCBlbGVtZW50IGZyb20gdGhlIERPTSBiZWZvcmUgcGVyZm9ybWluZ1xuICAgIC8vIG1hbmlwdWxhdGlvbiB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIGxpdmUgRE9NIG11bHRpcGxlIHRpbWVzLlxuICAgIHBhcmVudEVsLnJlbW92ZUNoaWxkKGNvbnRlbnRFbCk7XG4gICAgdGhpcy5lbXB0eSgpO1xuICAgIGluc2VydENvbnRlbnQoY29udGVudEVsLCBjb250ZW50KTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBqdXN0IGFmdGVyIGEgYE1vZGFsRGlhbG9nYCBpcyBmaWxsZWQgd2l0aCBjb250ZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI21vZGFsZmlsbFxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ21vZGFsZmlsbCcpO1xuXG4gICAgLy8gUmUtaW5qZWN0IHRoZSByZS1maWxsZWQgY29udGVudCBlbGVtZW50LlxuICAgIGlmIChuZXh0U2libGluZ0VsKSB7XG4gICAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUoY29udGVudEVsLCBuZXh0U2libGluZ0VsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQoY29udGVudEVsKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgY2xvc2UgYnV0dG9uIGlzIGxhc3QgaW4gdGhlIGRpYWxvZyBET01cbiAgICB2YXIgY2xvc2VCdXR0b24gPSB0aGlzLmdldENoaWxkKCdjbG9zZUJ1dHRvbicpO1xuXG4gICAgaWYgKGNsb3NlQnV0dG9uKSB7XG4gICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChjbG9zZUJ1dHRvbi5lbF8pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRW1wdGllcyB0aGUgY29udGVudCBlbGVtZW50LiBUaGlzIGhhcHBlbnMgYW55dGltZSB0aGUgbW9kYWwgaXMgZmlsbGVkLlxuICAgKlxuICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxlbXB0eVxuICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjbW9kYWxlbXB0eVxuICAgKi9cblxuXG4gIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYmVmb3JlIGEgYE1vZGFsRGlhbG9nYCBpcyBlbXB0aWVkLlxuICAgICAqXG4gICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI2JlZm9yZW1vZGFsZW1wdHlcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVtb2RhbGVtcHR5Jyk7XG4gICAgZW1wdHlFbCh0aGlzLmNvbnRlbnRFbCgpKTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYWZ0ZXIgYSBgTW9kYWxEaWFsb2dgIGlzIGVtcHRpZWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjbW9kYWxlbXB0eVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ21vZGFsZW1wdHknKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBtb2RhbCBjb250ZW50LCB3aGljaCBnZXRzIG5vcm1hbGl6ZWQgYmVmb3JlIGJlaW5nXG4gICAqIHJlbmRlcmVkIGludG8gdGhlIERPTS5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCB1cGRhdGUgdGhlIERPTSBvciBmaWxsIHRoZSBtb2RhbCwgYnV0IGl0IGlzIGNhbGxlZCBkdXJpbmdcbiAgICogdGhhdCBwcm9jZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtNaXhlZH0gW3ZhbHVlXVxuICAgKiAgICAgICAgIElmIGRlZmluZWQsIHNldHMgdGhlIGludGVybmFsIGNvbnRlbnQgdmFsdWUgdG8gYmUgdXNlZCBvbiB0aGVcbiAgICogICAgICAgICBuZXh0IGNhbGwocykgdG8gYGZpbGxgLiBUaGlzIHZhbHVlIGlzIG5vcm1hbGl6ZWQgYmVmb3JlIGJlaW5nXG4gICAqICAgICAgICAgaW5zZXJ0ZWQuIFRvIFwiY2xlYXJcIiB0aGUgaW50ZXJuYWwgY29udGVudCB2YWx1ZSwgcGFzcyBgbnVsbGAuXG4gICAqXG4gICAqIEByZXR1cm4ge01peGVkfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIG1vZGFsIGRpYWxvZ1xuICAgKi9cblxuXG4gIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5jb250ZW50ID0gZnVuY3Rpb24gY29udGVudCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRfID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjb25kaXRpb25hbGx5IGZvY3VzIHRoZSBtb2RhbCBkaWFsb2cgaWYgZm9jdXMgd2FzIHByZXZpb3VzbHkgb24gdGhlIHBsYXllci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuY29uZGl0aW9uYWxGb2N1c18gPSBmdW5jdGlvbiBjb25kaXRpb25hbEZvY3VzXygpIHtcbiAgICB2YXIgYWN0aXZlRWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIHZhciBwbGF5ZXJFbCA9IHRoaXMucGxheWVyXy5lbF87XG5cbiAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBudWxsO1xuXG4gICAgaWYgKHBsYXllckVsLmNvbnRhaW5zKGFjdGl2ZUVsKSB8fCBwbGF5ZXJFbCA9PT0gYWN0aXZlRWwpIHtcbiAgICAgIHRoaXMucHJldmlvdXNseUFjdGl2ZUVsXyA9IGFjdGl2ZUVsO1xuXG4gICAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICAgIHRoaXMub24oZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGNvbmRpdGlvbmFsbHkgYmx1ciB0aGUgZWxlbWVudCBhbmQgcmVmb2N1cyB0aGUgbGFzdCBmb2N1c2VkIGVsZW1lbnRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBNb2RhbERpYWxvZy5wcm90b3R5cGUuY29uZGl0aW9uYWxCbHVyXyA9IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQmx1cl8oKSB7XG4gICAgaWYgKHRoaXMucHJldmlvdXNseUFjdGl2ZUVsXykge1xuICAgICAgdGhpcy5wcmV2aW91c2x5QWN0aXZlRWxfLmZvY3VzKCk7XG4gICAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMub2ZmKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEtleWRvd24gaGFuZGxlci4gQXR0YWNoZWQgd2hlbiBtb2RhbCBpcyBmb2N1c2VkLlxuICAgKlxuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmhhbmRsZUtleURvd24gPSBmdW5jdGlvbiBoYW5kbGVLZXlEb3duKGV2ZW50KSB7XG4gICAgLy8gZXhpdCBlYXJseSBpZiBpdCBpc24ndCBhIHRhYiBrZXlcbiAgICBpZiAoZXZlbnQud2hpY2ggIT09IDkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZm9jdXNhYmxlRWxzID0gdGhpcy5mb2N1c2FibGVFbHNfKCk7XG4gICAgdmFyIGFjdGl2ZUVsID0gdGhpcy5lbF8ucXVlcnlTZWxlY3RvcignOmZvY3VzJyk7XG4gICAgdmFyIGZvY3VzSW5kZXggPSB2b2lkIDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvY3VzYWJsZUVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFjdGl2ZUVsID09PSBmb2N1c2FibGVFbHNbaV0pIHtcbiAgICAgICAgZm9jdXNJbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmVsXykge1xuICAgICAgZm9jdXNJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGZvY3VzSW5kZXggPT09IDApIHtcbiAgICAgIGZvY3VzYWJsZUVsc1tmb2N1c2FibGVFbHMubGVuZ3RoIC0gMV0uZm9jdXMoKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgZm9jdXNJbmRleCA9PT0gZm9jdXNhYmxlRWxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGZvY3VzYWJsZUVsc1swXS5mb2N1cygpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGdldCBhbGwgZm9jdXNhYmxlIGVsZW1lbnRzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmZvY3VzYWJsZUVsc18gPSBmdW5jdGlvbiBmb2N1c2FibGVFbHNfKCkge1xuICAgIHZhciBhbGxDaGlsZHJlbiA9IHRoaXMuZWxfLnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTtcblxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYWxsQ2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIChjaGlsZCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQW5jaG9yRWxlbWVudCB8fCBjaGlsZCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQXJlYUVsZW1lbnQpICYmIGNoaWxkLmhhc0F0dHJpYnV0ZSgnaHJlZicpIHx8IChjaGlsZCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50IHx8IGNoaWxkIGluc3RhbmNlb2Ygd2luZG93LkhUTUxTZWxlY3RFbGVtZW50IHx8IGNoaWxkIGluc3RhbmNlb2Ygd2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEJ1dHRvbkVsZW1lbnQpICYmICFjaGlsZC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgfHwgY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTE9iamVjdEVsZW1lbnQgfHwgY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVtYmVkRWxlbWVudCB8fCBjaGlsZC5oYXNBdHRyaWJ1dGUoJ3RhYmluZGV4JykgJiYgY2hpbGQuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpICE9PSAtMSB8fCBjaGlsZC5oYXNBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbERpYWxvZztcbn0oQ29tcG9uZW50KTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIGBNb2RhbERpYWxvZ2AgZGVmYXVsdCBvcHRpb25zLlxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuTW9kYWxEaWFsb2cucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBwYXVzZU9uT3BlbjogdHJ1ZSxcbiAgdGVtcG9yYXJ5OiB0cnVlXG59O1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ01vZGFsRGlhbG9nJywgTW9kYWxEaWFsb2cpO1xuXG4vKipcbiAqIEBmaWxlIHRyYWNrLWxpc3QuanNcbiAqL1xuLyoqXG4gKiBDb21tb24gZnVuY3Rpb25hbGl5IGJldHdlZW4ge0BsaW5rIFRleHRUcmFja0xpc3R9LCB7QGxpbmsgQXVkaW9UcmFja0xpc3R9LCBhbmRcbiAqIHtAbGluayBWaWRlb1RyYWNrTGlzdH1cbiAqXG4gKiBAZXh0ZW5kcyBFdmVudFRhcmdldFxuICovXG5cbnZhciBUcmFja0xpc3QgPSBmdW5jdGlvbiAoX0V2ZW50VGFyZ2V0KSB7XG4gIGluaGVyaXRzKFRyYWNrTGlzdCwgX0V2ZW50VGFyZ2V0KTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtUcmFja1tdfSB0cmFja3NcbiAgICogICAgICAgIEEgbGlzdCBvZiB0cmFja3MgdG8gaW5pdGlhbGl6ZSB0aGUgbGlzdCB3aXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2xpc3RdXG4gICAqICAgICAgICBUaGUgY2hpbGQgb2JqZWN0IHdpdGggaW5oZXJpdGFuY2UgZG9uZSBtYW51YWxseSBmb3IgaWU4LlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGZ1bmN0aW9uIFRyYWNrTGlzdCgpIHtcbiAgICB2YXIgdHJhY2tzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcblxuICAgIHZhciBfcmV0O1xuXG4gICAgdmFyIGxpc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhY2tMaXN0KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0V2ZW50VGFyZ2V0LmNhbGwodGhpcykpO1xuXG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICBsaXN0ID0gX3RoaXM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIGlmIChJU19JRTgpIHtcbiAgICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIFRyYWNrTGlzdC5wcm90b3R5cGUpIHtcbiAgICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGlzdC50cmFja3NfID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyb2YgVHJhY2tMaXN0XG4gICAgICogQG1lbWJlciB7bnVtYmVyfSBsZW5ndGhcbiAgICAgKiAgICAgICAgIFRoZSBjdXJyZW50IG51bWJlciBvZiBgVHJhY2tgcyBpbiB0aGUgdGhpcyBUcmFja2lzdC5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGlzdCwgJ2xlbmd0aCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3NfLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsaXN0LmFkZFRyYWNrKHRyYWNrc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gbXVzdCByZXR1cm4gdGhlIG9iamVjdCwgYXMgZm9yIGllOCBpdCB3aWxsIG5vdCBiZSB0aGlzXG4gICAgLy8gYnV0IGEgcmVmZXJlbmNlIHRvIGEgZG9jdW1lbnQgb2JqZWN0XG4gICAgcmV0dXJuIF9yZXQgPSBsaXN0LCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB7QGxpbmsgVHJhY2t9IHRvIHRoZSBgVHJhY2tMaXN0YFxuICAgKlxuICAgKiBAcGFyYW0ge1RyYWNrfSB0cmFja1xuICAgKiAgICAgICAgVGhlIGF1ZGlvLCB2aWRlbywgb3IgdGV4dCB0cmFjayB0byBhZGQgdG8gdGhlIGxpc3QuXG4gICAqXG4gICAqIEBmaXJlcyBUcmFja0xpc3QjYWRkdHJhY2tcbiAgICovXG5cblxuICBUcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrID0gZnVuY3Rpb24gYWRkVHJhY2sodHJhY2spIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnRyYWNrc18ubGVuZ3RoO1xuXG4gICAgaWYgKCEoJycgKyBpbmRleCBpbiB0aGlzKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGluZGV4LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYWNrc19baW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEbyBub3QgYWRkIGR1cGxpY2F0ZSB0cmFja3NcbiAgICBpZiAodGhpcy50cmFja3NfLmluZGV4T2YodHJhY2spID09PSAtMSkge1xuICAgICAgdGhpcy50cmFja3NfLnB1c2godHJhY2spO1xuICAgICAgLyoqXG4gICAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHRyYWNrIGlzIGFkZGVkIHRvIGEgdHJhY2sgbGlzdC5cbiAgICAgICAqXG4gICAgICAgKiBAZXZlbnQgVHJhY2tMaXN0I2FkZHRyYWNrXG4gICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgKiBAcHJvcGVydHkge1RyYWNrfSB0cmFja1xuICAgICAgICogICAgICAgICAgIEEgcmVmZXJlbmNlIHRvIHRyYWNrIHRoYXQgd2FzIGFkZGVkLlxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoe1xuICAgICAgICB0cmFjazogdHJhY2ssXG4gICAgICAgIHR5cGU6ICdhZGR0cmFjaydcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGEge0BsaW5rIFRyYWNrfSBmcm9tIHRoZSBgVHJhY2tMaXN0YFxuICAgKlxuICAgKiBAcGFyYW0ge1RyYWNrfSBydHJhY2tcbiAgICogICAgICAgIFRoZSBhdWRpbywgdmlkZW8sIG9yIHRleHQgdHJhY2sgdG8gcmVtb3ZlIGZyb20gdGhlIGxpc3QuXG4gICAqXG4gICAqIEBmaXJlcyBUcmFja0xpc3QjcmVtb3ZldHJhY2tcbiAgICovXG5cblxuICBUcmFja0xpc3QucHJvdG90eXBlLnJlbW92ZVRyYWNrID0gZnVuY3Rpb24gcmVtb3ZlVHJhY2socnRyYWNrKSB7XG4gICAgdmFyIHRyYWNrID0gdm9pZCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRoaXNbaV0gPT09IHJ0cmFjaykge1xuICAgICAgICB0cmFjayA9IHRoaXNbaV07XG4gICAgICAgIGlmICh0cmFjay5vZmYpIHtcbiAgICAgICAgICB0cmFjay5vZmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhY2tzXy5zcGxpY2UoaSwgMSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRyYWNrIGxpc3QuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgVHJhY2tMaXN0I3JlbW92ZXRyYWNrXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqIEBwcm9wZXJ0eSB7VHJhY2t9IHRyYWNrXG4gICAgICogICAgICAgICAgIEEgcmVmZXJlbmNlIHRvIHRyYWNrIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKHtcbiAgICAgIHRyYWNrOiB0cmFjayxcbiAgICAgIHR5cGU6ICdyZW1vdmV0cmFjaydcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGEgVHJhY2sgZnJvbSB0aGUgVHJhY2tMaXN0IGJ5IGEgdHJhY2tzIGlkXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIHRoZSBpZCBvZiB0aGUgdHJhY2sgdG8gZ2V0XG4gICAqIEBtZXRob2QgZ2V0VHJhY2tCeUlkXG4gICAqIEByZXR1cm4ge1RyYWNrfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRyYWNrTGlzdC5wcm90b3R5cGUuZ2V0VHJhY2tCeUlkID0gZnVuY3Rpb24gZ2V0VHJhY2tCeUlkKGlkKSB7XG4gICAgdmFyIHJlc3VsdCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0aGlzW2ldO1xuXG4gICAgICBpZiAodHJhY2suaWQgPT09IGlkKSB7XG4gICAgICAgIHJlc3VsdCA9IHRyYWNrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBUcmFja0xpc3Q7XG59KEV2ZW50VGFyZ2V0KTtcblxuLyoqXG4gKiBUcmlnZ2VyZWQgd2hlbiBhIGRpZmZlcmVudCB0cmFjayBpcyBzZWxlY3RlZC9lbmFibGVkLlxuICpcbiAqIEBldmVudCBUcmFja0xpc3QjY2hhbmdlXG4gKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gKi9cblxuLyoqXG4gKiBFdmVudHMgdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggb24gKyBldmVudE5hbWUuIFNlZSB7QGxpbmsgRXZlbnRIYW5kbGVyfS5cbiAqXG4gKiBAcHJvcGVydHkge09iamVjdH0gVHJhY2tMaXN0I2FsbG93ZWRFdmVudHNfXG4gKiBAcHJpdmF0ZVxuICovXG5cblxuVHJhY2tMaXN0LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHtcbiAgY2hhbmdlOiAnY2hhbmdlJyxcbiAgYWRkdHJhY2s6ICdhZGR0cmFjaycsXG4gIHJlbW92ZXRyYWNrOiAncmVtb3ZldHJhY2snXG59O1xuXG4vLyBlbXVsYXRlIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgc3VwcG9ydCB0byBhbGxvdyBmb3IgZmVhdHVyZSBkZXRlY3Rpb25cbmZvciAodmFyIGV2ZW50IGluIFRyYWNrTGlzdC5wcm90b3R5cGUuYWxsb3dlZEV2ZW50c18pIHtcbiAgVHJhY2tMaXN0LnByb3RvdHlwZVsnb24nICsgZXZlbnRdID0gbnVsbDtcbn1cblxuLyoqXG4gKiBAZmlsZSBhdWRpby10cmFjay1saXN0LmpzXG4gKi9cbi8qKlxuICogQW55d2hlcmUgd2UgY2FsbCB0aGlzIGZ1bmN0aW9uIHdlIGRpdmVyZ2UgZnJvbSB0aGUgc3BlY1xuICogYXMgd2Ugb25seSBzdXBwb3J0IG9uZSBlbmFibGVkIGF1ZGlvdHJhY2sgYXQgYSB0aW1lXG4gKlxuICogQHBhcmFtIHtBdWRpb1RyYWNrTGlzdH0gbGlzdFxuICogICAgICAgIGxpc3QgdG8gd29yayBvblxuICpcbiAqIEBwYXJhbSB7QXVkaW9UcmFja30gdHJhY2tcbiAqICAgICAgICBUaGUgdHJhY2sgdG8gc2tpcFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBkaXNhYmxlT3RoZXJzID0gZnVuY3Rpb24gZGlzYWJsZU90aGVycyhsaXN0LCB0cmFjaykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKGxpc3RbaV0pLmxlbmd0aCB8fCB0cmFjay5pZCA9PT0gbGlzdFtpXS5pZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIGFub3RoZXIgYXVkaW8gdHJhY2sgaXMgZW5hYmxlZCwgZGlzYWJsZSBpdFxuICAgIGxpc3RbaV0uZW5hYmxlZCA9IGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGxpc3Qgb2Yge0BsaW5rIEF1ZGlvVHJhY2t9IGZvciBhIG1lZGlhIGZpbGUuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2F1ZGlvdHJhY2tsaXN0fVxuICogQGV4dGVuZHMgVHJhY2tMaXN0XG4gKi9cblxudmFyIEF1ZGlvVHJhY2tMaXN0ID0gZnVuY3Rpb24gKF9UcmFja0xpc3QpIHtcbiAgaW5oZXJpdHMoQXVkaW9UcmFja0xpc3QsIF9UcmFja0xpc3QpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtBdWRpb1RyYWNrW119IFt0cmFja3M9W11dXG4gICAqICAgICAgICBBIGxpc3Qgb2YgYEF1ZGlvVHJhY2tgIHRvIGluc3RhbnRpYXRlIHRoZSBsaXN0IHdpdGguXG4gICAqL1xuICBmdW5jdGlvbiBBdWRpb1RyYWNrTGlzdCgpIHtcbiAgICB2YXIgX3RoaXMsIF9yZXQ7XG5cbiAgICB2YXIgdHJhY2tzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBdWRpb1RyYWNrTGlzdCk7XG5cbiAgICB2YXIgbGlzdCA9IHZvaWQgMDtcblxuICAgIC8vIG1ha2Ugc3VyZSBvbmx5IDEgdHJhY2sgaXMgZW5hYmxlZFxuICAgIC8vIHNvcnRlZCBmcm9tIGxhc3QgaW5kZXggdG8gZmlyc3QgaW5kZXhcbiAgICBmb3IgKHZhciBpID0gdHJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodHJhY2tzW2ldLmVuYWJsZWQpIHtcbiAgICAgICAgZGlzYWJsZU90aGVycyh0cmFja3MsIHRyYWNrc1tpXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElFOCBmb3JjZXMgdXMgdG8gaW1wbGVtZW50IGluaGVyaXRhbmNlIG91cnNlbHZlc1xuICAgIC8vIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LmRlZmluZVByb3BlcnR5IHByb3Blcmx5XG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9wcm9wIGluIEF1ZGlvVHJhY2tMaXN0LnByb3RvdHlwZSkge1xuICAgICAgICBpZiAoX3Byb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W19wcm9wXSA9IEF1ZGlvVHJhY2tMaXN0LnByb3RvdHlwZVtfcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0ID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2tMaXN0LmNhbGwodGhpcywgdHJhY2tzLCBsaXN0KSksIF90aGlzKTtcbiAgICBsaXN0LmNoYW5naW5nXyA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIF9yZXQgPSBsaXN0LCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4ge0BsaW5rIEF1ZGlvVHJhY2t9IHRvIHRoZSBgQXVkaW9UcmFja0xpc3RgLlxuICAgKlxuICAgKiBAcGFyYW0ge0F1ZGlvVHJhY2t9IHRyYWNrXG4gICAqICAgICAgICBUaGUgQXVkaW9UcmFjayB0byBhZGQgdG8gdGhlIGxpc3RcbiAgICpcbiAgICogQGZpcmVzIFRyYWNrTGlzdCNhZGR0cmFja1xuICAgKi9cblxuXG4gIEF1ZGlvVHJhY2tMaXN0LnByb3RvdHlwZS5hZGRUcmFjayA9IGZ1bmN0aW9uIGFkZFRyYWNrKHRyYWNrKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAodHJhY2suZW5hYmxlZCkge1xuICAgICAgZGlzYWJsZU90aGVycyh0aGlzLCB0cmFjayk7XG4gICAgfVxuXG4gICAgX1RyYWNrTGlzdC5wcm90b3R5cGUuYWRkVHJhY2suY2FsbCh0aGlzLCB0cmFjayk7XG4gICAgLy8gbmF0aXZlIHRyYWNrcyBkb24ndCBoYXZlIHRoaXNcbiAgICBpZiAoIXRyYWNrLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbGlzdGVucyBBdWRpb1RyYWNrI2VuYWJsZWRjaGFuZ2VcbiAgICAgKiBAZmlyZXMgVHJhY2tMaXN0I2NoYW5nZVxuICAgICAqL1xuICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2VuYWJsZWRjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyB3aGVuIHdlIGFyZSBkaXNhYmxpbmcgb3RoZXIgdHJhY2tzIChzaW5jZSB3ZSBkb24ndCBzdXBwb3J0XG4gICAgICAvLyBtb3JlIHRoYW4gb25lIHRyYWNrIGF0IGEgdGltZSkgd2Ugd2lsbCBzZXQgY2hhbmdpbmdfXG4gICAgICAvLyB0byB0cnVlIHNvIHRoYXQgd2UgZG9uJ3QgdHJpZ2dlciBhZGRpdGlvbmFsIGNoYW5nZSBldmVudHNcbiAgICAgIGlmIChfdGhpczIuY2hhbmdpbmdfKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF90aGlzMi5jaGFuZ2luZ18gPSB0cnVlO1xuICAgICAgZGlzYWJsZU90aGVycyhfdGhpczIsIHRyYWNrKTtcbiAgICAgIF90aGlzMi5jaGFuZ2luZ18gPSBmYWxzZTtcbiAgICAgIF90aGlzMi50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gQXVkaW9UcmFja0xpc3Q7XG59KFRyYWNrTGlzdCk7XG5cbi8qKlxuICogQGZpbGUgdmlkZW8tdHJhY2stbGlzdC5qc1xuICovXG4vKipcbiAqIFVuLXNlbGVjdCBhbGwgb3RoZXIge0BsaW5rIFZpZGVvVHJhY2t9cyB0aGF0IGFyZSBzZWxlY3RlZC5cbiAqXG4gKiBAcGFyYW0ge1ZpZGVvVHJhY2tMaXN0fSBsaXN0XG4gKiAgICAgICAgbGlzdCB0byB3b3JrIG9uXG4gKlxuICogQHBhcmFtIHtWaWRlb1RyYWNrfSB0cmFja1xuICogICAgICAgIFRoZSB0cmFjayB0byBza2lwXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGRpc2FibGVPdGhlcnMkMSA9IGZ1bmN0aW9uIGRpc2FibGVPdGhlcnMobGlzdCwgdHJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhsaXN0W2ldKS5sZW5ndGggfHwgdHJhY2suaWQgPT09IGxpc3RbaV0uaWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBhbm90aGVyIHZpZGVvIHRyYWNrIGlzIGVuYWJsZWQsIGRpc2FibGUgaXRcbiAgICBsaXN0W2ldLnNlbGVjdGVkID0gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgbGlzdCBvZiB7QGxpbmsgVmlkZW9UcmFja30gZm9yIGEgdmlkZW8uXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3ZpZGVvdHJhY2tsaXN0fVxuICogQGV4dGVuZHMgVHJhY2tMaXN0XG4gKi9cblxudmFyIFZpZGVvVHJhY2tMaXN0ID0gZnVuY3Rpb24gKF9UcmFja0xpc3QpIHtcbiAgaW5oZXJpdHMoVmlkZW9UcmFja0xpc3QsIF9UcmFja0xpc3QpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtWaWRlb1RyYWNrW119IFt0cmFja3M9W11dXG4gICAqICAgICAgICBBIGxpc3Qgb2YgYFZpZGVvVHJhY2tgIHRvIGluc3RhbnRpYXRlIHRoZSBsaXN0IHdpdGguXG4gICAqL1xuICBmdW5jdGlvbiBWaWRlb1RyYWNrTGlzdCgpIHtcbiAgICB2YXIgX3RoaXMsIF9yZXQ7XG5cbiAgICB2YXIgdHJhY2tzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBWaWRlb1RyYWNrTGlzdCk7XG5cbiAgICB2YXIgbGlzdCA9IHZvaWQgMDtcblxuICAgIC8vIG1ha2Ugc3VyZSBvbmx5IDEgdHJhY2sgaXMgZW5hYmxlZFxuICAgIC8vIHNvcnRlZCBmcm9tIGxhc3QgaW5kZXggdG8gZmlyc3QgaW5kZXhcbiAgICBmb3IgKHZhciBpID0gdHJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodHJhY2tzW2ldLnNlbGVjdGVkKSB7XG4gICAgICAgIGRpc2FibGVPdGhlcnMkMSh0cmFja3MsIHRyYWNrc1tpXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElFOCBmb3JjZXMgdXMgdG8gaW1wbGVtZW50IGluaGVyaXRhbmNlIG91cnNlbHZlc1xuICAgIC8vIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LmRlZmluZVByb3BlcnR5IHByb3Blcmx5XG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9wcm9wIGluIFZpZGVvVHJhY2tMaXN0LnByb3RvdHlwZSkge1xuICAgICAgICBpZiAoX3Byb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W19wcm9wXSA9IFZpZGVvVHJhY2tMaXN0LnByb3RvdHlwZVtfcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0ID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2tMaXN0LmNhbGwodGhpcywgdHJhY2tzLCBsaXN0KSksIF90aGlzKTtcbiAgICBsaXN0LmNoYW5naW5nXyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfSBWaWRlb1RyYWNrTGlzdCNzZWxlY3RlZEluZGV4XG4gICAgICogICAgICAgICBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgc2VsZWN0ZWQge0BsaW5rIFZpZGVvVHJhY2tgfS5cbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGlzdCwgJ3NlbGVjdGVkSW5kZXgnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHRoaXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXNbX2ldLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gX2k7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMSgpIHt9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3JldCA9IGxpc3QsIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHtAbGluayBWaWRlb1RyYWNrfSB0byB0aGUgYFZpZGVvVHJhY2tMaXN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtWaWRlb1RyYWNrfSB0cmFja1xuICAgKiAgICAgICAgVGhlIFZpZGVvVHJhY2sgdG8gYWRkIHRvIHRoZSBsaXN0XG4gICAqXG4gICAqIEBmaXJlcyBUcmFja0xpc3QjYWRkdHJhY2tcbiAgICovXG5cblxuICBWaWRlb1RyYWNrTGlzdC5wcm90b3R5cGUuYWRkVHJhY2sgPSBmdW5jdGlvbiBhZGRUcmFjayh0cmFjaykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKHRyYWNrLnNlbGVjdGVkKSB7XG4gICAgICBkaXNhYmxlT3RoZXJzJDEodGhpcywgdHJhY2spO1xuICAgIH1cblxuICAgIF9UcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrLmNhbGwodGhpcywgdHJhY2spO1xuICAgIC8vIG5hdGl2ZSB0cmFja3MgZG9uJ3QgaGF2ZSB0aGlzXG4gICAgaWYgKCF0cmFjay5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGxpc3RlbnMgVmlkZW9UcmFjayNzZWxlY3RlZGNoYW5nZVxuICAgICAqIEBmaXJlcyBUcmFja0xpc3QjY2hhbmdlXG4gICAgICovXG4gICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0ZWRjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMyLmNoYW5naW5nXykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBfdGhpczIuY2hhbmdpbmdfID0gdHJ1ZTtcbiAgICAgIGRpc2FibGVPdGhlcnMkMShfdGhpczIsIHRyYWNrKTtcbiAgICAgIF90aGlzMi5jaGFuZ2luZ18gPSBmYWxzZTtcbiAgICAgIF90aGlzMi50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVmlkZW9UcmFja0xpc3Q7XG59KFRyYWNrTGlzdCk7XG5cbi8qKlxuICogQGZpbGUgdGV4dC10cmFjay1saXN0LmpzXG4gKi9cbi8qKlxuICogVGhlIGN1cnJlbnQgbGlzdCBvZiB7QGxpbmsgVGV4dFRyYWNrfSBmb3IgYSBtZWRpYSBmaWxlLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2tsaXN0fVxuICogQGV4dGVuZHMgVHJhY2tMaXN0XG4gKi9cblxudmFyIFRleHRUcmFja0xpc3QgPSBmdW5jdGlvbiAoX1RyYWNrTGlzdCkge1xuICBpbmhlcml0cyhUZXh0VHJhY2tMaXN0LCBfVHJhY2tMaXN0KTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrW119IFt0cmFja3M9W11dXG4gICAqICAgICAgICBBIGxpc3Qgb2YgYFRleHRUcmFja2AgdG8gaW5zdGFudGlhdGUgdGhlIGxpc3Qgd2l0aC5cbiAgICovXG4gIGZ1bmN0aW9uIFRleHRUcmFja0xpc3QoKSB7XG4gICAgdmFyIF90aGlzLCBfcmV0O1xuXG4gICAgdmFyIHRyYWNrcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dFRyYWNrTGlzdCk7XG5cbiAgICB2YXIgbGlzdCA9IHZvaWQgMDtcblxuICAgIC8vIElFOCBmb3JjZXMgdXMgdG8gaW1wbGVtZW50IGluaGVyaXRhbmNlIG91cnNlbHZlc1xuICAgIC8vIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LmRlZmluZVByb3BlcnR5IHByb3Blcmx5XG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9wcm9wIGluIFRleHRUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChfcHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIGxpc3RbX3Byb3BdID0gVGV4dFRyYWNrTGlzdC5wcm90b3R5cGVbX3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGlzdCA9IChfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RyYWNrTGlzdC5jYWxsKHRoaXMsIHRyYWNrcywgbGlzdCkpLCBfdGhpcyk7XG4gICAgcmV0dXJuIF9yZXQgPSBsaXN0LCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB7QGxpbmsgVGV4dFRyYWNrfSB0byB0aGUgYFRleHRUcmFja0xpc3RgXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfSB0cmFja1xuICAgKiAgICAgICAgVGhlIHRleHQgdHJhY2sgdG8gYWRkIHRvIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAZmlyZXMgVHJhY2tMaXN0I2FkZHRyYWNrXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrTGlzdC5wcm90b3R5cGUuYWRkVHJhY2sgPSBmdW5jdGlvbiBhZGRUcmFjayh0cmFjaykge1xuICAgIF9UcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrLmNhbGwodGhpcywgdHJhY2spO1xuXG4gICAgLyoqXG4gICAgICogQGxpc3RlbnMgVGV4dFRyYWNrI21vZGVjaGFuZ2VcbiAgICAgKiBAZmlyZXMgVHJhY2tMaXN0I2NoYW5nZVxuICAgICAqL1xuICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ21vZGVjaGFuZ2UnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgfSkpO1xuXG4gICAgdmFyIG5vbkxhbmd1YWdlVGV4dFRyYWNrS2luZCA9IFsnbWV0YWRhdGEnLCAnY2hhcHRlcnMnXTtcblxuICAgIGlmIChub25MYW5ndWFnZVRleHRUcmFja0tpbmQuaW5kZXhPZih0cmFjay5raW5kKSA9PT0gLTEpIHtcbiAgICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ21vZGVjaGFuZ2UnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdzZWxlY3RlZGxhbmd1YWdlY2hhbmdlJyk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2tMaXN0O1xufShUcmFja0xpc3QpO1xuXG4vKipcbiAqIEBmaWxlIGh0bWwtdHJhY2stZWxlbWVudC1saXN0LmpzXG4gKi9cblxuLyoqXG4gKiBUaGUgY3VycmVudCBsaXN0IG9mIHtAbGluayBIdG1sVHJhY2tFbGVtZW50fXMuXG4gKi9cblxudmFyIEh0bWxUcmFja0VsZW1lbnRMaXN0ID0gZnVuY3Rpb24gKCkge1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtIdG1sVHJhY2tFbGVtZW50W119IFt0cmFja3M9W11dXG4gICAqICAgICAgICBBIGxpc3Qgb2YgYEh0bWxUcmFja0VsZW1lbnRgIHRvIGluc3RhbnRpYXRlIHRoZSBsaXN0IHdpdGguXG4gICAqL1xuICBmdW5jdGlvbiBIdG1sVHJhY2tFbGVtZW50TGlzdCgpIHtcbiAgICB2YXIgdHJhY2tFbGVtZW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSHRtbFRyYWNrRWxlbWVudExpc3QpO1xuXG4gICAgdmFyIGxpc3QgPSB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY3VzdG9tJyk7XG5cbiAgICAgIGZvciAodmFyIHByb3AgaW4gSHRtbFRyYWNrRWxlbWVudExpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IEh0bWxUcmFja0VsZW1lbnRMaXN0LnByb3RvdHlwZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxpc3QudHJhY2tFbGVtZW50c18gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBtZW1iZXJvZiBIdG1sVHJhY2tFbGVtZW50TGlzdFxuICAgICAqIEBtZW1iZXIge251bWJlcn0gbGVuZ3RoXG4gICAgICogICAgICAgICBUaGUgY3VycmVudCBudW1iZXIgb2YgYFRyYWNrYHMgaW4gdGhlIHRoaXMgVHJhY2tpc3QuXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxpc3QsICdsZW5ndGgnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tFbGVtZW50c18ubGVuZ3RoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRyYWNrRWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxpc3QuYWRkVHJhY2tFbGVtZW50Xyh0cmFja0VsZW1lbnRzW2ldKTtcbiAgICB9XG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIHtAbGluayBIdG1sVHJhY2tFbGVtZW50fSB0byB0aGUgYEh0bWxUcmFja0VsZW1lbnRMaXN0YFxuICAgKlxuICAgKiBAcGFyYW0ge0h0bWxUcmFja0VsZW1lbnR9IHRyYWNrRWxlbWVudFxuICAgKiAgICAgICAgVGhlIHRyYWNrIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIEh0bWxUcmFja0VsZW1lbnRMaXN0LnByb3RvdHlwZS5hZGRUcmFja0VsZW1lbnRfID0gZnVuY3Rpb24gYWRkVHJhY2tFbGVtZW50Xyh0cmFja0VsZW1lbnQpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnRyYWNrRWxlbWVudHNfLmxlbmd0aDtcblxuICAgIGlmICghKCcnICsgaW5kZXggaW4gdGhpcykpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50cmFja0VsZW1lbnRzX1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERvIG5vdCBhZGQgZHVwbGljYXRlIGVsZW1lbnRzXG4gICAgaWYgKHRoaXMudHJhY2tFbGVtZW50c18uaW5kZXhPZih0cmFja0VsZW1lbnQpID09PSAtMSkge1xuICAgICAgdGhpcy50cmFja0VsZW1lbnRzXy5wdXNoKHRyYWNrRWxlbWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgYW4ge0BsaW5rIEh0bWxUcmFja0VsZW1lbnR9IGZyb20gdGhlIGBIdG1sVHJhY2tFbGVtZW50TGlzdGAgZ2l2ZW4gYW5cbiAgICoge0BsaW5rIFRleHRUcmFja30uXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfSB0cmFja1xuICAgKiAgICAgICAgVGhlIHRyYWNrIGFzc29jaWF0ZWQgd2l0aCBhIHRyYWNrIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0h0bWxUcmFja0VsZW1lbnR8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIFRoZSB0cmFjayBlbGVtZW50IHRoYXQgd2FzIGZvdW5kIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBIdG1sVHJhY2tFbGVtZW50TGlzdC5wcm90b3R5cGUuZ2V0VHJhY2tFbGVtZW50QnlUcmFja18gPSBmdW5jdGlvbiBnZXRUcmFja0VsZW1lbnRCeVRyYWNrXyh0cmFjaykge1xuICAgIHZhciB0cmFja0VsZW1lbnRfID0gdm9pZCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMudHJhY2tFbGVtZW50c18ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmFjayA9PT0gdGhpcy50cmFja0VsZW1lbnRzX1tpXS50cmFjaykge1xuICAgICAgICB0cmFja0VsZW1lbnRfID0gdGhpcy50cmFja0VsZW1lbnRzX1tpXTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2tFbGVtZW50XztcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGEge0BsaW5rIEh0bWxUcmFja0VsZW1lbnR9IGZyb20gdGhlIGBIdG1sVHJhY2tFbGVtZW50TGlzdGBcbiAgICpcbiAgICogQHBhcmFtIHtIdG1sVHJhY2tFbGVtZW50fSB0cmFja0VsZW1lbnRcbiAgICogICAgICAgIFRoZSB0cmFjayBlbGVtZW50IHRvIHJlbW92ZSBmcm9tIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIEh0bWxUcmFja0VsZW1lbnRMaXN0LnByb3RvdHlwZS5yZW1vdmVUcmFja0VsZW1lbnRfID0gZnVuY3Rpb24gcmVtb3ZlVHJhY2tFbGVtZW50Xyh0cmFja0VsZW1lbnQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy50cmFja0VsZW1lbnRzXy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRyYWNrRWxlbWVudCA9PT0gdGhpcy50cmFja0VsZW1lbnRzX1tpXSkge1xuICAgICAgICB0aGlzLnRyYWNrRWxlbWVudHNfLnNwbGljZShpLCAxKTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEh0bWxUcmFja0VsZW1lbnRMaXN0O1xufSgpO1xuXG4vKipcbiAqIEBmaWxlIHRleHQtdHJhY2stY3VlLWxpc3QuanNcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUZXh0VHJhY2tDdWVMaXN0flRleHRUcmFja0N1ZVxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZFxuICogICAgICAgICAgIFRoZSB1bmlxdWUgaWQgZm9yIHRoaXMgdGV4dCB0cmFjayBjdWVcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3RhcnRUaW1lXG4gKiAgICAgICAgICAgVGhlIHN0YXJ0IHRpbWUgZm9yIHRoaXMgdGV4dCB0cmFjayBjdWVcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gZW5kVGltZVxuICogICAgICAgICAgIFRoZSBlbmQgdGltZSBmb3IgdGhpcyB0ZXh0IHRyYWNrIGN1ZVxuICpcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGF1c2VPbkV4aXRcbiAqICAgICAgICAgICBQYXVzZSB3aGVuIHRoZSBlbmQgdGltZSBpcyByZWFjaGVkIGlmIHRydWUuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3RleHR0cmFja2N1ZX1cbiAqL1xuXG4vKipcbiAqIEEgTGlzdCBvZiBUZXh0VHJhY2tDdWVzLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2tjdWVsaXN0fVxuICovXG5cbnZhciBUZXh0VHJhY2tDdWVMaXN0ID0gZnVuY3Rpb24gKCkge1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4uXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGN1ZXNcbiAgICogICAgICAgIEEgbGlzdCBvZiBjdWVzIHRvIGJlIGluaXRpYWxpemVkIHdpdGhcbiAgICovXG4gIGZ1bmN0aW9uIFRleHRUcmFja0N1ZUxpc3QoY3Vlcykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFja0N1ZUxpc3QpO1xuXG4gICAgdmFyIGxpc3QgPSB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY3VzdG9tJyk7XG5cbiAgICAgIGZvciAodmFyIHByb3AgaW4gVGV4dFRyYWNrQ3VlTGlzdC5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W3Byb3BdID0gVGV4dFRyYWNrQ3VlTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBUZXh0VHJhY2tDdWVMaXN0LnByb3RvdHlwZS5zZXRDdWVzXy5jYWxsKGxpc3QsIGN1ZXMpO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRleHRUcmFja0N1ZUxpc3RcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9IGxlbmd0aFxuICAgICAqICAgICAgICAgVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGBUZXh0VHJhY2tDdWVgcyBpbiB0aGUgVGV4dFRyYWNrQ3VlTGlzdC5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGlzdCwgJ2xlbmd0aCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGhfO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0dGVyIGZvciBjdWVzIGluIHRoaXMgbGlzdC4gQ3JlYXRlcyBnZXR0ZXJzXG4gICAqIGFuIGFuIGluZGV4IGZvciB0aGUgY3Vlcy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY3Vlc1xuICAgKiAgICAgICAgQW4gYXJyYXkgb2YgY3VlcyB0byBzZXRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUZXh0VHJhY2tDdWVMaXN0LnByb3RvdHlwZS5zZXRDdWVzXyA9IGZ1bmN0aW9uIHNldEN1ZXNfKGN1ZXMpIHtcbiAgICB2YXIgb2xkTGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGwgPSBjdWVzLmxlbmd0aDtcblxuICAgIHRoaXMuY3Vlc18gPSBjdWVzO1xuICAgIHRoaXMubGVuZ3RoXyA9IGN1ZXMubGVuZ3RoO1xuXG4gICAgdmFyIGRlZmluZVByb3AgPSBmdW5jdGlvbiBkZWZpbmVQcm9wKGluZGV4KSB7XG4gICAgICBpZiAoISgnJyArIGluZGV4IGluIHRoaXMpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnJyArIGluZGV4LCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdWVzX1tpbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKG9sZExlbmd0aCA8IGwpIHtcbiAgICAgIGkgPSBvbGRMZW5ndGg7XG5cbiAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGRlZmluZVByb3AuY2FsbCh0aGlzLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIGBUZXh0VHJhY2tDdWVgIHRoYXQgaXMgY3VycmVudGx5IGluIHRoZSBgVGV4dFRyYWNrQ3VlTGlzdGAgYnkgaWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKiAgICAgICAgVGhlIGlkIG9mIHRoZSBjdWUgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yLlxuICAgKlxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2tDdWVMaXN0flRleHRUcmFja0N1ZXxudWxsfVxuICAgKiAgICAgICAgIEEgc2luZ2xlIGN1ZSBvciBudWxsIGlmIG5vbmUgd2FzIGZvdW5kLlxuICAgKi9cblxuXG4gIFRleHRUcmFja0N1ZUxpc3QucHJvdG90eXBlLmdldEN1ZUJ5SWQgPSBmdW5jdGlvbiBnZXRDdWVCeUlkKGlkKSB7XG4gICAgdmFyIHJlc3VsdCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY3VlID0gdGhpc1tpXTtcblxuICAgICAgaWYgKGN1ZS5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmVzdWx0ID0gY3VlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2tDdWVMaXN0O1xufSgpO1xuXG4vKipcbiAqIEBmaWxlIHRyYWNrLWtpbmRzLmpzXG4gKi9cblxuLyoqXG4gKiBBbGwgcG9zc2libGUgYFZpZGVvVHJhY2tLaW5kYHNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNkb20tdmlkZW90cmFjay1raW5kXG4gKiBAdHlwZWRlZiBWaWRlb1RyYWNrfktpbmRcbiAqIEBlbnVtXG4gKi9cbnZhciBWaWRlb1RyYWNrS2luZCA9IHtcbiAgYWx0ZXJuYXRpdmU6ICdhbHRlcm5hdGl2ZScsXG4gIGNhcHRpb25zOiAnY2FwdGlvbnMnLFxuICBtYWluOiAnbWFpbicsXG4gIHNpZ246ICdzaWduJyxcbiAgc3VidGl0bGVzOiAnc3VidGl0bGVzJyxcbiAgY29tbWVudGFyeTogJ2NvbW1lbnRhcnknXG59O1xuXG4vKipcbiAqIEFsbCBwb3NzaWJsZSBgQXVkaW9UcmFja0tpbmRgc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2RvbS1hdWRpb3RyYWNrLWtpbmRcbiAqIEB0eXBlZGVmIEF1ZGlvVHJhY2t+S2luZFxuICogQGVudW1cbiAqL1xudmFyIEF1ZGlvVHJhY2tLaW5kID0ge1xuICAnYWx0ZXJuYXRpdmUnOiAnYWx0ZXJuYXRpdmUnLFxuICAnZGVzY3JpcHRpb25zJzogJ2Rlc2NyaXB0aW9ucycsXG4gICdtYWluJzogJ21haW4nLFxuICAnbWFpbi1kZXNjJzogJ21haW4tZGVzYycsXG4gICd0cmFuc2xhdGlvbic6ICd0cmFuc2xhdGlvbicsXG4gICdjb21tZW50YXJ5JzogJ2NvbW1lbnRhcnknXG59O1xuXG4vKipcbiAqIEFsbCBwb3NzaWJsZSBgVGV4dFRyYWNrS2luZGBzXG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLXRleHR0cmFjay1raW5kXG4gKiBAdHlwZWRlZiBUZXh0VHJhY2t+S2luZFxuICogQGVudW1cbiAqL1xudmFyIFRleHRUcmFja0tpbmQgPSB7XG4gIHN1YnRpdGxlczogJ3N1YnRpdGxlcycsXG4gIGNhcHRpb25zOiAnY2FwdGlvbnMnLFxuICBkZXNjcmlwdGlvbnM6ICdkZXNjcmlwdGlvbnMnLFxuICBjaGFwdGVyczogJ2NoYXB0ZXJzJyxcbiAgbWV0YWRhdGE6ICdtZXRhZGF0YSdcbn07XG5cbi8qKlxuICogQWxsIHBvc3NpYmxlIGBUZXh0VHJhY2tNb2RlYHNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2ttb2RlXG4gKiBAdHlwZWRlZiBUZXh0VHJhY2t+TW9kZVxuICogQGVudW1cbiAqL1xudmFyIFRleHRUcmFja01vZGUgPSB7XG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBzaG93aW5nOiAnc2hvd2luZydcbn07XG5cbi8qKlxuICogQGZpbGUgdHJhY2suanNcbiAqL1xuLyoqXG4gKiBBIFRyYWNrIGNsYXNzIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3Ige0BsaW5rIEF1ZGlvVHJhY2t9LFxuICoge0BsaW5rIFZpZGVvVHJhY2t9LCBhbmQge0BsaW5rIFRleHRUcmFja30uXG4gKlxuICogPiBOb3RlOiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseVxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbH1cbiAqIEBleHRlbmRzIEV2ZW50VGFyZ2V0XG4gKiBAYWJzdHJhY3RcbiAqL1xuXG52YXIgVHJhY2sgPSBmdW5jdGlvbiAoX0V2ZW50VGFyZ2V0KSB7XG4gIGluaGVyaXRzKFRyYWNrLCBfRXZlbnRUYXJnZXQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5raW5kPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCBraW5kIGZvciB0aGUgdHJhY2sgdHlwZSB5b3UgYXJlIGNyZWF0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBBdWRpb1RyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWw9JyddXG4gICAqICAgICAgICBUaGUgbWVudSBsYWJlbCBmb3IgdGhpcyB0cmFjay5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhbmd1YWdlPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0d28gY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgZnVuY3Rpb24gVHJhY2soKSB7XG4gICAgdmFyIF9yZXQ7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhY2spO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfRXZlbnRUYXJnZXQuY2FsbCh0aGlzKSk7XG5cbiAgICB2YXIgdHJhY2sgPSBfdGhpczsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgdHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTtcbiAgICAgIGZvciAodmFyIHByb3AgaW4gVHJhY2sucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgdHJhY2tbcHJvcF0gPSBUcmFjay5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJhY2tQcm9wcyA9IHtcbiAgICAgIGlkOiBvcHRpb25zLmlkIHx8ICd2anNfdHJhY2tfJyArIG5ld0dVSUQoKSxcbiAgICAgIGtpbmQ6IG9wdGlvbnMua2luZCB8fCAnJyxcbiAgICAgIGxhYmVsOiBvcHRpb25zLmxhYmVsIHx8ICcnLFxuICAgICAgbGFuZ3VhZ2U6IG9wdGlvbnMubGFuZ3VhZ2UgfHwgJydcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRyYWNrXG4gICAgICogQG1lbWJlciB7c3RyaW5nfSBpZFxuICAgICAqICAgICAgICAgVGhlIGlkIG9mIHRoaXMgdHJhY2suIENhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyb2YgVHJhY2tcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9IGtpbmRcbiAgICAgKiAgICAgICAgIFRoZSBraW5kIG9mIHRyYWNrIHRoYXQgdGhpcyBpcy4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24uXG4gICAgICogQGluc3RhbmNlXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBtZW1iZXJvZiBUcmFja1xuICAgICAqIEBtZW1iZXIge3N0cmluZ30gbGFiZWxcbiAgICAgKiAgICAgICAgIFRoZSBsYWJlbCBvZiB0aGlzIHRyYWNrLiBDYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbi5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRyYWNrXG4gICAgICogQG1lbWJlciB7c3RyaW5nfSBsYW5ndWFnZVxuICAgICAqICAgICAgICAgVGhlIHR3byBsZXR0ZXIgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyB0cmFjay4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXJcbiAgICAgKiAgICAgICAgIGNyZWF0aW9uLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChrZXkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFjaywga2V5LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICAgIHJldHVybiB0cmFja1Byb3BzW2tleV07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKCkge31cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdHJhY2tQcm9wcykge1xuICAgICAgX2xvb3Aoa2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IHRyYWNrLCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIHJldHVybiBUcmFjaztcbn0oRXZlbnRUYXJnZXQpO1xuXG4vKipcbiAqIEBmaWxlIHVybC5qc1xuICogQG1vZHVsZSB1cmxcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSB1cmw6VVJMT2JqZWN0XG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb3RvY29sXG4gKiAgICAgICAgICAgVGhlIHByb3RvY29sIG9mIHRoZSB1cmwgdGhhdCB3YXMgcGFyc2VkLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBob3N0bmFtZVxuICogICAgICAgICAgIFRoZSBob3N0bmFtZSBvZiB0aGUgdXJsIHRoYXQgd2FzIHBhcnNlZC5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcG9ydFxuICogICAgICAgICAgIFRoZSBwb3J0IG9mIHRoZSB1cmwgdGhhdCB3YXMgcGFyc2VkLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRobmFtZVxuICogICAgICAgICAgIFRoZSBwYXRobmFtZSBvZiB0aGUgdXJsIHRoYXQgd2FzIHBhcnNlZC5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VhcmNoXG4gKiAgICAgICAgICAgVGhlIHNlYXJjaCBxdWVyeSBvZiB0aGUgdXJsIHRoYXQgd2FzIHBhcnNlZC5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGFzaFxuICogICAgICAgICAgIFRoZSBoYXNoIG9mIHRoZSB1cmwgdGhhdCB3YXMgcGFyc2VkLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBob3N0XG4gKiAgICAgICAgICAgVGhlIGhvc3Qgb2YgdGhlIHVybCB0aGF0IHdhcyBwYXJzZWQuXG4gKi9cblxuLyoqXG4gKiBSZXNvbHZlIGFuZCBwYXJzZSB0aGUgZWxlbWVudHMgb2YgYSBVUkwuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB1cmxcbiAqICAgICAgICAgVGhlIHVybCB0byBwYXJzZVxuICpcbiAqIEByZXR1cm4ge3VybDpVUkxPYmplY3R9XG4gKiAgICAgICAgIEFuIG9iamVjdCBvZiB1cmwgZGV0YWlsc1xuICovXG52YXIgcGFyc2VVcmwgPSBmdW5jdGlvbiBwYXJzZVVybCh1cmwpIHtcbiAgdmFyIHByb3BzID0gWydwcm90b2NvbCcsICdob3N0bmFtZScsICdwb3J0JywgJ3BhdGhuYW1lJywgJ3NlYXJjaCcsICdoYXNoJywgJ2hvc3QnXTtcblxuICAvLyBhZGQgdGhlIHVybCB0byBhbiBhbmNob3IgYW5kIGxldCB0aGUgYnJvd3NlciBwYXJzZSB0aGUgVVJMXG4gIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gIGEuaHJlZiA9IHVybDtcblxuICAvLyBJRTggKGFuZCA5PykgRml4XG4gIC8vIGllOCBkb2Vzbid0IHBhcnNlIHRoZSBVUkwgY29ycmVjdGx5IHVudGlsIHRoZSBhbmNob3IgaXMgYWN0dWFsbHlcbiAgLy8gYWRkZWQgdG8gdGhlIGJvZHksIGFuZCBhbiBpbm5lckhUTUwgaXMgbmVlZGVkIHRvIHRyaWdnZXIgdGhlIHBhcnNpbmdcbiAgdmFyIGFkZFRvQm9keSA9IGEuaG9zdCA9PT0gJycgJiYgYS5wcm90b2NvbCAhPT0gJ2ZpbGU6JztcbiAgdmFyIGRpdiA9IHZvaWQgMDtcblxuICBpZiAoYWRkVG9Cb2R5KSB7XG4gICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmlubmVySFRNTCA9ICc8YSBocmVmPVwiJyArIHVybCArICdcIj48L2E+JztcbiAgICBhID0gZGl2LmZpcnN0Q2hpbGQ7XG4gICAgLy8gcHJldmVudCB0aGUgZGl2IGZyb20gYWZmZWN0aW5nIGxheW91dFxuICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6bm9uZTsgcG9zaXRpb246YWJzb2x1dGU7Jyk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICB9XG5cbiAgLy8gQ29weSB0aGUgc3BlY2lmaWMgVVJMIHByb3BlcnRpZXMgdG8gYSBuZXcgb2JqZWN0XG4gIC8vIFRoaXMgaXMgYWxzbyBuZWVkZWQgZm9yIElFOCBiZWNhdXNlIHRoZSBhbmNob3IgbG9zZXMgaXRzXG4gIC8vIHByb3BlcnRpZXMgd2hlbiBpdCdzIHJlbW92ZWQgZnJvbSB0aGUgZG9tXG4gIHZhciBkZXRhaWxzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIGRldGFpbHNbcHJvcHNbaV1dID0gYVtwcm9wc1tpXV07XG4gIH1cblxuICAvLyBJRTkgYWRkcyB0aGUgcG9ydCB0byB0aGUgaG9zdCBwcm9wZXJ0eSB1bmxpa2UgZXZlcnlvbmUgZWxzZS4gSWZcbiAgLy8gYSBwb3J0IGlkZW50aWZpZXIgaXMgYWRkZWQgZm9yIHN0YW5kYXJkIHBvcnRzLCBzdHJpcCBpdC5cbiAgaWYgKGRldGFpbHMucHJvdG9jb2wgPT09ICdodHRwOicpIHtcbiAgICBkZXRhaWxzLmhvc3QgPSBkZXRhaWxzLmhvc3QucmVwbGFjZSgvOjgwJC8sICcnKTtcbiAgfVxuXG4gIGlmIChkZXRhaWxzLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgIGRldGFpbHMuaG9zdCA9IGRldGFpbHMuaG9zdC5yZXBsYWNlKC86NDQzJC8sICcnKTtcbiAgfVxuXG4gIGlmICghZGV0YWlscy5wcm90b2NvbCkge1xuICAgIGRldGFpbHMucHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7XG4gIH1cblxuICBpZiAoYWRkVG9Cb2R5KSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpO1xuICB9XG5cbiAgcmV0dXJuIGRldGFpbHM7XG59O1xuXG4vKipcbiAqIEdldCBhYnNvbHV0ZSB2ZXJzaW9uIG9mIHJlbGF0aXZlIFVSTC4gVXNlZCB0byB0ZWxsIGZsYXNoIGNvcnJlY3QgVVJMLlxuICpcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVybFxuICogICAgICAgICBVUkwgdG8gbWFrZSBhYnNvbHV0ZVxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgQWJzb2x1dGUgVVJMXG4gKlxuICogQHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ3MDgzMi9nZXR0aW5nLWFuLWFic29sdXRlLXVybC1mcm9tLWEtcmVsYXRpdmUtb25lLWllNi1pc3N1ZVxuICovXG52YXIgZ2V0QWJzb2x1dGVVUkwgPSBmdW5jdGlvbiBnZXRBYnNvbHV0ZVVSTCh1cmwpIHtcbiAgLy8gQ2hlY2sgaWYgYWJzb2x1dGUgVVJMXG4gIGlmICghdXJsLm1hdGNoKC9eaHR0cHM/OlxcL1xcLy8pKSB7XG4gICAgLy8gQ29udmVydCB0byBhYnNvbHV0ZSBVUkwuIEZsYXNoIGhvc3RlZCBvZmYtc2l0ZSBuZWVkcyBhbiBhYnNvbHV0ZSBVUkwuXG4gICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgZGl2LmlubmVySFRNTCA9ICc8YSBocmVmPVwiJyArIHVybCArICdcIj54PC9hPic7XG4gICAgdXJsID0gZGl2LmZpcnN0Q2hpbGQuaHJlZjtcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvZiB0aGUgcGFzc2VkIGZpbGUgbmFtZS4gSXQgd2lsbCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nXG4gKiBpZiBwYXNzZWQgYW4gaW52YWxpZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiAgICAgICAgVGhlIGZpbGVOYW1lIHBhdGggbGlrZSAnL3BhdGgvdG8vZmlsZS5tcDQnXG4gKlxuICogQHJldHVybnMge3N0cmluZ31cbiAqICAgICAgICAgIFRoZSBleHRlbnNpb24gaW4gbG93ZXIgY2FzZSBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9cbiAqICAgICAgICAgIGV4dGVuc2lvbiBjb3VsZCBiZSBmb3VuZC5cbiAqL1xudmFyIGdldEZpbGVFeHRlbnNpb24gPSBmdW5jdGlvbiBnZXRGaWxlRXh0ZW5zaW9uKHBhdGgpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgIHZhciBzcGxpdFBhdGhSZSA9IC9eKFxcLz8pKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/KShcXC4oW15cXC5cXC9cXD9dKykpKSg/OltcXC9dKnxbXFw/XS4qKSQvaTtcbiAgICB2YXIgcGF0aFBhcnRzID0gc3BsaXRQYXRoUmUuZXhlYyhwYXRoKTtcblxuICAgIGlmIChwYXRoUGFydHMpIHtcbiAgICAgIHJldHVybiBwYXRoUGFydHMucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgdXJsIHBhc3NlZCBpcyBhIGNyb3NzIGRvbWFpbiByZXF1ZXN0IG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKiAgICAgICAgVGhlIHVybCB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICBXaGV0aGVyIGl0IGlzIGEgY3Jvc3MgZG9tYWluIHJlcXVlc3Qgb3Igbm90LlxuICovXG52YXIgaXNDcm9zc09yaWdpbiA9IGZ1bmN0aW9uIGlzQ3Jvc3NPcmlnaW4odXJsKSB7XG4gIHZhciB3aW5Mb2MgPSB3aW5kb3cubG9jYXRpb247XG4gIHZhciB1cmxJbmZvID0gcGFyc2VVcmwodXJsKTtcblxuICAvLyBJRTggcHJvdG9jb2wgcmVsYXRpdmUgdXJscyB3aWxsIHJldHVybiAnOicgZm9yIHByb3RvY29sXG4gIHZhciBzcmNQcm90b2NvbCA9IHVybEluZm8ucHJvdG9jb2wgPT09ICc6JyA/IHdpbkxvYy5wcm90b2NvbCA6IHVybEluZm8ucHJvdG9jb2w7XG5cbiAgLy8gQ2hlY2sgaWYgdXJsIGlzIGZvciBhbm90aGVyIGRvbWFpbi9vcmlnaW5cbiAgLy8gSUU4IGRvZXNuJ3Qga25vdyBsb2NhdGlvbi5vcmlnaW4sIHNvIHdlIHdvbid0IHJlbHkgb24gaXQgaGVyZVxuICB2YXIgY3Jvc3NPcmlnaW4gPSBzcmNQcm90b2NvbCArIHVybEluZm8uaG9zdCAhPT0gd2luTG9jLnByb3RvY29sICsgd2luTG9jLmhvc3Q7XG5cbiAgcmV0dXJuIGNyb3NzT3JpZ2luO1xufTtcblxudmFyIFVybCA9IChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkoe1xuXHRwYXJzZVVybDogcGFyc2VVcmwsXG5cdGdldEFic29sdXRlVVJMOiBnZXRBYnNvbHV0ZVVSTCxcblx0Z2V0RmlsZUV4dGVuc2lvbjogZ2V0RmlsZUV4dGVuc2lvbixcblx0aXNDcm9zc09yaWdpbjogaXNDcm9zc09yaWdpblxufSk7XG5cbi8qKlxuICogQGZpbGUgdGV4dC10cmFjay5qc1xuICovXG4vKipcbiAqIFRha2VzIGEgd2VidnR0IGZpbGUgY29udGVudHMgYW5kIHBhcnNlcyBpdCBpbnRvIGN1ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjQ29udGVudFxuICogICAgICAgIHdlYlZUVCBmaWxlIGNvbnRlbnRzXG4gKlxuICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gKiAgICAgICAgVGV4dFRyYWNrIHRvIGFkZCBjdWVzIHRvLiBDdWVzIGNvbWUgZnJvbSB0aGUgc3JjQ29udGVudC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgcGFyc2VDdWVzID0gZnVuY3Rpb24gcGFyc2VDdWVzKHNyY0NvbnRlbnQsIHRyYWNrKSB7XG4gIHZhciBwYXJzZXIgPSBuZXcgd2luZG93LldlYlZUVC5QYXJzZXIod2luZG93LCB3aW5kb3cudnR0anMsIHdpbmRvdy5XZWJWVFQuU3RyaW5nRGVjb2RlcigpKTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuXG4gIHBhcnNlci5vbmN1ZSA9IGZ1bmN0aW9uIChjdWUpIHtcbiAgICB0cmFjay5hZGRDdWUoY3VlKTtcbiAgfTtcblxuICBwYXJzZXIub25wYXJzaW5nZXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBlcnJvcnMucHVzaChlcnJvcik7XG4gIH07XG5cbiAgcGFyc2VyLm9uZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdHJhY2sudHJpZ2dlcih7XG4gICAgICB0eXBlOiAnbG9hZGVkZGF0YScsXG4gICAgICB0YXJnZXQ6IHRyYWNrXG4gICAgfSk7XG4gIH07XG5cbiAgcGFyc2VyLnBhcnNlKHNyY0NvbnRlbnQpO1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAod2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQpIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmdyb3VwQ29sbGFwc2VkKCdUZXh0IFRyYWNrIHBhcnNpbmcgZXJyb3JzIGZvciAnICsgdHJhY2suc3JjKTtcbiAgICB9XG4gICAgZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICByZXR1cm4gbG9nJDEuZXJyb3IoZXJyb3IpO1xuICAgIH0pO1xuICAgIGlmICh3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5ncm91cEVuZCkge1xuICAgICAgd2luZG93LmNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZXIuZmx1c2goKTtcbn07XG5cbi8qKlxuICogTG9hZCBhIGBUZXh0VHJhY2tgIGZyb20gYSBzcGVjaWZlZCB1cmwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICogICAgICAgIFVybCB0byBsb2FkIHRyYWNrIGZyb20uXG4gKlxuICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gKiAgICAgICAgVHJhY2sgdG8gYWRkIGN1ZXMgdG8uIENvbWVzIGZyb20gdGhlIGNvbnRlbnQgYXQgdGhlIGVuZCBvZiBgdXJsYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgbG9hZFRyYWNrID0gZnVuY3Rpb24gbG9hZFRyYWNrKHNyYywgdHJhY2spIHtcbiAgdmFyIG9wdHMgPSB7XG4gICAgdXJpOiBzcmNcbiAgfTtcbiAgdmFyIGNyb3NzT3JpZ2luID0gaXNDcm9zc09yaWdpbihzcmMpO1xuXG4gIGlmIChjcm9zc09yaWdpbikge1xuICAgIG9wdHMuY29ycyA9IGNyb3NzT3JpZ2luO1xuICB9XG5cbiAgeGhyKG9wdHMsIGJpbmQodGhpcywgZnVuY3Rpb24gKGVyciwgcmVzcG9uc2UsIHJlc3BvbnNlQm9keSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBsb2ckMS5lcnJvcihlcnIsIHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICB0cmFjay5sb2FkZWRfID0gdHJ1ZTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHZ0dGpzIGhhcyBsb2FkZWQsIG90aGVyd2lzZSwgd2FpdCB0aWxsIGl0IGZpbmlzaGVkIGxvYWRpbmdcbiAgICAvLyBOT1RFOiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgdGhlIGFsdC92aWRlby5ub3Z0dC5qcyBidWlsZFxuICAgIGlmICh0eXBlb2Ygd2luZG93LldlYlZUVCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHRyYWNrLnRlY2hfKSB7XG4gICAgICAgIHZhciBsb2FkSGFuZGxlciA9IGZ1bmN0aW9uIGxvYWRIYW5kbGVyKCkge1xuICAgICAgICAgIHJldHVybiBwYXJzZUN1ZXMocmVzcG9uc2VCb2R5LCB0cmFjayk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdHJhY2sudGVjaF8ub24oJ3Z0dGpzbG9hZGVkJywgbG9hZEhhbmRsZXIpO1xuICAgICAgICB0cmFjay50ZWNoXy5vbigndnR0anNlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsb2ckMS5lcnJvcigndnR0anMgZmFpbGVkIHRvIGxvYWQsIHN0b3BwaW5nIHRyeWluZyB0byBwcm9jZXNzICcgKyB0cmFjay5zcmMpO1xuICAgICAgICAgIHRyYWNrLnRlY2hfLm9mZigndnR0anNsb2FkZWQnLCBsb2FkSGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZUN1ZXMocmVzcG9uc2VCb2R5LCB0cmFjayk7XG4gICAgfVxuICB9KSk7XG59O1xuXG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgYFRleHRUcmFja2AuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3RleHR0cmFja31cbiAqIEBleHRlbmRzIFRyYWNrXG4gKi9cblxudmFyIFRleHRUcmFjayA9IGZ1bmN0aW9uIChfVHJhY2spIHtcbiAgaW5oZXJpdHMoVGV4dFRyYWNrLCBfVHJhY2spO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnM9e31cbiAgICogICAgICAgIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlc1xuICAgKlxuICAgKiBAcGFyYW0ge1RlY2h9IG9wdGlvbnMudGVjaFxuICAgKiAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHRlY2ggdGhhdCBvd25zIHRoaXMgVGV4dFRyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja35LaW5kfSBbb3B0aW9ucy5raW5kPSdzdWJ0aXRsZXMnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0ZXh0IHRyYWNrIGtpbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfk1vZGV9IFtvcHRpb25zLm1vZGU9J2Rpc2FibGVkJ11cbiAgICogICAgICAgIEEgdmFsaWQgdGV4dCB0cmFjayBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBUZXh0VHJhY2suXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbD0nJ11cbiAgICogICAgICAgIFRoZSBtZW51IGxhYmVsIGZvciB0aGlzIHRyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFuZ3VhZ2U9JyddXG4gICAqICAgICAgICBBIHZhbGlkIHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNyY2xhbmc9JyddXG4gICAqICAgICAgICBBIHZhbGlkIHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS4gQW4gYWx0ZXJuYXRpdmUsIGJ1dCBkZXByaW9yaXRpemVkXG4gICAqICAgICAgICB2ZXNpb24gb2YgYG9wdGlvbnMubGFuZ3VhZ2VgXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zcmNdXG4gICAqICAgICAgICBBIHVybCB0byBUZXh0VHJhY2sgY3Vlcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWZhdWx0XVxuICAgKiAgICAgICAgSWYgdGhpcyB0cmFjayBzaG91bGQgZGVmYXVsdCB0byBvbiBvciBvZmYuXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0VHJhY2soKSB7XG4gICAgdmFyIF90aGlzLCBfcmV0O1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFjayk7XG5cbiAgICBpZiAoIW9wdGlvbnMudGVjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHRlY2ggd2FzIG5vdCBwcm92aWRlZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgc2V0dGluZ3MgPSBtZXJnZU9wdGlvbnMob3B0aW9ucywge1xuICAgICAga2luZDogVGV4dFRyYWNrS2luZFtvcHRpb25zLmtpbmRdIHx8ICdzdWJ0aXRsZXMnLFxuICAgICAgbGFuZ3VhZ2U6IG9wdGlvbnMubGFuZ3VhZ2UgfHwgb3B0aW9ucy5zcmNsYW5nIHx8ICcnXG4gICAgfSk7XG4gICAgdmFyIG1vZGUgPSBUZXh0VHJhY2tNb2RlW3NldHRpbmdzLm1vZGVdIHx8ICdkaXNhYmxlZCc7XG4gICAgdmFyIGRlZmF1bHRfID0gc2V0dGluZ3NbJ2RlZmF1bHQnXTtcblxuICAgIGlmIChzZXR0aW5ncy5raW5kID09PSAnbWV0YWRhdGEnIHx8IHNldHRpbmdzLmtpbmQgPT09ICdjaGFwdGVycycpIHtcbiAgICAgIG1vZGUgPSAnaGlkZGVuJztcbiAgICB9XG4gICAgLy8gb24gSUU4IHRoaXMgd2lsbCBiZSBhIGRvY3VtZW50IGVsZW1lbnRcbiAgICAvLyBmb3IgZXZlcnkgb3RoZXIgYnJvd3NlciB0aGlzIHdpbGwgYmUgYSBub3JtYWwgb2JqZWN0XG4gICAgdmFyIHR0ID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2suY2FsbCh0aGlzLCBzZXR0aW5ncykpLCBfdGhpcyk7XG5cbiAgICB0dC50ZWNoXyA9IHNldHRpbmdzLnRlY2g7XG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICBmb3IgKHZhciBwcm9wIGluIFRleHRUcmFjay5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0dFtwcm9wXSA9IFRleHRUcmFjay5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0dC5jdWVzXyA9IFtdO1xuICAgIHR0LmFjdGl2ZUN1ZXNfID0gW107XG5cbiAgICB2YXIgY3VlcyA9IG5ldyBUZXh0VHJhY2tDdWVMaXN0KHR0LmN1ZXNfKTtcbiAgICB2YXIgYWN0aXZlQ3VlcyA9IG5ldyBUZXh0VHJhY2tDdWVMaXN0KHR0LmFjdGl2ZUN1ZXNfKTtcbiAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciB0aW1ldXBkYXRlSGFuZGxlciA9IGJpbmQodHQsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgLy8gQWNjZXNzaW5nIHRoaXMuYWN0aXZlQ3VlcyBmb3IgdGhlIHNpZGUtZWZmZWN0cyBvZiB1cGRhdGluZyBpdHNlbGZcbiAgICAgIC8vIGR1ZSB0byBpdCdzIG5hdHVyZSBhcyBhIGdldHRlciBmdW5jdGlvbi4gRG8gbm90IHJlbW92ZSBvciBjdWVzIHdpbGxcbiAgICAgIC8vIHN0b3AgdXBkYXRpbmchXG4gICAgICAvLyBVc2UgdGhlIHNldHRlciB0byBwcmV2ZW50IGRlbGV0aW9uIGZyb20gdWdsaWZ5IChwdXJlX2dldHRlcnMgcnVsZSlcbiAgICAgIHRoaXMuYWN0aXZlQ3VlcyA9IHRoaXMuYWN0aXZlQ3VlcztcbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcignY3VlY2hhbmdlJyk7XG4gICAgICAgIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChtb2RlICE9PSAnZGlzYWJsZWQnKSB7XG4gICAgICB0dC50ZWNoXy5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHR0LnRlY2hfLm9uKCd0aW1ldXBkYXRlJywgdGltZXVwZGF0ZUhhbmRsZXIpO1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRleHRUcmFja1xuICAgICAqIEBtZW1iZXIge2Jvb2xlYW59IGRlZmF1bHRcbiAgICAgKiAgICAgICAgIElmIHRoaXMgdHJhY2sgd2FzIHNldCB0byBiZSBvbiBvciBvZmYgYnkgZGVmYXVsdC4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXJcbiAgICAgKiAgICAgICAgIGNyZWF0aW9uLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR0LCAnZGVmYXVsdCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdF87XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEoKSB7fVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRleHRUcmFja1xuICAgICAqIEBtZW1iZXIge3N0cmluZ30gbW9kZVxuICAgICAqICAgICAgICAgU2V0IHRoZSBtb2RlIG9mIHRoaXMgVGV4dFRyYWNrIHRvIGEgdmFsaWQge0BsaW5rIFRleHRUcmFja35Nb2RlfS4gV2lsbFxuICAgICAqICAgICAgICAgbm90IGJlIHNldCBpZiBzZXR0aW5nIHRvIGFuIGludmFsaWQgbW9kZS5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEBmaXJlcyBUZXh0VHJhY2sjbW9kZWNoYW5nZVxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0dCwgJ21vZGUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgcmV0dXJuIG1vZGU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobmV3TW9kZSkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICBpZiAoIVRleHRUcmFja01vZGVbbmV3TW9kZV0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbW9kZSA9IG5ld01vZGU7XG4gICAgICAgIGlmIChtb2RlID09PSAnc2hvd2luZycpIHtcblxuICAgICAgICAgIHRoaXMudGVjaF8ucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLnRlY2hfLm9uKCd0aW1ldXBkYXRlJywgdGltZXVwZGF0ZUhhbmRsZXIpO1xuICAgICAgICAgIH0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBldmVudCB0aGF0IGZpcmVzIHdoZW4gbW9kZSBjaGFuZ2VzIG9uIHRoaXMgdHJhY2suIFRoaXMgYWxsb3dzXG4gICAgICAgICAqIHRoZSBUZXh0VHJhY2tMaXN0IHRoYXQgaG9sZHMgdGhpcyB0cmFjayB0byBhY3QgYWNjb3JkaW5nbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqID4gTm90ZTogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgc3BlYyFcbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFRleHRUcmFjayNtb2RlY2hhbmdlXG4gICAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJpZ2dlcignbW9kZWNoYW5nZScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFRleHRUcmFja1xuICAgICAqIEBtZW1iZXIge1RleHRUcmFja0N1ZUxpc3R9IGN1ZXNcbiAgICAgKiAgICAgICAgIFRoZSB0ZXh0IHRyYWNrIGN1ZSBsaXN0IGZvciB0aGlzIFRleHRUcmFjay5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHQsICdjdWVzJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkZWRfKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VlcztcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMSgpIHt9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyb2YgVGV4dFRyYWNrXG4gICAgICogQG1lbWJlciB7VGV4dFRyYWNrQ3VlTGlzdH0gYWN0aXZlQ3Vlc1xuICAgICAqICAgICAgICAgVGhlIGxpc3QgdGV4dCB0cmFjayBjdWVzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmUgZm9yIHRoaXMgVGV4dFRyYWNrLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0dCwgJ2FjdGl2ZUN1ZXMnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRlZF8pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgaWYgKHRoaXMuY3Vlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gYWN0aXZlQ3VlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdCA9IHRoaXMudGVjaF8uY3VycmVudFRpbWUoKTtcbiAgICAgICAgdmFyIGFjdGl2ZSA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5jdWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHZhciBjdWUgPSB0aGlzLmN1ZXNbaV07XG5cbiAgICAgICAgICBpZiAoY3VlLnN0YXJ0VGltZSA8PSBjdCAmJiBjdWUuZW5kVGltZSA+PSBjdCkge1xuICAgICAgICAgICAgYWN0aXZlLnB1c2goY3VlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1ZS5zdGFydFRpbWUgPT09IGN1ZS5lbmRUaW1lICYmIGN1ZS5zdGFydFRpbWUgPD0gY3QgJiYgY3VlLnN0YXJ0VGltZSArIDAuNSA+PSBjdCkge1xuICAgICAgICAgICAgYWN0aXZlLnB1c2goY3VlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGggIT09IHRoaXMuYWN0aXZlQ3Vlc18ubGVuZ3RoKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFjdGl2ZS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUN1ZXNfLmluZGV4T2YoYWN0aXZlW19pXSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aXZlQ3Vlc18gPSBhY3RpdmU7XG4gICAgICAgIGFjdGl2ZUN1ZXMuc2V0Q3Vlc18odGhpcy5hY3RpdmVDdWVzXyk7XG5cbiAgICAgICAgcmV0dXJuIGFjdGl2ZUN1ZXM7XG4gICAgICB9LFxuXG5cbiAgICAgIC8vIC8hXFwgS2VlcCB0aGlzIHNldHRlciBlbXB0eSAoc2VlIHRoZSB0aW1ldXBkYXRlIGhhbmRsZXIgYWJvdmUpXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMSgpIHt9XG4gICAgfSk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc3JjKSB7XG4gICAgICB0dC5zcmMgPSBzZXR0aW5ncy5zcmM7XG4gICAgICBsb2FkVHJhY2soc2V0dGluZ3Muc3JjLCB0dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR0LmxvYWRlZF8gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gdHQsIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGN1ZSB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBjdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja35DdWV9IGN1ZVxuICAgKiAgICAgICAgVGhlIGN1ZSB0byBhZGQgdG8gb3VyIGludGVybmFsIGxpc3RcbiAgICovXG5cblxuICBUZXh0VHJhY2sucHJvdG90eXBlLmFkZEN1ZSA9IGZ1bmN0aW9uIGFkZEN1ZShvcmlnaW5hbEN1ZSkge1xuICAgIHZhciBjdWUgPSBvcmlnaW5hbEN1ZTtcblxuICAgIGlmICh3aW5kb3cudnR0anMgJiYgIShvcmlnaW5hbEN1ZSBpbnN0YW5jZW9mIHdpbmRvdy52dHRqcy5WVFRDdWUpKSB7XG4gICAgICBjdWUgPSBuZXcgd2luZG93LnZ0dGpzLlZUVEN1ZShvcmlnaW5hbEN1ZS5zdGFydFRpbWUsIG9yaWdpbmFsQ3VlLmVuZFRpbWUsIG9yaWdpbmFsQ3VlLnRleHQpO1xuXG4gICAgICBmb3IgKHZhciBwcm9wIGluIG9yaWdpbmFsQ3VlKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gY3VlKSkge1xuICAgICAgICAgIGN1ZVtwcm9wXSA9IG9yaWdpbmFsQ3VlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGBpZGAgaXMgY29waWVkIG92ZXJcbiAgICAgIGN1ZS5pZCA9IG9yaWdpbmFsQ3VlLmlkO1xuICAgICAgY3VlLm9yaWdpbmFsQ3VlXyA9IG9yaWdpbmFsQ3VlO1xuICAgIH1cblxuICAgIHZhciB0cmFja3MgPSB0aGlzLnRlY2hfLnRleHRUcmFja3MoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHJhY2tzW2ldICE9PSB0aGlzKSB7XG4gICAgICAgIHRyYWNrc1tpXS5yZW1vdmVDdWUoY3VlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmN1ZXNfLnB1c2goY3VlKTtcbiAgICB0aGlzLmN1ZXMuc2V0Q3Vlc18odGhpcy5jdWVzXyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGN1ZSBmcm9tIG91ciBpbnRlcm5hbCBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfkN1ZX0gcmVtb3ZlQ3VlXG4gICAqICAgICAgICBUaGUgY3VlIHRvIHJlbW92ZSBmcm9tIG91ciBpbnRlcm5hbCBsaXN0XG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrLnByb3RvdHlwZS5yZW1vdmVDdWUgPSBmdW5jdGlvbiByZW1vdmVDdWUoX3JlbW92ZUN1ZSkge1xuICAgIHZhciBpID0gdGhpcy5jdWVzXy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YXIgY3VlID0gdGhpcy5jdWVzX1tpXTtcblxuICAgICAgaWYgKGN1ZSA9PT0gX3JlbW92ZUN1ZSB8fCBjdWUub3JpZ2luYWxDdWVfICYmIGN1ZS5vcmlnaW5hbEN1ZV8gPT09IF9yZW1vdmVDdWUpIHtcbiAgICAgICAgdGhpcy5jdWVzXy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHRoaXMuY3Vlcy5zZXRDdWVzXyh0aGlzLmN1ZXNfKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2s7XG59KFRyYWNrKTtcblxuLyoqXG4gKiBjdWVjaGFuZ2UgLSBPbmUgb3IgbW9yZSBjdWVzIGluIHRoZSB0cmFjayBoYXZlIGJlY29tZSBhY3RpdmUgb3Igc3RvcHBlZCBiZWluZyBhY3RpdmUuXG4gKi9cblxuXG5UZXh0VHJhY2sucHJvdG90eXBlLmFsbG93ZWRFdmVudHNfID0ge1xuICBjdWVjaGFuZ2U6ICdjdWVjaGFuZ2UnXG59O1xuXG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgYEF1ZGlvVHJhY2tgLiBJZiBpdCBpcyBwYXJ0IG9mIGFuIHtAbGluayBBdWRpb1RyYWNrTGlzdH1cbiAqIG9ubHkgb25lIGBBdWRpb1RyYWNrYCBpbiB0aGUgbGlzdCB3aWxsIGJlIGVuYWJsZWQgYXQgYSB0aW1lLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNhdWRpb3RyYWNrfVxuICogQGV4dGVuZHMgVHJhY2tcbiAqL1xuXG52YXIgQXVkaW9UcmFjayA9IGZ1bmN0aW9uIChfVHJhY2spIHtcbiAgaW5oZXJpdHMoQXVkaW9UcmFjaywgX1RyYWNrKTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlc1xuICAgKlxuICAgKiBAcGFyYW0ge0F1ZGlvVHJhY2t+S2luZH0gW29wdGlvbnMua2luZD0nJ11cbiAgICogICAgICAgIEEgdmFsaWQgYXVkaW8gdHJhY2sga2luZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBBdWRpb1RyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWw9JyddXG4gICAqICAgICAgICBUaGUgbWVudSBsYWJlbCBmb3IgdGhpcyB0cmFjay5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhbmd1YWdlPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0d28gY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZW5hYmxlZF1cbiAgICogICAgICAgIElmIHRoaXMgdHJhY2sgaXMgdGhlIG9uZSB0aGF0IGlzIGN1cnJlbnRseSBwbGF5aW5nLiBJZiB0aGlzIHRyYWNrIGlzIHBhcnQgb2ZcbiAgICogICAgICAgIGFuIHtAbGluayBBdWRpb1RyYWNrTGlzdH0sIG9ubHkgb25lIHtAbGluayBBdWRpb1RyYWNrfSB3aWxsIGJlIGVuYWJsZWQuXG4gICAqL1xuICBmdW5jdGlvbiBBdWRpb1RyYWNrKCkge1xuICAgIHZhciBfdGhpcywgX3JldDtcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBdWRpb1RyYWNrKTtcblxuICAgIHZhciBzZXR0aW5ncyA9IG1lcmdlT3B0aW9ucyhvcHRpb25zLCB7XG4gICAgICBraW5kOiBBdWRpb1RyYWNrS2luZFtvcHRpb25zLmtpbmRdIHx8ICcnXG4gICAgfSk7XG4gICAgLy8gb24gSUU4IHRoaXMgd2lsbCBiZSBhIGRvY3VtZW50IGVsZW1lbnRcbiAgICAvLyBmb3IgZXZlcnkgb3RoZXIgYnJvd3NlciB0aGlzIHdpbGwgYmUgYSBub3JtYWwgb2JqZWN0XG4gICAgdmFyIHRyYWNrID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2suY2FsbCh0aGlzLCBzZXR0aW5ncykpLCBfdGhpcyk7XG4gICAgdmFyIGVuYWJsZWQgPSBmYWxzZTtcblxuICAgIGlmIChJU19JRTgpIHtcbiAgICAgIGZvciAodmFyIHByb3AgaW4gQXVkaW9UcmFjay5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0cmFja1twcm9wXSA9IEF1ZGlvVHJhY2sucHJvdG90eXBlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZW1iZXJvZiBBdWRpb1RyYWNrXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqICAgICAgICAgSWYgdGhpcyBgQXVkaW9UcmFja2AgaXMgZW5hYmxlZCBvciBub3QuIFdoZW4gc2V0dGluZyB0aGlzIHdpbGxcbiAgICAgKiAgICAgICAgIGZpcmUge0BsaW5rIEF1ZGlvVHJhY2sjZW5hYmxlZGNoYW5nZX0gaWYgdGhlIHN0YXRlIG9mIGVuYWJsZWQgaXMgY2hhbmdlZC5cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEBmaXJlcyBWaWRlb1RyYWNrI3NlbGVjdGVkY2hhbmdlXG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRyYWNrLCAnZW5hYmxlZCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gZW5hYmxlZDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShuZXdFbmFibGVkKSB7XG4gICAgICAgIC8vIGFuIGludmFsaWQgb3IgdW5jaGFuZ2VkIHZhbHVlXG4gICAgICAgIGlmICh0eXBlb2YgbmV3RW5hYmxlZCAhPT0gJ2Jvb2xlYW4nIHx8IG5ld0VuYWJsZWQgPT09IGVuYWJsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlZCA9IG5ld0VuYWJsZWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGV2ZW50IHRoYXQgZmlyZXMgd2hlbiBlbmFibGVkIGNoYW5nZXMgb24gdGhpcyB0cmFjay4gVGhpcyBhbGxvd3NcbiAgICAgICAgICogdGhlIEF1ZGlvVHJhY2tMaXN0IHRoYXQgaG9sZHMgdGhpcyB0cmFjayB0byBhY3QgYWNjb3JkaW5nbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqID4gTm90ZTogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgc3BlYyEgTmF0aXZlIHRyYWNrcyB3aWxsIGRvXG4gICAgICAgICAqICAgICAgICAgdGhpcyBpbnRlcm5hbGx5IHdpdGhvdXQgYW4gZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBBdWRpb1RyYWNrI2VuYWJsZWRjaGFuZ2VcbiAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdlbmFibGVkY2hhbmdlJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBzZXRzIHRoaXMgdHJhY2sgdG8gc2VsZWN0ZWQgdGhlblxuICAgIC8vIHNldCBzZWxlY3RlZCB0byB0aGF0IHRydWUgdmFsdWUgb3RoZXJ3aXNlXG4gICAgLy8gd2Uga2VlcCBpdCBmYWxzZVxuICAgIGlmIChzZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICB0cmFjay5lbmFibGVkID0gc2V0dGluZ3MuZW5hYmxlZDtcbiAgICB9XG4gICAgdHJhY2subG9hZGVkXyA9IHRydWU7XG5cbiAgICByZXR1cm4gX3JldCA9IHRyYWNrLCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIHJldHVybiBBdWRpb1RyYWNrO1xufShUcmFjayk7XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBgVmlkZW9UcmFja2AuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3ZpZGVvdHJhY2t9XG4gKiBAZXh0ZW5kcyBUcmFja1xuICovXG5cbnZhciBWaWRlb1RyYWNrID0gZnVuY3Rpb24gKF9UcmFjaykge1xuICBpbmhlcml0cyhWaWRlb1RyYWNrLCBfVHJhY2spO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5raW5kPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCB7QGxpbmsgVmlkZW9UcmFja35LaW5kfVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBBdWRpb1RyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWw9JyddXG4gICAqICAgICAgICBUaGUgbWVudSBsYWJlbCBmb3IgdGhpcyB0cmFjay5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhbmd1YWdlPScnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0d28gY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VsZWN0ZWRdXG4gICAqICAgICAgICBJZiB0aGlzIHRyYWNrIGlzIHRoZSBvbmUgdGhhdCBpcyBjdXJyZW50bHkgcGxheWluZy5cbiAgICovXG4gIGZ1bmN0aW9uIFZpZGVvVHJhY2soKSB7XG4gICAgdmFyIF90aGlzLCBfcmV0O1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFZpZGVvVHJhY2spO1xuXG4gICAgdmFyIHNldHRpbmdzID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIHtcbiAgICAgIGtpbmQ6IFZpZGVvVHJhY2tLaW5kW29wdGlvbnMua2luZF0gfHwgJydcbiAgICB9KTtcblxuICAgIC8vIG9uIElFOCB0aGlzIHdpbGwgYmUgYSBkb2N1bWVudCBlbGVtZW50XG4gICAgLy8gZm9yIGV2ZXJ5IG90aGVyIGJyb3dzZXIgdGhpcyB3aWxsIGJlIGEgbm9ybWFsIG9iamVjdFxuICAgIHZhciB0cmFjayA9IChfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RyYWNrLmNhbGwodGhpcywgc2V0dGluZ3MpKSwgX3RoaXMpO1xuICAgIHZhciBzZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgaWYgKElTX0lFOCkge1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBWaWRlb1RyYWNrLnByb3RvdHlwZSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRyYWNrW3Byb3BdID0gVmlkZW9UcmFjay5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyb2YgVmlkZW9UcmFja1xuICAgICAqIEBtZW1iZXIge2Jvb2xlYW59IHNlbGVjdGVkXG4gICAgICogICAgICAgICBJZiB0aGlzIGBWaWRlb1RyYWNrYCBpcyBzZWxlY3RlZCBvciBub3QuIFdoZW4gc2V0dGluZyB0aGlzIHdpbGxcbiAgICAgKiAgICAgICAgIGZpcmUge0BsaW5rIFZpZGVvVHJhY2sjc2VsZWN0ZWRjaGFuZ2V9IGlmIHRoZSBzdGF0ZSBvZiBzZWxlY3RlZCBjaGFuZ2VkLlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQGZpcmVzIFZpZGVvVHJhY2sjc2VsZWN0ZWRjaGFuZ2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHJhY2ssICdzZWxlY3RlZCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkge1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobmV3U2VsZWN0ZWQpIHtcbiAgICAgICAgLy8gYW4gaW52YWxpZCBvciB1bmNoYW5nZWQgdmFsdWVcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdTZWxlY3RlZCAhPT0gJ2Jvb2xlYW4nIHx8IG5ld1NlbGVjdGVkID09PSBzZWxlY3RlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZWxlY3RlZCA9IG5ld1NlbGVjdGVkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBldmVudCB0aGF0IGZpcmVzIHdoZW4gc2VsZWN0ZWQgY2hhbmdlcyBvbiB0aGlzIHRyYWNrLiBUaGlzIGFsbG93c1xuICAgICAgICAgKiB0aGUgVmlkZW9UcmFja0xpc3QgdGhhdCBob2xkcyB0aGlzIHRyYWNrIHRvIGFjdCBhY2NvcmRpbmdseS5cbiAgICAgICAgICpcbiAgICAgICAgICogPiBOb3RlOiBUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBzcGVjISBOYXRpdmUgdHJhY2tzIHdpbGwgZG9cbiAgICAgICAgICogICAgICAgICB0aGlzIGludGVybmFsbHkgd2l0aG91dCBhbiBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFZpZGVvVHJhY2sjc2VsZWN0ZWRjaGFuZ2VcbiAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdzZWxlY3RlZGNoYW5nZScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gaWYgdGhlIHVzZXIgc2V0cyB0aGlzIHRyYWNrIHRvIHNlbGVjdGVkIHRoZW5cbiAgICAvLyBzZXQgc2VsZWN0ZWQgdG8gdGhhdCB0cnVlIHZhbHVlIG90aGVyd2lzZVxuICAgIC8vIHdlIGtlZXAgaXQgZmFsc2VcbiAgICBpZiAoc2V0dGluZ3Muc2VsZWN0ZWQpIHtcbiAgICAgIHRyYWNrLnNlbGVjdGVkID0gc2V0dGluZ3Muc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSB0cmFjaywgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICByZXR1cm4gVmlkZW9UcmFjaztcbn0oVHJhY2spO1xuXG4vKipcbiAqIEBmaWxlIGh0bWwtdHJhY2stZWxlbWVudC5qc1xuICovXG5cbi8qKlxuICogQG1lbWJlcm9mIEhUTUxUcmFja0VsZW1lbnRcbiAqIEB0eXBlZGVmIHtIVE1MVHJhY2tFbGVtZW50flJlYWR5U3RhdGV9XG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG52YXIgTk9ORSA9IDA7XG52YXIgTE9BRElORyA9IDE7XG52YXIgTE9BREVEID0gMjtcbnZhciBFUlJPUiA9IDM7XG5cbi8qKlxuICogQSBzaW5nbGUgdHJhY2sgcmVwcmVzZW50ZWQgaW4gdGhlIERPTS5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjaHRtbHRyYWNrZWxlbWVudH1cbiAqIEBleHRlbmRzIEV2ZW50VGFyZ2V0XG4gKi9cblxudmFyIEhUTUxUcmFja0VsZW1lbnQgPSBmdW5jdGlvbiAoX0V2ZW50VGFyZ2V0KSB7XG4gIGluaGVyaXRzKEhUTUxUcmFja0VsZW1lbnQsIF9FdmVudFRhcmdldCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucz17fVxuICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH0gb3B0aW9ucy50ZWNoXG4gICAqICAgICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdGVjaCB0aGF0IG93bnMgdGhpcyBIVE1MVHJhY2tFbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja35LaW5kfSBbb3B0aW9ucy5raW5kPSdzdWJ0aXRsZXMnXVxuICAgKiAgICAgICAgQSB2YWxpZCB0ZXh0IHRyYWNrIGtpbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7VGV4dFRyYWNrfk1vZGV9IFtvcHRpb25zLm1vZGU9J2Rpc2FibGVkJ11cbiAgICogICAgICAgIEEgdmFsaWQgdGV4dCB0cmFjayBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldXG4gICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBUZXh0VHJhY2suXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbD0nJ11cbiAgICogICAgICAgIFRoZSBtZW51IGxhYmVsIGZvciB0aGlzIHRyYWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFuZ3VhZ2U9JyddXG4gICAqICAgICAgICBBIHZhbGlkIHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNyY2xhbmc9JyddXG4gICAqICAgICAgICBBIHZhbGlkIHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS4gQW4gYWx0ZXJuYXRpdmUsIGJ1dCBkZXByaW9yaXRpemVkXG4gICAqICAgICAgICB2ZXNpb24gb2YgYG9wdGlvbnMubGFuZ3VhZ2VgXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zcmNdXG4gICAqICAgICAgICBBIHVybCB0byBUZXh0VHJhY2sgY3Vlcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWZhdWx0XVxuICAgKiAgICAgICAgSWYgdGhpcyB0cmFjayBzaG91bGQgZGVmYXVsdCB0byBvbiBvciBvZmYuXG4gICAqL1xuICBmdW5jdGlvbiBIVE1MVHJhY2tFbGVtZW50KCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIVE1MVHJhY2tFbGVtZW50KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0V2ZW50VGFyZ2V0LmNhbGwodGhpcykpO1xuXG4gICAgdmFyIHJlYWR5U3RhdGUgPSB2b2lkIDA7XG4gICAgdmFyIHRyYWNrRWxlbWVudCA9IF90aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICB0cmFja0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTtcblxuICAgICAgZm9yICh2YXIgcHJvcCBpbiBIVE1MVHJhY2tFbGVtZW50LnByb3RvdHlwZSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRyYWNrRWxlbWVudFtwcm9wXSA9IEhUTUxUcmFja0VsZW1lbnQucHJvdG90eXBlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRyYWNrID0gbmV3IFRleHRUcmFjayhvcHRpb25zKTtcblxuICAgIHRyYWNrRWxlbWVudC5raW5kID0gdHJhY2sua2luZDtcbiAgICB0cmFja0VsZW1lbnQuc3JjID0gdHJhY2suc3JjO1xuICAgIHRyYWNrRWxlbWVudC5zcmNsYW5nID0gdHJhY2subGFuZ3VhZ2U7XG4gICAgdHJhY2tFbGVtZW50LmxhYmVsID0gdHJhY2subGFiZWw7XG4gICAgdHJhY2tFbGVtZW50WydkZWZhdWx0J10gPSB0cmFja1snZGVmYXVsdCddO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIEhUTUxUcmFja0VsZW1lbnRcbiAgICAgKiBAbWVtYmVyIHtIVE1MVHJhY2tFbGVtZW50flJlYWR5U3RhdGV9IHJlYWR5U3RhdGVcbiAgICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHJlYWR5IHN0YXRlIG9mIHRoZSB0cmFjayBlbGVtZW50LlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFja0VsZW1lbnQsICdyZWFkeVN0YXRlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICAgIHJldHVybiByZWFkeVN0YXRlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIEhUTUxUcmFja0VsZW1lbnRcbiAgICAgKiBAbWVtYmVyIHtUZXh0VHJhY2t9IHRyYWNrXG4gICAgICogICAgICAgICBUaGUgdW5kZXJseWluZyBUZXh0VHJhY2sgb2JqZWN0LlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqXG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRyYWNrRWxlbWVudCwgJ3RyYWNrJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7XG4gICAgICAgIHJldHVybiB0cmFjaztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlYWR5U3RhdGUgPSBOT05FO1xuXG4gICAgLyoqXG4gICAgICogQGxpc3RlbnMgVGV4dFRyYWNrI2xvYWRlZGRhdGFcbiAgICAgKiBAZmlyZXMgSFRNTFRyYWNrRWxlbWVudCNsb2FkXG4gICAgICovXG4gICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlYWR5U3RhdGUgPSBMT0FERUQ7XG5cbiAgICAgIHRyYWNrRWxlbWVudC50cmlnZ2VyKHtcbiAgICAgICAgdHlwZTogJ2xvYWQnLFxuICAgICAgICB0YXJnZXQ6IHRyYWNrRWxlbWVudFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoSVNfSUU4KSB7XG4gICAgICB2YXIgX3JldDtcblxuICAgICAgcmV0dXJuIF9yZXQgPSB0cmFja0VsZW1lbnQsIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gSFRNTFRyYWNrRWxlbWVudDtcbn0oRXZlbnRUYXJnZXQpO1xuXG5IVE1MVHJhY2tFbGVtZW50LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHtcbiAgbG9hZDogJ2xvYWQnXG59O1xuXG5IVE1MVHJhY2tFbGVtZW50Lk5PTkUgPSBOT05FO1xuSFRNTFRyYWNrRWxlbWVudC5MT0FESU5HID0gTE9BRElORztcbkhUTUxUcmFja0VsZW1lbnQuTE9BREVEID0gTE9BREVEO1xuSFRNTFRyYWNrRWxlbWVudC5FUlJPUiA9IEVSUk9SO1xuXG4vKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0cmFjayBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWQgaW5cbiAqIHBsYXllci5qcywgdGVjaC5qcywgaHRtbDUuanMgYW5kIHBvc3NpYmx5IG90aGVyIHRlY2hzIGluIHRoZSBmdXR1cmUuXG4gKi9cblxudmFyIE5PUk1BTCA9IHtcbiAgYXVkaW86IHtcbiAgICBMaXN0Q2xhc3M6IEF1ZGlvVHJhY2tMaXN0LFxuICAgIFRyYWNrQ2xhc3M6IEF1ZGlvVHJhY2ssXG4gICAgY2FwaXRhbE5hbWU6ICdBdWRpbydcbiAgfSxcbiAgdmlkZW86IHtcbiAgICBMaXN0Q2xhc3M6IFZpZGVvVHJhY2tMaXN0LFxuICAgIFRyYWNrQ2xhc3M6IFZpZGVvVHJhY2ssXG4gICAgY2FwaXRhbE5hbWU6ICdWaWRlbydcbiAgfSxcbiAgdGV4dDoge1xuICAgIExpc3RDbGFzczogVGV4dFRyYWNrTGlzdCxcbiAgICBUcmFja0NsYXNzOiBUZXh0VHJhY2ssXG4gICAgY2FwaXRhbE5hbWU6ICdUZXh0J1xuICB9XG59O1xuXG5PYmplY3Qua2V5cyhOT1JNQUwpLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgTk9STUFMW3R5cGVdLmdldHRlck5hbWUgPSB0eXBlICsgJ1RyYWNrcyc7XG4gIE5PUk1BTFt0eXBlXS5wcml2YXRlTmFtZSA9IHR5cGUgKyAnVHJhY2tzXyc7XG59KTtcblxudmFyIFJFTU9URSA9IHtcbiAgcmVtb3RlVGV4dDoge1xuICAgIExpc3RDbGFzczogVGV4dFRyYWNrTGlzdCxcbiAgICBUcmFja0NsYXNzOiBUZXh0VHJhY2ssXG4gICAgY2FwaXRhbE5hbWU6ICdSZW1vdGVUZXh0JyxcbiAgICBnZXR0ZXJOYW1lOiAncmVtb3RlVGV4dFRyYWNrcycsXG4gICAgcHJpdmF0ZU5hbWU6ICdyZW1vdGVUZXh0VHJhY2tzXydcbiAgfSxcbiAgcmVtb3RlVGV4dEVsOiB7XG4gICAgTGlzdENsYXNzOiBIdG1sVHJhY2tFbGVtZW50TGlzdCxcbiAgICBUcmFja0NsYXNzOiBIVE1MVHJhY2tFbGVtZW50LFxuICAgIGNhcGl0YWxOYW1lOiAnUmVtb3RlVGV4dFRyYWNrRWxzJyxcbiAgICBnZXR0ZXJOYW1lOiAncmVtb3RlVGV4dFRyYWNrRWxzJyxcbiAgICBwcml2YXRlTmFtZTogJ3JlbW90ZVRleHRUcmFja0Vsc18nXG4gIH1cbn07XG5cbnZhciBBTEwgPSBtZXJnZU9wdGlvbnMoTk9STUFMLCBSRU1PVEUpO1xuXG5SRU1PVEUubmFtZXMgPSBPYmplY3Qua2V5cyhSRU1PVEUpO1xuTk9STUFMLm5hbWVzID0gT2JqZWN0LmtleXMoTk9STUFMKTtcbkFMTC5uYW1lcyA9IFtdLmNvbmNhdChSRU1PVEUubmFtZXMpLmNvbmNhdChOT1JNQUwubmFtZXMpO1xuXG4vKipcbiAqIEBmaWxlIHRlY2guanNcbiAqL1xuXG4vKipcbiAqIEFuIE9iamVjdCBjb250YWluaW5nIGEgc3RydWN0dXJlIGxpa2U6IGB7c3JjOiAndXJsJywgdHlwZTogJ21pbWV0eXBlJ31gIG9yIHN0cmluZ1xuICogdGhhdCBqdXN0IGNvbnRhaW5zIHRoZSBzcmMgdXJsIGFsb25lLlxuICogKiBgdmFyIFNvdXJjZU9iamVjdCA9IHtzcmM6ICdodHRwOi8vZXguY29tL3ZpZGVvLm1wNCcsIHR5cGU6ICd2aWRlby9tcDQnfTtgXG4gICAqIGB2YXIgU291cmNlU3RyaW5nID0gJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21lLXZpZGVvLm1wNCc7YFxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R8c3RyaW5nfSBUZWNoflNvdXJjZU9iamVjdFxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzcmNcbiAqICAgICAgICAgICBUaGUgdXJsIHRvIHRoZSBzb3VyY2VcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICogICAgICAgICAgIFRoZSBtaW1lIHR5cGUgb2YgdGhlIHNvdXJjZVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB1c2VkIGJ5IHtAbGluayBUZWNofSB0byBjcmVhdGUgYSBuZXcge0BsaW5rIFRleHRUcmFja30uXG4gKlxuICogQHByaXZhdGVcbiAqXG4gKiBAcGFyYW0ge1RlY2h9IHNlbGZcbiAqICAgICAgICBBbiBpbnN0YW5jZSBvZiB0aGUgVGVjaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZFxuICogICAgICAgIGBUZXh0VHJhY2tgIGtpbmQgKHN1YnRpdGxlcywgY2FwdGlvbnMsIGRlc2NyaXB0aW9ucywgY2hhcHRlcnMsIG9yIG1ldGFkYXRhKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdXG4gKiAgICAgICAgTGFiZWwgdG8gaWRlbnRpZnkgdGhlIHRleHQgdHJhY2tcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xhbmd1YWdlXVxuICogICAgICAgIFR3byBsZXR0ZXIgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICogICAgICAgIEFuIG9iamVjdCB3aXRoIGFkZGl0aW9uYWwgdGV4dCB0cmFjayBvcHRpb25zXG4gKlxuICogQHJldHVybiB7VGV4dFRyYWNrfVxuICogICAgICAgICAgVGhlIHRleHQgdHJhY2sgdGhhdCB3YXMgY3JlYXRlZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVHJhY2tIZWxwZXIoc2VsZiwga2luZCwgbGFiZWwsIGxhbmd1YWdlKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB7fTtcblxuICB2YXIgdHJhY2tzID0gc2VsZi50ZXh0VHJhY2tzKCk7XG5cbiAgb3B0aW9ucy5raW5kID0ga2luZDtcblxuICBpZiAobGFiZWwpIHtcbiAgICBvcHRpb25zLmxhYmVsID0gbGFiZWw7XG4gIH1cbiAgaWYgKGxhbmd1YWdlKSB7XG4gICAgb3B0aW9ucy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICB9XG4gIG9wdGlvbnMudGVjaCA9IHNlbGY7XG5cbiAgdmFyIHRyYWNrID0gbmV3IEFMTC50ZXh0LlRyYWNrQ2xhc3Mob3B0aW9ucyk7XG5cbiAgdHJhY2tzLmFkZFRyYWNrKHRyYWNrKTtcblxuICByZXR1cm4gdHJhY2s7XG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbWVkaWEgcGxheWJhY2sgdGVjaG5vbG9neSBjb250cm9sbGVycywgc3VjaCBhc1xuICoge0BsaW5rIEZsYXNofSBhbmQge0BsaW5rIEhUTUw1fVxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBUZWNoID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoVGVjaCwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIFRlY2guXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IHJlYWR5XG4gICAqICAgICAgICBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGBIVE1MNWAgVGVjaCBpcyByZWFkeS5cbiAgICovXG4gIGZ1bmN0aW9uIFRlY2goKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciByZWFkeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGVjaCk7XG5cbiAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSB0ZWNoIHRvIHJlcG9ydCB1c2VyIGFjdGl2aXR5IGF1dG9tYXRpY2FsbHkuXG4gICAgLy8gVGhpcyBpcyBkb25lIG1hbnVhbGx5IGluIGFkZENvbnRyb2xzTGlzdGVuZXJzXG4gICAgb3B0aW9ucy5yZXBvcnRUb3VjaEFjdGl2aXR5ID0gZmFsc2U7XG5cbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGN1cnJlbnQgc291cmNlIGhhcyBwbGF5ZWQgYXQgYWxsIHRvXG4gICAgLy8gaW1wbGVtZW50IGEgdmVyeSBsaW1pdGVkIHBsYXllZCgpXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgbnVsbCwgb3B0aW9ucywgcmVhZHkpKTtcblxuICAgIF90aGlzLmhhc1N0YXJ0ZWRfID0gZmFsc2U7XG4gICAgX3RoaXMub24oJ3BsYXlpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmhhc1N0YXJ0ZWRfID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBfdGhpcy5vbignbG9hZHN0YXJ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5oYXNTdGFydGVkXyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgQUxMLm5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBwcm9wcyA9IEFMTFtuYW1lXTtcblxuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9uc1twcm9wcy5nZXR0ZXJOYW1lXSkge1xuICAgICAgICBfdGhpc1twcm9wcy5wcml2YXRlTmFtZV0gPSBvcHRpb25zW3Byb3BzLmdldHRlck5hbWVdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTWFudWFsbHkgdHJhY2sgcHJvZ3Jlc3MgaW4gY2FzZXMgd2hlcmUgdGhlIGJyb3dzZXIvZmxhc2ggcGxheWVyIGRvZXNuJ3QgcmVwb3J0IGl0LlxuICAgIGlmICghX3RoaXMuZmVhdHVyZXNQcm9ncmVzc0V2ZW50cykge1xuICAgICAgX3RoaXMubWFudWFsUHJvZ3Jlc3NPbigpO1xuICAgIH1cblxuICAgIC8vIE1hbnVhbGx5IHRyYWNrIHRpbWV1cGRhdGVzIGluIGNhc2VzIHdoZXJlIHRoZSBicm93c2VyL2ZsYXNoIHBsYXllciBkb2Vzbid0IHJlcG9ydCBpdC5cbiAgICBpZiAoIV90aGlzLmZlYXR1cmVzVGltZXVwZGF0ZUV2ZW50cykge1xuICAgICAgX3RoaXMubWFudWFsVGltZVVwZGF0ZXNPbigpO1xuICAgIH1cblxuICAgIFsnVGV4dCcsICdBdWRpbycsICdWaWRlbyddLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrKSB7XG4gICAgICBpZiAob3B0aW9uc1snbmF0aXZlJyArIHRyYWNrICsgJ1RyYWNrcyddID09PSBmYWxzZSkge1xuICAgICAgICBfdGhpc1snZmVhdHVyZXNOYXRpdmUnICsgdHJhY2sgKyAnVHJhY2tzJ10gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLm5hdGl2ZUNhcHRpb25zID09PSBmYWxzZSB8fCBvcHRpb25zLm5hdGl2ZVRleHRUcmFja3MgPT09IGZhbHNlKSB7XG4gICAgICBfdGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMubmF0aXZlQ2FwdGlvbnMgPT09IHRydWUgfHwgb3B0aW9ucy5uYXRpdmVUZXh0VHJhY2tzID09PSB0cnVlKSB7XG4gICAgICBfdGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghX3RoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSB7XG4gICAgICBfdGhpcy5lbXVsYXRlVGV4dFRyYWNrcygpO1xuICAgIH1cblxuICAgIF90aGlzLmF1dG9SZW1vdGVUZXh0VHJhY2tzXyA9IG5ldyBBTEwudGV4dC5MaXN0Q2xhc3MoKTtcblxuICAgIF90aGlzLmluaXRUcmFja0xpc3RlbmVycygpO1xuXG4gICAgLy8gVHVybiBvbiBjb21wb25lbnQgdGFwIGV2ZW50cyBvbmx5IGlmIG5vdCB1c2luZyBuYXRpdmUgY29udHJvbHNcbiAgICBpZiAoIW9wdGlvbnMubmF0aXZlQ29udHJvbHNGb3JUb3VjaCkge1xuICAgICAgX3RoaXMuZW1pdFRhcEV2ZW50cygpO1xuICAgIH1cblxuICAgIGlmIChfdGhpcy5jb25zdHJ1Y3Rvcikge1xuICAgICAgX3RoaXMubmFtZV8gPSBfdGhpcy5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdVbmtub3duIFRlY2gnO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsIGZ1bmN0aW9uIHRvIHRyaWdnZXIgc291cmNlIHNldCBpbiBhIHdheSB0aGF0IHdpbGwgYWxsb3cgcGxheWVyXG4gICAqIHRvIHJlLXRyaWdnZXIgaWYgdGhlIHBsYXllciBvciB0ZWNoIGFyZSBub3QgcmVhZHkgeWV0LlxuICAgKlxuICAgKiBAZmlyZXMgVGVjaCNzb3VyY2VzZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNyYyBUaGUgc291cmNlIHN0cmluZyBhdCB0aGUgdGltZSBvZiB0aGUgc291cmNlIGNoYW5naW5nLlxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLnRyaWdnZXJTb3VyY2VzZXQgPSBmdW5jdGlvbiB0cmlnZ2VyU291cmNlc2V0KHNyYykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLmlzUmVhZHlfKSB7XG4gICAgICAvLyBvbiBpbml0aWFsIHJlYWR5IHdlIGhhdmUgdG8gdHJpZ2dlciBzb3VyY2Ugc2V0XG4gICAgICAvLyAxbXMgYWZ0ZXIgcmVhZHkgc28gdGhhdCBwbGF5ZXIgY2FuIHdhdGNoIGZvciBpdC5cbiAgICAgIHRoaXMub25lKCdyZWFkeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLnRyaWdnZXJTb3VyY2VzZXQoc3JjKTtcbiAgICAgICAgfSwgMSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBzb3VyY2UgaXMgc2V0IG9uIHRoZSB0ZWNoIGNhdXNpbmcgdGhlIG1lZGlhIGVsZW1lbnRcbiAgICAgKiB0byByZWxvYWQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBQbGF5ZXIjZXZlbnQ6c291cmNlc2V0fVxuICAgICAqIEBldmVudCBUZWNoI3NvdXJjZXNldFxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoe1xuICAgICAgc3JjOiBzcmMsXG4gICAgICB0eXBlOiAnc291cmNlc2V0J1xuICAgIH0pO1xuICB9O1xuXG4gIC8qIEZhbGxiYWNrcyBmb3IgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZXNcbiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogUG9seWZpbGwgdGhlIGBwcm9ncmVzc2AgZXZlbnQgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCBuYXRpdmVseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgVGVjaCN0cmFja1Byb2dyZXNzfVxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLm1hbnVhbFByb2dyZXNzT24gPSBmdW5jdGlvbiBtYW51YWxQcm9ncmVzc09uKCkge1xuICAgIHRoaXMub24oJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy5vbkR1cmF0aW9uQ2hhbmdlKTtcblxuICAgIHRoaXMubWFudWFsUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgLy8gVHJpZ2dlciBwcm9ncmVzcyB3YXRjaGluZyB3aGVuIGEgc291cmNlIGJlZ2lucyBsb2FkaW5nXG4gICAgdGhpcy5vbmUoJ3JlYWR5JywgdGhpcy50cmFja1Byb2dyZXNzKTtcbiAgfTtcblxuICAvKipcbiAgICogVHVybiBvZmYgdGhlIHBvbHlmaWxsIGZvciBgcHJvZ3Jlc3NgIGV2ZW50cyB0aGF0IHdhcyBjcmVhdGVkIGluXG4gICAqIHtAbGluayBUZWNoI21hbnVhbFByb2dyZXNzT259XG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUubWFudWFsUHJvZ3Jlc3NPZmYgPSBmdW5jdGlvbiBtYW51YWxQcm9ncmVzc09mZigpIHtcbiAgICB0aGlzLm1hbnVhbFByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5zdG9wVHJhY2tpbmdQcm9ncmVzcygpO1xuXG4gICAgdGhpcy5vZmYoJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy5vbkR1cmF0aW9uQ2hhbmdlKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBpcyB1c2VkIHRvIHRyaWdnZXIgYSBgcHJvZ3Jlc3NgIGV2ZW50IHdoZW4gdGhlIGJ1ZmZlcmVkIHBlcmNlbnQgY2hhbmdlcy4gSXRcbiAgICogc2V0cyBhbiBpbnRlcnZhbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGV2ZXJ5IDUwMCBtaWxsaXNlY29uZHMgdG8gY2hlY2sgaWYgdGhlXG4gICAqIGJ1ZmZlciBlbmQgcGVyY2VudCBoYXMgY2hhbmdlZC5cbiAgICpcbiAgICogPiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB7QGxpbmsgVGVjaCNtYW51YWxQcm9ncmVzc09ufVxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGByZWFkeWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjcmVhZHlcbiAgICogQGZpcmVzIFRlY2gjcHJvZ3Jlc3NcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS50cmFja1Byb2dyZXNzID0gZnVuY3Rpb24gdHJhY2tQcm9ncmVzcyhldmVudCkge1xuICAgIHRoaXMuc3RvcFRyYWNraW5nUHJvZ3Jlc3MoKTtcbiAgICB0aGlzLnByb2dyZXNzSW50ZXJ2YWwgPSB0aGlzLnNldEludGVydmFsKGJpbmQodGhpcywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB1bmxlc3MgYnVmZmVyZWQgYW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBsYXN0IHRpbWVcblxuICAgICAgdmFyIG51bUJ1ZmZlcmVkUGVyY2VudCA9IHRoaXMuYnVmZmVyZWRQZXJjZW50KCk7XG5cbiAgICAgIGlmICh0aGlzLmJ1ZmZlcmVkUGVyY2VudF8gIT09IG51bUJ1ZmZlcmVkUGVyY2VudCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogU2VlIHtAbGluayBQbGF5ZXIjcHJvZ3Jlc3N9XG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBUZWNoI3Byb2dyZXNzXG4gICAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJpZ2dlcigncHJvZ3Jlc3MnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5idWZmZXJlZFBlcmNlbnRfID0gbnVtQnVmZmVyZWRQZXJjZW50O1xuXG4gICAgICBpZiAobnVtQnVmZmVyZWRQZXJjZW50ID09PSAxKSB7XG4gICAgICAgIHRoaXMuc3RvcFRyYWNraW5nUHJvZ3Jlc3MoKTtcbiAgICAgIH1cbiAgICB9KSwgNTAwKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIG91ciBpbnRlcm5hbCBkdXJhdGlvbiBvbiBhIGBkdXJhdGlvbmNoYW5nZWAgZXZlbnQgYnkgY2FsbGluZ1xuICAgKiB7QGxpbmsgVGVjaCNkdXJhdGlvbn0uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGR1cmF0aW9uY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgVGVjaCNkdXJhdGlvbmNoYW5nZVxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLm9uRHVyYXRpb25DaGFuZ2UgPSBmdW5jdGlvbiBvbkR1cmF0aW9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5kdXJhdGlvbl8gPSB0aGlzLmR1cmF0aW9uKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhbmQgY3JlYXRlIGEgYFRpbWVSYW5nZWAgb2JqZWN0IGZvciBidWZmZXJpbmcuXG4gICAqXG4gICAqIEByZXR1cm4ge1RpbWVSYW5nZX1cbiAgICogICAgICAgICBUaGUgdGltZSByYW5nZSBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5idWZmZXJlZCA9IGZ1bmN0aW9uIGJ1ZmZlcmVkKCkge1xuICAgIHJldHVybiBjcmVhdGVUaW1lUmFuZ2VzKDAsIDApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGN1cnJlbnQgdmlkZW8gdGhhdCBpcyBjdXJyZW50bHkgYnVmZmVyZWQuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBBIG51bWJlciBmcm9tIDAgdG8gMSB0aGF0IHJlcHJlc2VudHMgdGhlIGRlY2ltYWwgcGVyY2VudGFnZSBvZiB0aGVcbiAgICogICAgICAgICB2aWRlbyB0aGF0IGlzIGJ1ZmZlcmVkLlxuICAgKlxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLmJ1ZmZlcmVkUGVyY2VudCA9IGZ1bmN0aW9uIGJ1ZmZlcmVkUGVyY2VudCQkMSgpIHtcbiAgICByZXR1cm4gYnVmZmVyZWRQZXJjZW50KHRoaXMuYnVmZmVyZWQoKSwgdGhpcy5kdXJhdGlvbl8pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUdXJuIG9mZiB0aGUgcG9seWZpbGwgZm9yIGBwcm9ncmVzc2AgZXZlbnRzIHRoYXQgd2FzIGNyZWF0ZWQgaW5cbiAgICoge0BsaW5rIFRlY2gjbWFudWFsUHJvZ3Jlc3NPbn1cbiAgICogU3RvcCBtYW51YWxseSB0cmFja2luZyBwcm9ncmVzcyBldmVudHMgYnkgY2xlYXJpbmcgdGhlIGludGVydmFsIHRoYXQgd2FzIHNldCBpblxuICAgKiB7QGxpbmsgVGVjaCN0cmFja1Byb2dyZXNzfS5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5zdG9wVHJhY2tpbmdQcm9ncmVzcyA9IGZ1bmN0aW9uIHN0b3BUcmFja2luZ1Byb2dyZXNzKCkge1xuICAgIHRoaXMuY2xlYXJJbnRlcnZhbCh0aGlzLnByb2dyZXNzSW50ZXJ2YWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQb2x5ZmlsbCB0aGUgYHRpbWV1cGRhdGVgIGV2ZW50IGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgaXQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIFRlY2gjdHJhY2tDdXJyZW50VGltZX1cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5tYW51YWxUaW1lVXBkYXRlc09uID0gZnVuY3Rpb24gbWFudWFsVGltZVVwZGF0ZXNPbigpIHtcbiAgICB0aGlzLm1hbnVhbFRpbWVVcGRhdGVzID0gdHJ1ZTtcblxuICAgIHRoaXMub24oJ3BsYXknLCB0aGlzLnRyYWNrQ3VycmVudFRpbWUpO1xuICAgIHRoaXMub24oJ3BhdXNlJywgdGhpcy5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFR1cm4gb2ZmIHRoZSBwb2x5ZmlsbCBmb3IgYHRpbWV1cGRhdGVgIGV2ZW50cyB0aGF0IHdhcyBjcmVhdGVkIGluXG4gICAqIHtAbGluayBUZWNoI21hbnVhbFRpbWVVcGRhdGVzT259XG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUubWFudWFsVGltZVVwZGF0ZXNPZmYgPSBmdW5jdGlvbiBtYW51YWxUaW1lVXBkYXRlc09mZigpIHtcbiAgICB0aGlzLm1hbnVhbFRpbWVVcGRhdGVzID0gZmFsc2U7XG4gICAgdGhpcy5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSgpO1xuICAgIHRoaXMub2ZmKCdwbGF5JywgdGhpcy50cmFja0N1cnJlbnRUaW1lKTtcbiAgICB0aGlzLm9mZigncGF1c2UnLCB0aGlzLnN0b3BUcmFja2luZ0N1cnJlbnRUaW1lKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0cyB1cCBhbiBpbnRlcnZhbCBmdW5jdGlvbiB0byB0cmFjayBjdXJyZW50IHRpbWUgYW5kIHRyaWdnZXIgYHRpbWV1cGRhdGVgIGV2ZXJ5XG4gICAqIDI1MCBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjcGxheVxuICAgKiBAdHJpZ2dlcnMgVGVjaCN0aW1ldXBkYXRlXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUudHJhY2tDdXJyZW50VGltZSA9IGZ1bmN0aW9uIHRyYWNrQ3VycmVudFRpbWUoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFRpbWVJbnRlcnZhbCkge1xuICAgICAgdGhpcy5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSgpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRUaW1lSW50ZXJ2YWwgPSB0aGlzLnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogVHJpZ2dlcmVkIGF0IGFuIGludGVydmFsIG9mIDI1MG1zIHRvIGluZGljYXRlZCB0aGF0IHRpbWUgaXMgcGFzc2luZyBpbiB0aGUgdmlkZW8uXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50IFRlY2gjdGltZXVwZGF0ZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7XG5cbiAgICAgIC8vIDQyID0gMjQgZnBzIC8vIDI1MCBpcyB3aGF0IFdlYmtpdCB1c2VzIC8vIEZGIHVzZXMgMTVcbiAgICB9LCAyNTApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBpbnRlcnZhbCBmdW5jdGlvbiBjcmVhdGVkIGluIHtAbGluayBUZWNoI3RyYWNrQ3VycmVudFRpbWV9IHNvIHRoYXQgdGhlXG4gICAqIGB0aW1ldXBkYXRlYCBldmVudCBpcyBubyBsb25nZXIgdHJpZ2dlcmVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB7VGVjaCNwYXVzZX1cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSA9IGZ1bmN0aW9uIHN0b3BUcmFja2luZ0N1cnJlbnRUaW1lKCkge1xuICAgIHRoaXMuY2xlYXJJbnRlcnZhbCh0aGlzLmN1cnJlbnRUaW1lSW50ZXJ2YWwpO1xuXG4gICAgLy8gIzEwMDIgLSBpZiB0aGUgdmlkZW8gZW5kcyByaWdodCBiZWZvcmUgdGhlIG5leHQgdGltZXVwZGF0ZSB3b3VsZCBoYXBwZW4sXG4gICAgLy8gdGhlIHByb2dyZXNzIGJhciB3b24ndCBtYWtlIGl0IGFsbCB0aGUgd2F5IHRvIHRoZSBlbmRcbiAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFR1cm4gb2ZmIGFsbCBldmVudCBwb2x5ZmlsbHMsIGNsZWFyIHRoZSBgVGVjaGBzIHtAbGluayBBdWRpb1RyYWNrTGlzdH0sXG4gICAqIHtAbGluayBWaWRlb1RyYWNrTGlzdH0sIGFuZCB7QGxpbmsgVGV4dFRyYWNrTGlzdH0sIGFuZCBkaXNwb3NlIG9mIHRoaXMgVGVjaC5cbiAgICpcbiAgICogQGZpcmVzIENvbXBvbmVudCNkaXNwb3NlXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cbiAgICAvLyBjbGVhciBvdXQgYWxsIHRyYWNrcyBiZWNhdXNlIHdlIGNhbid0IHJldXNlIHRoZW0gYmV0d2VlbiB0ZWNoc1xuICAgIHRoaXMuY2xlYXJUcmFja3MoTk9STUFMLm5hbWVzKTtcblxuICAgIC8vIFR1cm4gb2ZmIGFueSBtYW51YWwgcHJvZ3Jlc3Mgb3IgdGltZXVwZGF0ZSB0cmFja2luZ1xuICAgIGlmICh0aGlzLm1hbnVhbFByb2dyZXNzKSB7XG4gICAgICB0aGlzLm1hbnVhbFByb2dyZXNzT2ZmKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFudWFsVGltZVVwZGF0ZXMpIHtcbiAgICAgIHRoaXMubWFudWFsVGltZVVwZGF0ZXNPZmYoKTtcbiAgICB9XG5cbiAgICBfQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENsZWFyIG91dCBhIHNpbmdsZSBgVHJhY2tMaXN0YCBvciBhbiBhcnJheSBvZiBgVHJhY2tMaXN0c2AgZ2l2ZW4gdGhlaXIgbmFtZXMuXG4gICAqXG4gICAqID4gTm90ZTogVGVjaHMgd2l0aG91dCBzb3VyY2UgaGFuZGxlcnMgc2hvdWxkIGNhbGwgdGhpcyBiZXR3ZWVuIHNvdXJjZXMgZm9yIGB2aWRlb2BcbiAgICogICAgICAgICAmIGBhdWRpb2AgdHJhY2tzLiBZb3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlbSBiZXR3ZWVuIHRyYWNrcyFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxzdHJpbmd9IHR5cGVzXG4gICAqICAgICAgICBUcmFja0xpc3QgbmFtZXMgdG8gY2xlYXIsIHZhbGlkIG5hbWVzIGFyZSBgdmlkZW9gLCBgYXVkaW9gLCBhbmRcbiAgICogICAgICAgIGB0ZXh0YC5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5jbGVhclRyYWNrcyA9IGZ1bmN0aW9uIGNsZWFyVHJhY2tzKHR5cGVzKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB0eXBlcyA9IFtdLmNvbmNhdCh0eXBlcyk7XG4gICAgLy8gY2xlYXIgb3V0IGFsbCB0cmFja3MgYmVjYXVzZSB3ZSBjYW4ndCByZXVzZSB0aGVtIGJldHdlZW4gdGVjaHNcbiAgICB0eXBlcy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICB2YXIgbGlzdCA9IF90aGlzM1t0eXBlICsgJ1RyYWNrcyddKCkgfHwgW107XG4gICAgICB2YXIgaSA9IGxpc3QubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHZhciB0cmFjayA9IGxpc3RbaV07XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIF90aGlzMy5yZW1vdmVSZW1vdGVUZXh0VHJhY2sodHJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW55IFRleHRUcmFja3MgYWRkZWQgdmlhIGFkZFJlbW90ZVRleHRUcmFjayB0aGF0IGFyZVxuICAgKiBmbGFnZ2VkIGZvciBhdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuY2xlYW51cEF1dG9UZXh0VHJhY2tzID0gZnVuY3Rpb24gY2xlYW51cEF1dG9UZXh0VHJhY2tzKCkge1xuICAgIHZhciBsaXN0ID0gdGhpcy5hdXRvUmVtb3RlVGV4dFRyYWNrc18gfHwgW107XG4gICAgdmFyIGkgPSBsaXN0Lmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHZhciB0cmFjayA9IGxpc3RbaV07XG5cbiAgICAgIHRoaXMucmVtb3ZlUmVtb3RlVGV4dFRyYWNrKHRyYWNrKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSB0ZWNoLCB3aGljaCB3aWxsIHJlbW92ZXMgYWxsIHNvdXJjZXMgYW5kIHJlc2V0IHRoZSBpbnRlcm5hbCByZWFkeVN0YXRlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge307XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgYW4gZXJyb3Igb24gdGhlIFRlY2guXG4gICAqXG4gICAqIEBwYXJhbSB7TWVkaWFFcnJvcn0gW2Vycl1cbiAgICogICAgICAgIEVycm9yIHRvIHNldCBvbiB0aGUgVGVjaFxuICAgKlxuICAgKiBAcmV0dXJuIHtNZWRpYUVycm9yfG51bGx9XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgZXJyb3Igb2JqZWN0IG9uIHRoZSB0ZWNoLCBvciBudWxsIGlmIHRoZXJlIGlzbid0IG9uZS5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIGVycm9yKGVycikge1xuICAgIGlmIChlcnIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lcnJvcl8gPSBuZXcgTWVkaWFFcnJvcihlcnIpO1xuICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lcnJvcl87XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGBUaW1lUmFuZ2VgcyB0aGF0IGhhdmUgYmVlbiBwbGF5ZWQgdGhyb3VnaCBmb3IgdGhlIGN1cnJlbnQgc291cmNlLlxuICAgKlxuICAgKiA+IE5PVEU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wbGV0ZS4gSXQgZG9lcyBub3QgdHJhY2sgdGhlIHBsYXllZCBgVGltZVJhbmdlYC5cbiAgICogICAgICAgICBJdCBvbmx5IGNoZWNrcyB3ZXRoZXIgdGhlIHNvdXJjZSBoYXMgcGxheWVkIGF0IGFsbCBvciBub3QuXG4gICAqXG4gICAqIEByZXR1cm4ge1RpbWVSYW5nZX1cbiAgICogICAgICAgICAtIEEgc2luZ2xlIHRpbWUgcmFuZ2UgaWYgdGhpcyB2aWRlbyBoYXMgcGxheWVkXG4gICAqICAgICAgICAgLSBBbiBlbXB0eSBzZXQgb2YgcmFuZ2VzIGlmIG5vdC5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5wbGF5ZWQgPSBmdW5jdGlvbiBwbGF5ZWQoKSB7XG4gICAgaWYgKHRoaXMuaGFzU3RhcnRlZF8pIHtcbiAgICAgIHJldHVybiBjcmVhdGVUaW1lUmFuZ2VzKDAsIDApO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlcygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYXVzZXMgYSBtYW51YWwgdGltZSB1cGRhdGUgdG8gb2NjdXIgaWYge0BsaW5rIFRlY2gjbWFudWFsVGltZVVwZGF0ZXNPbn0gd2FzXG4gICAqIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAZmlyZXMgVGVjaCN0aW1ldXBkYXRlXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuc2V0Q3VycmVudFRpbWUgPSBmdW5jdGlvbiBzZXRDdXJyZW50VGltZSgpIHtcbiAgICAvLyBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiBtYW51YWwgdGltZXVwZGF0ZXNcbiAgICBpZiAodGhpcy5tYW51YWxUaW1lVXBkYXRlcykge1xuICAgICAgLyoqXG4gICAgICAgKiBBIG1hbnVhbCBgdGltZXVwZGF0ZWAgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50IFRlY2gjdGltZXVwZGF0ZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUdXJuIG9uIGxpc3RlbmVycyBmb3Ige0BsaW5rIFZpZGVvVHJhY2tMaXN0fSwge0BsaW5rIHtBdWRpb1RyYWNrTGlzdH0sIGFuZFxuICAgKiB7QGxpbmsgVGV4dFRyYWNrTGlzdH0gZXZlbnRzLlxuICAgKlxuICAgKiBUaGlzIGFkZHMge0BsaW5rIEV2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJzfSBmb3IgYGFkZHRyYWNrYCwgYW5kICBgcmVtb3ZldHJhY2tgLlxuICAgKlxuICAgKiBAZmlyZXMgVGVjaCNhdWRpb3RyYWNrY2hhbmdlXG4gICAqIEBmaXJlcyBUZWNoI3ZpZGVvdHJhY2tjaGFuZ2VcbiAgICogQGZpcmVzIFRlY2gjdGV4dHRyYWNrY2hhbmdlXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuaW5pdFRyYWNrTGlzdGVuZXJzID0gZnVuY3Rpb24gaW5pdFRyYWNrTGlzdGVuZXJzKCkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdHJhY2tzIGFyZSBhZGRlZCBvciByZW1vdmVkIG9uIHRoZSBUZWNoIHtAbGluayBBdWRpb1RyYWNrTGlzdH1cbiAgICAgKlxuICAgICAqIEBldmVudCBUZWNoI2F1ZGlvdHJhY2tjaGFuZ2VcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0cmFja3MgYXJlIGFkZGVkIG9yIHJlbW92ZWQgb24gdGhlIFRlY2gge0BsaW5rIFZpZGVvVHJhY2tMaXN0fVxuICAgICAqXG4gICAgICogQGV2ZW50IFRlY2gjdmlkZW90cmFja2NoYW5nZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRyYWNrcyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBvbiB0aGUgVGVjaCB7QGxpbmsgVGV4dFRyYWNrTGlzdH1cbiAgICAgKlxuICAgICAqIEBldmVudCBUZWNoI3RleHR0cmFja2NoYW5nZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICBOT1JNQUwubmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIHByb3BzID0gTk9STUFMW25hbWVdO1xuICAgICAgdmFyIHRyYWNrTGlzdENoYW5nZXMgPSBmdW5jdGlvbiB0cmFja0xpc3RDaGFuZ2VzKCkge1xuICAgICAgICBfdGhpczQudHJpZ2dlcihuYW1lICsgJ3RyYWNrY2hhbmdlJyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgdHJhY2tzID0gX3RoaXM0W3Byb3BzLmdldHRlck5hbWVdKCk7XG5cbiAgICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIHRyYWNrTGlzdENoYW5nZXMpO1xuICAgICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ2FkZHRyYWNrJywgdHJhY2tMaXN0Q2hhbmdlcyk7XG5cbiAgICAgIF90aGlzNC5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlbW92ZXRyYWNrJywgdHJhY2tMaXN0Q2hhbmdlcyk7XG4gICAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIHRyYWNrTGlzdENoYW5nZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtdWxhdGUgVGV4dFRyYWNrcyB1c2luZyB2dHQuanMgaWYgbmVjZXNzYXJ5XG4gICAqXG4gICAqIEBmaXJlcyBUZWNoI3Z0dGpzbG9hZGVkXG4gICAqIEBmaXJlcyBUZWNoI3Z0dGpzZXJyb3JcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5hZGRXZWJWdHRTY3JpcHRfID0gZnVuY3Rpb24gYWRkV2ViVnR0U2NyaXB0XygpIHtcbiAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgIGlmICh3aW5kb3cuV2ViVlRUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGx5LCBUZWNoLmVsXyBpcyBhIGNoaWxkIG9mIGEgZHVtbXktZGl2IHdhaXQgdW50aWwgdGhlIENvbXBvbmVudCBzeXN0ZW1cbiAgICAvLyBzaWduYWxzIHRoYXQgdGhlIFRlY2ggaXMgcmVhZHkgYXQgd2hpY2ggcG9pbnQgVGVjaC5lbF8gaXMgcGFydCBvZiB0aGUgRE9NXG4gICAgLy8gYmVmb3JlIGluc2VydGluZyB0aGUgV2ViVlRUIHNjcmlwdFxuICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuZWwoKSkpIHtcblxuICAgICAgLy8gbG9hZCB2aWEgcmVxdWlyZSBpZiBhdmFpbGFibGUgYW5kIHZ0dC5qcyBzY3JpcHQgbG9jYXRpb24gd2FzIG5vdCBwYXNzZWQgaW5cbiAgICAgIC8vIGFzIGFuIG9wdGlvbi4gbm92dHQgYnVpbGRzIHdpbGwgdHVybiB0aGUgYWJvdmUgcmVxdWlyZSBjYWxsIGludG8gYW4gZW1wdHkgb2JqZWN0XG4gICAgICAvLyB3aGljaCB3aWxsIGNhdXNlIHRoaXMgaWYgY2hlY2sgdG8gYWx3YXlzIGZhaWwuXG4gICAgICBpZiAoIXRoaXMub3B0aW9uc19bJ3Z0dC5qcyddICYmIGlzUGxhaW4odnR0KSAmJiBPYmplY3Qua2V5cyh2dHQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCd2dHRqc2xvYWRlZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGxvYWQgdnR0LmpzIHZpYSB0aGUgc2NyaXB0IGxvY2F0aW9uIG9wdGlvbiBvciB0aGUgY2RuIG9mIG5vIGxvY2F0aW9uIHdhc1xuICAgICAgLy8gcGFzc2VkIGluXG4gICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG5cbiAgICAgIHNjcmlwdC5zcmMgPSB0aGlzLm9wdGlvbnNfWyd2dHQuanMnXSB8fCAnaHR0cHM6Ly92anMuemVuY2RuLm5ldC92dHRqcy8wLjEyLjQvdnR0Lm1pbi5qcyc7XG4gICAgICBzY3JpcHQub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiB2dHQuanMgaXMgbG9hZGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgVGVjaCN2dHRqc2xvYWRlZFxuICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgICAqL1xuICAgICAgICBfdGhpczUudHJpZ2dlcigndnR0anNsb2FkZWQnKTtcbiAgICAgIH07XG4gICAgICBzY3JpcHQub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdnR0LmpzIHdhcyBub3QgbG9hZGVkIGR1ZSB0byBhbiBlcnJvclxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgVGVjaCN2dHRqc2xvYWRlZFxuICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgICAqL1xuICAgICAgICBfdGhpczUudHJpZ2dlcigndnR0anNlcnJvcicpO1xuICAgICAgfTtcbiAgICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuICAgICAgICBzY3JpcHQub25lcnJvciA9IG51bGw7XG4gICAgICB9KTtcbiAgICAgIC8vIGJ1dCBoYXZlIG5vdCBsb2FkZWQgeWV0IGFuZCB3ZSBzZXQgaXQgdG8gdHJ1ZSBiZWZvcmUgdGhlIGluamVjdCBzbyB0aGF0XG4gICAgICAvLyB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlIGluamVjdGVkIHdpbmRvdy5XZWJWVFQgaWYgaXQgbG9hZHMgcmlnaHQgYXdheVxuICAgICAgd2luZG93LldlYlZUVCA9IHRydWU7XG4gICAgICB0aGlzLmVsKCkucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlYWR5KHRoaXMuYWRkV2ViVnR0U2NyaXB0Xyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBFbXVsYXRlIHRleHR0cmFja3NcbiAgICpcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5lbXVsYXRlVGV4dFRyYWNrcyA9IGZ1bmN0aW9uIGVtdWxhdGVUZXh0VHJhY2tzKCkge1xuICAgIHZhciBfdGhpczYgPSB0aGlzO1xuXG4gICAgdmFyIHRyYWNrcyA9IHRoaXMudGV4dFRyYWNrcygpO1xuICAgIHZhciByZW1vdGVUcmFja3MgPSB0aGlzLnJlbW90ZVRleHRUcmFja3MoKTtcbiAgICB2YXIgaGFuZGxlQWRkVHJhY2sgPSBmdW5jdGlvbiBoYW5kbGVBZGRUcmFjayhlKSB7XG4gICAgICByZXR1cm4gdHJhY2tzLmFkZFRyYWNrKGUudHJhY2spO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZVJlbW92ZVRyYWNrID0gZnVuY3Rpb24gaGFuZGxlUmVtb3ZlVHJhY2soZSkge1xuICAgICAgcmV0dXJuIHRyYWNrcy5yZW1vdmVUcmFjayhlLnRyYWNrKTtcbiAgICB9O1xuXG4gICAgcmVtb3RlVHJhY2tzLm9uKCdhZGR0cmFjaycsIGhhbmRsZUFkZFRyYWNrKTtcbiAgICByZW1vdGVUcmFja3Mub24oJ3JlbW92ZXRyYWNrJywgaGFuZGxlUmVtb3ZlVHJhY2spO1xuXG4gICAgdGhpcy5hZGRXZWJWdHRTY3JpcHRfKCk7XG5cbiAgICB2YXIgdXBkYXRlRGlzcGxheSA9IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXkoKSB7XG4gICAgICByZXR1cm4gX3RoaXM2LnRyaWdnZXIoJ3RleHR0cmFja2NoYW5nZScpO1xuICAgIH07XG5cbiAgICB2YXIgdGV4dFRyYWNrc0NoYW5nZXMgPSBmdW5jdGlvbiB0ZXh0VHJhY2tzQ2hhbmdlcygpIHtcbiAgICAgIHVwZGF0ZURpc3BsYXkoKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHRyYWNrID0gdHJhY2tzW2ldO1xuXG4gICAgICAgIHRyYWNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2N1ZWNoYW5nZScsIHVwZGF0ZURpc3BsYXkpO1xuICAgICAgICBpZiAodHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignY3VlY2hhbmdlJywgdXBkYXRlRGlzcGxheSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGV4dFRyYWNrc0NoYW5nZXMoKTtcbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGV4dFRyYWNrc0NoYW5nZXMpO1xuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIHRleHRUcmFja3NDaGFuZ2VzKTtcbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7XG5cbiAgICB0aGlzLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3RlVHJhY2tzLm9mZignYWRkdHJhY2snLCBoYW5kbGVBZGRUcmFjayk7XG4gICAgICByZW1vdGVUcmFja3Mub2ZmKCdyZW1vdmV0cmFjaycsIGhhbmRsZVJlbW92ZVRyYWNrKTtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7XG4gICAgICB0cmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7XG4gICAgICB0cmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgICB0cmFjay5yZW1vdmVFdmVudExpc3RlbmVyKCdjdWVjaGFuZ2UnLCB1cGRhdGVEaXNwbGF5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCByZXR1cm5zIGEgcmVtb3RlIHtAbGluayBUZXh0VHJhY2t9IG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmRcbiAgICogICAgICAgIGBUZXh0VHJhY2tgIGtpbmQgKHN1YnRpdGxlcywgY2FwdGlvbnMsIGRlc2NyaXB0aW9ucywgY2hhcHRlcnMsIG9yIG1ldGFkYXRhKVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsXVxuICAgKiAgICAgICAgTGFiZWwgdG8gaWRlbnRpZnkgdGhlIHRleHQgdHJhY2tcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZV1cbiAgICogICAgICAgIFR3byBsZXR0ZXIgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge1RleHRUcmFja31cbiAgICogICAgICAgICBUaGUgVGV4dFRyYWNrIHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLmFkZFRleHRUcmFjayA9IGZ1bmN0aW9uIGFkZFRleHRUcmFjayhraW5kLCBsYWJlbCwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAoIWtpbmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGV4dFRyYWNrIGtpbmQgaXMgcmVxdWlyZWQgYnV0IHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlVHJhY2tIZWxwZXIodGhpcywga2luZCwgbGFiZWwsIGxhbmd1YWdlKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVtdWxhdGVkIFRleHRUcmFjayBmb3IgdXNlIGJ5IGFkZFJlbW90ZVRleHRUcmFja1xuICAgKlxuICAgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbVxuICAgKiBUZWNoIGluIG9yZGVyIHRvIGNyZWF0ZSBuYXRpdmUgb3IgY3VzdG9tIFRleHRUcmFja3MuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqICAgICAgICBUaGUgb2JqZWN0IHNob3VsZCBjb250YWluIHRoZSBvcHRpb25zIHRvIGluaXRpYWxpemUgdGhlIFRleHRUcmFjayB3aXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2luZF1cbiAgICogICAgICAgIGBUZXh0VHJhY2tgIGtpbmQgKHN1YnRpdGxlcywgY2FwdGlvbnMsIGRlc2NyaXB0aW9ucywgY2hhcHRlcnMsIG9yIG1ldGFkYXRhKS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXS5cbiAgICogICAgICAgIExhYmVsIHRvIGlkZW50aWZ5IHRoZSB0ZXh0IHRyYWNrXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYW5ndWFnZV1cbiAgICogICAgICAgIFR3byBsZXR0ZXIgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtIVE1MVHJhY2tFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSB0cmFjayBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFRlY2gucHJvdG90eXBlLmNyZWF0ZVJlbW90ZVRleHRUcmFjayA9IGZ1bmN0aW9uIGNyZWF0ZVJlbW90ZVRleHRUcmFjayhvcHRpb25zKSB7XG4gICAgdmFyIHRyYWNrID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIHtcbiAgICAgIHRlY2g6IHRoaXNcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUkVNT1RFLnJlbW90ZVRleHRFbC5UcmFja0NsYXNzKHRyYWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlbW90ZSB0ZXh0IHRyYWNrIG9iamVjdCBhbmQgcmV0dXJucyBhbiBodG1sIHRyYWNrIGVsZW1lbnQuXG4gICAqXG4gICAqID4gTm90ZTogVGhpcyBjYW4gYmUgYW4gZW11bGF0ZWQge0BsaW5rIEhUTUxUcmFja0VsZW1lbnR9IG9yIGEgbmF0aXZlIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIFNlZSB7QGxpbmsgVGVjaCNjcmVhdGVSZW1vdGVUZXh0VHJhY2t9IGZvciBtb3JlIGRldGFpbGVkIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbnVhbENsZWFudXA9dHJ1ZV1cbiAgICogICAgICAgIC0gV2hlbiBmYWxzZTogdGhlIFRleHRUcmFjayB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSB2aWRlb1xuICAgKiAgICAgICAgICBlbGVtZW50IHdoZW5ldmVyIHRoZSBzb3VyY2UgY2hhbmdlc1xuICAgKiAgICAgICAgLSBXaGVuIFRydWU6IFRoZSBUZXh0VHJhY2sgd2lsbCBoYXZlIHRvIGJlIGNsZWFuZWQgdXAgbWFudWFsbHlcbiAgICpcbiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudH1cbiAgICogICAgICAgICBBbiBIdG1sIFRyYWNrIEVsZW1lbnQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFRoZSBkZWZhdWx0IGZ1bmN0aW9uYWxpdHkgZm9yIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBlcXVpdmFsZW50XG4gICAqICAgICAgICAgICAgIHRvIFwibWFudWFsQ2xlYW51cD1mYWxzZVwiIGluIHRoZSBmdXR1cmUuIFRoZSBtYW51YWxDbGVhbnVwIHBhcmFtZXRlciB3aWxsXG4gICAqICAgICAgICAgICAgIGFsc28gYmUgcmVtb3ZlZC5cbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5hZGRSZW1vdGVUZXh0VHJhY2sgPSBmdW5jdGlvbiBhZGRSZW1vdGVUZXh0VHJhY2soKSB7XG4gICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIG1hbnVhbENsZWFudXAgPSBhcmd1bWVudHNbMV07XG5cbiAgICB2YXIgaHRtbFRyYWNrRWxlbWVudCA9IHRoaXMuY3JlYXRlUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMpO1xuXG4gICAgaWYgKG1hbnVhbENsZWFudXAgIT09IHRydWUgJiYgbWFudWFsQ2xlYW51cCAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGRlcHJlY2F0aW9uIHdhcm5pbmdcbiAgICAgIGxvZyQxLndhcm4oJ0NhbGxpbmcgYWRkUmVtb3RlVGV4dFRyYWNrIHdpdGhvdXQgZXhwbGljaXRseSBzZXR0aW5nIHRoZSBcIm1hbnVhbENsZWFudXBcIiBwYXJhbWV0ZXIgdG8gYHRydWVgIGlzIGRlcHJlY2F0ZWQgYW5kIGRlZmF1bHQgdG8gYGZhbHNlYCBpbiBmdXR1cmUgdmVyc2lvbiBvZiB2aWRlby5qcycpO1xuICAgICAgbWFudWFsQ2xlYW51cCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gc3RvcmUgSFRNTFRyYWNrRWxlbWVudCBhbmQgVGV4dFRyYWNrIHRvIHJlbW90ZSBsaXN0XG4gICAgdGhpcy5yZW1vdGVUZXh0VHJhY2tFbHMoKS5hZGRUcmFja0VsZW1lbnRfKGh0bWxUcmFja0VsZW1lbnQpO1xuICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrcygpLmFkZFRyYWNrKGh0bWxUcmFja0VsZW1lbnQudHJhY2spO1xuXG4gICAgaWYgKG1hbnVhbENsZWFudXAgIT09IHRydWUpIHtcbiAgICAgIC8vIGNyZWF0ZSB0aGUgVGV4dFRyYWNrTGlzdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzNy5hdXRvUmVtb3RlVGV4dFRyYWNrc18uYWRkVHJhY2soaHRtbFRyYWNrRWxlbWVudC50cmFjayk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbFRyYWNrRWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcmVtb3RlIHRleHQgdHJhY2sgZnJvbSB0aGUgcmVtb3RlIGBUZXh0VHJhY2tMaXN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gICAqICAgICAgICBgVGV4dFRyYWNrYCB0byByZW1vdmUgZnJvbSB0aGUgYFRleHRUcmFja0xpc3RgXG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUucmVtb3ZlUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gcmVtb3ZlUmVtb3RlVGV4dFRyYWNrKHRyYWNrKSB7XG4gICAgdmFyIHRyYWNrRWxlbWVudCA9IHRoaXMucmVtb3RlVGV4dFRyYWNrRWxzKCkuZ2V0VHJhY2tFbGVtZW50QnlUcmFja18odHJhY2spO1xuXG4gICAgLy8gcmVtb3ZlIEhUTUxUcmFja0VsZW1lbnQgYW5kIFRleHRUcmFjayBmcm9tIHJlbW90ZSBsaXN0XG4gICAgdGhpcy5yZW1vdGVUZXh0VHJhY2tFbHMoKS5yZW1vdmVUcmFja0VsZW1lbnRfKHRyYWNrRWxlbWVudCk7XG4gICAgdGhpcy5yZW1vdGVUZXh0VHJhY2tzKCkucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgIHRoaXMuYXV0b1JlbW90ZVRleHRUcmFja3NfLnJlbW92ZVRyYWNrKHRyYWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyBhdmFpbGFibGUgbWVkaWEgcGxheWJhY2sgcXVhbGl0eSBtZXRyaWNzIGFzIHNwZWNpZmllZCBieSB0aGUgVzNDJ3MgTWVkaWFcbiAgICogUGxheWJhY2sgUXVhbGl0eSBBUEkuXG4gICAqXG4gICAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vbWVkaWEtcGxheWJhY2stcXVhbGl0eX1cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiAgICAgICAgIEFuIG9iamVjdCB3aXRoIHN1cHBvcnRlZCBtZWRpYSBwbGF5YmFjayBxdWFsaXR5IG1ldHJpY3NcbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkgPSBmdW5jdGlvbiBnZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpIHtcbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgbWV0aG9kIHRvIHNldCBhIHBvc3RlciBmcm9tIGEgYFRlY2hgLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5zZXRQb3N0ZXIgPSBmdW5jdGlvbiBzZXRQb3N0ZXIoKSB7fTtcblxuICAvKipcbiAgICogQSBtZXRob2QgdG8gY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgJ3BsYXlzaW5pbmUnIDx2aWRlbz4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5wbGF5c2lubGluZSA9IGZ1bmN0aW9uIHBsYXlzaW5saW5lKCkge307XG5cbiAgLyoqXG4gICAqIEEgbWV0aG9kIHRvIHNldCBvciB1bnNldCB0aGUgJ3BsYXlzaW5pbmUnIDx2aWRlbz4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBUZWNoLnByb3RvdHlwZS5zZXRQbGF5c2lubGluZSA9IGZ1bmN0aW9uIHNldFBsYXlzaW5saW5lKCkge307XG5cbiAgLypcbiAgICogQ2hlY2sgaWYgdGhlIHRlY2ggY2FuIHN1cHBvcnQgdGhlIGdpdmVuIG1pbWUtdHlwZS5cbiAgICpcbiAgICogVGhlIGJhc2UgdGVjaCBkb2VzIG5vdCBzdXBwb3J0IGFueSB0eXBlLCBidXQgc291cmNlIGhhbmRsZXJzIG1pZ2h0XG4gICAqIG92ZXJ3cml0ZSB0aGlzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGVcbiAgICogICAgICAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2sgZm9yIHN1cHBvcnRcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yIGVtcHR5IHN0cmluZ1xuICAgKlxuICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTE1lZGlhRWxlbWVudC9jYW5QbGF5VHlwZX1cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuXG5cbiAgVGVjaC5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiBjYW5QbGF5VHlwZSgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB0eXBlIGlzIHN1cHBvcnRlZCBieSB0aGlzIHRlY2guXG4gICAqXG4gICAqIFRoZSBiYXNlIHRlY2ggZG9lcyBub3Qgc3VwcG9ydCBhbnkgdHlwZSwgYnV0IHNvdXJjZSBoYW5kbGVycyBtaWdodFxuICAgKiBvdmVyd3JpdGUgdGhpcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogICAgICAgIFRoZSBtZWRpYSB0eXBlIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgbmF0aXZlIHZpZGVvIGVsZW1lbnQncyByZXNwb25zZVxuICAgKi9cblxuXG4gIFRlY2guY2FuUGxheVR5cGUgPSBmdW5jdGlvbiBjYW5QbGF5VHlwZSgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiBzb3VyY2VcbiAgICogQHBhcmFtIHtPYmplY3R9IHNyY09ialxuICAgKiAgICAgICAgVGhlIHNvdXJjZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgdGVjaFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9ICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gICAqL1xuXG5cbiAgVGVjaC5jYW5QbGF5U291cmNlID0gZnVuY3Rpb24gY2FuUGxheVNvdXJjZShzcmNPYmosIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gVGVjaC5jYW5QbGF5VHlwZShzcmNPYmoudHlwZSk7XG4gIH07XG5cbiAgLypcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgVGVjaCBvciBub3QuXG4gICAqIENhbiBiZSBwYXNzZWQgZWl0aGVyIGEgQ2xhc3MgbGlrZSBgSHRtbDVgIG9yIGEgaW5zdGFuY2UgbGlrZSBgcGxheWVyLnRlY2hfYFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gY29tcG9uZW50XG4gICAqICAgICAgICBUaGUgaXRlbSB0byBjaGVja1xuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiAgICAgICAgIFdoZXRoZXIgaXQgaXMgYSB0ZWNoIG9yIG5vdFxuICAgKiAgICAgICAgIC0gVHJ1ZSBpZiBpdCBpcyBhIHRlY2hcbiAgICogICAgICAgICAtIEZhbHNlIGlmIGl0IGlzIG5vdFxuICAgKi9cblxuXG4gIFRlY2guaXNUZWNoID0gZnVuY3Rpb24gaXNUZWNoKGNvbXBvbmVudCkge1xuICAgIHJldHVybiBjb21wb25lbnQucHJvdG90eXBlIGluc3RhbmNlb2YgVGVjaCB8fCBjb21wb25lbnQgaW5zdGFuY2VvZiBUZWNoIHx8IGNvbXBvbmVudCA9PT0gVGVjaDtcbiAgfTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgYFRlY2hgIGludG8gYSBzaGFyZWQgbGlzdCBmb3IgdmlkZW9qcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogICAgICAgIE5hbWUgb2YgdGhlIGBUZWNoYCB0byByZWdpc3Rlci5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRlY2hcbiAgICogICAgICAgIFRoZSBgVGVjaGAgY2xhc3MgdG8gcmVnaXN0ZXIuXG4gICAqL1xuXG5cbiAgVGVjaC5yZWdpc3RlclRlY2ggPSBmdW5jdGlvbiByZWdpc3RlclRlY2gobmFtZSwgdGVjaCkge1xuICAgIGlmICghVGVjaC50ZWNoc18pIHtcbiAgICAgIFRlY2gudGVjaHNfID0ge307XG4gICAgfVxuXG4gICAgaWYgKCFUZWNoLmlzVGVjaCh0ZWNoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZWNoICcgKyBuYW1lICsgJyBtdXN0IGJlIGEgVGVjaCcpO1xuICAgIH1cblxuICAgIGlmICghVGVjaC5jYW5QbGF5VHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZWNocyBtdXN0IGhhdmUgYSBzdGF0aWMgY2FuUGxheVR5cGUgbWV0aG9kIG9uIHRoZW0nKTtcbiAgICB9XG4gICAgaWYgKCFUZWNoLmNhblBsYXlTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGVjaHMgbXVzdCBoYXZlIGEgc3RhdGljIGNhblBsYXlTb3VyY2UgbWV0aG9kIG9uIHRoZW0nKTtcbiAgICB9XG5cbiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7XG5cbiAgICBUZWNoLnRlY2hzX1tuYW1lXSA9IHRlY2g7XG4gICAgaWYgKG5hbWUgIT09ICdUZWNoJykge1xuICAgICAgLy8gY2FtZWwgY2FzZSB0aGUgdGVjaE5hbWUgZm9yIHVzZSBpbiB0ZWNoT3JkZXJcbiAgICAgIFRlY2guZGVmYXVsdFRlY2hPcmRlcl8ucHVzaChuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlY2g7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIGBUZWNoYCBmcm9tIHRoZSBzaGFyZWQgbGlzdCBieSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiAgICAgICAgYGNhbWVsQ2FzZWAgb3IgYFRpdGxlQ2FzZWAgbmFtZSBvZiB0aGUgVGVjaCB0byBnZXRcbiAgICpcbiAgICogQHJldHVybiB7VGVjaHx1bmRlZmluZWR9XG4gICAqICAgICAgICAgVGhlIGBUZWNoYCBvciB1bmRlZmluZWQgaWYgdGhlcmUgd2FzIG5vIHRlY2ggd2l0aCB0aGUgbmFtZSByZXF1c3RlZC5cbiAgICovXG5cblxuICBUZWNoLmdldFRlY2ggPSBmdW5jdGlvbiBnZXRUZWNoKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7XG5cbiAgICBpZiAoVGVjaC50ZWNoc18gJiYgVGVjaC50ZWNoc19bbmFtZV0pIHtcbiAgICAgIHJldHVybiBUZWNoLnRlY2hzX1tuYW1lXTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93ICYmIHdpbmRvdy52aWRlb2pzICYmIHdpbmRvdy52aWRlb2pzW25hbWVdKSB7XG4gICAgICBsb2ckMS53YXJuKCdUaGUgJyArIG5hbWUgKyAnIHRlY2ggd2FzIGFkZGVkIHRvIHRoZSB2aWRlb2pzIG9iamVjdCB3aGVuIGl0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVzaW5nIHZpZGVvanMucmVnaXN0ZXJUZWNoKG5hbWUsIHRlY2gpJyk7XG4gICAgICByZXR1cm4gd2luZG93LnZpZGVvanNbbmFtZV07XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUZWNoO1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIFZpZGVvVHJhY2tMaXN0fVxuICpcbiAqIEByZXR1cm5zIHtWaWRlb1RyYWNrTGlzdH1cbiAqIEBtZXRob2QgVGVjaC5wcm90b3R5cGUudmlkZW9UcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIEF1ZGlvVHJhY2tMaXN0fVxuICpcbiAqIEByZXR1cm5zIHtBdWRpb1RyYWNrTGlzdH1cbiAqIEBtZXRob2QgVGVjaC5wcm90b3R5cGUuYXVkaW9UcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIFRleHRUcmFja0xpc3R9XG4gKlxuICogQHJldHVybnMge1RleHRUcmFja0xpc3R9XG4gKiBAbWV0aG9kIFRlY2gucHJvdG90eXBlLnRleHRUcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgcmVtb3RlIGVsZW1lbnQge0BsaW5rIFRleHRUcmFja0xpc3R9XG4gKlxuICogQHJldHVybnMge1RleHRUcmFja0xpc3R9XG4gKiBAbWV0aG9kIFRlY2gucHJvdG90eXBlLnJlbW90ZVRleHRUcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgcmVtb3RlIGVsZW1lbnQge0BsaW5rIEh0bWxUcmFja0VsZW1lbnRMaXN0fVxuICpcbiAqIEByZXR1cm5zIHtIdG1sVHJhY2tFbGVtZW50TGlzdH1cbiAqIEBtZXRob2QgVGVjaC5wcm90b3R5cGUucmVtb3RlVGV4dFRyYWNrRWxzXG4gKi9cblxuQUxMLm5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIHByb3BzID0gQUxMW25hbWVdO1xuXG4gIFRlY2gucHJvdG90eXBlW3Byb3BzLmdldHRlck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXNbcHJvcHMucHJpdmF0ZU5hbWVdID0gdGhpc1twcm9wcy5wcml2YXRlTmFtZV0gfHwgbmV3IHByb3BzLkxpc3RDbGFzcygpO1xuICAgIHJldHVybiB0aGlzW3Byb3BzLnByaXZhdGVOYW1lXTtcbiAgfTtcbn0pO1xuXG4vKipcbiAqIExpc3Qgb2YgYXNzb2NpYXRlZCB0ZXh0IHRyYWNrc1xuICpcbiAqIEB0eXBlIHtUZXh0VHJhY2tMaXN0fVxuICogQHByaXZhdGVcbiAqIEBwcm9wZXJ0eSBUZWNoI3RleHRUcmFja3NfXG4gKi9cblxuLyoqXG4gKiBMaXN0IG9mIGFzc29jaWF0ZWQgYXVkaW8gdHJhY2tzLlxuICpcbiAqIEB0eXBlIHtBdWRpb1RyYWNrTGlzdH1cbiAqIEBwcml2YXRlXG4gKiBAcHJvcGVydHkgVGVjaCNhdWRpb1RyYWNrc19cbiAqL1xuXG4vKipcbiAqIExpc3Qgb2YgYXNzb2NpYXRlZCB2aWRlbyB0cmFja3MuXG4gKlxuICogQHR5cGUge1ZpZGVvVHJhY2tMaXN0fVxuICogQHByaXZhdGVcbiAqIEBwcm9wZXJ0eSBUZWNoI3ZpZGVvVHJhY2tzX1xuICovXG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIHZvbHVtZSBjb250cm9sLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNWb2x1bWVDb250cm9sID0gdHJ1ZTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIG11dGluZyB2b2x1bWUuXG4gKlxuICogQHR5cGUge2JvbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cblRlY2gucHJvdG90eXBlLmZlYXR1cmVzTXV0ZUNvbnRyb2wgPSB0cnVlO1xuXG4vKipcbiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBgVGVjaGAgc3VwcG9ydHMgZnVsbHNjcmVlbiByZXNpemUgY29udHJvbC5cbiAqIFJlc2l6aW5nIHBsdWdpbnMgdXNpbmcgcmVxdWVzdCBmdWxsc2NyZWVuIHJlbG9hZHMgdGhlIHBsdWdpblxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNGdWxsc2NyZWVuUmVzaXplID0gZmFsc2U7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIGNoYW5naW5nIHRoZSBzcGVlZCBhdCB3aGljaCB0aGUgdmlkZW9cbiAqIHBsYXlzLiBFeGFtcGxlczpcbiAqICAgLSBTZXQgcGxheWVyIHRvIHBsYXkgMnggKHR3aWNlKSBhcyBmYXN0XG4gKiAgIC0gU2V0IHBsYXllciB0byBwbGF5IDAuNXggKGhhbGYpIGFzIGZhc3RcbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cblRlY2gucHJvdG90eXBlLmZlYXR1cmVzUGxheWJhY2tSYXRlID0gZmFsc2U7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIHRoZSBgcHJvZ3Jlc3NgIGV2ZW50LiBUaGlzIGlzIGN1cnJlbnRseVxuICogbm90IHRyaWdnZXJlZCBieSB2aWRlby1qcy1zd2YuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZlxuICoge0BsaW5rIFRlY2gjbWFudWFsUHJvZ3Jlc3NPbn0gc2hvdWxkIGJlIGNhbGxlZC5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cblRlY2gucHJvdG90eXBlLmZlYXR1cmVzUHJvZ3Jlc3NFdmVudHMgPSBmYWxzZTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHRoZSBgVGVjaGAgc3VwcG9ydHMgdGhlIGBzb3VyY2VzZXRgIGV2ZW50LlxuICpcbiAqIEEgdGVjaCBzaG91bGQgc2V0IHRoaXMgdG8gYHRydWVgIGFuZCB0aGVuIHVzZSB7QGxpbmsgVGVjaCN0cmlnZ2VyU291cmNlc2V0fVxuICogdG8gdHJpZ2dlciBhIHtAbGluayBUZWNoI2V2ZW50OnNvdXJjZXNldH0gYXQgdGhlIGVhcmxpZXN0IHRpbWUgYWZ0ZXIgZ2V0dGluZ1xuICogYSBuZXcgc291cmNlLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNTb3VyY2VzZXQgPSBmYWxzZTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHRoZSBgVGVjaGAgc3VwcG9ydHMgdGhlIGB0aW1ldXBkYXRlYCBldmVudC4gVGhpcyBpcyBjdXJyZW50bHlcbiAqIG5vdCB0cmlnZ2VyZWQgYnkgdmlkZW8tanMtc3dmLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWZcbiAqIHtAbGluayBUZWNoI21hbnVhbFRpbWVVcGRhdGVzfSBzaG91bGQgYmUgY2FsbGVkLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNUaW1ldXBkYXRlRXZlbnRzID0gZmFsc2U7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIHRoZSBuYXRpdmUgYFRleHRUcmFja2BzLlxuICogVGhpcyB3aWxsIGhlbHAgdXMgaW50ZWdyYXRlIHdpdGggbmF0aXZlIGBUZXh0VHJhY2tgcyBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGVtLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHRcbiAqL1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzID0gZmFsc2U7XG5cbi8qKlxuICogQSBmdW5jdGlvbmFsIG1peGluIGZvciB0ZWNocyB0aGF0IHdhbnQgdG8gdXNlIHRoZSBTb3VyY2UgSGFuZGxlciBwYXR0ZXJuLlxuICogU291cmNlIGhhbmRsZXJzIGFyZSBzY3JpcHRzIGZvciBoYW5kbGluZyBzcGVjaWZpYyBmb3JtYXRzLlxuICogVGhlIHNvdXJjZSBoYW5kbGVyIHBhdHRlcm4gaXMgdXNlZCBmb3IgYWRhcHRpdmUgZm9ybWF0cyAoSExTLCBEQVNIKSB0aGF0XG4gKiBtYW51YWxseSBsb2FkIHZpZGVvIGRhdGEgYW5kIGZlZWQgaXQgaW50byBhIFNvdXJjZSBCdWZmZXIgKE1lZGlhIFNvdXJjZSBFeHRlbnNpb25zKVxuICogRXhhbXBsZTogYFRlY2gud2l0aFNvdXJjZUhhbmRsZXJzLmNhbGwoTXlUZWNoKTtgXG4gKlxuICogQHBhcmFtIHtUZWNofSBfVGVjaFxuICogICAgICAgIFRoZSB0ZWNoIHRvIGFkZCBzb3VyY2UgaGFuZGxlciBmdW5jdGlvbnMgdG8uXG4gKlxuICogQG1peGVzIFRlY2h+U291cmNlSGFuZGxlckFkZGl0aW9uc1xuICovXG5UZWNoLndpdGhTb3VyY2VIYW5kbGVycyA9IGZ1bmN0aW9uIChfVGVjaCkge1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHNvdXJjZSBoYW5kbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogICAgICAgIFRoZSBzb3VyY2UgaGFuZGxlciBjbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4XVxuICAgKiAgICAgICAgUmVnaXN0ZXIgaXQgYXQgdGhlIGZvbGxvd2luZyBpbmRleFxuICAgKi9cbiAgX1RlY2gucmVnaXN0ZXJTb3VyY2VIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIsIGluZGV4KSB7XG4gICAgdmFyIGhhbmRsZXJzID0gX1RlY2guc291cmNlSGFuZGxlcnM7XG5cbiAgICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycyA9IF9UZWNoLnNvdXJjZUhhbmRsZXJzID0gW107XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgICBpbmRleCA9IGhhbmRsZXJzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDAsIGhhbmRsZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgdGVjaCBjYW4gc3VwcG9ydCB0aGUgZ2l2ZW4gdHlwZS4gQWxzbyBjaGVja3MgdGhlXG4gICAqIFRlY2hzIHNvdXJjZUhhbmRsZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiAgICAgICAgIFRoZSBtaW1ldHlwZSB0byBjaGVjay5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gICAqL1xuICBfVGVjaC5jYW5QbGF5VHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIGhhbmRsZXJzID0gX1RlY2guc291cmNlSGFuZGxlcnMgfHwgW107XG4gICAgdmFyIGNhbiA9IHZvaWQgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNhbiA9IGhhbmRsZXJzW2ldLmNhblBsYXlUeXBlKHR5cGUpO1xuXG4gICAgICBpZiAoY2FuKSB7XG4gICAgICAgIHJldHVybiBjYW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBzb3VyY2UgaGFuZGxlciB0aGF0IHN1cHBvcnRzIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIFRPRE86IEFuc3dlciBxdWVzdGlvbjogc2hvdWxkICdwcm9iYWJseScgYmUgcHJpb3JpdGl6ZWQgb3ZlciAnbWF5YmUnXG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNvdXJjZVxuICAgKiAgICAgICAgVGhlIHNvdXJjZSBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgdGVjaFxuICAgKlxuICAgKiBAcmV0dXJuIHtTb3VyY2VIYW5kbGVyfG51bGx9XG4gICAqICAgICAgICAgIFRoZSBmaXJzdCBzb3VyY2UgaGFuZGxlciB0aGF0IHN1cHBvcnRzIHRoZSBzb3VyY2Ugb3IgbnVsbCBpZlxuICAgKiAgICAgICAgICBubyBTb3VyY2VIYW5kbGVyIHN1cHBvcnRzIHRoZSBzb3VyY2VcbiAgICovXG4gIF9UZWNoLnNlbGVjdFNvdXJjZUhhbmRsZXIgPSBmdW5jdGlvbiAoc291cmNlLCBvcHRpb25zKSB7XG4gICAgdmFyIGhhbmRsZXJzID0gX1RlY2guc291cmNlSGFuZGxlcnMgfHwgW107XG4gICAgdmFyIGNhbiA9IHZvaWQgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNhbiA9IGhhbmRsZXJzW2ldLmNhbkhhbmRsZVNvdXJjZShzb3VyY2UsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoY2FuKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHRlY2ggY2FuIHN1cHBvcnQgdGhlIGdpdmVuIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdH0gc3JjT2JqXG4gICAqICAgICAgICBUaGUgc291cmNlIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiAgICAgICAgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSB0ZWNoXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKVxuICAgKi9cbiAgX1RlY2guY2FuUGxheVNvdXJjZSA9IGZ1bmN0aW9uIChzcmNPYmosIG9wdGlvbnMpIHtcbiAgICB2YXIgc2ggPSBfVGVjaC5zZWxlY3RTb3VyY2VIYW5kbGVyKHNyY09iaiwgb3B0aW9ucyk7XG5cbiAgICBpZiAoc2gpIHtcbiAgICAgIHJldHVybiBzaC5jYW5IYW5kbGVTb3VyY2Uoc3JjT2JqLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgYSBzb3VyY2UgaGFuZGxlciwgcHJlZmVyIGl0cyBpbXBsZW1lbnRhdGlvbiBvZlxuICAgKiBhbnkgZnVuY3Rpb24gbm9ybWFsbHkgcHJvdmlkZWQgYnkgdGhlIHRlY2guXG4gICAqL1xuICB2YXIgZGVmZXJyYWJsZSA9IFsnc2Vla2FibGUnLCAnc2Vla2luZycsICdkdXJhdGlvbiddO1xuXG4gIC8qKlxuICAgKiBBIHdyYXBwZXIgYXJvdW5kIHtAbGluayBUZWNoI3NlZWthYmxlfSB0aGF0IHdpbGwgY2FsbCBhIGBTb3VyY2VIYW5kbGVyYHMgc2Vla2FibGVcbiAgICogZnVuY3Rpb24gaWYgaXQgZXhpc3RzLCB3aXRoIGEgZmFsbGJhY2sgdG8gdGhlIFRlY2hzIHNlZWthYmxlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAbWV0aG9kIF9UZWNoLnNlZWthYmxlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBIHdyYXBwZXIgYXJvdW5kIHtAbGluayBUZWNoI2R1cmF0aW9ufSB0aGF0IHdpbGwgY2FsbCBhIGBTb3VyY2VIYW5kbGVyYHMgZHVyYXRpb25cbiAgICogZnVuY3Rpb24gaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgaXQgd2lsbCBmYWxsYmFjayB0byB0aGUgdGVjaHMgZHVyYXRpb24gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBtZXRob2QgX1RlY2guZHVyYXRpb25cbiAgICovXG5cbiAgZGVmZXJyYWJsZS5mb3JFYWNoKGZ1bmN0aW9uIChmbk5hbWUpIHtcbiAgICB2YXIgb3JpZ2luYWxGbiA9IHRoaXNbZm5OYW1lXTtcblxuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXNbZm5OYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLnNvdXJjZUhhbmRsZXJfICYmIHRoaXMuc291cmNlSGFuZGxlcl9bZm5OYW1lXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VIYW5kbGVyX1tmbk5hbWVdLmFwcGx5KHRoaXMuc291cmNlSGFuZGxlcl8sIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWxGbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0sIF9UZWNoLnByb3RvdHlwZSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHRoZSBzb3VyY2UgdXNpbmcgYSBzb3VyY2Ugb2JqZWN0XG4gICAqIGFuZCBzb3VyY2UgaGFuZGxlcnMuXG4gICAqIFNob3VsZCBuZXZlciBiZSBjYWxsZWQgdW5sZXNzIGEgc291cmNlIGhhbmRsZXIgd2FzIGZvdW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge1RlY2h+U291cmNlT2JqZWN0fSBzb3VyY2VcbiAgICogICAgICAgIEEgc291cmNlIG9iamVjdCB3aXRoIHNyYyBhbmQgdHlwZSBrZXlzXG4gICAqL1xuICBfVGVjaC5wcm90b3R5cGUuc2V0U291cmNlID0gZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIHZhciBzaCA9IF9UZWNoLnNlbGVjdFNvdXJjZUhhbmRsZXIoc291cmNlLCB0aGlzLm9wdGlvbnNfKTtcblxuICAgIGlmICghc2gpIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byBhIG5hdGl2ZSBzb3VyY2UgaGFuZGVyIHdoZW4gdW5zdXBwb3J0ZWQgc291cmNlcyBhcmVcbiAgICAgIC8vIGRlbGliZXJhdGVseSBzZXRcbiAgICAgIGlmIChfVGVjaC5uYXRpdmVTb3VyY2VIYW5kbGVyKSB7XG4gICAgICAgIHNoID0gX1RlY2gubmF0aXZlU291cmNlSGFuZGxlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZyQxLmVycm9yKCdObyBzb3VyY2UgaGFuZGVyIGZvdW5kIGZvciB0aGUgY3VycmVudCBzb3VyY2UuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzcG9zZSBhbnkgZXhpc3Rpbmcgc291cmNlIGhhbmRsZXJcbiAgICB0aGlzLmRpc3Bvc2VTb3VyY2VIYW5kbGVyKCk7XG4gICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnLCB0aGlzLmRpc3Bvc2VTb3VyY2VIYW5kbGVyKTtcblxuICAgIGlmIChzaCAhPT0gX1RlY2gubmF0aXZlU291cmNlSGFuZGxlcikge1xuICAgICAgdGhpcy5jdXJyZW50U291cmNlXyA9IHNvdXJjZTtcbiAgICB9XG5cbiAgICB0aGlzLnNvdXJjZUhhbmRsZXJfID0gc2guaGFuZGxlU291cmNlKHNvdXJjZSwgdGhpcywgdGhpcy5vcHRpb25zXyk7XG4gICAgdGhpcy5vbignZGlzcG9zZScsIHRoaXMuZGlzcG9zZVNvdXJjZUhhbmRsZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBhbnkgZXhpc3RpbmcgU291cmNlSGFuZGxlcnMgYW5kIGxpc3RlbmVycyB3aGVuIHRoZSBUZWNoIGlzIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAbGlzdGVucyBUZWNoI2Rpc3Bvc2VcbiAgICovXG4gIF9UZWNoLnByb3RvdHlwZS5kaXNwb3NlU291cmNlSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgc291cmNlIGFuZCBnZXQgYW5vdGhlciBvbmVcbiAgICAvLyB0aGVuIHdlIGFyZSBsb2FkaW5nIHNvbWV0aGluZyBuZXdcbiAgICAvLyB0aGFuIGNsZWFyIGFsbCBvZiBvdXIgY3VycmVudCB0cmFja3NcbiAgICBpZiAodGhpcy5jdXJyZW50U291cmNlXykge1xuICAgICAgdGhpcy5jbGVhclRyYWNrcyhbJ2F1ZGlvJywgJ3ZpZGVvJ10pO1xuICAgICAgdGhpcy5jdXJyZW50U291cmNlXyA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gYWx3YXlzIGNsZWFuIHVwIGF1dG8tdGV4dCB0cmFja3NcbiAgICB0aGlzLmNsZWFudXBBdXRvVGV4dFRyYWNrcygpO1xuXG4gICAgaWYgKHRoaXMuc291cmNlSGFuZGxlcl8pIHtcblxuICAgICAgaWYgKHRoaXMuc291cmNlSGFuZGxlcl8uZGlzcG9zZSkge1xuICAgICAgICB0aGlzLnNvdXJjZUhhbmRsZXJfLmRpc3Bvc2UoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3VyY2VIYW5kbGVyXyA9IG51bGw7XG4gICAgfVxuICB9O1xufTtcblxuLy8gVGhlIGJhc2UgVGVjaCBjbGFzcyBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGFzIGEgQ29tcG9uZW50LiBJdCBpcyB0aGUgb25seVxuLy8gVGVjaCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGFzIGEgQ29tcG9uZW50LlxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUZWNoJywgVGVjaCk7XG5UZWNoLnJlZ2lzdGVyVGVjaCgnVGVjaCcsIFRlY2gpO1xuXG4vKipcbiAqIEEgbGlzdCBvZiB0ZWNocyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0ZWNoT3JkZXIgb24gUGxheWVyc1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblRlY2guZGVmYXVsdFRlY2hPcmRlcl8gPSBbXTtcblxudmFyIG1pZGRsZXdhcmVzID0ge307XG52YXIgbWlkZGxld2FyZUluc3RhbmNlcyA9IHt9O1xuXG52YXIgVEVSTUlOQVRPUiA9IHt9O1xuXG5mdW5jdGlvbiB1c2UodHlwZSwgbWlkZGxld2FyZSkge1xuICBtaWRkbGV3YXJlc1t0eXBlXSA9IG1pZGRsZXdhcmVzW3R5cGVdIHx8IFtdO1xuICBtaWRkbGV3YXJlc1t0eXBlXS5wdXNoKG1pZGRsZXdhcmUpO1xufVxuXG5cblxuZnVuY3Rpb24gc2V0U291cmNlKHBsYXllciwgc3JjLCBuZXh0KSB7XG4gIHBsYXllci5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2V0U291cmNlSGVscGVyKHNyYywgbWlkZGxld2FyZXNbc3JjLnR5cGVdLCBuZXh0LCBwbGF5ZXIpO1xuICB9LCAxKTtcbn1cblxuZnVuY3Rpb24gc2V0VGVjaChtaWRkbGV3YXJlLCB0ZWNoKSB7XG4gIG1pZGRsZXdhcmUuZm9yRWFjaChmdW5jdGlvbiAobXcpIHtcbiAgICByZXR1cm4gbXcuc2V0VGVjaCAmJiBtdy5zZXRUZWNoKHRlY2gpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIGdldHRlciBvbiB0aGUgdGVjaCBmaXJzdCwgdGhyb3VnaCBlYWNoIG1pZGRsZXdhcmVcbiAqIGZyb20gcmlnaHQgdG8gbGVmdCB0byB0aGUgcGxheWVyLlxuICovXG5mdW5jdGlvbiBnZXQkMShtaWRkbGV3YXJlLCB0ZWNoLCBtZXRob2QpIHtcbiAgcmV0dXJuIG1pZGRsZXdhcmUucmVkdWNlUmlnaHQobWlkZGxld2FyZUl0ZXJhdG9yKG1ldGhvZCksIHRlY2hbbWV0aG9kXSgpKTtcbn1cblxuLyoqXG4gKiBUYWtlcyB0aGUgYXJndW1lbnQgZ2l2ZW4gdG8gdGhlIHBsYXllciBhbmQgY2FsbHMgdGhlIHNldHRlciBtZXRob2Qgb24gZWFjaFxuICogbWlkZGx3YXJlIGZyb20gbGVmdCB0byByaWdodCB0byB0aGUgdGVjaC5cbiAqL1xuZnVuY3Rpb24gc2V0JDEobWlkZGxld2FyZSwgdGVjaCwgbWV0aG9kLCBhcmcpIHtcbiAgcmV0dXJuIHRlY2hbbWV0aG9kXShtaWRkbGV3YXJlLnJlZHVjZShtaWRkbGV3YXJlSXRlcmF0b3IobWV0aG9kKSwgYXJnKSk7XG59XG5cbi8qKlxuICogVGFrZXMgdGhlIGFyZ3VtZW50IGdpdmVuIHRvIHRoZSBwbGF5ZXIgYW5kIGNhbGxzIHRoZSBgY2FsbGAgdmVyc2lvbiBvZiB0aGUgbWV0aG9kXG4gKiBvbiBlYWNoIG1pZGRsZXdhcmUgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICogVGhlbiwgY2FsbCB0aGUgcGFzc2VkIGluIG1ldGhvZCBvbiB0aGUgdGVjaCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgdW5jaGFuZ2VkXG4gKiBiYWNrIHRvIHRoZSBwbGF5ZXIsIHRocm91Z2ggbWlkZGxld2FyZSwgdGhpcyB0aW1lIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqL1xuZnVuY3Rpb24gbWVkaWF0ZShtaWRkbGV3YXJlLCB0ZWNoLCBtZXRob2QpIHtcbiAgdmFyIGFyZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB2YXIgY2FsbE1ldGhvZCA9ICdjYWxsJyArIHRvVGl0bGVDYXNlKG1ldGhvZCk7XG4gIHZhciBtaWRkbGV3YXJlVmFsdWUgPSBtaWRkbGV3YXJlLnJlZHVjZShtaWRkbGV3YXJlSXRlcmF0b3IoY2FsbE1ldGhvZCksIGFyZyk7XG4gIHZhciB0ZXJtaW5hdGVkID0gbWlkZGxld2FyZVZhbHVlID09PSBURVJNSU5BVE9SO1xuICB2YXIgcmV0dXJuVmFsdWUgPSB0ZXJtaW5hdGVkID8gbnVsbCA6IHRlY2hbbWV0aG9kXShtaWRkbGV3YXJlVmFsdWUpO1xuXG4gIGV4ZWN1dGVSaWdodChtaWRkbGV3YXJlLCBtZXRob2QsIHJldHVyblZhbHVlLCB0ZXJtaW5hdGVkKTtcblxuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbnZhciBhbGxvd2VkR2V0dGVycyA9IHtcbiAgYnVmZmVyZWQ6IDEsXG4gIGN1cnJlbnRUaW1lOiAxLFxuICBkdXJhdGlvbjogMSxcbiAgc2Vla2FibGU6IDEsXG4gIHBsYXllZDogMSxcbiAgcGF1c2VkOiAxXG59O1xuXG52YXIgYWxsb3dlZFNldHRlcnMgPSB7XG4gIHNldEN1cnJlbnRUaW1lOiAxXG59O1xuXG52YXIgYWxsb3dlZE1lZGlhdG9ycyA9IHtcbiAgcGxheTogMSxcbiAgcGF1c2U6IDFcbn07XG5cbmZ1bmN0aW9uIG1pZGRsZXdhcmVJdGVyYXRvcihtZXRob2QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSwgbXcpIHtcbiAgICAvLyBpZiB0aGUgcHJldmlvdXMgbWlkZGxld2FyZSB0ZXJtaW5hdGVkLCBwYXNzIGFsb25nIHRoZSB0ZXJtaW5hdGlvblxuICAgIGlmICh2YWx1ZSA9PT0gVEVSTUlOQVRPUikge1xuICAgICAgcmV0dXJuIFRFUk1JTkFUT1I7XG4gICAgfVxuXG4gICAgaWYgKG13W21ldGhvZF0pIHtcbiAgICAgIHJldHVybiBtd1ttZXRob2RdKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVSaWdodChtd3MsIG1ldGhvZCwgdmFsdWUsIHRlcm1pbmF0ZWQpIHtcbiAgZm9yICh2YXIgaSA9IG13cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBtdyA9IG13c1tpXTtcblxuICAgIGlmIChtd1ttZXRob2RdKSB7XG4gICAgICBtd1ttZXRob2RdKHRlcm1pbmF0ZWQsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJDYWNoZUZvclBsYXllcihwbGF5ZXIpIHtcbiAgbWlkZGxld2FyZUluc3RhbmNlc1twbGF5ZXIuaWQoKV0gPSBudWxsO1xufVxuXG4vKipcbiAqIHtcbiAqICBbcGxheWVySWRdOiBbW213RmFjdG9yeSwgbXdJbnN0YW5jZV0sIC4uLl1cbiAqIH1cbiAqL1xuZnVuY3Rpb24gZ2V0T3JDcmVhdGVGYWN0b3J5KHBsYXllciwgbXdGYWN0b3J5KSB7XG4gIHZhciBtd3MgPSBtaWRkbGV3YXJlSW5zdGFuY2VzW3BsYXllci5pZCgpXTtcbiAgdmFyIG13ID0gbnVsbDtcblxuICBpZiAobXdzID09PSB1bmRlZmluZWQgfHwgbXdzID09PSBudWxsKSB7XG4gICAgbXcgPSBtd0ZhY3RvcnkocGxheWVyKTtcbiAgICBtaWRkbGV3YXJlSW5zdGFuY2VzW3BsYXllci5pZCgpXSA9IFtbbXdGYWN0b3J5LCBtd11dO1xuICAgIHJldHVybiBtdztcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9td3MkaSA9IG13c1tpXSxcbiAgICAgICAgbXdmID0gX213cyRpWzBdLFxuICAgICAgICBtd2kgPSBfbXdzJGlbMV07XG5cblxuICAgIGlmIChtd2YgIT09IG13RmFjdG9yeSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbXcgPSBtd2k7XG4gIH1cblxuICBpZiAobXcgPT09IG51bGwpIHtcbiAgICBtdyA9IG13RmFjdG9yeShwbGF5ZXIpO1xuICAgIG13cy5wdXNoKFttd0ZhY3RvcnksIG13XSk7XG4gIH1cblxuICByZXR1cm4gbXc7XG59XG5cbmZ1bmN0aW9uIHNldFNvdXJjZUhlbHBlcigpIHtcbiAgdmFyIHNyYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIHZhciBtaWRkbGV3YXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTtcbiAgdmFyIG5leHQgPSBhcmd1bWVudHNbMl07XG4gIHZhciBwbGF5ZXIgPSBhcmd1bWVudHNbM107XG4gIHZhciBhY2MgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IFtdO1xuICB2YXIgbGFzdFJ1biA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogZmFsc2U7XG4gIHZhciBtd0ZhY3RvcnkgPSBtaWRkbGV3YXJlWzBdLFxuICAgICAgbXdyZXN0ID0gbWlkZGxld2FyZS5zbGljZSgxKTtcblxuICAvLyBpZiBtd0ZhY3RvcnkgaXMgYSBzdHJpbmcsIHRoZW4gd2UncmUgYXQgYSBmb3JrIGluIHRoZSByb2FkXG5cbiAgaWYgKHR5cGVvZiBtd0ZhY3RvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgc2V0U291cmNlSGVscGVyKHNyYywgbWlkZGxld2FyZXNbbXdGYWN0b3J5XSwgbmV4dCwgcGxheWVyLCBhY2MsIGxhc3RSdW4pO1xuXG4gICAgLy8gaWYgd2UgaGF2ZSBhbiBtd0ZhY3RvcnksIGNhbGwgaXQgd2l0aCB0aGUgcGxheWVyIHRvIGdldCB0aGUgbXcsXG4gICAgLy8gdGhlbiBjYWxsIHRoZSBtdydzIHNldFNvdXJjZSBtZXRob2RcbiAgfSBlbHNlIGlmIChtd0ZhY3RvcnkpIHtcbiAgICB2YXIgbXcgPSBnZXRPckNyZWF0ZUZhY3RvcnkocGxheWVyLCBtd0ZhY3RvcnkpO1xuXG4gICAgLy8gaWYgc2V0U291cmNlIGlzbid0IHByZXNlbnQsIGltcGxpY2l0bHkgc2VsZWN0IHRoaXMgbWlkZGxld2FyZVxuICAgIGlmICghbXcuc2V0U291cmNlKSB7XG4gICAgICBhY2MucHVzaChtdyk7XG4gICAgICByZXR1cm4gc2V0U291cmNlSGVscGVyKHNyYywgbXdyZXN0LCBuZXh0LCBwbGF5ZXIsIGFjYywgbGFzdFJ1bik7XG4gICAgfVxuXG4gICAgbXcuc2V0U291cmNlKGFzc2lnbih7fSwgc3JjKSwgZnVuY3Rpb24gKGVyciwgX3NyYykge1xuXG4gICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQsIHRyeSB0aGUgbmV4dCBtaWRkbGV3YXJlIG9uIHRoZSBjdXJyZW50IGxldmVsXG4gICAgICAvLyBtYWtlIHN1cmUgdG8gdXNlIHRoZSBvbGQgc3JjXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBzZXRTb3VyY2VIZWxwZXIoc3JjLCBtd3Jlc3QsIG5leHQsIHBsYXllciwgYWNjLCBsYXN0UnVuKTtcbiAgICAgIH1cblxuICAgICAgLy8gd2UndmUgc3VjY2VlZGVkLCBub3cgd2UgbmVlZCB0byBnbyBkZWVwZXJcbiAgICAgIGFjYy5wdXNoKG13KTtcblxuICAgICAgLy8gaWYgaXQncyB0aGUgc2FtZSB0eXBlLCBjb250aW51ZSBkb3duIHRoZSBjdXJyZW50IGNoYWluXG4gICAgICAvLyBvdGhlcndpc2UsIHdlIHdhbnQgdG8gZ28gZG93biB0aGUgbmV3IGNoYWluXG4gICAgICBzZXRTb3VyY2VIZWxwZXIoX3NyYywgc3JjLnR5cGUgPT09IF9zcmMudHlwZSA/IG13cmVzdCA6IG1pZGRsZXdhcmVzW19zcmMudHlwZV0sIG5leHQsIHBsYXllciwgYWNjLCBsYXN0UnVuKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChtd3Jlc3QubGVuZ3RoKSB7XG4gICAgc2V0U291cmNlSGVscGVyKHNyYywgbXdyZXN0LCBuZXh0LCBwbGF5ZXIsIGFjYywgbGFzdFJ1bik7XG4gIH0gZWxzZSBpZiAobGFzdFJ1bikge1xuICAgIG5leHQoc3JjLCBhY2MpO1xuICB9IGVsc2Uge1xuICAgIHNldFNvdXJjZUhlbHBlcihzcmMsIG1pZGRsZXdhcmVzWycqJ10sIG5leHQsIHBsYXllciwgYWNjLCB0cnVlKTtcbiAgfVxufVxuXG4vKipcbiAqIE1pbWV0eXBlc1xuICpcbiAqIEBzZWUgaHR0cDovL2h1bC5oYXJ2YXJkLmVkdS9vaXMvLy8vL3N5c3RlbXMvd2F4L3dheC1wdWJsaWMtaGVscC9taW1ldHlwZXMuaHRtXG4gKiBAdHlwZWRlZiBNaW1ldHlwZXN+S2luZFxuICogQGVudW1cbiAqL1xudmFyIE1pbWV0eXBlc0tpbmQgPSB7XG4gIG9wdXM6ICd2aWRlby9vZ2cnLFxuICBvZ3Y6ICd2aWRlby9vZ2cnLFxuICBtcDQ6ICd2aWRlby9tcDQnLFxuICBtb3Y6ICd2aWRlby9tcDQnLFxuICBtNHY6ICd2aWRlby9tcDQnLFxuICBta3Y6ICd2aWRlby94LW1hdHJvc2thJyxcbiAgbXAzOiAnYXVkaW8vbXBlZycsXG4gIGFhYzogJ2F1ZGlvL2FhYycsXG4gIG9nYTogJ2F1ZGlvL29nZycsXG4gIG0zdTg6ICdhcHBsaWNhdGlvbi94LW1wZWdVUkwnXG59O1xuXG4vKipcbiAqIEdldCB0aGUgbWltZXR5cGUgb2YgYSBnaXZlbiBzcmMgdXJsIGlmIHBvc3NpYmxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICogICAgICAgIFRoZSB1cmwgdG8gdGhlIHNyY1xuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgcmV0dXJuIHRoZSBtaW1ldHlwZSBpZiBpdCB3YXMga25vd24gb3IgZW1wdHkgc3RyaW5nIG90aGVyd2lzZVxuICovXG52YXIgZ2V0TWltZXR5cGUgPSBmdW5jdGlvbiBnZXRNaW1ldHlwZSgpIHtcbiAgdmFyIHNyYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG5cbiAgdmFyIGV4dCA9IGdldEZpbGVFeHRlbnNpb24oc3JjKTtcbiAgdmFyIG1pbWV0eXBlID0gTWltZXR5cGVzS2luZFtleHQudG9Mb3dlckNhc2UoKV07XG5cbiAgcmV0dXJuIG1pbWV0eXBlIHx8ICcnO1xufTtcblxuLyoqXG4gKiBGaW5kIHRoZSBtaW1lIHR5cGUgb2YgYSBnaXZlbiBzb3VyY2Ugc3RyaW5nIGlmIHBvc3NpYmxlLiBVc2VzIHRoZSBwbGF5ZXJcbiAqIHNvdXJjZSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gKiAgICAgICAgVGhlIHBsYXllciBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gKiAgICAgICAgVGhlIHNvdXJjZSBzdHJpbmdcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiAgICAgICAgIFRoZSB0eXBlIHRoYXQgd2FzIGZvdW5kXG4gKi9cbnZhciBmaW5kTWltZXR5cGUgPSBmdW5jdGlvbiBmaW5kTWltZXR5cGUocGxheWVyLCBzcmMpIHtcbiAgaWYgKCFzcmMpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvLyAxLiBjaGVjayBmb3IgdGhlIHR5cGUgaW4gdGhlIGBzb3VyY2VgIGNhY2hlXG4gIGlmIChwbGF5ZXIuY2FjaGVfLnNvdXJjZS5zcmMgPT09IHNyYyAmJiBwbGF5ZXIuY2FjaGVfLnNvdXJjZS50eXBlKSB7XG4gICAgcmV0dXJuIHBsYXllci5jYWNoZV8uc291cmNlLnR5cGU7XG4gIH1cblxuICAvLyAyLiBzZWUgaWYgd2UgaGF2ZSB0aGlzIHNvdXJjZSBpbiBvdXIgYGN1cnJlbnRTb3VyY2VzYCBjYWNoZVxuICB2YXIgbWF0Y2hpbmdTb3VyY2VzID0gcGxheWVyLmNhY2hlXy5zb3VyY2VzLmZpbHRlcihmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzLnNyYyA9PT0gc3JjO1xuICB9KTtcblxuICBpZiAobWF0Y2hpbmdTb3VyY2VzLmxlbmd0aCkge1xuICAgIHJldHVybiBtYXRjaGluZ1NvdXJjZXNbMF0udHlwZTtcbiAgfVxuXG4gIC8vIDMuIGxvb2sgZm9yIHRoZSBzcmMgdXJsIGluIHNvdXJjZSBlbGVtZW50cyBhbmQgdXNlIHRoZSB0eXBlIHRoZXJlXG4gIHZhciBzb3VyY2VzID0gcGxheWVyLiQkKCdzb3VyY2UnKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcyA9IHNvdXJjZXNbaV07XG5cbiAgICBpZiAocy50eXBlICYmIHMuc3JjICYmIHMuc3JjID09PSBzcmMpIHtcbiAgICAgIHJldHVybiBzLnR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gNC4gZmluYWxseSBmYWxsYmFjayB0byBvdXIgbGlzdCBvZiBtaW1lIHR5cGVzIGJhc2VkIG9uIHNyYyB1cmwgZXh0ZW5zaW9uXG4gIHJldHVybiBnZXRNaW1ldHlwZShzcmMpO1xufTtcblxuLyoqXG4gKiBAbW9kdWxlIGZpbHRlci1zb3VyY2VcbiAqL1xuLyoqXG4gKiBGaWx0ZXIgb3V0IHNpbmdsZSBiYWQgc291cmNlIG9iamVjdHMgb3IgbXVsdGlwbGUgc291cmNlIG9iamVjdHMgaW4gYW5cbiAqIGFycmF5LiBBbHNvIGZsYXR0ZW5zIG5lc3RlZCBzb3VyY2Ugb2JqZWN0IGFycmF5cyBpbnRvIGEgMSBkaW1lbnNpb25hbFxuICogYXJyYXkgb2Ygc291cmNlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdHxUZWNoflNvdXJjZU9iamVjdFtdfSBzcmNcbiAqICAgICAgICBUaGUgc3JjIG9iamVjdCB0byBmaWx0ZXJcbiAqXG4gKiBAcmV0dXJuIHtUZWNoflNvdXJjZU9iamVjdFtdfVxuICogICAgICAgICBBbiBhcnJheSBvZiBzb3VyY2VvYmplY3RzIGNvbnRhaW5pbmcgb25seSB2YWxpZCBzb3VyY2VzXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGZpbHRlclNvdXJjZSA9IGZ1bmN0aW9uIGZpbHRlclNvdXJjZShzcmMpIHtcbiAgLy8gdHJhdmVyc2UgYXJyYXlcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIHZhciBuZXdzcmMgPSBbXTtcblxuICAgIHNyYy5mb3JFYWNoKGZ1bmN0aW9uIChzcmNvYmopIHtcbiAgICAgIHNyY29iaiA9IGZpbHRlclNvdXJjZShzcmNvYmopO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzcmNvYmopKSB7XG4gICAgICAgIG5ld3NyYyA9IG5ld3NyYy5jb25jYXQoc3Jjb2JqKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3Jjb2JqKSkge1xuICAgICAgICBuZXdzcmMucHVzaChzcmNvYmopO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc3JjID0gbmV3c3JjO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzcmMgPT09ICdzdHJpbmcnICYmIHNyYy50cmltKCkpIHtcbiAgICAvLyBjb252ZXJ0IHN0cmluZyBpbnRvIG9iamVjdFxuICAgIHNyYyA9IFtmaXhTb3VyY2UoeyBzcmM6IHNyYyB9KV07XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSAmJiB0eXBlb2Ygc3JjLnNyYyA9PT0gJ3N0cmluZycgJiYgc3JjLnNyYyAmJiBzcmMuc3JjLnRyaW0oKSkge1xuICAgIC8vIHNyYyBpcyBhbHJlYWR5IHZhbGlkXG4gICAgc3JjID0gW2ZpeFNvdXJjZShzcmMpXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpbnZhbGlkIHNvdXJjZSwgdHVybiBpdCBpbnRvIGFuIGVtcHR5IGFycmF5XG4gICAgc3JjID0gW107XG4gIH1cblxuICByZXR1cm4gc3JjO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgc3JjIG1pbWV0eXBlLCBhZGRpbmcgaXQgd2hlbiBwb3NzaWJsZVxuICpcbiAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNyY1xuICogICAgICAgIFRoZSBzcmMgb2JqZWN0IHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtUZWNoflNvdXJjZU9iamVjdH1cbiAqICAgICAgICBzcmMgT2JqZWN0IHdpdGgga25vd24gdHlwZVxuICovXG5mdW5jdGlvbiBmaXhTb3VyY2Uoc3JjKSB7XG4gIHZhciBtaW1ldHlwZSA9IGdldE1pbWV0eXBlKHNyYy5zcmMpO1xuXG4gIGlmICghc3JjLnR5cGUgJiYgbWltZXR5cGUpIHtcbiAgICBzcmMudHlwZSA9IG1pbWV0eXBlO1xuICB9XG5cbiAgcmV0dXJuIHNyYztcbn1cblxuLyoqXG4gKiBAZmlsZSBsb2FkZXIuanNcbiAqL1xuLyoqXG4gKiBUaGUgYE1lZGlhTG9hZGVyYCBpcyB0aGUgYENvbXBvbmVudGAgdGhhdCBkZWNpZGVzIHdoaWNoIHBsYXliYWNrIHRlY2hub2xvZ3kgdG8gbG9hZFxuICogd2hlbiBhIHBsYXllciBpcyBpbml0aWFsaXplZC5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgTWVkaWFMb2FkZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhNZWRpYUxvYWRlciwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBhdHRhY2ggdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3Ryb2Ugb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV1cbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIHJ1biB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHJlYWR5LlxuICAgKi9cbiAgZnVuY3Rpb24gTWVkaWFMb2FkZXIocGxheWVyLCBvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1lZGlhTG9hZGVyKTtcblxuICAgIC8vIE1lZGlhTG9hZGVyIGhhcyBubyBlbGVtZW50XG4gICAgdmFyIG9wdGlvbnNfID0gbWVyZ2VPcHRpb25zKHsgY3JlYXRlRWw6IGZhbHNlIH0sIG9wdGlvbnMpO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIHNvdXJjZXMgd2hlbiB0aGUgcGxheWVyIGlzIGluaXRpYWxpemVkLFxuICAgIC8vIGxvYWQgdGhlIGZpcnN0IHN1cHBvcnRlZCBwbGF5YmFjayB0ZWNobm9sb2d5LlxuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zXywgcmVhZHkpKTtcblxuICAgIGlmICghb3B0aW9ucy5wbGF5ZXJPcHRpb25zLnNvdXJjZXMgfHwgb3B0aW9ucy5wbGF5ZXJPcHRpb25zLnNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaiA9IG9wdGlvbnMucGxheWVyT3B0aW9ucy50ZWNoT3JkZXI7IGkgPCBqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0ZWNoTmFtZSA9IHRvVGl0bGVDYXNlKGpbaV0pO1xuICAgICAgICB2YXIgdGVjaCA9IFRlY2guZ2V0VGVjaCh0ZWNoTmFtZSk7XG5cbiAgICAgICAgLy8gU3VwcG9ydCBvbGQgYmVoYXZpb3Igb2YgdGVjaHMgYmVpbmcgcmVnaXN0ZXJlZCBhcyBjb21wb25lbnRzLlxuICAgICAgICAvLyBSZW1vdmUgb25jZSB0aGF0IGRlcHJlY2F0ZWQgYmVoYXZpb3IgaXMgcmVtb3ZlZC5cbiAgICAgICAgaWYgKCF0ZWNoTmFtZSkge1xuICAgICAgICAgIHRlY2ggPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHRlY2hOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgdGVjaG5vbG9neVxuICAgICAgICBpZiAodGVjaCAmJiB0ZWNoLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICBwbGF5ZXIubG9hZFRlY2hfKHRlY2hOYW1lKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMb29wIHRocm91Z2ggcGxheWJhY2sgdGVjaG5vbG9naWVzIChIVE1MNSwgRmxhc2gpIGFuZCBjaGVjayBmb3Igc3VwcG9ydC5cbiAgICAgIC8vIFRoZW4gbG9hZCB0aGUgYmVzdCBzb3VyY2UuXG4gICAgICAvLyBBIGZldyBhc3N1bXB0aW9ucyBoZXJlOlxuICAgICAgLy8gICBBbGwgcGxheWJhY2sgdGVjaG5vbG9naWVzIHJlc3BlY3QgcHJlbG9hZCBmYWxzZS5cbiAgICAgIHBsYXllci5zcmMob3B0aW9ucy5wbGF5ZXJPcHRpb25zLnNvdXJjZXMpO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gTWVkaWFMb2FkZXI7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTWVkaWFMb2FkZXInLCBNZWRpYUxvYWRlcik7XG5cbi8qKlxuICogQGZpbGUgYnV0dG9uLmpzXG4gKi9cbi8qKlxuICogQ2xpY2thYmxlIENvbXBvbmVudCB3aGljaCBpcyBjbGlja2FibGUgb3Iga2V5Ym9hcmQgYWN0aW9uYWJsZSxcbiAqIGJ1dCBpcyBub3QgYSBuYXRpdmUgSFRNTCBidXR0b24uXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIENsaWNrYWJsZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKENsaWNrYWJsZUNvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtICB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gQ2xpY2thYmxlQ29tcG9uZW50KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENsaWNrYWJsZUNvbXBvbmVudCk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLmVtaXRUYXBFdmVudHMoKTtcblxuICAgIF90aGlzLmVuYWJsZSgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgcyBET00gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9ZGl2XVxuICAgKiAgICAgICAgVGhlIGVsZW1lbnQncyBub2RlIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHM9e31dXG4gICAqICAgICAgICBBbiBvYmplY3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBzZXQgb24gdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbYXR0cmlidXRlcz17fV1cbiAgICogICAgICAgIEFuIG9iamVjdCBvZiBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC5cbiAgICovXG5cblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgdmFyIHRhZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2Rpdic7XG4gICAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBwcm9wcyA9IGFzc2lnbih7XG4gICAgICBpbm5lckhUTUw6ICc8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cInZqcy1pY29uLXBsYWNlaG9sZGVyXCI+PC9zcGFuPicsXG4gICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpLFxuICAgICAgdGFiSW5kZXg6IDBcbiAgICB9LCBwcm9wcyk7XG5cbiAgICBpZiAodGFnID09PSAnYnV0dG9uJykge1xuICAgICAgbG9nJDEuZXJyb3IoJ0NyZWF0aW5nIGEgQ2xpY2thYmxlQ29tcG9uZW50IHdpdGggYW4gSFRNTCBlbGVtZW50IG9mICcgKyB0YWcgKyAnIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzZSBhIEJ1dHRvbiBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIC8vIEFkZCBBUklBIGF0dHJpYnV0ZXMgZm9yIGNsaWNrYWJsZSBlbGVtZW50IHdoaWNoIGlzIG5vdCBhIG5hdGl2ZSBIVE1MIGJ1dHRvblxuICAgIGF0dHJpYnV0ZXMgPSBhc3NpZ24oe1xuICAgICAgcm9sZTogJ2J1dHRvbidcbiAgICB9LCBhdHRyaWJ1dGVzKTtcblxuICAgIHRoaXMudGFiSW5kZXhfID0gcHJvcHMudGFiSW5kZXg7XG5cbiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsIHRhZywgcHJvcHMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgdGhpcy5jcmVhdGVDb250cm9sVGV4dEVsKGVsKTtcblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIC8vIHJlbW92ZSBjb250cm9sVGV4dEVsXyBvbiBkaXBvc2VcbiAgICB0aGlzLmNvbnRyb2xUZXh0RWxfID0gbnVsbDtcblxuICAgIF9Db21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgY29udHJvbCB0ZXh0IGVsZW1lbnQgb24gdGhpcyBgQ29tcG9uZW50YFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbF1cbiAgICogICAgICAgIFBhcmVudCBlbGVtZW50IGZvciB0aGUgY29udHJvbCB0ZXh0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBjb250cm9sIHRleHQgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC5cbiAgICovXG5cblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUNvbnRyb2xUZXh0RWwgPSBmdW5jdGlvbiBjcmVhdGVDb250cm9sVGV4dEVsKGVsKSB7XG4gICAgdGhpcy5jb250cm9sVGV4dEVsXyA9IGNyZWF0ZUVsKCdzcGFuJywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLWNvbnRyb2wtdGV4dCdcbiAgICB9LCB7XG4gICAgICAvLyBsZXQgdGhlIHNjcmVlbiByZWFkZXIgdXNlciBrbm93IHRoYXQgdGhlIHRleHQgb2YgdGhlIGVsZW1lbnQgbWF5IGNoYW5nZVxuICAgICAgJ2FyaWEtbGl2ZSc6ICdwb2xpdGUnXG4gICAgfSk7XG5cbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLmFwcGVuZENoaWxkKHRoaXMuY29udHJvbFRleHRFbF8pO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJvbFRleHQodGhpcy5jb250cm9sVGV4dF8sIGVsKTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xUZXh0RWxfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBsb2NhbGl6ZSB0ZXh0IHRvIHVzZSBmb3IgdGhlIGNvbnRyb2xzIG9uIHRoZSBgQ29tcG9uZW50YC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XVxuICAgKiAgICAgICAgQ29udHJvbCB0ZXh0IGZvciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbD10aGlzLmVsKCldXG4gICAqICAgICAgICBFbGVtZW50IHRvIHNldCB0aGUgdGl0bGUgb24uXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICAtIFRoZSBjb250cm9sIHRleHQgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5jb250cm9sVGV4dCA9IGZ1bmN0aW9uIGNvbnRyb2xUZXh0KHRleHQpIHtcbiAgICB2YXIgZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRoaXMuZWwoKTtcblxuICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xUZXh0XyB8fCAnTmVlZCBUZXh0JztcbiAgICB9XG5cbiAgICB2YXIgbG9jYWxpemVkVGV4dCA9IHRoaXMubG9jYWxpemUodGV4dCk7XG5cbiAgICB0aGlzLmNvbnRyb2xUZXh0XyA9IHRleHQ7XG4gICAgdGV4dENvbnRlbnQodGhpcy5jb250cm9sVGV4dEVsXywgbG9jYWxpemVkVGV4dCk7XG4gICAgaWYgKCF0aGlzLm5vbkljb25Db250cm9sKSB7XG4gICAgICAvLyBTZXQgdGl0bGUgYXR0cmlidXRlIGlmIG9ubHkgYW4gaWNvbiBpcyBzaG93blxuICAgICAgZWwuc2V0QXR0cmlidXRlKCd0aXRsZScsIGxvY2FsaXplZFRleHQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIENsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY29udHJvbCB2anMtYnV0dG9uICcgKyBfQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0aGlzIGBDb21wb25lbnRgcyBlbGVtZW50LlxuICAgKi9cblxuXG4gIENsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkXykge1xuICAgICAgdGhpcy5lbmFibGVkXyA9IHRydWU7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZGlzYWJsZWQnKTtcbiAgICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICdmYWxzZScpO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLnRhYkluZGV4XyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsIHRoaXMudGFiSW5kZXhfKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub24oWyd0YXAnLCAnY2xpY2snXSwgdGhpcy5oYW5kbGVDbGljayk7XG4gICAgICB0aGlzLm9uKCdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMpO1xuICAgICAgdGhpcy5vbignYmx1cicsIHRoaXMuaGFuZGxlQmx1cik7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoaXMgYENvbXBvbmVudGBzIGVsZW1lbnQuXG4gICAqL1xuXG5cbiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICB0aGlzLmVuYWJsZWRfID0gZmFsc2U7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWRpc2FibGVkJyk7XG4gICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcbiAgICBpZiAodHlwZW9mIHRoaXMudGFiSW5kZXhfICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5lbF8ucmVtb3ZlQXR0cmlidXRlKCd0YWJJbmRleCcpO1xuICAgIH1cbiAgICB0aGlzLm9mZihbJ3RhcCcsICdjbGljayddLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICB0aGlzLm9mZignZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzKTtcbiAgICB0aGlzLm9mZignYmx1cicsIHRoaXMuaGFuZGxlQmx1cik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGBDbGlja2FibGVDb21wb25lbnRgIGdldHM6XG4gICAqIC0gQ2xpY2tlZCAodmlhIHRoZSBgY2xpY2tgIGV2ZW50LCBsaXN0ZW5pbmcgc3RhcnRzIGluIHRoZSBjb25zdHJ1Y3RvcilcbiAgICogLSBUYXBwZWQgKHZpYSB0aGUgYHRhcGAgZXZlbnQsIGxpc3RlbmluZyBzdGFydHMgaW4gdGhlIGNvbnN0cnVjdG9yKVxuICAgKiAtIFRoZSBmb2xsb3dpbmcgdGhpbmdzIGhhcHBlbiBpbiBvcmRlcjpcbiAgICogICAxLiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUZvY3VzfSBpcyBjYWxsZWQgdmlhIGEgYGZvY3VzYCBldmVudCBvbiB0aGVcbiAgICogICAgICBgQ2xpY2thYmxlQ29tcG9uZW50YC5cbiAgICogICAyLiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUZvY3VzfSBhZGRzIGEgbGlzdGVuZXIgZm9yIGBrZXlkb3duYCBvbiB1c2luZ1xuICAgKiAgICAgIHtAbGluayBDbGlja2FibGVDb21wb25lbnQjaGFuZGxlS2V5UHJlc3N9LlxuICAgKiAgIDMuIGBDbGlja2FibGVDb21wb25lbnRgIGhhcyBub3QgaGFkIGEgYGJsdXJgIGV2ZW50IChgYmx1cmAgbWVhbnMgdGhhdCBmb2N1cyB3YXMgbG9zdCkuIFRoZSB1c2VyIHByZXNzZXNcbiAgICogICAgICB0aGUgc3BhY2Ugb3IgZW50ZXIga2V5LlxuICAgKiAgIDQuIHtAbGluayBDbGlja2FibGVDb21wb25lbnQjaGFuZGxlS2V5UHJlc3N9IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgYGtleWRvd25gXG4gICAqICAgICAgZXZlbnQgYXMgYSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlXG4gICAqICAgICAgICBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHt9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBgQ2xpY2thYmxlQ29tcG9uZW50YCBnYWlucyBmb2N1cyB2aWEgYSBgZm9jdXNgIGV2ZW50LlxuICAgKiBUdXJucyBvbiBsaXN0ZW5pbmcgZm9yIGBrZXlkb3duYCBldmVudHMuIFdoZW4gdGhleSBoYXBwZW4gaXRcbiAgICogY2FsbHMgYHRoaXMuaGFuZGxlS2V5UHJlc3NgLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBmb2N1c2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGZvY3VzXG4gICAqL1xuXG5cbiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5oYW5kbGVGb2N1cyA9IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKGV2ZW50KSB7XG4gICAgb24oZG9jdW1lbnQsICdrZXlkb3duJywgYmluZCh0aGlzLCB0aGlzLmhhbmRsZUtleVByZXNzKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoaXMgQ2xpY2thYmxlQ29tcG9uZW50IGhhcyBmb2N1cyBhbmQgYSBrZXkgZ2V0cyBwcmVzc2VkIGRvd24uIEJ5XG4gICAqIGRlZmF1bHQgaXQgd2lsbCBjYWxsIGB0aGlzLmhhbmRsZUNsaWNrYCB3aGVuIHRoZSBrZXkgaXMgc3BhY2Ugb3IgZW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqL1xuXG5cbiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7XG5cbiAgICAvLyBTdXBwb3J0IFNwYWNlICgzMikgb3IgRW50ZXIgKDEzKSBrZXkgb3BlcmF0aW9uIHRvIGZpcmUgYSBjbGljayBldmVudFxuICAgIGlmIChldmVudC53aGljaCA9PT0gMzIgfHwgZXZlbnQud2hpY2ggPT09IDEzKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy50cmlnZ2VyKCdjbGljaycpO1xuICAgIH0gZWxzZSBpZiAoX0NvbXBvbmVudC5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MpIHtcblxuICAgICAgLy8gUGFzcyBrZXlwcmVzcyBoYW5kbGluZyB1cCBmb3IgdW5zdXBwb3J0ZWQga2V5c1xuICAgICAgX0NvbXBvbmVudC5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIGBDbGlja2FibGVDb21wb25lbnRgIGxvc2VzIGZvY3VzLiBUdXJucyBvZmYgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBga2V5ZG93bmAgZXZlbnRzLiBXaGljaCBTdG9wcyBgdGhpcy5oYW5kbGVLZXlQcmVzc2AgZnJvbSBnZXR0aW5nIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgYmx1cmAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGJsdXJcbiAgICovXG5cblxuICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgb2ZmKGRvY3VtZW50LCAna2V5ZG93bicsIGJpbmQodGhpcywgdGhpcy5oYW5kbGVLZXlQcmVzcykpO1xuICB9O1xuXG4gIHJldHVybiBDbGlja2FibGVDb21wb25lbnQ7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ2xpY2thYmxlQ29tcG9uZW50JywgQ2xpY2thYmxlQ29tcG9uZW50KTtcblxuLyoqXG4gKiBAZmlsZSBwb3N0ZXItaW1hZ2UuanNcbiAqL1xuLyoqXG4gKiBBIGBDbGlja2FibGVDb21wb25lbnRgIHRoYXQgaGFuZGxlcyBzaG93aW5nIHRoZSBwb3N0ZXIgaW1hZ2UgZm9yIHRoZSBwbGF5ZXIuXG4gKlxuICogQGV4dGVuZHMgQ2xpY2thYmxlQ29tcG9uZW50XG4gKi9cblxudmFyIFBvc3RlckltYWdlID0gZnVuY3Rpb24gKF9DbGlja2FibGVDb21wb25lbnQpIHtcbiAgaW5oZXJpdHMoUG9zdGVySW1hZ2UsIF9DbGlja2FibGVDb21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYXR0YWNoIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gUG9zdGVySW1hZ2UocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zdGVySW1hZ2UpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ2xpY2thYmxlQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy51cGRhdGUoKTtcbiAgICBwbGF5ZXIub24oJ3Bvc3RlcmNoYW5nZScsIGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZSkpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBhbmQgZGlzcG9zZSBvZiB0aGUgYFBvc3RlckltYWdlYC5cbiAgICovXG5cblxuICBQb3N0ZXJJbWFnZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5wbGF5ZXIoKS5vZmYoJ3Bvc3RlcmNoYW5nZScsIHRoaXMudXBkYXRlKTtcbiAgICBfQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYFBvc3RlckltYWdlYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgUG9zdGVySW1hZ2UucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgdmFyIGVsID0gY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1wb3N0ZXInLFxuXG4gICAgICAvLyBEb24ndCB3YW50IHBvc3RlciB0byBiZSB0YWJiYWJsZS5cbiAgICAgIHRhYkluZGV4OiAtMVxuICAgIH0pO1xuXG4gICAgLy8gVG8gZW5zdXJlIHRoZSBwb3N0ZXIgaW1hZ2UgcmVzaXplcyB3aGlsZSBtYWludGFpbmluZyBpdHMgb3JpZ2luYWwgYXNwZWN0XG4gICAgLy8gcmF0aW8sIHVzZSBhIGRpdiB3aXRoIGBiYWNrZ3JvdW5kLXNpemVgIHdoZW4gYXZhaWxhYmxlLiBGb3IgYnJvd3NlcnMgdGhhdFxuICAgIC8vIGRvIG5vdCBzdXBwb3J0IGBiYWNrZ3JvdW5kLXNpemVgIChlLmcuIElFOCksIGZhbGwgYmFjayBvbiB1c2luZyBhIHJlZ3VsYXJcbiAgICAvLyBpbWcgZWxlbWVudC5cbiAgICBpZiAoIUJBQ0tHUk9VTkRfU0laRV9TVVBQT1JURUQpIHtcbiAgICAgIHRoaXMuZmFsbGJhY2tJbWdfID0gY3JlYXRlRWwoJ2ltZycpO1xuICAgICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5mYWxsYmFja0ltZ18pO1xuICAgIH1cblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICAvKipcbiAgICogQW4ge0BsaW5rIEV2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJ9IGZvciB7QGxpbmsgUGxheWVyI3Bvc3RlcmNoYW5nZX0gZXZlbnRzLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjcG9zdGVyY2hhbmdlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgUGxheWVyI3Bvc3RlcmNoYW5nZWAgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvbi5cbiAgICovXG5cblxuICBQb3N0ZXJJbWFnZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKGV2ZW50KSB7XG4gICAgdmFyIHVybCA9IHRoaXMucGxheWVyKCkucG9zdGVyKCk7XG5cbiAgICB0aGlzLnNldFNyYyh1cmwpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBwb3N0ZXIgc291cmNlIHdlIHNob3VsZCBkaXNwbGF5Om5vbmUgb24gdGhpcyBjb21wb25lbnRcbiAgICAvLyBzbyBpdCdzIG5vdCBzdGlsbCBjbGlja2FibGUgb3IgcmlnaHQtY2xpY2thYmxlXG4gICAgaWYgKHVybCkge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGBQb3N0ZXJJbWFnZWAgZGVwZW5kaW5nIG9uIHRoZSBkaXNwbGF5IG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiAgICAgICAgVGhlIFVSTCB0byB0aGUgc291cmNlIGZvciB0aGUgYFBvc3RlckltYWdlYC5cbiAgICovXG5cblxuICBQb3N0ZXJJbWFnZS5wcm90b3R5cGUuc2V0U3JjID0gZnVuY3Rpb24gc2V0U3JjKHVybCkge1xuICAgIGlmICh0aGlzLmZhbGxiYWNrSW1nXykge1xuICAgICAgdGhpcy5mYWxsYmFja0ltZ18uc3JjID0gdXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYmFja2dyb3VuZEltYWdlID0gJyc7XG5cbiAgICAgIC8vIEFueSBmYWxzZXkgdmFsdWVzIHNob3VsZCBzdGF5IGFzIGFuIGVtcHR5IHN0cmluZywgb3RoZXJ3aXNlXG4gICAgICAvLyB0aGlzIHdpbGwgdGhyb3cgYW4gZXh0cmEgZXJyb3JcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlID0gJ3VybChcIicgKyB1cmwgKyAnXCIpJztcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbF8uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYmFja2dyb3VuZEltYWdlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQW4ge0BsaW5rIEV2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJ9IGZvciBjbGlja3Mgb24gdGhlIGBQb3N0ZXJJbWFnZWAuIFNlZVxuICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUNsaWNrfSBmb3IgaW5zdGFuY2VzIHdoZXJlIHRoaXMgd2lsbCBiZSB0cmlnZ2VyZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICArICAgICAgICBUaGUgYGNsaWNrYCwgYHRhcGAgb3IgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxuICAgKi9cblxuXG4gIFBvc3RlckltYWdlLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgLy8gV2UgZG9uJ3Qgd2FudCBhIGNsaWNrIHRvIHRyaWdnZXIgcGxheWJhY2sgd2hlbiBjb250cm9scyBhcmUgZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMucGxheWVyXy5jb250cm9scygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGxheWVyXy5wYXVzZWQoKSkge1xuICAgICAgc2lsZW5jZVByb21pc2UodGhpcy5wbGF5ZXJfLnBsYXkoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyXy5wYXVzZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUG9zdGVySW1hZ2U7XG59KENsaWNrYWJsZUNvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUG9zdGVySW1hZ2UnLCBQb3N0ZXJJbWFnZSk7XG5cbi8qKlxuICogQGZpbGUgdGV4dC10cmFjay1kaXNwbGF5LmpzXG4gKi9cbnZhciBkYXJrR3JheSA9ICcjMjIyJztcbnZhciBsaWdodEdyYXkgPSAnI2NjYyc7XG52YXIgZm9udE1hcCA9IHtcbiAgbW9ub3NwYWNlOiAnbW9ub3NwYWNlJyxcbiAgc2Fuc1NlcmlmOiAnc2Fucy1zZXJpZicsXG4gIHNlcmlmOiAnc2VyaWYnLFxuICBtb25vc3BhY2VTYW5zU2VyaWY6ICdcIkFuZGFsZSBNb25vXCIsIFwiTHVjaWRhIENvbnNvbGVcIiwgbW9ub3NwYWNlJyxcbiAgbW9ub3NwYWNlU2VyaWY6ICdcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gIHByb3BvcnRpb25hbFNhbnNTZXJpZjogJ3NhbnMtc2VyaWYnLFxuICBwcm9wb3J0aW9uYWxTZXJpZjogJ3NlcmlmJyxcbiAgY2FzdWFsOiAnXCJDb21pYyBTYW5zIE1TXCIsIEltcGFjdCwgZmFudGFzeScsXG4gIHNjcmlwdDogJ1wiTW9ub3R5cGUgQ29yc2l2YVwiLCBjdXJzaXZlJyxcbiAgc21hbGxjYXBzOiAnXCJBbmRhbGUgTW9ub1wiLCBcIkx1Y2lkYSBDb25zb2xlXCIsIG1vbm9zcGFjZSwgc2Fucy1zZXJpZidcbn07XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIHJnYmEgY29sb3IgZnJvbSBhIGdpdmVuIGhleCBjb2xvciBjb2RlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2xvclxuICogICAgICAgIEhleCBudW1iZXIgZm9yIGNvbG9yLCBsaWtlICNmMGUgb3IgI2Y2MDRlMi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gb3BhY2l0eVxuICogICAgICAgIFZhbHVlIGZvciBvcGFjaXR5LCAwLjAgLSAxLjAuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICogICAgICAgICBUaGUgcmdiYSBjb2xvciB0aGF0IHdhcyBjcmVhdGVkLCBsaWtlICdyZ2JhKDI1NSwgMCwgMCwgMC4zKScuXG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdENvbG9yKGNvbG9yLCBvcGFjaXR5KSB7XG4gIHZhciBoZXggPSB2b2lkIDA7XG5cbiAgaWYgKGNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgIC8vIGNvbG9yIGxvb2tzIGxpa2UgXCIjZjBlXCJcbiAgICBoZXggPSBjb2xvclsxXSArIGNvbG9yWzFdICsgY29sb3JbMl0gKyBjb2xvclsyXSArIGNvbG9yWzNdICsgY29sb3JbM107XG4gIH0gZWxzZSBpZiAoY29sb3IubGVuZ3RoID09PSA3KSB7XG4gICAgLy8gY29sb3IgbG9va3MgbGlrZSBcIiNmNjA0ZTJcIlxuICAgIGhleCA9IGNvbG9yLnNsaWNlKDEpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2xvciBjb2RlIHByb3ZpZGVkLCAnICsgY29sb3IgKyAnOyBtdXN0IGJlIGZvcm1hdHRlZCBhcyBlLmcuICNmMGUgb3IgI2Y2MDRlMi4nKTtcbiAgfVxuICByZXR1cm4gJ3JnYmEoJyArIHBhcnNlSW50KGhleC5zbGljZSgwLCAyKSwgMTYpICsgJywnICsgcGFyc2VJbnQoaGV4LnNsaWNlKDIsIDQpLCAxNikgKyAnLCcgKyBwYXJzZUludChoZXguc2xpY2UoNCwgNiksIDE2KSArICcsJyArIG9wYWNpdHkgKyAnKSc7XG59XG5cbi8qKlxuICogVHJ5IHRvIHVwZGF0ZSB0aGUgc3R5bGUgb2YgYSBET00gZWxlbWVudC4gU29tZSBzdHlsZSBjaGFuZ2VzIHdpbGwgdGhyb3cgYW4gZXJyb3IsXG4gKiBwYXJ0aWN1bGFybHkgaW4gSUU4LiBUaG9zZSBzaG91bGQgYmUgbm9vcHMuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIFRoZSBET00gZWxlbWVudCB0byBiZSBzdHlsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlXG4gKiAgICAgICAgVGhlIENTUyBwcm9wZXJ0eSBvbiB0aGUgZWxlbWVudCB0aGF0IHNob3VsZCBiZSBzdHlsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bGVcbiAqICAgICAgICBUaGUgc3R5bGUgcnVsZSB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBwcm9wZXJ0eS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0cnlVcGRhdGVTdHlsZShlbCwgc3R5bGUsIHJ1bGUpIHtcbiAgdHJ5IHtcbiAgICBlbC5zdHlsZVtzdHlsZV0gPSBydWxlO1xuICB9IGNhdGNoIChlKSB7XG5cbiAgICAvLyBTYXRpc2ZpZXMgbGludGVyLlxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBjb21wb25lbnQgZm9yIGRpc3BsYXlpbmcgdGV4dCB0cmFjayBjdWVzLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBUZXh0VHJhY2tEaXNwbGF5ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoVGV4dFRyYWNrRGlzcGxheSwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV1cbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYFRleHRUcmFja0Rpc3BsYXlgIGlzIHJlYWR5LlxuICAgKi9cbiAgZnVuY3Rpb24gVGV4dFRyYWNrRGlzcGxheShwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dFRyYWNrRGlzcGxheSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSk7XG5cbiAgICBwbGF5ZXIub24oJ2xvYWRzdGFydCcsIGJpbmQoX3RoaXMsIF90aGlzLnRvZ2dsZURpc3BsYXkpKTtcbiAgICBwbGF5ZXIub24oJ3RleHR0cmFja2NoYW5nZScsIGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZURpc3BsYXkpKTtcbiAgICBwbGF5ZXIub24oJ2xvYWRzdGFydCcsIGJpbmQoX3RoaXMsIF90aGlzLnByZXNlbGVjdFRyYWNrKSk7XG5cbiAgICAvLyBUaGlzIHVzZWQgdG8gYmUgY2FsbGVkIGR1cmluZyBwbGF5ZXIgaW5pdCwgYnV0IHdhcyBjYXVzaW5nIGFuIGVycm9yXG4gICAgLy8gaWYgYSB0cmFjayBzaG91bGQgc2hvdyBieSBkZWZhdWx0IGFuZCB0aGUgZGlzcGxheSBoYWRuJ3QgbG9hZGVkIHlldC5cbiAgICAvLyBTaG91bGQgcHJvYmFibHkgYmUgbW92ZWQgdG8gYW4gZXh0ZXJuYWwgdHJhY2sgbG9hZGVyIHdoZW4gd2Ugc3VwcG9ydFxuICAgIC8vIHRyYWNrcyB0aGF0IGRvbid0IG5lZWQgYSBkaXNwbGF5LlxuICAgIHBsYXllci5yZWFkeShiaW5kKF90aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocGxheWVyLnRlY2hfICYmIHBsYXllci50ZWNoXy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGxheWVyLm9uKCdmdWxsc2NyZWVuY2hhbmdlJywgYmluZCh0aGlzLCB0aGlzLnVwZGF0ZURpc3BsYXkpKTtcblxuICAgICAgdmFyIHRyYWNrcyA9IHRoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucy50cmFja3MgfHwgW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucGxheWVyXy5hZGRSZW1vdGVUZXh0VHJhY2sodHJhY2tzW2ldLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmVzZWxlY3RUcmFjaygpO1xuICAgIH0pKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgKiBQcmVzZWxlY3QgYSB0cmFjayBmb2xsb3dpbmcgdGhpcyBwcmVjZWRlbmNlOlxuICAqIC0gbWF0Y2hlcyB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCB7QGxpbmsgVGV4dFRyYWNrfSdzIGxhbmd1YWdlIGFuZCBraW5kXG4gICogLSBtYXRjaGVzIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHtAbGluayBUZXh0VHJhY2t9J3MgbGFuZ3VhZ2Ugb25seVxuICAqIC0gaXMgdGhlIGZpcnN0IGRlZmF1bHQgY2FwdGlvbnMgdHJhY2tcbiAgKiAtIGlzIHRoZSBmaXJzdCBkZWZhdWx0IGRlc2NyaXB0aW9ucyB0cmFja1xuICAqXG4gICogQGxpc3RlbnMgUGxheWVyI2xvYWRzdGFydFxuICAqL1xuXG5cbiAgVGV4dFRyYWNrRGlzcGxheS5wcm90b3R5cGUucHJlc2VsZWN0VHJhY2sgPSBmdW5jdGlvbiBwcmVzZWxlY3RUcmFjaygpIHtcbiAgICB2YXIgbW9kZXMgPSB7IGNhcHRpb25zOiAxLCBzdWJ0aXRsZXM6IDEgfTtcbiAgICB2YXIgdHJhY2tMaXN0ID0gdGhpcy5wbGF5ZXJfLnRleHRUcmFja3MoKTtcbiAgICB2YXIgdXNlclByZWYgPSB0aGlzLnBsYXllcl8uY2FjaGVfLnNlbGVjdGVkTGFuZ3VhZ2U7XG4gICAgdmFyIGZpcnN0RGVzYyA9IHZvaWQgMDtcbiAgICB2YXIgZmlyc3RDYXB0aW9ucyA9IHZvaWQgMDtcbiAgICB2YXIgcHJlZmVycmVkVHJhY2sgPSB2b2lkIDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRyYWNrID0gdHJhY2tMaXN0W2ldO1xuXG4gICAgICBpZiAodXNlclByZWYgJiYgdXNlclByZWYuZW5hYmxlZCAmJiB1c2VyUHJlZi5sYW5ndWFnZSA9PT0gdHJhY2subGFuZ3VhZ2UpIHtcbiAgICAgICAgLy8gQWx3YXlzIGNob29zZSB0aGUgdHJhY2sgdGhhdCBtYXRjaGVzIGJvdGggbGFuZ3VhZ2UgYW5kIGtpbmRcbiAgICAgICAgaWYgKHRyYWNrLmtpbmQgPT09IHVzZXJQcmVmLmtpbmQpIHtcbiAgICAgICAgICBwcmVmZXJyZWRUcmFjayA9IHRyYWNrO1xuICAgICAgICAgIC8vIG9yIGNob29zZSB0aGUgZmlyc3QgdHJhY2sgdGhhdCBtYXRjaGVzIGxhbmd1YWdlXG4gICAgICAgIH0gZWxzZSBpZiAoIXByZWZlcnJlZFRyYWNrKSB7XG4gICAgICAgICAgcHJlZmVycmVkVHJhY2sgPSB0cmFjaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIGV2ZXJ5dGhpbmcgaWYgb2ZmVGV4dFRyYWNrTWVudUl0ZW0gd2FzIGNsaWNrZWRcbiAgICAgIH0gZWxzZSBpZiAodXNlclByZWYgJiYgIXVzZXJQcmVmLmVuYWJsZWQpIHtcbiAgICAgICAgcHJlZmVycmVkVHJhY2sgPSBudWxsO1xuICAgICAgICBmaXJzdERlc2MgPSBudWxsO1xuICAgICAgICBmaXJzdENhcHRpb25zID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodHJhY2tbJ2RlZmF1bHQnXSkge1xuICAgICAgICBpZiAodHJhY2sua2luZCA9PT0gJ2Rlc2NyaXB0aW9ucycgJiYgIWZpcnN0RGVzYykge1xuICAgICAgICAgIGZpcnN0RGVzYyA9IHRyYWNrO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLmtpbmQgaW4gbW9kZXMgJiYgIWZpcnN0Q2FwdGlvbnMpIHtcbiAgICAgICAgICBmaXJzdENhcHRpb25zID0gdHJhY2s7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcHJlZmVycmVkVHJhY2sgbWF0Y2hlcyB0aGUgdXNlciBwcmVmZXJlbmNlIGFuZCB0YWtlc1xuICAgIC8vIHByZWNlbmRlbmNlIG92ZXIgYWxsIHRoZSBvdGhlciB0cmFja3MuXG4gICAgLy8gU28sIGRpc3BsYXkgdGhlIHByZWZlcnJlZFRyYWNrIGJlZm9yZSB0aGUgZmlyc3QgZGVmYXVsdCB0cmFja1xuICAgIC8vIGFuZCB0aGUgc3VidGl0bGVzL2NhcHRpb25zIHRyYWNrIGJlZm9yZSB0aGUgZGVzY3JpcHRpb25zIHRyYWNrXG4gICAgaWYgKHByZWZlcnJlZFRyYWNrKSB7XG4gICAgICBwcmVmZXJyZWRUcmFjay5tb2RlID0gJ3Nob3dpbmcnO1xuICAgIH0gZWxzZSBpZiAoZmlyc3RDYXB0aW9ucykge1xuICAgICAgZmlyc3RDYXB0aW9ucy5tb2RlID0gJ3Nob3dpbmcnO1xuICAgIH0gZWxzZSBpZiAoZmlyc3REZXNjKSB7XG4gICAgICBmaXJzdERlc2MubW9kZSA9ICdzaG93aW5nJztcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFR1cm4gZGlzcGxheSBvZiB7QGxpbmsgVGV4dFRyYWNrfSdzIGZyb20gdGhlIGN1cnJlbnQgc3RhdGUgaW50byB0aGUgb3RoZXIgc3RhdGUuXG4gICAqIFRoZXJlIGFyZSBvbmx5IHR3byBzdGF0ZXM6XG4gICAqIC0gJ3Nob3duJ1xuICAgKiAtICdoaWRkZW4nXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciNsb2Fkc3RhcnRcbiAgICovXG5cblxuICBUZXh0VHJhY2tEaXNwbGF5LnByb3RvdHlwZS50b2dnbGVEaXNwbGF5ID0gZnVuY3Rpb24gdG9nZ2xlRGlzcGxheSgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXJfLnRlY2hfICYmIHRoaXMucGxheWVyXy50ZWNoXy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUge0BsaW5rIENvbXBvbmVudH0ncyBET00gZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFRleHRUcmFja0Rpc3BsYXkucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy10ZXh0LXRyYWNrLWRpc3BsYXknXG4gICAgfSwge1xuICAgICAgJ2FyaWEtbGl2ZSc6ICdvZmYnLFxuICAgICAgJ2FyaWEtYXRvbWljJzogJ3RydWUnXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBkaXNwbGF5ZWQge0BsaW5rIFRleHRUcmFja31zLlxuICAgKi9cblxuXG4gIFRleHRUcmFja0Rpc3BsYXkucHJvdG90eXBlLmNsZWFyRGlzcGxheSA9IGZ1bmN0aW9uIGNsZWFyRGlzcGxheSgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5XZWJWVFQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdpbmRvdy5XZWJWVFQucHJvY2Vzc0N1ZXMod2luZG93LCBbXSwgdGhpcy5lbF8pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBkaXNwbGF5ZWQgVGV4dFRyYWNrIHdoZW4gYSBlaXRoZXIgYSB7QGxpbmsgUGxheWVyI3RleHR0cmFja2NoYW5nZX0gb3JcbiAgICogYSB7QGxpbmsgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2V9IGlzIGZpcmVkLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjdGV4dHRyYWNrY2hhbmdlXG4gICAqIEBsaXN0ZW5zIFBsYXllciNmdWxsc2NyZWVuY2hhbmdlXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrRGlzcGxheS5wcm90b3R5cGUudXBkYXRlRGlzcGxheSA9IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXkoKSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyXy50ZXh0VHJhY2tzKCk7XG5cbiAgICB0aGlzLmNsZWFyRGlzcGxheSgpO1xuXG4gICAgLy8gVHJhY2sgZGlzcGxheSBwcmlvcml0aXphdGlvbiBtb2RlbDogaWYgbXVsdGlwbGUgdHJhY2tzIGFyZSAnc2hvd2luZycsXG4gICAgLy8gIGRpc3BsYXkgdGhlIGZpcnN0ICdzdWJ0aXRsZXMnIG9yICdjYXB0aW9ucycgdHJhY2sgd2hpY2ggaXMgJ3Nob3dpbmcnLFxuICAgIC8vICBvdGhlcndpc2UgZGlzcGxheSB0aGUgZmlyc3QgJ2Rlc2NyaXB0aW9ucycgdHJhY2sgd2hpY2ggaXMgJ3Nob3dpbmcnXG5cbiAgICB2YXIgZGVzY3JpcHRpb25zVHJhY2sgPSBudWxsO1xuICAgIHZhciBjYXB0aW9uc1N1YnRpdGxlc1RyYWNrID0gbnVsbDtcbiAgICB2YXIgaSA9IHRyYWNrcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIGlmICh0cmFjay5tb2RlID09PSAnc2hvd2luZycpIHtcbiAgICAgICAgaWYgKHRyYWNrLmtpbmQgPT09ICdkZXNjcmlwdGlvbnMnKSB7XG4gICAgICAgICAgZGVzY3JpcHRpb25zVHJhY2sgPSB0cmFjaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYXB0aW9uc1N1YnRpdGxlc1RyYWNrID0gdHJhY2s7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2FwdGlvbnNTdWJ0aXRsZXNUcmFjaykge1xuICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnKSAhPT0gJ29mZicpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdvZmYnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRm9yVHJhY2soY2FwdGlvbnNTdWJ0aXRsZXNUcmFjayk7XG4gICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbnNUcmFjaykge1xuICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnKSAhPT0gJ2Fzc2VydGl2ZScpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdhc3NlcnRpdmUnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRm9yVHJhY2soZGVzY3JpcHRpb25zVHJhY2spO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkIGFuIHtAbGluayBUZXh0dHJhY2t9IHRvIHRvIHRoZSB7QGxpbmsgVGVjaH1zIHtAbGluayBUZXh0VHJhY2tMaXN0fS5cbiAgICpcbiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gICAqICAgICAgICBUZXh0IHRyYWNrIG9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbGlzdC5cbiAgICovXG5cblxuICBUZXh0VHJhY2tEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVGb3JUcmFjayA9IGZ1bmN0aW9uIHVwZGF0ZUZvclRyYWNrKHRyYWNrKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuV2ViVlRUICE9PSAnZnVuY3Rpb24nIHx8ICF0cmFjay5hY3RpdmVDdWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGN1ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0cmFjay5hY3RpdmVDdWVzLmxlbmd0aDsgX2krKykge1xuICAgICAgY3Vlcy5wdXNoKHRyYWNrLmFjdGl2ZUN1ZXNbX2ldKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuV2ViVlRULnByb2Nlc3NDdWVzKHdpbmRvdywgY3VlcywgdGhpcy5lbF8pO1xuXG4gICAgaWYgKCF0aGlzLnBsYXllcl8udGV4dFRyYWNrU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb3ZlcnJpZGVzID0gdGhpcy5wbGF5ZXJfLnRleHRUcmFja1NldHRpbmdzLmdldFZhbHVlcygpO1xuXG4gICAgdmFyIGkgPSBjdWVzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHZhciBjdWUgPSBjdWVzW2ldO1xuXG4gICAgICBpZiAoIWN1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1ZURpdiA9IGN1ZS5kaXNwbGF5U3RhdGU7XG5cbiAgICAgIGlmIChvdmVycmlkZXMuY29sb3IpIHtcbiAgICAgICAgY3VlRGl2LmZpcnN0Q2hpbGQuc3R5bGUuY29sb3IgPSBvdmVycmlkZXMuY29sb3I7XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLnRleHRPcGFjaXR5KSB7XG4gICAgICAgIHRyeVVwZGF0ZVN0eWxlKGN1ZURpdi5maXJzdENoaWxkLCAnY29sb3InLCBjb25zdHJ1Y3RDb2xvcihvdmVycmlkZXMuY29sb3IgfHwgJyNmZmYnLCBvdmVycmlkZXMudGV4dE9wYWNpdHkpKTtcbiAgICAgIH1cbiAgICAgIGlmIChvdmVycmlkZXMuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG92ZXJyaWRlcy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLmJhY2tncm91bmRPcGFjaXR5KSB7XG4gICAgICAgIHRyeVVwZGF0ZVN0eWxlKGN1ZURpdi5maXJzdENoaWxkLCAnYmFja2dyb3VuZENvbG9yJywgY29uc3RydWN0Q29sb3Iob3ZlcnJpZGVzLmJhY2tncm91bmRDb2xvciB8fCAnIzAwMCcsIG92ZXJyaWRlcy5iYWNrZ3JvdW5kT3BhY2l0eSkpO1xuICAgICAgfVxuICAgICAgaWYgKG92ZXJyaWRlcy53aW5kb3dDb2xvcikge1xuICAgICAgICBpZiAob3ZlcnJpZGVzLndpbmRvd09wYWNpdHkpIHtcbiAgICAgICAgICB0cnlVcGRhdGVTdHlsZShjdWVEaXYsICdiYWNrZ3JvdW5kQ29sb3InLCBjb25zdHJ1Y3RDb2xvcihvdmVycmlkZXMud2luZG93Q29sb3IsIG92ZXJyaWRlcy53aW5kb3dPcGFjaXR5KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VlRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG92ZXJyaWRlcy53aW5kb3dDb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG92ZXJyaWRlcy5lZGdlU3R5bGUpIHtcbiAgICAgICAgaWYgKG92ZXJyaWRlcy5lZGdlU3R5bGUgPT09ICdkcm9wc2hhZG93Jykge1xuICAgICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLnRleHRTaGFkb3cgPSAnMnB4IDJweCAzcHggJyArIGRhcmtHcmF5ICsgJywgMnB4IDJweCA0cHggJyArIGRhcmtHcmF5ICsgJywgMnB4IDJweCA1cHggJyArIGRhcmtHcmF5O1xuICAgICAgICB9IGVsc2UgaWYgKG92ZXJyaWRlcy5lZGdlU3R5bGUgPT09ICdyYWlzZWQnKSB7XG4gICAgICAgICAgY3VlRGl2LmZpcnN0Q2hpbGQuc3R5bGUudGV4dFNoYWRvdyA9ICcxcHggMXB4ICcgKyBkYXJrR3JheSArICcsIDJweCAycHggJyArIGRhcmtHcmF5ICsgJywgM3B4IDNweCAnICsgZGFya0dyYXk7XG4gICAgICAgIH0gZWxzZSBpZiAob3ZlcnJpZGVzLmVkZ2VTdHlsZSA9PT0gJ2RlcHJlc3NlZCcpIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS50ZXh0U2hhZG93ID0gJzFweCAxcHggJyArIGxpZ2h0R3JheSArICcsIDAgMXB4ICcgKyBsaWdodEdyYXkgKyAnLCAtMXB4IC0xcHggJyArIGRhcmtHcmF5ICsgJywgMCAtMXB4ICcgKyBkYXJrR3JheTtcbiAgICAgICAgfSBlbHNlIGlmIChvdmVycmlkZXMuZWRnZVN0eWxlID09PSAndW5pZm9ybScpIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS50ZXh0U2hhZG93ID0gJzAgMCA0cHggJyArIGRhcmtHcmF5ICsgJywgMCAwIDRweCAnICsgZGFya0dyYXkgKyAnLCAwIDAgNHB4ICcgKyBkYXJrR3JheSArICcsIDAgMCA0cHggJyArIGRhcmtHcmF5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLmZvbnRQZXJjZW50ICYmIG92ZXJyaWRlcy5mb250UGVyY2VudCAhPT0gMSkge1xuICAgICAgICB2YXIgZm9udFNpemUgPSB3aW5kb3cucGFyc2VGbG9hdChjdWVEaXYuc3R5bGUuZm9udFNpemUpO1xuXG4gICAgICAgIGN1ZURpdi5zdHlsZS5mb250U2l6ZSA9IGZvbnRTaXplICogb3ZlcnJpZGVzLmZvbnRQZXJjZW50ICsgJ3B4JztcbiAgICAgICAgY3VlRGl2LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgICAgY3VlRGl2LnN0eWxlLnRvcCA9ICdhdXRvJztcbiAgICAgICAgY3VlRGl2LnN0eWxlLmJvdHRvbSA9ICcycHgnO1xuICAgICAgfVxuICAgICAgaWYgKG92ZXJyaWRlcy5mb250RmFtaWx5ICYmIG92ZXJyaWRlcy5mb250RmFtaWx5ICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgaWYgKG92ZXJyaWRlcy5mb250RmFtaWx5ID09PSAnc21hbGwtY2FwcycpIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS5mb250VmFyaWFudCA9ICdzbWFsbC1jYXBzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS5mb250RmFtaWx5ID0gZm9udE1hcFtvdmVycmlkZXMuZm9udEZhbWlseV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFRleHRUcmFja0Rpc3BsYXk7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVGV4dFRyYWNrRGlzcGxheScsIFRleHRUcmFja0Rpc3BsYXkpO1xuXG4vKipcbiAqIEBmaWxlIGxvYWRpbmctc3Bpbm5lci5qc1xuICovXG4vKipcbiAqIEEgbG9hZGluZyBzcGlubmVyIGZvciB1c2UgZHVyaW5nIHdhaXRpbmcvbG9hZGluZyBldmVudHMuXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIExvYWRpbmdTcGlubmVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoTG9hZGluZ1NwaW5uZXIsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIExvYWRpbmdTcGlubmVyKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExvYWRpbmdTcGlubmVyKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYExvYWRpbmdTcGlubmVyYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGRvbSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cbiAgTG9hZGluZ1NwaW5uZXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgdmFyIGlzQXVkaW8gPSB0aGlzLnBsYXllcl8uaXNBdWRpbygpO1xuICAgIHZhciBwbGF5ZXJUeXBlID0gdGhpcy5sb2NhbGl6ZShpc0F1ZGlvID8gJ0F1ZGlvIFBsYXllcicgOiAnVmlkZW8gUGxheWVyJyk7XG4gICAgdmFyIGNvbnRyb2xUZXh0ID0gY3JlYXRlRWwoJ3NwYW4nLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtY29udHJvbC10ZXh0JyxcbiAgICAgIGlubmVySFRNTDogdGhpcy5sb2NhbGl6ZSgnezF9IGlzIGxvYWRpbmcuJywgW3BsYXllclR5cGVdKVxuICAgIH0pO1xuXG4gICAgdmFyIGVsID0gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLWxvYWRpbmctc3Bpbm5lcicsXG4gICAgICBkaXI6ICdsdHInXG4gICAgfSk7XG5cbiAgICBlbC5hcHBlbmRDaGlsZChjb250cm9sVGV4dCk7XG5cbiAgICByZXR1cm4gZWw7XG4gIH07XG5cbiAgcmV0dXJuIExvYWRpbmdTcGlubmVyO1xufShDb21wb25lbnQpO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0xvYWRpbmdTcGlubmVyJywgTG9hZGluZ1NwaW5uZXIpO1xuXG4vKipcbiAqIEBmaWxlIGJ1dHRvbi5qc1xuICovXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBidXR0b25zLlxuICpcbiAqIEBleHRlbmRzIENsaWNrYWJsZUNvbXBvbmVudFxuICovXG5cbnZhciBCdXR0b24gPSBmdW5jdGlvbiAoX0NsaWNrYWJsZUNvbXBvbmVudCkge1xuICBpbmhlcml0cyhCdXR0b24sIF9DbGlja2FibGVDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEJ1dHRvbigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBCdXR0b24pO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9DbGlja2FibGVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQnV0dG9uYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPVwiYnV0dG9uXCJdXG4gICAqICAgICAgICBUaGUgZWxlbWVudCdzIG5vZGUgdHlwZS4gVGhpcyBhcmd1bWVudCBpcyBJR05PUkVEOiBubyBtYXR0ZXIgd2hhdFxuICAgKiAgICAgICAgaXMgcGFzc2VkLCBpdCB3aWxsIGFsd2F5cyBjcmVhdGUgYSBgYnV0dG9uYCBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzPXt9XVxuICAgKiAgICAgICAgQW4gb2JqZWN0IG9mIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2F0dHJpYnV0ZXM9e31dXG4gICAqICAgICAgICBBbiBvYmplY3Qgb2YgYXR0cmlidXRlcyB0aGF0IHNob3VsZCBiZSBzZXQgb24gdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuICBCdXR0b24ucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwodGFnKSB7XG4gICAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICB0YWcgPSAnYnV0dG9uJztcblxuICAgIHByb3BzID0gYXNzaWduKHtcbiAgICAgIGlubmVySFRNTDogJzxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwidmpzLWljb24tcGxhY2Vob2xkZXJcIj48L3NwYW4+JyxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5idWlsZENTU0NsYXNzKClcbiAgICB9LCBwcm9wcyk7XG5cbiAgICAvLyBBZGQgYXR0cmlidXRlcyBmb3IgYnV0dG9uIGVsZW1lbnRcbiAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHtcblxuICAgICAgLy8gTmVjZXNzYXJ5IHNpbmNlIHRoZSBkZWZhdWx0IGJ1dHRvbiB0eXBlIGlzIFwic3VibWl0XCJcbiAgICAgIHR5cGU6ICdidXR0b24nXG4gICAgfSwgYXR0cmlidXRlcyk7XG5cbiAgICB2YXIgZWwgPSBDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgdGFnLCBwcm9wcywgYXR0cmlidXRlcyk7XG5cbiAgICB0aGlzLmNyZWF0ZUNvbnRyb2xUZXh0RWwoZWwpO1xuXG4gICAgcmV0dXJuIGVsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBjaGlsZCBgQ29tcG9uZW50YCBpbnNpZGUgb2YgdGhpcyBgQnV0dG9uYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8Q29tcG9uZW50fSBjaGlsZFxuICAgKiAgICAgICAgVGhlIG5hbWUgb3IgaW5zdGFuY2Ugb2YgYSBjaGlsZCB0byBhZGQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2Ygb3B0aW9ucyB0aGF0IHdpbGwgZ2V0IHBhc3NlZCB0byBjaGlsZHJlbiBvZlxuICAgKiAgICAgICAgdGhlIGNoaWxkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqICAgICAgICAgVGhlIGBDb21wb25lbnRgIHRoYXQgZ2V0cyBhZGRlZCBhcyBhIGNoaWxkLiBXaGVuIHVzaW5nIGEgc3RyaW5nIHRoZVxuICAgKiAgICAgICAgIGBDb21wb25lbnRgIHdpbGwgZ2V0IGNyZWF0ZWQgYnkgdGhpcyBwcm9jZXNzLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDVcbiAgICovXG5cblxuICBCdXR0b24ucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24gYWRkQ2hpbGQoY2hpbGQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgY2xhc3NOYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgbG9nJDEud2FybignQWRkaW5nIGFuIGFjdGlvbmFibGUgKHVzZXIgY29udHJvbGxhYmxlKSBjaGlsZCB0byBhIEJ1dHRvbiAoJyArIGNsYXNzTmFtZSArICcpIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzZSBhIENsaWNrYWJsZUNvbXBvbmVudCBpbnN0ZWFkLicpO1xuXG4gICAgLy8gQXZvaWQgdGhlIGVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IENsaWNrYWJsZUNvbXBvbmVudCdzIGFkZENoaWxkIG1ldGhvZFxuICAgIHJldHVybiBDb21wb25lbnQucHJvdG90eXBlLmFkZENoaWxkLmNhbGwodGhpcywgY2hpbGQsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIGBCdXR0b25gIGVsZW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgYWN0aXZhdGVkIG9yIGNsaWNrZWQuIFVzZSB0aGlzIHdpdGhcbiAgICoge0BsaW5rIEJ1dHRvbiNkaXNhYmxlfS5cbiAgICovXG5cblxuICBCdXR0b24ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIGVuYWJsZSgpIHtcbiAgICBfQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5lbmFibGUuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmVsXy5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIGBCdXR0b25gIGVsZW1lbnQgc28gdGhhdCBpdCBjYW5ub3QgYmUgYWN0aXZhdGVkIG9yIGNsaWNrZWQuIFVzZSB0aGlzIHdpdGhcbiAgICoge0BsaW5rIEJ1dHRvbiNlbmFibGV9LlxuICAgKi9cblxuXG4gIEJ1dHRvbi5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgX0NsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuZGlzYWJsZS5jYWxsKHRoaXMpO1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGEgYEJ1dHRvbmAgaGFzIGZvY3VzIGFuZCBga2V5ZG93bmAgaXMgdHJpZ2dlcmVkIHZpYSBhIGtleVxuICAgKiBwcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGdldCBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBCdXR0b24ucHJvdG90eXBlLmhhbmRsZUtleVByZXNzID0gZnVuY3Rpb24gaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHtcblxuICAgIC8vIElnbm9yZSBTcGFjZSAoMzIpIG9yIEVudGVyICgxMykga2V5IG9wZXJhdGlvbiwgd2hpY2ggaXMgaGFuZGxlZCBieSB0aGUgYnJvd3NlciBmb3IgYSBidXR0b24uXG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAzMiB8fCBldmVudC53aGljaCA9PT0gMTMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQYXNzIGtleXByZXNzIGhhbmRsaW5nIHVwIGZvciB1bnN1cHBvcnRlZCBrZXlzXG4gICAgX0NsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MuY2FsbCh0aGlzLCBldmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIEJ1dHRvbjtcbn0oQ2xpY2thYmxlQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdCdXR0b24nLCBCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIGJpZy1wbGF5LWJ1dHRvbi5qc1xuICovXG4vKipcbiAqIFRoZSBpbml0aWFsIHBsYXkgYnV0dG9uIHRoYXQgc2hvd3MgYmVmb3JlIHRoZSB2aWRlbyBoYXMgcGxheWVkLiBUaGUgaGlkaW5nIG9mIHRoZVxuICogYEJpZ1BsYXlCdXR0b25gIGdldCBkb25lIHZpYSBDU1MgYW5kIGBQbGF5ZXJgIHN0YXRlcy5cbiAqXG4gKiBAZXh0ZW5kcyBCdXR0b25cbiAqL1xuXG52YXIgQmlnUGxheUJ1dHRvbiA9IGZ1bmN0aW9uIChfQnV0dG9uKSB7XG4gIGluaGVyaXRzKEJpZ1BsYXlCdXR0b24sIF9CdXR0b24pO1xuXG4gIGZ1bmN0aW9uIEJpZ1BsYXlCdXR0b24ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQmlnUGxheUJ1dHRvbik7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9CdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLm1vdXNldXNlZF8gPSBmYWxzZTtcblxuICAgIF90aGlzLm9uKCdtb3VzZWRvd24nLCBfdGhpcy5oYW5kbGVNb3VzZURvd24pO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuIEFsd2F5cyByZXR1cm5zICd2anMtYmlnLXBsYXktYnV0dG9uJy5cbiAgICovXG5cblxuICBCaWdQbGF5QnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1iaWctcGxheS1idXR0b24nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBgQmlnUGxheUJ1dHRvbmAgXCJjbGlja2VkXCIuIFNlZSB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fVxuICAgKiBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgKiAgICAgICAgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB0YXBcbiAgICogQGxpc3RlbnMgY2xpY2tcbiAgICovXG5cblxuICBCaWdQbGF5QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgdmFyIHBsYXlQcm9taXNlID0gdGhpcy5wbGF5ZXJfLnBsYXkoKTtcblxuICAgIC8vIGV4aXQgZWFybHkgaWYgY2xpY2tlZCB2aWEgdGhlIG1vdXNlXG4gICAgaWYgKHRoaXMubW91c2V1c2VkXyAmJiBldmVudC5jbGllbnRYICYmIGV2ZW50LmNsaWVudFkpIHtcbiAgICAgIHNpbGVuY2VQcm9taXNlKHBsYXlQcm9taXNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2IgPSB0aGlzLnBsYXllcl8uZ2V0Q2hpbGQoJ2NvbnRyb2xCYXInKTtcbiAgICB2YXIgcGxheVRvZ2dsZSA9IGNiICYmIGNiLmdldENoaWxkKCdwbGF5VG9nZ2xlJyk7XG5cbiAgICBpZiAoIXBsYXlUb2dnbGUpIHtcbiAgICAgIHRoaXMucGxheWVyXy5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwbGF5Rm9jdXMgPSBmdW5jdGlvbiBwbGF5Rm9jdXMoKSB7XG4gICAgICByZXR1cm4gcGxheVRvZ2dsZS5mb2N1cygpO1xuICAgIH07XG5cbiAgICBpZiAoaXNQcm9taXNlKHBsYXlQcm9taXNlKSkge1xuICAgICAgcGxheVByb21pc2UudGhlbihwbGF5Rm9jdXMsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRUaW1lb3V0KHBsYXlGb2N1cywgMSk7XG4gICAgfVxuICB9O1xuXG4gIEJpZ1BsYXlCdXR0b24ucHJvdG90eXBlLmhhbmRsZUtleVByZXNzID0gZnVuY3Rpb24gaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHtcbiAgICB0aGlzLm1vdXNldXNlZF8gPSBmYWxzZTtcblxuICAgIF9CdXR0b24ucHJvdG90eXBlLmhhbmRsZUtleVByZXNzLmNhbGwodGhpcywgZXZlbnQpO1xuICB9O1xuXG4gIEJpZ1BsYXlCdXR0b24ucHJvdG90eXBlLmhhbmRsZU1vdXNlRG93biA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bihldmVudCkge1xuICAgIHRoaXMubW91c2V1c2VkXyA9IHRydWU7XG4gIH07XG5cbiAgcmV0dXJuIEJpZ1BsYXlCdXR0b247XG59KEJ1dHRvbik7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgQmlnUGxheUJ1dHRvbmBzIGNvbnRyb2xzLiBBZGRlZCB0byBmb3IgbG9jYWxpemF0aW9uLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuQmlnUGxheUJ1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ1BsYXkgVmlkZW8nO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0JpZ1BsYXlCdXR0b24nLCBCaWdQbGF5QnV0dG9uKTtcblxuLyoqXG4gKiBAZmlsZSBjbG9zZS1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgYENsb3NlQnV0dG9uYCBpcyBhIGB7QGxpbmsgQnV0dG9ufWAgdGhhdCBmaXJlcyBhIGBjbG9zZWAgZXZlbnQgd2hlblxuICogaXQgZ2V0cyBjbGlja2VkLlxuICpcbiAqIEBleHRlbmRzIEJ1dHRvblxuICovXG5cbnZhciBDbG9zZUJ1dHRvbiA9IGZ1bmN0aW9uIChfQnV0dG9uKSB7XG4gIGluaGVyaXRzKENsb3NlQnV0dG9uLCBfQnV0dG9uKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtICB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gQ2xvc2VCdXR0b24ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xvc2VCdXR0b24pO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQnV0dG9uLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5jb250cm9sVGV4dChvcHRpb25zICYmIG9wdGlvbnMuY29udHJvbFRleHQgfHwgX3RoaXMubG9jYWxpemUoJ0Nsb3NlJykpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgQ2xvc2VCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWNsb3NlLWJ1dHRvbiAnICsgX0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBgQ2xvc2VCdXR0b25gIGdldHMgY2xpY2tlZC4gU2VlXG4gICAqIHtAbGluayBDbGlja2FibGVDb21wb25lbnQjaGFuZGxlQ2xpY2t9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdoZW4gdGhpcyB3aWxsIGJlXG4gICAqIHRyaWdnZXJlZFxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgKiAgICAgICAgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB0YXBcbiAgICogQGxpc3RlbnMgY2xpY2tcbiAgICogQGZpcmVzIENsb3NlQnV0dG9uI2Nsb3NlXG4gICAqL1xuXG5cbiAgQ2xvc2VCdXR0b24ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBhIGBDbG9zZUJ1dHRvbmAgaXMgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCBDbG9zZUJ1dHRvbiNjbG9zZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2J1YmJsZXM9ZmFsc2VdXG4gICAgICogICAgICAgICAgIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZSBjbG9zZSBldmVudCBkb2VzIG5vdFxuICAgICAqICAgICAgICAgICBidWJibGUgdXAgdG8gcGFyZW50cyBpZiB0aGVyZSBpcyBubyBsaXN0ZW5lclxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcih7IHR5cGU6ICdjbG9zZScsIGJ1YmJsZXM6IGZhbHNlIH0pO1xuICB9O1xuXG4gIHJldHVybiBDbG9zZUJ1dHRvbjtcbn0oQnV0dG9uKTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDbG9zZUJ1dHRvbicsIENsb3NlQnV0dG9uKTtcblxuLyoqXG4gKiBAZmlsZSBwbGF5LXRvZ2dsZS5qc1xuICovXG4vKipcbiAqIEJ1dHRvbiB0byB0b2dnbGUgYmV0d2VlbiBwbGF5IGFuZCBwYXVzZS5cbiAqXG4gKiBAZXh0ZW5kcyBCdXR0b25cbiAqL1xuXG52YXIgUGxheVRvZ2dsZSA9IGZ1bmN0aW9uIChfQnV0dG9uKSB7XG4gIGluaGVyaXRzKFBsYXlUb2dnbGUsIF9CdXR0b24pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gUGxheVRvZ2dsZShwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5VG9nZ2xlKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMub24ocGxheWVyLCAncGxheScsIF90aGlzLmhhbmRsZVBsYXkpO1xuICAgIF90aGlzLm9uKHBsYXllciwgJ3BhdXNlJywgX3RoaXMuaGFuZGxlUGF1c2UpO1xuICAgIF90aGlzLm9uKHBsYXllciwgJ2VuZGVkJywgX3RoaXMuaGFuZGxlRW5kZWQpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgUGxheVRvZ2dsZS5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtcGxheS1jb250cm9sICcgKyBfQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgUGxheVRvZ2dsZWAgaXMgXCJjbGlja2VkXCIuIFNlZVxuICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlXG4gICAqICAgICAgICBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKi9cblxuXG4gIFBsYXlUb2dnbGUucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXJfLnBhdXNlZCgpKSB7XG4gICAgICB0aGlzLnBsYXllcl8ucGxheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXllcl8ucGF1c2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgb25jZSBhZnRlciB0aGUgdmlkZW8gaGFzIGVuZGVkIGFuZCB0aGUgdXNlciBzZWVrcyBzbyB0aGF0XG4gICAqIHdlIGNhbiBjaGFuZ2UgdGhlIHJlcGxheSBidXR0b24gYmFjayB0byBhIHBsYXkgYnV0dG9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciNzZWVrZWRcbiAgICovXG5cblxuICBQbGF5VG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVTZWVrZWQgPSBmdW5jdGlvbiBoYW5kbGVTZWVrZWQoZXZlbnQpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZW5kZWQnKTtcblxuICAgIGlmICh0aGlzLnBsYXllcl8ucGF1c2VkKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlUGF1c2UoZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZVBsYXkoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSB2anMtcGxheWluZyBjbGFzcyB0byB0aGUgZWxlbWVudCBzbyBpdCBjYW4gY2hhbmdlIGFwcGVhcmFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3BsYXlcbiAgICovXG5cblxuICBQbGF5VG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVQbGF5ID0gZnVuY3Rpb24gaGFuZGxlUGxheShldmVudCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1lbmRlZCcpO1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1wYXVzZWQnKTtcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtcGxheWluZycpO1xuICAgIC8vIGNoYW5nZSB0aGUgYnV0dG9uIHRleHQgdG8gXCJQYXVzZVwiXG4gICAgdGhpcy5jb250cm9sVGV4dCgnUGF1c2UnKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSB2anMtcGF1c2VkIGNsYXNzIHRvIHRoZSBlbGVtZW50IHNvIGl0IGNhbiBjaGFuZ2UgYXBwZWFyYW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjcGF1c2VcbiAgICovXG5cblxuICBQbGF5VG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVQYXVzZSA9IGZ1bmN0aW9uIGhhbmRsZVBhdXNlKGV2ZW50KSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXBsYXlpbmcnKTtcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtcGF1c2VkJyk7XG4gICAgLy8gY2hhbmdlIHRoZSBidXR0b24gdGV4dCB0byBcIlBsYXlcIlxuICAgIHRoaXMuY29udHJvbFRleHQoJ1BsYXknKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSB2anMtZW5kZWQgY2xhc3MgdG8gdGhlIGVsZW1lbnQgc28gaXQgY2FuIGNoYW5nZSBhcHBlYXJhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI2VuZGVkXG4gICAqL1xuXG5cbiAgUGxheVRvZ2dsZS5wcm90b3R5cGUuaGFuZGxlRW5kZWQgPSBmdW5jdGlvbiBoYW5kbGVFbmRlZChldmVudCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1wbGF5aW5nJyk7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWVuZGVkJyk7XG4gICAgLy8gY2hhbmdlIHRoZSBidXR0b24gdGV4dCB0byBcIlJlcGxheVwiXG4gICAgdGhpcy5jb250cm9sVGV4dCgnUmVwbGF5Jyk7XG5cbiAgICAvLyBvbiB0aGUgbmV4dCBzZWVrIHJlbW92ZSB0aGUgcmVwbGF5IGJ1dHRvblxuICAgIHRoaXMub25lKHRoaXMucGxheWVyXywgJ3NlZWtlZCcsIHRoaXMuaGFuZGxlU2Vla2VkKTtcbiAgfTtcblxuICByZXR1cm4gUGxheVRvZ2dsZTtcbn0oQnV0dG9uKTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBQbGF5VG9nZ2xlYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5QbGF5VG9nZ2xlLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnUGxheSc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUGxheVRvZ2dsZScsIFBsYXlUb2dnbGUpO1xuXG4vKipcbiAqIEBmaWxlIGZvcm1hdC10aW1lLmpzXG4gKiBAbW9kdWxlIGZvcm1hdC10aW1lXG4gKi9cblxuLyoqXG4qIEZvcm1hdCBzZWNvbmRzIGFzIGEgdGltZSBzdHJpbmcsIEg6TU06U1Mgb3IgTTpTUy4gU3VwcGx5aW5nIGEgZ3VpZGUgKGluIHNlY29uZHMpXG4qIHdpbGwgZm9yY2UgYSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyB0byBjb3ZlciB0aGUgbGVuZ3RoIG9mIHRoZSBndWlkZS5cbipcbiogQHBhcmFtIHtudW1iZXJ9IHNlY29uZHNcbiogICAgICAgIE51bWJlciBvZiBzZWNvbmRzIHRvIGJlIHR1cm5lZCBpbnRvIGEgc3RyaW5nXG4qXG4qIEBwYXJhbSB7bnVtYmVyfSBndWlkZVxuKiAgICAgICAgTnVtYmVyIChpbiBzZWNvbmRzKSB0byBtb2RlbCB0aGUgc3RyaW5nIGFmdGVyXG4qXG4qIEByZXR1cm4ge3N0cmluZ31cbiogICAgICAgICBUaW1lIGZvcm1hdHRlZCBhcyBIOk1NOlNTIG9yIE06U1NcbiovXG52YXIgZGVmYXVsdEltcGxlbWVudGF0aW9uID0gZnVuY3Rpb24gZGVmYXVsdEltcGxlbWVudGF0aW9uKHNlY29uZHMsIGd1aWRlKSB7XG4gIHNlY29uZHMgPSBzZWNvbmRzIDwgMCA/IDAgOiBzZWNvbmRzO1xuICB2YXIgcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAlIDYwKTtcbiAgdmFyIG0gPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCAlIDYwKTtcbiAgdmFyIGggPSBNYXRoLmZsb29yKHNlY29uZHMgLyAzNjAwKTtcbiAgdmFyIGdtID0gTWF0aC5mbG9vcihndWlkZSAvIDYwICUgNjApO1xuICB2YXIgZ2ggPSBNYXRoLmZsb29yKGd1aWRlIC8gMzYwMCk7XG5cbiAgLy8gaGFuZGxlIGludmFsaWQgdGltZXNcbiAgaWYgKGlzTmFOKHNlY29uZHMpIHx8IHNlY29uZHMgPT09IEluZmluaXR5KSB7XG4gICAgLy8gJy0nIGlzIGZhbHNlIGZvciBhbGwgcmVsYXRpb25hbCBvcGVyYXRvcnMgKGUuZy4gPCwgPj0pIHNvIHRoaXMgc2V0dGluZ1xuICAgIC8vIHdpbGwgYWRkIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmaWVsZHMgc3BlY2lmaWVkIGJ5IHRoZSBndWlkZVxuICAgIGggPSBtID0gcyA9ICctJztcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gc2hvdyBob3Vyc1xuICBoID0gaCA+IDAgfHwgZ2ggPiAwID8gaCArICc6JyA6ICcnO1xuXG4gIC8vIElmIGhvdXJzIGFyZSBzaG93aW5nLCB3ZSBtYXkgbmVlZCB0byBhZGQgYSBsZWFkaW5nIHplcm8uXG4gIC8vIEFsd2F5cyBzaG93IGF0IGxlYXN0IG9uZSBkaWdpdCBvZiBtaW51dGVzLlxuICBtID0gKChoIHx8IGdtID49IDEwKSAmJiBtIDwgMTAgPyAnMCcgKyBtIDogbSkgKyAnOic7XG5cbiAgLy8gQ2hlY2sgaWYgbGVhZGluZyB6ZXJvIGlzIG5lZWQgZm9yIHNlY29uZHNcbiAgcyA9IHMgPCAxMCA/ICcwJyArIHMgOiBzO1xuXG4gIHJldHVybiBoICsgbSArIHM7XG59O1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSBkZWZhdWx0SW1wbGVtZW50YXRpb247XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGRlZmF1bHQgZm9ybWF0VGltZSBpbXBsZW1lbnRhdGlvbiB3aXRoIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbUltcGxlbWVudGF0aW9uXG4gKiAgICAgICAgQSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgZm9ybWF0VGltZSBpbXBsZW1lbnRhdGlvbi5cbiAqICAgICAgICBXaWxsIHJlY2VpdmUgdGhlIGN1cnJlbnQgdGltZSBpbiBzZWNvbmRzIGFuZCB0aGUgZ3VpZGUgKGluIHNlY29uZHMpIGFzIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gc2V0Rm9ybWF0VGltZShjdXN0b21JbXBsZW1lbnRhdGlvbikge1xuICBpbXBsZW1lbnRhdGlvbiA9IGN1c3RvbUltcGxlbWVudGF0aW9uO1xufVxuXG4vKipcbiAqIFJlc2V0cyBmb3JtYXRUaW1lIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLlxuICovXG5mdW5jdGlvbiByZXNldEZvcm1hdFRpbWUoKSB7XG4gIGltcGxlbWVudGF0aW9uID0gZGVmYXVsdEltcGxlbWVudGF0aW9uO1xufVxuXG52YXIgZm9ybWF0VGltZSA9IGZ1bmN0aW9uIChzZWNvbmRzKSB7XG4gIHZhciBndWlkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogc2Vjb25kcztcblxuICByZXR1cm4gaW1wbGVtZW50YXRpb24oc2Vjb25kcywgZ3VpZGUpO1xufTtcblxuLyoqXG4gKiBAZmlsZSB0aW1lLWRpc3BsYXkuanNcbiAqL1xuLyoqXG4gKiBEaXNwbGF5cyB0aGUgdGltZSBsZWZ0IGluIHRoZSB2aWRlb1xuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBUaW1lRGlzcGxheSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKFRpbWVEaXNwbGF5LCBfQ29tcG9uZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFRpbWVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRpbWVEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMudGhyb3R0bGVkVXBkYXRlQ29udGVudCA9IHRocm90dGxlKGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZUNvbnRlbnQpLCAyNSk7XG4gICAgX3RoaXMub24ocGxheWVyLCAndGltZXVwZGF0ZScsIF90aGlzLnRocm90dGxlZFVwZGF0ZUNvbnRlbnQpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgJ3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFRpbWVEaXNwbGF5LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKHBsYWluTmFtZSkge1xuICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmJ1aWxkQ1NTQ2xhc3MoKTtcbiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSArICcgdmpzLXRpbWUtY29udHJvbCB2anMtY29udHJvbCcsXG4gICAgICBpbm5lckhUTUw6ICc8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj4nICsgdGhpcy5sb2NhbGl6ZSh0aGlzLmxhYmVsVGV4dF8pICsgJ1xceEEwPC9zcGFuPidcbiAgICB9KTtcblxuICAgIHRoaXMuY29udGVudEVsXyA9IGNyZWF0ZUVsKCdzcGFuJywge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUgKyAnLWRpc3BsYXknXG4gICAgfSwge1xuICAgICAgLy8gdGVsbCBzY3JlZW4gcmVhZGVycyBub3QgdG8gYXV0b21hdGljYWxseSByZWFkIHRoZSB0aW1lIGFzIGl0IGNoYW5nZXNcbiAgICAgICdhcmlhLWxpdmUnOiAnb2ZmJ1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVUZXh0Tm9kZV8oKTtcbiAgICBlbC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRFbF8pO1xuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICBUaW1lRGlzcGxheS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5jb250ZW50RWxfID0gbnVsbDtcbiAgICB0aGlzLnRleHROb2RlXyA9IG51bGw7XG5cbiAgICBfQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIFwicmVtYWluaW5nIHRpbWVcIiB0ZXh0IG5vZGUgd2l0aCBuZXcgY29udGVudCB1c2luZyB0aGVcbiAgICogY29udGVudHMgb2YgdGhlIGBmb3JtYXR0ZWRUaW1lX2AgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVGltZURpc3BsYXkucHJvdG90eXBlLnVwZGF0ZVRleHROb2RlXyA9IGZ1bmN0aW9uIHVwZGF0ZVRleHROb2RlXygpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudEVsXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLmNvbnRlbnRFbF8uZmlyc3RDaGlsZCkge1xuICAgICAgdGhpcy5jb250ZW50RWxfLnJlbW92ZUNoaWxkKHRoaXMuY29udGVudEVsXy5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICB0aGlzLnRleHROb2RlXyA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuZm9ybWF0dGVkVGltZV8gfHwgdGhpcy5mb3JtYXRUaW1lXygwKSk7XG4gICAgdGhpcy5jb250ZW50RWxfLmFwcGVuZENoaWxkKHRoaXMudGV4dE5vZGVfKTtcbiAgfTtcblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgZm9ybWF0dGVkIHRpbWUgZm9yIHRoaXMgY29tcG9uZW50IHRvIHVzZSBpbiBkaXNwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IHRpbWVcbiAgICogICAgICAgICBBIG51bWVyaWMgdGltZSwgaW4gc2Vjb25kcy5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIEEgZm9ybWF0dGVkIHRpbWVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUaW1lRGlzcGxheS5wcm90b3R5cGUuZm9ybWF0VGltZV8gPSBmdW5jdGlvbiBmb3JtYXRUaW1lXyh0aW1lKSB7XG4gICAgcmV0dXJuIGZvcm1hdFRpbWUodGltZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHRpbWUgZGlzcGxheSB0ZXh0IG5vZGUgaWYgaXQgaGFzIHdoYXQgd2FzIHBhc3NlZCBpbiBjaGFuZ2VkXG4gICAqIHRoZSBmb3JtYXR0ZWQgdGltZS5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVcbiAgICogICAgICAgIFRoZSB0aW1lIHRvIHVwZGF0ZSB0b1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRpbWVEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVGb3JtYXR0ZWRUaW1lXyA9IGZ1bmN0aW9uIHVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRpbWUpIHtcbiAgICB2YXIgZm9ybWF0dGVkVGltZSA9IHRoaXMuZm9ybWF0VGltZV8odGltZSk7XG5cbiAgICBpZiAoZm9ybWF0dGVkVGltZSA9PT0gdGhpcy5mb3JtYXR0ZWRUaW1lXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybWF0dGVkVGltZV8gPSBmb3JtYXR0ZWRUaW1lO1xuICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMudXBkYXRlVGV4dE5vZGVfKTtcbiAgfTtcblxuICAvKipcbiAgICogVG8gYmUgZmlsbGVkIG91dCBpbiB0aGUgY2hpbGQgY2xhc3MsIHNob3VsZCB1cGRhdGUgdGhlIGRpc3BsYXllZCB0aW1lXG4gICAqIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgZmFjdCB0aGF0IHRoZSBjdXJyZW50IHRpbWUgaGFzIGNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjdGltZXVwZGF0ZVxuICAgKi9cblxuXG4gIFRpbWVEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVDb250ZW50ID0gZnVuY3Rpb24gdXBkYXRlQ29udGVudChldmVudCkge307XG5cbiAgcmV0dXJuIFRpbWVEaXNwbGF5O1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgaXMgYWRkZWQgdG8gdGhlIGBUaW1lRGlzcGxheWAgZm9yIHNjcmVlbiByZWFkZXIgdXNlcnMuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5UaW1lRGlzcGxheS5wcm90b3R5cGUubGFiZWxUZXh0XyA9ICdUaW1lJztcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBUaW1lRGlzcGxheWBzIGNvbnRyb2xzLiBBZGRlZCB0byBmb3IgbG9jYWxpemF0aW9uLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICpcbiAqIEBkZXByZWNhdGVkIGluIHY3OyBjb250cm9sVGV4dF8gaXMgbm90IHVzZWQgaW4gbm9uLWFjdGl2ZSBkaXNwbGF5IENvbXBvbmVudHNcbiAqL1xuVGltZURpc3BsYXkucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdUaW1lJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUaW1lRGlzcGxheScsIFRpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBAZmlsZSBjdXJyZW50LXRpbWUtZGlzcGxheS5qc1xuICovXG4vKipcbiAqIERpc3BsYXlzIHRoZSBjdXJyZW50IHRpbWVcbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgQ3VycmVudFRpbWVEaXNwbGF5ID0gZnVuY3Rpb24gKF9UaW1lRGlzcGxheSkge1xuICBpbmhlcml0cyhDdXJyZW50VGltZURpc3BsYXksIF9UaW1lRGlzcGxheSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBDdXJyZW50VGltZURpc3BsYXkocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ3VycmVudFRpbWVEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RpbWVEaXNwbGF5LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsICdlbmRlZCcsIF90aGlzLmhhbmRsZUVuZGVkKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIEN1cnJlbnRUaW1lRGlzcGxheS5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY3VycmVudC10aW1lJztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGN1cnJlbnQgdGltZSBkaXNwbGF5XG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciN0aW1ldXBkYXRlXG4gICAqL1xuXG5cbiAgQ3VycmVudFRpbWVEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVDb250ZW50ID0gZnVuY3Rpb24gdXBkYXRlQ29udGVudChldmVudCkge1xuICAgIC8vIEFsbG93cyBmb3Igc21vb3RoIHNjcnViYmluZywgd2hlbiBwbGF5ZXIgY2FuJ3Qga2VlcCB1cC5cbiAgICB2YXIgdGltZSA9IHRoaXMucGxheWVyXy5zY3J1YmJpbmcoKSA/IHRoaXMucGxheWVyXy5nZXRDYWNoZSgpLmN1cnJlbnRUaW1lIDogdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7XG5cbiAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRpbWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBwbGF5ZXIgZmlyZXMgZW5kZWQgdGhlcmUgc2hvdWxkIGJlIG5vIHRpbWUgbGVmdC4gU2FkbHlcbiAgICogdGhpcyBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLCBsZXRzIG1ha2UgaXQgc2VlbSBsaWtlIHRoYXQgaXMgdGhlIGNhc2VcbiAgICogZm9yIHVzZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgYGVuZGVkYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI2VuZGVkXG4gICAqL1xuXG5cbiAgQ3VycmVudFRpbWVEaXNwbGF5LnByb3RvdHlwZS5oYW5kbGVFbmRlZCA9IGZ1bmN0aW9uIGhhbmRsZUVuZGVkKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnBsYXllcl8uZHVyYXRpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRoaXMucGxheWVyXy5kdXJhdGlvbigpKTtcbiAgfTtcblxuICByZXR1cm4gQ3VycmVudFRpbWVEaXNwbGF5O1xufShUaW1lRGlzcGxheSk7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBpcyBhZGRlZCB0byB0aGUgYEN1cnJlbnRUaW1lRGlzcGxheWAgZm9yIHNjcmVlbiByZWFkZXIgdXNlcnMuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5DdXJyZW50VGltZURpc3BsYXkucHJvdG90eXBlLmxhYmVsVGV4dF8gPSAnQ3VycmVudCBUaW1lJztcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBDdXJyZW50VGltZURpc3BsYXlgcyBjb250cm9scy4gQWRkZWQgdG8gZm9yIGxvY2FsaXphdGlvbi5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqXG4gKiBAZGVwcmVjYXRlZCBpbiB2NzsgY29udHJvbFRleHRfIGlzIG5vdCB1c2VkIGluIG5vbi1hY3RpdmUgZGlzcGxheSBDb21wb25lbnRzXG4gKi9cbkN1cnJlbnRUaW1lRGlzcGxheS5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0N1cnJlbnQgVGltZSc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ3VycmVudFRpbWVEaXNwbGF5JywgQ3VycmVudFRpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBAZmlsZSBkdXJhdGlvbi1kaXNwbGF5LmpzXG4gKi9cbi8qKlxuICogRGlzcGxheXMgdGhlIGR1cmF0aW9uXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIER1cmF0aW9uRGlzcGxheSA9IGZ1bmN0aW9uIChfVGltZURpc3BsYXkpIHtcbiAgaW5oZXJpdHMoRHVyYXRpb25EaXNwbGF5LCBfVGltZURpc3BsYXkpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gRHVyYXRpb25EaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIER1cmF0aW9uRGlzcGxheSk7XG5cbiAgICAvLyB3ZSBkbyBub3Qgd2FudCB0by9uZWVkIHRvIHRocm90dGxlIGR1cmF0aW9uIGNoYW5nZXMsXG4gICAgLy8gYXMgdGhleSBzaG91bGQgYWx3YXlzIGRpc3BsYXkgdGhlIGNoYW5nZWQgZHVyYXRpb24gYXNcbiAgICAvLyBpdCBoYXMgY2hhbmdlZFxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RpbWVEaXNwbGF5LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsICdkdXJhdGlvbmNoYW5nZScsIF90aGlzLnVwZGF0ZUNvbnRlbnQpO1xuXG4gICAgLy8gQWxzbyBsaXN0ZW4gZm9yIHRpbWV1cGRhdGUgKGluIHRoZSBwYXJlbnQpIGFuZCBsb2FkZWRtZXRhZGF0YSBiZWNhdXNlIHJlbW92aW5nIHRob3NlXG4gICAgLy8gbGlzdGVuZXJzIGNvdWxkIGhhdmUgYnJva2VuIGRlcGVuZGVudCBhcHBsaWNhdGlvbnMvbGlicmFyaWVzLiBUaGVzZVxuICAgIC8vIGNhbiBsaWtlbHkgYmUgcmVtb3ZlZCBmb3IgNy4wLlxuICAgIF90aGlzLm9uKHBsYXllciwgJ2xvYWRlZG1ldGFkYXRhJywgX3RoaXMudGhyb3R0bGVkVXBkYXRlQ29udGVudCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBEdXJhdGlvbkRpc3BsYXkucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWR1cmF0aW9uJztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIGR1cmF0aW9uIHRpbWUgZGlzcGxheS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGBkdXJhdGlvbmNoYW5nZWAsIGB0aW1ldXBkYXRlYCwgb3IgYGxvYWRlZG1ldGFkYXRhYCBldmVudCB0aGF0IGNhdXNlZFxuICAgKiAgICAgICAgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciNkdXJhdGlvbmNoYW5nZVxuICAgKiBAbGlzdGVucyBQbGF5ZXIjdGltZXVwZGF0ZVxuICAgKiBAbGlzdGVucyBQbGF5ZXIjbG9hZGVkbWV0YWRhdGFcbiAgICovXG5cblxuICBEdXJhdGlvbkRpc3BsYXkucHJvdG90eXBlLnVwZGF0ZUNvbnRlbnQgPSBmdW5jdGlvbiB1cGRhdGVDb250ZW50KGV2ZW50KSB7XG4gICAgdmFyIGR1cmF0aW9uID0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG5cbiAgICBpZiAoZHVyYXRpb24gJiYgdGhpcy5kdXJhdGlvbl8gIT09IGR1cmF0aW9uKSB7XG4gICAgICB0aGlzLmR1cmF0aW9uXyA9IGR1cmF0aW9uO1xuICAgICAgdGhpcy51cGRhdGVGb3JtYXR0ZWRUaW1lXyhkdXJhdGlvbik7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBEdXJhdGlvbkRpc3BsYXk7XG59KFRpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBgRHVyYXRpb25EaXNwbGF5YCBmb3Igc2NyZWVuIHJlYWRlciB1c2Vycy5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5cbkR1cmF0aW9uRGlzcGxheS5wcm90b3R5cGUubGFiZWxUZXh0XyA9ICdEdXJhdGlvbic7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgRHVyYXRpb25EaXNwbGF5YHMgY29udHJvbHMuIEFkZGVkIHRvIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKlxuICogQGRlcHJlY2F0ZWQgaW4gdjc7IGNvbnRyb2xUZXh0XyBpcyBub3QgdXNlZCBpbiBub24tYWN0aXZlIGRpc3BsYXkgQ29tcG9uZW50c1xuICovXG5EdXJhdGlvbkRpc3BsYXkucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdEdXJhdGlvbic7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnRHVyYXRpb25EaXNwbGF5JywgRHVyYXRpb25EaXNwbGF5KTtcblxuLyoqXG4gKiBAZmlsZSB0aW1lLWRpdmlkZXIuanNcbiAqL1xuLyoqXG4gKiBUaGUgc2VwYXJhdG9yIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZSBhbmQgZHVyYXRpb24uXG4gKiBDYW4gYmUgaGlkZGVuIGlmIGl0J3Mgbm90IG5lZWRlZCBpbiB0aGUgZGVzaWduLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBUaW1lRGl2aWRlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKFRpbWVEaXZpZGVyLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUaW1lRGl2aWRlcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUaW1lRGl2aWRlcik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIFRpbWVEaXZpZGVyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdGltZS1jb250cm9sIHZqcy10aW1lLWRpdmlkZXInLFxuICAgICAgaW5uZXJIVE1MOiAnPGRpdj48c3Bhbj4vPC9zcGFuPjwvZGl2PidcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVGltZURpdmlkZXI7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVGltZURpdmlkZXInLCBUaW1lRGl2aWRlcik7XG5cbi8qKlxuICogQGZpbGUgcmVtYWluaW5nLXRpbWUtZGlzcGxheS5qc1xuICovXG4vKipcbiAqIERpc3BsYXlzIHRoZSB0aW1lIGxlZnQgaW4gdGhlIHZpZGVvXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIFJlbWFpbmluZ1RpbWVEaXNwbGF5ID0gZnVuY3Rpb24gKF9UaW1lRGlzcGxheSkge1xuICBpbmhlcml0cyhSZW1haW5pbmdUaW1lRGlzcGxheSwgX1RpbWVEaXNwbGF5KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFJlbWFpbmluZ1RpbWVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFJlbWFpbmluZ1RpbWVEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RpbWVEaXNwbGF5LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsICdkdXJhdGlvbmNoYW5nZScsIF90aGlzLnRocm90dGxlZFVwZGF0ZUNvbnRlbnQpO1xuICAgIF90aGlzLm9uKHBsYXllciwgJ2VuZGVkJywgX3RoaXMuaGFuZGxlRW5kZWQpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgUmVtYWluaW5nVGltZURpc3BsYXkucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLXJlbWFpbmluZy10aW1lJztcbiAgfTtcblxuICAvKipcbiAgICogVGhlIHJlbWFpbmluZyB0aW1lIGRpc3BsYXkgcHJlZml4ZXMgbnVtYmVycyB3aXRoIGEgXCJtaW51c1wiIGNoYXJhY3Rlci5cbiAgICpcbiAgICogQHBhcmFtICB7bnVtYmVyfSB0aW1lXG4gICAqICAgICAgICAgQSBudW1lcmljIHRpbWUsIGluIHNlY29uZHMuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBBIGZvcm1hdHRlZCB0aW1lXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUmVtYWluaW5nVGltZURpc3BsYXkucHJvdG90eXBlLmZvcm1hdFRpbWVfID0gZnVuY3Rpb24gZm9ybWF0VGltZV8odGltZSkge1xuICAgIC8vIFRPRE86IFRoZSBcIi1cIiBzaG91bGQgYmUgZGVjb3JhdGl2ZSwgYW5kIG5vdCBhbm5vdW5jZWQgYnkgYSBzY3JlZW4gcmVhZGVyXG4gICAgcmV0dXJuICctJyArIF9UaW1lRGlzcGxheS5wcm90b3R5cGUuZm9ybWF0VGltZV8uY2FsbCh0aGlzLCB0aW1lKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHJlbWFpbmluZyB0aW1lIGRpc3BsYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgb3IgYGR1cmF0aW9uY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3RpbWV1cGRhdGVcbiAgICogQGxpc3RlbnMgUGxheWVyI2R1cmF0aW9uY2hhbmdlXG4gICAqL1xuXG5cbiAgUmVtYWluaW5nVGltZURpc3BsYXkucHJvdG90eXBlLnVwZGF0ZUNvbnRlbnQgPSBmdW5jdGlvbiB1cGRhdGVDb250ZW50KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnBsYXllcl8uZHVyYXRpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEBkZXByZWNhdGVkIFdlIHNob3VsZCBvbmx5IHVzZSByZW1haW5pbmdUaW1lRGlzcGxheVxuICAgIC8vIGFzIG9mIHZpZGVvLmpzIDdcbiAgICBpZiAodGhpcy5wbGF5ZXJfLnJlbWFpbmluZ1RpbWVEaXNwbGF5KSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRoaXMucGxheWVyXy5yZW1haW5pbmdUaW1lRGlzcGxheSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVGb3JtYXR0ZWRUaW1lXyh0aGlzLnBsYXllcl8ucmVtYWluaW5nVGltZSgpKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHBsYXllciBmaXJlcyBlbmRlZCB0aGVyZSBzaG91bGQgYmUgbm8gdGltZSBsZWZ0LiBTYWRseVxuICAgKiB0aGlzIGlzIG5vdCBhbHdheXMgdGhlIGNhc2UsIGxldHMgbWFrZSBpdCBzZWVtIGxpa2UgdGhhdCBpcyB0aGUgY2FzZVxuICAgKiBmb3IgdXNlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgZW5kZWRgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjZW5kZWRcbiAgICovXG5cblxuICBSZW1haW5pbmdUaW1lRGlzcGxheS5wcm90b3R5cGUuaGFuZGxlRW5kZWQgPSBmdW5jdGlvbiBoYW5kbGVFbmRlZChldmVudCkge1xuICAgIGlmICghdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVGb3JtYXR0ZWRUaW1lXygwKTtcbiAgfTtcblxuICByZXR1cm4gUmVtYWluaW5nVGltZURpc3BsYXk7XG59KFRpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBgUmVtYWluaW5nVGltZURpc3BsYXlgIGZvciBzY3JlZW4gcmVhZGVyIHVzZXJzLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuUmVtYWluaW5nVGltZURpc3BsYXkucHJvdG90eXBlLmxhYmVsVGV4dF8gPSAnUmVtYWluaW5nIFRpbWUnO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYFJlbWFpbmluZ1RpbWVEaXNwbGF5YHMgY29udHJvbHMuIEFkZGVkIHRvIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKlxuICogQGRlcHJlY2F0ZWQgaW4gdjc7IGNvbnRyb2xUZXh0XyBpcyBub3QgdXNlZCBpbiBub24tYWN0aXZlIGRpc3BsYXkgQ29tcG9uZW50c1xuICovXG5SZW1haW5pbmdUaW1lRGlzcGxheS5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ1JlbWFpbmluZyBUaW1lJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdSZW1haW5pbmdUaW1lRGlzcGxheScsIFJlbWFpbmluZ1RpbWVEaXNwbGF5KTtcblxuLyoqXG4gKiBAZmlsZSBsaXZlLWRpc3BsYXkuanNcbiAqL1xuLy8gVE9ETyAtIEZ1dHVyZSBtYWtlIGl0IGNsaWNrIHRvIHNuYXAgdG8gbGl2ZVxuXG4vKipcbiAqIERpc3BsYXlzIHRoZSBsaXZlIGluZGljYXRvciB3aGVuIGR1cmF0aW9uIGlzIEluZmluaXR5LlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBMaXZlRGlzcGxheSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKExpdmVEaXNwbGF5LCBfQ29tcG9uZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIExpdmVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExpdmVEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMudXBkYXRlU2hvd2luZygpO1xuICAgIF90aGlzLm9uKF90aGlzLnBsYXllcigpLCAnZHVyYXRpb25jaGFuZ2UnLCBfdGhpcy51cGRhdGVTaG93aW5nKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG5cblxuICBMaXZlRGlzcGxheS5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHtcbiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbGl2ZS1jb250cm9sIHZqcy1jb250cm9sJ1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb250ZW50RWxfID0gY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1saXZlLWRpc3BsYXknLFxuICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+JyArIHRoaXMubG9jYWxpemUoJ1N0cmVhbSBUeXBlJykgKyAnXFx4QTA8L3NwYW4+JyArIHRoaXMubG9jYWxpemUoJ0xJVkUnKVxuICAgIH0sIHtcbiAgICAgICdhcmlhLWxpdmUnOiAnb2ZmJ1xuICAgIH0pO1xuXG4gICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50RWxfKTtcbiAgICByZXR1cm4gZWw7XG4gIH07XG5cbiAgTGl2ZURpc3BsYXkucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHRoaXMuY29udGVudEVsXyA9IG51bGw7XG5cbiAgICBfQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSBkdXJhdGlvbiB0byBzZWUgaWYgdGhlIExpdmVEaXNwbGF5IHNob3VsZCBiZSBzaG93aW5nIG9yIG5vdC4gVGhlbiBzaG93L2hpZGVcbiAgICogaXQgYWNjb3JkaW5nbHlcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIHtAbGluayBQbGF5ZXIjZHVyYXRpb25jaGFuZ2V9IGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjZHVyYXRpb25jaGFuZ2VcbiAgICovXG5cblxuICBMaXZlRGlzcGxheS5wcm90b3R5cGUudXBkYXRlU2hvd2luZyA9IGZ1bmN0aW9uIHVwZGF0ZVNob3dpbmcoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIoKS5kdXJhdGlvbigpID09PSBJbmZpbml0eSkge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTGl2ZURpc3BsYXk7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTGl2ZURpc3BsYXknLCBMaXZlRGlzcGxheSk7XG5cbi8qKlxuICogQGZpbGUgc2xpZGVyLmpzXG4gKi9cbi8qKlxuICogVGhlIGJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgYSBzbGlkZXIuIENhbiBiZSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsLlxuICogRm9yIGluc3RhbmNlIHRoZSB2b2x1bWUgYmFyIG9yIHRoZSBzZWVrIGJhciBvbiBhIHZpZGVvIGlzIGEgc2xpZGVyLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBTbGlkZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhTbGlkZXIsIF9Db21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFNsaWRlcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTbGlkZXIpO1xuXG4gICAgLy8gU2V0IHByb3BlcnR5IG5hbWVzIHRvIGJhciB0byBtYXRjaCB3aXRoIHRoZSBjaGlsZCBTbGlkZXIgY2xhc3MgaXMgbG9va2luZyBmb3JcbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLmJhciA9IF90aGlzLmdldENoaWxkKF90aGlzLm9wdGlvbnNfLmJhck5hbWUpO1xuXG4gICAgLy8gU2V0IGEgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBjbGFzcyBvbiB0aGUgc2xpZGVyIGRlcGVuZGluZyBvbiB0aGUgc2xpZGVyIHR5cGVcbiAgICBfdGhpcy52ZXJ0aWNhbCghIV90aGlzLm9wdGlvbnNfLnZlcnRpY2FsKTtcblxuICAgIF90aGlzLmVuYWJsZSgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmUgY29udHJvbHMgYXJlIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGlzIHNsaWRlciBvciBub3QuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqICAgICAgICAgdHJ1ZSBpZiBjb250cm9scyBhcmUgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5lbmFibGVkID0gZnVuY3Rpb24gZW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVkXztcbiAgfTtcblxuICAvKipcbiAgICogRW5hYmxlIGNvbnRyb2xzIGZvciB0aGlzIHNsaWRlciBpZiB0aGV5IGFyZSBkaXNhYmxlZFxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIGlmICh0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub24oJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlTW91c2VEb3duKTtcbiAgICB0aGlzLm9uKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVNb3VzZURvd24pO1xuICAgIHRoaXMub24oJ2ZvY3VzJywgdGhpcy5oYW5kbGVGb2N1cyk7XG4gICAgdGhpcy5vbignYmx1cicsIHRoaXMuaGFuZGxlQmx1cik7XG4gICAgdGhpcy5vbignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcblxuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCAnY29udHJvbHN2aXNpYmxlJywgdGhpcy51cGRhdGUpO1xuXG4gICAgaWYgKHRoaXMucGxheWVyRXZlbnQpIHtcbiAgICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCB0aGlzLnBsYXllckV2ZW50LCB0aGlzLnVwZGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAwKTtcblxuICAgIHRoaXMuZW5hYmxlZF8gPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGNvbnRyb2xzIGZvciB0aGlzIHNsaWRlciBpZiB0aGV5IGFyZSBlbmFibGVkXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBkb2MgPSB0aGlzLmJhci5lbF8ub3duZXJEb2N1bWVudDtcblxuICAgIHRoaXMub2ZmKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgdGhpcy5vZmYoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgdGhpcy5vZmYoJ2ZvY3VzJywgdGhpcy5oYW5kbGVGb2N1cyk7XG4gICAgdGhpcy5vZmYoJ2JsdXInLCB0aGlzLmhhbmRsZUJsdXIpO1xuICAgIHRoaXMub2ZmKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuICAgIHRoaXMub2ZmKHRoaXMucGxheWVyXywgJ2NvbnRyb2xzdmlzaWJsZScsIHRoaXMudXBkYXRlKTtcbiAgICB0aGlzLm9mZihkb2MsICdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7XG4gICAgdGhpcy5vZmYoZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgdGhpcy5vZmYoZG9jLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcblxuICAgIHRoaXMuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cbiAgICBpZiAodGhpcy5wbGF5ZXJFdmVudCkge1xuICAgICAgdGhpcy5vZmYodGhpcy5wbGF5ZXJfLCB0aGlzLnBsYXllckV2ZW50LCB0aGlzLnVwZGF0ZSk7XG4gICAgfVxuICAgIHRoaXMuZW5hYmxlZF8gPSBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQnV0dG9uYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqICAgICAgICBUeXBlIG9mIGVsZW1lbnQgdG8gY3JlYXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BzPXt9XVxuICAgKiAgICAgICAgTGlzdCBvZiBwcm9wZXJ0aWVzIGluIE9iamVjdCBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2F0dHJpYnV0ZXM9e31dXG4gICAqICAgICAgICBsaXN0IG9mIGF0dHJpYnV0ZXMgaW4gT2JqZWN0IGZvcm0uXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKHR5cGUpIHtcbiAgICB2YXIgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIC8vIEFkZCB0aGUgc2xpZGVyIGVsZW1lbnQgY2xhc3MgdG8gYWxsIHN1YiBjbGFzc2VzXG4gICAgcHJvcHMuY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lICsgJyB2anMtc2xpZGVyJztcbiAgICBwcm9wcyA9IGFzc2lnbih7XG4gICAgICB0YWJJbmRleDogMFxuICAgIH0sIHByb3BzKTtcblxuICAgIGF0dHJpYnV0ZXMgPSBhc3NpZ24oe1xuICAgICAgJ3JvbGUnOiAnc2xpZGVyJyxcbiAgICAgICdhcmlhLXZhbHVlbm93JzogMCxcbiAgICAgICdhcmlhLXZhbHVlbWluJzogMCxcbiAgICAgICdhcmlhLXZhbHVlbWF4JzogMTAwLFxuICAgICAgJ3RhYkluZGV4JzogMFxuICAgIH0sIGF0dHJpYnV0ZXMpO1xuXG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgdHlwZSwgcHJvcHMsIGF0dHJpYnV0ZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYG1vdXNlZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50cyBvbiB0aGUgYFNsaWRlcmAuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZWRvd25cbiAgICogQGxpc3RlbnMgdG91Y2hzdGFydFxuICAgKiBAZmlyZXMgU2xpZGVyI3NsaWRlcmFjdGl2ZVxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2ZW50KSB7XG4gICAgdmFyIGRvYyA9IHRoaXMuYmFyLmVsXy5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICAvLyBEbyBub3QgY2FsbCBwcmV2ZW50RGVmYXVsdCgpIG9uIHRvdWNoc3RhcnQgaW4gQ2hyb21lXG4gICAgLy8gdG8gYXZvaWQgY29uc29sZSB3YXJuaW5ncy4gVXNlIGEgJ3RvdWNoLWFjdGlvbjogbm9uZScgc3R5bGVcbiAgICAvLyBpbnN0ZWFkIHRvIHByZXZlbnQgdW5pbnRlbnRlZCBzY3JvbGxpbmcuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wMS9zY3JvbGxpbmctaW50ZXJ2ZW50aW9uXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0b3VjaHN0YXJ0JyAmJiAhSVNfQ0hST01FKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBibG9ja1RleHRTZWxlY3Rpb24oKTtcblxuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zbGlkaW5nJyk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIHNsaWRlciBpcyBpbiBhbiBhY3RpdmUgc3RhdGVcbiAgICAgKlxuICAgICAqIEBldmVudCBTbGlkZXIjc2xpZGVyYWN0aXZlXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignc2xpZGVyYWN0aXZlJyk7XG5cbiAgICB0aGlzLm9uKGRvYywgJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTtcbiAgICB0aGlzLm9uKGRvYywgJ21vdXNldXAnLCB0aGlzLmhhbmRsZU1vdXNlVXApO1xuICAgIHRoaXMub24oZG9jLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub24oZG9jLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZU1vdXNlVXApO1xuXG4gICAgdGhpcy5oYW5kbGVNb3VzZU1vdmUoZXZlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGhlIGBtb3VzZW1vdmVgLCBgdG91Y2htb3ZlYCwgYW5kIGBtb3VzZWRvd25gIGV2ZW50cyBvbiB0aGlzIGBTbGlkZXJgLlxuICAgKiBUaGUgYG1vdXNlbW92ZWAgYW5kIGB0b3VjaG1vdmVgIGV2ZW50cyB3aWxsIG9ubHkgb25seSB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24gZHVyaW5nXG4gICAqIGBtb3VzZWRvd25gIGFuZCBgdG91Y2hzdGFydGAuIFRoaXMgaXMgZHVlIHRvIHtAbGluayBTbGlkZXIjaGFuZGxlTW91c2VEb3dufSBhbmRcbiAgICoge0BsaW5rIFNsaWRlciNoYW5kbGVNb3VzZVVwfS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZWRvd25gLCBgbW91c2Vtb3ZlYCwgYHRvdWNoc3RhcnRgLCBvciBgdG91Y2htb3ZlYCBldmVudCB0aGF0IHRyaWdnZXJlZFxuICAgKiAgICAgICAgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZW1vdmVcbiAgICogQGxpc3RlbnMgdG91Y2htb3ZlXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5oYW5kbGVNb3VzZU1vdmUgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpIHt9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYG1vdXNldXBgIG9yIGB0b3VjaGVuZGAgZXZlbnRzIG9uIHRoZSBgU2xpZGVyYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZXVwYCBvciBgdG91Y2hlbmRgIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRvdWNoZW5kXG4gICAqIEBsaXN0ZW5zIG1vdXNldXBcbiAgICogQGZpcmVzIFNsaWRlciNzbGlkZXJpbmFjdGl2ZVxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlTW91c2VVcCA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlVXAoKSB7XG4gICAgdmFyIGRvYyA9IHRoaXMuYmFyLmVsXy5vd25lckRvY3VtZW50O1xuXG4gICAgdW5ibG9ja1RleHRTZWxlY3Rpb24oKTtcblxuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zbGlkaW5nJyk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIHNsaWRlciBpcyBubyBsb25nZXIgaW4gYW4gYWN0aXZlIHN0YXRlLlxuICAgICAqXG4gICAgICogQGV2ZW50IFNsaWRlciNzbGlkZXJpbmFjdGl2ZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ3NsaWRlcmluYWN0aXZlJyk7XG5cbiAgICB0aGlzLm9mZihkb2MsICdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7XG4gICAgdGhpcy5vZmYoZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgdGhpcy5vZmYoZG9jLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcblxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgYmFyIG9mIHRoZSBgU2xpZGVyYC5cbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICogICAgICAgICAgVGhlIHBlcmNlbnRhZ2Ugb2YgcHJvZ3Jlc3MgdGhlIHByb2dyZXNzIGJhciByZXByZXNlbnRzIGFzIGFcbiAgICogICAgICAgICAgbnVtYmVyIGZyb20gMCB0byAxLlxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG4gICAgLy8gSW4gVm9sdW1lQmFyIGluaXQgd2UgaGF2ZSBhIHNldFRpbWVvdXQgZm9yIHVwZGF0ZSB0aGF0IHBvcHMgYW5kIHVwZGF0ZVxuICAgIC8vIHRvIHRoZSBlbmQgb2YgdGhlIGV4ZWN1dGlvbiBzdGFjay4gVGhlIHBsYXllciBpcyBkZXN0cm95ZWQgYmVmb3JlIHRoZW5cbiAgICAvLyB1cGRhdGUgd2lsbCBjYXVzZSBhbiBlcnJvclxuICAgIGlmICghdGhpcy5lbF8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBzY3J1YmJpbmcsIHdlIGNvdWxkIHVzZSBhIGNhY2hlZCB2YWx1ZSB0byBtYWtlIHRoZSBoYW5kbGUga2VlcCB1cFxuICAgIC8vIHdpdGggdGhlIHVzZXIncyBtb3VzZS4gT24gSFRNTDUgYnJvd3NlcnMgc2NydWJiaW5nIGlzIHJlYWxseSBzbW9vdGgsIGJ1dFxuICAgIC8vIHNvbWUgZmxhc2ggcGxheWVycyBhcmUgc2xvdywgc28gd2UgbWlnaHQgd2FudCB0byB1dGlsaXplIHRoaXMgbGF0ZXIuXG4gICAgLy8gdmFyIHByb2dyZXNzID0gICh0aGlzLnBsYXllcl8uc2NydWJiaW5nKCkpID8gdGhpcy5wbGF5ZXJfLmdldENhY2hlKCkuY3VycmVudFRpbWUgLyB0aGlzLnBsYXllcl8uZHVyYXRpb24oKSA6IHRoaXMucGxheWVyXy5jdXJyZW50VGltZSgpIC8gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG4gICAgdmFyIHByb2dyZXNzID0gdGhpcy5nZXRQZXJjZW50KCk7XG4gICAgdmFyIGJhciA9IHRoaXMuYmFyO1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBiYXIuLi5cbiAgICBpZiAoIWJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb3RlY3QgYWdhaW5zdCBubyBkdXJhdGlvbiBhbmQgb3RoZXIgZGl2aXNpb24gaXNzdWVzXG4gICAgaWYgKHR5cGVvZiBwcm9ncmVzcyAhPT0gJ251bWJlcicgfHwgcHJvZ3Jlc3MgIT09IHByb2dyZXNzIHx8IHByb2dyZXNzIDwgMCB8fCBwcm9ncmVzcyA9PT0gSW5maW5pdHkpIHtcbiAgICAgIHByb2dyZXNzID0gMDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIGEgcGVyY2VudGFnZSBmb3Igc2V0dGluZ1xuICAgIHZhciBwZXJjZW50YWdlID0gKHByb2dyZXNzICogMTAwKS50b0ZpeGVkKDIpICsgJyUnO1xuICAgIHZhciBzdHlsZSA9IGJhci5lbCgpLnN0eWxlO1xuXG4gICAgLy8gU2V0IHRoZSBuZXcgYmFyIHdpZHRoIG9yIGhlaWdodFxuICAgIGlmICh0aGlzLnZlcnRpY2FsKCkpIHtcbiAgICAgIHN0eWxlLmhlaWdodCA9IHBlcmNlbnRhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLndpZHRoID0gcGVyY2VudGFnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBkaXN0YW5jZSBmb3Igc2xpZGVyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgU2xpZGVyLlxuICAgKiAgICAgICAgIC0gcG9zdGl0aW9uLnggZm9yIHZlcnRpY2FsIGBTbGlkZXJgc1xuICAgKiAgICAgICAgIC0gcG9zdGl0aW9uLnkgZm9yIGhvcml6b250YWwgYFNsaWRlcmBzXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5jYWxjdWxhdGVEaXN0YW5jZSA9IGZ1bmN0aW9uIGNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9pbnRlclBvc2l0aW9uKHRoaXMuZWxfLCBldmVudCk7XG5cbiAgICBpZiAodGhpcy52ZXJ0aWNhbCgpKSB7XG4gICAgICByZXR1cm4gcG9zaXRpb24ueTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uLng7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGBmb2N1c2AgZXZlbnQgb24gdGhpcyBgU2xpZGVyYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgZm9jdXNgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBmb2N1c1xuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cygpIHtcbiAgICB0aGlzLm9uKHRoaXMuYmFyLmVsXy5vd25lckRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5UHJlc3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBga2V5ZG93bmAgZXZlbnQgb24gdGhlIGBTbGlkZXJgLiBXYXRjaGVzIGZvciBsZWZ0LCByaWd0aCwgdXAsIGFuZCBkb3duXG4gICAqIGFycm93IGtleXMuIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBzbGlkZXIgaGFzIGZvY3VzLiBTZWVcbiAgICoge0BsaW5rIFNsaWRlciNoYW5kbGVGb2N1c30gYW5kIHtAbGluayBTbGlkZXIjaGFuZGxlQmx1cn0uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICB0aGUgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqL1xuXG5cbiAgU2xpZGVyLnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7XG4gICAgLy8gTGVmdCBhbmQgRG93biBBcnJvd3NcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDM3IHx8IGV2ZW50LndoaWNoID09PSA0MCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEJhY2soKTtcblxuICAgICAgLy8gVXAgYW5kIFJpZ2h0IEFycm93c1xuICAgIH0gZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IDM4IHx8IGV2ZW50LndoaWNoID09PSAzOSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEZvcndhcmQoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGBibHVyYCBldmVudCBvbiB0aGlzIGBTbGlkZXJgLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBibHVyYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgYmx1clxuICAgKi9cblxuICBTbGlkZXIucHJvdG90eXBlLmhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKCkge1xuICAgIHRoaXMub2ZmKHRoaXMuYmFyLmVsXy5vd25lckRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5UHJlc3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMaXN0ZW5lciBmb3IgY2xpY2sgZXZlbnRzIG9uIHNsaWRlciwgdXNlZCB0byBwcmV2ZW50IGNsaWNrc1xuICAgKiAgIGZyb20gYnViYmxpbmcgdXAgdG8gcGFyZW50IGVsZW1lbnRzIGxpa2UgYnV0dG9uIG1lbnVzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICAgICAgIEV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgb2JqZWN0IHRvIHJ1blxuICAgKi9cblxuXG4gIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgaWYgc2xpZGVyIGlzIGhvcml6b250YWwgZm9yIHZlcnRpY2FsXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Jvb2xdXG4gICAqICAgICAgICAtIHRydWUgaWYgc2xpZGVyIGlzIHZlcnRpY2FsLFxuICAgKiAgICAgICAgLSBmYWxzZSBpcyBob3Jpem9udGFsXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqICAgICAgICAgLSB0cnVlIGlmIHNsaWRlciBpcyB2ZXJ0aWNhbCwgYW5kIGdldHRpbmdcbiAgICogICAgICAgICAtIGZhbHNlIGlmIHRoZSBzbGlkZXIgaXMgaG9yaXpvbnRhbCwgYW5kIGdldHRpbmdcbiAgICovXG5cblxuICBTbGlkZXIucHJvdG90eXBlLnZlcnRpY2FsID0gZnVuY3Rpb24gdmVydGljYWwoYm9vbCkge1xuICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsXyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnZlcnRpY2FsXyA9ICEhYm9vbDtcblxuICAgIGlmICh0aGlzLnZlcnRpY2FsXykge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLXNsaWRlci12ZXJ0aWNhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtc2xpZGVyLWhvcml6b250YWwnKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFNsaWRlcjtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdTbGlkZXInLCBTbGlkZXIpO1xuXG4vKipcbiAqIEBmaWxlIGxvYWQtcHJvZ3Jlc3MtYmFyLmpzXG4gKi9cbi8qKlxuICogU2hvd3MgbG9hZGluZyBwcm9ncmVzc1xuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBMb2FkUHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhMb2FkUHJvZ3Jlc3NCYXIsIF9Db21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gTG9hZFByb2dyZXNzQmFyKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExvYWRQcm9ncmVzc0Jhcik7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnBhcnRFbHNfID0gW107XG4gICAgX3RoaXMub24ocGxheWVyLCAncHJvZ3Jlc3MnLCBfdGhpcy51cGRhdGUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgJ3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIExvYWRQcm9ncmVzc0Jhci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHtcbiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLWxvYWQtcHJvZ3Jlc3MnLFxuICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+PHNwYW4+JyArIHRoaXMubG9jYWxpemUoJ0xvYWRlZCcpICsgJzwvc3Bhbj46IDAlPC9zcGFuPidcbiAgICB9KTtcbiAgfTtcblxuICBMb2FkUHJvZ3Jlc3NCYXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHRoaXMucGFydEVsc18gPSBudWxsO1xuXG4gICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgcHJvZ3Jlc3MgYmFyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgcHJvZ3Jlc3NgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjcHJvZ3Jlc3NcbiAgICovXG5cblxuICBMb2FkUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShldmVudCkge1xuICAgIHZhciBidWZmZXJlZCA9IHRoaXMucGxheWVyXy5idWZmZXJlZCgpO1xuICAgIHZhciBkdXJhdGlvbiA9IHRoaXMucGxheWVyXy5kdXJhdGlvbigpO1xuICAgIHZhciBidWZmZXJlZEVuZCA9IHRoaXMucGxheWVyXy5idWZmZXJlZEVuZCgpO1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucGFydEVsc187XG5cbiAgICAvLyBnZXQgdGhlIHBlcmNlbnQgd2lkdGggb2YgYSB0aW1lIGNvbXBhcmVkIHRvIHRoZSB0b3RhbCBlbmRcbiAgICB2YXIgcGVyY2VudGlmeSA9IGZ1bmN0aW9uIHBlcmNlbnRpZnkodGltZSwgZW5kKSB7XG4gICAgICAvLyBubyBOYU5cbiAgICAgIHZhciBwZXJjZW50ID0gdGltZSAvIGVuZCB8fCAwO1xuXG4gICAgICByZXR1cm4gKHBlcmNlbnQgPj0gMSA/IDEgOiBwZXJjZW50KSAqIDEwMCArICclJztcbiAgICB9O1xuXG4gICAgLy8gdXBkYXRlIHRoZSB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3MgYmFyXG4gICAgdGhpcy5lbF8uc3R5bGUud2lkdGggPSBwZXJjZW50aWZ5KGJ1ZmZlcmVkRW5kLCBkdXJhdGlvbik7XG5cbiAgICAvLyBhZGQgY2hpbGQgZWxlbWVudHMgdG8gcmVwcmVzZW50IHRoZSBpbmRpdmlkdWFsIGJ1ZmZlcmVkIHRpbWUgcmFuZ2VzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0YXJ0ID0gYnVmZmVyZWQuc3RhcnQoaSk7XG4gICAgICB2YXIgZW5kID0gYnVmZmVyZWQuZW5kKGkpO1xuICAgICAgdmFyIHBhcnQgPSBjaGlsZHJlbltpXTtcblxuICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgIHBhcnQgPSB0aGlzLmVsXy5hcHBlbmRDaGlsZChjcmVhdGVFbCgpKTtcbiAgICAgICAgY2hpbGRyZW5baV0gPSBwYXJ0O1xuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIHBlcmNlbnQgYmFzZWQgb24gdGhlIHdpZHRoIG9mIHRoZSBwcm9ncmVzcyBiYXIgKGJ1ZmZlcmVkRW5kKVxuICAgICAgcGFydC5zdHlsZS5sZWZ0ID0gcGVyY2VudGlmeShzdGFydCwgYnVmZmVyZWRFbmQpO1xuICAgICAgcGFydC5zdHlsZS53aWR0aCA9IHBlcmNlbnRpZnkoZW5kIC0gc3RhcnQsIGJ1ZmZlcmVkRW5kKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdW51c2VkIGJ1ZmZlcmVkIHJhbmdlIGVsZW1lbnRzXG4gICAgZm9yICh2YXIgX2kgPSBjaGlsZHJlbi5sZW5ndGg7IF9pID4gYnVmZmVyZWQubGVuZ3RoOyBfaS0tKSB7XG4gICAgICB0aGlzLmVsXy5yZW1vdmVDaGlsZChjaGlsZHJlbltfaSAtIDFdKTtcbiAgICB9XG4gICAgY2hpbGRyZW4ubGVuZ3RoID0gYnVmZmVyZWQubGVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBMb2FkUHJvZ3Jlc3NCYXI7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTG9hZFByb2dyZXNzQmFyJywgTG9hZFByb2dyZXNzQmFyKTtcblxuLyoqXG4gKiBAZmlsZSB0aW1lLXRvb2x0aXAuanNcbiAqL1xuLyoqXG4gKiBUaW1lIHRvb2x0aXBzIGRpc3BsYXkgYSB0aW1lIGFib3ZlIHRoZSBwcm9ncmVzcyBiYXIuXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIFRpbWVUb29sdGlwID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoVGltZVRvb2x0aXAsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRpbWVUb29sdGlwKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRpbWVUb29sdGlwKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgdGltZSB0b29sdGlwIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIFRpbWVUb29sdGlwLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdGltZS10b29sdGlwJ1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdGltZSB0b29sdGlwIHJlbGF0aXZlIHRvIHRoZSBgU2Vla0JhcmAuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZWVrQmFyUmVjdFxuICAgKiAgICAgICAgVGhlIGBDbGllbnRSZWN0YCBmb3IgdGhlIHtAbGluayBTZWVrQmFyfSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2Vla0JhclBvaW50XG4gICAqICAgICAgICBBIG51bWJlciBmcm9tIDAgdG8gMSwgcmVwcmVzZW50aW5nIGEgaG9yaXpvbnRhbCByZWZlcmVuY2UgcG9pbnRcbiAgICogICAgICAgIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUge0BsaW5rIFNlZWtCYXJ9XG4gICAqL1xuXG5cbiAgVGltZVRvb2x0aXAucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50LCBjb250ZW50KSB7XG4gICAgdmFyIHRvb2x0aXBSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRoaXMuZWxfKTtcbiAgICB2YXIgcGxheWVyUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLnBsYXllcl8uZWwoKSk7XG4gICAgdmFyIHNlZWtCYXJQb2ludFB4ID0gc2Vla0JhclJlY3Qud2lkdGggKiBzZWVrQmFyUG9pbnQ7XG5cbiAgICAvLyBkbyBub3RoaW5nIGlmIGVpdGhlciByZWN0IGlzbid0IGF2YWlsYWJsZVxuICAgIC8vIGZvciBleGFtcGxlLCBpZiB0aGUgcGxheWVyIGlzbid0IGluIHRoZSBET00gZm9yIHRlc3RpbmdcbiAgICBpZiAoIXBsYXllclJlY3QgfHwgIXRvb2x0aXBSZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgc3BhY2UgbGVmdCBvZiB0aGUgYHNlZWtCYXJQb2ludGAgYXZhaWxhYmxlIHdpdGhpbiB0aGUgYm91bmRzXG4gICAgLy8gb2YgdGhlIHBsYXllci4gV2UgY2FsY3VsYXRlIGFueSBnYXAgYmV0d2VlbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBwbGF5ZXJcbiAgICAvLyBhbmQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgYFNlZWtCYXJgIGFuZCBhZGQgdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlXG4gICAgLy8gYFNlZWtCYXJgIGJlZm9yZSBoaXR0aW5nIHRoZSBgc2Vla0JhclBvaW50YFxuICAgIHZhciBzcGFjZUxlZnRPZlBvaW50ID0gc2Vla0JhclJlY3QubGVmdCAtIHBsYXllclJlY3QubGVmdCArIHNlZWtCYXJQb2ludFB4O1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgc3BhY2UgcmlnaHQgb2YgdGhlIGBzZWVrQmFyUG9pbnRgIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGJvdW5kc1xuICAgIC8vIG9mIHRoZSBwbGF5ZXIuIFdlIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBpeGVscyBmcm9tIHRoZSBgc2Vla0JhclBvaW50YFxuICAgIC8vIHRvIHRoZSByaWdodCBlZGdlIG9mIHRoZSBgU2Vla0JhcmAgYW5kIGFkZCB0byB0aGF0IGFueSBnYXAgYmV0d2VlbiB0aGVcbiAgICAvLyByaWdodCBlZGdlIG9mIHRoZSBgU2Vla0JhcmAgYW5kIHRoZSBwbGF5ZXIuXG4gICAgdmFyIHNwYWNlUmlnaHRPZlBvaW50ID0gc2Vla0JhclJlY3Qud2lkdGggLSBzZWVrQmFyUG9pbnRQeCArIChwbGF5ZXJSZWN0LnJpZ2h0IC0gc2Vla0JhclJlY3QucmlnaHQpO1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHBpeGVscyBieSB3aGljaCB0aGUgdG9vbHRpcCB3aWxsIG5lZWQgdG8gYmUgcHVsbGVkXG4gICAgLy8gZnVydGhlciB0byB0aGUgcmlnaHQgdG8gY2VudGVyIGl0IG92ZXIgdGhlIGBzZWVrQmFyUG9pbnRgLlxuICAgIHZhciBwdWxsVG9vbHRpcEJ5ID0gdG9vbHRpcFJlY3Qud2lkdGggLyAyO1xuXG4gICAgLy8gQWRqdXN0IHRoZSBgcHVsbFRvb2x0aXBCeWAgZGlzdGFuY2UgdG8gdGhlIGxlZnQgb3IgcmlnaHQgZGVwZW5kaW5nIG9uXG4gICAgLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHNwYWNlIGNhbGN1bGF0aW9ucyBhYm92ZS5cbiAgICBpZiAoc3BhY2VMZWZ0T2ZQb2ludCA8IHB1bGxUb29sdGlwQnkpIHtcbiAgICAgIHB1bGxUb29sdGlwQnkgKz0gcHVsbFRvb2x0aXBCeSAtIHNwYWNlTGVmdE9mUG9pbnQ7XG4gICAgfSBlbHNlIGlmIChzcGFjZVJpZ2h0T2ZQb2ludCA8IHB1bGxUb29sdGlwQnkpIHtcbiAgICAgIHB1bGxUb29sdGlwQnkgPSBzcGFjZVJpZ2h0T2ZQb2ludDtcbiAgICB9XG5cbiAgICAvLyBEdWUgdG8gdGhlIGltcHJlY2lzaW9uIG9mIGRlY2ltYWwvcmF0aW8gYmFzZWQgY2FsY3VsYXRpb25zIGFuZCB2YXJ5aW5nXG4gICAgLy8gcm91bmRpbmcgYmVoYXZpb3JzLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHNwYWNpbmcgYWRqdXN0bWVudCBpcyBvZmZcbiAgICAvLyBieSBhIHBpeGVsIG9yIHR3by4gVGhpcyBhZGRzIGluc3VyYW5jZSB0byB0aGVzZSBjYWxjdWxhdGlvbnMuXG4gICAgaWYgKHB1bGxUb29sdGlwQnkgPCAwKSB7XG4gICAgICBwdWxsVG9vbHRpcEJ5ID0gMDtcbiAgICB9IGVsc2UgaWYgKHB1bGxUb29sdGlwQnkgPiB0b29sdGlwUmVjdC53aWR0aCkge1xuICAgICAgcHVsbFRvb2x0aXBCeSA9IHRvb2x0aXBSZWN0LndpZHRoO1xuICAgIH1cblxuICAgIHRoaXMuZWxfLnN0eWxlLnJpZ2h0ID0gJy0nICsgcHVsbFRvb2x0aXBCeSArICdweCc7XG4gICAgdGV4dENvbnRlbnQodGhpcy5lbF8sIGNvbnRlbnQpO1xuICB9O1xuXG4gIHJldHVybiBUaW1lVG9vbHRpcDtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUaW1lVG9vbHRpcCcsIFRpbWVUb29sdGlwKTtcblxuLyoqXG4gKiBAZmlsZSBwbGF5LXByb2dyZXNzLWJhci5qc1xuICovXG4vKipcbiAqIFVzZWQgYnkge0BsaW5rIFNlZWtCYXJ9IHRvIGRpc3BsYXkgbWVkaWEgcGxheWJhY2sgcHJvZ3Jlc3MgYXMgcGFydCBvZiB0aGVcbiAqIHtAbGluayBQcm9ncmVzc0NvbnRyb2x9LlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBQbGF5UHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhQbGF5UHJvZ3Jlc3NCYXIsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBsYXlQcm9ncmVzc0JhcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5UHJvZ3Jlc3NCYXIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSB0aGUgRE9NIGVsZW1lbnQgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIFBsYXlQcm9ncmVzc0Jhci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCgpIHtcbiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLXBsYXktcHJvZ3Jlc3MgdmpzLXNsaWRlci1iYXInLFxuICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+PHNwYW4+JyArIHRoaXMubG9jYWxpemUoJ1Byb2dyZXNzJykgKyAnPC9zcGFuPjogMCU8L3NwYW4+J1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyB1cGRhdGVzIHRvIGl0cyBvd24gRE9NIGFzIHdlbGwgYXMgdGhlIERPTSBvZiBpdHNcbiAgICoge0BsaW5rIFRpbWVUb29sdGlwfSBjaGlsZC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHNlZWtCYXJSZWN0XG4gICAqICAgICAgICBUaGUgYENsaWVudFJlY3RgIGZvciB0aGUge0BsaW5rIFNlZWtCYXJ9IGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZWVrQmFyUG9pbnRcbiAgICogICAgICAgIEEgbnVtYmVyIGZyb20gMCB0byAxLCByZXByZXNlbnRpbmcgYSBob3Jpem9udGFsIHJlZmVyZW5jZSBwb2ludFxuICAgKiAgICAgICAgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSB7QGxpbmsgU2Vla0Jhcn1cbiAgICovXG5cblxuICBQbGF5UHJvZ3Jlc3NCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50KSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyByQUYgSUQsIGNhbmNlbCBpdCBzbyB3ZSBkb24ndCBvdmVyLXF1ZXVlLlxuICAgIGlmICh0aGlzLnJhZklkXykge1xuICAgICAgdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJhZklkXyk7XG4gICAgfVxuXG4gICAgdGhpcy5yYWZJZF8gPSB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGltZSA9IF90aGlzMi5wbGF5ZXJfLnNjcnViYmluZygpID8gX3RoaXMyLnBsYXllcl8uZ2V0Q2FjaGUoKS5jdXJyZW50VGltZSA6IF90aGlzMi5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7XG5cbiAgICAgIHZhciBjb250ZW50ID0gZm9ybWF0VGltZSh0aW1lLCBfdGhpczIucGxheWVyXy5kdXJhdGlvbigpKTtcbiAgICAgIHZhciB0aW1lVG9vbHRpcCA9IF90aGlzMi5nZXRDaGlsZCgndGltZVRvb2x0aXAnKTtcblxuICAgICAgaWYgKHRpbWVUb29sdGlwKSB7XG4gICAgICAgIHRpbWVUb29sdGlwLnVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50LCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gUGxheVByb2dyZXNzQmFyO1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyBmb3Ige0BsaW5rIFBsYXlQcm9ncmVzc0Jhcn0uXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5QbGF5UHJvZ3Jlc3NCYXIucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBjaGlsZHJlbjogW11cbn07XG5cbi8vIFRpbWUgdG9vbHRpcHMgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBhIHBsYXllciBvbiBtb2JpbGUgZGV2aWNlcyBvciBJRThcbmlmICgoIUlFX1ZFUlNJT04gfHwgSUVfVkVSU0lPTiA+IDgpICYmICFJU19JT1MgJiYgIUlTX0FORFJPSUQpIHtcbiAgUGxheVByb2dyZXNzQmFyLnByb3RvdHlwZS5vcHRpb25zXy5jaGlsZHJlbi5wdXNoKCd0aW1lVG9vbHRpcCcpO1xufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1BsYXlQcm9ncmVzc0JhcicsIFBsYXlQcm9ncmVzc0Jhcik7XG5cbi8qKlxuICogQGZpbGUgbW91c2UtdGltZS1kaXNwbGF5LmpzXG4gKi9cbi8qKlxuICogVGhlIHtAbGluayBNb3VzZVRpbWVEaXNwbGF5fSBjb21wb25lbnQgdHJhY2tzIG1vdXNlIG1vdmVtZW50IG92ZXIgdGhlXG4gKiB7QGxpbmsgUHJvZ3Jlc3NDb250cm9sfS4gSXQgZGlzcGxheXMgYW4gaW5kaWNhdG9yIGFuZCBhIHtAbGluayBUaW1lVG9vbHRpcH1cbiAqIGluZGljYXRpbmcgdGhlIHRpbWUgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgYSBnaXZlbiBwb2ludCBpbiB0aGVcbiAqIHtAbGluayBQcm9ncmVzc0NvbnRyb2x9LlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBNb3VzZVRpbWVEaXNwbGF5ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoTW91c2VUaW1lRGlzcGxheSwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIHtAbGluayBQbGF5ZXJ9IHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBNb3VzZVRpbWVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1vdXNlVGltZURpc3BsYXkpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy51cGRhdGUgPSB0aHJvdHRsZShiaW5kKF90aGlzLCBfdGhpcy51cGRhdGUpLCAyNSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgRE9NIGVsZW1lbnQgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG5cblxuICBNb3VzZVRpbWVEaXNwbGF5LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbW91c2UtZGlzcGxheSdcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRW5xdWV1ZXMgdXBkYXRlcyB0byBpdHMgb3duIERPTSBhcyB3ZWxsIGFzIHRoZSBET00gb2YgaXRzXG4gICAqIHtAbGluayBUaW1lVG9vbHRpcH0gY2hpbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZWVrQmFyUmVjdFxuICAgKiAgICAgICAgVGhlIGBDbGllbnRSZWN0YCBmb3IgdGhlIHtAbGluayBTZWVrQmFyfSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2Vla0JhclBvaW50XG4gICAqICAgICAgICBBIG51bWJlciBmcm9tIDAgdG8gMSwgcmVwcmVzZW50aW5nIGEgaG9yaXpvbnRhbCByZWZlcmVuY2UgcG9pbnRcbiAgICogICAgICAgIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUge0BsaW5rIFNlZWtCYXJ9XG4gICAqL1xuXG5cbiAgTW91c2VUaW1lRGlzcGxheS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKHNlZWtCYXJSZWN0LCBzZWVrQmFyUG9pbnQpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIC8vIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHJBRiBJRCwgY2FuY2VsIGl0IHNvIHdlIGRvbid0IG92ZXItcXVldWUuXG4gICAgaWYgKHRoaXMucmFmSWRfKSB7XG4gICAgICB0aGlzLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmSWRfKTtcbiAgICB9XG5cbiAgICB0aGlzLnJhZklkXyA9IHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBkdXJhdGlvbiA9IF90aGlzMi5wbGF5ZXJfLmR1cmF0aW9uKCk7XG4gICAgICB2YXIgY29udGVudCA9IGZvcm1hdFRpbWUoc2Vla0JhclBvaW50ICogZHVyYXRpb24sIGR1cmF0aW9uKTtcblxuICAgICAgX3RoaXMyLmVsXy5zdHlsZS5sZWZ0ID0gc2Vla0JhclJlY3Qud2lkdGggKiBzZWVrQmFyUG9pbnQgKyAncHgnO1xuICAgICAgX3RoaXMyLmdldENoaWxkKCd0aW1lVG9vbHRpcCcpLnVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50LCBjb250ZW50KTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gTW91c2VUaW1lRGlzcGxheTtcbn0oQ29tcG9uZW50KTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIGBNb3VzZVRpbWVEaXNwbGF5YFxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuTW91c2VUaW1lRGlzcGxheS5wcm90b3R5cGUub3B0aW9uc18gPSB7XG4gIGNoaWxkcmVuOiBbJ3RpbWVUb29sdGlwJ11cbn07XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTW91c2VUaW1lRGlzcGxheScsIE1vdXNlVGltZURpc3BsYXkpO1xuXG4vKipcbiAqIEBmaWxlIHNlZWstYmFyLmpzXG4gKi9cbi8vIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGUgYHN0ZXAqYCBmdW5jdGlvbnMgbW92ZSB0aGUgdGltZWxpbmUuXG52YXIgU1RFUF9TRUNPTkRTID0gNTtcblxuLy8gVGhlIGludGVydmFsIGF0IHdoaWNoIHRoZSBiYXIgc2hvdWxkIHVwZGF0ZSBhcyBpdCBwcm9ncmVzc2VzLlxudmFyIFVQREFURV9SRUZSRVNIX0lOVEVSVkFMID0gMzA7XG5cbi8qKlxuICogU2VlayBiYXIgYW5kIGNvbnRhaW5lciBmb3IgdGhlIHByb2dyZXNzIGJhcnMuIFVzZXMge0BsaW5rIFBsYXlQcm9ncmVzc0Jhcn1cbiAqIGFzIGl0cyBgYmFyYC5cbiAqXG4gKiBAZXh0ZW5kcyBTbGlkZXJcbiAqL1xuXG52YXIgU2Vla0JhciA9IGZ1bmN0aW9uIChfU2xpZGVyKSB7XG4gIGluaGVyaXRzKFNlZWtCYXIsIF9TbGlkZXIpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gU2Vla0JhcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTZWVrQmFyKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1NsaWRlci5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMuc2V0RXZlbnRIYW5kbGVyc18oKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBTZWVrQmFyLnByb3RvdHlwZS5zZXRFdmVudEhhbmRsZXJzXyA9IGZ1bmN0aW9uIHNldEV2ZW50SGFuZGxlcnNfKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdGhpcy51cGRhdGUgPSB0aHJvdHRsZShiaW5kKHRoaXMsIHRoaXMudXBkYXRlKSwgVVBEQVRFX1JFRlJFU0hfSU5URVJWQUwpO1xuXG4gICAgdGhpcy5vbih0aGlzLnBsYXllcl8sICd0aW1ldXBkYXRlJywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCAnZW5kZWQnLCB0aGlzLmhhbmRsZUVuZGVkKTtcblxuICAgIC8vIHdoZW4gcGxheWluZywgbGV0J3MgZW5zdXJlIHdlIHNtb290aGx5IHVwZGF0ZSB0aGUgcGxheSBwcm9ncmVzcyBiYXJcbiAgICAvLyB2aWEgYW4gaW50ZXJ2YWxcbiAgICB0aGlzLnVwZGF0ZUludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCBbJ3BsYXlpbmcnXSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLmNsZWFySW50ZXJ2YWwoX3RoaXMyLnVwZGF0ZUludGVydmFsKTtcblxuICAgICAgX3RoaXMyLnVwZGF0ZUludGVydmFsID0gX3RoaXMyLnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnVwZGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIFVQREFURV9SRUZSRVNIX0lOVEVSVkFMKTtcbiAgICB9KTtcblxuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCBbJ2VuZGVkJywgJ3BhdXNlJywgJ3dhaXRpbmcnXSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLmNsZWFySW50ZXJ2YWwoX3RoaXMyLnVwZGF0ZUludGVydmFsKTtcbiAgICB9KTtcblxuICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCBbJ3RpbWV1cGRhdGUnLCAnZW5kZWQnXSwgdGhpcy51cGRhdGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgJ3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7XG4gICAgcmV0dXJuIF9TbGlkZXIucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1wcm9ncmVzcy1ob2xkZXInXG4gICAgfSwge1xuICAgICAgJ2FyaWEtbGFiZWwnOiB0aGlzLmxvY2FsaXplKCdQcm9ncmVzcyBCYXInKVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHBsYXkgcHJvZ3Jlc3MgYmFyIGFuZCBhY2Nlc3NpYmxpdHlcbiAgICogYXR0cmlidXRlcyB0byB3aGF0ZXZlciBpcyBwYXNzZWQgaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50VGltZVxuICAgKiAgICAgICAgVGhlIGN1cnJlbnRUaW1lIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFjY2Vzc2libGl0eVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGVyY2VudFxuICAgKiAgICAgICAgVGhlIHBlcmNlbnRhZ2UgYXMgYSBkZWNpbWFsIHRoYXQgdGhlIGJhciBzaG91bGQgYmUgZmlsbGVkIGZyb20gMC0xLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLnVwZGF0ZV8gPSBmdW5jdGlvbiB1cGRhdGVfKGN1cnJlbnRUaW1lLCBwZXJjZW50KSB7XG4gICAgdmFyIGR1cmF0aW9uID0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG5cbiAgICAvLyBtYWNoaW5lIHJlYWRhYmxlIHZhbHVlIG9mIHByb2dyZXNzIGJhciAocGVyY2VudGFnZSBjb21wbGV0ZSlcbiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCAocGVyY2VudCAqIDEwMCkudG9GaXhlZCgyKSk7XG5cbiAgICAvLyBodW1hbiByZWFkYWJsZSB2YWx1ZSBvZiBwcm9ncmVzcyBiYXIgKHRpbWUgY29tcGxldGUpXG4gICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVldGV4dCcsIHRoaXMubG9jYWxpemUoJ3Byb2dyZXNzIGJhciB0aW1pbmc6IGN1cnJlbnRUaW1lPXsxfSBkdXJhdGlvbj17Mn0nLCBbZm9ybWF0VGltZShjdXJyZW50VGltZSwgZHVyYXRpb24pLCBmb3JtYXRUaW1lKGR1cmF0aW9uLCBkdXJhdGlvbildLCAnezF9IG9mIHsyfScpKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYFBsYXlQcm9ncmVzc0JhcmAuXG4gICAgdGhpcy5iYXIudXBkYXRlKGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLmVsXyksIHBlcmNlbnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHNlZWsgYmFyJ3MgVUkuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgb3IgYGVuZGVkYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3RpbWV1cGRhdGVcbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICogICAgICAgICAgVGhlIGN1cnJlbnQgcGVyY2VudCBhdCBhIG51bWJlciBmcm9tIDAtMVxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShldmVudCkge1xuICAgIHZhciBwZXJjZW50ID0gX1NsaWRlci5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnVwZGF0ZV8odGhpcy5nZXRDdXJyZW50VGltZV8oKSwgcGVyY2VudCk7XG4gICAgcmV0dXJuIHBlcmNlbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgY3VycmVudCB0aW1lIGJ1dCBhbGxvd3MgZm9yIHNtb290aCBzY3J1YmJpbmcsXG4gICAqIHdoZW4gcGxheWVyIGNhbid0IGtlZXAgdXAuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB0aW1lIHZhbHVlIHRvIGRpc3BsYXlcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBTZWVrQmFyLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZV8gPSBmdW5jdGlvbiBnZXRDdXJyZW50VGltZV8oKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyXy5zY3J1YmJpbmcoKSA/IHRoaXMucGxheWVyXy5nZXRDYWNoZSgpLmN1cnJlbnRUaW1lIDogdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdlIHdhbnQgdGhlIHNlZWsgYmFyIHRvIGJlIGZ1bGwgb24gZW5kZWRcbiAgICogbm8gbWF0dGVyIHdoYXQgdGhlIGFjdHVhbCBpbnRlcm5hbCB2YWx1ZXMgYXJlLiBzbyB3ZSBmb3JjZSBpdC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGB0aW1ldXBkYXRlYCBvciBgZW5kZWRgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjZW5kZWRcbiAgICovXG5cblxuICBTZWVrQmFyLnByb3RvdHlwZS5oYW5kbGVFbmRlZCA9IGZ1bmN0aW9uIGhhbmRsZUVuZGVkKGV2ZW50KSB7XG4gICAgdGhpcy51cGRhdGVfKHRoaXMucGxheWVyXy5kdXJhdGlvbigpLCAxKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBwZXJjZW50YWdlIG9mIG1lZGlhIHBsYXllZCBzbyBmYXIuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgcGVyY2VudGFnZSBvZiBtZWRpYSBwbGF5ZWQgc28gZmFyICgwIHRvIDEpLlxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLmdldFBlcmNlbnQgPSBmdW5jdGlvbiBnZXRQZXJjZW50KCkge1xuICAgIHZhciBwZXJjZW50ID0gdGhpcy5nZXRDdXJyZW50VGltZV8oKSAvIHRoaXMucGxheWVyXy5kdXJhdGlvbigpO1xuXG4gICAgcmV0dXJuIHBlcmNlbnQgPj0gMSA/IDEgOiBwZXJjZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgbW91c2UgZG93biBvbiBzZWVrIGJhclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBtb3VzZWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZWRvd25cbiAgICovXG5cblxuICBTZWVrQmFyLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICBpZiAoIWlzU2luZ2xlTGVmdENsaWNrKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0b3AgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudCBkb3VibGUgZmlyZSBpbiBwcm9ncmVzcy1jb250cm9sLmpzXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5wbGF5ZXJfLnNjcnViYmluZyh0cnVlKTtcblxuICAgIHRoaXMudmlkZW9XYXNQbGF5aW5nID0gIXRoaXMucGxheWVyXy5wYXVzZWQoKTtcbiAgICB0aGlzLnBsYXllcl8ucGF1c2UoKTtcblxuICAgIF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZU1vdXNlRG93bi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIG1vdXNlIG1vdmUgb24gc2VlayBiYXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgbW91c2Vtb3ZlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgbW91c2Vtb3ZlXG4gICAqL1xuXG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuaGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgaWYgKCFpc1NpbmdsZUxlZnRDbGljayhldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV3VGltZSA9IHRoaXMuY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpICogdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG5cbiAgICAvLyBEb24ndCBsZXQgdmlkZW8gZW5kIHdoaWxlIHNjcnViYmluZy5cbiAgICBpZiAobmV3VGltZSA9PT0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkpIHtcbiAgICAgIG5ld1RpbWUgPSBuZXdUaW1lIC0gMC4xO1xuICAgIH1cblxuICAgIC8vIFNldCBuZXcgdGltZSAodGVsbCBwbGF5ZXIgdG8gc2VlayB0byBuZXcgdGltZSlcbiAgICB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUobmV3VGltZSk7XG4gIH07XG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIF9TbGlkZXIucHJvdG90eXBlLmVuYWJsZS5jYWxsKHRoaXMpO1xuICAgIHZhciBtb3VzZVRpbWVEaXNwbGF5ID0gdGhpcy5nZXRDaGlsZCgnbW91c2VUaW1lRGlzcGxheScpO1xuXG4gICAgaWYgKCFtb3VzZVRpbWVEaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbW91c2VUaW1lRGlzcGxheS5zaG93KCk7XG4gIH07XG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgX1NsaWRlci5wcm90b3R5cGUuZGlzYWJsZS5jYWxsKHRoaXMpO1xuICAgIHZhciBtb3VzZVRpbWVEaXNwbGF5ID0gdGhpcy5nZXRDaGlsZCgnbW91c2VUaW1lRGlzcGxheScpO1xuXG4gICAgaWYgKCFtb3VzZVRpbWVEaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbW91c2VUaW1lRGlzcGxheS5oaWRlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZSB1cCBvbiBzZWVrIGJhclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBtb3VzZXVwYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgbW91c2V1cFxuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLmhhbmRsZU1vdXNlVXAgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2ZW50KSB7XG4gICAgX1NsaWRlci5wcm90b3R5cGUuaGFuZGxlTW91c2VVcC5jYWxsKHRoaXMsIGV2ZW50KTtcblxuICAgIC8vIFN0b3AgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudCBkb3VibGUgZmlyZSBpbiBwcm9ncmVzcy1jb250cm9sLmpzXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5wbGF5ZXJfLnNjcnViYmluZyhmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIHRpbWV1cGRhdGUgYmVjYXVzZSB3ZSdyZSBkb25lIHNlZWtpbmcgYW5kIHRoZSB0aW1lIGhhcyBjaGFuZ2VkLlxuICAgICAqIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgaWYgdGhlIHBsYXllciBpcyBwYXVzZWQgdG8gdGltZSB0aGUgdGltZSBkaXNwbGF5cy5cbiAgICAgKlxuICAgICAqIEBldmVudCBUZWNoI3RpbWV1cGRhdGVcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy5wbGF5ZXJfLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7XG4gICAgaWYgKHRoaXMudmlkZW9XYXNQbGF5aW5nKSB7XG4gICAgICBzaWxlbmNlUHJvbWlzZSh0aGlzLnBsYXllcl8ucGxheSgpKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE1vdmUgbW9yZSBxdWlja2x5IGZhc3QgZm9yd2FyZCBmb3Iga2V5Ym9hcmQtb25seSB1c2Vyc1xuICAgKi9cblxuXG4gIFNlZWtCYXIucHJvdG90eXBlLnN0ZXBGb3J3YXJkID0gZnVuY3Rpb24gc3RlcEZvcndhcmQoKSB7XG4gICAgdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKHRoaXMucGxheWVyXy5jdXJyZW50VGltZSgpICsgU1RFUF9TRUNPTkRTKTtcbiAgfTtcblxuICAvKipcbiAgICogTW92ZSBtb3JlIHF1aWNrbHkgcmV3aW5kIGZvciBrZXlib2FyZC1vbmx5IHVzZXJzXG4gICAqL1xuXG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuc3RlcEJhY2sgPSBmdW5jdGlvbiBzdGVwQmFjaygpIHtcbiAgICB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUodGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCkgLSBTVEVQX1NFQ09ORFMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgcGxheWVyXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBlbnRlciBvciBzcGFjZSBpcyB1c2VkIG9uIHRoZSBzZWVrYmFyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG4gICAqXG4gICAqL1xuXG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuaGFuZGxlQWN0aW9uID0gZnVuY3Rpb24gaGFuZGxlQWN0aW9uKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMucGxheWVyXy5wYXVzZWQoKSkge1xuICAgICAgdGhpcy5wbGF5ZXJfLnBsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5ZXJfLnBhdXNlKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGlzIFNlZWtCYXIgaGFzIGZvY3VzIGFuZCBhIGtleSBnZXRzIHByZXNzZWQgZG93bi4gQnlcbiAgICogZGVmYXVsdCBpdCB3aWxsIGNhbGwgYHRoaXMuaGFuZGxlQWN0aW9uYCB3aGVuIHRoZSBrZXkgaXMgc3BhY2Ugb3IgZW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyBrZXlkb3duXG4gICAqL1xuXG5cbiAgU2Vla0Jhci5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVLZXlQcmVzcyhldmVudCkge1xuXG4gICAgLy8gU3VwcG9ydCBTcGFjZSAoMzIpIG9yIEVudGVyICgxMykga2V5IG9wZXJhdGlvbiB0byBmaXJlIGEgY2xpY2sgZXZlbnRcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDMyIHx8IGV2ZW50LndoaWNoID09PSAxMykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuaGFuZGxlQWN0aW9uKGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZUtleVByZXNzKSB7XG5cbiAgICAgIC8vIFBhc3Mga2V5cHJlc3MgaGFuZGxpbmcgdXAgZm9yIHVuc3VwcG9ydGVkIGtleXNcbiAgICAgIF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZUtleVByZXNzLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU2Vla0Jhcjtcbn0oU2xpZGVyKTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBgU2Vla0JhcmBcbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByaXZhdGVcbiAqL1xuXG5cblNlZWtCYXIucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBjaGlsZHJlbjogWydsb2FkUHJvZ3Jlc3NCYXInLCAncGxheVByb2dyZXNzQmFyJ10sXG4gIGJhck5hbWU6ICdwbGF5UHJvZ3Jlc3NCYXInXG59O1xuXG4vLyBNb3VzZVRpbWVEaXNwbGF5IHRvb2x0aXBzIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gYSBwbGF5ZXIgb24gbW9iaWxlIGRldmljZXMgb3IgSUU4XG5pZiAoKCFJRV9WRVJTSU9OIHx8IElFX1ZFUlNJT04gPiA4KSAmJiAhSVNfSU9TICYmICFJU19BTkRST0lEKSB7XG4gIFNlZWtCYXIucHJvdG90eXBlLm9wdGlvbnNfLmNoaWxkcmVuLnNwbGljZSgxLCAwLCAnbW91c2VUaW1lRGlzcGxheScpO1xufVxuXG4vKipcbiAqIENhbGwgdGhlIHVwZGF0ZSBldmVudCBmb3IgdGhpcyBTbGlkZXIgd2hlbiB0aGlzIGV2ZW50IGhhcHBlbnMgb24gdGhlIHBsYXllci5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5TZWVrQmFyLnByb3RvdHlwZS5wbGF5ZXJFdmVudCA9ICd0aW1ldXBkYXRlJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdTZWVrQmFyJywgU2Vla0Jhcik7XG5cbi8qKlxuICogQGZpbGUgcHJvZ3Jlc3MtY29udHJvbC5qc1xuICovXG4vKipcbiAqIFRoZSBQcm9ncmVzcyBDb250cm9sIGNvbXBvbmVudCBjb250YWlucyB0aGUgc2VlayBiYXIsIGxvYWQgcHJvZ3Jlc3MsXG4gKiBhbmQgcGxheSBwcm9ncmVzcy5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgUHJvZ3Jlc3NDb250cm9sID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoUHJvZ3Jlc3NDb250cm9sLCBfQ29tcG9uZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFByb2dyZXNzQ29udHJvbChwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQcm9ncmVzc0NvbnRyb2wpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5oYW5kbGVNb3VzZU1vdmUgPSB0aHJvdHRsZShiaW5kKF90aGlzLCBfdGhpcy5oYW5kbGVNb3VzZU1vdmUpLCAyNSk7XG4gICAgX3RoaXMudGhyb3R0bGVkSGFuZGxlTW91c2VTZWVrID0gdGhyb3R0bGUoYmluZChfdGhpcywgX3RoaXMuaGFuZGxlTW91c2VTZWVrKSwgMjUpO1xuXG4gICAgX3RoaXMuZW5hYmxlKCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtcHJvZ3Jlc3MtY29udHJvbCB2anMtY29udHJvbCdcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogV2hlbiB0aGUgbW91c2UgbW92ZXMgb3ZlciB0aGUgYFByb2dyZXNzQ29udHJvbGAsIHRoZSBwb2ludGVyIHBvc2l0aW9uXG4gICAqIGdldHMgcGFzc2VkIGRvd24gdG8gdGhlIGBNb3VzZVRpbWVEaXNwbGF5YCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYG1vdXNlbW92ZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW4gbW91c2Vtb3ZlXG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZU1vdmUgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpIHtcbiAgICB2YXIgc2Vla0JhciA9IHRoaXMuZ2V0Q2hpbGQoJ3NlZWtCYXInKTtcblxuICAgIGlmIChzZWVrQmFyKSB7XG4gICAgICB2YXIgbW91c2VUaW1lRGlzcGxheSA9IHNlZWtCYXIuZ2V0Q2hpbGQoJ21vdXNlVGltZURpc3BsYXknKTtcbiAgICAgIHZhciBzZWVrQmFyRWwgPSBzZWVrQmFyLmVsKCk7XG4gICAgICB2YXIgc2Vla0JhclJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc2Vla0JhckVsKTtcbiAgICAgIHZhciBzZWVrQmFyUG9pbnQgPSBnZXRQb2ludGVyUG9zaXRpb24oc2Vla0JhckVsLCBldmVudCkueDtcblxuICAgICAgLy8gVGhlIGRlZmF1bHQgc2tpbiBoYXMgYSBnYXAgb24gZWl0aGVyIHNpZGUgb2YgdGhlIGBTZWVrQmFyYC4gVGhpcyBtZWFuc1xuICAgICAgLy8gdGhhdCBpdCdzIHBvc3NpYmxlIHRvIHRyaWdnZXIgdGhpcyBiZWhhdmlvciBvdXRzaWRlIHRoZSBib3VuZGFyaWVzIG9mXG4gICAgICAvLyB0aGUgYFNlZWtCYXJgLiBUaGlzIGVuc3VyZXMgd2Ugc3RheSB3aXRoaW4gaXQgYXQgYWxsIHRpbWVzLlxuICAgICAgaWYgKHNlZWtCYXJQb2ludCA+IDEpIHtcbiAgICAgICAgc2Vla0JhclBvaW50ID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoc2Vla0JhclBvaW50IDwgMCkge1xuICAgICAgICBzZWVrQmFyUG9pbnQgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAobW91c2VUaW1lRGlzcGxheSkge1xuICAgICAgICBtb3VzZVRpbWVEaXNwbGF5LnVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgdGhyb3R0bGVkIHZlcnNpb24gb2YgdGhlIHtAbGluayBQcm9ncmVzc0NvbnRyb2wjaGFuZGxlTW91c2VTZWVrfSBsaXN0ZW5lci5cbiAgICpcbiAgICogQG1ldGhvZCBQcm9ncmVzc0NvbnRyb2wjdGhyb3R0bGVkSGFuZGxlTW91c2VTZWVrXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgYG1vdXNlbW92ZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW4gbW91c2Vtb3ZlXG4gICAqIEBsaXN0ZW4gdG91Y2htb3ZlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYG1vdXNlbW92ZWAgb3IgYHRvdWNobW92ZWAgZXZlbnRzIG9uIHRoZSBgUHJvZ3Jlc3NDb250cm9sYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZWRvd25gIG9yIGB0b3VjaHN0YXJ0YCBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBsaXN0ZW5zIG1vdXNlbW92ZVxuICAgKiBAbGlzdGVucyB0b3VjaG1vdmVcbiAgICovXG5cblxuICBQcm9ncmVzc0NvbnRyb2wucHJvdG90eXBlLmhhbmRsZU1vdXNlU2VlayA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlU2VlayhldmVudCkge1xuICAgIHZhciBzZWVrQmFyID0gdGhpcy5nZXRDaGlsZCgnc2Vla0JhcicpO1xuXG4gICAgaWYgKHNlZWtCYXIpIHtcbiAgICAgIHNlZWtCYXIuaGFuZGxlTW91c2VNb3ZlKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEFyZSBjb250cm9scyBhcmUgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoaXMgcHJvZ3Jlc3MgY29udHJvbC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICB0cnVlIGlmIGNvbnRyb2xzIGFyZSBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG5cblxuICBQcm9ncmVzc0NvbnRyb2wucHJvdG90eXBlLmVuYWJsZWQgPSBmdW5jdGlvbiBlbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZWRfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGFsbCBjb250cm9scyBvbiB0aGUgcHJvZ3Jlc3MgY29udHJvbCBhbmQgaXRzIGNoaWxkcmVuXG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgICB0aGlzLmNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZC5kaXNhYmxlICYmIGNoaWxkLmRpc2FibGUoKTtcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9mZihbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J10sIHRoaXMuaGFuZGxlTW91c2VEb3duKTtcbiAgICB0aGlzLm9mZih0aGlzLmVsXywgJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTtcbiAgICB0aGlzLmhhbmRsZU1vdXNlVXAoKTtcblxuICAgIHRoaXMuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cbiAgICB0aGlzLmVuYWJsZWRfID0gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBhbGwgY29udHJvbHMgb24gdGhlIHByb2dyZXNzIGNvbnRyb2wgYW5kIGl0cyBjaGlsZHJlblxuICAgKi9cblxuXG4gIFByb2dyZXNzQ29udHJvbC5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIHRoaXMuY2hpbGRyZW4oKS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkLmVuYWJsZSAmJiBjaGlsZC5lbmFibGUoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub24oWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgdGhpcy5vbih0aGlzLmVsXywgJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuXG4gICAgdGhpcy5lbmFibGVkXyA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnRzIG9uIHRoZSBgUHJvZ3Jlc3NDb250cm9sYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZWRvd25gIG9yIGB0b3VjaHN0YXJ0YCBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBsaXN0ZW5zIG1vdXNlZG93blxuICAgKiBAbGlzdGVucyB0b3VjaHN0YXJ0XG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICB2YXIgZG9jID0gdGhpcy5lbF8ub3duZXJEb2N1bWVudDtcbiAgICB2YXIgc2Vla0JhciA9IHRoaXMuZ2V0Q2hpbGQoJ3NlZWtCYXInKTtcblxuICAgIGlmIChzZWVrQmFyKSB7XG4gICAgICBzZWVrQmFyLmhhbmRsZU1vdXNlRG93bihldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5vbihkb2MsICdtb3VzZW1vdmUnLCB0aGlzLnRocm90dGxlZEhhbmRsZU1vdXNlU2Vlayk7XG4gICAgdGhpcy5vbihkb2MsICd0b3VjaG1vdmUnLCB0aGlzLnRocm90dGxlZEhhbmRsZU1vdXNlU2Vlayk7XG4gICAgdGhpcy5vbihkb2MsICdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICB0aGlzLm9uKGRvYywgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIGBtb3VzZXVwYCBvciBgdG91Y2hlbmRgIGV2ZW50cyBvbiB0aGUgYFByb2dyZXNzQ29udHJvbGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBgbW91c2V1cGAgb3IgYHRvdWNoZW5kYCBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAbGlzdGVucyB0b3VjaGVuZFxuICAgKiBAbGlzdGVucyBtb3VzZXVwXG4gICAqL1xuXG5cbiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gaGFuZGxlTW91c2VVcChldmVudCkge1xuICAgIHZhciBkb2MgPSB0aGlzLmVsXy5vd25lckRvY3VtZW50O1xuICAgIHZhciBzZWVrQmFyID0gdGhpcy5nZXRDaGlsZCgnc2Vla0JhcicpO1xuXG4gICAgaWYgKHNlZWtCYXIpIHtcbiAgICAgIHNlZWtCYXIuaGFuZGxlTW91c2VVcChldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5vZmYoZG9jLCAnbW91c2Vtb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZVNlZWspO1xuICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNobW92ZScsIHRoaXMudGhyb3R0bGVkSGFuZGxlTW91c2VTZWVrKTtcbiAgICB0aGlzLm9mZihkb2MsICdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICB0aGlzLm9mZihkb2MsICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gIH07XG5cbiAgcmV0dXJuIFByb2dyZXNzQ29udHJvbDtcbn0oQ29tcG9uZW50KTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIGBQcm9ncmVzc0NvbnRyb2xgXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5Qcm9ncmVzc0NvbnRyb2wucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBjaGlsZHJlbjogWydzZWVrQmFyJ11cbn07XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUHJvZ3Jlc3NDb250cm9sJywgUHJvZ3Jlc3NDb250cm9sKTtcblxuLyoqXG4gKiBAZmlsZSBmdWxsc2NyZWVuLXRvZ2dsZS5qc1xuICovXG4vKipcbiAqIFRvZ2dsZSBmdWxsc2NyZWVuIHZpZGVvXG4gKlxuICogQGV4dGVuZHMgQnV0dG9uXG4gKi9cblxudmFyIEZ1bGxzY3JlZW5Ub2dnbGUgPSBmdW5jdGlvbiAoX0J1dHRvbikge1xuICBpbmhlcml0cyhGdWxsc2NyZWVuVG9nZ2xlLCBfQnV0dG9uKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIEZ1bGxzY3JlZW5Ub2dnbGUocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRnVsbHNjcmVlblRvZ2dsZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9CdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLm9uKHBsYXllciwgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBfdGhpcy5oYW5kbGVGdWxsc2NyZWVuQ2hhbmdlKTtcblxuICAgIGlmIChkb2N1bWVudFtGdWxsc2NyZWVuQXBpLmZ1bGxzY3JlZW5FbmFibGVkXSA9PT0gZmFsc2UpIHtcbiAgICAgIF90aGlzLmRpc2FibGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBGdWxsc2NyZWVuVG9nZ2xlLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1mdWxsc2NyZWVuLWNvbnRyb2wgJyArIF9CdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyBmdWxsc2NyZWVuY2hhbmdlIG9uIHRoZSBwbGF5ZXIgYW5kIGNoYW5nZSBjb250cm9sIHRleHQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSB7QGxpbmsgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2V9IGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2VcbiAgICovXG5cblxuICBGdWxsc2NyZWVuVG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVGdWxsc2NyZWVuQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlRnVsbHNjcmVlbkNoYW5nZShldmVudCkge1xuICAgIGlmICh0aGlzLnBsYXllcl8uaXNGdWxsc2NyZWVuKCkpIHtcbiAgICAgIHRoaXMuY29udHJvbFRleHQoJ05vbi1GdWxsc2NyZWVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udHJvbFRleHQoJ0Z1bGxzY3JlZW4nKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgRnVsbHNjcmVlblRvZ2dsZWAgaXMgXCJjbGlja2VkXCIuIFNlZVxuICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlXG4gICAqICAgICAgICBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKi9cblxuXG4gIEZ1bGxzY3JlZW5Ub2dnbGUucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMucGxheWVyXy5pc0Z1bGxzY3JlZW4oKSkge1xuICAgICAgdGhpcy5wbGF5ZXJfLnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyXy5leGl0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRnVsbHNjcmVlblRvZ2dsZTtcbn0oQnV0dG9uKTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBGdWxsc2NyZWVuVG9nZ2xlYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5GdWxsc2NyZWVuVG9nZ2xlLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnRnVsbHNjcmVlbic7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnRnVsbHNjcmVlblRvZ2dsZScsIEZ1bGxzY3JlZW5Ub2dnbGUpO1xuXG4vKipcbiAqIENoZWNrIGlmIHZvbHVtZSBjb250cm9sIGlzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXNuJ3QgaGlkZSB0aGVcbiAqIGBDb21wb25lbnRgIHRoYXQgd2FzIHBhc3NlZCAgdXNpbmcgdGhlIGB2anMtaGlkZGVuYCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gc2VsZlxuICogICAgICAgIFRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGlmIHZvbHVtZSBpcyB1bnN1cHBvcnRlZFxuICpcbiAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAqICAgICAgICBBIHJlZmVyZW5jZSB0byB0aGUgcGxheWVyXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGNoZWNrVm9sdW1lU3VwcG9ydCA9IGZ1bmN0aW9uIGNoZWNrVm9sdW1lU3VwcG9ydChzZWxmLCBwbGF5ZXIpIHtcbiAgLy8gaGlkZSB2b2x1bWUgY29udHJvbHMgd2hlbiB0aGV5J3JlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgdGVjaFxuICBpZiAocGxheWVyLnRlY2hfICYmICFwbGF5ZXIudGVjaF8uZmVhdHVyZXNWb2x1bWVDb250cm9sKSB7XG4gICAgc2VsZi5hZGRDbGFzcygndmpzLWhpZGRlbicpO1xuICB9XG5cbiAgc2VsZi5vbihwbGF5ZXIsICdsb2Fkc3RhcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwbGF5ZXIudGVjaF8uZmVhdHVyZXNWb2x1bWVDb250cm9sKSB7XG4gICAgICBzZWxmLmFkZENsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYucmVtb3ZlQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBAZmlsZSB2b2x1bWUtbGV2ZWwuanNcbiAqL1xuLyoqXG4gKiBTaG93cyB2b2x1bWUgbGV2ZWxcbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgVm9sdW1lTGV2ZWwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhWb2x1bWVMZXZlbCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVm9sdW1lTGV2ZWwoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVm9sdW1lTGV2ZWwpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIFZvbHVtZUxldmVsLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdm9sdW1lLWxldmVsJyxcbiAgICAgIGlubmVySFRNTDogJzxzcGFuIGNsYXNzPVwidmpzLWNvbnRyb2wtdGV4dFwiPjwvc3Bhbj4nXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFZvbHVtZUxldmVsO1xufShDb21wb25lbnQpO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1ZvbHVtZUxldmVsJywgVm9sdW1lTGV2ZWwpO1xuXG4vKipcbiAqIEBmaWxlIHZvbHVtZS1iYXIuanNcbiAqL1xuLy8gUmVxdWlyZWQgY2hpbGRyZW5cbi8qKlxuICogVGhlIGJhciB0aGF0IGNvbnRhaW5zIHRoZSB2b2x1bWUgbGV2ZWwgYW5kIGNhbiBiZSBjbGlja2VkIG9uIHRvIGFkanVzdCB0aGUgbGV2ZWxcbiAqXG4gKiBAZXh0ZW5kcyBTbGlkZXJcbiAqL1xuXG52YXIgVm9sdW1lQmFyID0gZnVuY3Rpb24gKF9TbGlkZXIpIHtcbiAgaW5oZXJpdHMoVm9sdW1lQmFyLCBfU2xpZGVyKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFZvbHVtZUJhcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBWb2x1bWVCYXIpO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfU2xpZGVyLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbignc2xpZGVyYWN0aXZlJywgX3RoaXMudXBkYXRlTGFzdFZvbHVtZV8pO1xuICAgIF90aGlzLm9uKHBsYXllciwgJ3ZvbHVtZWNoYW5nZScsIF90aGlzLnVwZGF0ZUFSSUFBdHRyaWJ1dGVzKTtcbiAgICBwbGF5ZXIucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnVwZGF0ZUFSSUFBdHRyaWJ1dGVzKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgVm9sdW1lQmFyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHJldHVybiBfU2xpZGVyLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdm9sdW1lLWJhciB2anMtc2xpZGVyLWJhcidcbiAgICB9LCB7XG4gICAgICAnYXJpYS1sYWJlbCc6IHRoaXMubG9jYWxpemUoJ1ZvbHVtZSBMZXZlbCcpLFxuICAgICAgJ2FyaWEtbGl2ZSc6ICdwb2xpdGUnXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZSBkb3duIG9uIHZvbHVtZSBiYXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgbW91c2Vkb3duYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgbW91c2Vkb3duXG4gICAqL1xuXG5cbiAgVm9sdW1lQmFyLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICBpZiAoIWlzU2luZ2xlTGVmdENsaWNrKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZU1vdXNlRG93bi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIG1vdmVtZW50IGV2ZW50cyBvbiB0aGUge0BsaW5rIFZvbHVtZU1lbnVCdXR0b259LlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZW1vdmVcbiAgICovXG5cblxuICBWb2x1bWVCYXIucHJvdG90eXBlLmhhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudCkge1xuICAgIGlmICghaXNTaW5nbGVMZWZ0Q2xpY2soZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jaGVja011dGVkKCk7XG4gICAgdGhpcy5wbGF5ZXJfLnZvbHVtZSh0aGlzLmNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgbXV0ZWQgdW5tdXRlIGl0LlxuICAgKi9cblxuXG4gIFZvbHVtZUJhci5wcm90b3R5cGUuY2hlY2tNdXRlZCA9IGZ1bmN0aW9uIGNoZWNrTXV0ZWQoKSB7XG4gICAgaWYgKHRoaXMucGxheWVyXy5tdXRlZCgpKSB7XG4gICAgICB0aGlzLnBsYXllcl8ubXV0ZWQoZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IHBlcmNlbnQgb2Ygdm9sdW1lIGxldmVsXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBWb2x1bWUgbGV2ZWwgcGVyY2VudCBhcyBhIGRlY2ltYWwgbnVtYmVyLlxuICAgKi9cblxuXG4gIFZvbHVtZUJhci5wcm90b3R5cGUuZ2V0UGVyY2VudCA9IGZ1bmN0aW9uIGdldFBlcmNlbnQoKSB7XG4gICAgaWYgKHRoaXMucGxheWVyXy5tdXRlZCgpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxheWVyXy52b2x1bWUoKTtcbiAgfTtcblxuICAvKipcbiAgICogSW5jcmVhc2Ugdm9sdW1lIGxldmVsIGZvciBrZXlib2FyZCB1c2Vyc1xuICAgKi9cblxuXG4gIFZvbHVtZUJhci5wcm90b3R5cGUuc3RlcEZvcndhcmQgPSBmdW5jdGlvbiBzdGVwRm9yd2FyZCgpIHtcbiAgICB0aGlzLmNoZWNrTXV0ZWQoKTtcbiAgICB0aGlzLnBsYXllcl8udm9sdW1lKHRoaXMucGxheWVyXy52b2x1bWUoKSArIDAuMSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY3JlYXNlIHZvbHVtZSBsZXZlbCBmb3Iga2V5Ym9hcmQgdXNlcnNcbiAgICovXG5cblxuICBWb2x1bWVCYXIucHJvdG90eXBlLnN0ZXBCYWNrID0gZnVuY3Rpb24gc3RlcEJhY2soKSB7XG4gICAgdGhpcy5jaGVja011dGVkKCk7XG4gICAgdGhpcy5wbGF5ZXJfLnZvbHVtZSh0aGlzLnBsYXllcl8udm9sdW1lKCkgLSAwLjEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgQVJJQSBhY2Nlc3NpYmlsaXR5IGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGB2b2x1bWVjaGFuZ2VgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjdm9sdW1lY2hhbmdlXG4gICAqL1xuXG5cbiAgVm9sdW1lQmFyLnByb3RvdHlwZS51cGRhdGVBUklBQXR0cmlidXRlcyA9IGZ1bmN0aW9uIHVwZGF0ZUFSSUFBdHRyaWJ1dGVzKGV2ZW50KSB7XG4gICAgdmFyIGFyaWFWYWx1ZSA9IHRoaXMucGxheWVyXy5tdXRlZCgpID8gMCA6IHRoaXMudm9sdW1lQXNQZXJjZW50YWdlXygpO1xuXG4gICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgYXJpYVZhbHVlKTtcbiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWV0ZXh0JywgYXJpYVZhbHVlICsgJyUnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcGxheWVyIHZvbHVtZSBhcyBhIHBlcmNlbnRhZ2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBWb2x1bWVCYXIucHJvdG90eXBlLnZvbHVtZUFzUGVyY2VudGFnZV8gPSBmdW5jdGlvbiB2b2x1bWVBc1BlcmNlbnRhZ2VfKCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMucGxheWVyXy52b2x1bWUoKSAqIDEwMCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNlciBzdGFydHMgZHJhZ2dpbmcgdGhlIFZvbHVtZUJhciwgc3RvcmUgdGhlIHZvbHVtZSBhbmQgbGlzdGVuIGZvclxuICAgKiB0aGUgZW5kIG9mIHRoZSBkcmFnLiBXaGVuIHRoZSBkcmFnIGVuZHMsIGlmIHRoZSB2b2x1bWUgd2FzIHNldCB0byB6ZXJvLFxuICAgKiBzZXQgbGFzdFZvbHVtZSB0byB0aGUgc3RvcmVkIHZvbHVtZS5cbiAgICpcbiAgICogQGxpc3RlbnMgc2xpZGVyYWN0aXZlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVm9sdW1lQmFyLnByb3RvdHlwZS51cGRhdGVMYXN0Vm9sdW1lXyA9IGZ1bmN0aW9uIHVwZGF0ZUxhc3RWb2x1bWVfKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHZvbHVtZUJlZm9yZURyYWcgPSB0aGlzLnBsYXllcl8udm9sdW1lKCk7XG5cbiAgICB0aGlzLm9uZSgnc2xpZGVyaW5hY3RpdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMyLnBsYXllcl8udm9sdW1lKCkgPT09IDApIHtcbiAgICAgICAgX3RoaXMyLnBsYXllcl8ubGFzdFZvbHVtZV8odm9sdW1lQmVmb3JlRHJhZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFZvbHVtZUJhcjtcbn0oU2xpZGVyKTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBgVm9sdW1lQmFyYFxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuVm9sdW1lQmFyLnByb3RvdHlwZS5vcHRpb25zXyA9IHtcbiAgY2hpbGRyZW46IFsndm9sdW1lTGV2ZWwnXSxcbiAgYmFyTmFtZTogJ3ZvbHVtZUxldmVsJ1xufTtcblxuLyoqXG4gKiBDYWxsIHRoZSB1cGRhdGUgZXZlbnQgZm9yIHRoaXMgU2xpZGVyIHdoZW4gdGhpcyBldmVudCBoYXBwZW5zIG9uIHRoZSBwbGF5ZXIuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuVm9sdW1lQmFyLnByb3RvdHlwZS5wbGF5ZXJFdmVudCA9ICd2b2x1bWVjaGFuZ2UnO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1ZvbHVtZUJhcicsIFZvbHVtZUJhcik7XG5cbi8qKlxuICogQGZpbGUgdm9sdW1lLWNvbnRyb2wuanNcbiAqL1xuLy8gUmVxdWlyZWQgY2hpbGRyZW5cbi8qKlxuICogVGhlIGNvbXBvbmVudCBmb3IgY29udHJvbGxpbmcgdGhlIHZvbHVtZSBsZXZlbFxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBWb2x1bWVDb250cm9sID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoVm9sdW1lQ29udHJvbCwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBWb2x1bWVDb250cm9sKHBsYXllcikge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBWb2x1bWVDb250cm9sKTtcblxuICAgIG9wdGlvbnMudmVydGljYWwgPSBvcHRpb25zLnZlcnRpY2FsIHx8IGZhbHNlO1xuXG4gICAgLy8gUGFzcyB0aGUgdmVydGljYWwgb3B0aW9uIGRvd24gdG8gdGhlIFZvbHVtZUJhciBpZlxuICAgIC8vIHRoZSBWb2x1bWVCYXIgaXMgdHVybmVkIG9uLlxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy52b2x1bWVCYXIgPT09ICd1bmRlZmluZWQnIHx8IGlzUGxhaW4ob3B0aW9ucy52b2x1bWVCYXIpKSB7XG4gICAgICBvcHRpb25zLnZvbHVtZUJhciA9IG9wdGlvbnMudm9sdW1lQmFyIHx8IHt9O1xuICAgICAgb3B0aW9ucy52b2x1bWVCYXIudmVydGljYWwgPSBvcHRpb25zLnZlcnRpY2FsO1xuICAgIH1cblxuICAgIC8vIGhpZGUgdGhpcyBjb250cm9sIGlmIHZvbHVtZSBzdXBwb3J0IGlzIG1pc3NpbmdcbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIGNoZWNrVm9sdW1lU3VwcG9ydChfdGhpcywgcGxheWVyKTtcblxuICAgIF90aGlzLnRocm90dGxlZEhhbmRsZU1vdXNlTW92ZSA9IHRocm90dGxlKGJpbmQoX3RoaXMsIF90aGlzLmhhbmRsZU1vdXNlTW92ZSksIDI1KTtcblxuICAgIF90aGlzLm9uKCdtb3VzZWRvd24nLCBfdGhpcy5oYW5kbGVNb3VzZURvd24pO1xuICAgIF90aGlzLm9uKCd0b3VjaHN0YXJ0JywgX3RoaXMuaGFuZGxlTW91c2VEb3duKTtcblxuICAgIC8vIHdoaWxlIHRoZSBzbGlkZXIgaXMgYWN0aXZlICh0aGUgbW91c2UgaGFzIGJlZW4gcHJlc3NlZCBkb3duIGFuZFxuICAgIC8vIGlzIGRyYWdnaW5nKSBvciBpbiBmb2N1cyB3ZSBkbyBub3Qgd2FudCB0byBoaWRlIHRoZSBWb2x1bWVCYXJcbiAgICBfdGhpcy5vbihfdGhpcy52b2x1bWVCYXIsIFsnZm9jdXMnLCAnc2xpZGVyYWN0aXZlJ10sIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnZvbHVtZUJhci5hZGRDbGFzcygndmpzLXNsaWRlci1hY3RpdmUnKTtcbiAgICAgIF90aGlzLmFkZENsYXNzKCd2anMtc2xpZGVyLWFjdGl2ZScpO1xuICAgICAgX3RoaXMudHJpZ2dlcignc2xpZGVyYWN0aXZlJyk7XG4gICAgfSk7XG5cbiAgICBfdGhpcy5vbihfdGhpcy52b2x1bWVCYXIsIFsnYmx1cicsICdzbGlkZXJpbmFjdGl2ZSddLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy52b2x1bWVCYXIucmVtb3ZlQ2xhc3MoJ3Zqcy1zbGlkZXItYWN0aXZlJyk7XG4gICAgICBfdGhpcy5yZW1vdmVDbGFzcygndmpzLXNsaWRlci1hY3RpdmUnKTtcbiAgICAgIF90aGlzLnRyaWdnZXIoJ3NsaWRlcmluYWN0aXZlJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgVm9sdW1lQ29udHJvbC5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCgpIHtcbiAgICB2YXIgb3JpZW50YXRpb25DbGFzcyA9ICd2anMtdm9sdW1lLWhvcml6b250YWwnO1xuXG4gICAgaWYgKHRoaXMub3B0aW9uc18udmVydGljYWwpIHtcbiAgICAgIG9yaWVudGF0aW9uQ2xhc3MgPSAndmpzLXZvbHVtZS12ZXJ0aWNhbCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy12b2x1bWUtY29udHJvbCB2anMtY29udHJvbCAnICsgb3JpZW50YXRpb25DbGFzc1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYG1vdXNlZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50cyBvbiB0aGUgYFZvbHVtZUNvbnRyb2xgLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgYG1vdXNlZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQGxpc3RlbnMgbW91c2Vkb3duXG4gICAqIEBsaXN0ZW5zIHRvdWNoc3RhcnRcbiAgICovXG5cblxuICBWb2x1bWVDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICB2YXIgZG9jID0gdGhpcy5lbF8ub3duZXJEb2N1bWVudDtcblxuICAgIHRoaXMub24oZG9jLCAnbW91c2Vtb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub24oZG9jLCAndG91Y2htb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub24oZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgdGhpcy5vbihkb2MsICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBgbW91c2V1cGAgb3IgYHRvdWNoZW5kYCBldmVudHMgb24gdGhlIGBWb2x1bWVDb250cm9sYC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIGBtb3VzZXVwYCBvciBgdG91Y2hlbmRgIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRvdWNoZW5kXG4gICAqIEBsaXN0ZW5zIG1vdXNldXBcbiAgICovXG5cblxuICBWb2x1bWVDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gaGFuZGxlTW91c2VVcChldmVudCkge1xuICAgIHZhciBkb2MgPSB0aGlzLmVsXy5vd25lckRvY3VtZW50O1xuXG4gICAgdGhpcy5vZmYoZG9jLCAnbW91c2Vtb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNobW92ZScsIHRoaXMudGhyb3R0bGVkSGFuZGxlTW91c2VNb3ZlKTtcbiAgICB0aGlzLm9mZihkb2MsICdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICB0aGlzLm9mZihkb2MsICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnRzIG9uIHRoZSBgVm9sdW1lQ29udHJvbGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAbGlzdGVucyBtb3VzZWRvd25cbiAgICogQGxpc3RlbnMgdG91Y2hzdGFydFxuICAgKi9cblxuXG4gIFZvbHVtZUNvbnRyb2wucHJvdG90eXBlLmhhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudCkge1xuICAgIHRoaXMudm9sdW1lQmFyLmhhbmRsZU1vdXNlTW92ZShldmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIFZvbHVtZUNvbnRyb2w7XG59KENvbXBvbmVudCk7XG5cbi8qKlxuICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYFZvbHVtZUNvbnRyb2xgXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5Wb2x1bWVDb250cm9sLnByb3RvdHlwZS5vcHRpb25zXyA9IHtcbiAgY2hpbGRyZW46IFsndm9sdW1lQmFyJ11cbn07XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVm9sdW1lQ29udHJvbCcsIFZvbHVtZUNvbnRyb2wpO1xuXG4vKipcbiAqIENoZWNrIGlmIG11dGluZyB2b2x1bWUgaXMgc3VwcG9ydGVkIGFuZCBpZiBpdCBpc24ndCBoaWRlIHRoZSBtdXRlIHRvZ2dsZVxuICogYnV0dG9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBzZWxmXG4gKiAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIG11dGUgdG9nZ2xlIGJ1dHRvblxuICpcbiAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAqICAgICAgICBBIHJlZmVyZW5jZSB0byB0aGUgcGxheWVyXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIGNoZWNrTXV0ZVN1cHBvcnQgPSBmdW5jdGlvbiBjaGVja011dGVTdXBwb3J0KHNlbGYsIHBsYXllcikge1xuICAvLyBoaWRlIG11dGUgdG9nZ2xlIGJ1dHRvbiBpZiBpdCdzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgdGVjaFxuICBpZiAocGxheWVyLnRlY2hfICYmICFwbGF5ZXIudGVjaF8uZmVhdHVyZXNNdXRlQ29udHJvbCkge1xuICAgIHNlbGYuYWRkQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgfVxuXG4gIHNlbGYub24ocGxheWVyLCAnbG9hZHN0YXJ0JywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGxheWVyLnRlY2hfLmZlYXR1cmVzTXV0ZUNvbnRyb2wpIHtcbiAgICAgIHNlbGYuYWRkQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5yZW1vdmVDbGFzcygndmpzLWhpZGRlbicpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEBmaWxlIG11dGUtdG9nZ2xlLmpzXG4gKi9cbi8qKlxuICogQSBidXR0b24gY29tcG9uZW50IGZvciBtdXRpbmcgdGhlIGF1ZGlvLlxuICpcbiAqIEBleHRlbmRzIEJ1dHRvblxuICovXG5cbnZhciBNdXRlVG9nZ2xlID0gZnVuY3Rpb24gKF9CdXR0b24pIHtcbiAgaW5oZXJpdHMoTXV0ZVRvZ2dsZSwgX0J1dHRvbik7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBNdXRlVG9nZ2xlKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE11dGVUb2dnbGUpO1xuXG4gICAgLy8gaGlkZSB0aGlzIGNvbnRyb2wgaWYgdm9sdW1lIHN1cHBvcnQgaXMgbWlzc2luZ1xuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgY2hlY2tNdXRlU3VwcG9ydChfdGhpcywgcGxheWVyKTtcblxuICAgIF90aGlzLm9uKHBsYXllciwgWydsb2Fkc3RhcnQnLCAndm9sdW1lY2hhbmdlJ10sIF90aGlzLnVwZGF0ZSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBNdXRlVG9nZ2xlLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1tdXRlLWNvbnRyb2wgJyArIF9CdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGFuIGBNdXRlVG9nZ2xlYCBpcyBcImNsaWNrZWRcIi4gU2VlXG4gICAqIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9IGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgYSBjbGljayBjYW4gYmUuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgTXV0ZVRvZ2dsZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIHZhciB2b2wgPSB0aGlzLnBsYXllcl8udm9sdW1lKCk7XG4gICAgdmFyIGxhc3RWb2x1bWUgPSB0aGlzLnBsYXllcl8ubGFzdFZvbHVtZV8oKTtcblxuICAgIGlmICh2b2wgPT09IDApIHtcbiAgICAgIHZhciB2b2x1bWVUb1NldCA9IGxhc3RWb2x1bWUgPCAwLjEgPyAwLjEgOiBsYXN0Vm9sdW1lO1xuXG4gICAgICB0aGlzLnBsYXllcl8udm9sdW1lKHZvbHVtZVRvU2V0KTtcbiAgICAgIHRoaXMucGxheWVyXy5tdXRlZChmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyXy5tdXRlZCh0aGlzLnBsYXllcl8ubXV0ZWQoKSA/IGZhbHNlIDogdHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGBNdXRlVG9nZ2xlYCBidXR0b24gYmFzZWQgb24gdGhlIHN0YXRlIG9mIGB2b2x1bWVgIGFuZCBgbXV0ZWRgXG4gICAqIG9uIHRoZSBwbGF5ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSB7QGxpbmsgUGxheWVyI2xvYWRzdGFydH0gZXZlbnQgaWYgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkXG4gICAqICAgICAgICB0aHJvdWdoIGFuIGV2ZW50LlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjbG9hZHN0YXJ0XG4gICAqIEBsaXN0ZW5zIFBsYXllciN2b2x1bWVjaGFuZ2VcbiAgICovXG5cblxuICBNdXRlVG9nZ2xlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHtcbiAgICB0aGlzLnVwZGF0ZUljb25fKCk7XG4gICAgdGhpcy51cGRhdGVDb250cm9sVGV4dF8oKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBgTXV0ZVRvZ2dsZWAgaWNvbi5cbiAgICpcbiAgICogUG9zc2libGUgc3RhdGVzIChnaXZlbiBgbGV2ZWxgIHZhcmlhYmxlIGJlbG93KTpcbiAgICogLSAwOiBjcm9zc2VkIG91dFxuICAgKiAtIDE6IHplcm8gYmFycyBvZiB2b2x1bWVcbiAgICogLSAyOiBvbmUgYmFyIG9mIHZvbHVtZVxuICAgKiAtIDM6IHR3byBiYXJzIG9mIHZvbHVtZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIE11dGVUb2dnbGUucHJvdG90eXBlLnVwZGF0ZUljb25fID0gZnVuY3Rpb24gdXBkYXRlSWNvbl8oKSB7XG4gICAgdmFyIHZvbCA9IHRoaXMucGxheWVyXy52b2x1bWUoKTtcbiAgICB2YXIgbGV2ZWwgPSAzO1xuXG4gICAgLy8gaW4gaU9TIHdoZW4gYSBwbGF5ZXIgaXMgbG9hZGVkIHdpdGggbXV0ZWQgYXR0cmlidXRlXG4gICAgLy8gYW5kIHZvbHVtZSBpcyBjaGFuZ2VkIHdpdGggYSBuYXRpdmUgbXV0ZSBidXR0b25cbiAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBtdXRlZCBzdGF0ZSBpcyB1cGRhdGVkXG4gICAgaWYgKElTX0lPUykge1xuICAgICAgdGhpcy5wbGF5ZXJfLm11dGVkKHRoaXMucGxheWVyXy50ZWNoXy5lbF8ubXV0ZWQpO1xuICAgIH1cblxuICAgIGlmICh2b2wgPT09IDAgfHwgdGhpcy5wbGF5ZXJfLm11dGVkKCkpIHtcbiAgICAgIGxldmVsID0gMDtcbiAgICB9IGVsc2UgaWYgKHZvbCA8IDAuMzMpIHtcbiAgICAgIGxldmVsID0gMTtcbiAgICB9IGVsc2UgaWYgKHZvbCA8IDAuNjcpIHtcbiAgICAgIGxldmVsID0gMjtcbiAgICB9XG5cbiAgICAvLyBUT0RPIGltcHJvdmUgbXV0ZWQgaWNvbiBjbGFzc2VzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgIHJlbW92ZUNsYXNzKHRoaXMuZWxfLCAndmpzLXZvbC0nICsgaSk7XG4gICAgfVxuICAgIGFkZENsYXNzKHRoaXMuZWxfLCAndmpzLXZvbC0nICsgbGV2ZWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJZiBgbXV0ZWRgIGhhcyBjaGFuZ2VkIG9uIHRoZSBwbGF5ZXIsIHVwZGF0ZSB0aGUgY29udHJvbCB0ZXh0XG4gICAqIChgdGl0bGVgIGF0dHJpYnV0ZSBvbiBgdmpzLW11dGUtY29udHJvbGAgZWxlbWVudCBhbmQgY29udGVudCBvZlxuICAgKiBgdmpzLWNvbnRyb2wtdGV4dGAgZWxlbWVudCkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgTXV0ZVRvZ2dsZS5wcm90b3R5cGUudXBkYXRlQ29udHJvbFRleHRfID0gZnVuY3Rpb24gdXBkYXRlQ29udHJvbFRleHRfKCkge1xuICAgIHZhciBzb3VuZE9mZiA9IHRoaXMucGxheWVyXy5tdXRlZCgpIHx8IHRoaXMucGxheWVyXy52b2x1bWUoKSA9PT0gMDtcbiAgICB2YXIgdGV4dCA9IHNvdW5kT2ZmID8gJ1VubXV0ZScgOiAnTXV0ZSc7XG5cbiAgICBpZiAodGhpcy5jb250cm9sVGV4dCgpICE9PSB0ZXh0KSB7XG4gICAgICB0aGlzLmNvbnRyb2xUZXh0KHRleHQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTXV0ZVRvZ2dsZTtcbn0oQnV0dG9uKTtcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBNdXRlVG9nZ2xlYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5NdXRlVG9nZ2xlLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnTXV0ZSc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTXV0ZVRvZ2dsZScsIE11dGVUb2dnbGUpO1xuXG4vKipcbiAqIEBmaWxlIHZvbHVtZS1jb250cm9sLmpzXG4gKi9cbi8vIFJlcXVpcmVkIGNoaWxkcmVuXG4vKipcbiAqIEEgQ29tcG9uZW50IHRvIGNvbnRhaW4gdGhlIE11dGVUb2dnbGUgYW5kIFZvbHVtZUNvbnRyb2wgc28gdGhhdFxuICogdGhleSBjYW4gd29yayB0b2dldGhlci5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgVm9sdW1lUGFuZWwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBpbmhlcml0cyhWb2x1bWVQYW5lbCwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBWb2x1bWVQYW5lbChwbGF5ZXIpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVm9sdW1lUGFuZWwpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmlubGluZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuaW5saW5lID0gb3B0aW9ucy5pbmxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuaW5saW5lID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBwYXNzIHRoZSBpbmxpbmUgb3B0aW9uIGRvd24gdG8gdGhlIFZvbHVtZUNvbnRyb2wgYXMgdmVydGljYWwgaWZcbiAgICAvLyB0aGUgVm9sdW1lQ29udHJvbCBpcyBvbi5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudm9sdW1lQ29udHJvbCA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNQbGFpbihvcHRpb25zLnZvbHVtZUNvbnRyb2wpKSB7XG4gICAgICBvcHRpb25zLnZvbHVtZUNvbnRyb2wgPSBvcHRpb25zLnZvbHVtZUNvbnRyb2wgfHwge307XG4gICAgICBvcHRpb25zLnZvbHVtZUNvbnRyb2wudmVydGljYWwgPSAhb3B0aW9ucy5pbmxpbmU7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsIFsnbG9hZHN0YXJ0J10sIF90aGlzLnZvbHVtZVBhbmVsU3RhdGVfKTtcblxuICAgIC8vIHdoaWxlIHRoZSBzbGlkZXIgaXMgYWN0aXZlICh0aGUgbW91c2UgaGFzIGJlZW4gcHJlc3NlZCBkb3duIGFuZFxuICAgIC8vIGlzIGRyYWdnaW5nKSB3ZSBkbyBub3Qgd2FudCB0byBoaWRlIHRoZSBWb2x1bWVCYXJcbiAgICBfdGhpcy5vbihfdGhpcy52b2x1bWVDb250cm9sLCBbJ3NsaWRlcmFjdGl2ZSddLCBfdGhpcy5zbGlkZXJBY3RpdmVfKTtcblxuICAgIF90aGlzLm9uKF90aGlzLnZvbHVtZUNvbnRyb2wsIFsnc2xpZGVyaW5hY3RpdmUnXSwgX3RoaXMuc2xpZGVySW5hY3RpdmVfKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHZqcy1zbGlkZXItYWN0aXZlIGNsYXNzIHRvIHRoZSBWb2x1bWVQYW5lbFxuICAgKlxuICAgKiBAbGlzdGVucyBWb2x1bWVDb250cm9sI3NsaWRlcmFjdGl2ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFZvbHVtZVBhbmVsLnByb3RvdHlwZS5zbGlkZXJBY3RpdmVfID0gZnVuY3Rpb24gc2xpZGVyQWN0aXZlXygpIHtcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtc2xpZGVyLWFjdGl2ZScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHZqcy1zbGlkZXItYWN0aXZlIGNsYXNzIHRvIHRoZSBWb2x1bWVQYW5lbFxuICAgKlxuICAgKiBAbGlzdGVucyBWb2x1bWVDb250cm9sI3NsaWRlcmluYWN0aXZlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVm9sdW1lUGFuZWwucHJvdG90eXBlLnNsaWRlckluYWN0aXZlXyA9IGZ1bmN0aW9uIHNsaWRlckluYWN0aXZlXygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtc2xpZGVyLWFjdGl2ZScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIHZqcy1oaWRkZW4gb3IgdmpzLW11dGUtdG9nZ2xlLW9ubHkgdG8gdGhlIFZvbHVtZVBhbmVsXG4gICAqIGRlcGVuZGluZyBvbiBNdXRlVG9nZ2xlIGFuZCBWb2x1bWVDb250cm9sIHN0YXRlXG4gICAqXG4gICAqIEBsaXN0ZW5zIFBsYXllciNsb2Fkc3RhcnRcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBWb2x1bWVQYW5lbC5wcm90b3R5cGUudm9sdW1lUGFuZWxTdGF0ZV8gPSBmdW5jdGlvbiB2b2x1bWVQYW5lbFN0YXRlXygpIHtcbiAgICAvLyBoaWRlIHZvbHVtZSBwYW5lbCBpZiBuZWl0aGVyIHZvbHVtZSBjb250cm9sIG9yIG11dGUgdG9nZ2xlXG4gICAgLy8gYXJlIGRpc3BsYXllZFxuICAgIGlmICh0aGlzLnZvbHVtZUNvbnRyb2wuaGFzQ2xhc3MoJ3Zqcy1oaWRkZW4nKSAmJiB0aGlzLm11dGVUb2dnbGUuaGFzQ2xhc3MoJ3Zqcy1oaWRkZW4nKSkge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWhpZGRlbicpO1xuICAgIH1cblxuICAgIC8vIGlmIG9ubHkgbXV0ZSB0b2dnbGUgaXMgdmlzaWJsZSB3ZSBkb24ndCB3YW50XG4gICAgLy8gdm9sdW1lIHBhbmVsIGV4cGFuZGluZyB3aGVuIGhvdmVyZWQgb3IgYWN0aXZlXG4gICAgaWYgKHRoaXMudm9sdW1lQ29udHJvbC5oYXNDbGFzcygndmpzLWhpZGRlbicpICYmICF0aGlzLm11dGVUb2dnbGUuaGFzQ2xhc3MoJ3Zqcy1oaWRkZW4nKSkge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLW11dGUtdG9nZ2xlLW9ubHknKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgVm9sdW1lUGFuZWwucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7XG4gICAgdmFyIG9yaWVudGF0aW9uQ2xhc3MgPSAndmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsJztcblxuICAgIGlmICghdGhpcy5vcHRpb25zXy5pbmxpbmUpIHtcbiAgICAgIG9yaWVudGF0aW9uQ2xhc3MgPSAndmpzLXZvbHVtZS1wYW5lbC12ZXJ0aWNhbCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy12b2x1bWUtcGFuZWwgdmpzLWNvbnRyb2wgJyArIG9yaWVudGF0aW9uQ2xhc3NcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVm9sdW1lUGFuZWw7XG59KENvbXBvbmVudCk7XG5cbi8qKlxuICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYFZvbHVtZUNvbnRyb2xgXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5Wb2x1bWVQYW5lbC5wcm90b3R5cGUub3B0aW9uc18gPSB7XG4gIGNoaWxkcmVuOiBbJ211dGVUb2dnbGUnLCAndm9sdW1lQ29udHJvbCddXG59O1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1ZvbHVtZVBhbmVsJywgVm9sdW1lUGFuZWwpO1xuXG4vKipcbiAqIEBmaWxlIG1lbnUuanNcbiAqL1xuLyoqXG4gKiBUaGUgTWVudSBjb21wb25lbnQgaXMgdXNlZCB0byBidWlsZCBwb3B1cCBtZW51cywgaW5jbHVkaW5nIHN1YnRpdGxlIGFuZFxuICogY2FwdGlvbnMgc2VsZWN0aW9uIG1lbnVzLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBNZW51ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoTWVudSwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICB0aGUgcGxheWVyIHRoYXQgdGhpcyBjb21wb25lbnQgc2hvdWxkIGF0dGFjaCB0b1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBPYmplY3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXNcbiAgICpcbiAgICovXG4gIGZ1bmN0aW9uIE1lbnUocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVudSk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBfdGhpcy5tZW51QnV0dG9uXyA9IG9wdGlvbnMubWVudUJ1dHRvbjtcbiAgICB9XG5cbiAgICBfdGhpcy5mb2N1c2VkQ2hpbGRfID0gLTE7XG5cbiAgICBfdGhpcy5vbigna2V5ZG93bicsIF90aGlzLmhhbmRsZUtleVByZXNzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEge0BsaW5rIE1lbnVJdGVtfSB0byB0aGUgbWVudS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBjb21wb25lbnRcbiAgICogICAgICAgIFRoZSBuYW1lIG9yIGluc3RhbmNlIG9mIHRoZSBgTWVudUl0ZW1gIHRvIGFkZC5cbiAgICpcbiAgICovXG5cblxuICBNZW51LnByb3RvdHlwZS5hZGRJdGVtID0gZnVuY3Rpb24gYWRkSXRlbShjb21wb25lbnQpIHtcbiAgICB0aGlzLmFkZENoaWxkKGNvbXBvbmVudCk7XG4gICAgY29tcG9uZW50Lm9uKCdjbGljaycsIGJpbmQodGhpcywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBVbnByZXNzIHRoZSBhc3NvY2lhdGVkIE1lbnVCdXR0b24sIGFuZCBtb3ZlIGZvY3VzIGJhY2sgdG8gaXRcbiAgICAgIGlmICh0aGlzLm1lbnVCdXR0b25fKSB7XG4gICAgICAgIHRoaXMubWVudUJ1dHRvbl8udW5wcmVzc0J1dHRvbigpO1xuXG4gICAgICAgIC8vIGRvbid0IGZvY3VzIG1lbnUgYnV0dG9uIGlmIGl0ZW0gaXMgYSBjYXB0aW9uIHNldHRpbmdzIGl0ZW1cbiAgICAgICAgLy8gYmVjYXVzZSBmb2N1cyB3aWxsIG1vdmUgZWxzZXdoZXJlIGFuZCBpdCBsb2dzIGFuIGVycm9yIG9uIElFOFxuICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUoKSAhPT0gJ0NhcHRpb25TZXR0aW5nc01lbnVJdGVtJykge1xuICAgICAgICAgIHRoaXMubWVudUJ1dHRvbl8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgTWVudWBzIERPTSBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIHRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWRcbiAgICovXG5cblxuICBNZW51LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHZhciBjb250ZW50RWxUeXBlID0gdGhpcy5vcHRpb25zXy5jb250ZW50RWxUeXBlIHx8ICd1bCc7XG5cbiAgICB0aGlzLmNvbnRlbnRFbF8gPSBjcmVhdGVFbChjb250ZW50RWxUeXBlLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbWVudS1jb250ZW50J1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb250ZW50RWxfLnNldEF0dHJpYnV0ZSgncm9sZScsICdtZW51Jyk7XG5cbiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBhcHBlbmQ6IHRoaXMuY29udGVudEVsXyxcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1tZW51J1xuICAgIH0pO1xuXG4gICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50RWxfKTtcblxuICAgIC8vIFByZXZlbnQgY2xpY2tzIGZyb20gYnViYmxpbmcgdXAuIE5lZWRlZCBmb3IgTWVudSBCdXR0b25zLFxuICAgIC8vIHdoZXJlIGEgY2xpY2sgb24gdGhlIHBhcmVudCBpcyBzaWduaWZpY2FudFxuICAgIG9uKGVsLCAnY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICB0aGlzLmNvbnRlbnRFbF8gPSBudWxsO1xuXG4gICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBga2V5ZG93bmAgZXZlbnQgb24gdGhpcyBtZW51LiBUaGlzIGxpc3RlbmVyIGlzIGFkZGVkIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIEEgYGtleWRvd25gIGV2ZW50IHRoYXQgaGFwcGVuZWQgb24gdGhlIG1lbnUuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBNZW51LnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7XG4gICAgLy8gTGVmdCBhbmQgRG93biBBcnJvd3NcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDM3IHx8IGV2ZW50LndoaWNoID09PSA0MCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEZvcndhcmQoKTtcblxuICAgICAgLy8gVXAgYW5kIFJpZ2h0IEFycm93c1xuICAgIH0gZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IDM4IHx8IGV2ZW50LndoaWNoID09PSAzOSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEJhY2soKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE1vdmUgdG8gbmV4dCAobG93ZXIpIG1lbnUgaXRlbSBmb3Iga2V5Ym9hcmQgdXNlcnMuXG4gICAqL1xuXG5cbiAgTWVudS5wcm90b3R5cGUuc3RlcEZvcndhcmQgPSBmdW5jdGlvbiBzdGVwRm9yd2FyZCgpIHtcbiAgICB2YXIgc3RlcENoaWxkID0gMDtcblxuICAgIGlmICh0aGlzLmZvY3VzZWRDaGlsZF8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RlcENoaWxkID0gdGhpcy5mb2N1c2VkQ2hpbGRfICsgMTtcbiAgICB9XG4gICAgdGhpcy5mb2N1cyhzdGVwQ2hpbGQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBNb3ZlIHRvIHByZXZpb3VzIChoaWdoZXIpIG1lbnUgaXRlbSBmb3Iga2V5Ym9hcmQgdXNlcnMuXG4gICAqL1xuXG5cbiAgTWVudS5wcm90b3R5cGUuc3RlcEJhY2sgPSBmdW5jdGlvbiBzdGVwQmFjaygpIHtcbiAgICB2YXIgc3RlcENoaWxkID0gMDtcblxuICAgIGlmICh0aGlzLmZvY3VzZWRDaGlsZF8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RlcENoaWxkID0gdGhpcy5mb2N1c2VkQ2hpbGRfIC0gMTtcbiAgICB9XG4gICAgdGhpcy5mb2N1cyhzdGVwQ2hpbGQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgZm9jdXMgb24gYSB7QGxpbmsgTWVudUl0ZW19IGluIHRoZSBgTWVudWAuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gW2l0ZW09MF1cbiAgICogICAgICAgIEluZGV4IG9mIGNoaWxkIGl0ZW0gc2V0IGZvY3VzIG9uLlxuICAgKi9cblxuXG4gIE1lbnUucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgdmFyIGl0ZW0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDA7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuKCkuc2xpY2UoKTtcbiAgICB2YXIgaGF2ZVRpdGxlID0gY2hpbGRyZW4ubGVuZ3RoICYmIGNoaWxkcmVuWzBdLmNsYXNzTmFtZSAmJiAvdmpzLW1lbnUtdGl0bGUvLnRlc3QoY2hpbGRyZW5bMF0uY2xhc3NOYW1lKTtcblxuICAgIGlmIChoYXZlVGl0bGUpIHtcbiAgICAgIGNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChpdGVtIDwgMCkge1xuICAgICAgICBpdGVtID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbSA+PSBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgaXRlbSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZm9jdXNlZENoaWxkXyA9IGl0ZW07XG5cbiAgICAgIGNoaWxkcmVuW2l0ZW1dLmVsXy5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTWVudTtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdNZW51JywgTWVudSk7XG5cbi8qKlxuICogQGZpbGUgbWVudS1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBBIGBNZW51QnV0dG9uYCBjbGFzcyBmb3IgYW55IHBvcHVwIHtAbGluayBNZW51fS5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgTWVudUJ1dHRvbiA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKE1lbnVCdXR0b24sIF9Db21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gTWVudUJ1dHRvbihwbGF5ZXIpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVudUJ1dHRvbik7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLm1lbnVCdXR0b25fID0gbmV3IEJ1dHRvbihwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgX3RoaXMubWVudUJ1dHRvbl8uY29udHJvbFRleHQoX3RoaXMuY29udHJvbFRleHRfKTtcbiAgICBfdGhpcy5tZW51QnV0dG9uXy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWhhc3BvcHVwJywgJ3RydWUnKTtcblxuICAgIC8vIEFkZCBidWlsZENTU0NsYXNzIHZhbHVlcyB0byB0aGUgYnV0dG9uLCBub3QgdGhlIHdyYXBwZXJcbiAgICB2YXIgYnV0dG9uQ2xhc3MgPSBCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MoKTtcblxuICAgIF90aGlzLm1lbnVCdXR0b25fLmVsXy5jbGFzc05hbWUgPSBfdGhpcy5idWlsZENTU0NsYXNzKCkgKyAnICcgKyBidXR0b25DbGFzcztcbiAgICBfdGhpcy5tZW51QnV0dG9uXy5yZW1vdmVDbGFzcygndmpzLWNvbnRyb2wnKTtcblxuICAgIF90aGlzLmFkZENoaWxkKF90aGlzLm1lbnVCdXR0b25fKTtcblxuICAgIF90aGlzLnVwZGF0ZSgpO1xuXG4gICAgX3RoaXMuZW5hYmxlZF8gPSB0cnVlO1xuXG4gICAgX3RoaXMub24oX3RoaXMubWVudUJ1dHRvbl8sICd0YXAnLCBfdGhpcy5oYW5kbGVDbGljayk7XG4gICAgX3RoaXMub24oX3RoaXMubWVudUJ1dHRvbl8sICdjbGljaycsIF90aGlzLmhhbmRsZUNsaWNrKTtcbiAgICBfdGhpcy5vbihfdGhpcy5tZW51QnV0dG9uXywgJ2ZvY3VzJywgX3RoaXMuaGFuZGxlRm9jdXMpO1xuICAgIF90aGlzLm9uKF90aGlzLm1lbnVCdXR0b25fLCAnYmx1cicsIF90aGlzLmhhbmRsZUJsdXIpO1xuXG4gICAgX3RoaXMub24oJ2tleWRvd24nLCBfdGhpcy5oYW5kbGVTdWJtZW51S2V5UHJlc3MpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG1lbnUgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgaXRzIGl0ZW1zLlxuICAgKi9cblxuXG4gIE1lbnVCdXR0b24ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICB2YXIgbWVudSA9IHRoaXMuY3JlYXRlTWVudSgpO1xuXG4gICAgaWYgKHRoaXMubWVudSkge1xuICAgICAgdGhpcy5tZW51LmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5tZW51KTtcbiAgICB9XG5cbiAgICB0aGlzLm1lbnUgPSBtZW51O1xuICAgIHRoaXMuYWRkQ2hpbGQobWVudSk7XG5cbiAgICAvKipcbiAgICAgKiBUcmFjayB0aGUgc3RhdGUgb2YgdGhlIG1lbnUgYnV0dG9uXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuYnV0dG9uUHJlc3NlZF8gPSBmYWxzZTtcbiAgICB0aGlzLm1lbnVCdXR0b25fLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcblxuICAgIGlmICh0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMubGVuZ3RoIDw9IHRoaXMuaGlkZVRocmVzaG9sZF8pIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgbWVudSBhbmQgYWRkIGFsbCBpdGVtcyB0byBpdC5cbiAgICpcbiAgICogQHJldHVybiB7TWVudX1cbiAgICogICAgICAgICBUaGUgY29uc3RydWN0ZWQgbWVudVxuICAgKi9cblxuXG4gIE1lbnVCdXR0b24ucHJvdG90eXBlLmNyZWF0ZU1lbnUgPSBmdW5jdGlvbiBjcmVhdGVNZW51KCkge1xuICAgIHZhciBtZW51ID0gbmV3IE1lbnUodGhpcy5wbGF5ZXJfLCB7IG1lbnVCdXR0b246IHRoaXMgfSk7XG5cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBtZW51IGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgdGhyZXNob2xkLiBUaGlzIGRlZmF1bHRzXG4gICAgICogdG8gMCBhbmQgd2hlbmV2ZXIgd2UgYWRkIGl0ZW1zIHdoaWNoIGNhbiBiZSBoaWRkZW4gdG8gdGhlIG1lbnUgd2UnbGwgaW5jcmVtZW50IGl0LiBXZSBsaXN0XG4gICAgICogaXQgaGVyZSBiZWNhdXNlIGV2ZXJ5IHRpbWUgd2UgcnVuIGBjcmVhdGVNZW51YCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuaGlkZVRocmVzaG9sZF8gPSAwO1xuXG4gICAgLy8gQWRkIGEgdGl0bGUgbGlzdCBpdGVtIHRvIHRoZSB0b3BcbiAgICBpZiAodGhpcy5vcHRpb25zXy50aXRsZSkge1xuICAgICAgdmFyIHRpdGxlID0gY3JlYXRlRWwoJ2xpJywge1xuICAgICAgICBjbGFzc05hbWU6ICd2anMtbWVudS10aXRsZScsXG4gICAgICAgIGlubmVySFRNTDogdG9UaXRsZUNhc2UodGhpcy5vcHRpb25zXy50aXRsZSksXG4gICAgICAgIHRhYkluZGV4OiAtMVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaGlkZVRocmVzaG9sZF8gKz0gMTtcblxuICAgICAgbWVudS5jaGlsZHJlbl8udW5zaGlmdCh0aXRsZSk7XG4gICAgICBwcmVwZW5kVG8odGl0bGUsIG1lbnUuY29udGVudEVsKCkpO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmNyZWF0ZUl0ZW1zKCk7XG5cbiAgICBpZiAodGhpcy5pdGVtcykge1xuICAgICAgLy8gQWRkIG1lbnUgaXRlbXMgdG8gdGhlIG1lbnVcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtZW51LmFkZEl0ZW0odGhpcy5pdGVtc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnU7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgbGlzdCBvZiBtZW51IGl0ZW1zLiBTcGVjaWZpYyB0byBlYWNoIHN1YmNsYXNzLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcyA9IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkge307XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYE1lbnVCdXR0b25zYHMgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHtcbiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiB0aGlzLmJ1aWxkV3JhcHBlckNTU0NsYXNzKClcbiAgICB9LCB7fSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFsbG93IHN1YiBjb21wb25lbnRzIHRvIHN0YWNrIENTUyBjbGFzcyBuYW1lcyBmb3IgdGhlIHdyYXBwZXIgZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIGNvbnN0cnVjdGVkIHdyYXBwZXIgRE9NIGBjbGFzc05hbWVgXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZFdyYXBwZXJDU1NDbGFzcygpIHtcbiAgICB2YXIgbWVudUJ1dHRvbkNsYXNzID0gJ3Zqcy1tZW51LWJ1dHRvbic7XG5cbiAgICAvLyBJZiB0aGUgaW5saW5lIG9wdGlvbiBpcyBwYXNzZWQsIHdlIHdhbnQgdG8gdXNlIGRpZmZlcmVudCBzdHlsZXMgYWx0b2dldGhlci5cbiAgICBpZiAodGhpcy5vcHRpb25zXy5pbmxpbmUgPT09IHRydWUpIHtcbiAgICAgIG1lbnVCdXR0b25DbGFzcyArPSAnLWlubGluZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lbnVCdXR0b25DbGFzcyArPSAnLXBvcHVwJztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaXggdGhlIENTUyBzbyB0aGF0IHRoaXMgaXNuJ3QgbmVjZXNzYXJ5XG4gICAgdmFyIGJ1dHRvbkNsYXNzID0gQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzKCk7XG5cbiAgICByZXR1cm4gJ3Zqcy1tZW51LWJ1dHRvbiAnICsgbWVudUJ1dHRvbkNsYXNzICsgJyAnICsgYnV0dG9uQ2xhc3MgKyAnICcgKyBfQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICB2YXIgbWVudUJ1dHRvbkNsYXNzID0gJ3Zqcy1tZW51LWJ1dHRvbic7XG5cbiAgICAvLyBJZiB0aGUgaW5saW5lIG9wdGlvbiBpcyBwYXNzZWQsIHdlIHdhbnQgdG8gdXNlIGRpZmZlcmVudCBzdHlsZXMgYWx0b2dldGhlci5cbiAgICBpZiAodGhpcy5vcHRpb25zXy5pbmxpbmUgPT09IHRydWUpIHtcbiAgICAgIG1lbnVCdXR0b25DbGFzcyArPSAnLWlubGluZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lbnVCdXR0b25DbGFzcyArPSAnLXBvcHVwJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ3Zqcy1tZW51LWJ1dHRvbiAnICsgbWVudUJ1dHRvbkNsYXNzICsgJyAnICsgX0NvbXBvbmVudC5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBsb2NhbGl6ZWQgY29udHJvbCB0ZXh0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciBhY2Nlc3NpYmlsaXR5LlxuICAgKlxuICAgKiA+IE5PVEU6IFRoaXMgd2lsbCBjb21lIGZyb20gdGhlIGludGVybmFsIGBtZW51QnV0dG9uX2AgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XVxuICAgKiAgICAgICAgQ29udHJvbCB0ZXh0IGZvciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbD10aGlzLm1lbnVCdXR0b25fLmVsKCldXG4gICAqICAgICAgICBFbGVtZW50IHRvIHNldCB0aGUgdGl0bGUgb24uXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICAtIFRoZSBjb250cm9sIHRleHQgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHQgPSBmdW5jdGlvbiBjb250cm9sVGV4dCh0ZXh0KSB7XG4gICAgdmFyIGVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0aGlzLm1lbnVCdXR0b25fLmVsKCk7XG5cbiAgICByZXR1cm4gdGhpcy5tZW51QnV0dG9uXy5jb250cm9sVGV4dCh0ZXh0LCBlbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGNsaWNrIG9uIGEgYE1lbnVCdXR0b25gLlxuICAgKiBTZWUge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudCNoYW5kbGVDbGlja30gZm9yIGluc3RhbmNlcyB3aGVyZSB0aGlzIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIC8vIFdoZW4geW91IGNsaWNrIHRoZSBidXR0b24gaXQgYWRkcyBmb2N1cywgd2hpY2ggd2lsbCBzaG93IHRoZSBtZW51LlxuICAgIC8vIFNvIHdlJ2xsIHJlbW92ZSBmb2N1cyB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGJ1dHRvbi4gRm9jdXMgaXMgbmVlZGVkXG4gICAgLy8gZm9yIHRhYiBuYXZpZ2F0aW9uLlxuXG4gICAgdGhpcy5vbmUodGhpcy5tZW51LmNvbnRlbnRFbCgpLCAnbW91c2VsZWF2ZScsIGJpbmQodGhpcywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHRoaXMudW5wcmVzc0J1dHRvbigpO1xuICAgICAgdGhpcy5lbF8uYmx1cigpO1xuICAgIH0pKTtcbiAgICBpZiAodGhpcy5idXR0b25QcmVzc2VkXykge1xuICAgICAgdGhpcy51bnByZXNzQnV0dG9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlc3NCdXR0b24oKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZm9jdXMgdG8gdGhlIGFjdHVhbCBidXR0b24sIG5vdCB0byB0aGlzIGVsZW1lbnRcbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgIHRoaXMubWVudUJ1dHRvbl8uZm9jdXMoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBmb2N1cyBmcm9tIHRoZSBhY3R1YWwgYnV0dG9uLCBub3QgdGhpcyBlbGVtZW50XG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuYmx1ciA9IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgdGhpcy5tZW51QnV0dG9uXy5ibHVyKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGBNZW51QnV0dG9uYCBnYWlucyBmb2N1cyB2aWEgYSBgZm9jdXNgIGV2ZW50LlxuICAgKiBUdXJucyBvbiBsaXN0ZW5pbmcgZm9yIGBrZXlkb3duYCBldmVudHMuIFdoZW4gdGhleSBoYXBwZW4gaXRcbiAgICogY2FsbHMgYHRoaXMuaGFuZGxlS2V5UHJlc3NgLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBmb2N1c2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGZvY3VzXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cygpIHtcbiAgICBvbihkb2N1bWVudCwgJ2tleWRvd24nLCBiaW5kKHRoaXMsIHRoaXMuaGFuZGxlS2V5UHJlc3MpKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBgTWVudUJ1dHRvbmAgbG9zZXMgZm9jdXMuIFR1cm5zIG9mZiB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIGBrZXlkb3duYCBldmVudHMuIFdoaWNoIFN0b3BzIGB0aGlzLmhhbmRsZUtleVByZXNzYCBmcm9tIGdldHRpbmcgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgVGhlIGBibHVyYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgYmx1clxuICAgKi9cblxuXG4gIE1lbnVCdXR0b24ucHJvdG90eXBlLmhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKCkge1xuICAgIG9mZihkb2N1bWVudCwgJ2tleWRvd24nLCBiaW5kKHRoaXMsIHRoaXMuaGFuZGxlS2V5UHJlc3MpKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIHRhYiwgZXNjYXBlLCBkb3duIGFycm93LCBhbmQgdXAgYXJyb3cga2V5cyBmb3IgYE1lbnVCdXR0b25gLiBTZWVcbiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudCNoYW5kbGVLZXlQcmVzc30gZm9yIGluc3RhbmNlcyB3aGVyZSB0aGlzIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7XG5cbiAgICAvLyBFc2NhcGUgKDI3KSBrZXkgb3IgVGFiICg5KSBrZXkgdW5wcmVzcyB0aGUgJ2J1dHRvbidcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDI3IHx8IGV2ZW50LndoaWNoID09PSA5KSB7XG4gICAgICBpZiAodGhpcy5idXR0b25QcmVzc2VkXykge1xuICAgICAgICB0aGlzLnVucHJlc3NCdXR0b24oKTtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IHByZXZlbnREZWZhdWx0IGZvciBUYWIga2V5IC0gd2Ugc3RpbGwgd2FudCB0byBsb3NlIGZvY3VzXG4gICAgICBpZiAoZXZlbnQud2hpY2ggIT09IDkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gU2V0IGZvY3VzIGJhY2sgdG8gdGhlIG1lbnUgYnV0dG9uJ3MgYnV0dG9uXG4gICAgICAgIHRoaXMubWVudUJ1dHRvbl8uZWxfLmZvY3VzKCk7XG4gICAgICB9XG4gICAgICAvLyBVcCAoMzgpIGtleSBvciBEb3duICg0MCkga2V5IHByZXNzIHRoZSAnYnV0dG9uJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IDM4IHx8IGV2ZW50LndoaWNoID09PSA0MCkge1xuICAgICAgaWYgKCF0aGlzLmJ1dHRvblByZXNzZWRfKSB7XG4gICAgICAgIHRoaXMucHJlc3NCdXR0b24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGBrZXlkb3duYCBldmVudCBvbiBhIHN1Yi1tZW51LiBUaGUgbGlzdGVuZXIgZm9yIHRoaXMgaXMgYWRkZWQgaW5cbiAgICogdGhlIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgS2V5IHByZXNzIGV2ZW50XG4gICAqXG4gICAqIEBsaXN0ZW5zIGtleWRvd25cbiAgICovXG5cblxuICBNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVTdWJtZW51S2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVTdWJtZW51S2V5UHJlc3MoZXZlbnQpIHtcblxuICAgIC8vIEVzY2FwZSAoMjcpIGtleSBvciBUYWIgKDkpIGtleSB1bnByZXNzIHRoZSAnYnV0dG9uJ1xuICAgIGlmIChldmVudC53aGljaCA9PT0gMjcgfHwgZXZlbnQud2hpY2ggPT09IDkpIHtcbiAgICAgIGlmICh0aGlzLmJ1dHRvblByZXNzZWRfKSB7XG4gICAgICAgIHRoaXMudW5wcmVzc0J1dHRvbigpO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgcHJldmVudERlZmF1bHQgZm9yIFRhYiBrZXkgLSB3ZSBzdGlsbCB3YW50IHRvIGxvc2UgZm9jdXNcbiAgICAgIGlmIChldmVudC53aGljaCAhPT0gOSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBTZXQgZm9jdXMgYmFjayB0byB0aGUgbWVudSBidXR0b24ncyBidXR0b25cbiAgICAgICAgdGhpcy5tZW51QnV0dG9uXy5lbF8uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1dCB0aGUgY3VycmVudCBgTWVudUJ1dHRvbmAgaW50byBhIHByZXNzZWQgc3RhdGUuXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUucHJlc3NCdXR0b24gPSBmdW5jdGlvbiBwcmVzc0J1dHRvbigpIHtcbiAgICBpZiAodGhpcy5lbmFibGVkXykge1xuICAgICAgdGhpcy5idXR0b25QcmVzc2VkXyA9IHRydWU7XG4gICAgICB0aGlzLm1lbnUubG9ja1Nob3dpbmcoKTtcbiAgICAgIHRoaXMubWVudUJ1dHRvbl8uZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG5cbiAgICAgIC8vIHNldCB0aGUgZm9jdXMgaW50byB0aGUgc3VibWVudSwgZXhjZXB0IG9uIGlPUyB3aGVyZSBpdCBpcyByZXN1bHRpbmcgaW5cbiAgICAgIC8vIHVuZGVzaXJlZCBzY3JvbGxpbmcgYmVoYXZpb3Igd2hlbiB0aGUgcGxheWVyIGlzIGluIGFuIGlmcmFtZVxuICAgICAgaWYgKElTX0lPUyAmJiBpc0luRnJhbWUoKSkge1xuICAgICAgICAvLyBSZXR1cm4gZWFybHkgc28gdGhhdCB0aGUgbWVudSBpc24ndCBmb2N1c2VkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tZW51LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSBjdXJyZW50IGBNZW51QnV0dG9uYCBvdXQgb2YgYSBwcmVzc2VkIHN0YXRlLlxuICAgKi9cblxuXG4gIE1lbnVCdXR0b24ucHJvdG90eXBlLnVucHJlc3NCdXR0b24gPSBmdW5jdGlvbiB1bnByZXNzQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLmVuYWJsZWRfKSB7XG4gICAgICB0aGlzLmJ1dHRvblByZXNzZWRfID0gZmFsc2U7XG4gICAgICB0aGlzLm1lbnUudW5sb2NrU2hvd2luZygpO1xuICAgICAgdGhpcy5tZW51QnV0dG9uXy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoZSBgTWVudUJ1dHRvbmAuIERvbid0IGFsbG93IGl0IHRvIGJlIGNsaWNrZWQuXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgdGhpcy51bnByZXNzQnV0dG9uKCk7XG5cbiAgICB0aGlzLmVuYWJsZWRfID0gZmFsc2U7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWRpc2FibGVkJyk7XG5cbiAgICB0aGlzLm1lbnVCdXR0b25fLmRpc2FibGUoKTtcbiAgfTtcblxuICAvKipcbiAgICogRW5hYmxlIHRoZSBgTWVudUJ1dHRvbmAuIEFsbG93IGl0IHRvIGJlIGNsaWNrZWQuXG4gICAqL1xuXG5cbiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIHRoaXMuZW5hYmxlZF8gPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1kaXNhYmxlZCcpO1xuXG4gICAgdGhpcy5tZW51QnV0dG9uXy5lbmFibGUoKTtcbiAgfTtcblxuICByZXR1cm4gTWVudUJ1dHRvbjtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdNZW51QnV0dG9uJywgTWVudUJ1dHRvbik7XG5cbi8qKlxuICogQGZpbGUgdHJhY2stYnV0dG9uLmpzXG4gKi9cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGJ1dHRvbnMgdGhhdCB0b2dnbGUgc3BlY2lmaWMgIHRyYWNrIHR5cGVzIChlLmcuIHN1YnRpdGxlcykuXG4gKlxuICogQGV4dGVuZHMgTWVudUJ1dHRvblxuICovXG5cbnZhciBUcmFja0J1dHRvbiA9IGZ1bmN0aW9uIChfTWVudUJ1dHRvbikge1xuICBpbmhlcml0cyhUcmFja0J1dHRvbiwgX01lbnVCdXR0b24pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gVHJhY2tCdXR0b24ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhY2tCdXR0b24pO1xuXG4gICAgdmFyIHRyYWNrcyA9IG9wdGlvbnMudHJhY2tzO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTWVudUJ1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgaWYgKF90aGlzLml0ZW1zLmxlbmd0aCA8PSAxKSB7XG4gICAgICBfdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0cmFja3MpIHtcbiAgICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzKTtcbiAgICB9XG5cbiAgICB2YXIgdXBkYXRlSGFuZGxlciA9IGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZSk7XG5cbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB1cGRhdGVIYW5kbGVyKTtcbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCB1cGRhdGVIYW5kbGVyKTtcbiAgICBfdGhpcy5wbGF5ZXJfLm9uKCdyZWFkeScsIHVwZGF0ZUhhbmRsZXIpO1xuXG4gICAgX3RoaXMucGxheWVyXy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIHVwZGF0ZUhhbmRsZXIpO1xuICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FkZHRyYWNrJywgdXBkYXRlSGFuZGxlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIFRyYWNrQnV0dG9uO1xufShNZW51QnV0dG9uKTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUcmFja0J1dHRvbicsIFRyYWNrQnV0dG9uKTtcblxuLyoqXG4gKiBAZmlsZSBtZW51LWl0ZW0uanNcbiAqL1xuLyoqXG4gKiBUaGUgY29tcG9uZW50IGZvciBhIG1lbnUgaXRlbS4gYDxsaT5gXG4gKlxuICogQGV4dGVuZHMgQ2xpY2thYmxlQ29tcG9uZW50XG4gKi9cblxudmFyIE1lbnVJdGVtID0gZnVuY3Rpb24gKF9DbGlja2FibGVDb21wb25lbnQpIHtcbiAgaW5oZXJpdHMoTWVudUl0ZW0sIF9DbGlja2FibGVDb21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICpcbiAgICovXG4gIGZ1bmN0aW9uIE1lbnVJdGVtKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVJdGVtKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NsaWNrYWJsZUNvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMuc2VsZWN0YWJsZSA9IG9wdGlvbnMuc2VsZWN0YWJsZTtcbiAgICBfdGhpcy5pc1NlbGVjdGVkXyA9IG9wdGlvbnMuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgX3RoaXMubXVsdGlTZWxlY3RhYmxlID0gb3B0aW9ucy5tdWx0aVNlbGVjdGFibGU7XG5cbiAgICBfdGhpcy5zZWxlY3RlZChfdGhpcy5pc1NlbGVjdGVkXyk7XG5cbiAgICBpZiAoX3RoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgaWYgKF90aGlzLm11bHRpU2VsZWN0YWJsZSkge1xuICAgICAgICBfdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdyb2xlJywgJ21lbnVpdGVtY2hlY2tib3gnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnbWVudWl0ZW1yYWRpbycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdyb2xlJywgJ21lbnVpdGVtJyk7XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBNZW51SXRlbSdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT1saV1cbiAgICogICAgICAgIEVsZW1lbnQncyBub2RlIHR5cGUsIG5vdCBhY3R1YWxseSB1c2VkLCBhbHdheXMgc2V0IHRvIGBsaWAuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHM9e31dXG4gICAqICAgICAgICBBbiBvYmplY3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBzZXQgb24gdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFthdHRycz17fV1cbiAgICogICAgICAgIEFuIG9iamVjdCBvZiBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIE1lbnVJdGVtLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKHR5cGUsIHByb3BzLCBhdHRycykge1xuICAgIC8vIFRoZSBjb250cm9sIGlzIHRleHR1YWwsIG5vdCBqdXN0IGFuIGljb25cbiAgICB0aGlzLm5vbkljb25Db250cm9sID0gdHJ1ZTtcblxuICAgIHJldHVybiBfQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdsaScsIGFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbWVudS1pdGVtJyxcbiAgICAgIGlubmVySFRNTDogJzxzcGFuIGNsYXNzPVwidmpzLW1lbnUtaXRlbS10ZXh0XCI+JyArIHRoaXMubG9jYWxpemUodGhpcy5vcHRpb25zXy5sYWJlbCkgKyAnPC9zcGFuPicsXG4gICAgICB0YWJJbmRleDogLTFcbiAgICB9LCBwcm9wcyksIGF0dHJzKTtcbiAgfTtcblxuICAvKipcbiAgICogQW55IGNsaWNrIG9uIGEgYE1lbnVJdGVtYCBwdXRzIGl0IGludG8gdGhlIHNlbGVjdGVkIHN0YXRlLlxuICAgKiBTZWUge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudCNoYW5kbGVDbGlja30gZm9yIGluc3RhbmNlcyB3aGVyZSB0aGlzIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICB0aGlzLnNlbGVjdGVkKHRydWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN0YXRlIGZvciB0aGlzIG1lbnUgaXRlbSBhcyBzZWxlY3RlZCBvciBub3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ZWRcbiAgICogICAgICAgIGlmIHRoZSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQgb3Igbm90XG4gICAqL1xuXG5cbiAgTWVudUl0ZW0ucHJvdG90eXBlLnNlbGVjdGVkID0gZnVuY3Rpb24gc2VsZWN0ZWQoX3NlbGVjdGVkKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgaWYgKF9zZWxlY3RlZCkge1xuICAgICAgICB0aGlzLmFkZENsYXNzKCd2anMtc2VsZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCAndHJ1ZScpO1xuICAgICAgICAvLyBhcmlhLWNoZWNrZWQgaXNuJ3QgZnVsbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzL3NjcmVlbiByZWFkZXJzLFxuICAgICAgICAvLyBzbyBpbmRpY2F0ZSBzZWxlY3RlZCBzdGF0ZSB0byBzY3JlZW4gcmVhZGVyIGluIHRoZSBjb250cm9sIHRleHQuXG4gICAgICAgIHRoaXMuY29udHJvbFRleHQoJywgc2VsZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtc2VsZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgLy8gSW5kaWNhdGUgdW4tc2VsZWN0ZWQgc3RhdGUgdG8gc2NyZWVuIHJlYWRlclxuICAgICAgICB0aGlzLmNvbnRyb2xUZXh0KCcnKTtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkXyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTWVudUl0ZW07XG59KENsaWNrYWJsZUNvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTWVudUl0ZW0nLCBNZW51SXRlbSk7XG5cbi8qKlxuICogQGZpbGUgdGV4dC10cmFjay1tZW51LWl0ZW0uanNcbiAqL1xuLyoqXG4gKiBUaGUgc3BlY2lmaWMgbWVudSBpdGVtIHR5cGUgZm9yIHNlbGVjdGluZyBhIGxhbmd1YWdlIHdpdGhpbiBhIHRleHQgdHJhY2sga2luZFxuICpcbiAqIEBleHRlbmRzIE1lbnVJdGVtXG4gKi9cblxudmFyIFRleHRUcmFja01lbnVJdGVtID0gZnVuY3Rpb24gKF9NZW51SXRlbSkge1xuICBpbmhlcml0cyhUZXh0VHJhY2tNZW51SXRlbSwgX01lbnVJdGVtKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFRleHRUcmFja01lbnVJdGVtKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFja01lbnVJdGVtKTtcblxuICAgIHZhciB0cmFjayA9IG9wdGlvbnMudHJhY2s7XG4gICAgdmFyIHRyYWNrcyA9IHBsYXllci50ZXh0VHJhY2tzKCk7XG5cbiAgICAvLyBNb2RpZnkgb3B0aW9ucyBmb3IgcGFyZW50IE1lbnVJdGVtIGNsYXNzJ3MgaW5pdC5cbiAgICBvcHRpb25zLmxhYmVsID0gdHJhY2subGFiZWwgfHwgdHJhY2subGFuZ3VhZ2UgfHwgJ1Vua25vd24nO1xuICAgIG9wdGlvbnMuc2VsZWN0ZWQgPSB0cmFjay5tb2RlID09PSAnc2hvd2luZyc7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9NZW51SXRlbS5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMudHJhY2sgPSB0cmFjaztcbiAgICB2YXIgY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uIGNoYW5nZUhhbmRsZXIoKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5oYW5kbGVUcmFja3NDaGFuZ2UuYXBwbHkoX3RoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgdmFyIHNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gc2VsZWN0ZWRMYW5ndWFnZUNoYW5nZUhhbmRsZXIoKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmhhbmRsZVNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2UuYXBwbHkoX3RoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24oWydsb2Fkc3RhcnQnLCAndGV4dHRyYWNrY2hhbmdlJ10sIGNoYW5nZUhhbmRsZXIpO1xuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0ZWRsYW5ndWFnZWNoYW5nZScsIHNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2VIYW5kbGVyKTtcbiAgICBfdGhpcy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsYXllci5vZmYoWydsb2Fkc3RhcnQnLCAndGV4dHRyYWNrY2hhbmdlJ10sIGNoYW5nZUhhbmRsZXIpO1xuICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlbGVjdGVkbGFuZ3VhZ2VjaGFuZ2UnLCBzZWxlY3RlZExhbmd1YWdlQ2hhbmdlSGFuZGxlcik7XG4gICAgfSk7XG5cbiAgICAvLyBpT1M3IGRvZXNuJ3QgZGlzcGF0Y2ggY2hhbmdlIGV2ZW50cyB0byBUZXh0VHJhY2tMaXN0cyB3aGVuIGFuXG4gICAgLy8gYXNzb2NpYXRlZCB0cmFjaydzIG1vZGUgY2hhbmdlcy4gV2l0aG91dCBzb21ldGhpbmcgbGlrZVxuICAgIC8vIE9iamVjdC5vYnNlcnZlKCkgKGFsc28gbm90IHByZXNlbnQgb24gaU9TNyksIGl0J3Mgbm90XG4gICAgLy8gcG9zc2libGUgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gdGhlIG1vZGUgYXR0cmlidXRlIGFuZCBwb2x5ZmlsbFxuICAgIC8vIHRoZSBjaGFuZ2UgZXZlbnQuIEFzIGEgcG9vciBzdWJzdGl0dXRlLCB3ZSBtYW51YWxseSBkaXNwYXRjaFxuICAgIC8vIGNoYW5nZSBldmVudHMgd2hlbmV2ZXIgdGhlIGNvbnRyb2xzIG1vZGlmeSB0aGUgbW9kZS5cbiAgICBpZiAodHJhY2tzLm9uY2hhbmdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBldmVudCA9IHZvaWQgMDtcblxuICAgICAgX3RoaXMub24oWyd0YXAnLCAnY2xpY2snXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3R5cGVvZih3aW5kb3cuRXZlbnQpICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIC8vIEFuZHJvaWQgMi4zIHRocm93cyBhbiBJbGxlZ2FsIENvbnN0cnVjdG9yIGVycm9yIGZvciB3aW5kb3cuRXZlbnRcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZlbnQgPSBuZXcgd2luZG93LkV2ZW50KCdjaGFuZ2UnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgICAgICBldmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2tzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHRoZSBkZWZhdWx0IHN0YXRlIGJhc2VkIG9uIGN1cnJlbnQgdHJhY2tzXG4gICAgX3RoaXMuaGFuZGxlVHJhY2tzQ2hhbmdlKCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgVGV4dFRyYWNrTWVudUl0ZW1gIGlzIFwiY2xpY2tlZFwiLiBTZWVcbiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudH0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICB2YXIga2luZCA9IHRoaXMudHJhY2sua2luZDtcbiAgICB2YXIga2luZHMgPSB0aGlzLnRyYWNrLmtpbmRzO1xuICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrcygpO1xuXG4gICAgaWYgKCFraW5kcykge1xuICAgICAga2luZHMgPSBba2luZF07XG4gICAgfVxuXG4gICAgX01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljay5jYWxsKHRoaXMsIGV2ZW50KTtcblxuICAgIGlmICghdHJhY2tzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgaWYgKHRyYWNrID09PSB0aGlzLnRyYWNrICYmIGtpbmRzLmluZGV4T2YodHJhY2sua2luZCkgPiAtMSkge1xuICAgICAgICBpZiAodHJhY2subW9kZSAhPT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgICAgdHJhY2subW9kZSA9ICdzaG93aW5nJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmFjay5tb2RlICE9PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgIHRyYWNrLm1vZGUgPSAnZGlzYWJsZWQnO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlIHRleHQgdHJhY2sgbGlzdCBjaGFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnRcbiAgICogICAgICAgIFRoZSBgY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgVGV4dFRyYWNrTGlzdCNjaGFuZ2VcbiAgICovXG5cblxuICBUZXh0VHJhY2tNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlVHJhY2tzQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlVHJhY2tzQ2hhbmdlKGV2ZW50KSB7XG4gICAgdmFyIHNob3VsZEJlU2VsZWN0ZWQgPSB0aGlzLnRyYWNrLm1vZGUgPT09ICdzaG93aW5nJztcblxuICAgIC8vIFByZXZlbnQgcmVkdW5kYW50IHNlbGVjdGVkKCkgY2FsbHMgYmVjYXVzZSB0aGV5IG1heSBjYXVzZVxuICAgIC8vIHNjcmVlbiByZWFkZXJzIHRvIHJlYWQgdGhlIGFwcGVuZGVkIGNvbnRyb2wgdGV4dCB1bm5lY2Vzc2FyaWx5XG4gICAgaWYgKHNob3VsZEJlU2VsZWN0ZWQgIT09IHRoaXMuaXNTZWxlY3RlZF8pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQoc2hvdWxkQmVTZWxlY3RlZCk7XG4gICAgfVxuICB9O1xuXG4gIFRleHRUcmFja01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVTZWxlY3RlZExhbmd1YWdlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlU2VsZWN0ZWRMYW5ndWFnZUNoYW5nZShldmVudCkge1xuICAgIGlmICh0aGlzLnRyYWNrLm1vZGUgPT09ICdzaG93aW5nJykge1xuICAgICAgdmFyIHNlbGVjdGVkTGFuZ3VhZ2UgPSB0aGlzLnBsYXllcl8uY2FjaGVfLnNlbGVjdGVkTGFuZ3VhZ2U7XG5cbiAgICAgIC8vIERvbid0IHJlcGxhY2UgdGhlIGtpbmQgb2YgdHJhY2sgYWNyb3NzIHRoZSBzYW1lIGxhbmd1YWdlXG4gICAgICBpZiAoc2VsZWN0ZWRMYW5ndWFnZSAmJiBzZWxlY3RlZExhbmd1YWdlLmVuYWJsZWQgJiYgc2VsZWN0ZWRMYW5ndWFnZS5sYW5ndWFnZSA9PT0gdGhpcy50cmFjay5sYW5ndWFnZSAmJiBzZWxlY3RlZExhbmd1YWdlLmtpbmQgIT09IHRoaXMudHJhY2sua2luZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxheWVyXy5jYWNoZV8uc2VsZWN0ZWRMYW5ndWFnZSA9IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMudHJhY2subGFuZ3VhZ2UsXG4gICAgICAgIGtpbmQ6IHRoaXMudHJhY2sua2luZFxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gdHJhY2sgb2JqZWN0IG9uIGRpc3Bvc2VcbiAgICB0aGlzLnRyYWNrID0gbnVsbDtcblxuICAgIF9NZW51SXRlbS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2tNZW51SXRlbTtcbn0oTWVudUl0ZW0pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RleHRUcmFja01lbnVJdGVtJywgVGV4dFRyYWNrTWVudUl0ZW0pO1xuXG4vKipcbiAqIEBmaWxlIG9mZi10ZXh0LXRyYWNrLW1lbnUtaXRlbS5qc1xuICovXG4vKipcbiAqIEEgc3BlY2lhbCBtZW51IGl0ZW0gZm9yIHR1cm5pbmcgb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHRleHQgdHJhY2tcbiAqXG4gKiBAZXh0ZW5kcyBUZXh0VHJhY2tNZW51SXRlbVxuICovXG5cbnZhciBPZmZUZXh0VHJhY2tNZW51SXRlbSA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrTWVudUl0ZW0pIHtcbiAgaW5oZXJpdHMoT2ZmVGV4dFRyYWNrTWVudUl0ZW0sIF9UZXh0VHJhY2tNZW51SXRlbSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBPZmZUZXh0VHJhY2tNZW51SXRlbShwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBPZmZUZXh0VHJhY2tNZW51SXRlbSk7XG5cbiAgICAvLyBDcmVhdGUgcHNldWRvIHRyYWNrIGluZm9cbiAgICAvLyBSZXF1aXJlcyBvcHRpb25zWydraW5kJ11cbiAgICBvcHRpb25zLnRyYWNrID0ge1xuICAgICAgcGxheWVyOiBwbGF5ZXIsXG4gICAgICBraW5kOiBvcHRpb25zLmtpbmQsXG4gICAgICBraW5kczogb3B0aW9ucy5raW5kcyxcbiAgICAgICdkZWZhdWx0JzogZmFsc2UsXG4gICAgICBtb2RlOiAnZGlzYWJsZWQnXG4gICAgfTtcblxuICAgIGlmICghb3B0aW9ucy5raW5kcykge1xuICAgICAgb3B0aW9ucy5raW5kcyA9IFtvcHRpb25zLmtpbmRdO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmxhYmVsKSB7XG4gICAgICBvcHRpb25zLnRyYWNrLmxhYmVsID0gb3B0aW9ucy5sYWJlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy50cmFjay5sYWJlbCA9IG9wdGlvbnMua2luZHMuam9pbignIGFuZCAnKSArICcgb2ZmJztcbiAgICB9XG5cbiAgICAvLyBNZW51SXRlbSBpcyBzZWxlY3RhYmxlXG4gICAgb3B0aW9ucy5zZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAvLyBNZW51SXRlbSBpcyBOT1QgbXVsdGlTZWxlY3RhYmxlIChpLmUuIG9ubHkgb25lIGNhbiBiZSBtYXJrZWQgXCJzZWxlY3RlZFwiIGF0IGEgdGltZSlcbiAgICBvcHRpb25zLm11bHRpU2VsZWN0YWJsZSA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja01lbnVJdGVtLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRleHQgdHJhY2sgY2hhbmdlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW5cbiAgICovXG5cblxuICBPZmZUZXh0VHJhY2tNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlVHJhY2tzQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlVHJhY2tzQ2hhbmdlKGV2ZW50KSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyKCkudGV4dFRyYWNrcygpO1xuICAgIHZhciBzaG91bGRCZVNlbGVjdGVkID0gdHJ1ZTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdHJhY2tzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIHRyYWNrID0gdHJhY2tzW2ldO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zXy5raW5kcy5pbmRleE9mKHRyYWNrLmtpbmQpID4gLTEgJiYgdHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgIHNob3VsZEJlU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCByZWR1bmRhbnQgc2VsZWN0ZWQoKSBjYWxscyBiZWNhdXNlIHRoZXkgbWF5IGNhdXNlXG4gICAgLy8gc2NyZWVuIHJlYWRlcnMgdG8gcmVhZCB0aGUgYXBwZW5kZWQgY29udHJvbCB0ZXh0IHVubmVjZXNzYXJpbHlcbiAgICBpZiAoc2hvdWxkQmVTZWxlY3RlZCAhPT0gdGhpcy5pc1NlbGVjdGVkXykge1xuICAgICAgdGhpcy5zZWxlY3RlZChzaG91bGRCZVNlbGVjdGVkKTtcbiAgICB9XG4gIH07XG5cbiAgT2ZmVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZVNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVTZWxlY3RlZExhbmd1YWdlQ2hhbmdlKGV2ZW50KSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyKCkudGV4dFRyYWNrcygpO1xuICAgIHZhciBhbGxIaWRkZW4gPSB0cnVlO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0cmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIGlmIChbJ2NhcHRpb25zJywgJ2Rlc2NyaXB0aW9ucycsICdzdWJ0aXRsZXMnXS5pbmRleE9mKHRyYWNrLmtpbmQpID4gLTEgJiYgdHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgIGFsbEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWxsSGlkZGVuKSB7XG4gICAgICB0aGlzLnBsYXllcl8uY2FjaGVfLnNlbGVjdGVkTGFuZ3VhZ2UgPSB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gT2ZmVGV4dFRyYWNrTWVudUl0ZW07XG59KFRleHRUcmFja01lbnVJdGVtKTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdPZmZUZXh0VHJhY2tNZW51SXRlbScsIE9mZlRleHRUcmFja01lbnVJdGVtKTtcblxuLyoqXG4gKiBAZmlsZSB0ZXh0LXRyYWNrLWJ1dHRvbi5qc1xuICovXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBidXR0b25zIHRoYXQgdG9nZ2xlIHNwZWNpZmljIHRleHQgdHJhY2sgdHlwZXMgKGUuZy4gc3VidGl0bGVzKVxuICpcbiAqIEBleHRlbmRzIE1lbnVCdXR0b25cbiAqL1xuXG52YXIgVGV4dFRyYWNrQnV0dG9uID0gZnVuY3Rpb24gKF9UcmFja0J1dHRvbikge1xuICBpbmhlcml0cyhUZXh0VHJhY2tCdXR0b24sIF9UcmFja0J1dHRvbik7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0VHJhY2tCdXR0b24ocGxheWVyKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFja0J1dHRvbik7XG5cbiAgICBvcHRpb25zLnRyYWNrcyA9IHBsYXllci50ZXh0VHJhY2tzKCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2tCdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtZW51IGl0ZW0gZm9yIGVhY2ggdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja01lbnVJdGVtW119IFtpdGVtcz1bXV1cbiAgICogICAgICAgIEV4aXN0aW5nIGFycmF5IG9mIGl0ZW1zIHRvIHVzZSBkdXJpbmcgY3JlYXRpb25cbiAgICpcbiAgICogQHJldHVybiB7VGV4dFRyYWNrTWVudUl0ZW1bXX1cbiAgICogICAgICAgICBBcnJheSBvZiBtZW51IGl0ZW1zIHRoYXQgd2VyZSBjcmVhdGVkXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcyA9IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkge1xuICAgIHZhciBpdGVtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgdmFyIFRyYWNrTWVudUl0ZW0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFRleHRUcmFja01lbnVJdGVtO1xuXG5cbiAgICAvLyBMYWJlbCBpcyBhbiBvdmVyaWRlIGZvciB0aGUgW3RyYWNrXSBvZmYgbGFiZWxcbiAgICAvLyBVU2VkIHRvIGxvY2FsaXNlIGNhcHRpb25zL3N1YnRpdGxlc1xuICAgIHZhciBsYWJlbCA9IHZvaWQgMDtcblxuICAgIGlmICh0aGlzLmxhYmVsXykge1xuICAgICAgbGFiZWwgPSB0aGlzLmxhYmVsXyArICcgb2ZmJztcbiAgICB9XG4gICAgLy8gQWRkIGFuIE9GRiBtZW51IGl0ZW0gdG8gdHVybiBhbGwgdHJhY2tzIG9mZlxuICAgIGl0ZW1zLnB1c2gobmV3IE9mZlRleHRUcmFja01lbnVJdGVtKHRoaXMucGxheWVyXywge1xuICAgICAga2luZHM6IHRoaXMua2luZHNfLFxuICAgICAga2luZDogdGhpcy5raW5kXyxcbiAgICAgIGxhYmVsOiBsYWJlbFxuICAgIH0pKTtcblxuICAgIHRoaXMuaGlkZVRocmVzaG9sZF8gKz0gMTtcblxuICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrcygpO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMua2luZHNfKSkge1xuICAgICAgdGhpcy5raW5kc18gPSBbdGhpcy5raW5kX107XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgLy8gb25seSBhZGQgdHJhY2tzIHRoYXQgYXJlIG9mIGFuIGFwcHJvcHJpYXRlIGtpbmQgYW5kIGhhdmUgYSBsYWJlbFxuICAgICAgaWYgKHRoaXMua2luZHNfLmluZGV4T2YodHJhY2sua2luZCkgPiAtMSkge1xuXG4gICAgICAgIHZhciBpdGVtID0gbmV3IFRyYWNrTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7XG4gICAgICAgICAgdHJhY2s6IHRyYWNrLFxuICAgICAgICAgIC8vIE1lbnVJdGVtIGlzIHNlbGVjdGFibGVcbiAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICAgIC8vIE1lbnVJdGVtIGlzIE5PVCBtdWx0aVNlbGVjdGFibGUgKGkuZS4gb25seSBvbmUgY2FuIGJlIG1hcmtlZCBcInNlbGVjdGVkXCIgYXQgYSB0aW1lKVxuICAgICAgICAgIG11bHRpU2VsZWN0YWJsZTogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXRlbS5hZGRDbGFzcygndmpzLScgKyB0cmFjay5raW5kICsgJy1tZW51LWl0ZW0nKTtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH07XG5cbiAgcmV0dXJuIFRleHRUcmFja0J1dHRvbjtcbn0oVHJhY2tCdXR0b24pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RleHRUcmFja0J1dHRvbicsIFRleHRUcmFja0J1dHRvbik7XG5cbi8qKlxuICogQGZpbGUgY2hhcHRlcnMtdHJhY2stbWVudS1pdGVtLmpzXG4gKi9cbi8qKlxuICogVGhlIGNoYXB0ZXIgdHJhY2sgbWVudSBpdGVtXG4gKlxuICogQGV4dGVuZHMgTWVudUl0ZW1cbiAqL1xuXG52YXIgQ2hhcHRlcnNUcmFja01lbnVJdGVtID0gZnVuY3Rpb24gKF9NZW51SXRlbSkge1xuICBpbmhlcml0cyhDaGFwdGVyc1RyYWNrTWVudUl0ZW0sIF9NZW51SXRlbSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBDaGFwdGVyc1RyYWNrTWVudUl0ZW0ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2hhcHRlcnNUcmFja01lbnVJdGVtKTtcblxuICAgIHZhciB0cmFjayA9IG9wdGlvbnMudHJhY2s7XG4gICAgdmFyIGN1ZSA9IG9wdGlvbnMuY3VlO1xuICAgIHZhciBjdXJyZW50VGltZSA9IHBsYXllci5jdXJyZW50VGltZSgpO1xuXG4gICAgLy8gTW9kaWZ5IG9wdGlvbnMgZm9yIHBhcmVudCBNZW51SXRlbSBjbGFzcydzIGluaXQuXG4gICAgb3B0aW9ucy5zZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICBvcHRpb25zLm11bHRpU2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgIG9wdGlvbnMubGFiZWwgPSBjdWUudGV4dDtcbiAgICBvcHRpb25zLnNlbGVjdGVkID0gY3VlLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSAmJiBjdXJyZW50VGltZSA8IGN1ZS5lbmRUaW1lO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTWVudUl0ZW0uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnRyYWNrID0gdHJhY2s7XG4gICAgX3RoaXMuY3VlID0gY3VlO1xuICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2N1ZWNoYW5nZScsIGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZSkpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYENoYXB0ZXJzVHJhY2tNZW51SXRlbWAgaXMgXCJjbGlja2VkXCIuIFNlZVxuICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdXG4gICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlXG4gICAqICAgICAgICBjYWxsZWQuXG4gICAqXG4gICAqIEBsaXN0ZW5zIHRhcFxuICAgKiBAbGlzdGVucyBjbGlja1xuICAgKi9cblxuXG4gIENoYXB0ZXJzVHJhY2tNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIF9NZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2suY2FsbCh0aGlzKTtcbiAgICB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUodGhpcy5jdWUuc3RhcnRUaW1lKTtcbiAgICB0aGlzLnVwZGF0ZSh0aGlzLmN1ZS5zdGFydFRpbWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2hhcHRlciBtZW51IGl0ZW1cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGBjdWVjaGFuZ2VgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBUZXh0VHJhY2sjY3VlY2hhbmdlXG4gICAqL1xuXG5cbiAgQ2hhcHRlcnNUcmFja01lbnVJdGVtLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHtcbiAgICB2YXIgY3VlID0gdGhpcy5jdWU7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7XG5cbiAgICAvLyB2anMubG9nKGN1cnJlbnRUaW1lLCBjdWUuc3RhcnRUaW1lKTtcbiAgICB0aGlzLnNlbGVjdGVkKGN1ZS5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUgJiYgY3VycmVudFRpbWUgPCBjdWUuZW5kVGltZSk7XG4gIH07XG5cbiAgcmV0dXJuIENoYXB0ZXJzVHJhY2tNZW51SXRlbTtcbn0oTWVudUl0ZW0pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NoYXB0ZXJzVHJhY2tNZW51SXRlbScsIENoYXB0ZXJzVHJhY2tNZW51SXRlbSk7XG5cbi8qKlxuICogQGZpbGUgY2hhcHRlcnMtYnV0dG9uLmpzXG4gKi9cbi8qKlxuICogVGhlIGJ1dHRvbiBjb21wb25lbnQgZm9yIHRvZ2dsaW5nIGFuZCBzZWxlY3RpbmcgY2hhcHRlcnNcbiAqIENoYXB0ZXJzIGFjdCBtdWNoIGRpZmZlcmVudGx5IHRoYW4gb3RoZXIgdGV4dCB0cmFja3NcbiAqIEN1ZXMgYXJlIG5hdmlnYXRpb24gdnMuIG90aGVyIHRyYWNrcyBvZiBhbHRlcm5hdGl2ZSBsYW5ndWFnZXNcbiAqXG4gKiBAZXh0ZW5kcyBUZXh0VHJhY2tCdXR0b25cbiAqL1xuXG52YXIgQ2hhcHRlcnNCdXR0b24gPSBmdW5jdGlvbiAoX1RleHRUcmFja0J1dHRvbikge1xuICBpbmhlcml0cyhDaGFwdGVyc0J1dHRvbiwgX1RleHRUcmFja0J1dHRvbik7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV1cbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyByZWFkeS5cbiAgICovXG4gIGZ1bmN0aW9uIENoYXB0ZXJzQnV0dG9uKHBsYXllciwgb3B0aW9ucywgcmVhZHkpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDaGFwdGVyc0J1dHRvbik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucywgcmVhZHkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWNoYXB0ZXJzLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckNTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWNoYXB0ZXJzLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBtZW51IGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIGl0cyBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgQW4gZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRleHRUcmFja0xpc3QjYWRkdHJhY2tcbiAgICogQGxpc3RlbnMgVGV4dFRyYWNrTGlzdCNyZW1vdmV0cmFja1xuICAgKiBAbGlzdGVucyBUZXh0VHJhY2tMaXN0I2NoYW5nZVxuICAgKi9cblxuXG4gIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMudHJhY2tfIHx8IGV2ZW50ICYmIChldmVudC50eXBlID09PSAnYWRkdHJhY2snIHx8IGV2ZW50LnR5cGUgPT09ICdyZW1vdmV0cmFjaycpKSB7XG4gICAgICB0aGlzLnNldFRyYWNrKHRoaXMuZmluZENoYXB0ZXJzVHJhY2soKSk7XG4gICAgfVxuICAgIF9UZXh0VHJhY2tCdXR0b24ucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0cmFjayBmb3IgdGhlIGNoYXB0ZXJzIGJ1dHRvbi5cbiAgICpcbiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrXG4gICAqICAgICAgICBUaGUgbmV3IHRyYWNrIHRvIHNlbGVjdC4gTm90aGluZyB3aWxsIGNoYW5nZSBpZiB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWRcbiAgICogICAgICAgIHRyYWNrLlxuICAgKi9cblxuXG4gIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5zZXRUcmFjayA9IGZ1bmN0aW9uIHNldFRyYWNrKHRyYWNrKSB7XG4gICAgaWYgKHRoaXMudHJhY2tfID09PSB0cmFjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51cGRhdGVIYW5kbGVyXykge1xuICAgICAgdGhpcy51cGRhdGVIYW5kbGVyXyA9IHRoaXMudXBkYXRlLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gaGVyZSB0aGlzLnRyYWNrXyByZWZlcnMgdG8gdGhlIG9sZCB0cmFjayBpbnN0YW5jZVxuICAgIGlmICh0aGlzLnRyYWNrXykge1xuICAgICAgdmFyIHJlbW90ZVRleHRUcmFja0VsID0gdGhpcy5wbGF5ZXJfLnJlbW90ZVRleHRUcmFja0VscygpLmdldFRyYWNrRWxlbWVudEJ5VHJhY2tfKHRoaXMudHJhY2tfKTtcblxuICAgICAgaWYgKHJlbW90ZVRleHRUcmFja0VsKSB7XG4gICAgICAgIHJlbW90ZVRleHRUcmFja0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLnVwZGF0ZUhhbmRsZXJfKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmFja18gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMudHJhY2tfID0gdHJhY2s7XG5cbiAgICAvLyBoZXJlIHRoaXMudHJhY2tfIHJlZmVycyB0byB0aGUgbmV3IHRyYWNrIGluc3RhbmNlXG4gICAgaWYgKHRoaXMudHJhY2tfKSB7XG4gICAgICB0aGlzLnRyYWNrXy5tb2RlID0gJ2hpZGRlbic7XG5cbiAgICAgIHZhciBfcmVtb3RlVGV4dFRyYWNrRWwgPSB0aGlzLnBsYXllcl8ucmVtb3RlVGV4dFRyYWNrRWxzKCkuZ2V0VHJhY2tFbGVtZW50QnlUcmFja18odGhpcy50cmFja18pO1xuXG4gICAgICBpZiAoX3JlbW90ZVRleHRUcmFja0VsKSB7XG4gICAgICAgIF9yZW1vdGVUZXh0VHJhY2tFbC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdGhpcy51cGRhdGVIYW5kbGVyXyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSB0cmFjayBvYmplY3QgdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoaXMgQ2hhcHRlcnNCdXR0b25cbiAgICpcbiAgICogQHJldHVybiB7VGV4dFRyYWNrfHVuZGVmaW5lZH1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB0cmFjayBvciB1bmRlZmluZWQgaWYgbm9uZSB3YXMgZm91bmQuXG4gICAqL1xuXG5cbiAgQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmZpbmRDaGFwdGVyc1RyYWNrID0gZnVuY3Rpb24gZmluZENoYXB0ZXJzVHJhY2soKSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyXy50ZXh0VHJhY2tzKCkgfHwgW107XG5cbiAgICBmb3IgKHZhciBpID0gdHJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAvLyBXZSB3aWxsIGFsd2F5cyBjaG9vc2UgdGhlIGxhc3QgdHJhY2sgYXMgb3VyIGNoYXB0ZXJzVHJhY2tcbiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgaWYgKHRyYWNrLmtpbmQgPT09IHRoaXMua2luZF8pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjYXB0aW9uIGZvciB0aGUgQ2hhcHRlcnNCdXR0b24gYmFzZWQgb24gdGhlIHRyYWNrIGxhYmVsLiBUaGlzIHdpbGwgYWxzb1xuICAgKiB1c2UgdGhlIGN1cnJlbnQgdHJhY2tzIGxvY2FsaXplZCBraW5kIGFzIGEgZmFsbGJhY2sgaWYgYSBsYWJlbCBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSB0cmFja3MgY3VycmVudCBsYWJlbCBvciB0aGUgbG9jYWxpemVkIHRyYWNrIGtpbmQuXG4gICAqL1xuXG5cbiAgQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmdldE1lbnVDYXB0aW9uID0gZnVuY3Rpb24gZ2V0TWVudUNhcHRpb24oKSB7XG4gICAgaWYgKHRoaXMudHJhY2tfICYmIHRoaXMudHJhY2tfLmxhYmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja18ubGFiZWw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvY2FsaXplKHRvVGl0bGVDYXNlKHRoaXMua2luZF8pKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIG1lbnUgZnJvbSBjaGFwdGVyIHRyYWNrXG4gICAqXG4gICAqIEByZXR1cm4ge01lbnV9XG4gICAqICAgICAgICAgTmV3IG1lbnUgZm9yIHRoZSBjaGFwdGVyIGJ1dHRvbnNcbiAgICovXG5cblxuICBDaGFwdGVyc0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlTWVudSA9IGZ1bmN0aW9uIGNyZWF0ZU1lbnUoKSB7XG4gICAgdGhpcy5vcHRpb25zXy50aXRsZSA9IHRoaXMuZ2V0TWVudUNhcHRpb24oKTtcbiAgICByZXR1cm4gX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlTWVudS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtZW51IGl0ZW0gZm9yIGVhY2ggdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2tNZW51SXRlbVtdfVxuICAgKiAgICAgICAgIEFycmF5IG9mIG1lbnUgaXRlbXNcbiAgICovXG5cblxuICBDaGFwdGVyc0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlSXRlbXMgPSBmdW5jdGlvbiBjcmVhdGVJdGVtcygpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcblxuICAgIGlmICghdGhpcy50cmFja18pIHtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICB2YXIgY3VlcyA9IHRoaXMudHJhY2tfLmN1ZXM7XG5cbiAgICBpZiAoIWN1ZXMpIHtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGN1ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY3VlID0gY3Vlc1tpXTtcbiAgICAgIHZhciBtaSA9IG5ldyBDaGFwdGVyc1RyYWNrTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7IHRyYWNrOiB0aGlzLnRyYWNrXywgY3VlOiBjdWUgfSk7XG5cbiAgICAgIGl0ZW1zLnB1c2gobWkpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfTtcblxuICByZXR1cm4gQ2hhcHRlcnNCdXR0b247XG59KFRleHRUcmFja0J1dHRvbik7XG5cbi8qKlxuICogYGtpbmRgIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5DaGFwdGVyc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnY2hhcHRlcnMnO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYENoYXB0ZXJzQnV0dG9uYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbkNoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnQ2hhcHRlcnMnO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NoYXB0ZXJzQnV0dG9uJywgQ2hhcHRlcnNCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIGRlc2NyaXB0aW9ucy1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgYnV0dG9uIGNvbXBvbmVudCBmb3IgdG9nZ2xpbmcgYW5kIHNlbGVjdGluZyBkZXNjcmlwdGlvbnNcbiAqXG4gKiBAZXh0ZW5kcyBUZXh0VHJhY2tCdXR0b25cbiAqL1xuXG52YXIgRGVzY3JpcHRpb25zQnV0dG9uID0gZnVuY3Rpb24gKF9UZXh0VHJhY2tCdXR0b24pIHtcbiAgaW5oZXJpdHMoRGVzY3JpcHRpb25zQnV0dG9uLCBfVGV4dFRyYWNrQnV0dG9uKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21wb25lbnR+UmVhZHlDYWxsYmFja30gW3JlYWR5XVxuICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyByZWFkeS5cbiAgICovXG4gIGZ1bmN0aW9uIERlc2NyaXB0aW9uc0J1dHRvbihwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRGVzY3JpcHRpb25zQnV0dG9uKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucywgcmVhZHkpKTtcblxuICAgIHZhciB0cmFja3MgPSBwbGF5ZXIudGV4dFRyYWNrcygpO1xuICAgIHZhciBjaGFuZ2VIYW5kbGVyID0gYmluZChfdGhpcywgX3RoaXMuaGFuZGxlVHJhY2tzQ2hhbmdlKTtcblxuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICBfdGhpcy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRleHQgdHJhY2sgY2hhbmdlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW5cbiAgICpcbiAgICogQGxpc3RlbnMgVGV4dFRyYWNrTGlzdCNjaGFuZ2VcbiAgICovXG5cblxuICBEZXNjcmlwdGlvbnNCdXR0b24ucHJvdG90eXBlLmhhbmRsZVRyYWNrc0NoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZVRyYWNrc0NoYW5nZShldmVudCkge1xuICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcigpLnRleHRUcmFja3MoKTtcbiAgICB2YXIgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8vIENoZWNrIHdoZXRoZXIgYSB0cmFjayBvZiBhIGRpZmZlcmVudCBraW5kIGlzIHNob3dpbmdcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRyYWNrcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgaWYgKHRyYWNrLmtpbmQgIT09IHRoaXMua2luZF8gJiYgdHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYW5vdGhlciB0cmFjayBpcyBzaG93aW5nLCBkaXNhYmxlIHRoaXMgbWVudSBidXR0b25cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuYWJsZSgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIERlc2NyaXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtZGVzY3JpcHRpb25zLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIERlc2NyaXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZFdyYXBwZXJDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1kZXNjcmlwdGlvbnMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIHJldHVybiBEZXNjcmlwdGlvbnNCdXR0b247XG59KFRleHRUcmFja0J1dHRvbik7XG5cbi8qKlxuICogYGtpbmRgIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5EZXNjcmlwdGlvbnNCdXR0b24ucHJvdG90eXBlLmtpbmRfID0gJ2Rlc2NyaXB0aW9ucyc7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgRGVzY3JpcHRpb25zQnV0dG9uYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbkRlc2NyaXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0Rlc2NyaXB0aW9ucyc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnRGVzY3JpcHRpb25zQnV0dG9uJywgRGVzY3JpcHRpb25zQnV0dG9uKTtcblxuLyoqXG4gKiBAZmlsZSBzdWJ0aXRsZXMtYnV0dG9uLmpzXG4gKi9cbi8qKlxuICogVGhlIGJ1dHRvbiBjb21wb25lbnQgZm9yIHRvZ2dsaW5nIGFuZCBzZWxlY3Rpbmcgc3VidGl0bGVzXG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrQnV0dG9uXG4gKi9cblxudmFyIFN1YnRpdGxlc0J1dHRvbiA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrQnV0dG9uKSB7XG4gIGluaGVyaXRzKFN1YnRpdGxlc0J1dHRvbiwgX1RleHRUcmFja0J1dHRvbik7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV1cbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgcmVhZHkuXG4gICAqL1xuICBmdW5jdGlvbiBTdWJ0aXRsZXNCdXR0b24ocGxheWVyLCBvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFN1YnRpdGxlc0J1dHRvbik7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucywgcmVhZHkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqL1xuXG5cbiAgU3VidGl0bGVzQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1zdWJ0aXRsZXMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgU3VidGl0bGVzQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckNTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLXN1YnRpdGxlcy1idXR0b24gJyArIF9UZXh0VHJhY2tCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgcmV0dXJuIFN1YnRpdGxlc0J1dHRvbjtcbn0oVGV4dFRyYWNrQnV0dG9uKTtcblxuLyoqXG4gKiBga2luZGAgb2YgVGV4dFRyYWNrIHRvIGxvb2sgZm9yIHRvIGFzc29jaWF0ZSBpdCB3aXRoIHRoaXMgbWVudS5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5cblN1YnRpdGxlc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnc3VidGl0bGVzJztcblxuLyoqXG4gKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBTdWJ0aXRsZXNCdXR0b25gcyBjb250cm9scy4gQWRkZWQgZm9yIGxvY2FsaXphdGlvbi5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuU3VidGl0bGVzQnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnU3VidGl0bGVzJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdTdWJ0aXRsZXNCdXR0b24nLCBTdWJ0aXRsZXNCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIGNhcHRpb24tc2V0dGluZ3MtbWVudS1pdGVtLmpzXG4gKi9cbi8qKlxuICogVGhlIG1lbnUgaXRlbSBmb3IgY2FwdGlvbiB0cmFjayBzZXR0aW5ncyBtZW51XG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrTWVudUl0ZW1cbiAqL1xuXG52YXIgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0gPSBmdW5jdGlvbiAoX1RleHRUcmFja01lbnVJdGVtKSB7XG4gIGluaGVyaXRzKENhcHRpb25TZXR0aW5nc01lbnVJdGVtLCBfVGV4dFRyYWNrTWVudUl0ZW0pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0ocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0pO1xuXG4gICAgb3B0aW9ucy50cmFjayA9IHtcbiAgICAgIHBsYXllcjogcGxheWVyLFxuICAgICAga2luZDogb3B0aW9ucy5raW5kLFxuICAgICAgbGFiZWw6IG9wdGlvbnMua2luZCArICcgc2V0dGluZ3MnLFxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAnZGVmYXVsdCc6IGZhbHNlLFxuICAgICAgbW9kZTogJ2Rpc2FibGVkJ1xuICAgIH07XG5cbiAgICAvLyBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbSBoYXMgbm8gY29uY2VwdCBvZiAnc2VsZWN0ZWQnXG4gICAgb3B0aW9ucy5zZWxlY3RhYmxlID0gZmFsc2U7XG5cbiAgICBvcHRpb25zLm5hbWUgPSAnQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0nO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVGV4dFRyYWNrTWVudUl0ZW0uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLmFkZENsYXNzKCd2anMtdGV4dHRyYWNrLXNldHRpbmdzJyk7XG4gICAgX3RoaXMuY29udHJvbFRleHQoJywgb3BlbnMgJyArIG9wdGlvbnMua2luZCArICcgc2V0dGluZ3MgZGlhbG9nJyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW1gIGlzIFwiY2xpY2tlZFwiLiBTZWVcbiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudH0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgKiAgICAgICAgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB0YXBcbiAgICogQGxpc3RlbnMgY2xpY2tcbiAgICovXG5cblxuICBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIHRoaXMucGxheWVyKCkuZ2V0Q2hpbGQoJ3RleHRUcmFja1NldHRpbmdzJykub3BlbigpO1xuICB9O1xuXG4gIHJldHVybiBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbTtcbn0oVGV4dFRyYWNrTWVudUl0ZW0pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NhcHRpb25TZXR0aW5nc01lbnVJdGVtJywgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0pO1xuXG4vKipcbiAqIEBmaWxlIGNhcHRpb25zLWJ1dHRvbi5qc1xuICovXG4vKipcbiAqIFRoZSBidXR0b24gY29tcG9uZW50IGZvciB0b2dnbGluZyBhbmQgc2VsZWN0aW5nIGNhcHRpb25zXG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrQnV0dG9uXG4gKi9cblxudmFyIENhcHRpb25zQnV0dG9uID0gZnVuY3Rpb24gKF9UZXh0VHJhY2tCdXR0b24pIHtcbiAgaW5oZXJpdHMoQ2FwdGlvbnNCdXR0b24sIF9UZXh0VHJhY2tCdXR0b24pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSBbcmVhZHldXG4gICAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHJlYWR5LlxuICAgKi9cbiAgZnVuY3Rpb24gQ2FwdGlvbnNCdXR0b24ocGxheWVyLCBvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENhcHRpb25zQnV0dG9uKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVGV4dFRyYWNrQnV0dG9uLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zLCByZWFkeSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBDYXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY2FwdGlvbnMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgQ2FwdGlvbnNCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRXcmFwcGVyQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY2FwdGlvbnMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgY2FwdGlvbiBtZW51IGl0ZW1zXG4gICAqXG4gICAqIEByZXR1cm4ge0NhcHRpb25TZXR0aW5nc01lbnVJdGVtW119XG4gICAqICAgICAgICAgVGhlIGFycmF5IG9mIGN1cnJlbnQgbWVudSBpdGVtcy5cbiAgICovXG5cblxuICBDYXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlSXRlbXMgPSBmdW5jdGlvbiBjcmVhdGVJdGVtcygpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcblxuICAgIGlmICghKHRoaXMucGxheWVyKCkudGVjaF8gJiYgdGhpcy5wbGF5ZXIoKS50ZWNoXy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpICYmIHRoaXMucGxheWVyKCkuZ2V0Q2hpbGQoJ3RleHRUcmFja1NldHRpbmdzJykpIHtcbiAgICAgIGl0ZW1zLnB1c2gobmV3IENhcHRpb25TZXR0aW5nc01lbnVJdGVtKHRoaXMucGxheWVyXywgeyBraW5kOiB0aGlzLmtpbmRfIH0pKTtcblxuICAgICAgdGhpcy5oaWRlVGhyZXNob2xkXyArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcy5jYWxsKHRoaXMsIGl0ZW1zKTtcbiAgfTtcblxuICByZXR1cm4gQ2FwdGlvbnNCdXR0b247XG59KFRleHRUcmFja0J1dHRvbik7XG5cbi8qKlxuICogYGtpbmRgIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5DYXB0aW9uc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnY2FwdGlvbnMnO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYENhcHRpb25zQnV0dG9uYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbkNhcHRpb25zQnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnQ2FwdGlvbnMnO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NhcHRpb25zQnV0dG9uJywgQ2FwdGlvbnNCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIHN1YnMtY2Fwcy1tZW51LWl0ZW0uanNcbiAqL1xuLyoqXG4gKiBTdWJzQ2Fwc01lbnVJdGVtIGhhcyBhbiBbY2NdIGljb24gdG8gZGlzdGluZ3Vpc2ggY2FwdGlvbnMgZnJvbSBzdWJ0aXRsZXNcbiAqIGluIHRoZSBTdWJzQ2Fwc01lbnUuXG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrTWVudUl0ZW1cbiAqL1xuXG52YXIgU3Vic0NhcHNNZW51SXRlbSA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrTWVudUl0ZW0pIHtcbiAgaW5oZXJpdHMoU3Vic0NhcHNNZW51SXRlbSwgX1RleHRUcmFja01lbnVJdGVtKTtcblxuICBmdW5jdGlvbiBTdWJzQ2Fwc01lbnVJdGVtKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFN1YnNDYXBzTWVudUl0ZW0pO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UZXh0VHJhY2tNZW51SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFN1YnNDYXBzTWVudUl0ZW0ucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwodHlwZSwgcHJvcHMsIGF0dHJzKSB7XG4gICAgdmFyIGlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cInZqcy1tZW51LWl0ZW0tdGV4dFwiPicgKyB0aGlzLmxvY2FsaXplKHRoaXMub3B0aW9uc18ubGFiZWwpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9uc18udHJhY2sua2luZCA9PT0gJ2NhcHRpb25zJykge1xuICAgICAgaW5uZXJIVE1MICs9ICdcXG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwidmpzLWljb24tcGxhY2Vob2xkZXJcIj48L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj4gJyArIHRoaXMubG9jYWxpemUoJ0NhcHRpb25zJykgKyAnPC9zcGFuPlxcbiAgICAgICc7XG4gICAgfVxuXG4gICAgaW5uZXJIVE1MICs9ICc8L3NwYW4+JztcblxuICAgIHZhciBlbCA9IF9UZXh0VHJhY2tNZW51SXRlbS5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCB0eXBlLCBhc3NpZ24oe1xuICAgICAgaW5uZXJIVE1MOiBpbm5lckhUTUxcbiAgICB9LCBwcm9wcyksIGF0dHJzKTtcblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICByZXR1cm4gU3Vic0NhcHNNZW51SXRlbTtcbn0oVGV4dFRyYWNrTWVudUl0ZW0pO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1N1YnNDYXBzTWVudUl0ZW0nLCBTdWJzQ2Fwc01lbnVJdGVtKTtcblxuLyoqXG4gKiBAZmlsZSBzdWItY2Fwcy1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgYnV0dG9uIGNvbXBvbmVudCBmb3IgdG9nZ2xpbmcgYW5kIHNlbGVjdGluZyBjYXB0aW9ucyBhbmQvb3Igc3VidGl0bGVzXG4gKlxuICogQGV4dGVuZHMgVGV4dFRyYWNrQnV0dG9uXG4gKi9cblxudmFyIFN1YnNDYXBzQnV0dG9uID0gZnVuY3Rpb24gKF9UZXh0VHJhY2tCdXR0b24pIHtcbiAgaW5oZXJpdHMoU3Vic0NhcHNCdXR0b24sIF9UZXh0VHJhY2tCdXR0b24pO1xuXG4gIGZ1bmN0aW9uIFN1YnNDYXBzQnV0dG9uKHBsYXllcikge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdWJzQ2Fwc0J1dHRvbik7XG5cbiAgICAvLyBBbHRob3VnaCBOb3J0aCBBbWVyaWNhIHVzZXMgXCJjYXB0aW9uc1wiIGluIG1vc3QgY2FzZXMgZm9yXG4gICAgLy8gXCJjYXB0aW9ucyBhbmQgc3VidGl0bGVzXCIgb3RoZXIgbG9jYWxlcyB1c2UgXCJzdWJ0aXRsZXNcIlxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMubGFiZWxfID0gJ3N1YnRpdGxlcyc7XG4gICAgaWYgKFsnZW4nLCAnZW4tdXMnLCAnZW4tY2EnLCAnZnItY2EnXS5pbmRleE9mKF90aGlzLnBsYXllcl8ubGFuZ3VhZ2VfKSA+IC0xKSB7XG4gICAgICBfdGhpcy5sYWJlbF8gPSAnY2FwdGlvbnMnO1xuICAgIH1cbiAgICBfdGhpcy5tZW51QnV0dG9uXy5jb250cm9sVGV4dCh0b1RpdGxlQ2FzZShfdGhpcy5sYWJlbF8pKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIFN1YnNDYXBzQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1zdWJzLWNhcHMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgU3Vic0NhcHNCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRXcmFwcGVyQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtc3Vicy1jYXBzLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGNhcHRpb24vc3VidGl0bGVzIG1lbnUgaXRlbXNcbiAgICpcbiAgICogQHJldHVybiB7Q2FwdGlvblNldHRpbmdzTWVudUl0ZW1bXX1cbiAgICogICAgICAgICBUaGUgYXJyYXkgb2YgY3VycmVudCBtZW51IGl0ZW1zLlxuICAgKi9cblxuXG4gIFN1YnNDYXBzQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcyA9IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuXG4gICAgaWYgKCEodGhpcy5wbGF5ZXIoKS50ZWNoXyAmJiB0aGlzLnBsYXllcigpLnRlY2hfLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykgJiYgdGhpcy5wbGF5ZXIoKS5nZXRDaGlsZCgndGV4dFRyYWNrU2V0dGluZ3MnKSkge1xuICAgICAgaXRlbXMucHVzaChuZXcgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7IGtpbmQ6IHRoaXMubGFiZWxfIH0pKTtcblxuICAgICAgdGhpcy5oaWRlVGhyZXNob2xkXyArPSAxO1xuICAgIH1cblxuICAgIGl0ZW1zID0gX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlSXRlbXMuY2FsbCh0aGlzLCBpdGVtcywgU3Vic0NhcHNNZW51SXRlbSk7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9O1xuXG4gIHJldHVybiBTdWJzQ2Fwc0J1dHRvbjtcbn0oVGV4dFRyYWNrQnV0dG9uKTtcblxuLyoqXG4gKiBga2luZGBzIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuXG4gKlxuICogQHR5cGUge2FycmF5fVxuICogQHByaXZhdGVcbiAqL1xuXG5cblN1YnNDYXBzQnV0dG9uLnByb3RvdHlwZS5raW5kc18gPSBbJ2NhcHRpb25zJywgJ3N1YnRpdGxlcyddO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYFN1YnNDYXBzQnV0dG9uYHMgY29udHJvbHMuXG4gKlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5TdWJzQ2Fwc0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ1N1YnRpdGxlcyc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnU3Vic0NhcHNCdXR0b24nLCBTdWJzQ2Fwc0J1dHRvbik7XG5cbi8qKlxuICogQGZpbGUgYXVkaW8tdHJhY2stbWVudS1pdGVtLmpzXG4gKi9cbi8qKlxuICogQW4ge0BsaW5rIEF1ZGlvVHJhY2t9IHtAbGluayBNZW51SXRlbX1cbiAqXG4gKiBAZXh0ZW5kcyBNZW51SXRlbVxuICovXG5cbnZhciBBdWRpb1RyYWNrTWVudUl0ZW0gPSBmdW5jdGlvbiAoX01lbnVJdGVtKSB7XG4gIGluaGVyaXRzKEF1ZGlvVHJhY2tNZW51SXRlbSwgX01lbnVJdGVtKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIEF1ZGlvVHJhY2tNZW51SXRlbShwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBdWRpb1RyYWNrTWVudUl0ZW0pO1xuXG4gICAgdmFyIHRyYWNrID0gb3B0aW9ucy50cmFjaztcbiAgICB2YXIgdHJhY2tzID0gcGxheWVyLmF1ZGlvVHJhY2tzKCk7XG5cbiAgICAvLyBNb2RpZnkgb3B0aW9ucyBmb3IgcGFyZW50IE1lbnVJdGVtIGNsYXNzJ3MgaW5pdC5cbiAgICBvcHRpb25zLmxhYmVsID0gdHJhY2subGFiZWwgfHwgdHJhY2subGFuZ3VhZ2UgfHwgJ1Vua25vd24nO1xuICAgIG9wdGlvbnMuc2VsZWN0ZWQgPSB0cmFjay5lbmFibGVkO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTWVudUl0ZW0uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnRyYWNrID0gdHJhY2s7XG5cbiAgICBfdGhpcy5hZGRDbGFzcygndmpzLScgKyB0cmFjay5raW5kICsgJy1tZW51LWl0ZW0nKTtcblxuICAgIHZhciBjaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gY2hhbmdlSGFuZGxlcigpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmhhbmRsZVRyYWNrc0NoYW5nZS5hcHBseShfdGhpcywgYXJncyk7XG4gICAgfTtcblxuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICBfdGhpcy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBBdWRpb1RyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwodHlwZSwgcHJvcHMsIGF0dHJzKSB7XG4gICAgdmFyIGlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cInZqcy1tZW51LWl0ZW0tdGV4dFwiPicgKyB0aGlzLmxvY2FsaXplKHRoaXMub3B0aW9uc18ubGFiZWwpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9uc18udHJhY2sua2luZCA9PT0gJ21haW4tZGVzYycpIHtcbiAgICAgIGlubmVySFRNTCArPSAnXFxuICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cInZqcy1pY29uLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+ICcgKyB0aGlzLmxvY2FsaXplKCdEZXNjcmlwdGlvbnMnKSArICc8L3NwYW4+XFxuICAgICAgJztcbiAgICB9XG5cbiAgICBpbm5lckhUTUwgKz0gJzwvc3Bhbj4nO1xuXG4gICAgdmFyIGVsID0gX01lbnVJdGVtLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsIHR5cGUsIGFzc2lnbih7XG4gICAgICBpbm5lckhUTUw6IGlubmVySFRNTFxuICAgIH0sIHByb3BzKSwgYXR0cnMpO1xuXG4gICAgcmV0dXJuIGVsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYEF1ZGlvVHJhY2tNZW51SXRlbSBpcyBcImNsaWNrZWRcIi4gU2VlIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9XG4gICAqIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgYSBjbGljayBjYW4gYmUuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgQXVkaW9UcmFja01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyXy5hdWRpb1RyYWNrcygpO1xuXG4gICAgX01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljay5jYWxsKHRoaXMsIGV2ZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIHRyYWNrLmVuYWJsZWQgPSB0cmFjayA9PT0gdGhpcy50cmFjaztcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhbnkge0BsaW5rIEF1ZGlvVHJhY2t9IGNoYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIHtAbGluayBBdWRpb1RyYWNrTGlzdCNjaGFuZ2V9IGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBBdWRpb1RyYWNrTGlzdCNjaGFuZ2VcbiAgICovXG5cblxuICBBdWRpb1RyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZVRyYWNrc0NoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZVRyYWNrc0NoYW5nZShldmVudCkge1xuICAgIHRoaXMuc2VsZWN0ZWQodGhpcy50cmFjay5lbmFibGVkKTtcbiAgfTtcblxuICByZXR1cm4gQXVkaW9UcmFja01lbnVJdGVtO1xufShNZW51SXRlbSk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQXVkaW9UcmFja01lbnVJdGVtJywgQXVkaW9UcmFja01lbnVJdGVtKTtcblxuLyoqXG4gKiBAZmlsZSBhdWRpby10cmFjay1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYnV0dG9ucyB0aGF0IHRvZ2dsZSBzcGVjaWZpYyB7QGxpbmsgQXVkaW9UcmFja30gdHlwZXMuXG4gKlxuICogQGV4dGVuZHMgVHJhY2tCdXR0b25cbiAqL1xuXG52YXIgQXVkaW9UcmFja0J1dHRvbiA9IGZ1bmN0aW9uIChfVHJhY2tCdXR0b24pIHtcbiAgaW5oZXJpdHMoQXVkaW9UcmFja0J1dHRvbiwgX1RyYWNrQnV0dG9uKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIEF1ZGlvVHJhY2tCdXR0b24ocGxheWVyKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEF1ZGlvVHJhY2tCdXR0b24pO1xuXG4gICAgb3B0aW9ucy50cmFja3MgPSBwbGF5ZXIuYXVkaW9UcmFja3MoKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG5cblxuICBBdWRpb1RyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1hdWRpby1idXR0b24gJyArIF9UcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIEF1ZGlvVHJhY2tCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRXcmFwcGVyQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtYXVkaW8tYnV0dG9uICcgKyBfVHJhY2tCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1lbnUgaXRlbSBmb3IgZWFjaCBhdWRpbyB0cmFja1xuICAgKlxuICAgKiBAcGFyYW0ge0F1ZGlvVHJhY2tNZW51SXRlbVtdfSBbaXRlbXM9W11dXG4gICAqICAgICAgICBBbiBhcnJheSBvZiBleGlzdGluZyBtZW51IGl0ZW1zIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7QXVkaW9UcmFja01lbnVJdGVtW119XG4gICAqICAgICAgICAgQW4gYXJyYXkgb2YgbWVudSBpdGVtc1xuICAgKi9cblxuXG4gIEF1ZGlvVHJhY2tCdXR0b24ucHJvdG90eXBlLmNyZWF0ZUl0ZW1zID0gZnVuY3Rpb24gY3JlYXRlSXRlbXMoKSB7XG4gICAgdmFyIGl0ZW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcblxuICAgIC8vIGlmIHRoZXJlJ3Mgb25seSBvbmUgYXVkaW8gdHJhY2ssIHRoZXJlIG5vIHBvaW50IGluIHNob3dpbmcgaXRcbiAgICB0aGlzLmhpZGVUaHJlc2hvbGRfID0gMTtcblxuICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcl8uYXVkaW9UcmFja3MoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIGl0ZW1zLnB1c2gobmV3IEF1ZGlvVHJhY2tNZW51SXRlbSh0aGlzLnBsYXllcl8sIHtcbiAgICAgICAgdHJhY2s6IHRyYWNrLFxuICAgICAgICAvLyBNZW51SXRlbSBpcyBzZWxlY3RhYmxlXG4gICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIC8vIE1lbnVJdGVtIGlzIE5PVCBtdWx0aVNlbGVjdGFibGUgKGkuZS4gb25seSBvbmUgY2FuIGJlIG1hcmtlZCBcInNlbGVjdGVkXCIgYXQgYSB0aW1lKVxuICAgICAgICBtdWx0aVNlbGVjdGFibGU6IGZhbHNlXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9O1xuXG4gIHJldHVybiBBdWRpb1RyYWNrQnV0dG9uO1xufShUcmFja0J1dHRvbik7XG5cbi8qKlxuICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgQXVkaW9UcmFja0J1dHRvbmBzIGNvbnRyb2xzLiBBZGRlZCBmb3IgbG9jYWxpemF0aW9uLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuQXVkaW9UcmFja0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0F1ZGlvIFRyYWNrJztcbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQXVkaW9UcmFja0J1dHRvbicsIEF1ZGlvVHJhY2tCdXR0b24pO1xuXG4vKipcbiAqIEBmaWxlIHBsYXliYWNrLXJhdGUtbWVudS1pdGVtLmpzXG4gKi9cbi8qKlxuICogVGhlIHNwZWNpZmljIG1lbnUgaXRlbSB0eXBlIGZvciBzZWxlY3RpbmcgYSBwbGF5YmFjayByYXRlLlxuICpcbiAqIEBleHRlbmRzIE1lbnVJdGVtXG4gKi9cblxudmFyIFBsYXliYWNrUmF0ZU1lbnVJdGVtID0gZnVuY3Rpb24gKF9NZW51SXRlbSkge1xuICBpbmhlcml0cyhQbGF5YmFja1JhdGVNZW51SXRlbSwgX01lbnVJdGVtKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyXG4gICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy5cbiAgICovXG4gIGZ1bmN0aW9uIFBsYXliYWNrUmF0ZU1lbnVJdGVtKHBsYXllciwgb3B0aW9ucykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYXliYWNrUmF0ZU1lbnVJdGVtKTtcblxuICAgIHZhciBsYWJlbCA9IG9wdGlvbnMucmF0ZTtcbiAgICB2YXIgcmF0ZSA9IHBhcnNlRmxvYXQobGFiZWwsIDEwKTtcblxuICAgIC8vIE1vZGlmeSBvcHRpb25zIGZvciBwYXJlbnQgTWVudUl0ZW0gY2xhc3MncyBpbml0LlxuICAgIG9wdGlvbnMubGFiZWwgPSBsYWJlbDtcbiAgICBvcHRpb25zLnNlbGVjdGVkID0gcmF0ZSA9PT0gMTtcbiAgICBvcHRpb25zLnNlbGVjdGFibGUgPSB0cnVlO1xuICAgIG9wdGlvbnMubXVsdGlTZWxlY3RhYmxlID0gZmFsc2U7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9NZW51SXRlbS5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpO1xuXG4gICAgX3RoaXMubGFiZWwgPSBsYWJlbDtcbiAgICBfdGhpcy5yYXRlID0gcmF0ZTtcblxuICAgIF90aGlzLm9uKHBsYXllciwgJ3JhdGVjaGFuZ2UnLCBfdGhpcy51cGRhdGUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYFBsYXliYWNrUmF0ZU1lbnVJdGVtYCBpcyBcImNsaWNrZWRcIi4gU2VlXG4gICAqIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9IGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgYSBjbGljayBjYW4gYmUuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgICogICAgICAgIGNhbGxlZC5cbiAgICpcbiAgICogQGxpc3RlbnMgdGFwXG4gICAqIEBsaXN0ZW5zIGNsaWNrXG4gICAqL1xuXG5cbiAgUGxheWJhY2tSYXRlTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICBfTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrLmNhbGwodGhpcyk7XG4gICAgdGhpcy5wbGF5ZXIoKS5wbGF5YmFja1JhdGUodGhpcy5yYXRlKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBQbGF5YmFja1JhdGVNZW51SXRlbSB3aGVuIHRoZSBwbGF5YmFja3JhdGUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGByYXRlY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3JhdGVjaGFuZ2VcbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51SXRlbS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKGV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZCh0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZSgpID09PSB0aGlzLnJhdGUpO1xuICB9O1xuXG4gIHJldHVybiBQbGF5YmFja1JhdGVNZW51SXRlbTtcbn0oTWVudUl0ZW0pO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYFBsYXliYWNrUmF0ZU1lbnVJdGVtYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5QbGF5YmFja1JhdGVNZW51SXRlbS5wcm90b3R5cGUuY29udGVudEVsVHlwZSA9ICdidXR0b24nO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1BsYXliYWNrUmF0ZU1lbnVJdGVtJywgUGxheWJhY2tSYXRlTWVudUl0ZW0pO1xuXG4vKipcbiAqIEBmaWxlIHBsYXliYWNrLXJhdGUtbWVudS1idXR0b24uanNcbiAqL1xuLyoqXG4gKiBUaGUgY29tcG9uZW50IGZvciBjb250cm9sbGluZyB0aGUgcGxheWJhY2sgcmF0ZS5cbiAqXG4gKiBAZXh0ZW5kcyBNZW51QnV0dG9uXG4gKi9cblxudmFyIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24gPSBmdW5jdGlvbiAoX01lbnVCdXR0b24pIHtcbiAgaW5oZXJpdHMoUGxheWJhY2tSYXRlTWVudUJ1dHRvbiwgX01lbnVCdXR0b24pO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKi9cbiAgZnVuY3Rpb24gUGxheWJhY2tSYXRlTWVudUJ1dHRvbihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5YmFja1JhdGVNZW51QnV0dG9uKTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX01lbnVCdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICBfdGhpcy51cGRhdGVMYWJlbCgpO1xuXG4gICAgX3RoaXMub24ocGxheWVyLCAnbG9hZHN0YXJ0JywgX3RoaXMudXBkYXRlVmlzaWJpbGl0eSk7XG4gICAgX3RoaXMub24ocGxheWVyLCAncmF0ZWNoYW5nZScsIF90aGlzLnVwZGF0ZUxhYmVsKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHZhciBlbCA9IF9NZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5sYWJlbEVsXyA9IGNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtcGxheWJhY2stcmF0ZS12YWx1ZScsXG4gICAgICBpbm5lckhUTUw6ICcxeCdcbiAgICB9KTtcblxuICAgIGVsLmFwcGVuZENoaWxkKHRoaXMubGFiZWxFbF8pO1xuXG4gICAgcmV0dXJuIGVsO1xuICB9O1xuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHRoaXMubGFiZWxFbF8gPSBudWxsO1xuXG4gICAgX01lbnVCdXR0b24ucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cblxuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLXBsYXliYWNrLXJhdGUgJyArIF9NZW51QnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZFdyYXBwZXJDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gJ3Zqcy1wbGF5YmFjay1yYXRlICcgKyBfTWVudUJ1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBwbGF5YmFjayByYXRlIG1lbnVcbiAgICpcbiAgICogQHJldHVybiB7TWVudX1cbiAgICogICAgICAgICBNZW51IG9iamVjdCBwb3B1bGF0ZWQgd2l0aCB7QGxpbmsgUGxheWJhY2tSYXRlTWVudUl0ZW19c1xuICAgKi9cblxuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmNyZWF0ZU1lbnUgPSBmdW5jdGlvbiBjcmVhdGVNZW51KCkge1xuICAgIHZhciBtZW51ID0gbmV3IE1lbnUodGhpcy5wbGF5ZXIoKSk7XG4gICAgdmFyIHJhdGVzID0gdGhpcy5wbGF5YmFja1JhdGVzKCk7XG5cbiAgICBpZiAocmF0ZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSByYXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBtZW51LmFkZENoaWxkKG5ldyBQbGF5YmFja1JhdGVNZW51SXRlbSh0aGlzLnBsYXllcigpLCB7IHJhdGU6IHJhdGVzW2ldICsgJ3gnIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVudTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlcyBBUklBIGFjY2Vzc2liaWxpdHkgYXR0cmlidXRlc1xuICAgKi9cblxuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLnVwZGF0ZUFSSUFBdHRyaWJ1dGVzID0gZnVuY3Rpb24gdXBkYXRlQVJJQUF0dHJpYnV0ZXMoKSB7XG4gICAgLy8gQ3VycmVudCBwbGF5YmFjayByYXRlXG4gICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMucGxheWVyKCkucGxheWJhY2tSYXRlKCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYFBsYXliYWNrUmF0ZU1lbnVCdXR0b25gIGlzIFwiY2xpY2tlZFwiLiBTZWVcbiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudH0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgKiAgICAgICAgY2FsbGVkLlxuICAgKlxuICAgKiBAbGlzdGVucyB0YXBcbiAgICogQGxpc3RlbnMgY2xpY2tcbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgLy8gc2VsZWN0IG5leHQgcmF0ZSBvcHRpb25cbiAgICB2YXIgY3VycmVudFJhdGUgPSB0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZSgpO1xuICAgIHZhciByYXRlcyA9IHRoaXMucGxheWJhY2tSYXRlcygpO1xuXG4gICAgLy8gdGhpcyB3aWxsIHNlbGVjdCBmaXJzdCBvbmUgaWYgdGhlIGxhc3Qgb25lIGN1cnJlbnRseSBzZWxlY3RlZFxuICAgIHZhciBuZXdSYXRlID0gcmF0ZXNbMF07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmF0ZXNbaV0gPiBjdXJyZW50UmF0ZSkge1xuICAgICAgICBuZXdSYXRlID0gcmF0ZXNbaV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZShuZXdSYXRlKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHBvc3NpYmxlIHBsYXliYWNrIHJhdGVzXG4gICAqXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKiAgICAgICAgIEFsbCBwb3NzaWJsZSBwbGF5YmFjayByYXRlc1xuICAgKi9cblxuXG4gIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLnBsYXliYWNrUmF0ZXMgPSBmdW5jdGlvbiBwbGF5YmFja1JhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNfLnBsYXliYWNrUmF0ZXMgfHwgdGhpcy5vcHRpb25zXy5wbGF5ZXJPcHRpb25zICYmIHRoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucy5wbGF5YmFja1JhdGVzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciBwbGF5YmFjayByYXRlcyBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRlY2hcbiAgICogYW5kIGFuIGFycmF5IG9mIHBsYXliYWNrIHJhdGVzIGV4aXN0c1xuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiAgICAgICAgIFdoZXRoZXIgY2hhbmdpbmcgcGxheWJhY2sgcmF0ZSBpcyBzdXBwb3J0ZWRcbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS5wbGF5YmFja1JhdGVTdXBwb3J0ZWQgPSBmdW5jdGlvbiBwbGF5YmFja1JhdGVTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyKCkudGVjaF8gJiYgdGhpcy5wbGF5ZXIoKS50ZWNoXy5mZWF0dXJlc1BsYXliYWNrUmF0ZSAmJiB0aGlzLnBsYXliYWNrUmF0ZXMoKSAmJiB0aGlzLnBsYXliYWNrUmF0ZXMoKS5sZW5ndGggPiAwO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIaWRlIHBsYXliYWNrIHJhdGUgY29udHJvbHMgd2hlbiB0aGV5J3JlIG5vIHBsYXliYWNrIHJhdGUgb3B0aW9ucyB0byBzZWxlY3RcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XVxuICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLlxuICAgKlxuICAgKiBAbGlzdGVucyBQbGF5ZXIjbG9hZHN0YXJ0XG4gICAqL1xuXG5cbiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbi5wcm90b3R5cGUudXBkYXRlVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIHVwZGF0ZVZpc2liaWxpdHkoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wbGF5YmFja1JhdGVTdXBwb3J0ZWQoKSkge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWhpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgYnV0dG9uIGxhYmVsIHdoZW4gcmF0ZSBjaGFuZ2VkXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF1cbiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi5cbiAgICpcbiAgICogQGxpc3RlbnMgUGxheWVyI3JhdGVjaGFuZ2VcbiAgICovXG5cblxuICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS51cGRhdGVMYWJlbCA9IGZ1bmN0aW9uIHVwZGF0ZUxhYmVsKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMucGxheWJhY2tSYXRlU3VwcG9ydGVkKCkpIHtcbiAgICAgIHRoaXMubGFiZWxFbF8uaW5uZXJIVE1MID0gdGhpcy5wbGF5ZXIoKS5wbGF5YmFja1JhdGUoKSArICd4JztcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFBsYXliYWNrUmF0ZU1lbnVCdXR0b247XG59KE1lbnVCdXR0b24pO1xuXG4vKipcbiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYEZ1bGxzY3JlZW5Ub2dnbGVgcyBjb250cm9scy4gQWRkZWQgZm9yIGxvY2FsaXphdGlvbi5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5cblBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdQbGF5YmFjayBSYXRlJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQbGF5YmFja1JhdGVNZW51QnV0dG9uJywgUGxheWJhY2tSYXRlTWVudUJ1dHRvbik7XG5cbi8qKlxuICogQGZpbGUgc3BhY2VyLmpzXG4gKi9cbi8qKlxuICogSnVzdCBhbiBlbXB0eSBzcGFjZXIgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGFwcGVuZCBwb2ludCBmb3IgcGx1Z2lucywgZXRjLlxuICogQWxzbyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiBlbGVtZW50cyB3aGVuIG5lY2Vzc2FyeS5cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgU3BhY2VyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoU3BhY2VyLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBTcGFjZXIoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU3BhY2VyKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC5cbiAgICovXG4gIFNwYWNlci5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtc3BhY2VyICcgKyBfQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgU3BhY2VyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFNwYWNlcjtcbn0oQ29tcG9uZW50KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdTcGFjZXInLCBTcGFjZXIpO1xuXG4vKipcbiAqIEBmaWxlIGN1c3RvbS1jb250cm9sLXNwYWNlci5qc1xuICovXG4vKipcbiAqIFNwYWNlciBzcGVjaWZpY2FsbHkgbWVhbnQgdG8gYmUgdXNlZCBhcyBhbiBpbnNlcnRpb24gcG9pbnQgZm9yIG5ldyBwbHVnaW5zLCBldGMuXG4gKlxuICogQGV4dGVuZHMgU3BhY2VyXG4gKi9cblxudmFyIEN1c3RvbUNvbnRyb2xTcGFjZXIgPSBmdW5jdGlvbiAoX1NwYWNlcikge1xuICBpbmhlcml0cyhDdXN0b21Db250cm9sU3BhY2VyLCBfU3BhY2VyKTtcblxuICBmdW5jdGlvbiBDdXN0b21Db250cm9sU3BhY2VyKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEN1c3RvbUNvbnRyb2xTcGFjZXIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9TcGFjZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LlxuICAgKi9cbiAgQ3VzdG9tQ29udHJvbFNwYWNlci5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtY3VzdG9tLWNvbnRyb2wtc3BhY2VyICcgKyBfU3BhY2VyLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuXG5cbiAgQ3VzdG9tQ29udHJvbFNwYWNlci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCgpIHtcbiAgICB2YXIgZWwgPSBfU3BhY2VyLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsIHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5idWlsZENTU0NsYXNzKClcbiAgICB9KTtcblxuICAgIC8vIE5vLWZsZXgvdGFibGUtY2VsbCBtb2RlIHJlcXVpcmVzIHRoZXJlIGJlIHNvbWUgY29udGVudFxuICAgIC8vIGluIHRoZSBjZWxsIHRvIGZpbGwgdGhlIHJlbWFpbmluZyBzcGFjZSBvZiB0aGUgdGFibGUuXG4gICAgZWwuaW5uZXJIVE1MID0gJ1xceEEwJztcbiAgICByZXR1cm4gZWw7XG4gIH07XG5cbiAgcmV0dXJuIEN1c3RvbUNvbnRyb2xTcGFjZXI7XG59KFNwYWNlcik7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ3VzdG9tQ29udHJvbFNwYWNlcicsIEN1c3RvbUNvbnRyb2xTcGFjZXIpO1xuXG4vKipcbiAqIEBmaWxlIGNvbnRyb2wtYmFyLmpzXG4gKi9cbi8vIFJlcXVpcmVkIGNoaWxkcmVuXG4vKipcbiAqIENvbnRhaW5lciBvZiBtYWluIGNvbnRyb2xzLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG5cbnZhciBDb250cm9sQmFyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgaW5oZXJpdHMoQ29udHJvbEJhciwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ29udHJvbEJhcigpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb250cm9sQmFyKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBDb250cm9sQmFyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtY29udHJvbC1iYXInLFxuICAgICAgZGlyOiAnbHRyJ1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBDb250cm9sQmFyO1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIERlZmF1bHQgb3B0aW9ucyBmb3IgYENvbnRyb2xCYXJgXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5Db250cm9sQmFyLnByb3RvdHlwZS5vcHRpb25zXyA9IHtcbiAgY2hpbGRyZW46IFsncGxheVRvZ2dsZScsICd2b2x1bWVQYW5lbCcsICdjdXJyZW50VGltZURpc3BsYXknLCAndGltZURpdmlkZXInLCAnZHVyYXRpb25EaXNwbGF5JywgJ3Byb2dyZXNzQ29udHJvbCcsICdsaXZlRGlzcGxheScsICdyZW1haW5pbmdUaW1lRGlzcGxheScsICdjdXN0b21Db250cm9sU3BhY2VyJywgJ3BsYXliYWNrUmF0ZU1lbnVCdXR0b24nLCAnY2hhcHRlcnNCdXR0b24nLCAnZGVzY3JpcHRpb25zQnV0dG9uJywgJ3N1YnNDYXBzQnV0dG9uJywgJ2F1ZGlvVHJhY2tCdXR0b24nLCAnZnVsbHNjcmVlblRvZ2dsZSddXG59O1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NvbnRyb2xCYXInLCBDb250cm9sQmFyKTtcblxuLyoqXG4gKiBAZmlsZSBlcnJvci1kaXNwbGF5LmpzXG4gKi9cbi8qKlxuICogQSBkaXNwbGF5IHRoYXQgaW5kaWNhdGVzIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSB2aWRlb1xuICogaXMgdW5wbGF5YWJsZS5cbiAqXG4gKiBAZXh0ZW5kcyBNb2RhbERpYWxvZ1xuICovXG5cbnZhciBFcnJvckRpc3BsYXkgPSBmdW5jdGlvbiAoX01vZGFsRGlhbG9nKSB7XG4gIGluaGVyaXRzKEVycm9yRGlzcGxheSwgX01vZGFsRGlhbG9nKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0gIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBFcnJvckRpc3BsYXkocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRXJyb3JEaXNwbGF5KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX01vZGFsRGlhbG9nLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7XG5cbiAgICBfdGhpcy5vbihwbGF5ZXIsICdlcnJvcicsIF90aGlzLm9wZW4pO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHZlcnNpb24gNS5cbiAgICovXG5cblxuICBFcnJvckRpc3BsYXkucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiAndmpzLWVycm9yLWRpc3BsYXkgJyArIF9Nb2RhbERpYWxvZy5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSBiYXNlZCBvbiB0aGUgYFBsYXllcmBzIGVycm9yLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgVGhlIGBQbGF5ZXJgcyBlcnJvciBtZXNzYWdlIGxvY2FsaXplZCBvciBhbiBlbXB0eSBzdHJpbmcuXG4gICAqL1xuXG5cbiAgRXJyb3JEaXNwbGF5LnByb3RvdHlwZS5jb250ZW50ID0gZnVuY3Rpb24gY29udGVudCgpIHtcbiAgICB2YXIgZXJyb3IgPSB0aGlzLnBsYXllcigpLmVycm9yKCk7XG5cbiAgICByZXR1cm4gZXJyb3IgPyB0aGlzLmxvY2FsaXplKGVycm9yLm1lc3NhZ2UpIDogJyc7XG4gIH07XG5cbiAgcmV0dXJuIEVycm9yRGlzcGxheTtcbn0oTW9kYWxEaWFsb2cpO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIGFuIGBFcnJvckRpc3BsYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5FcnJvckRpc3BsYXkucHJvdG90eXBlLm9wdGlvbnNfID0gbWVyZ2VPcHRpb25zKE1vZGFsRGlhbG9nLnByb3RvdHlwZS5vcHRpb25zXywge1xuICBwYXVzZU9uT3BlbjogZmFsc2UsXG4gIGZpbGxBbHdheXM6IHRydWUsXG4gIHRlbXBvcmFyeTogZmFsc2UsXG4gIHVuY2xvc2VhYmxlOiB0cnVlXG59KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdFcnJvckRpc3BsYXknLCBFcnJvckRpc3BsYXkpO1xuXG4vKipcbiAqIEBmaWxlIHRleHQtdHJhY2stc2V0dGluZ3MuanNcbiAqL1xudmFyIExPQ0FMX1NUT1JBR0VfS0VZID0gJ3Zqcy10ZXh0LXRyYWNrLXNldHRpbmdzJztcblxudmFyIENPTE9SX0JMQUNLID0gWycjMDAwJywgJ0JsYWNrJ107XG52YXIgQ09MT1JfQkxVRSA9IFsnIzAwRicsICdCbHVlJ107XG52YXIgQ09MT1JfQ1lBTiA9IFsnIzBGRicsICdDeWFuJ107XG52YXIgQ09MT1JfR1JFRU4gPSBbJyMwRjAnLCAnR3JlZW4nXTtcbnZhciBDT0xPUl9NQUdFTlRBID0gWycjRjBGJywgJ01hZ2VudGEnXTtcbnZhciBDT0xPUl9SRUQgPSBbJyNGMDAnLCAnUmVkJ107XG52YXIgQ09MT1JfV0hJVEUgPSBbJyNGRkYnLCAnV2hpdGUnXTtcbnZhciBDT0xPUl9ZRUxMT1cgPSBbJyNGRjAnLCAnWWVsbG93J107XG5cbnZhciBPUEFDSVRZX09QQVFVRSA9IFsnMScsICdPcGFxdWUnXTtcbnZhciBPUEFDSVRZX1NFTUkgPSBbJzAuNScsICdTZW1pLVRyYW5zcGFyZW50J107XG52YXIgT1BBQ0lUWV9UUkFOUyA9IFsnMCcsICdUcmFuc3BhcmVudCddO1xuXG4vLyBDb25maWd1cmF0aW9uIGZvciB0aGUgdmFyaW91cyA8c2VsZWN0PiBlbGVtZW50cyBpbiB0aGUgRE9NIG9mIHRoaXMgY29tcG9uZW50LlxuLy9cbi8vIFBvc3NpYmxlIGtleXMgaW5jbHVkZTpcbi8vXG4vLyBgZGVmYXVsdGA6XG4vLyAgIFRoZSBkZWZhdWx0IG9wdGlvbiBpbmRleC4gT25seSBuZWVkcyB0byBiZSBwcm92aWRlZCBpZiBub3QgemVyby5cbi8vIGBwYXJzZXJgOlxuLy8gICBBIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gcGFyc2UgdGhlIHZhbHVlIGZyb20gdGhlIHNlbGVjdGVkIG9wdGlvbiBpblxuLy8gICBhIGN1c3RvbWl6ZWQgd2F5LlxuLy8gYHNlbGVjdG9yYDpcbi8vICAgVGhlIHNlbGVjdG9yIHVzZWQgdG8gZmluZCB0aGUgYXNzb2NpYXRlZCA8c2VsZWN0PiBlbGVtZW50LlxudmFyIHNlbGVjdENvbmZpZ3MgPSB7XG4gIGJhY2tncm91bmRDb2xvcjoge1xuICAgIHNlbGVjdG9yOiAnLnZqcy1iZy1jb2xvciA+IHNlbGVjdCcsXG4gICAgaWQ6ICdjYXB0aW9ucy1iYWNrZ3JvdW5kLWNvbG9yLSVzJyxcbiAgICBsYWJlbDogJ0NvbG9yJyxcbiAgICBvcHRpb25zOiBbQ09MT1JfQkxBQ0ssIENPTE9SX1dISVRFLCBDT0xPUl9SRUQsIENPTE9SX0dSRUVOLCBDT0xPUl9CTFVFLCBDT0xPUl9ZRUxMT1csIENPTE9SX01BR0VOVEEsIENPTE9SX0NZQU5dXG4gIH0sXG5cbiAgYmFja2dyb3VuZE9wYWNpdHk6IHtcbiAgICBzZWxlY3RvcjogJy52anMtYmctb3BhY2l0eSA+IHNlbGVjdCcsXG4gICAgaWQ6ICdjYXB0aW9ucy1iYWNrZ3JvdW5kLW9wYWNpdHktJXMnLFxuICAgIGxhYmVsOiAnVHJhbnNwYXJlbmN5JyxcbiAgICBvcHRpb25zOiBbT1BBQ0lUWV9PUEFRVUUsIE9QQUNJVFlfU0VNSSwgT1BBQ0lUWV9UUkFOU11cbiAgfSxcblxuICBjb2xvcjoge1xuICAgIHNlbGVjdG9yOiAnLnZqcy1mZy1jb2xvciA+IHNlbGVjdCcsXG4gICAgaWQ6ICdjYXB0aW9ucy1mb3JlZ3JvdW5kLWNvbG9yLSVzJyxcbiAgICBsYWJlbDogJ0NvbG9yJyxcbiAgICBvcHRpb25zOiBbQ09MT1JfV0hJVEUsIENPTE9SX0JMQUNLLCBDT0xPUl9SRUQsIENPTE9SX0dSRUVOLCBDT0xPUl9CTFVFLCBDT0xPUl9ZRUxMT1csIENPTE9SX01BR0VOVEEsIENPTE9SX0NZQU5dXG4gIH0sXG5cbiAgZWRnZVN0eWxlOiB7XG4gICAgc2VsZWN0b3I6ICcudmpzLWVkZ2Utc3R5bGUgPiBzZWxlY3QnLFxuICAgIGlkOiAnJXMnLFxuICAgIGxhYmVsOiAnVGV4dCBFZGdlIFN0eWxlJyxcbiAgICBvcHRpb25zOiBbWydub25lJywgJ05vbmUnXSwgWydyYWlzZWQnLCAnUmFpc2VkJ10sIFsnZGVwcmVzc2VkJywgJ0RlcHJlc3NlZCddLCBbJ3VuaWZvcm0nLCAnVW5pZm9ybSddLCBbJ2Ryb3BzaGFkb3cnLCAnRHJvcHNoYWRvdyddXVxuICB9LFxuXG4gIGZvbnRGYW1pbHk6IHtcbiAgICBzZWxlY3RvcjogJy52anMtZm9udC1mYW1pbHkgPiBzZWxlY3QnLFxuICAgIGlkOiAnY2FwdGlvbnMtZm9udC1mYW1pbHktJXMnLFxuICAgIGxhYmVsOiAnRm9udCBGYW1pbHknLFxuICAgIG9wdGlvbnM6IFtbJ3Byb3BvcnRpb25hbFNhbnNTZXJpZicsICdQcm9wb3J0aW9uYWwgU2Fucy1TZXJpZiddLCBbJ21vbm9zcGFjZVNhbnNTZXJpZicsICdNb25vc3BhY2UgU2Fucy1TZXJpZiddLCBbJ3Byb3BvcnRpb25hbFNlcmlmJywgJ1Byb3BvcnRpb25hbCBTZXJpZiddLCBbJ21vbm9zcGFjZVNlcmlmJywgJ01vbm9zcGFjZSBTZXJpZiddLCBbJ2Nhc3VhbCcsICdDYXN1YWwnXSwgWydzY3JpcHQnLCAnU2NyaXB0J10sIFsnc21hbGwtY2FwcycsICdTbWFsbCBDYXBzJ11dXG4gIH0sXG5cbiAgZm9udFBlcmNlbnQ6IHtcbiAgICBzZWxlY3RvcjogJy52anMtZm9udC1wZXJjZW50ID4gc2VsZWN0JyxcbiAgICBpZDogJ2NhcHRpb25zLWZvbnQtc2l6ZS0lcycsXG4gICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgIG9wdGlvbnM6IFtbJzAuNTAnLCAnNTAlJ10sIFsnMC43NScsICc3NSUnXSwgWycxLjAwJywgJzEwMCUnXSwgWycxLjI1JywgJzEyNSUnXSwgWycxLjUwJywgJzE1MCUnXSwgWycxLjc1JywgJzE3NSUnXSwgWycyLjAwJywgJzIwMCUnXSwgWyczLjAwJywgJzMwMCUnXSwgWyc0LjAwJywgJzQwMCUnXV0sXG4gICAgJ2RlZmF1bHQnOiAyLFxuICAgIHBhcnNlcjogZnVuY3Rpb24gcGFyc2VyKHYpIHtcbiAgICAgIHJldHVybiB2ID09PSAnMS4wMCcgPyBudWxsIDogTnVtYmVyKHYpO1xuICAgIH1cbiAgfSxcblxuICB0ZXh0T3BhY2l0eToge1xuICAgIHNlbGVjdG9yOiAnLnZqcy10ZXh0LW9wYWNpdHkgPiBzZWxlY3QnLFxuICAgIGlkOiAnY2FwdGlvbnMtZm9yZWdyb3VuZC1vcGFjaXR5LSVzJyxcbiAgICBsYWJlbDogJ1RyYW5zcGFyZW5jeScsXG4gICAgb3B0aW9uczogW09QQUNJVFlfT1BBUVVFLCBPUEFDSVRZX1NFTUldXG4gIH0sXG5cbiAgLy8gT3B0aW9ucyBmb3IgdGhpcyBvYmplY3QgYXJlIGRlZmluZWQgYmVsb3cuXG4gIHdpbmRvd0NvbG9yOiB7XG4gICAgc2VsZWN0b3I6ICcudmpzLXdpbmRvdy1jb2xvciA+IHNlbGVjdCcsXG4gICAgaWQ6ICdjYXB0aW9ucy13aW5kb3ctY29sb3ItJXMnLFxuICAgIGxhYmVsOiAnQ29sb3InXG4gIH0sXG5cbiAgLy8gT3B0aW9ucyBmb3IgdGhpcyBvYmplY3QgYXJlIGRlZmluZWQgYmVsb3cuXG4gIHdpbmRvd09wYWNpdHk6IHtcbiAgICBzZWxlY3RvcjogJy52anMtd2luZG93LW9wYWNpdHkgPiBzZWxlY3QnLFxuICAgIGlkOiAnY2FwdGlvbnMtd2luZG93LW9wYWNpdHktJXMnLFxuICAgIGxhYmVsOiAnVHJhbnNwYXJlbmN5JyxcbiAgICBvcHRpb25zOiBbT1BBQ0lUWV9UUkFOUywgT1BBQ0lUWV9TRU1JLCBPUEFDSVRZX09QQVFVRV1cbiAgfVxufTtcblxuc2VsZWN0Q29uZmlncy53aW5kb3dDb2xvci5vcHRpb25zID0gc2VsZWN0Q29uZmlncy5iYWNrZ3JvdW5kQ29sb3Iub3B0aW9ucztcblxuLyoqXG4gKiBHZXQgdGhlIGFjdHVhbCB2YWx1ZSBvZiBhbiBvcHRpb24uXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZVxuICogICAgICAgICBUaGUgdmFsdWUgdG8gZ2V0XG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IFtwYXJzZXJdXG4gKiAgICAgICAgIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgdmFsdWUuXG4gKlxuICogQHJldHVybiB7TWl4ZWR9XG4gKiAgICAgICAgIC0gV2lsbCBiZSBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSBleGlzdHNcbiAqICAgICAgICAgLSBXaWxsIGJlIGB1bmRlZmluZWRgIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBcIm5vbmVcIi5cbiAqICAgICAgICAgLSBXaWxsIGJlIHRoZSBhY3R1YWwgdmFsdWUgb3RoZXJ3aXNlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uVmFsdWUodmFsdWUsIHBhcnNlcikge1xuICBpZiAocGFyc2VyKSB7XG4gICAgdmFsdWUgPSBwYXJzZXIodmFsdWUpO1xuICB9XG5cbiAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSAnbm9uZScpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgPG9wdGlvbj4gZWxlbWVudCB3aXRoaW4gYSA8c2VsZWN0PiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsXG4gKiAgICAgICAgIHRoZSBlbGVtZW50IHRvIGxvb2sgaW5cbiAqXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gW3BhcnNlcl1cbiAqICAgICAgICAgT3B0aW9uYWwgZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSB2YWx1ZS5cbiAqXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqICAgICAgICAgLSBXaWxsIGJlIGB1bmRlZmluZWRgIGlmIG5vIHZhbHVlIGV4aXN0c1xuICogICAgICAgICAtIFdpbGwgYmUgYHVuZGVmaW5lZGAgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIFwibm9uZVwiLlxuICogICAgICAgICAtIFdpbGwgYmUgdGhlIGFjdHVhbCB2YWx1ZSBvdGhlcndpc2UuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0U2VsZWN0ZWRPcHRpb25WYWx1ZShlbCwgcGFyc2VyKSB7XG4gIHZhciB2YWx1ZSA9IGVsLm9wdGlvbnNbZWwub3B0aW9ucy5zZWxlY3RlZEluZGV4XS52YWx1ZTtcblxuICByZXR1cm4gcGFyc2VPcHRpb25WYWx1ZSh2YWx1ZSwgcGFyc2VyKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBzZWxlY3RlZCA8b3B0aW9uPiBlbGVtZW50IHdpdGhpbiBhIDxzZWxlY3Q+IGVsZW1lbnQgYmFzZWQgb24gYVxuICogZ2l2ZW4gdmFsdWUuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogICAgICAgIFRoZSBlbGVtZW50IHRvIGxvb2sgaW4uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiAgICAgICAgdGhlIHByb3BlcnR5IHRvIGxvb2sgb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3BhcnNlcl1cbiAqICAgICAgICBPcHRpb25hbCBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIHZhbHVlIGJlZm9yZSBjb21wYXJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0U2VsZWN0ZWRPcHRpb24oZWwsIHZhbHVlLCBwYXJzZXIpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWwub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChwYXJzZU9wdGlvblZhbHVlKGVsLm9wdGlvbnNbaV0udmFsdWUsIHBhcnNlcikgPT09IHZhbHVlKSB7XG4gICAgICBlbC5zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE1hbmlwdWxhdGUgVGV4dCBUcmFja3Mgc2V0dGluZ3MuXG4gKlxuICogQGV4dGVuZHMgTW9kYWxEaWFsb2dcbiAqL1xuXG52YXIgVGV4dFRyYWNrU2V0dGluZ3MgPSBmdW5jdGlvbiAoX01vZGFsRGlhbG9nKSB7XG4gIGluaGVyaXRzKFRleHRUcmFja1NldHRpbmdzLCBfTW9kYWxEaWFsb2cpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXJcbiAgICogICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0VHJhY2tTZXR0aW5ncyhwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0VHJhY2tTZXR0aW5ncyk7XG5cbiAgICBvcHRpb25zLnRlbXBvcmFyeSA9IGZhbHNlO1xuXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTW9kYWxEaWFsb2cuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTtcblxuICAgIF90aGlzLnVwZGF0ZURpc3BsYXkgPSBiaW5kKF90aGlzLCBfdGhpcy51cGRhdGVEaXNwbGF5KTtcblxuICAgIC8vIGZpbGwgdGhlIG1vZGFsIGFuZCBwcmV0ZW5kIHdlIGhhdmUgb3BlbmVkIGl0XG4gICAgX3RoaXMuZmlsbCgpO1xuICAgIF90aGlzLmhhc0JlZW5PcGVuZWRfID0gX3RoaXMuaGFzQmVlbkZpbGxlZF8gPSB0cnVlO1xuXG4gICAgX3RoaXMuZW5kRGlhbG9nID0gY3JlYXRlRWwoJ3AnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtY29udHJvbC10ZXh0JyxcbiAgICAgIHRleHRDb250ZW50OiBfdGhpcy5sb2NhbGl6ZSgnRW5kIG9mIGRpYWxvZyB3aW5kb3cuJylcbiAgICB9KTtcbiAgICBfdGhpcy5lbCgpLmFwcGVuZENoaWxkKF90aGlzLmVuZERpYWxvZyk7XG5cbiAgICBfdGhpcy5zZXREZWZhdWx0cygpO1xuXG4gICAgLy8gR3JhYiBgcGVyc2lzdFRleHRUcmFja1NldHRpbmdzYCBmcm9tIHRoZSBwbGF5ZXIgb3B0aW9ucyBpZiBub3QgcGFzc2VkIGluIGNoaWxkIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucy5wZXJzaXN0VGV4dFRyYWNrU2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX3RoaXMub3B0aW9uc18ucGVyc2lzdFRleHRUcmFja1NldHRpbmdzID0gX3RoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucy5wZXJzaXN0VGV4dFRyYWNrU2V0dGluZ3M7XG4gICAgfVxuXG4gICAgX3RoaXMub24oX3RoaXMuJCgnLnZqcy1kb25lLWJ1dHRvbicpLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBfdGhpcy5vbihfdGhpcy4kKCcudmpzLWRlZmF1bHQtYnV0dG9uJyksICdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldERlZmF1bHRzKCk7XG4gICAgICBfdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gICAgfSk7XG5cbiAgICBlYWNoKHNlbGVjdENvbmZpZ3MsIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIF90aGlzLm9uKF90aGlzLiQoY29uZmlnLnNlbGVjdG9yKSwgJ2NoYW5nZScsIF90aGlzLnVwZGF0ZURpc3BsYXkpO1xuICAgIH0pO1xuXG4gICAgaWYgKF90aGlzLm9wdGlvbnNfLnBlcnNpc3RUZXh0VHJhY2tTZXR0aW5ncykge1xuICAgICAgX3RoaXMucmVzdG9yZVNldHRpbmdzKCk7XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICB0aGlzLmVuZERpYWxvZyA9IG51bGw7XG5cbiAgICBfTW9kYWxEaWFsb2cucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgPHNlbGVjdD4gZWxlbWVudCB3aXRoIGNvbmZpZ3VyZWQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiAgICAgICAgQ29uZmlndXJhdGlvbiBrZXkgdG8gdXNlIGR1cmluZyBjcmVhdGlvbi5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIEFuIEhUTUwgc3RyaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbFNlbGVjdF8gPSBmdW5jdGlvbiBjcmVhdGVFbFNlbGVjdF8oa2V5KSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgbGVnZW5kSWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuICAgIHZhciB0eXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnbGFiZWwnO1xuXG4gICAgdmFyIGNvbmZpZyA9IHNlbGVjdENvbmZpZ3Nba2V5XTtcbiAgICB2YXIgaWQgPSBjb25maWcuaWQucmVwbGFjZSgnJXMnLCB0aGlzLmlkXyk7XG4gICAgdmFyIHNlbGVjdExhYmVsbGVkYnlJZHMgPSBbbGVnZW5kSWQsIGlkXS5qb2luKCcgJykudHJpbSgpO1xuXG4gICAgcmV0dXJuIFsnPCcgKyB0eXBlICsgJyBpZD1cIicgKyBpZCArICdcIiBjbGFzcz1cIicgKyAodHlwZSA9PT0gJ2xhYmVsJyA/ICd2anMtbGFiZWwnIDogJycpICsgJ1wiPicsIHRoaXMubG9jYWxpemUoY29uZmlnLmxhYmVsKSwgJzwvJyArIHR5cGUgKyAnPicsICc8c2VsZWN0IGFyaWEtbGFiZWxsZWRieT1cIicgKyBzZWxlY3RMYWJlbGxlZGJ5SWRzICsgJ1wiPiddLmNvbmNhdChjb25maWcub3B0aW9ucy5tYXAoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBvcHRpb25JZCA9IGlkICsgJy0nICsgb1sxXS5yZXBsYWNlKC9cXFcrL2csICcnKTtcblxuICAgICAgcmV0dXJuIFsnPG9wdGlvbiBpZD1cIicgKyBvcHRpb25JZCArICdcIiB2YWx1ZT1cIicgKyBvWzBdICsgJ1wiICcsICdhcmlhLWxhYmVsbGVkYnk9XCInICsgc2VsZWN0TGFiZWxsZWRieUlkcyArICcgJyArIG9wdGlvbklkICsgJ1wiPicsIF90aGlzMi5sb2NhbGl6ZShvWzFdKSwgJzwvb3B0aW9uPiddLmpvaW4oJycpO1xuICAgIH0pKS5jb25jYXQoJzwvc2VsZWN0PicpLmpvaW4oJycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgZm9yZWdyb3VuZCBjb2xvciBlbGVtZW50IGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBBbiBIVE1MIHN0cmluZy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuY3JlYXRlRWxGZ0NvbG9yXyA9IGZ1bmN0aW9uIGNyZWF0ZUVsRmdDb2xvcl8oKSB7XG4gICAgdmFyIGxlZ2VuZElkID0gJ2NhcHRpb25zLXRleHQtbGVnZW5kLScgKyB0aGlzLmlkXztcblxuICAgIHJldHVybiBbJzxmaWVsZHNldCBjbGFzcz1cInZqcy1mZy1jb2xvciB2anMtdHJhY2stc2V0dGluZ1wiPicsICc8bGVnZW5kIGlkPVwiJyArIGxlZ2VuZElkICsgJ1wiPicsIHRoaXMubG9jYWxpemUoJ1RleHQnKSwgJzwvbGVnZW5kPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCdjb2xvcicsIGxlZ2VuZElkKSwgJzxzcGFuIGNsYXNzPVwidmpzLXRleHQtb3BhY2l0eSB2anMtb3BhY2l0eVwiPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCd0ZXh0T3BhY2l0eScsIGxlZ2VuZElkKSwgJzwvc3Bhbj4nLCAnPC9maWVsZHNldD4nXS5qb2luKCcnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGJhY2tncm91bmQgY29sb3IgZWxlbWVudCBmb3IgdGhlIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqICAgICAgICAgQW4gSFRNTCBzdHJpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmNyZWF0ZUVsQmdDb2xvcl8gPSBmdW5jdGlvbiBjcmVhdGVFbEJnQ29sb3JfKCkge1xuICAgIHZhciBsZWdlbmRJZCA9ICdjYXB0aW9ucy1iYWNrZ3JvdW5kLScgKyB0aGlzLmlkXztcblxuICAgIHJldHVybiBbJzxmaWVsZHNldCBjbGFzcz1cInZqcy1iZy1jb2xvciB2anMtdHJhY2stc2V0dGluZ1wiPicsICc8bGVnZW5kIGlkPVwiJyArIGxlZ2VuZElkICsgJ1wiPicsIHRoaXMubG9jYWxpemUoJ0JhY2tncm91bmQnKSwgJzwvbGVnZW5kPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCdiYWNrZ3JvdW5kQ29sb3InLCBsZWdlbmRJZCksICc8c3BhbiBjbGFzcz1cInZqcy1iZy1vcGFjaXR5IHZqcy1vcGFjaXR5XCI+JywgdGhpcy5jcmVhdGVFbFNlbGVjdF8oJ2JhY2tncm91bmRPcGFjaXR5JywgbGVnZW5kSWQpLCAnPC9zcGFuPicsICc8L2ZpZWxkc2V0PiddLmpvaW4oJycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgd2luZG93IGNvbG9yIGVsZW1lbnQgZm9yIHRoZSBjb21wb25lbnRcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIEFuIEhUTUwgc3RyaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbFdpbkNvbG9yXyA9IGZ1bmN0aW9uIGNyZWF0ZUVsV2luQ29sb3JfKCkge1xuICAgIHZhciBsZWdlbmRJZCA9ICdjYXB0aW9ucy13aW5kb3ctJyArIHRoaXMuaWRfO1xuXG4gICAgcmV0dXJuIFsnPGZpZWxkc2V0IGNsYXNzPVwidmpzLXdpbmRvdy1jb2xvciB2anMtdHJhY2stc2V0dGluZ1wiPicsICc8bGVnZW5kIGlkPVwiJyArIGxlZ2VuZElkICsgJ1wiPicsIHRoaXMubG9jYWxpemUoJ1dpbmRvdycpLCAnPC9sZWdlbmQ+JywgdGhpcy5jcmVhdGVFbFNlbGVjdF8oJ3dpbmRvd0NvbG9yJywgbGVnZW5kSWQpLCAnPHNwYW4gY2xhc3M9XCJ2anMtd2luZG93LW9wYWNpdHkgdmpzLW9wYWNpdHlcIj4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0Xygnd2luZG93T3BhY2l0eScsIGxlZ2VuZElkKSwgJzwvc3Bhbj4nLCAnPC9maWVsZHNldD4nXS5qb2luKCcnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGNvbG9yIGVsZW1lbnRzIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbENvbG9yc18gPSBmdW5jdGlvbiBjcmVhdGVFbENvbG9yc18oKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdHJhY2stc2V0dGluZ3MtY29sb3JzJyxcbiAgICAgIGlubmVySFRNTDogW3RoaXMuY3JlYXRlRWxGZ0NvbG9yXygpLCB0aGlzLmNyZWF0ZUVsQmdDb2xvcl8oKSwgdGhpcy5jcmVhdGVFbFdpbkNvbG9yXygpXS5qb2luKCcnKVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgZm9udCBlbGVtZW50cyBmb3IgdGhlIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmNyZWF0ZUVsRm9udF8gPSBmdW5jdGlvbiBjcmVhdGVFbEZvbnRfKCkge1xuICAgIHJldHVybiBjcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLXRyYWNrLXNldHRpbmdzLWZvbnQnLFxuICAgICAgaW5uZXJIVE1MOiBbJzxmaWVsZHNldCBjbGFzcz1cInZqcy1mb250LXBlcmNlbnQgdmpzLXRyYWNrLXNldHRpbmdcIj4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0XygnZm9udFBlcmNlbnQnLCAnJywgJ2xlZ2VuZCcpLCAnPC9maWVsZHNldD4nLCAnPGZpZWxkc2V0IGNsYXNzPVwidmpzLWVkZ2Utc3R5bGUgdmpzLXRyYWNrLXNldHRpbmdcIj4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0XygnZWRnZVN0eWxlJywgJycsICdsZWdlbmQnKSwgJzwvZmllbGRzZXQ+JywgJzxmaWVsZHNldCBjbGFzcz1cInZqcy1mb250LWZhbWlseSB2anMtdHJhY2stc2V0dGluZ1wiPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCdmb250RmFtaWx5JywgJycsICdsZWdlbmQnKSwgJzwvZmllbGRzZXQ+J10uam9pbignJylcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGNvbnRyb2xzIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuY3JlYXRlRWxDb250cm9sc18gPSBmdW5jdGlvbiBjcmVhdGVFbENvbnRyb2xzXygpIHtcbiAgICB2YXIgZGVmYXVsdHNEZXNjcmlwdGlvbiA9IHRoaXMubG9jYWxpemUoJ3Jlc3RvcmUgYWxsIHNldHRpbmdzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcycpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdHJhY2stc2V0dGluZ3MtY29udHJvbHMnLFxuICAgICAgaW5uZXJIVE1MOiBbJzxidXR0b24gY2xhc3M9XCJ2anMtZGVmYXVsdC1idXR0b25cIiB0aXRsZT1cIicgKyBkZWZhdWx0c0Rlc2NyaXB0aW9uICsgJ1wiPicsIHRoaXMubG9jYWxpemUoJ1Jlc2V0JyksICc8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj4gJyArIGRlZmF1bHRzRGVzY3JpcHRpb24gKyAnPC9zcGFuPicsICc8L2J1dHRvbj4nLCAnPGJ1dHRvbiBjbGFzcz1cInZqcy1kb25lLWJ1dHRvblwiPicgKyB0aGlzLmxvY2FsaXplKCdEb25lJykgKyAnPC9idXR0b24+J10uam9pbignJylcbiAgICB9KTtcbiAgfTtcblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuY29udGVudCA9IGZ1bmN0aW9uIGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIFt0aGlzLmNyZWF0ZUVsQ29sb3JzXygpLCB0aGlzLmNyZWF0ZUVsRm9udF8oKSwgdGhpcy5jcmVhdGVFbENvbnRyb2xzXygpXTtcbiAgfTtcblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUubGFiZWwgPSBmdW5jdGlvbiBsYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGl6ZSgnQ2FwdGlvbiBTZXR0aW5ncyBEaWFsb2cnKTtcbiAgfTtcblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGl6ZSgnQmVnaW5uaW5nIG9mIGRpYWxvZyB3aW5kb3cuIEVzY2FwZSB3aWxsIGNhbmNlbCBhbmQgY2xvc2UgdGhlIHdpbmRvdy4nKTtcbiAgfTtcblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuIF9Nb2RhbERpYWxvZy5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpICsgJyB2anMtdGV4dC10cmFjay1zZXR0aW5ncyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JqZWN0IG9mIHRleHQgdHJhY2sgc2V0dGluZ3MgKG9yIG51bGwpLlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqICAgICAgICAgQW4gb2JqZWN0IHdpdGggY29uZmlnIHZhbHVlcyBwYXJzZWQgZnJvbSB0aGUgRE9NIG9yIGxvY2FsU3RvcmFnZS5cbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gZ2V0VmFsdWVzKCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHJlZHVjZShzZWxlY3RDb25maWdzLCBmdW5jdGlvbiAoYWNjdW0sIGNvbmZpZywga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRTZWxlY3RlZE9wdGlvblZhbHVlKF90aGlzMy4kKGNvbmZpZy5zZWxlY3RvciksIGNvbmZpZy5wYXJzZXIpO1xuXG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB7fSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgdGV4dCB0cmFjayBzZXR0aW5ncyBmcm9tIGFuIG9iamVjdCBvZiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXNcbiAgICogICAgICAgIEFuIG9iamVjdCB3aXRoIGNvbmZpZyB2YWx1ZXMgcGFyc2VkIGZyb20gdGhlIERPTSBvciBsb2NhbFN0b3JhZ2UuXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLnNldFZhbHVlcyA9IGZ1bmN0aW9uIHNldFZhbHVlcyh2YWx1ZXMpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGVhY2goc2VsZWN0Q29uZmlncywgZnVuY3Rpb24gKGNvbmZpZywga2V5KSB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihfdGhpczQuJChjb25maWcuc2VsZWN0b3IpLCB2YWx1ZXNba2V5XSwgY29uZmlnLnBhcnNlcik7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgYWxsIGA8c2VsZWN0PmAgZWxlbWVudHMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLnNldERlZmF1bHRzID0gZnVuY3Rpb24gc2V0RGVmYXVsdHMoKSB7XG4gICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICBlYWNoKHNlbGVjdENvbmZpZ3MsIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIHZhciBpbmRleCA9IGNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpID8gY29uZmlnWydkZWZhdWx0J10gOiAwO1xuXG4gICAgICBfdGhpczUuJChjb25maWcuc2VsZWN0b3IpLnNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzdG9yZSB0ZXh0dHJhY2sgc2V0dGluZ3MgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUucmVzdG9yZVNldHRpbmdzID0gZnVuY3Rpb24gcmVzdG9yZVNldHRpbmdzKCkge1xuICAgIHZhciB2YWx1ZXMgPSB2b2lkIDA7XG5cbiAgICB0cnkge1xuICAgICAgdmFsdWVzID0gSlNPTi5wYXJzZSh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oTE9DQUxfU1RPUkFHRV9LRVkpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyQxLndhcm4oZXJyKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzKSB7XG4gICAgICB0aGlzLnNldFZhbHVlcyh2YWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2F2ZSB0ZXh0IHRyYWNrIHNldHRpbmdzIHRvIGxvY2FsU3RvcmFnZVxuICAgKi9cblxuXG4gIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5zYXZlU2V0dGluZ3MgPSBmdW5jdGlvbiBzYXZlU2V0dGluZ3MoKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNfLnBlcnNpc3RUZXh0VHJhY2tTZXR0aW5ncykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlcygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZXMpLmxlbmd0aCkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oTE9DQUxfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHZhbHVlcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKExPQ0FMX1NUT1JBR0VfS0VZKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyQxLndhcm4oZXJyKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkaXNwbGF5IG9mIHRleHQgdHJhY2sgc2V0dGluZ3NcbiAgICovXG5cblxuICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUudXBkYXRlRGlzcGxheSA9IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXkoKSB7XG4gICAgdmFyIHR0RGlzcGxheSA9IHRoaXMucGxheWVyXy5nZXRDaGlsZCgndGV4dFRyYWNrRGlzcGxheScpO1xuXG4gICAgaWYgKHR0RGlzcGxheSkge1xuICAgICAgdHREaXNwbGF5LnVwZGF0ZURpc3BsYXkoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGNvbmRpdGlvbmFsbHkgYmx1ciB0aGUgZWxlbWVudCBhbmQgcmVmb2N1cyB0aGUgY2FwdGlvbnMgYnV0dG9uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmNvbmRpdGlvbmFsQmx1cl8gPSBmdW5jdGlvbiBjb25kaXRpb25hbEJsdXJfKCkge1xuICAgIHRoaXMucHJldmlvdXNseUFjdGl2ZUVsXyA9IG51bGw7XG4gICAgdGhpcy5vZmYoZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcblxuICAgIHZhciBjYiA9IHRoaXMucGxheWVyXy5jb250cm9sQmFyO1xuICAgIHZhciBzdWJzQ2Fwc0J0biA9IGNiICYmIGNiLnN1YnNDYXBzQnV0dG9uO1xuICAgIHZhciBjY0J0biA9IGNiICYmIGNiLmNhcHRpb25zQnV0dG9uO1xuXG4gICAgaWYgKHN1YnNDYXBzQnRuKSB7XG4gICAgICBzdWJzQ2Fwc0J0bi5mb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoY2NCdG4pIHtcbiAgICAgIGNjQnRuLmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUZXh0VHJhY2tTZXR0aW5ncztcbn0oTW9kYWxEaWFsb2cpO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RleHRUcmFja1NldHRpbmdzJywgVGV4dFRyYWNrU2V0dGluZ3MpO1xuXG4vKipcbiAqIEBmaWxlIHJlc2l6ZS1tYW5hZ2VyLmpzXG4gKi9cbi8qKlxuICogQSBSZXNpemUgTWFuYWdlci4gSXQgaXMgaW4gY2hhcmdlIG9mIHRyaWdnZXJpbmcgYHBsYXllcnJlc2l6ZWAgb24gdGhlIHBsYXllciBpbiB0aGUgcmlnaHQgY29uZGl0aW9ucy5cbiAqXG4gKiBJdCdsbCBlaXRoZXIgY3JlYXRlIGFuIGlmcmFtZSBhbmQgdXNlIGEgZGVib3VuY2VkIHJlc2l6ZSBoYW5kbGVyIG9uIGl0IG9yIHVzZSB0aGUgbmV3IHtAbGluayBodHRwczovL3dpY2cuZ2l0aHViLmlvL1Jlc2l6ZU9ic2VydmVyL3xSZXNpemVPYnNlcnZlcn0uXG4gKlxuICogSWYgdGhlIFJlc2l6ZU9ic2VydmVyIGlzIGF2YWlsYWJsZSBuYXRpdmVseSwgaXQgd2lsbCBiZSB1c2VkLiBBIHBvbHlmaWxsIGNhbiBiZSBwYXNzZWQgaW4gYXMgYW4gb3B0aW9uLlxuICogSWYgYSBgcGxheWVycmVzaXplYCBldmVudCBpcyBub3QgbmVlZGVkLCB0aGUgUmVzaXplTWFuYWdlciBjb21wb25lbnQgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgcGxheWVyLCBzZWUgdGhlIGV4YW1wbGUgYmVsb3cuXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Ib3cgdG8gZGlzYWJsZSB0aGUgcmVzaXplIG1hbmFnZXI8L2NhcHRpb24+XG4gKiBjb25zdCBwbGF5ZXIgPSB2aWRlb2pzKCcjdmlkJywge1xuICogICByZXNpemVNYW5hZ2VyOiBmYWxzZVxuICogfSk7XG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9SZXNpemVPYnNlcnZlci98UmVzaXplT2JzZXJ2ZXIgc3BlY2lmaWNhdGlvbn1cbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuXG52YXIgUmVzaXplTWFuYWdlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKFJlc2l6ZU1hbmFnZXIsIF9Db21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIFJlc2l6ZU1hbmFnZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwbGF5ZXJcbiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIFJlc2l6ZU1hbmFnZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLlJlc2l6ZU9ic2VydmVyXVxuICAgKiAgICAgICAgQSBwb2x5ZmlsbCBmb3IgUmVzaXplT2JzZXJ2ZXIgY2FuIGJlIHBhc3NlZCBpbiBoZXJlLlxuICAgKiAgICAgICAgSWYgdGhpcyBpcyBzZXQgdG8gbnVsbCBpdCB3aWxsIGlnbm9yZSB0aGUgbmF0aXZlIFJlc2l6ZU9ic2VydmVyIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGlmcmFtZSBmYWxsYmFjay5cbiAgICovXG4gIGZ1bmN0aW9uIFJlc2l6ZU1hbmFnZXIocGxheWVyLCBvcHRpb25zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVzaXplTWFuYWdlcik7XG5cbiAgICB2YXIgUkVTSVpFX09CU0VSVkVSX0FWQUlMQUJMRSA9IG9wdGlvbnMuUmVzaXplT2JzZXJ2ZXIgfHwgd2luZG93LlJlc2l6ZU9ic2VydmVyO1xuXG4gICAgLy8gaWYgYG51bGxgIHdhcyBwYXNzZWQsIHdlIHdhbnQgdG8gZGlzYWJsZSB0aGUgUmVzaXplT2JzZXJ2ZXJcbiAgICBpZiAob3B0aW9ucy5SZXNpemVPYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgUkVTSVpFX09CU0VSVkVSX0FWQUlMQUJMRSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgY3JlYXRlIGFuIGVsZW1lbnQgd2hlbiBSZXNpemVPYnNlcnZlciBpc24ndCBhdmFpbGFibGVcbiAgICB2YXIgb3B0aW9uc18gPSBtZXJnZU9wdGlvbnMoeyBjcmVhdGVFbDogIVJFU0laRV9PQlNFUlZFUl9BVkFJTEFCTEUgfSwgb3B0aW9ucyk7XG5cbiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnNfKSk7XG5cbiAgICBfdGhpcy5SZXNpemVPYnNlcnZlciA9IG9wdGlvbnMuUmVzaXplT2JzZXJ2ZXIgfHwgd2luZG93LlJlc2l6ZU9ic2VydmVyO1xuICAgIF90aGlzLmxvYWRMaXN0ZW5lcl8gPSBudWxsO1xuICAgIF90aGlzLnJlc2l6ZU9ic2VydmVyXyA9IG51bGw7XG4gICAgX3RoaXMuZGVib3VuY2VkSGFuZGxlcl8gPSBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5yZXNpemVIYW5kbGVyKCk7XG4gICAgfSwgMTAwLCBmYWxzZSwgcGxheWVyKTtcblxuICAgIGlmIChSRVNJWkVfT0JTRVJWRVJfQVZBSUxBQkxFKSB7XG4gICAgICBfdGhpcy5yZXNpemVPYnNlcnZlcl8gPSBuZXcgX3RoaXMuUmVzaXplT2JzZXJ2ZXIoX3RoaXMuZGVib3VuY2VkSGFuZGxlcl8pO1xuICAgICAgX3RoaXMucmVzaXplT2JzZXJ2ZXJfLm9ic2VydmUocGxheWVyLmVsKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5sb2FkTGlzdGVuZXJfID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuZWxfLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICBvbihfdGhpcy5lbF8uY29udGVudFdpbmRvdywgJ3Jlc2l6ZScsIF90aGlzLmRlYm91bmNlZEhhbmRsZXJfKTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5vZmYoJ2xvYWQnLCBfdGhpcy5sb2FkTGlzdGVuZXJfKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm9uKCdsb2FkJywgX3RoaXMubG9hZExpc3RlbmVyXyk7XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFJlc2l6ZU1hbmFnZXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2lmcmFtZScsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1yZXNpemUtbWFuYWdlcidcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSByZXNpemUgaXMgdHJpZ2dlcmVkIG9uIHRoZSBpZnJhbWUgb3IgYSByZXNpemUgaXMgb2JzZXJ2ZWQgdmlhIHRoZSBSZXNpemVPYnNlcnZlclxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3BsYXllcnJlc2l6ZVxuICAgKi9cblxuXG4gIFJlc2l6ZU1hbmFnZXIucHJvdG90eXBlLnJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbiByZXNpemVIYW5kbGVyKCkge1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5ZXIgc2l6ZSBoYXMgY2hhbmdlZFxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNwbGF5ZXJyZXNpemVcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy5wbGF5ZXJfLnRyaWdnZXIoJ3BsYXllcnJlc2l6ZScpO1xuICB9O1xuXG4gIFJlc2l6ZU1hbmFnZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyXykge1xuICAgICAgaWYgKHRoaXMucGxheWVyXy5lbCgpKSB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXJfLnVub2JzZXJ2ZSh0aGlzLnBsYXllcl8uZWwoKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyXy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWxfICYmIHRoaXMuZWxfLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIG9mZih0aGlzLmVsXy5jb250ZW50V2luZG93LCAncmVzaXplJywgdGhpcy5kZWJvdW5jZWRIYW5kbGVyXyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubG9hZExpc3RlbmVyXykge1xuICAgICAgdGhpcy5vZmYoJ2xvYWQnLCB0aGlzLmxvYWRMaXN0ZW5lcl8pO1xuICAgIH1cblxuICAgIHRoaXMuUmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICAgIHRoaXMuZGVib3VuY2VkSGFuZGxlcl8gPSBudWxsO1xuICAgIHRoaXMubG9hZExpc3RlbmVyXyA9IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIFJlc2l6ZU1hbmFnZXI7XG59KENvbXBvbmVudCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUmVzaXplTWFuYWdlcicsIFJlc2l6ZU1hbmFnZXIpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmaXJlIGEgc291cmNlc2V0IHdoZW4gdGhlcmUgaXMgc29tZXRoaW5nXG4gKiBzaW1pbGFyIHRvIGBtZWRpYUVsLmxvYWQoKWAgYmVpbmcgY2FsbGVkLiBJdCB3aWxsIHRyeSB0byBmaW5kIHRoZSBzb3VyY2UgdmlhXG4gKiB0aGUgYHNyY2AgYXR0cmlidXRlIGFuZCB0aGVuIHRoZSBgPHNvdXJjZT5gIGVsZW1lbnRzLiBJdCB3aWxsIHRoZW4gZmlyZSBgc291cmNlc2V0YFxuICogd2l0aCB0aGUgc291cmNlIHRoYXQgd2FzIGZvdW5kIG9yIGVtcHR5IHN0cmluZyBpZiB3ZSBjYW5ub3Qga25vdy4gSWYgaXQgY2Fubm90XG4gKiBmaW5kIGEgc291cmNlIHRoZW4gYHNvdXJjZXNldGAgd2lsbCBub3QgYmUgZmlyZWQuXG4gKlxuICogQHBhcmFtIHtIdG1sNX0gdGVjaFxuICogICAgICAgIFRoZSB0ZWNoIG9iamVjdCB0aGF0IHNvdXJjZXNldCB3YXMgc2V0dXAgb25cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICByZXR1cm5zIGZhbHNlIGlmIHRoZSBzb3VyY2VzZXQgd2FzIG5vdCBmaXJlZCBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gKi9cbnZhciBzb3VyY2VzZXRMb2FkID0gZnVuY3Rpb24gc291cmNlc2V0TG9hZCh0ZWNoKSB7XG4gIHZhciBlbCA9IHRlY2guZWwoKTtcblxuICAvLyBpZiBgZWwuc3JjYCBpcyBzZXQsIHRoYXQgc291cmNlIHdpbGwgYmUgbG9hZGVkLlxuICBpZiAoZWwuaGFzQXR0cmlidXRlKCdzcmMnKSkge1xuICAgIHRlY2gudHJpZ2dlclNvdXJjZXNldChlbC5zcmMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbmNlIHRoZXJlIGlzbid0IGEgc3JjIHByb3BlcnR5IG9uIHRoZSBtZWRpYSBlbGVtZW50LCBzb3VyY2UgZWxlbWVudHMgd2lsbCBiZSB1c2VkIGZvclxuICAgKiBpbXBsZW1lbnRpbmcgdGhlIHNvdXJjZSBzZWxlY3Rpb24gYWxnb3JpdGhtLiBUaGlzIGhhcHBlbnMgYXN5bmNocm9ub3VzbHkgYW5kXG4gICAqIGZvciBtb3N0IGNhc2VzIHdlcmUgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzb3VyY2Ugd2UgY2Fubm90IHRlbGwgd2hhdCBzb3VyY2Ugd2lsbFxuICAgKiBiZSBsb2FkZWQsIHdpdGhvdXQgcmUtaW1wbGVtZW50aW5nIHRoZSBzb3VyY2Ugc2VsZWN0aW9uIGFsZ29yaXRobS4gQXQgdGhpcyB0aW1lIHdlIGFyZSBub3RcbiAgICogZ29pbmcgdG8gZG8gdGhhdC4gVGhlcmUgYXJlIHRocmVlIHNwZWNpYWwgY2FzZXMgdGhhdCB3ZSBkbyBoYW5kbGUgaGVyZSB0aG91Z2g6XG4gICAqXG4gICAqIDEuIElmIHRoZXJlIGFyZSBubyBzb3VyY2VzLCBkbyBub3QgZmlyZSBgc291cmNlc2V0YC5cbiAgICogMi4gSWYgdGhlcmUgaXMgb25seSBvbmUgYDxzb3VyY2U+YCB3aXRoIGEgYHNyY2AgcHJvcGVydHkvYXR0cmlidXRlIHRoYXQgaXMgb3VyIGBzcmNgXG4gICAqIDMuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYDxzb3VyY2U+YCBidXQgYWxsIG9mIHRoZW0gaGF2ZSB0aGUgc2FtZSBgc3JjYCB1cmwuXG4gICAqICAgIFRoYXQgd2lsbCBiZSBvdXIgc3JjLlxuICAgKi9cbiAgdmFyIHNvdXJjZXMgPSB0ZWNoLiQkKCdzb3VyY2UnKTtcbiAgdmFyIHNyY1VybHMgPSBbXTtcbiAgdmFyIHNyYyA9ICcnO1xuXG4gIC8vIGlmIHRoZXJlIGFyZSBubyBzb3VyY2VzLCBkbyBub3QgZmlyZSBzb3VyY2VzZXRcbiAgaWYgKCFzb3VyY2VzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG9ubHkgY291bnQgdmFsaWQvbm9uLWR1cGxpY2F0ZSBzb3VyY2UgZWxlbWVudHNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHVybCA9IHNvdXJjZXNbaV0uc3JjO1xuXG4gICAgaWYgKHVybCAmJiBzcmNVcmxzLmluZGV4T2YodXJsKSA9PT0gLTEpIHtcbiAgICAgIHNyY1VybHMucHVzaCh1cmwpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoZXJlIHdlcmUgbm8gdmFsaWQgc291cmNlc1xuICBpZiAoIXNyY1VybHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gdGhlcmUgaXMgb25seSBvbmUgdmFsaWQgc291cmNlIGVsZW1lbnQgdXJsXG4gIC8vIHVzZSB0aGF0XG4gIGlmIChzcmNVcmxzLmxlbmd0aCA9PT0gMSkge1xuICAgIHNyYyA9IHNyY1VybHNbMF07XG4gIH1cblxuICB0ZWNoLnRyaWdnZXJTb3VyY2VzZXQoc3JjKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIG91ciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBgaW5uZXJIVE1MYCBkZXNjcmlwdG9yIGZvciBicm93c2Vyc1xuICogdGhhdCBkbyBub3QgaGF2ZSBvbmUuXG4gKi9cbnZhciBpbm5lckhUTUxEZXNjcmlwdG9yUG9seWZpbGwgPSB7fTtcblxuaWYgKCFJU19JRTgpIHtcbiAgaW5uZXJIVE1MRGVzY3JpcHRvclBvbHlmaWxsID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnaW5uZXJIVE1MJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpLmlubmVySFRNTDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHYpIHtcbiAgICAgIC8vIG1ha2UgYSBkdW1teSBub2RlIHRvIHVzZSBpbm5lckhUTUwgb25cbiAgICAgIHZhciBkdW1teSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgLy8gc2V0IGlubmVySFRNTCB0byB0aGUgdmFsdWUgcHJvdmlkZWRcbiAgICAgIGR1bW15LmlubmVySFRNTCA9IHY7XG5cbiAgICAgIC8vIG1ha2UgYSBkb2N1bWVudCBmcmFnbWVudCB0byBob2xkIHRoZSBub2RlcyBmcm9tIGR1bW15XG4gICAgICB2YXIgZG9jRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgICAgLy8gY29weSBhbGwgb2YgdGhlIG5vZGVzIGNyZWF0ZWQgYnkgdGhlIGlubmVySFRNTCBvbiBkdW1teVxuICAgICAgLy8gdG8gdGhlIGRvY3VtZW50IGZyYWdtZW50XG4gICAgICB3aGlsZSAoZHVtbXkuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgZG9jRnJhZy5hcHBlbmRDaGlsZChkdW1teS5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVtb3ZlIGNvbnRlbnRcbiAgICAgIHRoaXMuaW5uZXJUZXh0ID0gJyc7XG5cbiAgICAgIC8vIG5vdyB3ZSBhZGQgYWxsIG9mIHRoYXQgaHRtbCBpbiBvbmUgYnkgYXBwZW5kaW5nIHRoZVxuICAgICAgLy8gZG9jdW1lbnQgZnJhZ21lbnQuIFRoaXMgaXMgaG93IGlubmVySFRNTCBkb2VzIGl0LlxuICAgICAgd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZENoaWxkLmNhbGwodGhpcywgZG9jRnJhZyk7XG5cbiAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgdGhhdCBpbm5lckhUTUwncyBzZXR0ZXIgd291bGRcbiAgICAgIHJldHVybiB0aGlzLmlubmVySFRNTDtcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBHZXQgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGdpdmVuIGEgbGlzdCBvZiBwcmlvcml0aWVzIGFuZCB0aGVcbiAqIHByb3BlcnR5IHRvIGdldC5cbiAqL1xudmFyIGdldERlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXREZXNjcmlwdG9yKHByaW9yaXR5LCBwcm9wKSB7XG4gIHZhciBkZXNjcmlwdG9yID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmlvcml0eS5sZW5ndGg7IGkrKykge1xuICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByaW9yaXR5W2ldLCBwcm9wKTtcblxuICAgIGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3Iuc2V0ICYmIGRlc2NyaXB0b3IuZ2V0KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG5cbiAgcmV0dXJuIGRlc2NyaXB0b3I7XG59O1xuXG52YXIgZ2V0SW5uZXJIVE1MRGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldElubmVySFRNTERlc2NyaXB0b3IodGVjaCkge1xuICByZXR1cm4gZ2V0RGVzY3JpcHRvcihbdGVjaC5lbCgpLCB3aW5kb3cuSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUsIHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZSwgaW5uZXJIVE1MRGVzY3JpcHRvclBvbHlmaWxsXSwgJ2lubmVySFRNTCcpO1xufTtcblxuLyoqXG4gKiBQYXRjaGVzIGJyb3dzZXIgaW50ZXJuYWwgZnVuY3Rpb25zIHNvIHRoYXQgd2UgY2FuIHRlbGwgc3luY3Jvbm91c2x5XG4gKiBpZiBhIGA8c291cmNlPmAgd2FzIGFwcGVuZGVkIHRvIHRoZSBtZWRpYSBlbGVtZW50LiBGb3Igc29tZSByZWFzb24gdGhpc1xuICogY2F1c2VzIGEgYHNvdXJjZXNldGAgaWYgdGhlIHRoZSBtZWRpYSBlbGVtZW50IGlzIHJlYWR5IGFuZCBoYXMgbm8gc291cmNlLlxuICogVGhpcyBoYXBwZW5zIHdoZW46XG4gKiAtIFRoZSBwYWdlIGhhcyBqdXN0IGxvYWRlZCBhbmQgdGhlIG1lZGlhIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHNvdXJjZS5cbiAqIC0gVGhlIG1lZGlhIGVsZW1lbnQgd2FzIGVtcHRpZWQgb2YgYWxsIHNvdXJjZXMsIHRoZW4gYGxvYWQoKWAgd2FzIGNhbGxlZC5cbiAqXG4gKiBJdCBkb2VzIHRoaXMgYnkgcGF0Y2hpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMvcHJvcGVydGllcyB3aGVuIHRoZXkgYXJlIHN1cHBvcnRlZDpcbiAqXG4gKiAtIGBhcHBlbmQoKWAgLSBjYW4gYmUgdXNlZCB0byBhZGQgYSBgPHNvdXJjZT5gIGVsZW1lbnQgdG8gdGhlIG1lZGlhIGVsZW1lbnRcbiAqIC0gYGFwcGVuZENoaWxkKClgIC0gY2FuIGJlIHVzZWQgdG8gYWRkIGEgYDxzb3VyY2U+YCBlbGVtZW50IHRvIHRoZSBtZWRpYSBlbGVtZW50XG4gKiAtIGBpbnNlcnRBZGphY2VudEhUTUwoKWAgLSAgY2FuIGJlIHVzZWQgdG8gYWRkIGEgYDxzb3VyY2U+YCBlbGVtZW50IHRvIHRoZSBtZWRpYSBlbGVtZW50XG4gKiAtIGBpbm5lckhUTUxgIC0gIGNhbiBiZSB1c2VkIHRvIGFkZCBhIGA8c291cmNlPmAgZWxlbWVudCB0byB0aGUgbWVkaWEgZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7SHRtbDV9IHRlY2hcbiAqICAgICAgICBUaGUgdGVjaCBvYmplY3QgdGhhdCBzb3VyY2VzZXQgaXMgYmVpbmcgc2V0dXAgb24uXG4gKi9cbnZhciBmaXJzdFNvdXJjZVdhdGNoID0gZnVuY3Rpb24gZmlyc3RTb3VyY2VXYXRjaCh0ZWNoKSB7XG4gIHZhciBlbCA9IHRlY2guZWwoKTtcblxuICAvLyBtYWtlIHN1cmUgZmlyc3RTb3VyY2VXYXRjaCBpc24ndCBzZXR1cCB0d2ljZS5cbiAgaWYgKGVsLnJlc2V0U291cmNlV2F0Y2hfKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG9sZCA9IHt9O1xuICB2YXIgaW5uZXJEZXNjcmlwdG9yID0gZ2V0SW5uZXJIVE1MRGVzY3JpcHRvcih0ZWNoKTtcbiAgdmFyIGFwcGVuZFdyYXBwZXIgPSBmdW5jdGlvbiBhcHBlbmRXcmFwcGVyKGFwcGVuZEZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHZhciByZXR2YWwgPSBhcHBlbmRGbi5hcHBseShlbCwgYXJncyk7XG5cbiAgICAgIHNvdXJjZXNldExvYWQodGVjaCk7XG5cbiAgICAgIHJldHVybiByZXR2YWw7XG4gICAgfTtcbiAgfTtcblxuICBbJ2FwcGVuZCcsICdhcHBlbmRDaGlsZCcsICdpbnNlcnRBZGphY2VudEhUTUwnXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgaWYgKCFlbFtrXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHN0b3JlIHRoZSBvbGQgZnVuY3Rpb25cbiAgICBvbGRba10gPSBlbFtrXTtcblxuICAgIC8vIGNhbGwgdGhlIG9sZCBmdW5jdGlvbiB3aXRoIGEgc291cmNlc2V0IGlmIGEgc291cmNlXG4gICAgLy8gd2FzIGxvYWRlZFxuICAgIGVsW2tdID0gYXBwZW5kV3JhcHBlcihvbGRba10pO1xuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdpbm5lckhUTUwnLCBtZXJnZU9wdGlvbnMoaW5uZXJEZXNjcmlwdG9yLCB7XG4gICAgc2V0OiBhcHBlbmRXcmFwcGVyKGlubmVyRGVzY3JpcHRvci5zZXQpXG4gIH0pKTtcblxuICBlbC5yZXNldFNvdXJjZVdhdGNoXyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlbC5yZXNldFNvdXJjZVdhdGNoXyA9IG51bGw7XG4gICAgT2JqZWN0LmtleXMob2xkKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICBlbFtrXSA9IG9sZFtrXTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgJ2lubmVySFRNTCcsIGlubmVyRGVzY3JpcHRvcik7XG4gIH07XG5cbiAgLy8gb24gdGhlIGZpcnN0IHNvdXJjZXNldCwgd2UgbmVlZCB0byByZXZlcnQgb3VyIGNoYW5nZXNcbiAgdGVjaC5vbmUoJ3NvdXJjZXNldCcsIGVsLnJlc2V0U291cmNlV2F0Y2hfKTtcbn07XG5cbi8qKlxuICogb3VyIGltcGxlbWVudGF0aW9uIG9mIGEgYHNyY2AgZGVzY3JpcHRvciBmb3IgYnJvd3NlcnNcbiAqIHRoYXQgZG8gbm90IGhhdmUgb25lLlxuICovXG5cbnZhciBzcmNEZXNjcmlwdG9yUG9seWZpbGwgPSB7fTtcblxuaWYgKCFJU19JRTgpIHtcbiAgc3JjRGVzY3JpcHRvclBvbHlmaWxsID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnc3JjJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgICByZXR1cm4gZ2V0QWJzb2x1dGVVUkwod2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZS5jYWxsKHRoaXMsICdzcmMnKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHYpIHtcbiAgICAgIHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCAnc3JjJywgdik7XG5cbiAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgfSk7XG59XG5cbnZhciBnZXRTcmNEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0U3JjRGVzY3JpcHRvcih0ZWNoKSB7XG4gIHJldHVybiBnZXREZXNjcmlwdG9yKFt0ZWNoLmVsKCksIHdpbmRvdy5IVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSwgc3JjRGVzY3JpcHRvclBvbHlmaWxsXSwgJ3NyYycpO1xufTtcblxuLyoqXG4gKiBzZXR1cCBgc291cmNlc2V0YCBoYW5kbGluZyBvbiB0aGUgYEh0bWw1YCB0ZWNoLiBUaGlzIGZ1bmN0aW9uXG4gKiBwYXRjaGVzIHRoZSBmb2xsb3dpbmcgZWxlbWVudCBwcm9wZXJ0aWVzL2Z1bmN0aW9uczpcbiAqXG4gKiAtIGBzcmNgIC0gdG8gZGV0ZXJtaW5lIHdoZW4gYHNyY2AgaXMgc2V0XG4gKiAtIGBzZXRBdHRyaWJ1dGUoKWAgLSB0byBkZXRlcm1pbmUgd2hlbiBgc3JjYCBpcyBzZXRcbiAqIC0gYGxvYWQoKWAgLSB0aGlzIHJlLXRyaWdnZXJzIHRoZSBzb3VyY2Ugc2VsZWN0aW9uIGFsZ29yaXRobSwgYW5kIGNhblxuICogICAgICAgICAgICAgIGNhdXNlIGEgc291cmNlc2V0LlxuICpcbiAqIElmIHRoZXJlIGlzIG5vIHNvdXJjZSB3aGVuIHdlIGFyZSBhZGRpbmcgYHNvdXJjZXNldGAgc3VwcG9ydCBvciBkdXJpbmcgYSBgbG9hZCgpYFxuICogd2UgYWxzbyBwYXRjaCB0aGUgZnVuY3Rpb25zIGxpc3RlZCBpbiBgZmlyc3RTb3VyY2VXYXRjaGAuXG4gKlxuICogQHBhcmFtIHtIdG1sNX0gdGVjaFxuICogICAgICAgIFRoZSB0ZWNoIHRvIHBhdGNoXG4gKi9cbnZhciBzZXR1cFNvdXJjZXNldCA9IGZ1bmN0aW9uIHNldHVwU291cmNlc2V0KHRlY2gpIHtcbiAgaWYgKCF0ZWNoLmZlYXR1cmVzU291cmNlc2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGVsID0gdGVjaC5lbCgpO1xuXG4gIC8vIG1ha2Ugc3VyZSBzb3VyY2VzZXQgaXNuJ3Qgc2V0dXAgdHdpY2UuXG4gIGlmIChlbC5yZXNldFNvdXJjZXNldF8pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc3JjRGVzY3JpcHRvciA9IGdldFNyY0Rlc2NyaXB0b3IodGVjaCk7XG4gIHZhciBvbGRTZXRBdHRyaWJ1dGUgPSBlbC5zZXRBdHRyaWJ1dGU7XG4gIHZhciBvbGRMb2FkID0gZWwubG9hZDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdzcmMnLCBtZXJnZU9wdGlvbnMoc3JjRGVzY3JpcHRvciwge1xuICAgIHNldDogZnVuY3Rpb24gc2V0KHYpIHtcbiAgICAgIHZhciByZXR2YWwgPSBzcmNEZXNjcmlwdG9yLnNldC5jYWxsKGVsLCB2KTtcblxuICAgICAgLy8gd2UgdXNlIHRoZSBnZXR0ZXIgaGVyZSB0byBnZXQgdGhlIGFjdHVhbCB2YWx1ZSBzZXQgb24gc3JjXG4gICAgICB0ZWNoLnRyaWdnZXJTb3VyY2VzZXQoZWwuc3JjKTtcblxuICAgICAgcmV0dXJuIHJldHZhbDtcbiAgICB9XG4gIH0pKTtcblxuICBlbC5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobiwgdikge1xuICAgIHZhciByZXR2YWwgPSBvbGRTZXRBdHRyaWJ1dGUuY2FsbChlbCwgbiwgdik7XG5cbiAgICBpZiAoL3NyYy9pLnRlc3QobikpIHtcbiAgICAgIHRlY2gudHJpZ2dlclNvdXJjZXNldChlbC5zcmMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXR2YWw7XG4gIH07XG5cbiAgZWwubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmV0dmFsID0gb2xkTG9hZC5jYWxsKGVsKTtcblxuICAgIC8vIGlmIGxvYWQgd2FzIGNhbGxlZCwgYnV0IHRoZXJlIHdhcyBubyBzb3VyY2UgdG8gZmlyZVxuICAgIC8vIHNvdXJjZXNldCBvbi4gV2UgaGF2ZSB0byB3YXRjaCBmb3IgYSBzb3VyY2UgYXBwZW5kXG4gICAgLy8gYXMgdGhhdCBjYW4gdHJpZ2dlciBhIGBzb3VyY2VzZXRgIHdoZW4gdGhlIG1lZGlhIGVsZW1lbnRcbiAgICAvLyBoYXMgbm8gc291cmNlXG4gICAgaWYgKCFzb3VyY2VzZXRMb2FkKHRlY2gpKSB7XG4gICAgICB0ZWNoLnRyaWdnZXJTb3VyY2VzZXQoJycpO1xuICAgICAgZmlyc3RTb3VyY2VXYXRjaCh0ZWNoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dmFsO1xuICB9O1xuXG4gIGlmIChlbC5jdXJyZW50U3JjKSB7XG4gICAgdGVjaC50cmlnZ2VyU291cmNlc2V0KGVsLmN1cnJlbnRTcmMpO1xuICB9IGVsc2UgaWYgKCFzb3VyY2VzZXRMb2FkKHRlY2gpKSB7XG4gICAgZmlyc3RTb3VyY2VXYXRjaCh0ZWNoKTtcbiAgfVxuXG4gIGVsLnJlc2V0U291cmNlc2V0XyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlbC5yZXNldFNvdXJjZXNldF8gPSBudWxsO1xuICAgIGVsLmxvYWQgPSBvbGRMb2FkO1xuICAgIGVsLnNldEF0dHJpYnV0ZSA9IG9sZFNldEF0dHJpYnV0ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdzcmMnLCBzcmNEZXNjcmlwdG9yKTtcbiAgICBpZiAoZWwucmVzZXRTb3VyY2VXYXRjaF8pIHtcbiAgICAgIGVsLnJlc2V0U291cmNlV2F0Y2hfKCk7XG4gICAgfVxuICB9O1xufTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQyID0gdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWydUZXh0IFRyYWNrcyBhcmUgYmVpbmcgbG9hZGVkIGZyb20gYW5vdGhlciBvcmlnaW4gYnV0IHRoZSBjcm9zc29yaWdpbiBhdHRyaWJ1dGUgaXNuXFwndCB1c2VkLlxcbiAgICAgICAgICAgIFRoaXMgbWF5IHByZXZlbnQgdGV4dCB0cmFja3MgZnJvbSBsb2FkaW5nLiddLCBbJ1RleHQgVHJhY2tzIGFyZSBiZWluZyBsb2FkZWQgZnJvbSBhbm90aGVyIG9yaWdpbiBidXQgdGhlIGNyb3Nzb3JpZ2luIGF0dHJpYnV0ZSBpc25cXCd0IHVzZWQuXFxuICAgICAgICAgICAgVGhpcyBtYXkgcHJldmVudCB0ZXh0IHRyYWNrcyBmcm9tIGxvYWRpbmcuJ10pO1xuXG4vKipcbiAqIEBmaWxlIGh0bWw1LmpzXG4gKi9cbi8qKlxuICogSFRNTDUgTWVkaWEgQ29udHJvbGxlciAtIFdyYXBwZXIgZm9yIEhUTUw1IE1lZGlhIEFQSVxuICpcbiAqIEBtaXhlcyBUZWNoflNvdWNlSGFuZGxlckFkZGl0aW9uc1xuICogQGV4dGVuZHMgVGVjaFxuICovXG5cbnZhciBIdG1sNSA9IGZ1bmN0aW9uIChfVGVjaCkge1xuICBpbmhlcml0cyhIdG1sNSwgX1RlY2gpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBUZWNoLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSByZWFkeVxuICAgKiAgICAgICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBgSFRNTDVgIFRlY2ggaXMgcmVhZHkuXG4gICAqL1xuICBmdW5jdGlvbiBIdG1sNShvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEh0bWw1KTtcblxuICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RlY2guY2FsbCh0aGlzLCBvcHRpb25zLCByZWFkeSkpO1xuXG4gICAgdmFyIHNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICAgIHZhciBjcm9zc29yaWdpblRyYWNrcyA9IGZhbHNlO1xuXG4gICAgLy8gU2V0IHRoZSBzb3VyY2UgaWYgb25lIGlzIHByb3ZpZGVkXG4gICAgLy8gMSkgQ2hlY2sgaWYgdGhlIHNvdXJjZSBpcyBuZXcgKGlmIG5vdCwgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBzbyBwbGF5YmFjayBpc24ndCBpbnRlcnJ1cHRlZClcbiAgICAvLyAyKSBDaGVjayB0byBzZWUgaWYgdGhlIG5ldHdvcmsgc3RhdGUgb2YgdGhlIHRhZyB3YXMgZmFpbGVkIGF0IGluaXQsIGFuZCBpZiBzbywgcmVzZXQgdGhlIHNvdXJjZVxuICAgIC8vIGFueXdheSBzbyB0aGUgZXJyb3IgZ2V0cyBmaXJlZC5cbiAgICBpZiAoc291cmNlICYmIChfdGhpcy5lbF8uY3VycmVudFNyYyAhPT0gc291cmNlLnNyYyB8fCBvcHRpb25zLnRhZyAmJiBvcHRpb25zLnRhZy5pbml0TmV0d29ya1N0YXRlXyA9PT0gMykpIHtcbiAgICAgIF90aGlzLnNldFNvdXJjZShzb3VyY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5oYW5kbGVMYXRlSW5pdF8oX3RoaXMuZWxfKTtcbiAgICB9XG5cbiAgICAvLyBzZXR1cCBzb3VyY2VzZXQgYWZ0ZXIgbGF0ZSBzb3VyY2VzZXQvaW5pdFxuICAgIGlmIChvcHRpb25zLmVuYWJsZVNvdXJjZXNldCkge1xuICAgICAgX3RoaXMuc2V0dXBTb3VyY2VzZXRIYW5kbGluZ18oKTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMuZWxfLmhhc0NoaWxkTm9kZXMoKSkge1xuXG4gICAgICB2YXIgbm9kZXMgPSBfdGhpcy5lbF8uY2hpbGROb2RlcztcbiAgICAgIHZhciBub2Rlc0xlbmd0aCA9IG5vZGVzLmxlbmd0aDtcbiAgICAgIHZhciByZW1vdmVOb2RlcyA9IFtdO1xuXG4gICAgICB3aGlsZSAobm9kZXNMZW5ndGgtLSkge1xuICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW25vZGVzTGVuZ3RoXTtcbiAgICAgICAgdmFyIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3RyYWNrJykge1xuICAgICAgICAgIGlmICghX3RoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSB7XG4gICAgICAgICAgICAvLyBFbXB0eSB2aWRlbyB0YWcgdHJhY2tzIHNvIHRoZSBidWlsdC1pbiBwbGF5ZXIgZG9lc24ndCB1c2UgdGhlbSBhbHNvLlxuICAgICAgICAgICAgLy8gVGhpcyBtYXkgbm90IGJlIGZhc3QgZW5vdWdoIHRvIHN0b3AgSFRNTDUgYnJvd3NlcnMgZnJvbSByZWFkaW5nIHRoZSB0YWdzXG4gICAgICAgICAgICAvLyBzbyB3ZSdsbCBuZWVkIHRvIHR1cm4gb2ZmIGFueSBkZWZhdWx0IHRyYWNrcyBpZiB3ZSdyZSBtYW51YWxseSBkb2luZ1xuICAgICAgICAgICAgLy8gY2FwdGlvbnMgYW5kIHN1YnRpdGxlcy4gdmlkZW9FbGVtZW50LnRleHRUcmFja3NcbiAgICAgICAgICAgIHJlbW92ZU5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3JlIEhUTUxUcmFja0VsZW1lbnQgYW5kIFRleHRUcmFjayB0byByZW1vdGUgbGlzdFxuICAgICAgICAgICAgX3RoaXMucmVtb3RlVGV4dFRyYWNrRWxzKCkuYWRkVHJhY2tFbGVtZW50Xyhub2RlKTtcbiAgICAgICAgICAgIF90aGlzLnJlbW90ZVRleHRUcmFja3MoKS5hZGRUcmFjayhub2RlLnRyYWNrKTtcbiAgICAgICAgICAgIF90aGlzLnRleHRUcmFja3MoKS5hZGRUcmFjayhub2RlLnRyYWNrKTtcbiAgICAgICAgICAgIGlmICghY3Jvc3NvcmlnaW5UcmFja3MgJiYgIV90aGlzLmVsXy5oYXNBdHRyaWJ1dGUoJ2Nyb3Nzb3JpZ2luJykgJiYgaXNDcm9zc09yaWdpbihub2RlLnNyYykpIHtcbiAgICAgICAgICAgICAgY3Jvc3NvcmlnaW5UcmFja3MgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbW92ZU5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIF90aGlzLmVsXy5yZW1vdmVDaGlsZChyZW1vdmVOb2Rlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMucHJveHlOYXRpdmVUcmFja3NfKCk7XG4gICAgaWYgKF90aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcyAmJiBjcm9zc29yaWdpblRyYWNrcykge1xuICAgICAgbG9nJDEud2Fybih0c21sKF90ZW1wbGF0ZU9iamVjdCQyKSk7XG4gICAgfVxuXG4gICAgLy8gcHJldmVudCBpT1MgU2FmYXJpIGZyb20gZGlzYWJsaW5nIG1ldGFkYXRhIHRleHQgdHJhY2tzIGR1cmluZyBuYXRpdmUgcGxheWJhY2tcbiAgICBfdGhpcy5yZXN0b3JlTWV0YWRhdGFUcmFja3NJbklPU05hdGl2ZVBsYXllcl8oKTtcblxuICAgIC8vIERldGVybWluZSBpZiBuYXRpdmUgY29udHJvbHMgc2hvdWxkIGJlIHVzZWRcbiAgICAvLyBPdXIgZ29hbCBzaG91bGQgYmUgdG8gZ2V0IHRoZSBjdXN0b20gY29udHJvbHMgb24gbW9iaWxlIHNvbGlkIGV2ZXJ5d2hlcmVcbiAgICAvLyBzbyB3ZSBjYW4gcmVtb3ZlIHRoaXMgYWxsIHRvZ2V0aGVyLiBSaWdodCBub3cgdGhpcyB3aWxsIGJsb2NrIGN1c3RvbVxuICAgIC8vIGNvbnRyb2xzIG9uIHRvdWNoIGVuYWJsZWQgbGFwdG9wcyBsaWtlIHRoZSBDaHJvbWUgUGl4ZWxcbiAgICBpZiAoKFRPVUNIX0VOQUJMRUQgfHwgSVNfSVBIT05FIHx8IElTX05BVElWRV9BTkRST0lEKSAmJiBvcHRpb25zLm5hdGl2ZUNvbnRyb2xzRm9yVG91Y2ggPT09IHRydWUpIHtcbiAgICAgIF90aGlzLnNldENvbnRyb2xzKHRydWUpO1xuICAgIH1cblxuICAgIC8vIG9uIGlPUywgd2Ugd2FudCB0byBwcm94eSBgd2Via2l0YmVnaW5mdWxsc2NyZWVuYCBhbmQgYHdlYmtpdGVuZGZ1bGxzY3JlZW5gXG4gICAgLy8gaW50byBhIGBmdWxsc2NyZWVuY2hhbmdlYCBldmVudFxuICAgIF90aGlzLnByb3h5V2Via2l0RnVsbHNjcmVlbl8oKTtcblxuICAgIF90aGlzLnRyaWdnZXJSZWFkeSgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIGBIVE1MNWAgbWVkaWEgZWxlbWVudCBhbmQgcmVtb3ZlIGFsbCB0cmFja3MuXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLmVsXyAmJiB0aGlzLmVsXy5yZXNldFNvdXJjZXNldF8pIHtcbiAgICAgIHRoaXMuZWxfLnJlc2V0U291cmNlc2V0XygpO1xuICAgIH1cbiAgICBIdG1sNS5kaXNwb3NlTWVkaWFFbGVtZW50KHRoaXMuZWxfKTtcbiAgICB0aGlzLm9wdGlvbnNfID0gbnVsbDtcblxuICAgIC8vIHRlY2ggd2lsbCBoYW5kbGUgY2xlYXJpbmcgb2YgdGhlIGVtdWxhdGVkIHRyYWNrIGxpc3RcbiAgICBfVGVjaC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBNb2RpZnkgdGhlIG1lZGlhIGVsZW1lbnQgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IHdoZW5cbiAgICogdGhlIHNvdXJjZSBpcyBjaGFuZ2VkLiBGaXJlcyBgc291cmNlc2V0YCBqdXN0IGFmdGVyIHRoZSBzb3VyY2UgaGFzIGNoYW5nZWRcbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuc2V0dXBTb3VyY2VzZXRIYW5kbGluZ18gPSBmdW5jdGlvbiBzZXR1cFNvdXJjZXNldEhhbmRsaW5nXygpIHtcbiAgICBzZXR1cFNvdXJjZXNldCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogV2hlbiBhIGNhcHRpb25zIHRyYWNrIGlzIGVuYWJsZWQgaW4gdGhlIGlPUyBTYWZhcmkgbmF0aXZlIHBsYXllciwgYWxsIG90aGVyXG4gICAqIHRyYWNrcyBhcmUgZGlzYWJsZWQgKGluY2x1ZGluZyBtZXRhZGF0YSB0cmFja3MpLCB3aGljaCBudWxscyBhbGwgb2YgdGhlaXJcbiAgICogYXNzb2NpYXRlZCBjdWUgcG9pbnRzLiBUaGlzIHdpbGwgcmVzdG9yZSBtZXRhZGF0YSB0cmFja3MgdG8gdGhlaXIgcHJlLWZ1bGxzY3JlZW5cbiAgICogc3RhdGUgaW4gdGhvc2UgY2FzZXMgc28gdGhhdCBjdWUgcG9pbnRzIGFyZSBub3QgbmVlZGxlc3NseSBsb3N0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5yZXN0b3JlTWV0YWRhdGFUcmFja3NJbklPU05hdGl2ZVBsYXllcl8gPSBmdW5jdGlvbiByZXN0b3JlTWV0YWRhdGFUcmFja3NJbklPU05hdGl2ZVBsYXllcl8oKSB7XG4gICAgdmFyIHRleHRUcmFja3MgPSB0aGlzLnRleHRUcmFja3MoKTtcbiAgICB2YXIgbWV0YWRhdGFUcmFja3NQcmVGdWxsc2NyZWVuU3RhdGUgPSB2b2lkIDA7XG5cbiAgICAvLyBjYXB0dXJlcyBhIHNuYXBzaG90IG9mIGV2ZXJ5IG1ldGFkYXRhIHRyYWNrJ3MgY3VycmVudCBzdGF0ZVxuICAgIHZhciB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90ID0gZnVuY3Rpb24gdGFrZU1ldGFkYXRhVHJhY2tTbmFwc2hvdCgpIHtcbiAgICAgIG1ldGFkYXRhVHJhY2tzUHJlRnVsbHNjcmVlblN0YXRlID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dFRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdHJhY2sgPSB0ZXh0VHJhY2tzW2ldO1xuXG4gICAgICAgIGlmICh0cmFjay5raW5kID09PSAnbWV0YWRhdGEnKSB7XG4gICAgICAgICAgbWV0YWRhdGFUcmFja3NQcmVGdWxsc2NyZWVuU3RhdGUucHVzaCh7XG4gICAgICAgICAgICB0cmFjazogdHJhY2ssXG4gICAgICAgICAgICBzdG9yZWRNb2RlOiB0cmFjay5tb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gc25hcHNob3QgZWFjaCBtZXRhZGF0YSB0cmFjaydzIGluaXRpYWwgc3RhdGUsIGFuZCB1cGRhdGUgdGhlIHNuYXBzaG90XG4gICAgLy8gZWFjaCB0aW1lIHRoZXJlIGlzIGEgdHJhY2sgJ2NoYW5nZScgZXZlbnRcbiAgICB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KCk7XG4gICAgdGV4dFRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KTtcblxuICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KTtcbiAgICB9KTtcblxuICAgIHZhciByZXN0b3JlVHJhY2tNb2RlID0gZnVuY3Rpb24gcmVzdG9yZVRyYWNrTW9kZSgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWV0YWRhdGFUcmFja3NQcmVGdWxsc2NyZWVuU3RhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN0b3JlZFRyYWNrID0gbWV0YWRhdGFUcmFja3NQcmVGdWxsc2NyZWVuU3RhdGVbaV07XG5cbiAgICAgICAgaWYgKHN0b3JlZFRyYWNrLnRyYWNrLm1vZGUgPT09ICdkaXNhYmxlZCcgJiYgc3RvcmVkVHJhY2sudHJhY2subW9kZSAhPT0gc3RvcmVkVHJhY2suc3RvcmVkTW9kZSkge1xuICAgICAgICAgIHN0b3JlZFRyYWNrLnRyYWNrLm1vZGUgPSBzdG9yZWRUcmFjay5zdG9yZWRNb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB3ZSBvbmx5IHdhbnQgdGhpcyBoYW5kbGVyIHRvIGJlIGV4ZWN1dGVkIG9uIHRoZSBmaXJzdCAnY2hhbmdlJyBldmVudFxuICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZXN0b3JlVHJhY2tNb2RlKTtcbiAgICB9O1xuXG4gICAgLy8gd2hlbiB3ZSBlbnRlciBmdWxsc2NyZWVuIHBsYXliYWNrLCBzdG9wIHVwZGF0aW5nIHRoZSBzbmFwc2hvdCBhbmRcbiAgICAvLyByZXN0b3JlIGFsbCB0cmFjayBtb2RlcyB0byB0aGVpciBwcmUtZnVsbHNjcmVlbiBzdGF0ZVxuICAgIHRoaXMub24oJ3dlYmtpdGJlZ2luZnVsbHNjcmVlbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRleHRUcmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGFrZU1ldGFkYXRhVHJhY2tTbmFwc2hvdCk7XG5cbiAgICAgIC8vIHJlbW92ZSB0aGUgbGlzdGVuZXIgYmVmb3JlIGFkZGluZyBpdCBqdXN0IGluIGNhc2UgaXQgd2Fzbid0IHByZXZpb3VzbHkgcmVtb3ZlZFxuICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZXN0b3JlVHJhY2tNb2RlKTtcbiAgICAgIHRleHRUcmFja3MuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgcmVzdG9yZVRyYWNrTW9kZSk7XG4gICAgfSk7XG5cbiAgICAvLyBzdGFydCB1cGRhdGluZyB0aGUgc25hcHNob3QgYWdhaW4gYWZ0ZXIgbGVhdmluZyBmdWxsc2NyZWVuXG4gICAgdGhpcy5vbignd2Via2l0ZW5kZnVsbHNjcmVlbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHJlbW92ZSB0aGUgbGlzdGVuZXIgYmVmb3JlIGFkZGluZyBpdCBqdXN0IGluIGNhc2UgaXQgd2Fzbid0IHByZXZpb3VzbHkgcmVtb3ZlZFxuICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KTtcbiAgICAgIHRleHRUcmFja3MuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGFrZU1ldGFkYXRhVHJhY2tTbmFwc2hvdCk7XG5cbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVzdG9yZVRyYWNrTW9kZSBoYW5kbGVyIGluIGNhc2UgaXQgd2Fzbid0IHRyaWdnZXJlZCBkdXJpbmcgZnVsbHNjcmVlbiBwbGF5YmFja1xuICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZXN0b3JlVHJhY2tNb2RlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUHJveHkgYWxsIG5hdGl2ZSB0cmFjayBsaXN0IGV2ZW50cyB0byBvdXIgdHJhY2sgbGlzdHMgaWYgdGhlIGJyb3dzZXIgd2UgYXJlIHBsYXlpbmdcbiAgICogaW4gc3VwcG9ydHMgdGhhdCB0eXBlIG9mIHRyYWNrIGxpc3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLnByb3h5TmF0aXZlVHJhY2tzXyA9IGZ1bmN0aW9uIHByb3h5TmF0aXZlVHJhY2tzXygpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIE5PUk1BTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgcHJvcHMgPSBOT1JNQUxbbmFtZV07XG4gICAgICB2YXIgZWxUcmFja3MgPSBfdGhpczIuZWwoKVtwcm9wcy5nZXR0ZXJOYW1lXTtcbiAgICAgIHZhciB0ZWNoVHJhY2tzID0gX3RoaXMyW3Byb3BzLmdldHRlck5hbWVdKCk7XG5cbiAgICAgIGlmICghX3RoaXMyWydmZWF0dXJlc05hdGl2ZScgKyBwcm9wcy5jYXBpdGFsTmFtZSArICdUcmFja3MnXSB8fCAhZWxUcmFja3MgfHwgIWVsVHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGxpc3RlbmVycyA9IHtcbiAgICAgICAgY2hhbmdlOiBmdW5jdGlvbiBjaGFuZ2UoZSkge1xuICAgICAgICAgIHRlY2hUcmFja3MudHJpZ2dlcih7XG4gICAgICAgICAgICB0eXBlOiAnY2hhbmdlJyxcbiAgICAgICAgICAgIHRhcmdldDogdGVjaFRyYWNrcyxcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQ6IHRlY2hUcmFja3MsXG4gICAgICAgICAgICBzcmNFbGVtZW50OiB0ZWNoVHJhY2tzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFkZHRyYWNrOiBmdW5jdGlvbiBhZGR0cmFjayhlKSB7XG4gICAgICAgICAgdGVjaFRyYWNrcy5hZGRUcmFjayhlLnRyYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZldHJhY2s6IGZ1bmN0aW9uIHJlbW92ZXRyYWNrKGUpIHtcbiAgICAgICAgICB0ZWNoVHJhY2tzLnJlbW92ZVRyYWNrKGUudHJhY2spO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIHJlbW92ZU9sZFRyYWNrcyA9IGZ1bmN0aW9uIHJlbW92ZU9sZFRyYWNrcygpIHtcbiAgICAgICAgdmFyIHJlbW92ZVRyYWNrcyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVjaFRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbFRyYWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGVsVHJhY2tzW2pdID09PSB0ZWNoVHJhY2tzW2ldKSB7XG4gICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgcmVtb3ZlVHJhY2tzLnB1c2godGVjaFRyYWNrc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHJlbW92ZVRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICB0ZWNoVHJhY2tzLnJlbW92ZVRyYWNrKHJlbW92ZVRyYWNrcy5zaGlmdCgpKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgT2JqZWN0LmtleXMobGlzdGVuZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2V2ZW50TmFtZV07XG5cbiAgICAgICAgZWxUcmFja3MuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgX3RoaXMyLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxUcmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUmVtb3ZlIChuYXRpdmUpIHRyYWNrcyB0aGF0IGFyZSBub3QgdXNlZCBhbnltb3JlXG4gICAgICBfdGhpczIub24oJ2xvYWRzdGFydCcsIHJlbW92ZU9sZFRyYWNrcyk7XG4gICAgICBfdGhpczIub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLm9mZignbG9hZHN0YXJ0JywgcmVtb3ZlT2xkVHJhY2tzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBIdG1sNWAgVGVjaCdzIERPTSBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkge1xuICAgIHZhciBlbCA9IHRoaXMub3B0aW9uc18udGFnO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBicm93c2VyIHN1cHBvcnRzIG1vdmluZyB0aGUgZWxlbWVudCBpbnRvIHRoZSBib3guXG4gICAgLy8gT24gdGhlIGlQaG9uZSB2aWRlbyB3aWxsIGJyZWFrIGlmIHlvdSBtb3ZlIHRoZSBlbGVtZW50LFxuICAgIC8vIFNvIHdlIGhhdmUgdG8gY3JlYXRlIGEgYnJhbmQgbmV3IGVsZW1lbnQuXG4gICAgLy8gSWYgd2UgaW5nZXN0ZWQgdGhlIHBsYXllciBkaXYsIHdlIGRvIG5vdCBuZWVkIHRvIG1vdmUgdGhlIG1lZGlhIGVsZW1lbnQuXG4gICAgaWYgKCFlbCB8fCAhKHRoaXMub3B0aW9uc18ucGxheWVyRWxJbmdlc3QgfHwgdGhpcy5tb3ZpbmdNZWRpYUVsZW1lbnRJbkRPTSkpIHtcblxuICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIHRhZyBpcyBzdGlsbCB0aGVyZSwgY2xvbmUgYW5kIHJlbW92ZSBpdC5cbiAgICAgIGlmIChlbCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgaWYgKGVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBlbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjbG9uZSwgZWwpO1xuICAgICAgICB9XG4gICAgICAgIEh0bWw1LmRpc3Bvc2VNZWRpYUVsZW1lbnQoZWwpO1xuICAgICAgICBlbCA9IGNsb25lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuXG4gICAgICAgIC8vIGRldGVybWluZSBpZiBuYXRpdmUgY29udHJvbHMgc2hvdWxkIGJlIHVzZWRcbiAgICAgICAgdmFyIHRhZ0F0dHJpYnV0ZXMgPSB0aGlzLm9wdGlvbnNfLnRhZyAmJiBnZXRBdHRyaWJ1dGVzKHRoaXMub3B0aW9uc18udGFnKTtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBtZXJnZU9wdGlvbnMoe30sIHRhZ0F0dHJpYnV0ZXMpO1xuXG4gICAgICAgIGlmICghVE9VQ0hfRU5BQkxFRCB8fCB0aGlzLm9wdGlvbnNfLm5hdGl2ZUNvbnRyb2xzRm9yVG91Y2ggIT09IHRydWUpIHtcbiAgICAgICAgICBkZWxldGUgYXR0cmlidXRlcy5jb250cm9scztcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEF0dHJpYnV0ZXMoZWwsIGFzc2lnbihhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgaWQ6IHRoaXMub3B0aW9uc18udGVjaElkLFxuICAgICAgICAgICdjbGFzcyc6ICd2anMtdGVjaCdcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBlbC5wbGF5ZXJJZCA9IHRoaXMub3B0aW9uc18ucGxheWVySWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnNfLnByZWxvYWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBzZXRBdHRyaWJ1dGUoZWwsICdwcmVsb2FkJywgdGhpcy5vcHRpb25zXy5wcmVsb2FkKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3BlY2lmaWMgdGFnIHNldHRpbmdzLCBpbiBjYXNlIHRoZXkgd2VyZSBvdmVycmlkZGVuXG4gICAgLy8gYGF1dG9wbGF5YCBoYXMgdG8gYmUgKmxhc3QqIHNvIHRoYXQgYG11dGVkYCBhbmQgYHBsYXlzaW5saW5lYCBhcmUgcHJlc2VudFxuICAgIC8vIHdoZW4gaU9TL1NhZmFyaSBvciBvdGhlciBicm93c2VycyBhdHRlbXB0IHRvIGF1dG9wbGF5LlxuICAgIHZhciBzZXR0aW5nc0F0dHJzID0gWydsb29wJywgJ211dGVkJywgJ3BsYXlzaW5saW5lJywgJ2F1dG9wbGF5J107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldHRpbmdzQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhdHRyID0gc2V0dGluZ3NBdHRyc1tpXTtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMub3B0aW9uc19bYXR0cl07XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgYXR0cik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtb3ZlQXR0cmlidXRlKGVsLCBhdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBlbFthdHRyXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbDtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyB3aWxsIGJlIHRyaWdnZXJlZCBpZiB0aGUgbG9hZHN0YXJ0IGV2ZW50IGhhcyBhbHJlYWR5IGZpcmVkLCBiZWZvcmUgdmlkZW9qcyB3YXNcbiAgICogcmVhZHkuIFR3byBrbm93biBleGFtcGxlcyBvZiB3aGVuIHRoaXMgY2FuIGhhcHBlbiBhcmU6XG4gICAqIDEuIElmIHdlJ3JlIGxvYWRpbmcgdGhlIHBsYXliYWNrIG9iamVjdCBhZnRlciBpdCBoYXMgc3RhcnRlZCBsb2FkaW5nXG4gICAqIDIuIFRoZSBtZWRpYSBpcyBhbHJlYWR5IHBsYXlpbmcgdGhlIChvZnRlbiB3aXRoIGF1dG9wbGF5IG9uKSB0aGVuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBmaXJlIGFub3RoZXIgbG9hZHN0YXJ0IHNvIHRoYXQgdmlkZW9qcyBjYW4gY2F0Y2h1cC5cbiAgICpcbiAgICogQGZpcmVzIFRlY2gjbG9hZHN0YXJ0XG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICogICAgICAgICByZXR1cm5zIG5vdGhpbmcuXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmhhbmRsZUxhdGVJbml0XyA9IGZ1bmN0aW9uIGhhbmRsZUxhdGVJbml0XyhlbCkge1xuICAgIGlmIChlbC5uZXR3b3JrU3RhdGUgPT09IDAgfHwgZWwubmV0d29ya1N0YXRlID09PSAzKSB7XG4gICAgICAvLyBUaGUgdmlkZW8gZWxlbWVudCBoYXNuJ3Qgc3RhcnRlZCBsb2FkaW5nIHRoZSBzb3VyY2UgeWV0XG4gICAgICAvLyBvciBkaWRuJ3QgZmluZCBhIHNvdXJjZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbC5yZWFkeVN0YXRlID09PSAwKSB7XG4gICAgICAvLyBOZXR3b3JrU3RhdGUgaXMgc2V0IHN5bmNocm9ub3VzbHkgQlVUIGxvYWRzdGFydCBpcyBmaXJlZCBhdCB0aGVcbiAgICAgIC8vIGVuZCBvZiB0aGUgY3VycmVudCBzdGFjaywgdXN1YWxseSBiZWZvcmUgc2V0SW50ZXJ2YWwoZm4sIDApLlxuICAgICAgLy8gU28gYXQgdGhpcyBwb2ludCB3ZSBrbm93IGxvYWRzdGFydCBtYXkgaGF2ZSBhbHJlYWR5IGZpcmVkIG9yIGlzXG4gICAgICAvLyBhYm91dCB0byBmaXJlLCBhbmQgZWl0aGVyIHdheSB0aGUgcGxheWVyIGhhc24ndCBzZWVuIGl0IHlldC5cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZmlyZSBsb2Fkc3RhcnQgcHJlbWF0dXJlbHkgaGVyZSBhbmQgY2F1c2UgYVxuICAgICAgLy8gZG91YmxlIGxvYWRzdGFydCBzbyB3ZSdsbCB3YWl0IGFuZCBzZWUgaWYgaXQgaGFwcGVucyBiZXR3ZWVuIG5vd1xuICAgICAgLy8gYW5kIHRoZSBuZXh0IGxvb3AsIGFuZCBmaXJlIGl0IGlmIG5vdC5cbiAgICAgIC8vIEhPV0VWRVIsIHdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgaXQgZmlyZXMgYmVmb3JlIGxvYWRlZG1ldGFkYXRhXG4gICAgICAvLyB3aGljaCBjb3VsZCBhbHNvIGhhcHBlbiBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgbG9vcCwgc28gd2UnbGxcbiAgICAgIC8vIHdhdGNoIGZvciB0aGF0IGFsc28uXG4gICAgICB2YXIgbG9hZHN0YXJ0RmlyZWQgPSBmYWxzZTtcbiAgICAgIHZhciBzZXRMb2Fkc3RhcnRGaXJlZCA9IGZ1bmN0aW9uIHNldExvYWRzdGFydEZpcmVkKCkge1xuICAgICAgICBsb2Fkc3RhcnRGaXJlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9uKCdsb2Fkc3RhcnQnLCBzZXRMb2Fkc3RhcnRGaXJlZCk7XG5cbiAgICAgIHZhciB0cmlnZ2VyTG9hZHN0YXJ0ID0gZnVuY3Rpb24gdHJpZ2dlckxvYWRzdGFydCgpIHtcbiAgICAgICAgLy8gV2UgZGlkIG1pc3MgdGhlIG9yaWdpbmFsIGxvYWRzdGFydC4gTWFrZSBzdXJlIHRoZSBwbGF5ZXJcbiAgICAgICAgLy8gc2VlcyBsb2Fkc3RhcnQgYmVmb3JlIGxvYWRlZG1ldGFkYXRhXG4gICAgICAgIGlmICghbG9hZHN0YXJ0RmlyZWQpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2xvYWRzdGFydCcpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9uKCdsb2FkZWRtZXRhZGF0YScsIHRyaWdnZXJMb2Fkc3RhcnQpO1xuXG4gICAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5vZmYoJ2xvYWRzdGFydCcsIHNldExvYWRzdGFydEZpcmVkKTtcbiAgICAgICAgdGhpcy5vZmYoJ2xvYWRlZG1ldGFkYXRhJywgdHJpZ2dlckxvYWRzdGFydCk7XG5cbiAgICAgICAgaWYgKCFsb2Fkc3RhcnRGaXJlZCkge1xuICAgICAgICAgIC8vIFdlIGRpZCBtaXNzIHRoZSBvcmlnaW5hbCBuYXRpdmUgbG9hZHN0YXJ0LiBGaXJlIGl0IG5vdy5cbiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2xvYWRzdGFydCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZyb20gaGVyZSBvbiB3ZSBrbm93IHRoYXQgbG9hZHN0YXJ0IGFscmVhZHkgZmlyZWQgYW5kIHdlIG1pc3NlZCBpdC5cbiAgICAvLyBUaGUgb3RoZXIgcmVhZHlTdGF0ZSBldmVudHMgYXJlbid0IGFzIG11Y2ggb2YgYSBwcm9ibGVtIGlmIHdlIGRvdWJsZVxuICAgIC8vIHRoZW0sIHNvIG5vdCBnb2luZyB0byBnbyB0byBhcyBtdWNoIHRyb3VibGUgYXMgbG9hZHN0YXJ0IHRvIHByZXZlbnRcbiAgICAvLyB0aGF0IHVubGVzcyB3ZSBmaW5kIHJlYXNvbiB0by5cbiAgICB2YXIgZXZlbnRzVG9UcmlnZ2VyID0gWydsb2Fkc3RhcnQnXTtcblxuICAgIC8vIGxvYWRlZG1ldGFkYXRhOiBuZXdseSBlcXVhbCB0byBIQVZFX01FVEFEQVRBICgxKSBvciBncmVhdGVyXG4gICAgZXZlbnRzVG9UcmlnZ2VyLnB1c2goJ2xvYWRlZG1ldGFkYXRhJyk7XG5cbiAgICAvLyBsb2FkZWRkYXRhOiBuZXdseSBpbmNyZWFzZWQgdG8gSEFWRV9DVVJSRU5UX0RBVEEgKDIpIG9yIGdyZWF0ZXJcbiAgICBpZiAoZWwucmVhZHlTdGF0ZSA+PSAyKSB7XG4gICAgICBldmVudHNUb1RyaWdnZXIucHVzaCgnbG9hZGVkZGF0YScpO1xuICAgIH1cblxuICAgIC8vIGNhbnBsYXk6IG5ld2x5IGluY3JlYXNlZCB0byBIQVZFX0ZVVFVSRV9EQVRBICgzKSBvciBncmVhdGVyXG4gICAgaWYgKGVsLnJlYWR5U3RhdGUgPj0gMykge1xuICAgICAgZXZlbnRzVG9UcmlnZ2VyLnB1c2goJ2NhbnBsYXknKTtcbiAgICB9XG5cbiAgICAvLyBjYW5wbGF5dGhyb3VnaDogbmV3bHkgZXF1YWwgdG8gSEFWRV9FTk9VR0hfREFUQSAoNClcbiAgICBpZiAoZWwucmVhZHlTdGF0ZSA+PSA0KSB7XG4gICAgICBldmVudHNUb1RyaWdnZXIucHVzaCgnY2FucGxheXRocm91Z2gnKTtcbiAgICB9XG5cbiAgICAvLyBXZSBzdGlsbCBuZWVkIHRvIGdpdmUgdGhlIHBsYXllciB0aW1lIHRvIGFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgIGV2ZW50c1RvVHJpZ2dlci5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcih0eXBlKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgY3VycmVudCB0aW1lIGZvciB0aGUgYEhUTUw1YCB0ZWNoLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2Vjb25kc1xuICAgKiAgICAgICAgU2V0IHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIG1lZGlhIHRvIHRoaXMuXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLnNldEN1cnJlbnRUaW1lID0gZnVuY3Rpb24gc2V0Q3VycmVudFRpbWUoc2Vjb25kcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVsXy5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nJDEoZSwgJ1ZpZGVvIGlzIG5vdCByZWFkeS4gKFZpZGVvLmpzKScpO1xuICAgICAgLy8gdGhpcy53YXJuaW5nKFZpZGVvSlMud2FybmluZ3MudmlkZW9Ob3RSZWFkeSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgZHVyYXRpb24gb2YgdGhlIEhUTUw1IG1lZGlhIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgZHVyYXRpb24gb2YgdGhlIG1lZGlhIG9yIDAgaWYgdGhlcmUgaXMgbm8gZHVyYXRpb24uXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24gZHVyYXRpb24oKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAvLyBBbmRyb2lkIENocm9tZSB3aWxsIHJlcG9ydCBkdXJhdGlvbiBhcyBJbmZpbml0eSBmb3IgVk9EIEhMUyB1bnRpbCBhZnRlclxuICAgIC8vIHBsYXliYWNrIGhhcyBzdGFydGVkLCB3aGljaCB0cmlnZ2VycyB0aGUgbGl2ZSBkaXNwbGF5IGVycm9uZW91c2x5LlxuICAgIC8vIFJldHVybiBOYU4gaWYgcGxheWJhY2sgaGFzIG5vdCBzdGFydGVkIGFuZCB0cmlnZ2VyIGEgZHVyYXRpb251cGRhdGUgb25jZVxuICAgIC8vIHRoZSBkdXJhdGlvbiBjYW4gYmUgcmVsaWFibHkga25vd24uXG4gICAgaWYgKHRoaXMuZWxfLmR1cmF0aW9uID09PSBJbmZpbml0eSAmJiBJU19BTkRST0lEICYmIElTX0NIUk9NRSAmJiB0aGlzLmVsXy5jdXJyZW50VGltZSA9PT0gMCkge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIGZpcnN0IGB0aW1ldXBkYXRlYCB3aXRoIGN1cnJlbnRUaW1lID4gMCAtIHRoZXJlIG1heSBiZVxuICAgICAgLy8gc2V2ZXJhbCB3aXRoIDBcbiAgICAgIHZhciBjaGVja1Byb2dyZXNzID0gZnVuY3Rpb24gY2hlY2tQcm9ncmVzcygpIHtcbiAgICAgICAgaWYgKF90aGlzMy5lbF8uY3VycmVudFRpbWUgPiAwKSB7XG4gICAgICAgICAgLy8gVHJpZ2dlciBkdXJhdGlvbmNoYW5nZSBmb3IgZ2VudWluZWx5IGxpdmUgdmlkZW9cbiAgICAgICAgICBpZiAoX3RoaXMzLmVsXy5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIF90aGlzMy50cmlnZ2VyKCdkdXJhdGlvbmNoYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfdGhpczMub2ZmKCd0aW1ldXBkYXRlJywgY2hlY2tQcm9ncmVzcyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMub24oJ3RpbWV1cGRhdGUnLCBjaGVja1Byb2dyZXNzKTtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVsXy5kdXJhdGlvbiB8fCBOYU47XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgSFRNTDUgbWVkaWEgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgSFRNTDUgbWVkaWEgZWxlbWVudC5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbiB3aWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbF8ub2Zmc2V0V2lkdGg7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIEhUTUw1IG1lZGlhIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgaGVpZ3RoIG9mIHRoZSBIVE1MNSBtZWRpYSBlbGVtZW50LlxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlvbiBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxfLm9mZnNldEhlaWdodDtcbiAgfTtcblxuICAvKipcbiAgICogUHJveHkgaU9TIGB3ZWJraXRiZWdpbmZ1bGxzY3JlZW5gIGFuZCBgd2Via2l0ZW5kZnVsbHNjcmVlbmAgaW50b1xuICAgKiBgZnVsbHNjcmVlbmNoYW5nZWAgZXZlbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBmaXJlcyBmdWxsc2NyZWVuY2hhbmdlXG4gICAqIEBsaXN0ZW5zIHdlYmtpdGVuZGZ1bGxzY3JlZW5cbiAgICogQGxpc3RlbnMgd2Via2l0YmVnaW5mdWxsc2NyZWVuXG4gICAqIEBsaXN0ZW5zIHdlYmtpdGJlZ2luZnVsbHNjcmVlblxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5wcm94eVdlYmtpdEZ1bGxzY3JlZW5fID0gZnVuY3Rpb24gcHJveHlXZWJraXRGdWxsc2NyZWVuXygpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGlmICghKCd3ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbicgaW4gdGhpcy5lbF8pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVuZEZuID0gZnVuY3Rpb24gZW5kRm4oKSB7XG4gICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB7IGlzRnVsbHNjcmVlbjogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIHZhciBiZWdpbkZuID0gZnVuY3Rpb24gYmVnaW5GbigpIHtcbiAgICAgIGlmICgnd2Via2l0UHJlc2VudGF0aW9uTW9kZScgaW4gdGhpcy5lbF8gJiYgdGhpcy5lbF8ud2Via2l0UHJlc2VudGF0aW9uTW9kZSAhPT0gJ3BpY3R1cmUtaW4tcGljdHVyZScpIHtcbiAgICAgICAgdGhpcy5vbmUoJ3dlYmtpdGVuZGZ1bGxzY3JlZW4nLCBlbmRGbik7XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdmdWxsc2NyZWVuY2hhbmdlJywgeyBpc0Z1bGxzY3JlZW46IHRydWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMub24oJ3dlYmtpdGJlZ2luZnVsbHNjcmVlbicsIGJlZ2luRm4pO1xuICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczQub2ZmKCd3ZWJraXRiZWdpbmZ1bGxzY3JlZW4nLCBiZWdpbkZuKTtcbiAgICAgIF90aGlzNC5vZmYoJ3dlYmtpdGVuZGZ1bGxzY3JlZW4nLCBlbmRGbik7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGZ1bGxzY3JlZW4gaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IHBsYXliYWNrIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICAtIFRydWUgaWYgZnVsbHNjcmVlbiBpcyBzdXBwb3J0ZWQuXG4gICAqICAgICAgICAgLSBGYWxzZSBpZiBmdWxsc2NyZWVuIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLnN1cHBvcnRzRnVsbFNjcmVlbiA9IGZ1bmN0aW9uIHN1cHBvcnRzRnVsbFNjcmVlbigpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuZWxfLndlYmtpdEVudGVyRnVsbFNjcmVlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG5cbiAgICAgIC8vIFNlZW1zIHRvIGJlIGJyb2tlbiBpbiBDaHJvbWl1bS9DaHJvbWUgJiYgU2FmYXJpIGluIExlb3BhcmRcbiAgICAgIGlmICgvQW5kcm9pZC8udGVzdCh1c2VyQWdlbnQpIHx8ICEvQ2hyb21lfE1hYyBPUyBYIDEwLjUvLnRlc3QodXNlckFnZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGBIVE1MNWAgVGVjaCBlbnRlciBmdWxsc2NyZWVuLlxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5lbnRlckZ1bGxTY3JlZW4gPSBmdW5jdGlvbiBlbnRlckZ1bGxTY3JlZW4oKSB7XG4gICAgdmFyIHZpZGVvID0gdGhpcy5lbF87XG5cbiAgICBpZiAodmlkZW8ucGF1c2VkICYmIHZpZGVvLm5ldHdvcmtTdGF0ZSA8PSB2aWRlby5IQVZFX01FVEFEQVRBKSB7XG4gICAgICAvLyBhdHRlbXB0IHRvIHByaW1lIHRoZSB2aWRlbyBlbGVtZW50IGZvciBwcm9ncmFtbWF0aWMgYWNjZXNzXG4gICAgICAvLyB0aGlzIGlzbid0IG5lY2Vzc2FyeSBvbiB0aGUgZGVza3RvcCBidXQgc2hvdWxkbid0IGh1cnRcbiAgICAgIHRoaXMuZWxfLnBsYXkoKTtcblxuICAgICAgLy8gcGxheWluZyBhbmQgcGF1c2luZyBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgdHJhbnNpdGlvbiB0byBmdWxsc2NyZWVuXG4gICAgICAvLyBjYW4gZ2V0IGlPUyB+Ni4xIGRldmljZXMgaW50byBhIHBsYXkvcGF1c2UgbG9vcFxuICAgICAgdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgICAgdmlkZW8ud2Via2l0RW50ZXJGdWxsU2NyZWVuKCk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlkZW8ud2Via2l0RW50ZXJGdWxsU2NyZWVuKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGBIVE1MNWAgVGVjaCBleGl0IGZ1bGxzY3JlZW4uXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmV4aXRGdWxsU2NyZWVuID0gZnVuY3Rpb24gZXhpdEZ1bGxTY3JlZW4oKSB7XG4gICAgdGhpcy5lbF8ud2Via2l0RXhpdEZ1bGxTY3JlZW4oKTtcbiAgfTtcblxuICAvKipcbiAgICogQSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgYEh0bWw1YCBUZWNoJ3Mgc291cmNlIG9iamVjdC5cbiAgICogPiBOb3RlOiBQbGVhc2UgdXNlIHtAbGluayBIdG1sNSNzZXRTb3VyY2V9XG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IFtzcmNdXG4gICAqICAgICAgICBUaGUgc291cmNlIG9iamVjdCB5b3Ugd2FudCB0byBzZXQgb24gdGhlIGBIVE1MNWAgdGVjaHMgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7VGVjaH5Tb3VyY2VPYmplY3R8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIC0gVGhlIGN1cnJlbnQgc291cmNlIG9iamVjdCB3aGVuIGEgc291cmNlIGlzIG5vdCBwYXNzZWQgaW4uXG4gICAqICAgICAgICAgLSB1bmRlZmluZWQgd2hlbiBzZXR0aW5nXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHZlcnNpb24gNS5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuc3JjID0gZnVuY3Rpb24gc3JjKF9zcmMpIHtcbiAgICBpZiAoX3NyYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbF8uc3JjO1xuICAgIH1cblxuICAgIC8vIFNldHRpbmcgc3JjIHRocm91Z2ggYHNyY2AgaW5zdGVhZCBvZiBgc2V0U3JjYCB3aWxsIGJlIGRlcHJlY2F0ZWRcbiAgICB0aGlzLnNldFNyYyhfc3JjKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXQgdGhlIHRlY2ggYnkgcmVtb3ZpbmcgYWxsIHNvdXJjZXMgYW5kIHRoZW4gY2FsbGluZ1xuICAgKiB7QGxpbmsgSHRtbDUucmVzZXRNZWRpYUVsZW1lbnR9LlxuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIEh0bWw1LnJlc2V0TWVkaWFFbGVtZW50KHRoaXMuZWxfKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHNvdXJjZSBvbiB0aGUgYEhUTUw1YCBUZWNoLiBGYWxscyBiYWNrIHRvIHJldHVybmluZyB0aGUgc291cmNlIGZyb21cbiAgICogdGhlIEhUTUw1IG1lZGlhIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge1RlY2h+U291cmNlT2JqZWN0fVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHNvdXJjZSBvYmplY3QgZnJvbSB0aGUgSFRNTDUgdGVjaC4gV2l0aCBhIGZhbGxiYWNrIHRvIHRoZVxuICAgKiAgICAgICAgIGVsZW1lbnRzIHNvdXJjZS5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuY3VycmVudFNyYyA9IGZ1bmN0aW9uIGN1cnJlbnRTcmMoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFNvdXJjZV8pIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3VyY2VfLnNyYztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxfLmN1cnJlbnRTcmM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBjb250cm9scyBhdHRyaWJ1dGUgZm9yIHRoZSBIVE1MNSBtZWRpYSBFbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gICAqICAgICAgICBWYWx1ZSB0byBzZXQgdGhlIGNvbnRyb2xzIGF0dHJpYnV0ZSB0b1xuICAgKi9cblxuXG4gIEh0bWw1LnByb3RvdHlwZS5zZXRDb250cm9scyA9IGZ1bmN0aW9uIHNldENvbnRyb2xzKHZhbCkge1xuICAgIHRoaXMuZWxfLmNvbnRyb2xzID0gISF2YWw7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgcmV0dXJucyBhIHJlbW90ZSB7QGxpbmsgVGV4dFRyYWNrfSBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqICAgICAgICBgVGV4dFRyYWNrYCBraW5kIChzdWJ0aXRsZXMsIGNhcHRpb25zLCBkZXNjcmlwdGlvbnMsIGNoYXB0ZXJzLCBvciBtZXRhZGF0YSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF1cbiAgICogICAgICAgIExhYmVsIHRvIGlkZW50aWZ5IHRoZSB0ZXh0IHRyYWNrXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFuZ3VhZ2VdXG4gICAqICAgICAgICBUd28gbGV0dGVyIGxhbmd1YWdlIGFiYnJldmlhdGlvblxuICAgKlxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2t9XG4gICAqICAgICAgICAgVGhlIFRleHRUcmFjayB0aGF0IGdldHMgY3JlYXRlZC5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuYWRkVGV4dFRyYWNrID0gZnVuY3Rpb24gYWRkVGV4dFRyYWNrKGtpbmQsIGxhYmVsLCBsYW5ndWFnZSkge1xuICAgIGlmICghdGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpIHtcbiAgICAgIHJldHVybiBfVGVjaC5wcm90b3R5cGUuYWRkVGV4dFRyYWNrLmNhbGwodGhpcywga2luZCwgbGFiZWwsIGxhbmd1YWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lbF8uYWRkVGV4dFRyYWNrKGtpbmQsIGxhYmVsLCBsYW5ndWFnZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZWl0aGVyIG5hdGl2ZSBUZXh0VHJhY2sgb3IgYW4gZW11bGF0ZWQgVGV4dFRyYWNrIGRlcGVuZGluZ1xuICAgKiBvbiB0aGUgdmFsdWUgb2YgYGZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrc2BcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIFRoZSBvYmplY3Qgc2hvdWxkIGNvbnRhaW4gdGhlIG9wdGlvbnMgdG8gaW50aWFsaXplIHRoZSBUZXh0VHJhY2sgd2l0aC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtpbmRdXG4gICAqICAgICAgICBgVGV4dFRyYWNrYCBraW5kIChzdWJ0aXRsZXMsIGNhcHRpb25zLCBkZXNjcmlwdGlvbnMsIGNoYXB0ZXJzLCBvciBtZXRhZGF0YSkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0uXG4gICAqICAgICAgICBMYWJlbCB0byBpZGVudGlmeSB0aGUgdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFuZ3VhZ2VdXG4gICAqICAgICAgICBUd28gbGV0dGVyIGxhbmd1YWdlIGFiYnJldmlhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWZhdWx0XVxuICAgKiAgICAgICAgRGVmYXVsdCB0aGlzIHRyYWNrIHRvIG9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWRdXG4gICAqICAgICAgICBUaGUgaW50ZXJuYWwgaWQgdG8gYXNzaWduIHRoaXMgdHJhY2suXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zcmNdXG4gICAqICAgICAgICBBIHNvdXJjZSB1cmwgZm9yIHRoZSB0cmFjay5cbiAgICpcbiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudH1cbiAgICogICAgICAgICBUaGUgdHJhY2sgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC5cbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuY3JlYXRlUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gY3JlYXRlUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSB7XG4gICAgICByZXR1cm4gX1RlY2gucHJvdG90eXBlLmNyZWF0ZVJlbW90ZVRleHRUcmFjay5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB2YXIgaHRtbFRyYWNrRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyYWNrJyk7XG5cbiAgICBpZiAob3B0aW9ucy5raW5kKSB7XG4gICAgICBodG1sVHJhY2tFbGVtZW50LmtpbmQgPSBvcHRpb25zLmtpbmQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmxhYmVsKSB7XG4gICAgICBodG1sVHJhY2tFbGVtZW50LmxhYmVsID0gb3B0aW9ucy5sYWJlbDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGFuZ3VhZ2UgfHwgb3B0aW9ucy5zcmNsYW5nKSB7XG4gICAgICBodG1sVHJhY2tFbGVtZW50LnNyY2xhbmcgPSBvcHRpb25zLmxhbmd1YWdlIHx8IG9wdGlvbnMuc3JjbGFuZztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnNbJ2RlZmF1bHQnXSkge1xuICAgICAgaHRtbFRyYWNrRWxlbWVudFsnZGVmYXVsdCddID0gb3B0aW9uc1snZGVmYXVsdCddO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pZCkge1xuICAgICAgaHRtbFRyYWNrRWxlbWVudC5pZCA9IG9wdGlvbnMuaWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNyYykge1xuICAgICAgaHRtbFRyYWNrRWxlbWVudC5zcmMgPSBvcHRpb25zLnNyYztcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbFRyYWNrRWxlbWVudDtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlbW90ZSB0ZXh0IHRyYWNrIG9iamVjdCBhbmQgcmV0dXJucyBhbiBodG1sIHRyYWNrIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvYmplY3Qgc2hvdWxkIGNvbnRhaW4gdmFsdWVzIGZvclxuICAgKiBraW5kLCBsYW5ndWFnZSwgbGFiZWwsIGFuZCBzcmMgKGxvY2F0aW9uIG9mIHRoZSBXZWJWVFQgZmlsZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFudWFsQ2xlYW51cD10cnVlXSBpZiBzZXQgdG8gZmFsc2UsIHRoZSBUZXh0VHJhY2sgd2lsbCBiZVxuICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgdmlkZW8gZWxlbWVudCB3aGVuZXZlciB0aGUgc291cmNlIGNoYW5nZXNcbiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudH0gQW4gSHRtbCBUcmFjayBFbGVtZW50LlxuICAgKiBUaGlzIGNhbiBiZSBhbiBlbXVsYXRlZCB7QGxpbmsgSFRNTFRyYWNrRWxlbWVudH0gb3IgYSBuYXRpdmUgb25lLlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgXCJtYW51YWxDbGVhbnVwXCIgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdFxuICAgKiB0byBcImZhbHNlXCIgaW4gdXBjb21pbmcgdmVyc2lvbnMgb2YgVmlkZW8uanNcbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUuYWRkUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gYWRkUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMsIG1hbnVhbENsZWFudXApIHtcbiAgICB2YXIgaHRtbFRyYWNrRWxlbWVudCA9IF9UZWNoLnByb3RvdHlwZS5hZGRSZW1vdGVUZXh0VHJhY2suY2FsbCh0aGlzLCBvcHRpb25zLCBtYW51YWxDbGVhbnVwKTtcblxuICAgIGlmICh0aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykge1xuICAgICAgdGhpcy5lbCgpLmFwcGVuZENoaWxkKGh0bWxUcmFja0VsZW1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sVHJhY2tFbGVtZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgcmVtb3RlIGBUZXh0VHJhY2tgIGZyb20gYFRleHRUcmFja0xpc3RgIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja30gdHJhY2tcbiAgICogICAgICAgIGBUZXh0VHJhY2tgIG9iamVjdCB0byByZW1vdmVcbiAgICovXG5cblxuICBIdG1sNS5wcm90b3R5cGUucmVtb3ZlUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gcmVtb3ZlUmVtb3RlVGV4dFRyYWNrKHRyYWNrKSB7XG4gICAgX1RlY2gucHJvdG90eXBlLnJlbW92ZVJlbW90ZVRleHRUcmFjay5jYWxsKHRoaXMsIHRyYWNrKTtcblxuICAgIGlmICh0aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykge1xuICAgICAgdmFyIHRyYWNrcyA9IHRoaXMuJCQoJ3RyYWNrJyk7XG5cbiAgICAgIHZhciBpID0gdHJhY2tzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAodHJhY2sgPT09IHRyYWNrc1tpXSB8fCB0cmFjayA9PT0gdHJhY2tzW2ldLnRyYWNrKSB7XG4gICAgICAgICAgdGhpcy5lbCgpLnJlbW92ZUNoaWxkKHRyYWNrc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgYXZhaWxhYmxlIG1lZGlhIHBsYXliYWNrIHF1YWxpdHkgbWV0cmljcyBhcyBzcGVjaWZpZWQgYnkgdGhlIFczQydzIE1lZGlhXG4gICAqIFBsYXliYWNrIFF1YWxpdHkgQVBJLlxuICAgKlxuICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3dpY2cuZ2l0aHViLmlvL21lZGlhLXBsYXliYWNrLXF1YWxpdHl9XG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICogICAgICAgICBBbiBvYmplY3Qgd2l0aCBzdXBwb3J0ZWQgbWVkaWEgcGxheWJhY2sgcXVhbGl0eSBtZXRyaWNzXG4gICAqL1xuXG5cbiAgSHRtbDUucHJvdG90eXBlLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5ID0gZnVuY3Rpb24gZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmVsKCkuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsKCkuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKTtcbiAgICB9XG5cbiAgICB2YXIgdmlkZW9QbGF5YmFja1F1YWxpdHkgPSB7fTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5lbCgpLndlYmtpdERyb3BwZWRGcmFtZUNvdW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGhpcy5lbCgpLndlYmtpdERlY29kZWRGcmFtZUNvdW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmlkZW9QbGF5YmFja1F1YWxpdHkuZHJvcHBlZFZpZGVvRnJhbWVzID0gdGhpcy5lbCgpLndlYmtpdERyb3BwZWRGcmFtZUNvdW50O1xuICAgICAgdmlkZW9QbGF5YmFja1F1YWxpdHkudG90YWxWaWRlb0ZyYW1lcyA9IHRoaXMuZWwoKS53ZWJraXREZWNvZGVkRnJhbWVDb3VudDtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LnBlcmZvcm1hbmNlICYmIHR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2aWRlb1BsYXliYWNrUXVhbGl0eS5jcmVhdGlvblRpbWUgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfSBlbHNlIGlmICh3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZyAmJiB0eXBlb2Ygd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQgPT09ICdudW1iZXInKSB7XG4gICAgICB2aWRlb1BsYXliYWNrUXVhbGl0eS5jcmVhdGlvblRpbWUgPSB3aW5kb3cuRGF0ZS5ub3coKSAtIHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0O1xuICAgIH1cblxuICAgIHJldHVybiB2aWRlb1BsYXliYWNrUXVhbGl0eTtcbiAgfTtcblxuICByZXR1cm4gSHRtbDU7XG59KFRlY2gpO1xuXG4vKiBIVE1MNSBTdXBwb3J0IFRlc3RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pZiAoaXNSZWFsKCkpIHtcblxuICAvKipcbiAgICogRWxlbWVudCBmb3IgdGVzdGluZyBicm93c2VyIEhUTUw1IG1lZGlhIGNhcGFiaWxpdGllc1xuICAgKlxuICAgKiBAdHlwZSB7RWxlbWVudH1cbiAgICogQGNvbnN0YW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBIdG1sNS5URVNUX1ZJRCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gIHZhciB0cmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyYWNrJyk7XG5cbiAgdHJhY2sua2luZCA9ICdjYXB0aW9ucyc7XG4gIHRyYWNrLnNyY2xhbmcgPSAnZW4nO1xuICB0cmFjay5sYWJlbCA9ICdFbmdsaXNoJztcbiAgSHRtbDUuVEVTVF9WSUQuYXBwZW5kQ2hpbGQodHJhY2spO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIEhUTUw1IG1lZGlhIGlzIHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIvZGV2aWNlLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVHJ1ZSBpZiBIVE1MNSBtZWRpYSBpcyBzdXBwb3J0ZWQuXG4gKiAgICAgICAgIC0gRmFsc2UgaWYgSFRNTDUgbWVkaWEgaXMgbm90IHN1cHBvcnRlZC5cbiAqL1xuSHRtbDUuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIElFOSB3aXRoIG5vIE1lZGlhIFBsYXllciBpcyBhIExJQVIhICgjOTg0KVxuICB0cnkge1xuICAgIEh0bWw1LlRFU1RfVklELnZvbHVtZSA9IDAuNTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAhIShIdG1sNS5URVNUX1ZJRCAmJiBIdG1sNS5URVNUX1ZJRC5jYW5QbGF5VHlwZSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiB0eXBlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2tcbiAqIEByZXR1cm4ge3N0cmluZ30gJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZylcbiAqL1xuSHRtbDUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICByZXR1cm4gSHRtbDUuVEVTVF9WSUQuY2FuUGxheVR5cGUodHlwZSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiBzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNPYmpcbiAqICAgICAgICBUaGUgc291cmNlIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqICAgICAgICBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHRlY2hcbiAqIEByZXR1cm4ge3N0cmluZ30gJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZylcbiAqL1xuSHRtbDUuY2FuUGxheVNvdXJjZSA9IGZ1bmN0aW9uIChzcmNPYmosIG9wdGlvbnMpIHtcbiAgcmV0dXJuIEh0bWw1LmNhblBsYXlUeXBlKHNyY09iai50eXBlKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHZvbHVtZSBjYW4gYmUgY2hhbmdlZCBpbiB0aGlzIGJyb3dzZXIvZGV2aWNlLlxuICogVm9sdW1lIGNhbm5vdCBiZSBjaGFuZ2VkIGluIGEgbG90IG9mIG1vYmlsZSBkZXZpY2VzLlxuICogU3BlY2lmaWNhbGx5LCBpdCBjYW4ndCBiZSBjaGFuZ2VkIGZyb20gMSBvbiBpT1MuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIHZvbHVtZSBjYW4gYmUgY29udHJvbGxlZFxuICogICAgICAgICAtIEZhbHNlIG90aGVyd2lzZVxuICovXG5IdG1sNS5jYW5Db250cm9sVm9sdW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBJRSB3aWxsIGVycm9yIGlmIFdpbmRvd3MgTWVkaWEgUGxheWVyIG5vdCBpbnN0YWxsZWQgIzMzMTVcbiAgdHJ5IHtcbiAgICB2YXIgdm9sdW1lID0gSHRtbDUuVEVTVF9WSUQudm9sdW1lO1xuXG4gICAgSHRtbDUuVEVTVF9WSUQudm9sdW1lID0gdm9sdW1lIC8gMiArIDAuMTtcbiAgICByZXR1cm4gdm9sdW1lICE9PSBIdG1sNS5URVNUX1ZJRC52b2x1bWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHZvbHVtZSBjYW4gYmUgbXV0ZWQgaW4gdGhpcyBicm93c2VyL2RldmljZS5cbiAqIFNvbWUgZGV2aWNlcywgZS5nLiBpT1MsIGRvbid0IGFsbG93IGNoYW5naW5nIHZvbHVtZVxuICogYnV0IHBlcm1pdHMgbXV0aW5nL3VubXV0aW5nLlxuICpcbiAqIEByZXR1cm4ge2JvbGVhbn1cbiAqICAgICAgLSBUcnVlIGlmIHZvbHVtZSBjYW4gYmUgbXV0ZWRcbiAqICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuSHRtbDUuY2FuTXV0ZVZvbHVtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgbXV0ZWQgPSBIdG1sNS5URVNUX1ZJRC5tdXRlZDtcblxuICAgIC8vIGluIHNvbWUgdmVyc2lvbnMgb2YgaU9TIG11dGVkIHByb3BlcnR5IGRvZXNuJ3QgYWx3YXlzXG4gICAgLy8gd29yaywgc28gd2Ugd2FudCB0byBzZXQgYm90aCBwcm9wZXJ0eSBhbmQgYXR0cmlidXRlXG4gICAgSHRtbDUuVEVTVF9WSUQubXV0ZWQgPSAhbXV0ZWQ7XG4gICAgaWYgKEh0bWw1LlRFU1RfVklELm11dGVkKSB7XG4gICAgICBzZXRBdHRyaWJ1dGUoSHRtbDUuVEVTVF9WSUQsICdtdXRlZCcsICdtdXRlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVBdHRyaWJ1dGUoSHRtbDUuVEVTVF9WSUQsICdtdXRlZCcsICdtdXRlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gbXV0ZWQgIT09IEh0bWw1LlRFU1RfVklELm11dGVkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBwbGF5YmFjayByYXRlIGNhbiBiZSBjaGFuZ2VkIGluIHRoaXMgYnJvd3Nlci9kZXZpY2UuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIHBsYXliYWNrIHJhdGUgY2FuIGJlIGNvbnRyb2xsZWRcbiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gUGxheWJhY2sgcmF0ZSBBUEkgaXMgaW1wbGVtZW50ZWQgaW4gQW5kcm9pZCBDaHJvbWUsIGJ1dCBkb2Vzbid0IGRvIGFueXRoaW5nXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2lzc3Vlcy8zMTgwXG4gIGlmIChJU19BTkRST0lEICYmIElTX0NIUk9NRSAmJiBDSFJPTUVfVkVSU0lPTiA8IDU4KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIElFIHdpbGwgZXJyb3IgaWYgV2luZG93cyBNZWRpYSBQbGF5ZXIgbm90IGluc3RhbGxlZCAjMzMxNVxuICB0cnkge1xuICAgIHZhciBwbGF5YmFja1JhdGUgPSBIdG1sNS5URVNUX1ZJRC5wbGF5YmFja1JhdGU7XG5cbiAgICBIdG1sNS5URVNUX1ZJRC5wbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGUgLyAyICsgMC4xO1xuICAgIHJldHVybiBwbGF5YmFja1JhdGUgIT09IEh0bWw1LlRFU1RfVklELnBsYXliYWNrUmF0ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiB3ZSBjYW4gb3ZlcnJpZGUgYSB2aWRlby9hdWRpbyBlbGVtZW50cyBhdHRyaWJ1dGVzLCB3aXRoXG4gKiBPYmplY3QuZGVmaW5lUHJvcGVydHkuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUcnVlIGlmIGJ1aWx0aW4gYXR0cmlidXRlcyBjYW4gYmUgb3ZlcnJpZGVuXG4gKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbkh0bWw1LmNhbk92ZXJyaWRlQXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKElTX0lFOCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBpZiB3ZSBjYW5ub3Qgb3ZlcndyaXRlIHRoZSBzcmMvaW5uZXJIVE1MIHByb3BlcnR5LCB0aGVyZSBpcyBubyBzdXBwb3J0XG4gIC8vIGlPUyA3IHNhZmFyaSBmb3IgaW5zdGFuY2UgY2Fubm90IGRvIHRoaXMuXG4gIHRyeSB7XG4gICAgdmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKSwgJ3NyYycsIHsgZ2V0OiBub29wLCBzZXQ6IG5vb3AgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2F1ZGlvJyksICdzcmMnLCB7IGdldDogbm9vcCwgc2V0OiBub29wIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpLCAnaW5uZXJIVE1MJywgeyBnZXQ6IG5vb3AsIHNldDogbm9vcCB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXVkaW8nKSwgJ2lubmVySFRNTCcsIHsgZ2V0OiBub29wLCBzZXQ6IG5vb3AgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIG5hdGl2ZSBgVGV4dFRyYWNrYHMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIvZGV2aWNlLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVHJ1ZSBpZiBuYXRpdmUgYFRleHRUcmFja2BzIGFyZSBzdXBwb3J0ZWQuXG4gKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbkh0bWw1LnN1cHBvcnRzTmF0aXZlVGV4dFRyYWNrcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIElTX0FOWV9TQUZBUkkgfHwgSVNfSU9TICYmIElTX0NIUk9NRTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIG5hdGl2ZSBgVmlkZW9UcmFja2BzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyL2RldmljZVxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgLSBUcnVlIGlmIG5hdGl2ZSBgVmlkZW9UcmFja2BzIGFyZSBzdXBwb3J0ZWQuXG4gKiAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuSHRtbDUuc3VwcG9ydHNOYXRpdmVWaWRlb1RyYWNrcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEhKEh0bWw1LlRFU1RfVklEICYmIEh0bWw1LlRFU1RfVklELnZpZGVvVHJhY2tzKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIG5hdGl2ZSBgQXVkaW9UcmFja2BzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyL2RldmljZVxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgLSBUcnVlIGlmIG5hdGl2ZSBgQXVkaW9UcmFja2BzIGFyZSBzdXBwb3J0ZWQuXG4gKiAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqL1xuSHRtbDUuc3VwcG9ydHNOYXRpdmVBdWRpb1RyYWNrcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEhKEh0bWw1LlRFU1RfVklEICYmIEh0bWw1LlRFU1RfVklELmF1ZGlvVHJhY2tzKTtcbn07XG5cbi8qKlxuICogQW4gYXJyYXkgb2YgZXZlbnRzIGF2YWlsYWJsZSBvbiB0aGUgSHRtbDUgdGVjaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0FycmF5fVxuICovXG5IdG1sNS5FdmVudHMgPSBbJ2xvYWRzdGFydCcsICdzdXNwZW5kJywgJ2Fib3J0JywgJ2Vycm9yJywgJ2VtcHRpZWQnLCAnc3RhbGxlZCcsICdsb2FkZWRtZXRhZGF0YScsICdsb2FkZWRkYXRhJywgJ2NhbnBsYXknLCAnY2FucGxheXRocm91Z2gnLCAncGxheWluZycsICd3YWl0aW5nJywgJ3NlZWtpbmcnLCAnc2Vla2VkJywgJ2VuZGVkJywgJ2R1cmF0aW9uY2hhbmdlJywgJ3RpbWV1cGRhdGUnLCAncHJvZ3Jlc3MnLCAncGxheScsICdwYXVzZScsICdyYXRlY2hhbmdlJywgJ3Jlc2l6ZScsICd2b2x1bWVjaGFuZ2UnXTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIHZvbHVtZSBjb250cm9sLlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHQge0BsaW5rIEh0bWw1LmNhbkNvbnRyb2xWb2x1bWV9XG4gKi9cbkh0bWw1LnByb3RvdHlwZS5mZWF0dXJlc1ZvbHVtZUNvbnRyb2wgPSBIdG1sNS5jYW5Db250cm9sVm9sdW1lKCk7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBUZWNoYCBzdXBwb3J0cyBtdXRpbmcgdm9sdW1lLlxuICpcbiAqIEB0eXBlIHtib2xlYW59XG4gKiBAZGVmYXVsdCB7QGxpbmsgSHRtbDUuY2FuTXV0ZVZvbHVtZX1cbiAqL1xuSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzTXV0ZUNvbnRyb2wgPSBIdG1sNS5jYW5NdXRlVm9sdW1lKCk7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBUZWNoYCBzdXBwb3J0cyBjaGFuZ2luZyB0aGUgc3BlZWQgYXQgd2hpY2ggdGhlIG1lZGlhXG4gKiBwbGF5cy4gRXhhbXBsZXM6XG4gKiAgIC0gU2V0IHBsYXllciB0byBwbGF5IDJ4ICh0d2ljZSkgYXMgZmFzdFxuICogICAtIFNldCBwbGF5ZXIgdG8gcGxheSAwLjV4IChoYWxmKSBhcyBmYXN0XG4gKlxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCB7QGxpbmsgSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZX1cbiAqL1xuSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzUGxheWJhY2tSYXRlID0gSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZSgpO1xuXG4vKipcbiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3ZXRoZXIgdGhlIGBUZWNoYCBzdXBwb3J0cyB0aGUgYHNvdXJjZXNldGAgZXZlbnQuXG4gKlxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdFxuICovXG5IdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNTb3VyY2VzZXQgPSBIdG1sNS5jYW5PdmVycmlkZUF0dHJpYnV0ZXMoKTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYEhUTUw1YCB0ZWNoIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgbWVkaWEgZWxlbWVudFxuICogbW92aW5nIGluIHRoZSBET00uIGlPUyBicmVha3MgaWYgeW91IG1vdmUgdGhlIG1lZGlhIGVsZW1lbnQsIHNvIHRoaXMgaXMgc2V0IHRoaXMgdG9cbiAqIGZhbHNlIHRoZXJlLiBFdmVyeXdoZXJlIGVsc2UgdGhpcyBzaG91bGQgYmUgdHJ1ZS5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cbkh0bWw1LnByb3RvdHlwZS5tb3ZpbmdNZWRpYUVsZW1lbnRJbkRPTSA9ICFJU19JT1M7XG5cbi8vIFRPRE86IFByZXZpb3VzIGNvbW1lbnQ6IE5vIGxvbmdlciBhcHBlYXJzIHRvIGJlIHVzZWQuIENhbiBwcm9iYWJseSBiZSByZW1vdmVkLlxuLy8gICAgICAgSXMgdGhpcyB0cnVlP1xuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYEhUTUw1YCB0ZWNoIGN1cnJlbnRseSBzdXBwb3J0cyBhdXRvbWF0aWMgbWVkaWEgcmVzaXplXG4gKiB3aGVuIGdvaW5nIGludG8gZnVsbHNjcmVlbi5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0XG4gKi9cbkh0bWw1LnByb3RvdHlwZS5mZWF0dXJlc0Z1bGxzY3JlZW5SZXNpemUgPSB0cnVlO1xuXG4vKipcbiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBgSFRNTDVgIHRlY2ggY3VycmVudGx5IHN1cHBvcnRzIHRoZSBwcm9ncmVzcyBldmVudC5cbiAqIElmIHRoaXMgaXMgZmFsc2UsIG1hbnVhbCBgcHJvZ3Jlc3NgIGV2ZW50cyB3aWxsIGJlIHRyaWdncmVkIGluc3RlYWQuXG4gKlxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdFxuICovXG5IdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNQcm9ncmVzc0V2ZW50cyA9IHRydWU7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBIVE1MNWAgdGVjaCBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIHRpbWV1cGRhdGUgZXZlbnQuXG4gKiBJZiB0aGlzIGlzIGZhbHNlLCBtYW51YWwgYHRpbWV1cGRhdGVgIGV2ZW50cyB3aWxsIGJlIHRyaWdncmVkIGluc3RlYWQuXG4gKlxuICogQGRlZmF1bHRcbiAqL1xuSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzVGltZXVwZGF0ZUV2ZW50cyA9IHRydWU7XG5cbi8qKlxuICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBIVE1MNWAgdGVjaCBjdXJyZW50bHkgc3VwcG9ydHMgbmF0aXZlIGBUZXh0VHJhY2tgcy5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0IHtAbGluayBIdG1sNS5zdXBwb3J0c05hdGl2ZVRleHRUcmFja3N9XG4gKi9cbkh0bWw1LnByb3RvdHlwZS5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MgPSBIdG1sNS5zdXBwb3J0c05hdGl2ZVRleHRUcmFja3MoKTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYEhUTUw1YCB0ZWNoIGN1cnJlbnRseSBzdXBwb3J0cyBuYXRpdmUgYFZpZGVvVHJhY2tgcy5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0IHtAbGluayBIdG1sNS5zdXBwb3J0c05hdGl2ZVZpZGVvVHJhY2tzfVxuICovXG5IdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNOYXRpdmVWaWRlb1RyYWNrcyA9IEh0bWw1LnN1cHBvcnRzTmF0aXZlVmlkZW9UcmFja3MoKTtcblxuLyoqXG4gKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYEhUTUw1YCB0ZWNoIGN1cnJlbnRseSBzdXBwb3J0cyBuYXRpdmUgYEF1ZGlvVHJhY2tgcy5cbiAqXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBkZWZhdWx0IHtAbGluayBIdG1sNS5zdXBwb3J0c05hdGl2ZUF1ZGlvVHJhY2tzfVxuICovXG5IdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNOYXRpdmVBdWRpb1RyYWNrcyA9IEh0bWw1LnN1cHBvcnRzTmF0aXZlQXVkaW9UcmFja3MoKTtcblxuLy8gSFRNTDUgRmVhdHVyZSBkZXRlY3Rpb24gYW5kIERldmljZSBGaXhlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbnZhciBjYW5QbGF5VHlwZSA9IEh0bWw1LlRFU1RfVklEICYmIEh0bWw1LlRFU1RfVklELmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jYW5QbGF5VHlwZTtcbnZhciBtcGVndXJsUkUgPSAvXmFwcGxpY2F0aW9uXFwvKD86eC18dm5kXFwuYXBwbGVcXC4pbXBlZ3VybC9pO1xudmFyIG1wNFJFID0gL152aWRlb1xcL21wNC9pO1xuXG5IdG1sNS5wYXRjaENhblBsYXlUeXBlID0gZnVuY3Rpb24gKCkge1xuXG4gIC8vIEFuZHJvaWQgNC4wIGFuZCBhYm92ZSBjYW4gcGxheSBITFMgdG8gc29tZSBleHRlbnQgYnV0IGl0IHJlcG9ydHMgYmVpbmcgdW5hYmxlIHRvIGRvIHNvXG4gIC8vIEZpcmVmb3ggYW5kIENocm9tZSByZXBvcnQgY29ycmVjdGx5XG4gIGlmIChBTkRST0lEX1ZFUlNJT04gPj0gNC4wICYmICFJU19GSVJFRk9YICYmICFJU19DSFJPTUUpIHtcbiAgICBIdG1sNS5URVNUX1ZJRC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgaWYgKHR5cGUgJiYgbXBlZ3VybFJFLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuICdtYXliZSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FuUGxheVR5cGUuY2FsbCh0aGlzLCB0eXBlKTtcbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgQW5kcm9pZCAyLjIgYW5kIGxlc3MgY2FuUGxheVR5cGUgbWV0aG9kIHdoaWNoIGlzIGJyb2tlblxuICB9IGVsc2UgaWYgKElTX09MRF9BTkRST0lEKSB7XG4gICAgSHRtbDUuVEVTVF9WSUQuY29uc3RydWN0b3IucHJvdG90eXBlLmNhblBsYXlUeXBlID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIGlmICh0eXBlICYmIG1wNFJFLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuICdtYXliZSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FuUGxheVR5cGUuY2FsbCh0aGlzLCB0eXBlKTtcbiAgICB9O1xuICB9XG59O1xuXG5IdG1sNS51bnBhdGNoQ2FuUGxheVR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gSHRtbDUuVEVTVF9WSUQuY29uc3RydWN0b3IucHJvdG90eXBlLmNhblBsYXlUeXBlO1xuXG4gIEh0bWw1LlRFU1RfVklELmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jYW5QbGF5VHlwZSA9IGNhblBsYXlUeXBlO1xuICByZXR1cm4gcjtcbn07XG5cbi8vIGJ5IGRlZmF1bHQsIHBhdGNoIHRoZSBtZWRpYSBlbGVtZW50XG5IdG1sNS5wYXRjaENhblBsYXlUeXBlKCk7XG5cbkh0bWw1LmRpc3Bvc2VNZWRpYUVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgaWYgKCFlbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChlbC5wYXJlbnROb2RlKSB7XG4gICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gIH1cblxuICAvLyByZW1vdmUgYW55IGNoaWxkIHRyYWNrIG9yIHNvdXJjZSBub2RlcyB0byBwcmV2ZW50IHRoZWlyIGxvYWRpbmdcbiAgd2hpbGUgKGVsLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFueSBzcmMgcmVmZXJlbmNlLiBub3Qgc2V0dGluZyBgc3JjPScnYCBiZWNhdXNlIHRoYXQgY2F1c2VzIGEgd2FybmluZ1xuICAvLyBpbiBmaXJlZm94XG4gIGVsLnJlbW92ZUF0dHJpYnV0ZSgnc3JjJyk7XG5cbiAgLy8gZm9yY2UgdGhlIG1lZGlhIGVsZW1lbnQgdG8gdXBkYXRlIGl0cyBsb2FkaW5nIHN0YXRlIGJ5IGNhbGxpbmcgbG9hZCgpXG4gIC8vIGhvd2V2ZXIgSUUgb24gV2luZG93cyA3TiBoYXMgYSBidWcgdGhhdCB0aHJvd3MgYW4gZXJyb3Igc28gbmVlZCBhIHRyeS9jYXRjaCAoIzc5MylcbiAgaWYgKHR5cGVvZiBlbC5sb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gd3JhcHBpbmcgaW4gYW4gaWlmZSBzbyBpdCdzIG5vdCBkZW9wdGltaXplZCAoIzEwNjAjZGlzY3Vzc2lvbl9yMTAzMjQ0NzMpXG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVsLmxvYWQoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZFxuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cbn07XG5cbkh0bWw1LnJlc2V0TWVkaWFFbGVtZW50ID0gZnVuY3Rpb24gKGVsKSB7XG4gIGlmICghZWwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc291cmNlcyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NvdXJjZScpO1xuICB2YXIgaSA9IHNvdXJjZXMubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBlbC5yZW1vdmVDaGlsZChzb3VyY2VzW2ldKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBhbnkgc3JjIHJlZmVyZW5jZS5cbiAgLy8gbm90IHNldHRpbmcgYHNyYz0nJ2AgYmVjYXVzZSB0aGF0IHRocm93cyBhbiBlcnJvclxuICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpO1xuXG4gIGlmICh0eXBlb2YgZWwubG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHdyYXBwaW5nIGluIGFuIGlpZmUgc28gaXQncyBub3QgZGVvcHRpbWl6ZWQgKCMxMDYwI2Rpc2N1c3Npb25fcjEwMzI0NDczKVxuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbC5sb2FkKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHNhdGlzZnkgbGludGVyXG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxufTtcblxuLyogTmF0aXZlIEhUTUw1IGVsZW1lbnQgcHJvcGVydHkgd3JhcHBpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8vIFdyYXAgbmF0aXZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aXRoIGdldHRlcnMgdGhhdCBjaGVjayBib3RoIHByb3BlcnR5IGFuZCBhdHRyaWJ1dGVcbi8vIFRoZSBsaXN0IGlzIGFzIGZvbGxvd2VkOlxuLy8gbXV0ZWQsIGRlZmF1bHRNdXRlZCwgYXV0b3BsYXksIGNvbnRyb2xzLCBsb29wLCBwbGF5c2lubGluZVxuW1xuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBtdXRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYG11dGVkYCBpbmRpY2F0ZXNcbiAqIHRoYXQgdGhlIHZvbHVtZSBmb3IgdGhlIG1lZGlhIHNob3VsZCBiZSBzZXQgdG8gc2lsZW50LiBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGNoYW5nZVxuICogdGhlIGB2b2x1bWVgIGF0dHJpYnV0ZS5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I211dGVkXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRydWUgaWYgdGhlIHZhbHVlIG9mIGB2b2x1bWVgIHNob3VsZCBiZSBpZ25vcmVkIGFuZCB0aGUgYXVkaW8gc2V0IHRvIHNpbGVudC5cbiAqICAgICAgICAgLSBGYWxzZSBpZiB0aGUgdmFsdWUgb2YgYHZvbHVtZWAgc2hvdWxkIGJlIHVzZWQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1tdXRlZH1cbiAqL1xuJ211dGVkJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBkZWZhdWx0TXV0ZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBkZWZhdWx0TXV0ZWRgIGluZGljYXRlc1xuICogd2hldGhlciB0aGUgbWVkaWEgc2hvdWxkIHN0YXJ0IG11dGVkIG9yIG5vdC4gT25seSBjaGFuZ2VzIHRoZSBkZWZhdWx0IHN0YXRlIG9mIHRoZVxuICogbWVkaWEuIGBtdXRlZGAgYW5kIGBkZWZhdWx0TXV0ZWRgIGNhbiBoYXZlIGRpZmZlcmVudCB2YWx1ZXMuIHtAbGluayBIdG1sNSNtdXRlZH0gaW5kaWNhdGVzIHRoZVxuICogY3VycmVudCBzdGF0ZS5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I2RlZmF1bHRNdXRlZFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUaGUgdmFsdWUgb2YgYGRlZmF1bHRNdXRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgc3RhcnQgbXV0ZWQuXG4gKiAgICAgICAgIC0gRmFsc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBub3Qgc3RhcnQgbXV0ZWRcbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWRlZmF1bHRtdXRlZH1cbiAqL1xuJ2RlZmF1bHRNdXRlZCcsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgYXV0b3BsYXlgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBhdXRvcGxheWAgaW5kaWNhdGVzXG4gKiB0aGF0IHRoZSBtZWRpYSBzaG91bGQgc3RhcnQgdG8gcGxheSBhcyBzb29uIGFzIHRoZSBwYWdlIGlzIHJlYWR5LlxuICpcbiAqIEBtZXRob2QgSHRtbDUjYXV0b3BsYXlcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGBhdXRvcGxheWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgc3RhcnQgYXMgc29vbiBhcyB0aGUgcGFnZSBsb2Fkcy5cbiAqICAgICAgICAgLSBGYWxzZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2hvdWxkIG5vdCBzdGFydCBhcyBzb29uIGFzIHRoZSBwYWdlIGxvYWRzLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNhdHRyLW1lZGlhLWF1dG9wbGF5fVxuICovXG4nYXV0b3BsYXknLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYGNvbnRyb2xzYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgY29udHJvbHNgIGluZGljYXRlc1xuICogd2hldGhlciB0aGUgbmF0aXZlIG1lZGlhIGNvbnRyb2xzIHNob3VsZCBiZSBzaG93biBvciBoaWRkZW4uXG4gKlxuICogQG1ldGhvZCBIdG1sNSNjb250cm9sc1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgLSBUaGUgdmFsdWUgb2YgYGNvbnRyb2xzYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LlxuICogICAgICAgICAtIFRydWUgaW5kaWNhdGVzIHRoYXQgbmF0aXZlIGNvbnRyb2xzIHNob3VsZCBiZSBzaG93aW5nLlxuICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IG5hdGl2ZSBjb250cm9scyBzaG91bGQgYmUgaGlkZGVuLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNhdHRyLW1lZGlhLWNvbnRyb2xzfVxuICovXG4nY29udHJvbHMnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYGxvb3BgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBsb29wYCBpbmRpY2F0ZXNcbiAqIHRoYXQgdGhlIG1lZGlhIHNob3VsZCByZXR1cm4gdG8gdGhlIHN0YXJ0IG9mIHRoZSBtZWRpYSBhbmQgY29udGludWUgcGxheWluZyBvbmNlXG4gKiBpdCByZWFjaGVzIHRoZSBlbmQuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNsb29wXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRoZSB2YWx1ZSBvZiBgbG9vcGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHBsYXliYWNrIHNob3VsZCBzZWVrIGJhY2sgdG8gc3RhcnQgb25jZVxuICogICAgICAgICAgIHRoZSBlbmQgb2YgYSBtZWRpYSBpcyByZWFjaGVkLlxuICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHBsYXliYWNrIHNob3VsZCBub3QgbG9vcCBiYWNrIHRvIHRoZSBzdGFydCB3aGVuIHRoZVxuICogICAgICAgICAgIGVuZCBvZiB0aGUgbWVkaWEgaXMgcmVhY2hlZC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjYXR0ci1tZWRpYS1sb29wfVxuICovXG4nbG9vcCcsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgcGxheXNpbmxpbmVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5c2lubGluZWAgaW5kaWNhdGVzXG4gKiB0byB0aGUgYnJvd3NlciB0aGF0IG5vbi1mdWxsc2NyZWVuIHBsYXliYWNrIGlzIHByZWZlcnJlZCB3aGVuIGZ1bGxzY3JlZW5cbiAqIHBsYXliYWNrIGlzIHRoZSBuYXRpdmUgZGVmYXVsdCwgc3VjaCBhcyBpbiBpT1MgU2FmYXJpLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjcGxheXNpbmxpbmVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGBwbGF5c2lubGluZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgcGxheSBpbmxpbmUuXG4gKiAgICAgICAgIC0gRmFsc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBub3QgcGxheSBpbmxpbmUuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jYXR0ci12aWRlby1wbGF5c2lubGluZX1cbiAqL1xuJ3BsYXlzaW5saW5lJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBIdG1sNS5wcm90b3R5cGVbcHJvcF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxfW3Byb3BdIHx8IHRoaXMuZWxfLmhhc0F0dHJpYnV0ZShwcm9wKTtcbiAgfTtcbn0pO1xuXG4vLyBXcmFwIG5hdGl2ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2l0aCBzZXR0ZXJzIHRoYXQgc2V0IGJvdGggcHJvcGVydHkgYW5kIGF0dHJpYnV0ZVxuLy8gVGhlIGxpc3QgaXMgYXMgZm9sbG93ZWQ6XG4vLyBzZXRNdXRlZCwgc2V0RGVmYXVsdE11dGVkLCBzZXRBdXRvcGxheSwgc2V0TG9vcCwgc2V0UGxheXNpbmxpbmVcbi8vIHNldENvbnRyb2xzIGlzIHNwZWNpYWwtY2FzZWQgYWJvdmVcbltcbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgbXV0ZWRgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgbXV0ZWRgIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50XG4gKiBhdWRpbyBsZXZlbCBzaG91bGQgYmUgc2lsZW50LlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0TXV0ZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbXV0ZWRcbiAqICAgICAgICAtIFRydWUgaWYgdGhlIGF1ZGlvIHNob3VsZCBiZSBzZXQgdG8gc2lsZW50XG4gKiAgICAgICAgLSBGYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLW11dGVkfVxuICovXG4nbXV0ZWQnLFxuXG4vKipcbiAqIFNldCB0aGUgdmFsdWUgb2YgYGRlZmF1bHRNdXRlZGAgb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBkZWZhdWx0TXV0ZWRgIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50XG4gKiBhdWRpbyBsZXZlbCBzaG91bGQgYmUgc2lsZW50LCBidXQgd2lsbCBvbmx5IGVmZmVjdCB0aGUgbXV0ZWQgbGV2ZWwgb24gaW50aWFsIHBsYXliYWNrLi5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1LnByb3RvdHlwZS5zZXREZWZhdWx0TXV0ZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVmYXVsdE11dGVkXG4gKiAgICAgICAgLSBUcnVlIGlmIHRoZSBhdWRpbyBzaG91bGQgYmUgc2V0IHRvIHNpbGVudFxuICogICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1kZWZhdWx0bXV0ZWR9XG4gKi9cbidkZWZhdWx0TXV0ZWQnLFxuXG4vKipcbiAqIFNldCB0aGUgdmFsdWUgb2YgYGF1dG9wbGF5YCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gYGF1dG9wbGF5YCBpbmRpY2F0ZXNcbiAqIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBzdGFydCB0byBwbGF5IGFzIHNvb24gYXMgdGhlIHBhZ2UgaXMgcmVhZHkuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNzZXRBdXRvcGxheVxuICogQHBhcmFtIHtib29sZWFufSBhdXRvcGxheVxuICogICAgICAgICAtIFRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBzdGFydCBhcyBzb29uIGFzIHRoZSBwYWdlIGxvYWRzLlxuICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgbm90IHN0YXJ0IGFzIHNvb24gYXMgdGhlIHBhZ2UgbG9hZHMuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtYXV0b3BsYXl9XG4gKi9cbidhdXRvcGxheScsXG5cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgbG9vcGAgb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBsb29wYCBpbmRpY2F0ZXNcbiAqIHRoYXQgdGhlIG1lZGlhIHNob3VsZCByZXR1cm4gdG8gdGhlIHN0YXJ0IG9mIHRoZSBtZWRpYSBhbmQgY29udGludWUgcGxheWluZyBvbmNlXG4gKiBpdCByZWFjaGVzIHRoZSBlbmQuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNzZXRMb29wXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGxvb3BcbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHBsYXliYWNrIHNob3VsZCBzZWVrIGJhY2sgdG8gc3RhcnQgb25jZVxuICogICAgICAgICAgIHRoZSBlbmQgb2YgYSBtZWRpYSBpcyByZWFjaGVkLlxuICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHBsYXliYWNrIHNob3VsZCBub3QgbG9vcCBiYWNrIHRvIHRoZSBzdGFydCB3aGVuIHRoZVxuICogICAgICAgICAgIGVuZCBvZiB0aGUgbWVkaWEgaXMgcmVhY2hlZC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjYXR0ci1tZWRpYS1sb29wfVxuICovXG4nbG9vcCcsXG5cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgcGxheXNpbmxpbmVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5c2lubGluZWAgaW5kaWNhdGVzXG4gKiB0byB0aGUgYnJvd3NlciB0aGF0IG5vbi1mdWxsc2NyZWVuIHBsYXliYWNrIGlzIHByZWZlcnJlZCB3aGVuIGZ1bGxzY3JlZW5cbiAqIHBsYXliYWNrIGlzIHRoZSBuYXRpdmUgZGVmYXVsdCwgc3VjaCBhcyBpbiBpT1MgU2FmYXJpLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0UGxheXNpbmxpbmVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGxheXNpbmxpbmVcbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgcGxheSBpbmxpbmUuXG4gKiAgICAgICAgIC0gRmFsc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBub3QgcGxheSBpbmxpbmUuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jYXR0ci12aWRlby1wbGF5c2lubGluZX1cbiAqL1xuJ3BsYXlzaW5saW5lJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBIdG1sNS5wcm90b3R5cGVbJ3NldCcgKyB0b1RpdGxlQ2FzZShwcm9wKV0gPSBmdW5jdGlvbiAodikge1xuICAgIHRoaXMuZWxfW3Byb3BdID0gdjtcblxuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUocHJvcCwgcHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxfLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTtcbiAgICB9XG4gIH07XG59KTtcblxuLy8gV3JhcCBuYXRpdmUgcHJvcGVydGllcyB3aXRoIGEgZ2V0dGVyXG4vLyBUaGUgbGlzdCBpcyBhcyBmb2xsb3dlZFxuLy8gcGF1c2VkLCBjdXJyZW50VGltZSwgYnVmZmVyZWQsIHZvbHVtZSwgcG9zdGVyLCBwcmVsb2FkLCBlcnJvciwgc2Vla2luZ1xuLy8gc2Vla2FibGUsIGVuZGVkLCBwbGF5YmFja1JhdGUsIGRlZmF1bHRQbGF5YmFja1JhdGUsIHBsYXllZCwgbmV0d29ya1N0YXRlXG4vLyByZWFkeVN0YXRlLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodFxuW1xuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBwYXVzZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwYXVzZWRgIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZWRpYSBlbGVtZW50XG4gKiBpcyBjdXJyZW50bHkgcGF1c2VkIG9yIG5vdC5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3BhdXNlZFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwYXVzZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1wYXVzZWR9XG4gKi9cbidwYXVzZWQnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYGN1cnJlbnRUaW1lYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgY3VycmVudFRpbWVgIGluZGljYXRlc1xuICogdGhlIGN1cnJlbnQgc2Vjb25kIHRoYXQgdGhlIG1lZGlhIGlzIGF0IGluIHBsYXliYWNrLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjY3VycmVudFRpbWVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBjdXJyZW50VGltZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWN1cnJlbnR0aW1lfVxuICovXG4nY3VycmVudFRpbWUnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYGJ1ZmZlcmVkYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgYnVmZmVyZWRgIGlzIGEgYFRpbWVSYW5nZWBcbiAqIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcnRzIG9mIHRoZSBtZWRpYSB0aGF0IGFyZSBhbHJlYWR5IGRvd25sb2FkZWQgYW5kXG4gKiBhdmFpbGFibGUgZm9yIHBsYXliYWNrLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjYnVmZmVyZWRcbiAqIEByZXR1cm4ge1RpbWVSYW5nZX1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBidWZmZXJlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWJ1ZmZlcmVkfVxuICovXG4nYnVmZmVyZWQnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYHZvbHVtZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHZvbHVtZWAgaW5kaWNhdGVzXG4gKiB0aGUgY3VycmVudCBwbGF5YmFjayB2b2x1bWUgb2YgYXVkaW8gZm9yIGEgbWVkaWEuIGB2b2x1bWVgIHdpbGwgYmUgYSB2YWx1ZSBmcm9tIDBcbiAqIChzaWxlbnQpIHRvIDEgKGxvdWRlc3QgYW5kIGRlZmF1bHQpLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjdm9sdW1lXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgdm9sdW1lYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBWYWx1ZSB3aWxsIGJlIGJldHdlZW4gMC0xLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tYS12b2x1bWV9XG4gKi9cbid2b2x1bWUnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYHBvc3RlcmAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHBvc3RlcmAgaW5kaWNhdGVzXG4gKiB0aGF0IHRoZSB1cmwgb2YgYW4gaW1hZ2UgZmlsZSB0aGF0IGNhbi93aWxsIGJlIHNob3duIHdoZW4gbm8gbWVkaWEgZGF0YSBpcyBhdmFpbGFibGUuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNwb3N0ZXJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwb3N0ZXJgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIFZhbHVlIHdpbGwgYmUgYSB1cmwgdG8gYW5cbiAqICAgICAgICAgaW1hZ2UuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItdmlkZW8tcG9zdGVyfVxuICovXG4ncG9zdGVyJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBwcmVsb2FkYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgcHJlbG9hZGAgaW5kaWNhdGVzXG4gKiB3aGF0IHNob3VsZCBkb3dubG9hZCBiZWZvcmUgdGhlIG1lZGlhIGlzIGludGVyYWN0ZWQgd2l0aC4gSXQgY2FuIGhhdmUgdGhlIGZvbGxvd2luZ1xuICogdmFsdWVzOlxuICogLSBub25lOiBub3RoaW5nIHNob3VsZCBiZSBkb3dubG9hZGVkXG4gKiAtIG1ldGFkYXRhOiBwb3N0ZXIgYW5kIHRoZSBmaXJzdCBmZXcgZnJhbWVzIG9mIHRoZSBtZWRpYSBtYXkgYmUgZG93bmxvYWRlZCB0byBnZXRcbiAqICAgbWVkaWEgZGltZW5zaW9ucyBhbmQgb3RoZXIgbWV0YWRhdGFcbiAqIC0gYXV0bzogYWxsb3cgdGhlIG1lZGlhIGFuZCBtZXRhZGF0YSBmb3IgdGhlIG1lZGlhIHRvIGJlIGRvd25sb2FkZWQgYmVmb3JlXG4gKiAgICBpbnRlcmFjdGlvblxuICpcbiAqIEBtZXRob2QgSHRtbDUjcHJlbG9hZFxuICogQHJldHVybiB7c3RyaW5nfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYHByZWxvYWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIFdpbGwgYmUgJ25vbmUnLCAnbWV0YWRhdGEnLFxuICogICAgICAgICBvciAnYXV0bycuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtcHJlbG9hZH1cbiAqL1xuJ3ByZWxvYWQnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGBlcnJvcmAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYGVycm9yYCBpbmRpY2F0ZXMgYW55XG4gKiBNZWRpYUVycm9yIHRoYXQgbWF5IGhhdmUgb2NjdXJlZCBkdXJpbmcgcGxheWJhY2suIElmIGVycm9yIHJldHVybnMgbnVsbCB0aGVyZSBpcyBub1xuICogY3VycmVudCBlcnJvci5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I2Vycm9yXG4gKiBAcmV0dXJuIHtNZWRpYUVycm9yfG51bGx9XG4gKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgZXJyb3JgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIFdpbGwgYmUgYE1lZGlhRXJyb3JgIGlmIHRoZXJlXG4gKiAgICAgICAgIGlzIGEgY3VycmVudCBlcnJvciBhbmQgbnVsbCBvdGhlcndpc2UuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1lcnJvcn1cbiAqL1xuJ2Vycm9yJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBzZWVraW5nYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgc2Vla2luZ2AgaW5kaWNhdGVzIHdoZXRoZXIgdGhlXG4gKiBtZWRpYSBpcyBjdXJyZW50bHkgc2Vla2luZyB0byBhIG5ldyBwb3NpdGlvbiBvciBub3QuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNzZWVraW5nXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogICAgICAgICAtIFRoZSB2YWx1ZSBvZiBgc2Vla2luZ2AgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpcyBjdXJyZW50bHkgc2Vla2luZyB0byBhIG5ldyBwb3NpdGlvbi5cbiAqICAgICAgICAgLSBGbGFzZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXMgbm90IHNlZWtpbmcgdG8gYSBuZXcgcG9zaXRpb24gYXQgdGhpcyB0aW1lLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtc2Vla2luZ31cbiAqL1xuJ3NlZWtpbmcnLFxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgb2YgYHNlZWthYmxlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgc2Vla2FibGVgIHJldHVybnMgYVxuICogYFRpbWVSYW5nZWAgb2JqZWN0IGluZGljYXRpbmcgcmFuZ2VzIG9mIHRpbWUgdGhhdCBjYW4gY3VycmVudGx5IGJlIGBzZWVrZWRgIHRvLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2Vla2FibGVcbiAqIEByZXR1cm4ge1RpbWVSYW5nZX1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBzZWVrYWJsZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gQSBgVGltZVJhbmdlYCBvYmplY3RcbiAqICAgICAgICAgaW5kaWNhdGluZyB0aGUgY3VycmVudCByYW5nZXMgb2YgdGltZSB0aGF0IGNhbiBiZSBzZWVrZWQgdG8uXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1zZWVrYWJsZX1cbiAqL1xuJ3NlZWthYmxlJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBlbmRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYGVuZGVkYCBpbmRpY2F0ZXMgd2hldGhlclxuICogdGhlIG1lZGlhIGhhcyByZWFjaGVkIHRoZSBlbmQgb3Igbm90LlxuICpcbiAqIEBtZXRob2QgSHRtbDUjZW5kZWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGBlbmRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC5cbiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBoYXMgZW5kZWQuXG4gKiAgICAgICAgIC0gRmFsc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGhhcyBub3QgZW5kZWQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1lbmRlZH1cbiAqL1xuJ2VuZGVkJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBwbGF5YmFja1JhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5YmFja1JhdGVgIGluZGljYXRlc1xuICogdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG1lZGlhIGlzIGN1cnJlbnRseSBwbGF5aW5nIGJhY2suIEV4YW1wbGVzOlxuICogICAtIGlmIHBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMiwgbWVkaWEgd2lsbCBwbGF5IHR3aWNlIGFzIGZhc3QuXG4gKiAgIC0gaWYgcGxheWJhY2tSYXRlIGlzIHNldCB0byAwLjUsIG1lZGlhIHdpbGwgcGxheSBoYWxmIGFzIGZhc3QuXG4gKlxuICogQG1ldGhvZCBIdG1sNSNwbGF5YmFja1JhdGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwbGF5YmFja1JhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIEEgbnVtYmVyIGluZGljYXRpbmdcbiAqICAgICAgICAgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgb2YgdGhlIG1lZGlhLCB3aGVyZSAxIGlzIG5vcm1hbCBzcGVlZC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXBsYXliYWNrcmF0ZX1cbiAqL1xuJ3BsYXliYWNrUmF0ZScsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgZGVmYXVsdFBsYXliYWNrUmF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYGRlZmF1bHRQbGF5YmFja1JhdGVgIGluZGljYXRlc1xuICogdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG1lZGlhIGlzIGN1cnJlbnRseSBwbGF5aW5nIGJhY2suIFRoaXMgdmFsdWUgd2lsbCBub3QgaW5kaWNhdGUgdGhlIGN1cnJlbnRcbiAqIGBwbGF5YmFja1JhdGVgIGFmdGVyIHBsYXliYWNrIGhhcyBzdGFydGVkLCB1c2Uge0BsaW5rIEh0bWw1I3BsYXliYWNrUmF0ZX0gZm9yIHRoYXQuXG4gKlxuICogRXhhbXBsZXM6XG4gKiAgIC0gaWYgZGVmYXVsdFBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMiwgbWVkaWEgd2lsbCBwbGF5IHR3aWNlIGFzIGZhc3QuXG4gKiAgIC0gaWYgZGVmYXVsdFBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMC41LCBtZWRpYSB3aWxsIHBsYXkgaGFsZiBhcyBmYXN0LlxuICpcbiAqIEBtZXRob2QgSHRtbDUucHJvdG90eXBlLmRlZmF1bHRQbGF5YmFja1JhdGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBkZWZhdWx0UGxheWJhY2tSYXRlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBBIG51bWJlciBpbmRpY2F0aW5nXG4gKiAgICAgICAgIHRoZSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIG9mIHRoZSBtZWRpYSwgd2hlcmUgMSBpcyBub3JtYWwgc3BlZWQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1wbGF5YmFja3JhdGV9XG4gKi9cbidkZWZhdWx0UGxheWJhY2tSYXRlJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBwbGF5ZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5ZWRgIHJldHVybnMgYSBgVGltZVJhbmdlYFxuICogb2JqZWN0IHJlcHJlc2VudGluZyBwb2ludHMgaW4gdGhlIG1lZGlhIHRpbWVsaW5lIHRoYXQgaGF2ZSBiZWVuIHBsYXllZC5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3BsYXllZFxuICogQHJldHVybiB7VGltZVJhbmdlfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYHBsYXllZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gQSBgVGltZVJhbmdlYCBvYmplY3QgaW5kaWNhdGluZ1xuICogICAgICAgICB0aGUgcmFuZ2VzIG9mIHRpbWUgdGhhdCBoYXZlIGJlZW4gcGxheWVkLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtcGxheWVkfVxuICovXG4ncGxheWVkJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGBuZXR3b3JrU3RhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBuZXR3b3JrU3RhdGVgIGluZGljYXRlc1xuICogdGhlIGN1cnJlbnQgbmV0d29yayBzdGF0ZS4gSXQgcmV0dXJucyBhbiBlbnVtZXJhdGlvbiBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDpcbiAqIC0gMDogTkVUV09SS19FTVBUWVxuICogLSAxOiBORVdPUktfSURMRVxuICogLSAyOiBORVRXT1JLX0xPQURJTkdcbiAqIC0gMzogTkVUV09SS19OT19TT1VSQ0VcbiAqXG4gKiBAbWV0aG9kIEh0bWw1I25ldHdvcmtTdGF0ZVxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYG5ldHdvcmtTdGF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gVGhpcyB3aWxsIGJlIGEgbnVtYmVyXG4gKiAgICAgICAgIGZyb20gdGhlIGxpc3QgaW4gdGhlIGRlc2NyaXB0aW9uLlxuICpcbiAqIEBzZWUgW1NwZWNdIHtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLW5ldHdvcmtzdGF0ZX1cbiAqL1xuJ25ldHdvcmtTdGF0ZScsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgcmVhZHlTdGF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHJlYWR5U3RhdGVgIGluZGljYXRlc1xuICogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1lZGlhIGVsZW1lbnQuIEl0IHJldHVybnMgYW4gZW51bWVyYXRpb24gZnJvbSB0aGVcbiAqIGZvbGxvd2luZyBsaXN0OlxuICogLSAwOiBIQVZFX05PVEhJTkdcbiAqIC0gMTogSEFWRV9NRVRBREFUQVxuICogLSAyOiBIQVZFX0NVUlJFTlRfREFUQVxuICogLSAzOiBIQVZFX0ZVVFVSRV9EQVRBXG4gKiAtIDQ6IEhBVkVfRU5PVUdIX0RBVEFcbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3JlYWR5U3RhdGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGByZWFkeVN0YXRlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYSBudW1iZXJcbiAqICAgICAgICAgZnJvbSB0aGUgbGlzdCBpbiB0aGUgZGVzY3JpcHRpb24uXG4gKlxuICogQHNlZSBbU3BlY10ge0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNyZWFkeS1zdGF0ZXN9XG4gKi9cbidyZWFkeVN0YXRlJyxcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGB2aWRlb1dpZHRoYCBmcm9tIHRoZSB2aWRlbyBlbGVtZW50LiBgdmlkZW9XaWR0aGAgaW5kaWNhdGVzXG4gKiB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgdmlkZW8gaW4gY3NzIHBpeGVscy5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3ZpZGVvV2lkdGhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGB2aWRlb1dpZHRoYCBmcm9tIHRoZSB2aWRlbyBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYSBudW1iZXJcbiAqICAgICAgICAgaW4gY3NzIHBpeGVscy5cbiAqXG4gKiBAc2VlIFtTcGVjXSB7QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS12aWRlby12aWRlb3dpZHRofVxuICovXG4ndmlkZW9XaWR0aCcsXG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBgdmlkZW9IZWlnaHRgIGZyb20gdGhlIHZpZGVvIGVsZW1lbnQuIGB2aWRlb0hlaWd0aGAgaW5kaWNhdGVzXG4gKiB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIHZpZGVvIGluIGNzcyBwaXhlbHMuXG4gKlxuICogQG1ldGhvZCBIdG1sNSN2aWRlb0hlaWdodFxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYHZpZGVvSGVpZ2h0YCBmcm9tIHRoZSB2aWRlbyBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYSBudW1iZXJcbiAqICAgICAgICAgaW4gY3NzIHBpeGVscy5cbiAqXG4gKiBAc2VlIFtTcGVjXSB7QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS12aWRlby12aWRlb3dpZHRofVxuICovXG4ndmlkZW9IZWlnaHQnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIEh0bWw1LnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5lbF9bcHJvcF07XG4gIH07XG59KTtcblxuLy8gV3JhcCBuYXRpdmUgcHJvcGVydGllcyB3aXRoIGEgc2V0dGVyIGluIHRoaXMgZm9ybWF0OlxuLy8gc2V0ICsgdG9UaXRsZUNhc2UobmFtZSlcbi8vIFRoZSBsaXN0IGlzIGFzIGZvbGxvd3M6XG4vLyBzZXRWb2x1bWUsIHNldFNyYywgc2V0UG9zdGVyLCBzZXRQcmVsb2FkLCBzZXRQbGF5YmFja1JhdGUsIHNldERlZmF1bHRQbGF5YmFja1JhdGVcbltcbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgdm9sdW1lYCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gYHZvbHVtZWAgaW5kaWNhdGVzIHRoZSBjdXJyZW50XG4gKiBhdWRpbyBsZXZlbCBhcyBhIHBlcmNlbnRhZ2UgaW4gZGVjaW1hbCBmb3JtLiBUaGlzIG1lYW5zIHRoYXQgMSBpcyAxMDAlLCAwLjUgaXMgNTAlLCBhbmRcbiAqIHNvIG9uLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0Vm9sdW1lXG4gKiBAcGFyYW0ge251bWJlcn0gcGVyY2VudEFzRGVjaW1hbFxuICogICAgICAgIFRoZSB2b2x1bWUgcGVyY2VudCBhcyBhIGRlY2ltYWwuIFZhbGlkIHJhbmdlIGlzIGZyb20gMC0xLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tYS12b2x1bWV9XG4gKi9cbid2b2x1bWUnLFxuXG4vKipcbiAqIFNldCB0aGUgdmFsdWUgb2YgYHNyY2Agb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBzcmNgIGluZGljYXRlcyB0aGUgY3VycmVudFxuICoge0BsaW5rIFRlY2h+U291cmNlT2JqZWN0fSBmb3IgdGhlIG1lZGlhLlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0U3JjXG4gKiBAcGFyYW0ge1RlY2h+U291cmNlT2JqZWN0fSBzcmNcbiAqICAgICAgICBUaGUgc291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIGN1cnJlbnQgc291cmNlLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtc3JjfVxuICovXG4nc3JjJyxcblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGBwb3N0ZXJgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgcG9zdGVyYCBpcyB0aGUgdXJsIHRvXG4gKiBhbiBpbWFnZSBmaWxlIHRoYXQgY2FuL3dpbGwgYmUgc2hvd24gd2hlbiBubyBtZWRpYSBkYXRhIGlzIGF2YWlsYWJsZS5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3NldFBvc3RlclxuICogQHBhcmFtIHtzdHJpbmd9IHBvc3RlclxuICogICAgICAgIFRoZSB1cmwgdG8gYW4gaW1hZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgYHBvc3RlcmAgZm9yIHRoZSBtZWRpYVxuICogICAgICAgIGVsZW1lbnQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtcG9zdGVyfVxuICovXG4ncG9zdGVyJyxcblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGBwcmVsb2FkYCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gYHByZWxvYWRgIGluZGljYXRlc1xuICogd2hhdCBzaG91bGQgZG93bmxvYWQgYmVmb3JlIHRoZSBtZWRpYSBpcyBpbnRlcmFjdGVkIHdpdGguIEl0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmdcbiAqIHZhbHVlczpcbiAqIC0gbm9uZTogbm90aGluZyBzaG91bGQgYmUgZG93bmxvYWRlZFxuICogLSBtZXRhZGF0YTogcG9zdGVyIGFuZCB0aGUgZmlyc3QgZmV3IGZyYW1lcyBvZiB0aGUgbWVkaWEgbWF5IGJlIGRvd25sb2FkZWQgdG8gZ2V0XG4gKiAgIG1lZGlhIGRpbWVuc2lvbnMgYW5kIG90aGVyIG1ldGFkYXRhXG4gKiAtIGF1dG86IGFsbG93IHRoZSBtZWRpYSBhbmQgbWV0YWRhdGEgZm9yIHRoZSBtZWRpYSB0byBiZSBkb3dubG9hZGVkIGJlZm9yZVxuICogICAgaW50ZXJhY3Rpb25cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3NldFByZWxvYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVsb2FkXG4gKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgcHJlbG9hZGAgdG8gc2V0IG9uIHRoZSBtZWRpYSBlbGVtZW50LiBNdXN0IGJlICdub25lJywgJ21ldGFkYXRhJyxcbiAqICAgICAgICAgb3IgJ2F1dG8nLlxuICpcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNhdHRyLW1lZGlhLXByZWxvYWR9XG4gKi9cbidwcmVsb2FkJyxcblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGBwbGF5YmFja1JhdGVgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgcGxheWJhY2tSYXRlYCBpbmRpY2F0ZXNcbiAqIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBtZWRpYSBzaG91bGQgcGxheSBiYWNrLiBFeGFtcGxlczpcbiAqICAgLSBpZiBwbGF5YmFja1JhdGUgaXMgc2V0IHRvIDIsIG1lZGlhIHdpbGwgcGxheSB0d2ljZSBhcyBmYXN0LlxuICogICAtIGlmIHBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMC41LCBtZWRpYSB3aWxsIHBsYXkgaGFsZiBhcyBmYXN0LlxuICpcbiAqIEBtZXRob2QgSHRtbDUjc2V0UGxheWJhY2tSYXRlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgcGxheWJhY2tSYXRlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBBIG51bWJlciBpbmRpY2F0aW5nXG4gKiAgICAgICAgIHRoZSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIG9mIHRoZSBtZWRpYSwgd2hlcmUgMSBpcyBub3JtYWwgc3BlZWQuXG4gKlxuICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1wbGF5YmFja3JhdGV9XG4gKi9cbidwbGF5YmFja1JhdGUnLFxuXG4vKipcbiAqIFNldCB0aGUgdmFsdWUgb2YgYGRlZmF1bHRQbGF5YmFja1JhdGVgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgZGVmYXVsdFBsYXliYWNrUmF0ZWAgaW5kaWNhdGVzXG4gKiB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgbWVkaWEgc2hvdWxkIHBsYXkgYmFjayB1cG9uIGluaXRpYWwgc3RhcnR1cC4gQ2hhbmdpbmcgdGhpcyB2YWx1ZVxuICogYWZ0ZXIgYSB2aWRlbyBoYXMgc3RhcnRlZCB3aWxsIGRvIG5vdGhpbmcuIEluc3RlYWQgeW91IHNob3VsZCB1c2VkIHtAbGluayBIdG1sNSNzZXRQbGF5YmFja1JhdGV9LlxuICpcbiAqIEV4YW1wbGUgVmFsdWVzOlxuICogICAtIGlmIHBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMiwgbWVkaWEgd2lsbCBwbGF5IHR3aWNlIGFzIGZhc3QuXG4gKiAgIC0gaWYgcGxheWJhY2tSYXRlIGlzIHNldCB0byAwLjUsIG1lZGlhIHdpbGwgcGxheSBoYWxmIGFzIGZhc3QuXG4gKlxuICogQG1ldGhvZCBIdG1sNS5wcm90b3R5cGUuc2V0RGVmYXVsdFBsYXliYWNrUmF0ZVxuICogQHJldHVybiB7bnVtYmVyfVxuICogICAgICAgICBUaGUgdmFsdWUgb2YgYGRlZmF1bHRQbGF5YmFja1JhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIEEgbnVtYmVyIGluZGljYXRpbmdcbiAqICAgICAgICAgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgb2YgdGhlIG1lZGlhLCB3aGVyZSAxIGlzIG5vcm1hbCBzcGVlZC5cbiAqXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWRlZmF1bHRwbGF5YmFja3JhdGV9XG4gKi9cbidkZWZhdWx0UGxheWJhY2tSYXRlJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBIdG1sNS5wcm90b3R5cGVbJ3NldCcgKyB0b1RpdGxlQ2FzZShwcm9wKV0gPSBmdW5jdGlvbiAodikge1xuICAgIHRoaXMuZWxfW3Byb3BdID0gdjtcbiAgfTtcbn0pO1xuXG4vLyB3cmFwIG5hdGl2ZSBmdW5jdGlvbnMgd2l0aCBhIGZ1bmN0aW9uXG4vLyBUaGUgbGlzdCBpcyBhcyBmb2xsb3dzOlxuLy8gcGF1c2UsIGxvYWQgcGxheVxuW1xuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBtZWRpYSBlbGVtZW50cyBgcGF1c2VgIGZ1bmN0aW9uLiBUaGlzIHdpbGwgY2FsbCB0aGUgYEhUTUw1YFxuICogbWVkaWEgZWxlbWVudHMgYHBhdXNlYCBmdW5jdGlvbi5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3BhdXNlXG4gKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXBhdXNlfVxuICovXG4ncGF1c2UnLFxuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgdGhlIG1lZGlhIGVsZW1lbnRzIGBsb2FkYCBmdW5jdGlvbi4gVGhpcyB3aWxsIGNhbGwgdGhlIGBIVE1MNWBzXG4gKiBtZWRpYSBlbGVtZW50IGBsb2FkYCBmdW5jdGlvbi5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I2xvYWRcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtbG9hZH1cbiAqL1xuJ2xvYWQnLFxuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgdGhlIG1lZGlhIGVsZW1lbnRzIGBwbGF5YCBmdW5jdGlvbi4gVGhpcyB3aWxsIGNhbGwgdGhlIGBIVE1MNWBzXG4gKiBtZWRpYSBlbGVtZW50IGBwbGF5YCBmdW5jdGlvbi5cbiAqXG4gKiBAbWV0aG9kIEh0bWw1I3BsYXlcbiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtcGxheX1cbiAqL1xuJ3BsYXknXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIEh0bWw1LnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5lbF9bcHJvcF0oKTtcbiAgfTtcbn0pO1xuXG5UZWNoLndpdGhTb3VyY2VIYW5kbGVycyhIdG1sNSk7XG5cbi8qKlxuICogTmF0aXZlIHNvdXJjZSBoYW5kbGVyIGZvciBIdG1sNSwgc2ltcGx5IHBhc3NlcyB0aGUgc291cmNlIHRvIHRoZSBtZWRpYSBlbGVtZW50LlxuICpcbiAqIEBwcm9wcmV0eSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNvdXJjZVxuICogICAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0XG4gKlxuICogQHByb3ByZXR5IHtIdG1sNX0gdGVjaFxuICogICAgICAgIFRoZSBpbnN0YW5jZSBvZiB0aGUgSFRNTDUgdGVjaC5cbiAqL1xuSHRtbDUubmF0aXZlU291cmNlSGFuZGxlciA9IHt9O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBtZWRpYSBlbGVtZW50IGNhbiBwbGF5IHRoZSBnaXZlbiBtaW1lIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gKi9cbkh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAvLyBJRTkgb24gV2luZG93cyA3IHdpdGhvdXQgTWVkaWFQbGF5ZXIgdGhyb3dzIGFuIGVycm9yIGhlcmVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZpZGVvanMvdmlkZW8uanMvaXNzdWVzLzUxOVxuICB0cnkge1xuICAgIHJldHVybiBIdG1sNS5URVNUX1ZJRC5jYW5QbGF5VHlwZSh0eXBlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgbWVkaWEgZWxlbWVudCBjYW4gaGFuZGxlIGEgc291cmNlIG5hdGl2ZWx5LlxuICpcbiAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNvdXJjZVxuICogICAgICAgICBUaGUgc291cmNlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgICAgICAgT3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gdGhlIHRlY2guXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICogICAgICAgICAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKS5cbiAqL1xuSHRtbDUubmF0aXZlU291cmNlSGFuZGxlci5jYW5IYW5kbGVTb3VyY2UgPSBmdW5jdGlvbiAoc291cmNlLCBvcHRpb25zKSB7XG5cbiAgLy8gSWYgYSB0eXBlIHdhcyBwcm92aWRlZCB3ZSBzaG91bGQgcmVseSBvbiB0aGF0XG4gIGlmIChzb3VyY2UudHlwZSkge1xuICAgIHJldHVybiBIdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyLmNhblBsYXlUeXBlKHNvdXJjZS50eXBlKTtcblxuICAgIC8vIElmIG5vIHR5cGUsIGZhbGwgYmFjayB0byBjaGVja2luZyAndmlkZW8vW0VYVEVOU0lPTl0nXG4gIH0gZWxzZSBpZiAoc291cmNlLnNyYykge1xuICAgIHZhciBleHQgPSBnZXRGaWxlRXh0ZW5zaW9uKHNvdXJjZS5zcmMpO1xuXG4gICAgcmV0dXJuIEh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIuY2FuUGxheVR5cGUoJ3ZpZGVvLycgKyBleHQpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuLyoqXG4gKiBQYXNzIHRoZSBzb3VyY2UgdG8gdGhlIG5hdGl2ZSBtZWRpYSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNvdXJjZVxuICogICAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0XG4gKlxuICogQHBhcmFtIHtIdG1sNX0gdGVjaFxuICogICAgICAgIFRoZSBpbnN0YW5jZSBvZiB0aGUgSHRtbDUgdGVjaFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgICAgICBUaGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBzb3VyY2VcbiAqL1xuSHRtbDUubmF0aXZlU291cmNlSGFuZGxlci5oYW5kbGVTb3VyY2UgPSBmdW5jdGlvbiAoc291cmNlLCB0ZWNoLCBvcHRpb25zKSB7XG4gIHRlY2guc2V0U3JjKHNvdXJjZS5zcmMpO1xufTtcblxuLyoqXG4gKiBBIG5vb3AgZm9yIHRoZSBuYXRpdmUgZGlzcG9zZSBmdW5jdGlvbiwgYXMgY2xlYW51cCBpcyBub3QgbmVlZGVkLlxuICovXG5IdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7fTtcblxuLy8gUmVnaXN0ZXIgdGhlIG5hdGl2ZSBzb3VyY2UgaGFuZGxlclxuSHRtbDUucmVnaXN0ZXJTb3VyY2VIYW5kbGVyKEh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIpO1xuXG5UZWNoLnJlZ2lzdGVyVGVjaCgnSHRtbDUnLCBIdG1sNSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkMSA9IHRhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnXFxuICAgICAgICBVc2luZyB0aGUgdGVjaCBkaXJlY3RseSBjYW4gYmUgZGFuZ2Vyb3VzLiBJIGhvcGUgeW91IGtub3cgd2hhdCB5b3VcXCdyZSBkb2luZy5cXG4gICAgICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdmlkZW9qcy92aWRlby5qcy9pc3N1ZXMvMjYxNyBmb3IgbW9yZSBpbmZvLlxcbiAgICAgICddLCBbJ1xcbiAgICAgICAgVXNpbmcgdGhlIHRlY2ggZGlyZWN0bHkgY2FuIGJlIGRhbmdlcm91cy4gSSBob3BlIHlvdSBrbm93IHdoYXQgeW91XFwncmUgZG9pbmcuXFxuICAgICAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZpZGVvanMvdmlkZW8uanMvaXNzdWVzLzI2MTcgZm9yIG1vcmUgaW5mby5cXG4gICAgICAnXSk7XG5cbi8qKlxuICogQGZpbGUgcGxheWVyLmpzXG4gKi9cbi8vIFN1YmNsYXNzZXMgQ29tcG9uZW50XG4vLyBUaGUgZm9sbG93aW5nIGltcG9ydHMgYXJlIHVzZWQgb25seSB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGVzXG4vLyBhcmUgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSB2aWRlby5qcyBwYWNrYWdlLiBJbXBvcnRpbmcgdGhlIG1vZHVsZXMgd2lsbFxuLy8gZXhlY3V0ZSB0aGVtIGFuZCB0aGV5IHdpbGwgcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIHZpZGVvLmpzLlxuLy8gSW1wb3J0IEh0bWw1IHRlY2gsIGF0IGxlYXN0IGZvciBkaXNwb3NpbmcgdGhlIG9yaWdpbmFsIHZpZGVvIHRhZy5cbi8vIFRoZSBmb2xsb3dpbmcgdGVjaCBldmVudHMgYXJlIHNpbXBseSByZS10cmlnZ2VyZWRcbi8vIG9uIHRoZSBwbGF5ZXIgd2hlbiB0aGV5IGhhcHBlblxudmFyIFRFQ0hfRVZFTlRTX1JFVFJJR0dFUiA9IFtcbi8qKlxuICogRmlyZWQgd2hpbGUgdGhlIHVzZXIgYWdlbnQgaXMgZG93bmxvYWRpbmcgbWVkaWEgZGF0YS5cbiAqXG4gKiBAZXZlbnQgUGxheWVyI3Byb2dyZXNzXG4gKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gKi9cbi8qKlxuICogUmV0cmlnZ2VyIHRoZSBgcHJvZ3Jlc3NgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoUHJvZ3Jlc3NfXG4gKiBAZmlyZXMgUGxheWVyI3Byb2dyZXNzXG4gKiBAbGlzdGVucyBUZWNoI3Byb2dyZXNzXG4gKi9cbidwcm9ncmVzcycsXG5cbi8qKlxuICogRmlyZXMgd2hlbiB0aGUgbG9hZGluZyBvZiBhbiBhdWRpby92aWRlbyBpcyBhYm9ydGVkLlxuICpcbiAqIEBldmVudCBQbGF5ZXIjYWJvcnRcbiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGBhYm9ydGAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBtZXRob2QgUGxheWVyI2hhbmRsZVRlY2hBYm9ydF9cbiAqIEBmaXJlcyBQbGF5ZXIjYWJvcnRcbiAqIEBsaXN0ZW5zIFRlY2gjYWJvcnRcbiAqL1xuJ2Fib3J0JyxcblxuLyoqXG4gKiBGaXJlcyB3aGVuIHRoZSBicm93c2VyIGlzIGludGVudGlvbmFsbHkgbm90IGdldHRpbmcgbWVkaWEgZGF0YS5cbiAqXG4gKiBAZXZlbnQgUGxheWVyI3N1c3BlbmRcbiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGBzdXNwZW5kYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaFN1c3BlbmRfXG4gKiBAZmlyZXMgUGxheWVyI3N1c3BlbmRcbiAqIEBsaXN0ZW5zIFRlY2gjc3VzcGVuZFxuICovXG4nc3VzcGVuZCcsXG5cbi8qKlxuICogRmlyZXMgd2hlbiB0aGUgY3VycmVudCBwbGF5bGlzdCBpcyBlbXB0eS5cbiAqXG4gKiBAZXZlbnQgUGxheWVyI2VtcHRpZWRcbiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGBlbXB0aWVkYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaEVtcHRpZWRfXG4gKiBAZmlyZXMgUGxheWVyI2VtcHRpZWRcbiAqIEBsaXN0ZW5zIFRlY2gjZW1wdGllZFxuICovXG4nZW1wdGllZCcsXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIGdldCBtZWRpYSBkYXRhLCBidXQgZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEBldmVudCBQbGF5ZXIjc3RhbGxlZFxuICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICovXG4vKipcbiAqIFJldHJpZ2dlciB0aGUgYHN0YWxsZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoU3RhbGxlZF9cbiAqIEBmaXJlcyBQbGF5ZXIjc3RhbGxlZFxuICogQGxpc3RlbnMgVGVjaCNzdGFsbGVkXG4gKi9cbidzdGFsbGVkJyxcblxuLyoqXG4gKiBGaXJlcyB3aGVuIHRoZSBicm93c2VyIGhhcyBsb2FkZWQgbWV0YSBkYXRhIGZvciB0aGUgYXVkaW8vdmlkZW8uXG4gKlxuICogQGV2ZW50IFBsYXllciNsb2FkZWRtZXRhZGF0YVxuICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICovXG4vKipcbiAqIFJldHJpZ2dlciB0aGUgYHN0YWxsZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoTG9hZGVkbWV0YWRhdGFfXG4gKiBAZmlyZXMgUGxheWVyI2xvYWRlZG1ldGFkYXRhXG4gKiBAbGlzdGVucyBUZWNoI2xvYWRlZG1ldGFkYXRhXG4gKi9cbidsb2FkZWRtZXRhZGF0YScsXG5cbi8qKlxuICogRmlyZXMgd2hlbiB0aGUgYnJvd3NlciBoYXMgbG9hZGVkIHRoZSBjdXJyZW50IGZyYW1lIG9mIHRoZSBhdWRpby92aWRlby5cbiAqXG4gKiBAZXZlbnQgUGxheWVyI2xvYWRlZGRhdGFcbiAqIEB0eXBlIHtldmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGBsb2FkZWRkYXRhYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaExvYWRkZWRkYXRhX1xuICogQGZpcmVzIFBsYXllciNsb2FkZWRkYXRhXG4gKiBAbGlzdGVucyBUZWNoI2xvYWRlZGRhdGFcbiAqL1xuJ2xvYWRlZGRhdGEnLFxuXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaGFzIGNoYW5nZWQuXG4gKlxuICogQGV2ZW50IFBsYXllciN0aW1ldXBkYXRlXG4gKiBAdHlwZSB7ZXZlbnR9XG4gKi9cbi8qKlxuICogUmV0cmlnZ2VyIHRoZSBgdGltZXVwZGF0ZWAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBtZXRob2QgUGxheWVyI2hhbmRsZVRlY2hUaW1lVXBkYXRlX1xuICogQGZpcmVzIFBsYXllciN0aW1ldXBkYXRlXG4gKiBAbGlzdGVucyBUZWNoI3RpbWV1cGRhdGVcbiAqL1xuJ3RpbWV1cGRhdGUnLFxuXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIHZpZGVvJ3MgaW50cmluc2ljIGRpbWVuc2lvbnMgY2hhbmdlXG4gKlxuICogQGV2ZW50IFBsYXllciNyZXNpemVcbiAqIEB0eXBlIHtldmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGByZXNpemVgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoUmVzaXplX1xuICogQGZpcmVzIFBsYXllciNyZXNpemVcbiAqIEBsaXN0ZW5zIFRlY2gjcmVzaXplXG4gKi9cbidyZXNpemUnLFxuXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIHZvbHVtZSBoYXMgYmVlbiBjaGFuZ2VkXG4gKlxuICogQGV2ZW50IFBsYXllciN2b2x1bWVjaGFuZ2VcbiAqIEB0eXBlIHtldmVudH1cbiAqL1xuLyoqXG4gKiBSZXRyaWdnZXIgdGhlIGB2b2x1bWVjaGFuZ2VgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoVm9sdW1lY2hhbmdlX1xuICogQGZpcmVzIFBsYXllciN2b2x1bWVjaGFuZ2VcbiAqIEBsaXN0ZW5zIFRlY2gjdm9sdW1lY2hhbmdlXG4gKi9cbid2b2x1bWVjaGFuZ2UnLFxuXG4vKipcbiAqIEZpcmVzIHdoZW4gdGhlIHRleHQgdHJhY2sgaGFzIGJlZW4gY2hhbmdlZFxuICpcbiAqIEBldmVudCBQbGF5ZXIjdGV4dHRyYWNrY2hhbmdlXG4gKiBAdHlwZSB7ZXZlbnR9XG4gKi9cbi8qKlxuICogUmV0cmlnZ2VyIHRoZSBgdGV4dHRyYWNrY2hhbmdlYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaFRleHR0cmFja2NoYW5nZV9cbiAqIEBmaXJlcyBQbGF5ZXIjdGV4dHRyYWNrY2hhbmdlXG4gKiBAbGlzdGVucyBUZWNoI3RleHR0cmFja2NoYW5nZVxuICovXG4ndGV4dHRyYWNrY2hhbmdlJ107XG5cbi8vIGV2ZW50cyB0byBxdWV1ZSB3aGVuIHBsYXliYWNrIHJhdGUgaXMgemVyb1xuLy8gdGhpcyBpcyBhIGhhc2ggZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgbWFwcGluZyBub24tY2FtZWwtY2FzZWQgZXZlbnQgbmFtZXNcbi8vIHRvIGNhbWVsLWNhc2VkIGZ1bmN0aW9uIG5hbWVzXG52YXIgVEVDSF9FVkVOVFNfUVVFVUUgPSB7XG4gIGNhbnBsYXk6ICdDYW5QbGF5JyxcbiAgY2FucGxheXRocm91Z2g6ICdDYW5QbGF5VGhyb3VnaCcsXG4gIHBsYXlpbmc6ICdQbGF5aW5nJyxcbiAgc2Vla2VkOiAnU2Vla2VkJ1xufTtcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGUgYFBsYXllcmAgY2xhc3MgaXMgY3JlYXRlZCB3aGVuIGFueSBvZiB0aGUgVmlkZW8uanMgc2V0dXAgbWV0aG9kc1xuICogYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIHZpZGVvLlxuICpcbiAqIEFmdGVyIGFuIGluc3RhbmNlIGhhcyBiZWVuIGNyZWF0ZWQgaXQgY2FuIGJlIGFjY2Vzc2VkIGdsb2JhbGx5IGluIHR3byB3YXlzOlxuICogMS4gQnkgY2FsbGluZyBgdmlkZW9qcygnZXhhbXBsZV92aWRlb18xJyk7YFxuICogMi4gQnkgdXNpbmcgaXQgZGlyZWN0bHkgdmlhICBgdmlkZW9qcy5wbGF5ZXJzLmV4YW1wbGVfdmlkZW9fMTtgXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cblxudmFyIFBsYXllciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGluaGVyaXRzKFBsYXllciwgX0NvbXBvbmVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhZ1xuICAgKiAgICAgICAgVGhlIG9yaWdpbmFsIHZpZGVvIERPTSBlbGVtZW50IHVzZWQgZm9yIGNvbmZpZ3VyaW5nIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21wb25lbnR+UmVhZHlDYWxsYmFja30gW3JlYWR5XVxuICAgKiAgICAgICAgUmVhZHkgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBQbGF5ZXIodGFnLCBvcHRpb25zLCByZWFkeSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYXllcik7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGFnIElEIGV4aXN0c1xuICAgIHRhZy5pZCA9IHRhZy5pZCB8fCBvcHRpb25zLmlkIHx8ICd2anNfdmlkZW9fJyArIG5ld0dVSUQoKTtcblxuICAgIC8vIFNldCBPcHRpb25zXG4gICAgLy8gVGhlIG9wdGlvbnMgYXJndW1lbnQgb3ZlcnJpZGVzIG9wdGlvbnMgc2V0IGluIHRoZSB2aWRlbyB0YWdcbiAgICAvLyB3aGljaCBvdmVycmlkZXMgZ2xvYmFsbHkgc2V0IG9wdGlvbnMuXG4gICAgLy8gVGhpcyBsYXR0ZXIgcGFydCBjb2luY2lkZXMgd2l0aCB0aGUgbG9hZCBvcmRlclxuICAgIC8vICh0YWcgbXVzdCBleGlzdCBiZWZvcmUgUGxheWVyKVxuICAgIG9wdGlvbnMgPSBhc3NpZ24oUGxheWVyLmdldFRhZ1NldHRpbmdzKHRhZyksIG9wdGlvbnMpO1xuXG4gICAgLy8gRGVsYXkgdGhlIGluaXRpYWxpemF0aW9uIG9mIGNoaWxkcmVuIGJlY2F1c2Ugd2UgbmVlZCB0byBzZXQgdXBcbiAgICAvLyBwbGF5ZXIgcHJvcGVydGllcyBmaXJzdCwgYW5kIGNhbid0IHVzZSBgdGhpc2AgYmVmb3JlIGBzdXBlcigpYFxuICAgIG9wdGlvbnMuaW5pdENoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAvLyBTYW1lIHdpdGggY3JlYXRpbmcgdGhlIGVsZW1lbnRcbiAgICBvcHRpb25zLmNyZWF0ZUVsID0gZmFsc2U7XG5cbiAgICAvLyBkb24ndCBhdXRvIG1peGluIHRoZSBldmVudGVkIG1peGluXG4gICAgb3B0aW9ucy5ldmVudGVkID0gZmFsc2U7XG5cbiAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSBwbGF5ZXIgdG8gcmVwb3J0IHRvdWNoIGFjdGl2aXR5IG9uIGl0c2VsZlxuICAgIC8vIHNlZSBlbmFibGVUb3VjaEFjdGl2aXR5IGluIENvbXBvbmVudFxuICAgIG9wdGlvbnMucmVwb3J0VG91Y2hBY3Rpdml0eSA9IGZhbHNlO1xuXG4gICAgLy8gSWYgbGFuZ3VhZ2UgaXMgbm90IHNldCwgZ2V0IHRoZSBjbG9zZXN0IGxhbmcgYXR0cmlidXRlXG4gICAgaWYgKCFvcHRpb25zLmxhbmd1YWdlKSB7XG4gICAgICBpZiAodHlwZW9mIHRhZy5jbG9zZXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBjbG9zZXN0ID0gdGFnLmNsb3Nlc3QoJ1tsYW5nXScpO1xuXG4gICAgICAgIGlmIChjbG9zZXN0ICYmIGNsb3Nlc3QuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgICAgb3B0aW9ucy5sYW5ndWFnZSA9IGNsb3Nlc3QuZ2V0QXR0cmlidXRlKCdsYW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gdGFnO1xuXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICBpZiAoZ2V0QXR0cmlidXRlcyhlbGVtZW50KS5oYXNPd25Qcm9wZXJ0eSgnbGFuZycpKSB7XG4gICAgICAgICAgICBvcHRpb25zLmxhbmd1YWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2xhbmcnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUnVuIGJhc2UgY29tcG9uZW50IGluaXRpYWxpemluZyB3aXRoIG5ldyBvcHRpb25zXG5cbiAgICAvLyBUcmFja3Mgd2hlbiBhIHRlY2ggY2hhbmdlcyB0aGUgcG9zdGVyXG4gICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgbnVsbCwgb3B0aW9ucywgcmVhZHkpKTtcblxuICAgIF90aGlzLmlzUG9zdGVyRnJvbVRlY2hfID0gZmFsc2U7XG5cbiAgICAvLyBIb2xkcyBjYWxsYmFjayBpbmZvIHRoYXQgZ2V0cyBxdWV1ZWQgd2hlbiBwbGF5YmFjayByYXRlIGlzIHplcm9cbiAgICAvLyBhbmQgYSBzZWVrIGlzIGhhcHBlbmluZ1xuICAgIF90aGlzLnF1ZXVlZENhbGxiYWNrc18gPSBbXTtcblxuICAgIC8vIFR1cm4gb2ZmIEFQSSBhY2Nlc3MgYmVjYXVzZSB3ZSdyZSBsb2FkaW5nIGEgbmV3IHRlY2ggdGhhdCBtaWdodCBsb2FkIGFzeW5jaHJvbm91c2x5XG4gICAgX3RoaXMuaXNSZWFkeV8gPSBmYWxzZTtcblxuICAgIC8vIEluaXQgc3RhdGUgaGFzU3RhcnRlZF9cbiAgICBfdGhpcy5oYXNTdGFydGVkXyA9IGZhbHNlO1xuXG4gICAgLy8gSW5pdCBzdGF0ZSB1c2VyQWN0aXZlX1xuICAgIF90aGlzLnVzZXJBY3RpdmVfID0gZmFsc2U7XG5cbiAgICAvLyBpZiB0aGUgZ2xvYmFsIG9wdGlvbiBvYmplY3Qgd2FzIGFjY2lkZW50YWxseSBibG93biBhd2F5IGJ5XG4gICAgLy8gc29tZW9uZSwgYmFpbCBlYXJseSB3aXRoIGFuIGluZm9ybWF0aXZlIGVycm9yXG4gICAgaWYgKCFfdGhpcy5vcHRpb25zXyB8fCAhX3RoaXMub3B0aW9uc18udGVjaE9yZGVyIHx8ICFfdGhpcy5vcHRpb25zXy50ZWNoT3JkZXIubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRlY2hPcmRlciBzcGVjaWZpZWQuIERpZCB5b3Ugb3ZlcndyaXRlICcgKyAndmlkZW9qcy5vcHRpb25zIGluc3RlYWQgb2YganVzdCBjaGFuZ2luZyB0aGUgJyArICdwcm9wZXJ0aWVzIHlvdSB3YW50IHRvIG92ZXJyaWRlPycpO1xuICAgIH1cblxuICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCB0YWcgdXNlZCB0byBzZXQgb3B0aW9uc1xuICAgIF90aGlzLnRhZyA9IHRhZztcblxuICAgIC8vIFN0b3JlIHRoZSB0YWcgYXR0cmlidXRlcyB1c2VkIHRvIHJlc3RvcmUgaHRtbDUgZWxlbWVudFxuICAgIF90aGlzLnRhZ0F0dHJpYnV0ZXMgPSB0YWcgJiYgZ2V0QXR0cmlidXRlcyh0YWcpO1xuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICBfdGhpcy5sYW5ndWFnZShfdGhpcy5vcHRpb25zXy5sYW5ndWFnZSk7XG5cbiAgICAvLyBVcGRhdGUgU3VwcG9ydGVkIExhbmd1YWdlc1xuICAgIGlmIChvcHRpb25zLmxhbmd1YWdlcykge1xuICAgICAgLy8gTm9ybWFsaXNlIHBsYXllciBvcHRpb24gbGFuZ3VhZ2VzIHRvIGxvd2VyY2FzZVxuICAgICAgdmFyIGxhbmd1YWdlc1RvTG93ZXIgPSB7fTtcblxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob3B0aW9ucy5sYW5ndWFnZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUkJDEpIHtcbiAgICAgICAgbGFuZ3VhZ2VzVG9Mb3dlcltuYW1lJCQxLnRvTG93ZXJDYXNlKCldID0gb3B0aW9ucy5sYW5ndWFnZXNbbmFtZSQkMV07XG4gICAgICB9KTtcbiAgICAgIF90aGlzLmxhbmd1YWdlc18gPSBsYW5ndWFnZXNUb0xvd2VyO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5sYW5ndWFnZXNfID0gUGxheWVyLnByb3RvdHlwZS5vcHRpb25zXy5sYW5ndWFnZXM7XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgZm9yIHZpZGVvIHByb3BlcnR5IHZhbHVlcy5cbiAgICBfdGhpcy5jYWNoZV8gPSB7fTtcblxuICAgIC8vIFNldCBwb3N0ZXJcbiAgICBfdGhpcy5wb3N0ZXJfID0gb3B0aW9ucy5wb3N0ZXIgfHwgJyc7XG5cbiAgICAvLyBTZXQgY29udHJvbHNcbiAgICBfdGhpcy5jb250cm9sc18gPSAhIW9wdGlvbnMuY29udHJvbHM7XG5cbiAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGxhc3RWb2x1bWVcbiAgICBfdGhpcy5jYWNoZV8ubGFzdFZvbHVtZSA9IDE7XG5cbiAgICAvLyBPcmlnaW5hbCB0YWcgc2V0dGluZ3Mgc3RvcmVkIGluIG9wdGlvbnNcbiAgICAvLyBub3cgcmVtb3ZlIGltbWVkaWF0ZWx5IHNvIG5hdGl2ZSBjb250cm9scyBkb24ndCBmbGFzaC5cbiAgICAvLyBNYXkgYmUgdHVybmVkIGJhY2sgb24gYnkgSFRNTDUgdGVjaCBpZiBuYXRpdmVDb250cm9sc0ZvclRvdWNoIGlzIHRydWVcbiAgICB0YWcuY29udHJvbHMgPSBmYWxzZTtcbiAgICB0YWcucmVtb3ZlQXR0cmlidXRlKCdjb250cm9scycpO1xuXG4gICAgLy8gdGhlIGF0dHJpYnV0ZSBvdmVycmlkZXMgdGhlIG9wdGlvblxuICAgIGlmICh0YWcuaGFzQXR0cmlidXRlKCdhdXRvcGxheScpKSB7XG4gICAgICBfdGhpcy5vcHRpb25zXy5hdXRvcGxheSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIHNldHRlciB0byB2YWxpZGF0ZSBhbmRcbiAgICAgIC8vIHNldCB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICAgIF90aGlzLmF1dG9wbGF5KF90aGlzLm9wdGlvbnNfLmF1dG9wbGF5KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFN0b3JlIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBzY3J1YmJpbmdcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdXNlciBpcyBzY3J1YmJpbmdcbiAgICAgKi9cbiAgICBfdGhpcy5zY3J1YmJpbmdfID0gZmFsc2U7XG5cbiAgICBfdGhpcy5lbF8gPSBfdGhpcy5jcmVhdGVFbCgpO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdmFsdWUgZm9yIGxhc3RQbGF5YmFja1JhdGVcbiAgICBfdGhpcy5jYWNoZV8ubGFzdFBsYXliYWNrUmF0ZSA9IF90aGlzLmRlZmF1bHRQbGF5YmFja1JhdGUoKTtcblxuICAgIC8vIE1ha2UgdGhpcyBhbiBldmVudGVkIG9iamVjdCBhbmQgdXNlIGBlbF9gIGFzIGl0cyBldmVudCBidXMuXG4gICAgZXZlbnRlZChfdGhpcywgeyBldmVudEJ1c0tleTogJ2VsXycgfSk7XG5cbiAgICAvLyBXZSBhbHNvIHdhbnQgdG8gcGFzcyB0aGUgb3JpZ2luYWwgcGxheWVyIG9wdGlvbnMgdG8gZWFjaCBjb21wb25lbnQgYW5kIHBsdWdpblxuICAgIC8vIGFzIHdlbGwgc28gdGhleSBkb24ndCBuZWVkIHRvIHJlYWNoIGJhY2sgaW50byB0aGUgcGxheWVyIGZvciBvcHRpb25zIGxhdGVyLlxuICAgIC8vIFdlIGFsc28gbmVlZCB0byBkbyBhbm90aGVyIGNvcHkgb2YgdGhpcy5vcHRpb25zXyBzbyB3ZSBkb24ndCBlbmQgdXAgd2l0aFxuICAgIC8vIGFuIGluZmluaXRlIGxvb3AuXG4gICAgdmFyIHBsYXllck9wdGlvbnNDb3B5ID0gbWVyZ2VPcHRpb25zKF90aGlzLm9wdGlvbnNfKTtcblxuICAgIC8vIExvYWQgcGx1Z2luc1xuICAgIGlmIChvcHRpb25zLnBsdWdpbnMpIHtcbiAgICAgIHZhciBwbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zO1xuXG4gICAgICBPYmplY3Qua2V5cyhwbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1tuYW1lJCQxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRoaXNbbmFtZSQkMV0ocGx1Z2luc1tuYW1lJCQxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwbHVnaW4gXCInICsgbmFtZSQkMSArICdcIiBkb2VzIG5vdCBleGlzdCcpO1xuICAgICAgICB9XG4gICAgICB9LCBfdGhpcyk7XG4gICAgfVxuXG4gICAgX3RoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucyA9IHBsYXllck9wdGlvbnNDb3B5O1xuXG4gICAgX3RoaXMubWlkZGxld2FyZV8gPSBbXTtcblxuICAgIF90aGlzLmluaXRDaGlsZHJlbigpO1xuXG4gICAgLy8gU2V0IGlzQXVkaW8gYmFzZWQgb24gd2hldGhlciBvciBub3QgYW4gYXVkaW8gdGFnIHdhcyB1c2VkXG4gICAgX3RoaXMuaXNBdWRpbyh0YWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2F1ZGlvJyk7XG5cbiAgICAvLyBVcGRhdGUgY29udHJvbHMgY2xhc3NOYW1lLiBDYW4ndCBkbyB0aGlzIHdoZW4gdGhlIGNvbnRyb2xzIGFyZSBpbml0aWFsbHlcbiAgICAvLyBzZXQgYmVjYXVzZSB0aGUgZWxlbWVudCBkb2Vzbid0IGV4aXN0IHlldC5cbiAgICBpZiAoX3RoaXMuY29udHJvbHMoKSkge1xuICAgICAgX3RoaXMuYWRkQ2xhc3MoJ3Zqcy1jb250cm9scy1lbmFibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzLmFkZENsYXNzKCd2anMtY29udHJvbHMtZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgQVJJQSBsYWJlbCBhbmQgcmVnaW9uIHJvbGUgZGVwZW5kaW5nIG9uIHBsYXllciB0eXBlXG4gICAgX3RoaXMuZWxfLnNldEF0dHJpYnV0ZSgncm9sZScsICdyZWdpb24nKTtcbiAgICBpZiAoX3RoaXMuaXNBdWRpbygpKSB7XG4gICAgICBfdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgX3RoaXMubG9jYWxpemUoJ0F1ZGlvIFBsYXllcicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIF90aGlzLmxvY2FsaXplKCdWaWRlbyBQbGF5ZXInKSk7XG4gICAgfVxuXG4gICAgaWYgKF90aGlzLmlzQXVkaW8oKSkge1xuICAgICAgX3RoaXMuYWRkQ2xhc3MoJ3Zqcy1hdWRpbycpO1xuICAgIH1cblxuICAgIGlmIChfdGhpcy5mbGV4Tm90U3VwcG9ydGVkXygpKSB7XG4gICAgICBfdGhpcy5hZGRDbGFzcygndmpzLW5vLWZsZXgnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBNYWtlIHRoaXMgc21hcnRlci4gVG9nZ2xlIHVzZXIgc3RhdGUgYmV0d2VlbiB0b3VjaGluZy9tb3VzaW5nXG4gICAgLy8gdXNpbmcgZXZlbnRzLCBzaW5jZSBkZXZpY2VzIGNhbiBoYXZlIGJvdGggdG91Y2ggYW5kIG1vdXNlIGV2ZW50cy5cbiAgICAvLyBpZiAoYnJvd3Nlci5UT1VDSF9FTkFCTEVEKSB7XG4gICAgLy8gICB0aGlzLmFkZENsYXNzKCd2anMtdG91Y2gtZW5hYmxlZCcpO1xuICAgIC8vIH1cblxuICAgIC8vIGlPUyBTYWZhcmkgaGFzIGJyb2tlbiBob3ZlciBoYW5kbGluZ1xuICAgIGlmICghSVNfSU9TKSB7XG4gICAgICBfdGhpcy5hZGRDbGFzcygndmpzLXdvcmtpbmdob3ZlcicpO1xuICAgIH1cblxuICAgIC8vIE1ha2UgcGxheWVyIGVhc2lseSBmaW5kYWJsZSBieSBJRFxuICAgIFBsYXllci5wbGF5ZXJzW190aGlzLmlkX10gPSBfdGhpcztcblxuICAgIC8vIEFkZCBhIG1ham9yIHZlcnNpb24gY2xhc3MgdG8gYWlkIGNzcyBpbiBwbHVnaW5zXG4gICAgdmFyIG1ham9yVmVyc2lvbiA9IHZlcnNpb24uc3BsaXQoJy4nKVswXTtcblxuICAgIF90aGlzLmFkZENsYXNzKCd2anMtdicgKyBtYWpvclZlcnNpb24pO1xuXG4gICAgLy8gV2hlbiB0aGUgcGxheWVyIGlzIGZpcnN0IGluaXRpYWxpemVkLCB0cmlnZ2VyIGFjdGl2aXR5IHNvIGNvbXBvbmVudHNcbiAgICAvLyBsaWtlIHRoZSBjb250cm9sIGJhciBzaG93IHRoZW1zZWx2ZXMgaWYgbmVlZGVkXG4gICAgX3RoaXMudXNlckFjdGl2ZSh0cnVlKTtcbiAgICBfdGhpcy5yZXBvcnRVc2VyQWN0aXZpdHkoKTtcblxuICAgIF90aGlzLm9uZSgncGxheScsIF90aGlzLmxpc3RlbkZvclVzZXJBY3Rpdml0eV8pO1xuICAgIF90aGlzLm9uKCdmdWxsc2NyZWVuY2hhbmdlJywgX3RoaXMuaGFuZGxlRnVsbHNjcmVlbkNoYW5nZV8pO1xuICAgIF90aGlzLm9uKCdzdGFnZWNsaWNrJywgX3RoaXMuaGFuZGxlU3RhZ2VDbGlja18pO1xuXG4gICAgX3RoaXMuY2hhbmdpbmdTcmNfID0gZmFsc2U7XG4gICAgX3RoaXMucGxheVdhaXRpbmdGb3JSZWFkeV8gPSBmYWxzZTtcbiAgICBfdGhpcy5wbGF5T25Mb2Fkc3RhcnRfID0gbnVsbDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIHZpZGVvIHBsYXllciBhbmQgZG9lcyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuXG4gICAqXG4gICAqIFRoaXMgaXMgZXNwZWNpYWxseSBoZWxwZnVsIGlmIHlvdSBhcmUgZHluYW1pY2FsbHkgYWRkaW5nIGFuZCByZW1vdmluZyB2aWRlb3NcbiAgICogdG8vZnJvbSB0aGUgRE9NLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2Rpc3Bvc2VcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5ZXIgaXMgYmVpbmcgZGlzcG9zZWQgb2YuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI2Rpc3Bvc2VcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdkaXNwb3NlJyk7XG4gICAgLy8gcHJldmVudCBkaXNwb3NlIGZyb20gYmVpbmcgY2FsbGVkIHR3aWNlXG4gICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnKTtcblxuICAgIGlmICh0aGlzLnN0eWxlRWxfICYmIHRoaXMuc3R5bGVFbF8ucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5zdHlsZUVsXy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc3R5bGVFbF8pO1xuICAgICAgdGhpcy5zdHlsZUVsXyA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gS2lsbCByZWZlcmVuY2UgdG8gdGhpcyBwbGF5ZXJcbiAgICBQbGF5ZXIucGxheWVyc1t0aGlzLmlkX10gPSBudWxsO1xuXG4gICAgaWYgKHRoaXMudGFnICYmIHRoaXMudGFnLnBsYXllcikge1xuICAgICAgdGhpcy50YWcucGxheWVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbF8gJiYgdGhpcy5lbF8ucGxheWVyKSB7XG4gICAgICB0aGlzLmVsXy5wbGF5ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnRlY2hfLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuaXNQb3N0ZXJGcm9tVGVjaF8gPSBmYWxzZTtcbiAgICAgIHRoaXMucG9zdGVyXyA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBsYXllckVsSW5nZXN0Xykge1xuICAgICAgdGhpcy5wbGF5ZXJFbEluZ2VzdF8gPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhZykge1xuICAgICAgdGhpcy50YWcgPSBudWxsO1xuICAgIH1cblxuICAgIGNsZWFyQ2FjaGVGb3JQbGF5ZXIodGhpcyk7XG5cbiAgICAvLyB0aGUgYWN0dWFsIC5lbF8gaXMgcmVtb3ZlZCBoZXJlXG4gICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGBQbGF5ZXJgJ3MgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqICAgICAgICAgVGhlIERPTSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLlxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHtcbiAgICB2YXIgdGFnID0gdGhpcy50YWc7XG4gICAgdmFyIGVsID0gdm9pZCAwO1xuICAgIHZhciBwbGF5ZXJFbEluZ2VzdCA9IHRoaXMucGxheWVyRWxJbmdlc3RfID0gdGFnLnBhcmVudE5vZGUgJiYgdGFnLnBhcmVudE5vZGUuaGFzQXR0cmlidXRlICYmIHRhZy5wYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnZGF0YS12anMtcGxheWVyJyk7XG4gICAgdmFyIGRpdkVtYmVkID0gdGhpcy50YWcudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndmlkZW8tanMnO1xuXG4gICAgaWYgKHBsYXllckVsSW5nZXN0KSB7XG4gICAgICBlbCA9IHRoaXMuZWxfID0gdGFnLnBhcmVudE5vZGU7XG4gICAgfSBlbHNlIGlmICghZGl2RW1iZWQpIHtcbiAgICAgIGVsID0gdGhpcy5lbF8gPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnKTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IG92ZXIgYWxsIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHRhZywgaW5jbHVkaW5nIElEIGFuZCBjbGFzc1xuICAgIC8vIElEIHdpbGwgbm93IHJlZmVyZW5jZSBwbGF5ZXIgYm94LCBub3QgdGhlIHZpZGVvIHRhZ1xuICAgIHZhciBhdHRycyA9IGdldEF0dHJpYnV0ZXModGFnKTtcblxuICAgIGlmIChkaXZFbWJlZCkge1xuICAgICAgZWwgPSB0aGlzLmVsXyA9IHRhZztcbiAgICAgIHRhZyA9IHRoaXMudGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgIHdoaWxlIChlbC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgdGFnLmFwcGVuZENoaWxkKGVsLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWhhc0NsYXNzKGVsLCAndmlkZW8tanMnKSkge1xuICAgICAgICBhZGRDbGFzcyhlbCwgJ3ZpZGVvLWpzJyk7XG4gICAgICB9XG5cbiAgICAgIGVsLmFwcGVuZENoaWxkKHRhZyk7XG5cbiAgICAgIHBsYXllckVsSW5nZXN0ID0gdGhpcy5wbGF5ZXJFbEluZ2VzdF8gPSBlbDtcblxuICAgICAgLy8gY29weSBvdmVyIHByb3BlcnRpZXMgZnJvbSB0aGUgdmlkZW8tanMgZWxlbWVudFxuICAgICAgLy8gaWU4IGRvZXNuJ3Qgc3VwcG9ydCBPYmplY3Qua2V5cyBub3IgaGFzT3duUHJvcGVydHlcbiAgICAgIC8vIG9uIGRvbSBlbGVtZW50cyBzbyB3ZSBoYXZlIHRvIHNwZWNpZnkgcHJvcGVydGllcyBpbmRpdmlkdWFsbHlcbiAgICAgIFsnYXV0b3BsYXknLCAnY29udHJvbHMnLCAnY3Jvc3NPcmlnaW4nLCAnZGVmYXVsdE11dGVkJywgJ2RlZmF1bHRQbGF5YmFja1JhdGUnLCAnbG9vcCcsICdtdXRlZCcsICdwbGF5YmFja1JhdGUnLCAnc3JjJywgJ3ZvbHVtZSddLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbFtwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0YWdbcHJvcF0gPSBlbFtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHRhYmluZGV4IHRvIC0xIHRvIHJlbW92ZSB0aGUgdmlkZW8gZWxlbWVudCBmcm9tIHRoZSBmb2N1cyBvcmRlclxuICAgIHRhZy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgLy8gV29ya2Fyb3VuZCBmb3IgIzQ1ODMgKEpBV1MrSUUgZG9lc24ndCBhbm5vdW5jZSBCUEIgb3IgcGxheSBidXR0b24pXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9GcmVlZG9tU2NpZW50aWZpYy9WRk8tc3RhbmRhcmRzLXN1cHBvcnQvaXNzdWVzLzc4XG4gICAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGRldGVjdCBpZiBKQVdTIGlzIGJlaW5nIHVzZWQsIGJ1dCB0aGlzIEFSSUEgYXR0cmlidXRlXG4gICAgLy8gIGRvZXNuJ3QgY2hhbmdlIGJlaGF2aW9yIG9mIElFMTEgaWYgSkFXUyBpcyBub3QgYmVpbmcgdXNlZFxuICAgIGlmIChJRV9WRVJTSU9OKSB7XG4gICAgICB0YWcuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FwcGxpY2F0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHdpZHRoL2hlaWdodCBhdHRycyBmcm9tIHRhZyBzbyBDU1MgY2FuIG1ha2UgaXQgMTAwJSB3aWR0aC9oZWlnaHRcbiAgICB0YWcucmVtb3ZlQXR0cmlidXRlKCd3aWR0aCcpO1xuICAgIHRhZy5yZW1vdmVBdHRyaWJ1dGUoJ2hlaWdodCcpO1xuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgIC8vIHdvcmthcm91bmQgc28gd2UgZG9uJ3QgdG90YWxseSBicmVhayBJRTdcbiAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzY1MzQ0NC9jc3Mtc3R5bGVzLW5vdC1hcHBsaWVkLW9uLWR5bmFtaWMtZWxlbWVudHMtaW4taW50ZXJuZXQtZXhwbG9yZXItN1xuICAgICAgaWYgKGF0dHIgPT09ICdjbGFzcycpIHtcbiAgICAgICAgZWwuY2xhc3NOYW1lICs9ICcgJyArIGF0dHJzW2F0dHJdO1xuXG4gICAgICAgIGlmIChkaXZFbWJlZCkge1xuICAgICAgICAgIHRhZy5jbGFzc05hbWUgKz0gJyAnICsgYXR0cnNbYXR0cl07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSk7XG5cbiAgICAgICAgaWYgKGRpdkVtYmVkKSB7XG4gICAgICAgICAgdGFnLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSB0YWcgaWQvY2xhc3MgZm9yIHVzZSBhcyBIVE1MNSBwbGF5YmFjayB0ZWNoXG4gICAgLy8gTWlnaHQgdGhpbmsgd2Ugc2hvdWxkIGRvIHRoaXMgYWZ0ZXIgZW1iZWRkaW5nIGluIGNvbnRhaW5lciBzbyAudmpzLXRlY2ggY2xhc3NcbiAgICAvLyBkb2Vzbid0IGZsYXNoIDEwMCUgd2lkdGgvaGVpZ2h0LCBidXQgY2xhc3Mgb25seSBhcHBsaWVzIHdpdGggLnZpZGVvLWpzIHBhcmVudFxuICAgIHRhZy5wbGF5ZXJJZCA9IHRhZy5pZDtcbiAgICB0YWcuaWQgKz0gJ19odG1sNV9hcGknO1xuICAgIHRhZy5jbGFzc05hbWUgPSAndmpzLXRlY2gnO1xuXG4gICAgLy8gTWFrZSBwbGF5ZXIgZmluZGFibGUgb24gZWxlbWVudHNcbiAgICB0YWcucGxheWVyID0gZWwucGxheWVyID0gdGhpcztcbiAgICAvLyBEZWZhdWx0IHN0YXRlIG9mIHZpZGVvIGlzIHBhdXNlZFxuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1wYXVzZWQnKTtcblxuICAgIC8vIEFkZCBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHBsYXllciB0aGF0IHdlJ2xsIHVzZSB0byBzZXQgdGhlIHdpZHRoL2hlaWdodFxuICAgIC8vIG9mIHRoZSBwbGF5ZXIgaW4gYSB3YXkgdGhhdCdzIHN0aWxsIG92ZXJyaWRlYWJsZSBieSBDU1MsIGp1c3QgbGlrZSB0aGVcbiAgICAvLyB2aWRlbyBlbGVtZW50XG4gICAgaWYgKHdpbmRvdy5WSURFT0pTX05PX0RZTkFNSUNfU1RZTEUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuc3R5bGVFbF8gPSBjcmVhdGVTdHlsZUVsZW1lbnQoJ3Zqcy1zdHlsZXMtZGltZW5zaW9ucycpO1xuICAgICAgdmFyIGRlZmF1bHRzU3R5bGVFbCA9ICQoJy52anMtc3R5bGVzLWRlZmF1bHRzJyk7XG4gICAgICB2YXIgaGVhZCA9ICQoJ2hlYWQnKTtcblxuICAgICAgaGVhZC5pbnNlcnRCZWZvcmUodGhpcy5zdHlsZUVsXywgZGVmYXVsdHNTdHlsZUVsID8gZGVmYXVsdHNTdHlsZUVsLm5leHRTaWJsaW5nIDogaGVhZC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBQYXNzIGluIHRoZSB3aWR0aC9oZWlnaHQvYXNwZWN0UmF0aW8gb3B0aW9ucyB3aGljaCB3aWxsIHVwZGF0ZSB0aGUgc3R5bGUgZWxcbiAgICB0aGlzLndpZHRoKHRoaXMub3B0aW9uc18ud2lkdGgpO1xuICAgIHRoaXMuaGVpZ2h0KHRoaXMub3B0aW9uc18uaGVpZ2h0KTtcbiAgICB0aGlzLmZsdWlkKHRoaXMub3B0aW9uc18uZmx1aWQpO1xuICAgIHRoaXMuYXNwZWN0UmF0aW8odGhpcy5vcHRpb25zXy5hc3BlY3RSYXRpbyk7XG5cbiAgICAvLyBIaWRlIGFueSBsaW5rcyB3aXRoaW4gdGhlIHZpZGVvL2F1ZGlvIHRhZywgYmVjYXVzZSBJRSBkb2Vzbid0IGhpZGUgdGhlbSBjb21wbGV0ZWx5LlxuICAgIHZhciBsaW5rcyA9IHRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpbmtFbCA9IGxpbmtzLml0ZW0oaSk7XG5cbiAgICAgIGFkZENsYXNzKGxpbmtFbCwgJ3Zqcy1oaWRkZW4nKTtcbiAgICAgIGxpbmtFbC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvLyBpbnNlcnRFbEZpcnN0IHNlZW1zIHRvIGNhdXNlIHRoZSBuZXR3b3JrU3RhdGUgdG8gZmxpY2tlciBmcm9tIDMgdG8gMiwgc29cbiAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBmb3IgbGF0ZXIgc28gd2UgY2FuIGtub3cgaWYgdGhlIHNvdXJjZSBvcmlnaW5hbGx5IGZhaWxlZFxuICAgIHRhZy5pbml0TmV0d29ya1N0YXRlXyA9IHRhZy5uZXR3b3JrU3RhdGU7XG5cbiAgICAvLyBXcmFwIHZpZGVvIHRhZyBpbiBkaXYgKGVsL2JveCkgY29udGFpbmVyXG4gICAgaWYgKHRhZy5wYXJlbnROb2RlICYmICFwbGF5ZXJFbEluZ2VzdCkge1xuICAgICAgdGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsLCB0YWcpO1xuICAgIH1cblxuICAgIC8vIGluc2VydCB0aGUgdGFnIGFzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgcGxheWVyIGVsZW1lbnRcbiAgICAvLyB0aGVuIG1hbnVhbGx5IGFkZCBpdCB0byB0aGUgY2hpbGRyZW4gYXJyYXkgc28gdGhhdCB0aGlzLmFkZENoaWxkXG4gICAgLy8gd2lsbCB3b3JrIHByb3Blcmx5IGZvciBvdGhlciBjb21wb25lbnRzXG4gICAgLy9cbiAgICAvLyBCcmVha3MgaVBob25lLCBmaXhlZCBpbiBIVE1MNSBzZXR1cC5cbiAgICBwcmVwZW5kVG8odGFnLCBlbCk7XG4gICAgdGhpcy5jaGlsZHJlbl8udW5zaGlmdCh0YWcpO1xuXG4gICAgLy8gU2V0IGxhbmcgYXR0ciBvbiBwbGF5ZXIgdG8gZW5zdXJlIENTUyA6bGFuZygpIGluIGNvbnNpc3RlbnQgd2l0aCBwbGF5ZXJcbiAgICAvLyBpZiBpdCdzIGJlZW4gc2V0IHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdG8gdGhlIGRvY1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnbGFuZycsIHRoaXMubGFuZ3VhZ2VfKTtcblxuICAgIHRoaXMuZWxfID0gZWw7XG5cbiAgICByZXR1cm4gZWw7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGBQbGF5ZXJgJ3Mgd2lkdGguIFJldHVybnMgdGhlIHBsYXllcidzIGNvbmZpZ3VyZWQgdmFsdWUuXG4gICAqIFRvIGdldCB0aGUgY3VycmVudCB3aWR0aCB1c2UgYGN1cnJlbnRXaWR0aCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZV1cbiAgICogICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgdGhlIGBQbGF5ZXJgJ3Mgd2lkdGggdG8uXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgYFBsYXllcmAgd2hlbiBnZXR0aW5nLlxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbiB3aWR0aCh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbignd2lkdGgnLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGBQbGF5ZXJgJ3MgaGVpZ2h0LiBSZXR1cm5zIHRoZSBwbGF5ZXIncyBjb25maWd1cmVkIHZhbHVlLlxuICAgKiBUbyBnZXQgdGhlIGN1cnJlbnQgaGVpZ2h0IHVzZSBgY3VycmVudGhlaWdodCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZV1cbiAgICogICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgdGhlIGBQbGF5ZXJgJ3MgaGVpZ3RoIHRvLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSBgUGxheWVyYCB3aGVuIGdldHRpbmcuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlvbiBoZWlnaHQodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24oJ2hlaWdodCcsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogQSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgYFBsYXllcmAncyB3aWR0aCAmIGhlaWdodC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRpbWVuc2lvblxuICAgKiAgICAgICAgVGhpcyBzdHJpbmcgY2FuIGJlOlxuICAgKiAgICAgICAgLSAnd2lkdGgnXG4gICAqICAgICAgICAtICdoZWlnaHQnXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdmFsdWVdXG4gICAqICAgICAgICBWYWx1ZSBmb3IgZGltZW5zaW9uIHNwZWNpZmllZCBpbiB0aGUgZmlyc3QgYXJndW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgZGltZW5zaW9uIGFyZ3VtZW50cyB2YWx1ZSB3aGVuIGdldHRpbmcgKHdpZHRoL2hlaWdodCkuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbiBkaW1lbnNpb24oX2RpbWVuc2lvbiwgdmFsdWUpIHtcbiAgICB2YXIgcHJpdkRpbWVuc2lvbiA9IF9kaW1lbnNpb24gKyAnXyc7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXNbcHJpdkRpbWVuc2lvbl0gfHwgMDtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAvLyBJZiBhbiBlbXB0eSBzdHJpbmcgaXMgZ2l2ZW4sIHJlc2V0IHRoZSBkaW1lbnNpb24gdG8gYmUgYXV0b21hdGljXG4gICAgICB0aGlzW3ByaXZEaW1lbnNpb25dID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy51cGRhdGVTdHlsZUVsXygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwYXJzZWRWYWwgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgIGlmIChpc05hTihwYXJzZWRWYWwpKSB7XG4gICAgICBsb2ckMS5lcnJvcignSW1wcm9wZXIgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgc3VwcGxpZWQgZm9yIGZvciAnICsgX2RpbWVuc2lvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpc1twcml2RGltZW5zaW9uXSA9IHBhcnNlZFZhbDtcbiAgICB0aGlzLnVwZGF0ZVN0eWxlRWxfKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyL3NldHRlci90b2dnbGVyIGZvciB0aGUgdmpzLWZsdWlkIGBjbGFzc05hbWVgIG9uIHRoZSBgUGxheWVyYC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYm9vbF1cbiAgICogICAgICAgIC0gQSB2YWx1ZSBvZiB0cnVlIGFkZHMgdGhlIGNsYXNzLlxuICAgKiAgICAgICAgLSBBIHZhbHVlIG9mIGZhbHNlIHJlbW92ZXMgdGhlIGNsYXNzLlxuICAgKiAgICAgICAgLSBObyB2YWx1ZSB3aWxsIHRvZ2dsZSB0aGUgZmx1aWQgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGZsdWlkIHdoZW4gZ2V0dGluZy5cbiAgICogICAgICAgICAtIGB1bmRlZmluZWRgIHdoZW4gc2V0dGluZy5cbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmZsdWlkID0gZnVuY3Rpb24gZmx1aWQoYm9vbCkge1xuICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmx1aWRfO1xuICAgIH1cblxuICAgIHRoaXMuZmx1aWRfID0gISFib29sO1xuXG4gICAgaWYgKGJvb2wpIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1mbHVpZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZmx1aWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0eWxlRWxfKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9TZXQgdGhlIGFzcGVjdCByYXRpb1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JhdGlvXVxuICAgKiAgICAgICAgQXNwZWN0IHJhdGlvIGZvciBwbGF5ZXJcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICogICAgICAgICByZXR1cm5zIHRoZSBjdXJyZW50IGFzcGVjdCByYXRpbyB3aGVuIGdldHRpbmdcbiAgICovXG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGBQbGF5ZXJgJ3MgYXNwZWN0IHJhdGlvLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JhdGlvXVxuICAgKiAgICAgICAgVGhlIHZhbHVlIHRvIHNldCB0aGUgYFBsYXllcidzIGFzcGVjdCByYXRpbyB0by5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICogICAgICAgICAtIFRoZSBjdXJyZW50IGFzcGVjdCByYXRpbyBvZiB0aGUgYFBsYXllcmAgd2hlbiBnZXR0aW5nLlxuICAgKiAgICAgICAgIC0gdW5kZWZpbmVkIHdoZW4gc2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuYXNwZWN0UmF0aW8gPSBmdW5jdGlvbiBhc3BlY3RSYXRpbyhyYXRpbykge1xuICAgIGlmIChyYXRpbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hc3BlY3RSYXRpb187XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHdpZHRoOmhlaWdodCBmb3JtYXRcbiAgICBpZiAoIS9eXFxkK1xcOlxcZCskLy50ZXN0KHJhdGlvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciB2YWx1ZSBzdXBwbGllZCBmb3IgYXNwZWN0IHJhdGlvLiBUaGUgZm9ybWF0IHNob3VsZCBiZSB3aWR0aDpoZWlnaHQsIGZvciBleGFtcGxlIDE2OjkuJyk7XG4gICAgfVxuICAgIHRoaXMuYXNwZWN0UmF0aW9fID0gcmF0aW87XG5cbiAgICAvLyBXZSdyZSBhc3N1bWluZyBpZiB5b3Ugc2V0IGFuIGFzcGVjdCByYXRpbyB5b3Ugd2FudCBmbHVpZCBtb2RlLFxuICAgIC8vIGJlY2F1c2UgaW4gZml4ZWQgbW9kZSB5b3UgY291bGQgY2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHQgeW91cnNlbGYuXG4gICAgdGhpcy5mbHVpZCh0cnVlKTtcblxuICAgIHRoaXMudXBkYXRlU3R5bGVFbF8oKTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHN0eWxlcyBvZiB0aGUgYFBsYXllcmAgZWxlbWVudCAoaGVpZ2h0LCB3aWR0aCBhbmQgYXNwZWN0IHJhdGlvKS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQGxpc3RlbnMgVGVjaCNsb2FkZWRtZXRhZGF0YVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUudXBkYXRlU3R5bGVFbF8gPSBmdW5jdGlvbiB1cGRhdGVTdHlsZUVsXygpIHtcbiAgICBpZiAod2luZG93LlZJREVPSlNfTk9fRFlOQU1JQ19TVFlMRSA9PT0gdHJ1ZSkge1xuICAgICAgdmFyIF93aWR0aCA9IHR5cGVvZiB0aGlzLndpZHRoXyA9PT0gJ251bWJlcicgPyB0aGlzLndpZHRoXyA6IHRoaXMub3B0aW9uc18ud2lkdGg7XG4gICAgICB2YXIgX2hlaWdodCA9IHR5cGVvZiB0aGlzLmhlaWdodF8gPT09ICdudW1iZXInID8gdGhpcy5oZWlnaHRfIDogdGhpcy5vcHRpb25zXy5oZWlnaHQ7XG4gICAgICB2YXIgdGVjaEVsID0gdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLmVsKCk7XG5cbiAgICAgIGlmICh0ZWNoRWwpIHtcbiAgICAgICAgaWYgKF93aWR0aCA+PSAwKSB7XG4gICAgICAgICAgdGVjaEVsLndpZHRoID0gX3dpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfaGVpZ2h0ID49IDApIHtcbiAgICAgICAgICB0ZWNoRWwuaGVpZ2h0ID0gX2hlaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdpZHRoID0gdm9pZCAwO1xuICAgIHZhciBoZWlnaHQgPSB2b2lkIDA7XG4gICAgdmFyIGFzcGVjdFJhdGlvID0gdm9pZCAwO1xuICAgIHZhciBpZENsYXNzID0gdm9pZCAwO1xuXG4gICAgLy8gVGhlIGFzcGVjdCByYXRpbyBpcyBlaXRoZXIgdXNlZCBkaXJlY3RseSBvciB0byBjYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodC5cbiAgICBpZiAodGhpcy5hc3BlY3RSYXRpb18gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmFzcGVjdFJhdGlvXyAhPT0gJ2F1dG8nKSB7XG4gICAgICAvLyBVc2UgYW55IGFzcGVjdFJhdGlvIHRoYXQncyBiZWVuIHNwZWNpZmljYWxseSBzZXRcbiAgICAgIGFzcGVjdFJhdGlvID0gdGhpcy5hc3BlY3RSYXRpb187XG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvV2lkdGgoKSA+IDApIHtcbiAgICAgIC8vIE90aGVyd2lzZSB0cnkgdG8gZ2V0IHRoZSBhc3BlY3QgcmF0aW8gZnJvbSB0aGUgdmlkZW8gbWV0YWRhdGFcbiAgICAgIGFzcGVjdFJhdGlvID0gdGhpcy52aWRlb1dpZHRoKCkgKyAnOicgKyB0aGlzLnZpZGVvSGVpZ2h0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9yIHVzZSBhIGRlZmF1bHQuIFRoZSB2aWRlbyBlbGVtZW50J3MgaXMgMjoxLCBidXQgMTY6OSBpcyBtb3JlIGNvbW1vbi5cbiAgICAgIGFzcGVjdFJhdGlvID0gJzE2OjknO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgcmF0aW8gYXMgYSBkZWNpbWFsIHdlIGNhbiB1c2UgdG8gY2FsY3VsYXRlIGRpbWVuc2lvbnNcbiAgICB2YXIgcmF0aW9QYXJ0cyA9IGFzcGVjdFJhdGlvLnNwbGl0KCc6Jyk7XG4gICAgdmFyIHJhdGlvTXVsdGlwbGllciA9IHJhdGlvUGFydHNbMV0gLyByYXRpb1BhcnRzWzBdO1xuXG4gICAgaWYgKHRoaXMud2lkdGhfICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFVzZSBhbnkgd2lkdGggdGhhdCdzIGJlZW4gc3BlY2lmaWNhbGx5IHNldFxuICAgICAgd2lkdGggPSB0aGlzLndpZHRoXztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaGVpZ2h0XyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBPciBjYWx1bGF0ZSB0aGUgd2lkdGggZnJvbSB0aGUgYXNwZWN0IHJhdGlvIGlmIGEgaGVpZ2h0IGhhcyBiZWVuIHNldFxuICAgICAgd2lkdGggPSB0aGlzLmhlaWdodF8gLyByYXRpb011bHRpcGxpZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9yIHVzZSB0aGUgdmlkZW8ncyBtZXRhZGF0YSwgb3IgdXNlIHRoZSB2aWRlbyBlbCdzIGRlZmF1bHQgb2YgMzAwXG4gICAgICB3aWR0aCA9IHRoaXMudmlkZW9XaWR0aCgpIHx8IDMwMDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oZWlnaHRfICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFVzZSBhbnkgaGVpZ2h0IHRoYXQncyBiZWVuIHNwZWNpZmljYWxseSBzZXRcbiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0XztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIGNhbGN1bGF0ZSB0aGUgaGVpZ2h0IGZyb20gdGhlIHJhdGlvIGFuZCB0aGUgd2lkdGhcbiAgICAgIGhlaWdodCA9IHdpZHRoICogcmF0aW9NdWx0aXBsaWVyO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgQ1NTIGNsYXNzIGlzIHZhbGlkIGJ5IHN0YXJ0aW5nIHdpdGggYW4gYWxwaGEgY2hhcmFjdGVyXG4gICAgaWYgKC9eW15hLXpBLVpdLy50ZXN0KHRoaXMuaWQoKSkpIHtcbiAgICAgIGlkQ2xhc3MgPSAnZGltZW5zaW9ucy0nICsgdGhpcy5pZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZENsYXNzID0gdGhpcy5pZCgpICsgJy1kaW1lbnNpb25zJztcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIHJpZ2h0IGNsYXNzIGlzIHN0aWxsIG9uIHRoZSBwbGF5ZXIgZm9yIHRoZSBzdHlsZSBlbGVtZW50XG4gICAgdGhpcy5hZGRDbGFzcyhpZENsYXNzKTtcblxuICAgIHNldFRleHRDb250ZW50KHRoaXMuc3R5bGVFbF8sICdcXG4gICAgICAuJyArIGlkQ2xhc3MgKyAnIHtcXG4gICAgICAgIHdpZHRoOiAnICsgd2lkdGggKyAncHg7XFxuICAgICAgICBoZWlnaHQ6ICcgKyBoZWlnaHQgKyAncHg7XFxuICAgICAgfVxcblxcbiAgICAgIC4nICsgaWRDbGFzcyArICcudmpzLWZsdWlkIHtcXG4gICAgICAgIHBhZGRpbmctdG9wOiAnICsgcmF0aW9NdWx0aXBsaWVyICogMTAwICsgJyU7XFxuICAgICAgfVxcbiAgICAnKTtcbiAgfTtcblxuICAvKipcbiAgICogTG9hZC9DcmVhdGUgYW4gaW5zdGFuY2Ugb2YgcGxheWJhY2sge0BsaW5rIFRlY2h9IGluY2x1ZGluZyBlbGVtZW50XG4gICAqIGFuZCBBUEkgbWV0aG9kcy4gVGhlbiBhcHBlbmQgdGhlIGBUZWNoYCBlbGVtZW50IGluIGBQbGF5ZXJgIGFzIGEgY2hpbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZWNoTmFtZVxuICAgKiAgICAgICAgbmFtZSBvZiB0aGUgcGxheWJhY2sgdGVjaG5vbG9neVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG4gICAqICAgICAgICB2aWRlbyBzb3VyY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmxvYWRUZWNoXyA9IGZ1bmN0aW9uIGxvYWRUZWNoXyh0ZWNoTmFtZSwgc291cmNlKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAvLyBQYXVzZSBhbmQgcmVtb3ZlIGN1cnJlbnQgcGxheWJhY2sgdGVjaG5vbG9neVxuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnVubG9hZFRlY2hfKCk7XG4gICAgfVxuXG4gICAgdmFyIHRpdGxlVGVjaE5hbWUgPSB0b1RpdGxlQ2FzZSh0ZWNoTmFtZSk7XG4gICAgdmFyIGNhbWVsVGVjaE5hbWUgPSB0ZWNoTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHRlY2hOYW1lLnNsaWNlKDEpO1xuXG4gICAgLy8gZ2V0IHJpZCBvZiB0aGUgSFRNTDUgdmlkZW8gdGFnIGFzIHNvb24gYXMgd2UgYXJlIHVzaW5nIGFub3RoZXIgdGVjaFxuICAgIGlmICh0aXRsZVRlY2hOYW1lICE9PSAnSHRtbDUnICYmIHRoaXMudGFnKSB7XG4gICAgICBUZWNoLmdldFRlY2goJ0h0bWw1JykuZGlzcG9zZU1lZGlhRWxlbWVudCh0aGlzLnRhZyk7XG4gICAgICB0aGlzLnRhZy5wbGF5ZXIgPSBudWxsO1xuICAgICAgdGhpcy50YWcgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMudGVjaE5hbWVfID0gdGl0bGVUZWNoTmFtZTtcblxuICAgIC8vIFR1cm4gb2ZmIEFQSSBhY2Nlc3MgYmVjYXVzZSB3ZSdyZSBsb2FkaW5nIGEgbmV3IHRlY2ggdGhhdCBtaWdodCBsb2FkIGFzeW5jaHJvbm91c2x5XG4gICAgdGhpcy5pc1JlYWR5XyA9IGZhbHNlO1xuXG4gICAgLy8gaWYgYXV0b3BsYXkgaXMgYSBzdHJpbmcgd2UgcGFzcyBmYWxzZSB0byB0aGUgdGVjaFxuICAgIC8vIGJlY2F1c2UgdGhlIHBsYXllciBpcyBnb2luZyB0byBoYW5kbGUgYXV0b3BsYXkgb24gYGxvYWRzdGFydGBcbiAgICB2YXIgYXV0b3BsYXkgPSB0eXBlb2YgdGhpcy5hdXRvcGxheSgpID09PSAnc3RyaW5nJyA/IGZhbHNlIDogdGhpcy5hdXRvcGxheSgpO1xuXG4gICAgLy8gR3JhYiB0ZWNoLXNwZWNpZmljIG9wdGlvbnMgZnJvbSBwbGF5ZXIgb3B0aW9ucyBhbmQgYWRkIHNvdXJjZSBhbmQgcGFyZW50IGVsZW1lbnQgdG8gdXNlLlxuICAgIHZhciB0ZWNoT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgYXV0b3BsYXk6IGF1dG9wbGF5LFxuICAgICAgJ25hdGl2ZUNvbnRyb2xzRm9yVG91Y2gnOiB0aGlzLm9wdGlvbnNfLm5hdGl2ZUNvbnRyb2xzRm9yVG91Y2gsXG4gICAgICAncGxheWVySWQnOiB0aGlzLmlkKCksXG4gICAgICAndGVjaElkJzogdGhpcy5pZCgpICsgJ18nICsgdGl0bGVUZWNoTmFtZSArICdfYXBpJyxcbiAgICAgICdwbGF5c2lubGluZSc6IHRoaXMub3B0aW9uc18ucGxheXNpbmxpbmUsXG4gICAgICAncHJlbG9hZCc6IHRoaXMub3B0aW9uc18ucHJlbG9hZCxcbiAgICAgICdsb29wJzogdGhpcy5vcHRpb25zXy5sb29wLFxuICAgICAgJ211dGVkJzogdGhpcy5vcHRpb25zXy5tdXRlZCxcbiAgICAgICdwb3N0ZXInOiB0aGlzLnBvc3RlcigpLFxuICAgICAgJ2xhbmd1YWdlJzogdGhpcy5sYW5ndWFnZSgpLFxuICAgICAgJ3BsYXllckVsSW5nZXN0JzogdGhpcy5wbGF5ZXJFbEluZ2VzdF8gfHwgZmFsc2UsXG4gICAgICAndnR0LmpzJzogdGhpcy5vcHRpb25zX1sndnR0LmpzJ10sXG4gICAgICAnY2FuT3ZlcnJpZGVQb3N0ZXInOiAhIXRoaXMub3B0aW9uc18udGVjaENhbk92ZXJyaWRlUG9zdGVyLFxuICAgICAgJ2VuYWJsZVNvdXJjZXNldCc6IHRoaXMub3B0aW9uc18uZW5hYmxlU291cmNlc2V0XG4gICAgfTtcblxuICAgIEFMTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7XG4gICAgICB2YXIgcHJvcHMgPSBBTExbbmFtZSQkMV07XG5cbiAgICAgIHRlY2hPcHRpb25zW3Byb3BzLmdldHRlck5hbWVdID0gX3RoaXMyW3Byb3BzLnByaXZhdGVOYW1lXTtcbiAgICB9KTtcblxuICAgIGFzc2lnbih0ZWNoT3B0aW9ucywgdGhpcy5vcHRpb25zX1t0aXRsZVRlY2hOYW1lXSk7XG4gICAgYXNzaWduKHRlY2hPcHRpb25zLCB0aGlzLm9wdGlvbnNfW2NhbWVsVGVjaE5hbWVdKTtcbiAgICBhc3NpZ24odGVjaE9wdGlvbnMsIHRoaXMub3B0aW9uc19bdGVjaE5hbWUudG9Mb3dlckNhc2UoKV0pO1xuXG4gICAgaWYgKHRoaXMudGFnKSB7XG4gICAgICB0ZWNoT3B0aW9ucy50YWcgPSB0aGlzLnRhZztcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICYmIHNvdXJjZS5zcmMgPT09IHRoaXMuY2FjaGVfLnNyYyAmJiB0aGlzLmNhY2hlXy5jdXJyZW50VGltZSA+IDApIHtcbiAgICAgIHRlY2hPcHRpb25zLnN0YXJ0VGltZSA9IHRoaXMuY2FjaGVfLmN1cnJlbnRUaW1lO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgdGVjaCBpbnN0YW5jZVxuICAgIHZhciBUZWNoQ2xhc3MgPSBUZWNoLmdldFRlY2godGVjaE5hbWUpO1xuXG4gICAgaWYgKCFUZWNoQ2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gVGVjaCBuYW1lZCBcXCcnICsgdGl0bGVUZWNoTmFtZSArICdcXCcgZXhpc3RzISBcXCcnICsgdGl0bGVUZWNoTmFtZSArICdcXCcgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdmlkZW9qcy5yZWdpc3RlclRlY2goKVxcJycpO1xuICAgIH1cblxuICAgIHRoaXMudGVjaF8gPSBuZXcgVGVjaENsYXNzKHRlY2hPcHRpb25zKTtcblxuICAgIC8vIHBsYXllci50cmlnZ2VyUmVhZHkgaXMgYWx3YXlzIGFzeW5jLCBzbyBkb24ndCBuZWVkIHRoaXMgdG8gYmUgYXN5bmNcbiAgICB0aGlzLnRlY2hfLnJlYWR5KGJpbmQodGhpcywgdGhpcy5oYW5kbGVUZWNoUmVhZHlfKSwgdHJ1ZSk7XG5cbiAgICB0ZXh0VHJhY2tDb252ZXJ0ZXIuanNvblRvVGV4dFRyYWNrcyh0aGlzLnRleHRUcmFja3NKc29uXyB8fCBbXSwgdGhpcy50ZWNoXyk7XG5cbiAgICAvLyBMaXN0ZW4gdG8gYWxsIEhUTUw1LWRlZmluZWQgZXZlbnRzIGFuZCB0cmlnZ2VyIHRoZW0gb24gdGhlIHBsYXllclxuICAgIFRFQ0hfRVZFTlRTX1JFVFJJR0dFUi5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgX3RoaXMyLm9uKF90aGlzMi50ZWNoXywgZXZlbnQsIF90aGlzMlsnaGFuZGxlVGVjaCcgKyB0b1RpdGxlQ2FzZShldmVudCkgKyAnXyddKTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5rZXlzKFRFQ0hfRVZFTlRTX1FVRVVFKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgX3RoaXMyLm9uKF90aGlzMi50ZWNoXywgZXZlbnQsIGZ1bmN0aW9uIChldmVudE9iaikge1xuICAgICAgICBpZiAoX3RoaXMyLnRlY2hfLnBsYXliYWNrUmF0ZSgpID09PSAwICYmIF90aGlzMi50ZWNoXy5zZWVraW5nKCkpIHtcbiAgICAgICAgICBfdGhpczIucXVldWVkQ2FsbGJhY2tzXy5wdXNoKHtcbiAgICAgICAgICAgIGNhbGxiYWNrOiBfdGhpczJbJ2hhbmRsZVRlY2gnICsgVEVDSF9FVkVOVFNfUVVFVUVbZXZlbnRdICsgJ18nXS5iaW5kKF90aGlzMiksXG4gICAgICAgICAgICBldmVudDogZXZlbnRPYmpcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMyWydoYW5kbGVUZWNoJyArIFRFQ0hfRVZFTlRTX1FVRVVFW2V2ZW50XSArICdfJ10oZXZlbnRPYmopO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdsb2Fkc3RhcnQnLCB0aGlzLmhhbmRsZVRlY2hMb2FkU3RhcnRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdzb3VyY2VzZXQnLCB0aGlzLmhhbmRsZVRlY2hTb3VyY2VzZXRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd3YWl0aW5nJywgdGhpcy5oYW5kbGVUZWNoV2FpdGluZ18pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2VuZGVkJywgdGhpcy5oYW5kbGVUZWNoRW5kZWRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdzZWVraW5nJywgdGhpcy5oYW5kbGVUZWNoU2Vla2luZ18pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3BsYXknLCB0aGlzLmhhbmRsZVRlY2hQbGF5Xyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAnZmlyc3RwbGF5JywgdGhpcy5oYW5kbGVUZWNoRmlyc3RQbGF5Xyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAncGF1c2UnLCB0aGlzLmhhbmRsZVRlY2hQYXVzZV8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy5oYW5kbGVUZWNoRHVyYXRpb25DaGFuZ2VfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdmdWxsc2NyZWVuY2hhbmdlJywgdGhpcy5oYW5kbGVUZWNoRnVsbHNjcmVlbkNoYW5nZV8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2Vycm9yJywgdGhpcy5oYW5kbGVUZWNoRXJyb3JfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdsb2FkZWRtZXRhZGF0YScsIHRoaXMudXBkYXRlU3R5bGVFbF8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3Bvc3RlcmNoYW5nZScsIHRoaXMuaGFuZGxlVGVjaFBvc3RlckNoYW5nZV8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3RleHRkYXRhJywgdGhpcy5oYW5kbGVUZWNoVGV4dERhdGFfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdyYXRlY2hhbmdlJywgdGhpcy5oYW5kbGVUZWNoUmF0ZUNoYW5nZV8pO1xuXG4gICAgdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzKHRoaXMudGVjaEdldF8oJ2NvbnRyb2xzJykpO1xuXG4gICAgaWYgKHRoaXMuY29udHJvbHMoKSAmJiAhdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzKCkpIHtcbiAgICAgIHRoaXMuYWRkVGVjaENvbnRyb2xzTGlzdGVuZXJzXygpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgdGVjaCBlbGVtZW50IGluIHRoZSBET00gaWYgaXQgd2FzIG5vdCBhbHJlYWR5IHRoZXJlXG4gICAgLy8gTWFrZSBzdXJlIHRvIG5vdCBpbnNlcnQgdGhlIG9yaWdpbmFsIHZpZGVvIGVsZW1lbnQgaWYgdXNpbmcgSHRtbDVcbiAgICBpZiAodGhpcy50ZWNoXy5lbCgpLnBhcmVudE5vZGUgIT09IHRoaXMuZWwoKSAmJiAodGl0bGVUZWNoTmFtZSAhPT0gJ0h0bWw1JyB8fCAhdGhpcy50YWcpKSB7XG4gICAgICBwcmVwZW5kVG8odGhpcy50ZWNoXy5lbCgpLCB0aGlzLmVsKCkpO1xuICAgIH1cblxuICAgIC8vIEdldCByaWQgb2YgdGhlIG9yaWdpbmFsIHZpZGVvIHRhZyByZWZlcmVuY2UgYWZ0ZXIgdGhlIGZpcnN0IHRlY2ggaXMgbG9hZGVkXG4gICAgaWYgKHRoaXMudGFnKSB7XG4gICAgICB0aGlzLnRhZy5wbGF5ZXIgPSBudWxsO1xuICAgICAgdGhpcy50YWcgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVW5sb2FkIGFuZCBkaXNwb3NlIG9mIHRoZSBjdXJyZW50IHBsYXliYWNrIHtAbGluayBUZWNofS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnVubG9hZFRlY2hfID0gZnVuY3Rpb24gdW5sb2FkVGVjaF8oKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHRleHQgdHJhY2tzIHNvIHRoYXQgd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRleHQgdHJhY2tzIHdpdGggdGhlIG5leHQgdGVjaFxuICAgIEFMTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7XG4gICAgICB2YXIgcHJvcHMgPSBBTExbbmFtZSQkMV07XG5cbiAgICAgIF90aGlzM1twcm9wcy5wcml2YXRlTmFtZV0gPSBfdGhpczNbcHJvcHMuZ2V0dGVyTmFtZV0oKTtcbiAgICB9KTtcbiAgICB0aGlzLnRleHRUcmFja3NKc29uXyA9IHRleHRUcmFja0NvbnZlcnRlci50ZXh0VHJhY2tzVG9Kc29uKHRoaXMudGVjaF8pO1xuXG4gICAgdGhpcy5pc1JlYWR5XyA9IGZhbHNlO1xuXG4gICAgdGhpcy50ZWNoXy5kaXNwb3NlKCk7XG5cbiAgICB0aGlzLnRlY2hfID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5pc1Bvc3RlckZyb21UZWNoXykge1xuICAgICAgdGhpcy5wb3N0ZXJfID0gJyc7XG4gICAgICB0aGlzLnRyaWdnZXIoJ3Bvc3RlcmNoYW5nZScpO1xuICAgIH1cblxuICAgIHRoaXMuaXNQb3N0ZXJGcm9tVGVjaF8gPSBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHtAbGluayBUZWNofS5cbiAgICogSXQgd2lsbCBwcmludCBhIHdhcm5pbmcgYnkgZGVmYXVsdCBhYm91dCB0aGUgZGFuZ2VyIG9mIHVzaW5nIHRoZSB0ZWNoIGRpcmVjdGx5XG4gICAqIGJ1dCBhbnkgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgaW4gd2lsbCBzaWxlbmNlIHRoZSB3YXJuaW5nLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IFtzYWZldHldXG4gICAqICAgICAgICBBbnl0aGluZyBwYXNzZWQgaW4gdG8gc2lsZW5jZSB0aGUgd2FybmluZ1xuICAgKlxuICAgKiBAcmV0dXJuIHtUZWNofVxuICAgKiAgICAgICAgIFRoZSBUZWNoXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS50ZWNoID0gZnVuY3Rpb24gdGVjaChzYWZldHkpIHtcbiAgICBpZiAoc2FmZXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvZyQxLndhcm4odHNtbChfdGVtcGxhdGVPYmplY3QkMSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRlY2hfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdXAgY2xpY2sgYW5kIHRvdWNoIGxpc3RlbmVycyBmb3IgdGhlIHBsYXliYWNrIGVsZW1lbnRcbiAgICpcbiAgICogLSBPbiBkZXNrdG9wczogYSBjbGljayBvbiB0aGUgdmlkZW8gaXRzZWxmIHdpbGwgdG9nZ2xlIHBsYXliYWNrXG4gICAqIC0gT24gbW9iaWxlIGRldmljZXM6IGEgY2xpY2sgb24gdGhlIHZpZGVvIHRvZ2dsZXMgY29udHJvbHNcbiAgICogICB3aGljaCBpcyBkb25lIGJ5IHRvZ2dsaW5nIHRoZSB1c2VyIHN0YXRlIGJldHdlZW4gYWN0aXZlIGFuZFxuICAgKiAgIGluYWN0aXZlXG4gICAqIC0gQSB0YXAgY2FuIHNpZ25hbCB0aGF0IGEgdXNlciBoYXMgYmVjb21lIGFjdGl2ZSBvciBoYXMgYmVjb21lIGluYWN0aXZlXG4gICAqICAgZS5nLiBhIHF1aWNrIHRhcCBvbiBhbiBpUGhvbmUgbW92aWUgc2hvdWxkIHJldmVhbCB0aGUgY29udHJvbHMuIEFub3RoZXJcbiAgICogICBxdWljayB0YXAgc2hvdWxkIGhpZGUgdGhlbSBhZ2FpbiAoc2lnbmFsaW5nIHRoZSB1c2VyIGlzIGluIGFuIGluYWN0aXZlXG4gICAqICAgdmlld2luZyBzdGF0ZSlcbiAgICogLSBJbiBhZGRpdGlvbiB0byB0aGlzLCB3ZSBzdGlsbCB3YW50IHRoZSB1c2VyIHRvIGJlIGNvbnNpZGVyZWQgaW5hY3RpdmUgYWZ0ZXJcbiAgICogICBhIGZldyBzZWNvbmRzIG9mIGluYWN0aXZpdHkuXG4gICAqXG4gICAqID4gTm90ZTogdGhlIG9ubHkgcGFydCBvZiBpT1MgaW50ZXJhY3Rpb24gd2UgY2FuJ3QgbWltaWMgd2l0aCB0aGlzIHNldHVwXG4gICAqIGlzIGEgdG91Y2ggYW5kIGhvbGQgb24gdGhlIHZpZGVvIGVsZW1lbnQgY291bnRpbmcgYXMgYWN0aXZpdHkgaW4gb3JkZXIgdG9cbiAgICoga2VlcCB0aGUgY29udHJvbHMgc2hvd2luZywgYnV0IHRoYXQgc2hvdWxkbid0IGJlIGFuIGlzc3VlLiBBIHRvdWNoIGFuZCBob2xkXG4gICAqIG9uIGFueSBjb250cm9scyB3aWxsIHN0aWxsIGtlZXAgdGhlIHVzZXIgYWN0aXZlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5hZGRUZWNoQ29udHJvbHNMaXN0ZW5lcnNfID0gZnVuY3Rpb24gYWRkVGVjaENvbnRyb2xzTGlzdGVuZXJzXygpIHtcbiAgICAvLyBNYWtlIHN1cmUgdG8gcmVtb3ZlIGFsbCB0aGUgcHJldmlvdXMgbGlzdGVuZXJzIGluIGNhc2Ugd2UgYXJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy5cbiAgICB0aGlzLnJlbW92ZVRlY2hDb250cm9sc0xpc3RlbmVyc18oKTtcblxuICAgIC8vIFNvbWUgYnJvd3NlcnMgKENocm9tZSAmIElFKSBkb24ndCB0cmlnZ2VyIGEgY2xpY2sgb24gYSBmbGFzaCBzd2YsIGJ1dCBkb1xuICAgIC8vIHRyaWdnZXIgbW91c2Vkb3duL3VwLlxuICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQ0NDU2Mi9qYXZhc2NyaXB0LW9uY2xpY2stZXZlbnQtb3Zlci1mbGFzaC1vYmplY3RcbiAgICAvLyBBbnkgdG91Y2ggZXZlbnRzIGFyZSBzZXQgdG8gYmxvY2sgdGhlIG1vdXNlZG93biBldmVudCBmcm9tIGhhcHBlbmluZ1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVGVjaENsaWNrXyk7XG5cbiAgICAvLyBJZiB0aGUgY29udHJvbHMgd2VyZSBoaWRkZW4gd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGNoYW5nZSB3aXRob3V0IGEgdGFwIGV2ZW50XG4gICAgLy8gc28gd2UnbGwgY2hlY2sgaWYgdGhlIGNvbnRyb2xzIHdlcmUgYWxyZWFkeSBzaG93aW5nIGJlZm9yZSByZXBvcnRpbmcgdXNlclxuICAgIC8vIGFjdGl2aXR5XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVGVjaFRvdWNoU3RhcnRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaE1vdmVfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVGVjaFRvdWNoRW5kXyk7XG5cbiAgICAvLyBUaGUgdGFwIGxpc3RlbmVyIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgdGhlIHRvdWNoZW5kIGxpc3RlbmVyIGJlY2F1c2UgdGhlIHRhcFxuICAgIC8vIGxpc3RlbmVyIGNhbmNlbHMgb3V0IGFueSByZXBvcnRlZFVzZXJBY3Rpdml0eSB3aGVuIHNldHRpbmcgdXNlckFjdGl2ZShmYWxzZSlcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0YXAnLCB0aGlzLmhhbmRsZVRlY2hUYXBfKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdXNlZCBmb3IgY2xpY2sgYW5kIHRhcCBjb250cm9scy4gVGhpcyBpcyBuZWVkZWQgZm9yXG4gICAqIHRvZ2dsaW5nIHRvIGNvbnRyb2xzIGRpc2FibGVkLCB3aGVyZSBhIHRhcC90b3VjaCBzaG91bGQgZG8gbm90aGluZy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnJlbW92ZVRlY2hDb250cm9sc0xpc3RlbmVyc18gPSBmdW5jdGlvbiByZW1vdmVUZWNoQ29udHJvbHNMaXN0ZW5lcnNfKCkge1xuICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ganVzdCB1c2UgYHRoaXMub2ZmKClgIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgb3RoZXIgbmVlZGVkXG4gICAgLy8gbGlzdGVuZXJzIGFkZGVkIGJ5IHRlY2hzIHRoYXQgZXh0ZW5kIHRoaXMuXG4gICAgdGhpcy5vZmYodGhpcy50ZWNoXywgJ3RhcCcsIHRoaXMuaGFuZGxlVGVjaFRhcF8pO1xuICAgIHRoaXMub2ZmKHRoaXMudGVjaF8sICd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUZWNoVG91Y2hTdGFydF8pO1xuICAgIHRoaXMub2ZmKHRoaXMudGVjaF8sICd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaE1vdmVfKTtcbiAgICB0aGlzLm9mZih0aGlzLnRlY2hfLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaEVuZF8pO1xuICAgIHRoaXMub2ZmKHRoaXMudGVjaF8sICdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRlY2hDbGlja18pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQbGF5ZXIgd2FpdHMgZm9yIHRoZSB0ZWNoIHRvIGJlIHJlYWR5XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoUmVhZHlfID0gZnVuY3Rpb24gaGFuZGxlVGVjaFJlYWR5XygpIHtcbiAgICB0aGlzLnRyaWdnZXJSZWFkeSgpO1xuXG4gICAgLy8gS2VlcCB0aGUgc2FtZSB2b2x1bWUgYXMgYmVmb3JlXG4gICAgaWYgKHRoaXMuY2FjaGVfLnZvbHVtZSkge1xuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFZvbHVtZScsIHRoaXMuY2FjaGVfLnZvbHVtZSk7XG4gICAgfVxuXG4gICAgLy8gTG9vayBpZiB0aGUgdGVjaCBmb3VuZCBhIGhpZ2hlciByZXNvbHV0aW9uIHBvc3RlciB3aGlsZSBsb2FkaW5nXG4gICAgdGhpcy5oYW5kbGVUZWNoUG9zdGVyQ2hhbmdlXygpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBkdXJhdGlvbiBpZiBhdmFpbGFibGVcbiAgICB0aGlzLmhhbmRsZVRlY2hEdXJhdGlvbkNoYW5nZV8oKTtcblxuICAgIC8vIENocm9tZSBhbmQgU2FmYXJpIGJvdGggaGF2ZSBpc3N1ZXMgd2l0aCBhdXRvcGxheS5cbiAgICAvLyBJbiBTYWZhcmkgKDUuMS4xKSwgd2hlbiB3ZSBtb3ZlIHRoZSB2aWRlbyBlbGVtZW50IGludG8gdGhlIGNvbnRhaW5lciBkaXYsIGF1dG9wbGF5IGRvZXNuJ3Qgd29yay5cbiAgICAvLyBJbiBDaHJvbWUgKDE1KSwgaWYgeW91IGhhdmUgYXV0b3BsYXkgKyBhIHBvc3RlciArIG5vIGNvbnRyb2xzLCB0aGUgdmlkZW8gZ2V0cyBoaWRkZW4gKGJ1dCBhdWRpbyBwbGF5cylcbiAgICAvLyBUaGlzIGZpeGVzIGJvdGggaXNzdWVzLiBOZWVkIHRvIHdhaXQgZm9yIEFQSSwgc28gaXQgdXBkYXRlcyBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICBpZiAoKHRoaXMuc3JjKCkgfHwgdGhpcy5jdXJyZW50U3JjKCkpICYmIHRoaXMudGFnICYmIHRoaXMub3B0aW9uc18uYXV0b3BsYXkgJiYgdGhpcy5wYXVzZWQoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hyb21lIEZpeC4gRml4ZWQgaW4gQ2hyb21lIHYxNi5cbiAgICAgICAgZGVsZXRlIHRoaXMudGFnLnBvc3RlcjtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nJDEoJ2RlbGV0aW5nIHRhZy5wb3N0ZXIgdGhyb3dzIGluIHNvbWUgYnJvd3NlcnMnLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZ2dlciB0aGUgYGxvYWRzdGFydGAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uIFRoaXNcbiAgICogZnVuY3Rpb24gd2lsbCBhbHNvIHRyaWdnZXIge0BsaW5rIFBsYXllciNmaXJzdHBsYXl9IGlmIGl0IGlzIHRoZSBmaXJzdCBsb2Fkc3RhcnRcbiAgICogZm9yIGEgdmlkZW8uXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjbG9hZHN0YXJ0XG4gICAqIEBmaXJlcyBQbGF5ZXIjZmlyc3RwbGF5XG4gICAqIEBsaXN0ZW5zIFRlY2gjbG9hZHN0YXJ0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoTG9hZFN0YXJ0XyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hMb2FkU3RhcnRfKCkge1xuICAgIC8vIFRPRE86IFVwZGF0ZSB0byB1c2UgYGVtcHRpZWRgIGV2ZW50IGluc3RlYWQuIFNlZSAjMTI3Ny5cblxuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1lbmRlZCcpO1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zZWVraW5nJyk7XG5cbiAgICAvLyByZXNldCB0aGUgZXJyb3Igc3RhdGVcbiAgICB0aGlzLmVycm9yKG51bGwpO1xuXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IHBsYXlpbmcgd2Ugd2FudCB0byB0cmlnZ2VyIGEgZmlyc3RwbGF5IGV2ZW50IG5vdy5cbiAgICAvLyBUaGUgZmlyc3RwbGF5IGV2ZW50IHJlbGllcyBvbiBib3RoIHRoZSBwbGF5IGFuZCBsb2Fkc3RhcnQgZXZlbnRzXG4gICAgLy8gd2hpY2ggY2FuIGhhcHBlbiBpbiBhbnkgb3JkZXIgZm9yIGEgbmV3IHNvdXJjZVxuICAgIGlmICghdGhpcy5wYXVzZWQoKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBGaXJlZCB3aGVuIHRoZSB1c2VyIGFnZW50IGJlZ2lucyBsb29raW5nIGZvciBtZWRpYSBkYXRhXG4gICAgICAgKlxuICAgICAgICogQGV2ZW50IFBsYXllciNsb2Fkc3RhcnRcbiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAqL1xuICAgICAgdGhpcy50cmlnZ2VyKCdsb2Fkc3RhcnQnKTtcbiAgICAgIHRoaXMudHJpZ2dlcignZmlyc3RwbGF5Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlc2V0IHRoZSBoYXNTdGFydGVkIHN0YXRlXG4gICAgICB0aGlzLmhhc1N0YXJ0ZWQoZmFsc2UpO1xuICAgICAgdGhpcy50cmlnZ2VyKCdsb2Fkc3RhcnQnKTtcbiAgICB9XG5cbiAgICAvLyBhdXRvcGxheSBoYXBwZW5zIGFmdGVyIGxvYWRzdGFydCBmb3IgdGhlIGJyb3dzZXIsXG4gICAgLy8gc28gd2UgbWltaWMgdGhhdCBiZWhhdmlvclxuICAgIHRoaXMubWFudWFsQXV0b3BsYXlfKHRoaXMuYXV0b3BsYXkoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhdXRvcGxheSBzdHJpbmcgdmFsdWVzLCByYXRoZXIgdGhhbiB0aGUgdHlwaWNhbCBib29sZWFuXG4gICAqIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSB0ZWNoLiBOb3RlIHRoYXQgdGhpcyBpcyBub3RcbiAgICogcGFydCBvZiBhbnkgc3BlY2lmaWNhdGlvbi4gVmFsaWQgdmFsdWVzIGFuZCB3aGF0IHRoZXkgZG8gY2FuIGJlXG4gICAqIGZvdW5kIG9uIHRoZSBhdXRvcGxheSBnZXR0ZXIgYXQgUGxheWVyI2F1dG9wbGF5KClcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLm1hbnVhbEF1dG9wbGF5XyA9IGZ1bmN0aW9uIG1hbnVhbEF1dG9wbGF5Xyh0eXBlKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICBpZiAoIXRoaXMudGVjaF8gfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG11dGVkID0gZnVuY3Rpb24gbXV0ZWQoKSB7XG4gICAgICB2YXIgcHJldmlvdXNseU11dGVkID0gX3RoaXM0Lm11dGVkKCk7XG5cbiAgICAgIF90aGlzNC5tdXRlZCh0cnVlKTtcblxuICAgICAgdmFyIHBsYXlQcm9taXNlID0gX3RoaXM0LnBsYXkoKTtcblxuICAgICAgaWYgKCFwbGF5UHJvbWlzZSB8fCAhcGxheVByb21pc2UudGhlbiB8fCAhcGxheVByb21pc2VbJ2NhdGNoJ10pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGxheVByb21pc2VbJ2NhdGNoJ10oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gcmVzdG9yZSBvbGQgdmFsdWUgb2YgbXV0ZWQgb24gZmFpbHVyZVxuICAgICAgICBfdGhpczQubXV0ZWQocHJldmlvdXNseU11dGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgcHJvbWlzZSA9IHZvaWQgMDtcblxuICAgIGlmICh0eXBlID09PSAnYW55Jykge1xuICAgICAgcHJvbWlzZSA9IHRoaXMucGxheSgpO1xuXG4gICAgICBpZiAocHJvbWlzZSAmJiBwcm9taXNlLnRoZW4gJiYgcHJvbWlzZVsnY2F0Y2gnXSkge1xuICAgICAgICBwcm9taXNlWydjYXRjaCddKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gbXV0ZWQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnbXV0ZWQnKSB7XG4gICAgICBwcm9taXNlID0gbXV0ZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZSA9IHRoaXMucGxheSgpO1xuICAgIH1cblxuICAgIGlmICghcHJvbWlzZSB8fCAhcHJvbWlzZS50aGVuIHx8ICFwcm9taXNlWydjYXRjaCddKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczQudHJpZ2dlcih7IHR5cGU6ICdhdXRvcGxheS1zdWNjZXNzJywgYXV0b3BsYXk6IHR5cGUgfSk7XG4gICAgfSlbJ2NhdGNoJ10oZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzNC50cmlnZ2VyKHsgdHlwZTogJ2F1dG9wbGF5LWZhaWx1cmUnLCBhdXRvcGxheTogdHlwZSB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBpbnRlcm5hbCBzb3VyY2UgY2FjaGVzIHNvIHRoYXQgd2UgcmV0dXJuIHRoZSBjb3JyZWN0IHNvdXJjZSBmcm9tXG4gICAqIGBzcmMoKWAsIGBjdXJyZW50U291cmNlKClgLCBhbmQgYGN1cnJlbnRTb3VyY2VzKClgLlxuICAgKlxuICAgKiA+IE5vdGU6IGBjdXJyZW50U291cmNlc2Agd2lsbCBub3QgYmUgdXBkYXRlZCBpZiB0aGUgc291cmNlIHRoYXQgaXMgcGFzc2VkIGluIGV4aXN0c1xuICAgKiAgICAgICAgIGluIHRoZSBjdXJyZW50IGBjdXJyZW50U291cmNlc2AgY2FjaGUuXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNyY09ialxuICAgKiAgICAgICAgQSBzdHJpbmcgb3Igb2JqZWN0IHNvdXJjZSB0byB1cGRhdGUgb3VyIGNhY2hlcyB0by5cbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnVwZGF0ZVNvdXJjZUNhY2hlc18gPSBmdW5jdGlvbiB1cGRhdGVTb3VyY2VDYWNoZXNfKCkge1xuICAgIHZhciBzcmNPYmogPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuXG5cbiAgICB2YXIgc3JjID0gc3JjT2JqO1xuICAgIHZhciB0eXBlID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHNyYyA9IHNyY09iai5zcmM7XG4gICAgICB0eXBlID0gc3JjT2JqLnR5cGU7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIGEgYmxvYiB1cmwsIGRvbid0IHVwZGF0ZSB0aGUgc291cmNlIGNhY2hlXG4gICAgLy8gYmxvYiB1cmxzIGNhbiBhcmlzZSB3aGVuIHBsYXliYWNrIGlzIGRvbmUgdmlhIE1lZGlhIFNvdXJjZSBFeHRlbnNpb24gKE1TRSlcbiAgICAvLyBzdWNoIGFzIG0zdTggc291cmNlcyB3aXRoIEB2aWRlb2pzL2h0dHAtc3RyZWFtaW5nIChWSFMpXG4gICAgaWYgKC9eYmxvYjovLnRlc3Qoc3JjKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSBhbGwgdGhlIGNhY2hlcyBhcmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzXG4gICAgLy8gdG8gcHJldmVudCBudWxsIGNoZWNraW5nXG4gICAgdGhpcy5jYWNoZV8uc291cmNlID0gdGhpcy5jYWNoZV8uc291cmNlIHx8IHt9O1xuICAgIHRoaXMuY2FjaGVfLnNvdXJjZXMgPSB0aGlzLmNhY2hlXy5zb3VyY2VzIHx8IFtdO1xuXG4gICAgLy8gdHJ5IHRvIGdldCB0aGUgdHlwZSBvZiB0aGUgc3JjIHRoYXQgd2FzIHBhc3NlZCBpblxuICAgIGlmIChzcmMgJiYgIXR5cGUpIHtcbiAgICAgIHR5cGUgPSBmaW5kTWltZXR5cGUodGhpcywgc3JjKTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgYGN1cnJlbnRTb3VyY2VgIGNhY2hlIGFsd2F5c1xuICAgIHRoaXMuY2FjaGVfLnNvdXJjZSA9IG1lcmdlT3B0aW9ucyh7fSwgc3JjT2JqLCB7IHNyYzogc3JjLCB0eXBlOiB0eXBlIH0pO1xuXG4gICAgdmFyIG1hdGNoaW5nU291cmNlcyA9IHRoaXMuY2FjaGVfLnNvdXJjZXMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gcy5zcmMgJiYgcy5zcmMgPT09IHNyYztcbiAgICB9KTtcbiAgICB2YXIgc291cmNlRWxTb3VyY2VzID0gW107XG4gICAgdmFyIHNvdXJjZUVscyA9IHRoaXMuJCQoJ3NvdXJjZScpO1xuICAgIHZhciBtYXRjaGluZ1NvdXJjZUVscyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2VFbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2VPYmogPSBnZXRBdHRyaWJ1dGVzKHNvdXJjZUVsc1tpXSk7XG5cbiAgICAgIHNvdXJjZUVsU291cmNlcy5wdXNoKHNvdXJjZU9iaik7XG5cbiAgICAgIGlmIChzb3VyY2VPYmouc3JjICYmIHNvdXJjZU9iai5zcmMgPT09IHNyYykge1xuICAgICAgICBtYXRjaGluZ1NvdXJjZUVscy5wdXNoKHNvdXJjZU9iai5zcmMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgbWF0Y2hpbmcgc291cmNlIGVscyBidXQgbm90IG1hdGNoaW5nIHNvdXJjZXNcbiAgICAvLyB0aGUgY3VycmVudCBzb3VyY2UgY2FjaGUgaXMgbm90IHVwIHRvIGRhdGVcbiAgICBpZiAobWF0Y2hpbmdTb3VyY2VFbHMubGVuZ3RoICYmICFtYXRjaGluZ1NvdXJjZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNhY2hlXy5zb3VyY2VzID0gc291cmNlRWxTb3VyY2VzO1xuICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBtYXRjaGluZyBzb3VyY2Ugb3Igc291cmNlIGVscyBzZXQgdGhlXG4gICAgICAvLyBzb3VyY2VzIGNhY2hlIHRvIHRoZSBgY3VycmVudFNvdXJjZWAgY2FjaGVcbiAgICB9IGVsc2UgaWYgKCFtYXRjaGluZ1NvdXJjZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNhY2hlXy5zb3VyY2VzID0gW3RoaXMuY2FjaGVfLnNvdXJjZV07XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHRoZSB0ZWNoIGBzcmNgIGNhY2hlXG4gICAgdGhpcy5jYWNoZV8uc3JjID0gc3JjO1xuICB9O1xuXG4gIC8qKlxuICAgKiAqRVhQRVJJTUVOVEFMKiBGaXJlZCB3aGVuIHRoZSBzb3VyY2UgaXMgc2V0IG9yIGNoYW5nZWQgb24gdGhlIHtAbGluayBUZWNofVxuICAgKiBjYXVzaW5nIHRoZSBtZWRpYSBlbGVtZW50IHRvIHJlbG9hZC5cbiAgICpcbiAgICogSXQgd2lsbCBmaXJlIGZvciB0aGUgaW5pdGlhbCBzb3VyY2UgYW5kIGVhY2ggc3Vic2VxdWVudCBzb3VyY2UuXG4gICAqIFRoaXMgZXZlbnQgaXMgYSBjdXN0b20gZXZlbnQgZnJvbSBWaWRlby5qcyBhbmQgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqXG4gICAqIFRoZSBldmVudCBvYmplY3QgZm9yIHRoaXMgZXZlbnQgY29udGFpbnMgYSBgc3JjYCBwcm9wZXJ0eSB0aGF0IHdpbGwgY29udGFpbiB0aGUgc291cmNlXG4gICAqIHRoYXQgd2FzIGF2YWlsYWJsZSB3aGVuIHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkLiBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IG5lY2Vzc2FyeSBpZiBWaWRlby5qc1xuICAgKiBpcyBzd2l0Y2hpbmcgdGVjaHMgd2hpbGUgdGhlIHNvdXJjZSB3YXMgYmVpbmcgY2hhbmdlZC5cbiAgICpcbiAgICogSXQgaXMgYWxzbyBmaXJlZCB3aGVuIGBsb2FkYCBpcyBjYWxsZWQgb24gdGhlIHBsYXllciAob3IgbWVkaWEgZWxlbWVudClcbiAgICogYmVjYXVzZSB0aGUge0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL21lZGlhLmh0bWwjZG9tLW1lZGlhLWxvYWR8c3BlY2lmaWNhdGlvbiBmb3IgYGxvYWRgfVxuICAgKiBzYXlzIHRoYXQgdGhlIHJlc291cmNlIHNlbGVjdGlvbiBhbGdvcml0aG0gbmVlZHMgdG8gYmUgYWJvcnRlZCBhbmQgcmVzdGFydGVkLlxuICAgKiBJbiB0aGlzIGNhc2UsIGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgdGhlIGBzcmNgIHByb3BlcnR5IHdpbGwgYmUgc2V0IHRvIHRoZVxuICAgKiBlbXB0eSBzdHJpbmcgYFwiXCJgIHRvIGluZGljYXRlIHdlIGRvIG5vdCBrbm93IHdoYXQgdGhlIHNvdXJjZSB3aWxsIGJlIGJ1dFxuICAgKiB0aGF0IGl0IGlzIGNoYW5naW5nLlxuICAgKlxuICAgKiAqVGhpcyBldmVudCBpcyBjdXJyZW50bHkgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIG1pbm9yIHJlbGVhc2VzLipcbiAgICogX19UbyB1c2UgdGhpcywgcGFzcyBgZW5hYmxlU291cmNlc2V0YCBvcHRpb24gdG8gdGhlIHBsYXllci5fX1xuICAgKlxuICAgKiBAZXZlbnQgUGxheWVyI3NvdXJjZXNldFxuICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAqIEBwcm9wIHtzdHJpbmd9IHNyY1xuICAgKiAgICAgICAgICAgICAgICBUaGUgc291cmNlIHVybCBhdmFpbGFibGUgd2hlbiB0aGUgYHNvdXJjZXNldGAgd2FzIHRyaWdnZXJlZC5cbiAgICogICAgICAgICAgICAgICAgSXQgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgd2UgY2Fubm90IGtub3cgd2hhdCB0aGUgc291cmNlIGlzXG4gICAqICAgICAgICAgICAgICAgIGJ1dCBrbm93IHRoYXQgdGhlIHNvdXJjZSB3aWxsIGNoYW5nZS5cbiAgICovXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGBzb3VyY2VzZXRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3NvdXJjZXNldFxuICAgKiBAbGlzdGVucyBUZWNoI3NvdXJjZXNldFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFNvdXJjZXNldF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoU291cmNlc2V0XyhldmVudCkge1xuICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgLy8gb25seSB1cGRhdGUgdGhlIHNvdXJjZSBjYWNoZSB3aGVuIHRoZSBzb3VyY2VcbiAgICAvLyB3YXMgbm90IHVwZGF0ZWQgdXNpbmcgdGhlIHBsYXllciBhcGlcbiAgICBpZiAoIXRoaXMuY2hhbmdpbmdTcmNfKSB7XG4gICAgICAvLyB1cGRhdGUgdGhlIHNvdXJjZSB0byB0aGUgaW50aWFsIHNvdXJjZSByaWdodCBhd2F5XG4gICAgICAvLyBpbiBzb21lIGNhc2VzIHRoaXMgd2lsbCBiZSBlbXB0eSBzdHJpbmdcbiAgICAgIHRoaXMudXBkYXRlU291cmNlQ2FjaGVzXyhldmVudC5zcmMpO1xuXG4gICAgICAvLyBpZiB0aGUgYHNvdXJjZXNldGAgYHNyY2Agd2FzIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgLy8gd2FpdCBmb3IgYSBgbG9hZHN0YXJ0YCB0byB1cGRhdGUgdGhlIGNhY2hlIHRvIGBjdXJyZW50U3JjYC5cbiAgICAgIC8vIElmIGEgc291cmNlc2V0IGhhcHBlbnMgYmVmb3JlIGEgYGxvYWRzdGFydGAsIHdlIHJlc2V0IHRoZSBzdGF0ZVxuICAgICAgLy8gYXMgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2Fpbi5cbiAgICAgIGlmICghZXZlbnQuc3JjKSB7XG4gICAgICAgIHZhciB1cGRhdGVDYWNoZSA9IGZ1bmN0aW9uIHVwZGF0ZUNhY2hlKGUpIHtcbiAgICAgICAgICBpZiAoZS50eXBlICE9PSAnc291cmNlc2V0Jykge1xuICAgICAgICAgICAgX3RoaXM1LnVwZGF0ZVNvdXJjZUNhY2hlc18oX3RoaXM1LnRlY2hHZXRfKCdjdXJyZW50U3JjJykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzNS50ZWNoXy5vZmYoWydzb3VyY2VzZXQnLCAnbG9hZHN0YXJ0J10sIHVwZGF0ZUNhY2hlKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnRlY2hfLm9uZShbJ3NvdXJjZXNldCcsICdsb2Fkc3RhcnQnXSwgdXBkYXRlQ2FjaGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlcih7XG4gICAgICBzcmM6IGV2ZW50LnNyYyxcbiAgICAgIHR5cGU6ICdzb3VyY2VzZXQnXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZC9yZW1vdmUgdGhlIHZqcy1oYXMtc3RhcnRlZCBjbGFzc1xuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2ZpcnN0cGxheVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVlc3RcbiAgICogICAgICAgIC0gdHJ1ZTogYWRkcyB0aGUgY2xhc3NcbiAgICogICAgICAgIC0gZmFsc2U6IHJlbW92ZSB0aGUgY2xhc3NcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBoYXNTdGFydGVkX1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFzU3RhcnRlZCA9IGZ1bmN0aW9uIGhhc1N0YXJ0ZWQocmVxdWVzdCkge1xuICAgIGlmIChyZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFjdCBhcyBnZXR0ZXIsIGlmIHdlIGhhdmUgbm8gcmVxdWVzdCB0byBjaGFuZ2VcbiAgICAgIHJldHVybiB0aGlzLmhhc1N0YXJ0ZWRfO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0ID09PSB0aGlzLmhhc1N0YXJ0ZWRfKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNTdGFydGVkXyA9IHJlcXVlc3Q7XG5cbiAgICBpZiAodGhpcy5oYXNTdGFydGVkXykge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWhhcy1zdGFydGVkJyk7XG4gICAgICB0aGlzLnRyaWdnZXIoJ2ZpcnN0cGxheScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtaGFzLXN0YXJ0ZWQnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtZWRpYSBiZWdpbnMgb3IgcmVzdW1lcyBwbGF5YmFja1xuICAgKlxuICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLW1lZGlhLXBsYXl9XG4gICAqIEBmaXJlcyBQbGF5ZXIjcGxheVxuICAgKiBAbGlzdGVucyBUZWNoI3BsYXlcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hQbGF5XyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hQbGF5XygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZW5kZWQnKTtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtcGF1c2VkJyk7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLXBsYXlpbmcnKTtcblxuICAgIC8vIGhpZGUgdGhlIHBvc3RlciB3aGVuIHRoZSB1c2VyIGhpdHMgcGxheVxuICAgIHRoaXMuaGFzU3RhcnRlZCh0cnVlKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbmV2ZXIgYW4ge0BsaW5rIFRlY2gjcGxheX0gZXZlbnQgaGFwcGVucy4gSW5kaWNhdGVzIHRoYXRcbiAgICAgKiBwbGF5YmFjayBoYXMgc3RhcnRlZCBvciByZXN1bWVkLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNwbGF5XG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcigncGxheScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGByYXRlY2hhbmdlYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAgICpcbiAgICogSWYgdGhlcmUgd2VyZSBhbnkgZXZlbnRzIHF1ZXVlZCB3aGlsZSB0aGUgcGxheWJhY2sgcmF0ZSB3YXMgemVybywgZmlyZVxuICAgKiB0aG9zZSBldmVudHMgbm93LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoUmF0ZUNoYW5nZV9cbiAgICogQGZpcmVzIFBsYXllciNyYXRlY2hhbmdlXG4gICAqIEBsaXN0ZW5zIFRlY2gjcmF0ZWNoYW5nZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFJhdGVDaGFuZ2VfID0gZnVuY3Rpb24gaGFuZGxlVGVjaFJhdGVDaGFuZ2VfKCkge1xuICAgIGlmICh0aGlzLnRlY2hfLnBsYXliYWNrUmF0ZSgpID4gMCAmJiB0aGlzLmNhY2hlXy5sYXN0UGxheWJhY2tSYXRlID09PSAwKSB7XG4gICAgICB0aGlzLnF1ZXVlZENhbGxiYWNrc18uZm9yRWFjaChmdW5jdGlvbiAocXVldWVkKSB7XG4gICAgICAgIHJldHVybiBxdWV1ZWQuY2FsbGJhY2socXVldWVkLmV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5xdWV1ZWRDYWxsYmFja3NfID0gW107XG4gICAgfVxuICAgIHRoaXMuY2FjaGVfLmxhc3RQbGF5YmFja1JhdGUgPSB0aGlzLnRlY2hfLnBsYXliYWNrUmF0ZSgpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIHBsYXlpbmcgc3BlZWQgb2YgdGhlIGF1ZGlvL3ZpZGVvIGlzIGNoYW5nZWRcbiAgICAgKlxuICAgICAqIEBldmVudCBQbGF5ZXIjcmF0ZWNoYW5nZVxuICAgICAqIEB0eXBlIHtldmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ3JhdGVjaGFuZ2UnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0cmlnZ2VyIHRoZSBgd2FpdGluZ2AgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjd2FpdGluZ1xuICAgKiBAbGlzdGVucyBUZWNoI3dhaXRpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hXYWl0aW5nXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hXYWl0aW5nXygpIHtcbiAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7XG4gICAgLyoqXG4gICAgICogQSByZWFkeVN0YXRlIGNoYW5nZSBvbiB0aGUgRE9NIGVsZW1lbnQgaGFzIGNhdXNlZCBwbGF5YmFjayB0byBzdG9wLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciN3YWl0aW5nXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignd2FpdGluZycpO1xuICAgIHRoaXMub25lKCd0aW1ldXBkYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzNi5yZW1vdmVDbGFzcygndmpzLXdhaXRpbmcnKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0cmlnZ2VyIHRoZSBgY2FucGxheWAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqID4gTm90ZTogVGhpcyBpcyBub3QgY29uc2lzdGVudCBiZXR3ZWVuIGJyb3dzZXJzLiBTZWUgIzEzNTFcbiAgICpcbiAgICogQGZpcmVzIFBsYXllciNjYW5wbGF5XG4gICAqIEBsaXN0ZW5zIFRlY2gjY2FucGxheVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaENhblBsYXlfID0gZnVuY3Rpb24gaGFuZGxlVGVjaENhblBsYXlfKCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7XG4gICAgLyoqXG4gICAgICogVGhlIG1lZGlhIGhhcyBhIHJlYWR5U3RhdGUgb2YgSEFWRV9GVVRVUkVfREFUQSBvciBncmVhdGVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNjYW5wbGF5XG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignY2FucGxheScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGBjYW5wbGF5dGhyb3VnaGAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjY2FucGxheXRocm91Z2hcbiAgICogQGxpc3RlbnMgVGVjaCNjYW5wbGF5dGhyb3VnaFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaENhblBsYXlUaHJvdWdoXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hDYW5QbGF5VGhyb3VnaF8oKSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXdhaXRpbmcnKTtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVkaWEgaGFzIGEgcmVhZHlTdGF0ZSBvZiBIQVZFX0VOT1VHSF9EQVRBIG9yIGdyZWF0ZXIuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbiAgICAgKiBlbnRpcmUgbWVkaWEgZmlsZSBjYW4gYmUgcGxheWVkIHdpdGhvdXQgYnVmZmVyaW5nLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNjYW5wbGF5dGhyb3VnaFxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ2NhbnBsYXl0aHJvdWdoJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZ2dlciB0aGUgYHBsYXlpbmdgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3BsYXlpbmdcbiAgICogQGxpc3RlbnMgVGVjaCNwbGF5aW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoUGxheWluZ18gPSBmdW5jdGlvbiBoYW5kbGVUZWNoUGxheWluZ18oKSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXdhaXRpbmcnKTtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVkaWEgaXMgbm8gbG9uZ2VyIGJsb2NrZWQgZnJvbSBwbGF5YmFjaywgYW5kIGhhcyBzdGFydGVkIHBsYXlpbmcuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI3BsYXlpbmdcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdwbGF5aW5nJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZ2dlciB0aGUgYHNlZWtpbmdgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3NlZWtpbmdcbiAgICogQGxpc3RlbnMgVGVjaCNzZWVraW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoU2Vla2luZ18gPSBmdW5jdGlvbiBoYW5kbGVUZWNoU2Vla2luZ18oKSB7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLXNlZWtpbmcnKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgcGxheWVyIGlzIGp1bXBpbmcgdG8gYSBuZXcgdGltZVxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNzZWVraW5nXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignc2Vla2luZycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGBzZWVrZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3NlZWtlZFxuICAgKiBAbGlzdGVucyBUZWNoI3NlZWtlZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFNlZWtlZF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoU2Vla2VkXygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtc2Vla2luZycpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHBsYXllciBoYXMgZmluaXNoZWQganVtcGluZyB0byBhIG5ldyB0aW1lXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI3NlZWtlZFxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ3NlZWtlZCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGBmaXJzdHBsYXlgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2ZpcnN0cGxheVxuICAgKiBAbGlzdGVucyBUZWNoI2ZpcnN0cGxheVxuICAgKiBAZGVwcmVjYXRlZCBBcyBvZiA2LjAgZmlyc3RwbGF5IGV2ZW50IGlzIGRlcHJlY2F0ZWQuXG4gICAqICAgICAgICAgICAgIEFzIG9mIDYuMCBwYXNzaW5nIHRoZSBgc3RhcnR0aW1lYCBvcHRpb24gdG8gdGhlIHBsYXllciBhbmQgdGhlIGZpcnN0cGxheSBldmVudCBhcmUgZGVwcmVjYXRlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hGaXJzdFBsYXlfID0gZnVuY3Rpb24gaGFuZGxlVGVjaEZpcnN0UGxheV8oKSB7XG4gICAgLy8gSWYgdGhlIGZpcnN0IHN0YXJ0dGltZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkXG4gICAgLy8gdGhlbiB3ZSB3aWxsIHN0YXJ0IGF0IHRoZSBnaXZlbiBvZmZzZXQgaW4gc2Vjb25kc1xuICAgIGlmICh0aGlzLm9wdGlvbnNfLnN0YXJ0dGltZSkge1xuICAgICAgbG9nJDEud2FybignUGFzc2luZyB0aGUgYHN0YXJ0dGltZWAgb3B0aW9uIHRvIHRoZSBwbGF5ZXIgd2lsbCBiZSBkZXByZWNhdGVkIGluIDYuMCcpO1xuICAgICAgdGhpcy5jdXJyZW50VGltZSh0aGlzLm9wdGlvbnNfLnN0YXJ0dGltZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWhhcy1zdGFydGVkJyk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgdGhlIGZpcnN0IHRpbWUgYSB2aWRlbyBpcyBwbGF5ZWQuIE5vdCBwYXJ0IG9mIHRoZSBITFMgc3BlYywgYW5kIHRoaXMgaXNcbiAgICAgKiBwcm9iYWJseSBub3QgdGhlIGJlc3QgaW1wbGVtZW50YXRpb24geWV0LCBzbyB1c2Ugc3BhcmluZ2x5LiBJZiB5b3UgZG9uJ3QgaGF2ZSBhXG4gICAgICogcmVhc29uIHRvIHByZXZlbnQgcGxheWJhY2ssIHVzZSBgbXlQbGF5ZXIub25lKCdwbGF5Jyk7YCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQGV2ZW50IFBsYXllciNmaXJzdHBsYXlcbiAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiA2LjAgZmlyc3RwbGF5IGV2ZW50IGlzIGRlcHJlY2F0ZWQuXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcignZmlyc3RwbGF5Jyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZ2dlciB0aGUgYHBhdXNlYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS5cbiAgICpcbiAgICogQGZpcmVzIFBsYXllciNwYXVzZVxuICAgKiBAbGlzdGVucyBUZWNoI3BhdXNlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoUGF1c2VfID0gZnVuY3Rpb24gaGFuZGxlVGVjaFBhdXNlXygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtcGxheWluZycpO1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1wYXVzZWQnKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgbWVkaWEgaGFzIGJlZW4gcGF1c2VkXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI3BhdXNlXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcigncGF1c2UnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0cmlnZ2VyIHRoZSBgZW5kZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2VuZGVkXG4gICAqIEBsaXN0ZW5zIFRlY2gjZW5kZWRcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hFbmRlZF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoRW5kZWRfKCkge1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1lbmRlZCcpO1xuICAgIGlmICh0aGlzLm9wdGlvbnNfLmxvb3ApIHtcbiAgICAgIHRoaXMuY3VycmVudFRpbWUoMCk7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnBhdXNlZCgpKSB7XG4gICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBtZWRpYSByZXNvdXJjZSBpcyByZWFjaGVkIChjdXJyZW50VGltZSA9PSBkdXJhdGlvbilcbiAgICAgKlxuICAgICAqIEBldmVudCBQbGF5ZXIjZW5kZWRcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdlbmRlZCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEgcmVzb3VyY2UgaXMgZmlyc3Qga25vd24gb3IgY2hhbmdlZFxuICAgKlxuICAgKiBAbGlzdGVucyBUZWNoI2R1cmF0aW9uY2hhbmdlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoRHVyYXRpb25DaGFuZ2VfID0gZnVuY3Rpb24gaGFuZGxlVGVjaER1cmF0aW9uQ2hhbmdlXygpIHtcbiAgICB0aGlzLmR1cmF0aW9uKHRoaXMudGVjaEdldF8oJ2R1cmF0aW9uJykpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBjbGljayBvbiB0aGUgbWVkaWEgZWxlbWVudCB0byBwbGF5L3BhdXNlXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICB0aGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byB0cmlnZ2VyXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjbW91c2Vkb3duXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoQ2xpY2tfID0gZnVuY3Rpb24gaGFuZGxlVGVjaENsaWNrXyhldmVudCkge1xuICAgIGlmICghaXNTaW5nbGVMZWZ0Q2xpY2soZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2hlbiBjb250cm9scyBhcmUgZGlzYWJsZWQgYSBjbGljayBzaG91bGQgbm90IHRvZ2dsZSBwbGF5YmFjayBiZWNhdXNlXG4gICAgLy8gdGhlIGNsaWNrIGlzIGNvbnNpZGVyZWQgYSBjb250cm9sXG4gICAgaWYgKCF0aGlzLmNvbnRyb2xzXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdXNlZCgpKSB7XG4gICAgICBzaWxlbmNlUHJvbWlzZSh0aGlzLnBsYXkoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIHRhcCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gSXQgd2lsbCB0b2dnbGUgdGhlIHVzZXJcbiAgICogYWN0aXZpdHkgc3RhdGUsIHdoaWNoIGhpZGVzIGFuZCBzaG93cyB0aGUgY29udHJvbHMuXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjdGFwXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVGFwXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUYXBfKCkge1xuICAgIHRoaXMudXNlckFjdGl2ZSghdGhpcy51c2VyQWN0aXZlKCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2ggdG8gc3RhcnRcbiAgICpcbiAgICogQGxpc3RlbnMgVGVjaCN0b3VjaHN0YXJ0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVG91Y2hTdGFydF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoVG91Y2hTdGFydF8oKSB7XG4gICAgdGhpcy51c2VyV2FzQWN0aXZlID0gdGhpcy51c2VyQWN0aXZlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaCB0byBtb3ZlXG4gICAqXG4gICAqIEBsaXN0ZW5zIFRlY2gjdG91Y2htb3ZlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVG91Y2hNb3ZlXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUb3VjaE1vdmVfKCkge1xuICAgIGlmICh0aGlzLnVzZXJXYXNBY3RpdmUpIHtcbiAgICAgIHRoaXMucmVwb3J0VXNlckFjdGl2aXR5KCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2ggdG8gZW5kXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50XG4gICAqICAgICAgICB0aGUgdG91Y2hlbmQgZXZlbnQgdGhhdCB0cmlnZ2VyZWRcbiAgICogICAgICAgIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQGxpc3RlbnMgVGVjaCN0b3VjaGVuZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFRvdWNoRW5kXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUb3VjaEVuZF8oZXZlbnQpIHtcbiAgICAvLyBTdG9wIHRoZSBtb3VzZSBldmVudHMgZnJvbSBhbHNvIGhhcHBlbmluZ1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIHBsYXllciBzd2l0Y2hlcyBpbiBvciBvdXQgb2YgZnVsbHNjcmVlbiBtb2RlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBsaXN0ZW5zIFBsYXllciNmdWxsc2NyZWVuY2hhbmdlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVGdWxsc2NyZWVuQ2hhbmdlXyA9IGZ1bmN0aW9uIGhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2VfKCkge1xuICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbigpKSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtZnVsbHNjcmVlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZnVsbHNjcmVlbicpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogbmF0aXZlIGNsaWNrIGV2ZW50cyBvbiB0aGUgU1dGIGFyZW4ndCB0cmlnZ2VyZWQgb24gSUUxMSwgV2luOC4xUlRcbiAgICogdXNlIHN0YWdlY2xpY2sgZXZlbnRzIHRyaWdnZXJlZCBmcm9tIGluc2lkZSB0aGUgU1dGIGluc3RlYWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQGxpc3RlbnMgc3RhZ2VjbGlja1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlU3RhZ2VDbGlja18gPSBmdW5jdGlvbiBoYW5kbGVTdGFnZUNsaWNrXygpIHtcbiAgICB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgVGVjaCBGdWxsc2NyZWVuIENoYW5nZVxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudFxuICAgKiAgICAgICAgdGhlIGZ1bGxzY3JlZW5jaGFuZ2UgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiAgICAgICAgdGhlIGRhdGEgdGhhdCB3YXMgc2VudCB3aXRoIHRoZSBldmVudFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbGlzdGVucyBUZWNoI2Z1bGxzY3JlZW5jaGFuZ2VcbiAgICogQGZpcmVzIFBsYXllciNmdWxsc2NyZWVuY2hhbmdlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoRnVsbHNjcmVlbkNoYW5nZV8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoRnVsbHNjcmVlbkNoYW5nZV8oZXZlbnQsIGRhdGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4oZGF0YS5pc0Z1bGxzY3JlZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGdvaW5nIGluIGFuZCBvdXQgb2YgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBQbGF5ZXIjZnVsbHNjcmVlbmNoYW5nZVxuICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgfTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGxvYWRpbmcgb2YgYW4gYXVkaW8vdmlkZW8uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBsaXN0ZW5zIFRlY2gjZXJyb3JcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hFcnJvcl8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoRXJyb3JfKCkge1xuICAgIHZhciBlcnJvciA9IHRoaXMudGVjaF8uZXJyb3IoKTtcblxuICAgIHRoaXMuZXJyb3IoZXJyb3IpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXRyaWdnZXIgdGhlIGB0ZXh0ZGF0YWAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjdGV4dGRhdGFcbiAgICogQGxpc3RlbnMgVGVjaCN0ZXh0ZGF0YVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFRleHREYXRhXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUZXh0RGF0YV8oKSB7XG4gICAgdmFyIGRhdGEgPSBudWxsO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBkYXRhID0gYXJndW1lbnRzWzFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gd2UgZ2V0IGEgdGV4dGRhdGEgZXZlbnQgZnJvbSB0ZWNoXG4gICAgICpcbiAgICAgKiBAZXZlbnQgUGxheWVyI3RleHRkYXRhXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcigndGV4dGRhdGEnLCBkYXRhKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IG9iamVjdCBmb3IgY2FjaGVkIHZhbHVlcy5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiAgICAgICAgIGdldCB0aGUgY3VycmVudCBvYmplY3QgY2FjaGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmdldENhY2hlID0gZnVuY3Rpb24gZ2V0Q2FjaGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVfO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQYXNzIHZhbHVlcyB0byB0aGUgcGxheWJhY2sgdGVjaFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21ldGhvZF1cbiAgICogICAgICAgIHRoZSBtZXRob2QgdG8gY2FsbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYXJnXG4gICAqICAgICAgICB0aGUgYXJndW1lbnQgdG8gcGFzc1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUudGVjaENhbGxfID0gZnVuY3Rpb24gdGVjaENhbGxfKG1ldGhvZCwgYXJnKSB7XG4gICAgLy8gSWYgaXQncyBub3QgcmVhZHkgeWV0LCBjYWxsIG1ldGhvZCB3aGVuIGl0IGlzXG5cbiAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtZXRob2QgaW4gYWxsb3dlZFNldHRlcnMpIHtcbiAgICAgICAgcmV0dXJuIHNldCQxKHRoaXMubWlkZGxld2FyZV8sIHRoaXMudGVjaF8sIG1ldGhvZCwgYXJnKTtcbiAgICAgIH0gZWxzZSBpZiAobWV0aG9kIGluIGFsbG93ZWRNZWRpYXRvcnMpIHtcbiAgICAgICAgcmV0dXJuIG1lZGlhdGUodGhpcy5taWRkbGV3YXJlXywgdGhpcy50ZWNoXywgbWV0aG9kLCBhcmcpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy50ZWNoXykge1xuICAgICAgICAgIHRoaXMudGVjaF9bbWV0aG9kXShhcmcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZyQxKGUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0sIHRydWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY2FsbHMgY2FuJ3Qgd2FpdCBmb3IgdGhlIHRlY2gsIGFuZCBzb21ldGltZXMgZG9uJ3QgbmVlZCB0by5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFxuICAgKiAgICAgICAgVGVjaCBtZXRob2RcbiAgICpcbiAgICogQHJldHVybiB7RnVuY3Rpb258dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIHRoZSBtZXRob2Qgb3IgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS50ZWNoR2V0XyA9IGZ1bmN0aW9uIHRlY2hHZXRfKG1ldGhvZCkge1xuICAgIGlmICghdGhpcy50ZWNoXyB8fCAhdGhpcy50ZWNoXy5pc1JlYWR5Xykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgaW4gYWxsb3dlZEdldHRlcnMpIHtcbiAgICAgIHJldHVybiBnZXQkMSh0aGlzLm1pZGRsZXdhcmVfLCB0aGlzLnRlY2hfLCBtZXRob2QpO1xuICAgIH0gZWxzZSBpZiAobWV0aG9kIGluIGFsbG93ZWRNZWRpYXRvcnMpIHtcbiAgICAgIHJldHVybiBtZWRpYXRlKHRoaXMubWlkZGxld2FyZV8sIHRoaXMudGVjaF8sIG1ldGhvZCk7XG4gICAgfVxuXG4gICAgLy8gRmxhc2ggbGlrZXMgdG8gZGllIGFuZCByZWxvYWQgd2hlbiB5b3UgaGlkZSBvciByZXBvc2l0aW9uIGl0LlxuICAgIC8vIEluIHRoZXNlIGNhc2VzIHRoZSBvYmplY3QgbWV0aG9kcyBnbyBhd2F5IGFuZCB3ZSBnZXQgZXJyb3JzLlxuICAgIC8vIFdoZW4gdGhhdCBoYXBwZW5zIHdlJ2xsIGNhdGNoIHRoZSBlcnJvcnMgYW5kIGluZm9ybSB0ZWNoIHRoYXQgaXQncyBub3QgcmVhZHkgYW55IG1vcmUuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnRlY2hfW21ldGhvZF0oKTtcbiAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgIC8vIFdoZW4gYnVpbGRpbmcgYWRkaXRpb25hbCB0ZWNoIGxpYnMsIGFuIGV4cGVjdGVkIG1ldGhvZCBtYXkgbm90IGJlIGRlZmluZWQgeWV0XG4gICAgICBpZiAodGhpcy50ZWNoX1ttZXRob2RdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG9nJDEoJ1ZpZGVvLmpzOiAnICsgbWV0aG9kICsgJyBtZXRob2Qgbm90IGRlZmluZWQgZm9yICcgKyB0aGlzLnRlY2hOYW1lXyArICcgcGxheWJhY2sgdGVjaG5vbG9neS4nLCBlKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgLy8gV2hlbiBhIG1ldGhvZCBpc24ndCBhdmFpbGFibGUgb24gdGhlIG9iamVjdCBpdCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAgICAgIGlmIChlLm5hbWUgPT09ICdUeXBlRXJyb3InKSB7XG4gICAgICAgIGxvZyQxKCdWaWRlby5qczogJyArIG1ldGhvZCArICcgdW5hdmFpbGFibGUgb24gJyArIHRoaXMudGVjaE5hbWVfICsgJyBwbGF5YmFjayB0ZWNobm9sb2d5IGVsZW1lbnQuJywgZSk7XG4gICAgICAgIHRoaXMudGVjaF8uaXNSZWFkeV8gPSBmYWxzZTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgZXJyb3IgdW5rbm93biwganVzdCBsb2cgYW5kIHRocm93XG4gICAgICBsb2ckMShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIGJlZ2luIHBsYXliYWNrIGF0IHRoZSBmaXJzdCBvcHBvcnR1bml0eS5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZXx1bmRlZmluZWR9XG4gICAqICAgICAgICAgUmV0dXJucyBhIHByb21pc2UgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgUHJvbWlzZXMgKG9yIG9uZVxuICAgKiAgICAgICAgIHdhcyBwYXNzZWQgaW4gYXMgYW4gb3B0aW9uKS4gVGhpcyBwcm9taXNlIHdpbGwgYmUgcmVzb2x2ZWQgb25cbiAgICogICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIG9mIHBsYXkuIElmIHRoaXMgaXMgdW5kZWZpbmVkIGl0IHdpbGwgZnVsZmlsbCB0aGVcbiAgICogICAgICAgICBwcm9taXNlIGNoYWluIG90aGVyd2lzZSB0aGUgcHJvbWlzZSBjaGFpbiB3aWxsIGJlIGZ1bGZpbGxlZCB3aGVuXG4gICAqICAgICAgICAgdGhlIHByb21pc2UgZnJvbSBwbGF5IGlzIGZ1bGZpbGxlZC5cbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbiBwbGF5KCkge1xuICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgdmFyIFByb21pc2VDbGFzcyA9IHRoaXMub3B0aW9uc18uUHJvbWlzZSB8fCB3aW5kb3cuUHJvbWlzZTtcblxuICAgIGlmIChQcm9taXNlQ2xhc3MpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNsYXNzKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIF90aGlzNy5wbGF5XyhyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBsYXlfKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgbG9naWMgZm9yIHBsYXksIHRha2VzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZVxuICAgKiByZXR1cm4gdmFsdWUgb2YgcGxheS4gVGhpcyBhbGxvd3MgdXMgdG8gcmVzb2x2ZSB0byB0aGUgcGxheSBwcm9taXNlIGlmIHRoZXJlXG4gICAqIGlzIG9uZSBvbiBtb2Rlcm4gYnJvd3NlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja11cbiAgICogICAgICAgIFRoZSBjYWxsYmFjayB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgdGVjaHMgcGxheSBpcyBhY3R1YWxseSBjYWxsZWRcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnBsYXlfID0gZnVuY3Rpb24gcGxheV8oKSB7XG4gICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHNpbGVuY2VQcm9taXNlO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBjYWxsZWQgd2hpbGUgd2UgaGF2ZSBhIHBsYXkgcXVldWVkIHVwIG9uIGEgbG9hZHN0YXJ0LCByZW1vdmVcbiAgICAvLyB0aGF0IGxpc3RlbmVyIHRvIGF2b2lkIGdldHRpbmcgaW4gYSBwb3RlbnRpYWxseSBiYWQgc3RhdGUuXG4gICAgaWYgKHRoaXMucGxheU9uTG9hZHN0YXJ0Xykge1xuICAgICAgdGhpcy5vZmYoJ2xvYWRzdGFydCcsIHRoaXMucGxheU9uTG9hZHN0YXJ0Xyk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHBsYXllci90ZWNoIGlzIG5vdCByZWFkeSwgcXVldWUgdXAgYW5vdGhlciBjYWxsIHRvIGBwbGF5KClgIGZvclxuICAgIC8vIHdoZW4gaXQgaXMuIFRoaXMgd2lsbCBsb29wIGJhY2sgaW50byB0aGlzIG1ldGhvZCBmb3IgYW5vdGhlciBhdHRlbXB0IGF0XG4gICAgLy8gcGxheWJhY2sgd2hlbiB0aGUgdGVjaCBpcyByZWFkeS5cbiAgICBpZiAoIXRoaXMuaXNSZWFkeV8pIHtcblxuICAgICAgLy8gQmFpbCBvdXQgaWYgd2UncmUgYWxyZWFkeSB3YWl0aW5nIGZvciBgcmVhZHlgIVxuICAgICAgaWYgKHRoaXMucGxheVdhaXRpbmdGb3JSZWFkeV8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBsYXlXYWl0aW5nRm9yUmVhZHlfID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczgucGxheVdhaXRpbmdGb3JSZWFkeV8gPSBmYWxzZTtcbiAgICAgICAgY2FsbGJhY2soX3RoaXM4LnBsYXkoKSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdGhlIHBsYXllci90ZWNoIGlzIHJlYWR5IGFuZCB3ZSBoYXZlIGEgc291cmNlLCB3ZSBjYW4gYXR0ZW1wdCBwbGF5YmFjay5cbiAgICB9IGVsc2UgaWYgKCF0aGlzLmNoYW5naW5nU3JjXyAmJiAodGhpcy5zcmMoKSB8fCB0aGlzLmN1cnJlbnRTcmMoKSkpIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMudGVjaEdldF8oJ3BsYXknKSk7XG4gICAgICByZXR1cm47XG5cbiAgICAgIC8vIElmIHRoZSB0ZWNoIGlzIHJlYWR5LCBidXQgd2UgZG8gbm90IGhhdmUgYSBzb3VyY2UsIHdlJ2xsIG5lZWQgdG8gd2FpdFxuICAgICAgLy8gZm9yIGJvdGggdGhlIGByZWFkeWAgYW5kIGEgYGxvYWRzdGFydGAgd2hlbiB0aGUgc291cmNlIGlzIGZpbmFsbHlcbiAgICAgIC8vIHJlc29sdmVkIGJ5IG1pZGRsZXdhcmUgYW5kIHNldCBvbiB0aGUgcGxheWVyLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGxheSgpYCBpcyBjYWxsZWQgd2hpbGUgY2hhbmdpbmcgc291cmNlcyBvciBiZWZvcmVcbiAgICAgIC8vIG9uZSBoYXMgYmVlbiBzZXQgb24gdGhlIHBsYXllci5cbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aGlzLnBsYXlPbkxvYWRzdGFydF8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzOC5wbGF5T25Mb2Fkc3RhcnRfID0gbnVsbDtcbiAgICAgICAgY2FsbGJhY2soX3RoaXM4LnBsYXkoKSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9uZSgnbG9hZHN0YXJ0JywgdGhpcy5wbGF5T25Mb2Fkc3RhcnRfKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFBhdXNlIHRoZSB2aWRlbyBwbGF5YmFja1xuICAgKlxuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9XG4gICAqICAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHBsYXllciBvYmplY3QgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIG9uXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgIHRoaXMudGVjaENhbGxfKCdwYXVzZScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGlzIHBhdXNlZCBvciBoYXMgeWV0IHRvIHBsYXlcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICAtIGZhbHNlOiBpZiB0aGUgbWVkaWEgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICogICAgICAgICAtIHRydWU6IGlmIG1lZGlhIGlzIG5vdCBjdXJyZW50bHkgcGxheWluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucGF1c2VkID0gZnVuY3Rpb24gcGF1c2VkKCkge1xuICAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIG9mIHBhdXNlZCBzaG91bGQgYmUgdHJ1ZSAoaW4gU2FmYXJpIGl0J3MgYWN0dWFsbHkgZmFsc2UpXG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ3BhdXNlZCcpID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGEgVGltZVJhbmdlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcmFuZ2VzIG9mIHRpbWUgdGhhdCB0aGUgdXNlclxuICAgKiBoYXMgcGxheWVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHtUaW1lUmFuZ2V9XG4gICAqICAgICAgICAgQSB0aW1lIHJhbmdlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYWxsIHRoZSBpbmNyZW1lbnRzIG9mIHRpbWUgdGhhdCBoYXZlXG4gICAqICAgICAgICAgYmVlbiBwbGF5ZWQuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5wbGF5ZWQgPSBmdW5jdGlvbiBwbGF5ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ3BsYXllZCcpIHx8IGNyZWF0ZVRpbWVSYW5nZXMoMCwgMCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHVzZXIgaXMgXCJzY3J1YmJpbmdcIi4gU2NydWJiaW5nIGlzXG4gICAqIHdoZW4gdGhlIHVzZXIgaGFzIGNsaWNrZWQgdGhlIHByb2dyZXNzIGJhciBoYW5kbGUgYW5kIGlzXG4gICAqIGRyYWdnaW5nIGl0IGFsb25nIHRoZSBwcm9ncmVzcyBiYXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU2NydWJiaW5nXVxuICAgKiAgICAgICAgd2V0aGVyIHRoZSB1c2VyIGlzIG9yIGlzIG5vdCBzY3J1YmJpbmdcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgdmFsdWUgb2Ygc2NydWJiaW5nIHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuc2NydWJiaW5nID0gZnVuY3Rpb24gc2NydWJiaW5nKGlzU2NydWJiaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBpc1NjcnViYmluZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcnViYmluZ187XG4gICAgfVxuICAgIHRoaXMuc2NydWJiaW5nXyA9ICEhaXNTY3J1YmJpbmc7XG5cbiAgICBpZiAoaXNTY3J1YmJpbmcpIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zY3J1YmJpbmcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXNjcnViYmluZycpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IG9yIHNldCB0aGUgY3VycmVudCB0aW1lIChpbiBzZWNvbmRzKVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtzZWNvbmRzXVxuICAgKiAgICAgICAgVGhlIHRpbWUgdG8gc2VlayB0byBpbiBzZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICAtIHRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcyB3aGVuIGdldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmN1cnJlbnRUaW1lID0gZnVuY3Rpb24gY3VycmVudFRpbWUoc2Vjb25kcykge1xuICAgIGlmICh0eXBlb2Ygc2Vjb25kcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChzZWNvbmRzIDwgMCkge1xuICAgICAgICBzZWNvbmRzID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMudGVjaENhbGxfKCdzZXRDdXJyZW50VGltZScsIHNlY29uZHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNhY2hlIGxhc3QgY3VycmVudFRpbWUgYW5kIHJldHVybi4gZGVmYXVsdCB0byAwIHNlY29uZHNcbiAgICAvL1xuICAgIC8vIENhY2hpbmcgdGhlIGN1cnJlbnRUaW1lIGlzIG1lYW50IHRvIHByZXZlbnQgYSBtYXNzaXZlIGFtb3VudCBvZiByZWFkcyBvbiB0aGUgdGVjaCdzXG4gICAgLy8gY3VycmVudFRpbWUgd2hlbiBzY3J1YmJpbmcsIGJ1dCBtYXkgbm90IHByb3ZpZGUgbXVjaCBwZXJmb3JtYW5jZSBiZW5lZml0IGFmdGVyYWxsLlxuICAgIC8vIFNob3VsZCBiZSB0ZXN0ZWQuIEFsc28gc29tZXRoaW5nIGhhcyB0byByZWFkIHRoZSBhY3R1YWwgY3VycmVudCB0aW1lIG9yIHRoZSBjYWNoZSB3aWxsXG4gICAgLy8gbmV2ZXIgZ2V0IHVwZGF0ZWQuXG4gICAgdGhpcy5jYWNoZV8uY3VycmVudFRpbWUgPSB0aGlzLnRlY2hHZXRfKCdjdXJyZW50VGltZScpIHx8IDA7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVfLmN1cnJlbnRUaW1lO1xuICB9O1xuXG4gIC8qKlxuICAgKiBOb3JtYWxseSBnZXRzIHRoZSBsZW5ndGggaW4gdGltZSBvZiB0aGUgdmlkZW8gaW4gc2Vjb25kcztcbiAgICogaW4gYWxsIGJ1dCB0aGUgcmFyZXN0IHVzZSBjYXNlcyBhbiBhcmd1bWVudCB3aWxsIE5PVCBiZSBwYXNzZWQgdG8gdGhlIG1ldGhvZFxuICAgKlxuICAgKiA+ICoqTk9URSoqOiBUaGUgdmlkZW8gbXVzdCBoYXZlIHN0YXJ0ZWQgbG9hZGluZyBiZWZvcmUgdGhlIGR1cmF0aW9uIGNhbiBiZVxuICAgKiBrbm93biwgYW5kIGluIHRoZSBjYXNlIG9mIEZsYXNoLCBtYXkgbm90IGJlIGtub3duIHVudGlsIHRoZSB2aWRlbyBzdGFydHNcbiAgICogcGxheWluZy5cbiAgICpcbiAgICogQGZpcmVzIFBsYXllciNkdXJhdGlvbmNoYW5nZVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZHNdXG4gICAqICAgICAgICBUaGUgZHVyYXRpb24gb2YgdGhlIHZpZGVvIHRvIHNldCBpbiBzZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgdmlkZW8gaW4gc2Vjb25kcyB3aGVuIGdldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24gZHVyYXRpb24oc2Vjb25kcykge1xuICAgIGlmIChzZWNvbmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHJldHVybiBOYU4gaWYgdGhlIGR1cmF0aW9uIGlzIG5vdCBrbm93blxuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVfLmR1cmF0aW9uICE9PSB1bmRlZmluZWQgPyB0aGlzLmNhY2hlXy5kdXJhdGlvbiA6IE5hTjtcbiAgICB9XG5cbiAgICBzZWNvbmRzID0gcGFyc2VGbG9hdChzZWNvbmRzKTtcblxuICAgIC8vIFN0YW5kYXJkaXplIG9uIEluaWZpdHkgZm9yIHNpZ25hbGluZyB2aWRlbyBpcyBsaXZlXG4gICAgaWYgKHNlY29uZHMgPCAwKSB7XG4gICAgICBzZWNvbmRzID0gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgaWYgKHNlY29uZHMgIT09IHRoaXMuY2FjaGVfLmR1cmF0aW9uKSB7XG4gICAgICAvLyBDYWNoZSB0aGUgbGFzdCBzZXQgdmFsdWUgZm9yIG9wdGltaXplZCBzY3J1YmJpbmcgKGVzcC4gRmxhc2gpXG4gICAgICB0aGlzLmNhY2hlXy5kdXJhdGlvbiA9IHNlY29uZHM7XG5cbiAgICAgIGlmIChzZWNvbmRzID09PSBJbmZpbml0eSkge1xuICAgICAgICB0aGlzLmFkZENsYXNzKCd2anMtbGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWxpdmUnKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQGV2ZW50IFBsYXllciNkdXJhdGlvbmNoYW5nZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ2R1cmF0aW9uY2hhbmdlJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGhvdyBtdWNoIHRpbWUgaXMgbGVmdCBpbiB0aGUgdmlkZW8uIE5vdCBwYXJ0XG4gICAqIG9mIHRoZSBuYXRpdmUgdmlkZW8gQVBJLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgVGhlIHRpbWUgcmVtYWluaW5nIGluIHNlY29uZHNcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnJlbWFpbmluZ1RpbWUgPSBmdW5jdGlvbiByZW1haW5pbmdUaW1lKCkge1xuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uKCkgLSB0aGlzLmN1cnJlbnRUaW1lKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgcmVtYWluaW5nIHRpbWUgZnVuY3Rpb24gdGhhdCBpcyBpbnRlbnRlZCB0byBiZSB1c2VkIHdoZW5cbiAgICogdGhlIHRpbWUgaXMgdG8gYmUgZGlzcGxheWVkIGRpcmVjdGx5IHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgVGhlIHJvdW5kZWQgdGltZSByZW1haW5pbmcgaW4gc2Vjb25kc1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucmVtYWluaW5nVGltZURpc3BsYXkgPSBmdW5jdGlvbiByZW1haW5pbmdUaW1lRGlzcGxheSgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLmR1cmF0aW9uKCkpIC0gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRUaW1lKCkpO1xuICB9O1xuXG4gIC8vXG4gIC8vIEtpbmQgb2YgbGlrZSBhbiBhcnJheSBvZiBwb3J0aW9ucyBvZiB0aGUgdmlkZW8gdGhhdCBoYXZlIGJlZW4gZG93bmxvYWRlZC5cblxuICAvKipcbiAgICogR2V0IGEgVGltZVJhbmdlIG9iamVjdCB3aXRoIGFuIGFycmF5IG9mIHRoZSB0aW1lcyBvZiB0aGUgdmlkZW9cbiAgICogdGhhdCBoYXZlIGJlZW4gZG93bmxvYWRlZC4gSWYgeW91IGp1c3Qgd2FudCB0aGUgcGVyY2VudCBvZiB0aGVcbiAgICogdmlkZW8gdGhhdCdzIGJlZW4gZG93bmxvYWRlZCwgdXNlIGJ1ZmZlcmVkUGVyY2VudC5cbiAgICpcbiAgICogQHNlZSBbQnVmZmVyZWQgU3BlY117QGxpbmsgaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy92aWRlby5odG1sI2RvbS1tZWRpYS1idWZmZXJlZH1cbiAgICpcbiAgICogQHJldHVybiB7VGltZVJhbmdlfVxuICAgKiAgICAgICAgIEEgbW9jayBUaW1lUmFuZ2Ugb2JqZWN0IChmb2xsb3dpbmcgSFRNTCBzcGVjKVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuYnVmZmVyZWQgPSBmdW5jdGlvbiBidWZmZXJlZCgpIHtcbiAgICB2YXIgYnVmZmVyZWQgPSB0aGlzLnRlY2hHZXRfKCdidWZmZXJlZCcpO1xuXG4gICAgaWYgKCFidWZmZXJlZCB8fCAhYnVmZmVyZWQubGVuZ3RoKSB7XG4gICAgICBidWZmZXJlZCA9IGNyZWF0ZVRpbWVSYW5nZXMoMCwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlcmVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBlcmNlbnQgKGFzIGEgZGVjaW1hbCkgb2YgdGhlIHZpZGVvIHRoYXQncyBiZWVuIGRvd25sb2FkZWQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBhIHBhcnQgb2YgdGhlIG5hdGl2ZSBIVE1MIHZpZGVvIEFQSS5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIEEgZGVjaW1hbCBiZXR3ZWVuIDAgYW5kIDEgcmVwcmVzZW50aW5nIHRoZSBwZXJjZW50XG4gICAqICAgICAgICAgdGhhdCBpcyBidWZmZXJyZWQgMCBiZWluZyAwJSBhbmQgMSBiZWluZyAxMDAlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5idWZmZXJlZFBlcmNlbnQgPSBmdW5jdGlvbiBidWZmZXJlZFBlcmNlbnQkJDEoKSB7XG4gICAgcmV0dXJuIGJ1ZmZlcmVkUGVyY2VudCh0aGlzLmJ1ZmZlcmVkKCksIHRoaXMuZHVyYXRpb24oKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZW5kaW5nIHRpbWUgb2YgdGhlIGxhc3QgYnVmZmVyZWQgdGltZSByYW5nZVxuICAgKiBUaGlzIGlzIHVzZWQgaW4gdGhlIHByb2dyZXNzIGJhciB0byBlbmNhcHN1bGF0ZSBhbGwgdGltZSByYW5nZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgZW5kIG9mIHRoZSBsYXN0IGJ1ZmZlcmVkIHRpbWUgcmFuZ2VcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmJ1ZmZlcmVkRW5kID0gZnVuY3Rpb24gYnVmZmVyZWRFbmQoKSB7XG4gICAgdmFyIGJ1ZmZlcmVkID0gdGhpcy5idWZmZXJlZCgpO1xuICAgIHZhciBkdXJhdGlvbiA9IHRoaXMuZHVyYXRpb24oKTtcbiAgICB2YXIgZW5kID0gYnVmZmVyZWQuZW5kKGJ1ZmZlcmVkLmxlbmd0aCAtIDEpO1xuXG4gICAgaWYgKGVuZCA+IGR1cmF0aW9uKSB7XG4gICAgICBlbmQgPSBkdXJhdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5kO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBjdXJyZW50IHZvbHVtZSBvZiB0aGUgbWVkaWFcbiAgICpcbiAgICogQHBhcmFtICB7bnVtYmVyfSBbcGVyY2VudEFzRGVjaW1hbF1cbiAgICogICAgICAgICBUaGUgbmV3IHZvbHVtZSBhcyBhIGRlY2ltYWwgcGVyY2VudDpcbiAgICogICAgICAgICAtIDAgaXMgbXV0ZWQvMCUvb2ZmXG4gICAqICAgICAgICAgLSAxLjAgaXMgMTAwJS9mdWxsXG4gICAqICAgICAgICAgLSAwLjUgaXMgaGFsZiB2b2x1bWUgb3IgNTAlXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2b2x1bWUgYXMgYSBwZXJjZW50IHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUudm9sdW1lID0gZnVuY3Rpb24gdm9sdW1lKHBlcmNlbnRBc0RlY2ltYWwpIHtcbiAgICB2YXIgdm9sID0gdm9pZCAwO1xuXG4gICAgaWYgKHBlcmNlbnRBc0RlY2ltYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRm9yY2UgdmFsdWUgdG8gYmV0d2VlbiAwIGFuZCAxXG4gICAgICB2b2wgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwYXJzZUZsb2F0KHBlcmNlbnRBc0RlY2ltYWwpKSk7XG4gICAgICB0aGlzLmNhY2hlXy52b2x1bWUgPSB2b2w7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0Vm9sdW1lJywgdm9sKTtcblxuICAgICAgaWYgKHZvbCA+IDApIHtcbiAgICAgICAgdGhpcy5sYXN0Vm9sdW1lXyh2b2wpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB0byAxIHdoZW4gcmV0dXJuaW5nIGN1cnJlbnQgdm9sdW1lLlxuICAgIHZvbCA9IHBhcnNlRmxvYXQodGhpcy50ZWNoR2V0Xygndm9sdW1lJykpO1xuICAgIHJldHVybiBpc05hTih2b2wpID8gMSA6IHZvbDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IG11dGVkIHN0YXRlLCBvciB0dXJuIG11dGUgb24gb3Igb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW211dGVkXVxuICAgKiAgICAgICAgLSB0cnVlIHRvIG11dGVcbiAgICogICAgICAgIC0gZmFsc2UgdG8gdW5tdXRlXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqICAgICAgICAgLSB0cnVlIGlmIG11dGUgaXMgb24gYW5kIGdldHRpbmdcbiAgICogICAgICAgICAtIGZhbHNlIGlmIG11dGUgaXMgb2ZmIGFuZCBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5tdXRlZCA9IGZ1bmN0aW9uIG11dGVkKF9tdXRlZCkge1xuICAgIGlmIChfbXV0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldE11dGVkJywgX211dGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ211dGVkJykgfHwgZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0TXV0ZWQgc3RhdGUsIG9yIHR1cm4gZGVmYXVsdE11dGVkIG9uIG9yIG9mZi4gZGVmYXVsdE11dGVkXG4gICAqIGluZGljYXRlcyB0aGUgc3RhdGUgb2YgbXV0ZWQgb24gaW50aWFsIHBsYXliYWNrLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAgIHZhciBteVBsYXllciA9IHZpZGVvanMoJ3NvbWUtcGxheWVyLWlkJyk7XG4gICAqXG4gICAqICAgbXlQbGF5ZXIuc3JjKFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9wYXRoL3RvL3ZpZGVvLm1wNFwiKTtcbiAgICpcbiAgICogICAvLyBnZXQsIHNob3VsZCBiZSBmYWxzZVxuICAgKiAgIGNvbnNvbGUubG9nKG15UGxheWVyLmRlZmF1bHRNdXRlZCgpKTtcbiAgICogICAvLyBzZXQgdG8gdHJ1ZVxuICAgKiAgIG15UGxheWVyLmRlZmF1bHRNdXRlZCh0cnVlKTtcbiAgICogICAvLyBnZXQgc2hvdWxkIGJlIHRydWVcbiAgICogICBjb25zb2xlLmxvZyhteVBsYXllci5kZWZhdWx0TXV0ZWQoKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWZhdWx0TXV0ZWRdXG4gICAqICAgICAgICAtIHRydWUgdG8gbXV0ZVxuICAgKiAgICAgICAgLSBmYWxzZSB0byB1bm11dGVcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbnxQbGF5ZXJ9XG4gICAqICAgICAgICAgLSB0cnVlIGlmIGRlZmF1bHRNdXRlZCBpcyBvbiBhbmQgZ2V0dGluZ1xuICAgKiAgICAgICAgIC0gZmFsc2UgaWYgZGVmYXVsdE11dGVkIGlzIG9mZiBhbmQgZ2V0dGluZ1xuICAgKiAgICAgICAgIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcGxheWVyIHdoZW4gc2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuZGVmYXVsdE11dGVkID0gZnVuY3Rpb24gZGVmYXVsdE11dGVkKF9kZWZhdWx0TXV0ZWQpIHtcbiAgICBpZiAoX2RlZmF1bHRNdXRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoQ2FsbF8oJ3NldERlZmF1bHRNdXRlZCcsIF9kZWZhdWx0TXV0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnZGVmYXVsdE11dGVkJykgfHwgZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFzdCB2b2x1bWUsIG9yIHNldCBpdFxuICAgKlxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IFtwZXJjZW50QXNEZWNpbWFsXVxuICAgKiAgICAgICAgIFRoZSBuZXcgbGFzdCB2b2x1bWUgYXMgYSBkZWNpbWFsIHBlcmNlbnQ6XG4gICAqICAgICAgICAgLSAwIGlzIG11dGVkLzAlL29mZlxuICAgKiAgICAgICAgIC0gMS4wIGlzIDEwMCUvZnVsbFxuICAgKiAgICAgICAgIC0gMC41IGlzIGhhbGYgdm9sdW1lIG9yIDUwJVxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgdGhlIGN1cnJlbnQgdmFsdWUgb2YgbGFzdFZvbHVtZSBhcyBhIHBlcmNlbnQgd2hlbiBnZXR0aW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5sYXN0Vm9sdW1lXyA9IGZ1bmN0aW9uIGxhc3RWb2x1bWVfKHBlcmNlbnRBc0RlY2ltYWwpIHtcbiAgICBpZiAocGVyY2VudEFzRGVjaW1hbCAhPT0gdW5kZWZpbmVkICYmIHBlcmNlbnRBc0RlY2ltYWwgIT09IDApIHtcbiAgICAgIHRoaXMuY2FjaGVfLmxhc3RWb2x1bWUgPSBwZXJjZW50QXNEZWNpbWFsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZV8ubGFzdFZvbHVtZTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCB0ZWNoIGNhbiBzdXBwb3J0IG5hdGl2ZSBmdWxsc2NyZWVuXG4gICAqIChlLmcuIHdpdGggYnVpbHQgaW4gY29udHJvbHMgbGlrZSBpT1MsIHNvIG5vdCBvdXIgZmxhc2ggc3dmKVxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiAgICAgICAgIGlmIG5hdGl2ZSBmdWxsc2NyZWVuIGlzIHN1cHBvcnRlZFxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuc3VwcG9ydHNGdWxsU2NyZWVuID0gZnVuY3Rpb24gc3VwcG9ydHNGdWxsU2NyZWVuKCkge1xuICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdzdXBwb3J0c0Z1bGxTY3JlZW4nKSB8fCBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBpbiBmdWxsc2NyZWVuIG1vZGUgb3IgdGVsbCB0aGUgcGxheWVyIHRoYXQgaXRcbiAgICogaXMgb3IgaXMgbm90IGluIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICpcbiAgICogPiBOT1RFOiBBcyBvZiB0aGUgbGF0ZXN0IEhUTUw1IHNwZWMsIGlzRnVsbHNjcmVlbiBpcyBubyBsb25nZXIgYW4gb2ZmaWNpYWxcbiAgICogcHJvcGVydHkgYW5kIGluc3RlYWQgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgaXMgdXNlZC4gQnV0IGlzRnVsbHNjcmVlbiBpc1xuICAgKiBzdGlsbCBhIHZhbHVhYmxlIHByb3BlcnR5IGZvciBpbnRlcm5hbCBwbGF5ZXIgd29ya2luZ3MuXG4gICAqXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IFtpc0ZTXVxuICAgKiAgICAgICAgIFNldCB0aGUgcGxheWVycyBjdXJyZW50IGZ1bGxzY3JlZW4gc3RhdGVcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICAtIHRydWUgaWYgZnVsbHNjcmVlbiBpcyBvbiBhbmQgZ2V0dGluZ1xuICAgKiAgICAgICAgIC0gZmFsc2UgaWYgZnVsbHNjcmVlbiBpcyBvZmYgYW5kIGdldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmlzRnVsbHNjcmVlbiA9IGZ1bmN0aW9uIGlzRnVsbHNjcmVlbihpc0ZTKSB7XG4gICAgaWYgKGlzRlMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0Z1bGxzY3JlZW5fID0gISFpc0ZTO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gISF0aGlzLmlzRnVsbHNjcmVlbl87XG4gIH07XG5cbiAgLyoqXG4gICAqIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSB2aWRlbyB0byBmdWxsIHNjcmVlblxuICAgKiBJbiBzb21lIGJyb3dzZXJzLCBmdWxsIHNjcmVlbiBpcyBub3Qgc3VwcG9ydGVkIG5hdGl2ZWx5LCBzbyBpdCBlbnRlcnNcbiAgICogXCJmdWxsIHdpbmRvdyBtb2RlXCIsIHdoZXJlIHRoZSB2aWRlbyBmaWxscyB0aGUgYnJvd3NlciB3aW5kb3cuXG4gICAqIEluIGJyb3dzZXJzIGFuZCBkZXZpY2VzIHRoYXQgc3VwcG9ydCBuYXRpdmUgZnVsbCBzY3JlZW4sIHNvbWV0aW1lcyB0aGVcbiAgICogYnJvd3NlcidzIGRlZmF1bHQgY29udHJvbHMgd2lsbCBiZSBzaG93biwgYW5kIG5vdCB0aGUgVmlkZW8uanMgY3VzdG9tIHNraW4uXG4gICAqIFRoaXMgaW5jbHVkZXMgbW9zdCBtb2JpbGUgZGV2aWNlcyAoaU9TLCBBbmRyb2lkKSBhbmQgb2xkZXIgdmVyc2lvbnMgb2ZcbiAgICogU2FmYXJpLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2VcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnJlcXVlc3RGdWxsc2NyZWVuID0gZnVuY3Rpb24gcmVxdWVzdEZ1bGxzY3JlZW4oKSB7XG4gICAgdmFyIGZzQXBpID0gRnVsbHNjcmVlbkFwaTtcblxuICAgIHRoaXMuaXNGdWxsc2NyZWVuKHRydWUpO1xuXG4gICAgaWYgKGZzQXBpLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAvLyB0aGUgYnJvd3NlciBzdXBwb3J0cyBnb2luZyBmdWxsc2NyZWVuIGF0IHRoZSBlbGVtZW50IGxldmVsIHNvIHdlIGNhblxuICAgICAgLy8gdGFrZSB0aGUgY29udHJvbHMgZnVsbHNjcmVlbiBhcyB3ZWxsIGFzIHRoZSB2aWRlb1xuXG4gICAgICAvLyBUcmlnZ2VyIGZ1bGxzY3JlZW5jaGFuZ2UgZXZlbnQgYWZ0ZXIgY2hhbmdlXG4gICAgICAvLyBXZSBoYXZlIHRvIHNwZWNpZmljYWxseSBhZGQgdGhpcyBlYWNoIHRpbWUsIGFuZCByZW1vdmVcbiAgICAgIC8vIHdoZW4gY2FuY2VsaW5nIGZ1bGxzY3JlZW4uIE90aGVyd2lzZSBpZiB0aGVyZSdzIG11bHRpcGxlXG4gICAgICAvLyBwbGF5ZXJzIG9uIGEgcGFnZSwgdGhleSB3b3VsZCBhbGwgYmUgcmVhY3RpbmcgdG8gdGhlIHNhbWUgZnVsbHNjcmVlblxuICAgICAgLy8gZXZlbnRzXG4gICAgICBvbihkb2N1bWVudCwgZnNBcGkuZnVsbHNjcmVlbmNoYW5nZSwgYmluZCh0aGlzLCBmdW5jdGlvbiBkb2N1bWVudEZ1bGxzY3JlZW5DaGFuZ2UoZSkge1xuICAgICAgICB0aGlzLmlzRnVsbHNjcmVlbihkb2N1bWVudFtmc0FwaS5mdWxsc2NyZWVuRWxlbWVudF0pO1xuXG4gICAgICAgIC8vIElmIGNhbmNlbGxpbmcgZnVsbHNjcmVlbiwgcmVtb3ZlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4oKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvZmYoZG9jdW1lbnQsIGZzQXBpLmZ1bGxzY3JlZW5jaGFuZ2UsIGRvY3VtZW50RnVsbHNjcmVlbkNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBldmVudCBQbGF5ZXIjZnVsbHNjcmVlbmNoYW5nZVxuICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5lbF9bZnNBcGkucmVxdWVzdEZ1bGxzY3JlZW5dKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnRlY2hfLnN1cHBvcnRzRnVsbFNjcmVlbigpKSB7XG4gICAgICAvLyB3ZSBjYW4ndCB0YWtlIHRoZSB2aWRlby5qcyBjb250cm9scyBmdWxsc2NyZWVuIGJ1dCB3ZSBjYW4gZ28gZnVsbHNjcmVlblxuICAgICAgLy8gd2l0aCBuYXRpdmUgY29udHJvbHNcbiAgICAgIHRoaXMudGVjaENhbGxfKCdlbnRlckZ1bGxTY3JlZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZnVsbHNjcmVlbiBpc24ndCBzdXBwb3J0ZWQgc28gd2UnbGwganVzdCBzdHJldGNoIHRoZSB2aWRlbyBlbGVtZW50IHRvXG4gICAgICAvLyBmaWxsIHRoZSB2aWV3cG9ydFxuICAgICAgdGhpcy5lbnRlckZ1bGxXaW5kb3coKTtcbiAgICAgIC8qKlxuICAgICAgICogQGV2ZW50IFBsYXllciNmdWxsc2NyZWVuY2hhbmdlXG4gICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgKi9cbiAgICAgIHRoaXMudHJpZ2dlcignZnVsbHNjcmVlbmNoYW5nZScpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB2aWRlbyB0byBpdHMgbm9ybWFsIHNpemUgYWZ0ZXIgaGF2aW5nIGJlZW4gaW4gZnVsbCBzY3JlZW4gbW9kZVxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2VcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuID0gZnVuY3Rpb24gZXhpdEZ1bGxzY3JlZW4oKSB7XG4gICAgdmFyIGZzQXBpID0gRnVsbHNjcmVlbkFwaTtcblxuICAgIHRoaXMuaXNGdWxsc2NyZWVuKGZhbHNlKTtcblxuICAgIC8vIENoZWNrIGZvciBicm93c2VyIGVsZW1lbnQgZnVsbHNjcmVlbiBzdXBwb3J0XG4gICAgaWYgKGZzQXBpLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBkb2N1bWVudFtmc0FwaS5leGl0RnVsbHNjcmVlbl0oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudGVjaF8uc3VwcG9ydHNGdWxsU2NyZWVuKCkpIHtcbiAgICAgIHRoaXMudGVjaENhbGxfKCdleGl0RnVsbFNjcmVlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4aXRGdWxsV2luZG93KCk7XG4gICAgICAvKipcbiAgICAgICAqIEBldmVudCBQbGF5ZXIjZnVsbHNjcmVlbmNoYW5nZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gZnVsbHNjcmVlbiBpc24ndCBzdXBwb3J0ZWQgd2UgY2FuIHN0cmV0Y2ggdGhlXG4gICAqIHZpZGVvIGNvbnRhaW5lciB0byBhcyB3aWRlIGFzIHRoZSBicm93c2VyIHdpbGwgbGV0IHVzLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2VudGVyRnVsbFdpbmRvd1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuZW50ZXJGdWxsV2luZG93ID0gZnVuY3Rpb24gZW50ZXJGdWxsV2luZG93KCkge1xuICAgIHRoaXMuaXNGdWxsV2luZG93ID0gdHJ1ZTtcblxuICAgIC8vIFN0b3Jpbmcgb3JpZ2luYWwgZG9jIG92ZXJmbG93IHZhbHVlIHRvIHJldHVybiB0byB3aGVuIGZ1bGxzY3JlZW4gaXMgb2ZmXG4gICAgdGhpcy5kb2NPcmlnT3ZlcmZsb3cgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3c7XG5cbiAgICAvLyBBZGQgbGlzdGVuZXIgZm9yIGVzYyBrZXkgdG8gZXhpdCBmdWxsc2NyZWVuXG4gICAgb24oZG9jdW1lbnQsICdrZXlkb3duJywgYmluZCh0aGlzLCB0aGlzLmZ1bGxXaW5kb3dPbkVzY0tleSkpO1xuXG4gICAgLy8gSGlkZSBhbnkgc2Nyb2xsIGJhcnNcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIC8vIEFwcGx5IGZ1bGxzY3JlZW4gc3R5bGVzXG4gICAgYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgJ3Zqcy1mdWxsLXdpbmRvdycpO1xuXG4gICAgLyoqXG4gICAgICogQGV2ZW50IFBsYXllciNlbnRlckZ1bGxXaW5kb3dcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdlbnRlckZ1bGxXaW5kb3cnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGNhbGwgdG8gZWl0aGVyIGV4aXQgZnVsbCB3aW5kb3cgb3JcbiAgICogZnVsbCBzY3JlZW4gb24gRVNDIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogICAgICAgIEV2ZW50IHRvIGNoZWNrIGZvciBrZXkgcHJlc3NcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmZ1bGxXaW5kb3dPbkVzY0tleSA9IGZ1bmN0aW9uIGZ1bGxXaW5kb3dPbkVzY0tleShldmVudCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgaWYgKHRoaXMuaXNGdWxsc2NyZWVuKCkgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5leGl0RnVsbHNjcmVlbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leGl0RnVsbFdpbmRvdygpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRXhpdCBmdWxsIHdpbmRvd1xuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2V4aXRGdWxsV2luZG93XG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5leGl0RnVsbFdpbmRvdyA9IGZ1bmN0aW9uIGV4aXRGdWxsV2luZG93KCkge1xuICAgIHRoaXMuaXNGdWxsV2luZG93ID0gZmFsc2U7XG4gICAgb2ZmKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuZnVsbFdpbmRvd09uRXNjS2V5KTtcblxuICAgIC8vIFVuaGlkZSBzY3JvbGwgYmFycy5cbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSB0aGlzLmRvY09yaWdPdmVyZmxvdztcblxuICAgIC8vIFJlbW92ZSBmdWxsc2NyZWVuIHN0eWxlc1xuICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksICd2anMtZnVsbC13aW5kb3cnKTtcblxuICAgIC8vIFJlc2l6ZSB0aGUgYm94LCBjb250cm9sbGVyLCBhbmQgcG9zdGVyIHRvIG9yaWdpbmFsIHNpemVzXG4gICAgLy8gdGhpcy5wb3NpdGlvbkFsbCgpO1xuICAgIC8qKlxuICAgICAqIEBldmVudCBQbGF5ZXIjZXhpdEZ1bGxXaW5kb3dcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdleGl0RnVsbFdpbmRvdycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoZSBwbGF5ZXIgY2FuIHBsYXkgYSBnaXZlbiBtaW1ldHlwZVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwMTEzL3ZpZGVvLmh0bWwjZG9tLW5hdmlnYXRvci1jYW5wbGF5dHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiAgICAgICAgVGhlIG1pbWV0eXBlIHRvIGNoZWNrXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiBjYW5QbGF5VHlwZSh0eXBlKSB7XG4gICAgdmFyIGNhbiA9IHZvaWQgMDtcblxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIHBsYXliYWNrIHRlY2hub2xvZ3kgaW4gdGhlIG9wdGlvbnMgb3JkZXJcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IHRoaXMub3B0aW9uc18udGVjaE9yZGVyOyBpIDwgai5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRlY2hOYW1lID0galtpXTtcbiAgICAgIHZhciB0ZWNoID0gVGVjaC5nZXRUZWNoKHRlY2hOYW1lKTtcblxuICAgICAgLy8gU3VwcG9ydCBvbGQgYmVoYXZpb3Igb2YgdGVjaHMgYmVpbmcgcmVnaXN0ZXJlZCBhcyBjb21wb25lbnRzLlxuICAgICAgLy8gUmVtb3ZlIG9uY2UgdGhhdCBkZXByZWNhdGVkIGJlaGF2aW9yIGlzIHJlbW92ZWQuXG4gICAgICBpZiAoIXRlY2gpIHtcbiAgICAgICAgdGVjaCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQodGVjaE5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0ZWNoIGlzIGRlZmluZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgIGlmICghdGVjaCkge1xuICAgICAgICBsb2ckMS5lcnJvcignVGhlIFwiJyArIHRlY2hOYW1lICsgJ1wiIHRlY2ggaXMgdW5kZWZpbmVkLiBTa2lwcGVkIGJyb3dzZXIgc3VwcG9ydCBjaGVjayBmb3IgdGhhdCB0ZWNoLicpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhpcyB0ZWNobm9sb2d5XG4gICAgICBpZiAodGVjaC5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgIGNhbiA9IHRlY2guY2FuUGxheVR5cGUodHlwZSk7XG5cbiAgICAgICAgaWYgKGNhbikge1xuICAgICAgICAgIHJldHVybiBjYW47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBzb3VyY2UgYmFzZWQgb24gdGVjaC1vcmRlciBvciBzb3VyY2Utb3JkZXJcbiAgICogVXNlcyBzb3VyY2Utb3JkZXIgc2VsZWN0aW9uIGlmIGBvcHRpb25zLnNvdXJjZU9yZGVyYCBpcyB0cnV0aHkuIE90aGVyd2lzZSxcbiAgICogZGVmYXVsdHMgdG8gdGVjaC1vcmRlciBzZWxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gc291cmNlc1xuICAgKiAgICAgICAgVGhlIHNvdXJjZXMgZm9yIGEgbWVkaWEgYXNzZXRcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fGJvb2xlYW59XG4gICAqICAgICAgICAgT2JqZWN0IG9mIHNvdXJjZSBhbmQgdGVjaCBvcmRlciBvciBmYWxzZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuc2VsZWN0U291cmNlID0gZnVuY3Rpb24gc2VsZWN0U291cmNlKHNvdXJjZXMpIHtcbiAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgIC8vIEdldCBvbmx5IHRoZSB0ZWNocyBzcGVjaWZpZWQgaW4gYHRlY2hPcmRlcmAgdGhhdCBleGlzdCBhbmQgYXJlIHN1cHBvcnRlZCBieSB0aGVcbiAgICAvLyBjdXJyZW50IHBsYXRmb3JtXG4gICAgdmFyIHRlY2hzID0gdGhpcy5vcHRpb25zXy50ZWNoT3JkZXIubWFwKGZ1bmN0aW9uICh0ZWNoTmFtZSkge1xuICAgICAgcmV0dXJuIFt0ZWNoTmFtZSwgVGVjaC5nZXRUZWNoKHRlY2hOYW1lKV07XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgdGVjaE5hbWUgPSBfcmVmWzBdLFxuICAgICAgICAgIHRlY2ggPSBfcmVmWzFdO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0ZWNoIGlzIGRlZmluZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgIGlmICh0ZWNoKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgdGVjaG5vbG9neVxuICAgICAgICByZXR1cm4gdGVjaC5pc1N1cHBvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBsb2ckMS5lcnJvcignVGhlIFwiJyArIHRlY2hOYW1lICsgJ1wiIHRlY2ggaXMgdW5kZWZpbmVkLiBTa2lwcGVkIGJyb3dzZXIgc3VwcG9ydCBjaGVjayBmb3IgdGhhdCB0ZWNoLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggYGlubmVyQXJyYXlgIGVsZW1lbnQgb25jZSBwZXIgYG91dGVyQXJyYXlgIGVsZW1lbnQgYW5kIGV4ZWN1dGVcbiAgICAvLyBgdGVzdGVyYCB3aXRoIGJvdGguIElmIGB0ZXN0ZXJgIHJldHVybnMgYSBub24tZmFsc3kgdmFsdWUsIGV4aXQgZWFybHkgYW5kIHJldHVyblxuICAgIC8vIHRoYXQgdmFsdWUuXG4gICAgdmFyIGZpbmRGaXJzdFBhc3NpbmdUZWNoU291cmNlUGFpciA9IGZ1bmN0aW9uIGZpbmRGaXJzdFBhc3NpbmdUZWNoU291cmNlUGFpcihvdXRlckFycmF5LCBpbm5lckFycmF5LCB0ZXN0ZXIpIHtcbiAgICAgIHZhciBmb3VuZCA9IHZvaWQgMDtcblxuICAgICAgb3V0ZXJBcnJheS5zb21lKGZ1bmN0aW9uIChvdXRlckNob2ljZSkge1xuICAgICAgICByZXR1cm4gaW5uZXJBcnJheS5zb21lKGZ1bmN0aW9uIChpbm5lckNob2ljZSkge1xuICAgICAgICAgIGZvdW5kID0gdGVzdGVyKG91dGVyQ2hvaWNlLCBpbm5lckNob2ljZSk7XG5cbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH07XG5cbiAgICB2YXIgZm91bmRTb3VyY2VBbmRUZWNoID0gdm9pZCAwO1xuICAgIHZhciBmbGlwID0gZnVuY3Rpb24gZmxpcChmbikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBmbihiLCBhKTtcbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgZmluZGVyID0gZnVuY3Rpb24gZmluZGVyKF9yZWYyLCBzb3VyY2UpIHtcbiAgICAgIHZhciB0ZWNoTmFtZSA9IF9yZWYyWzBdLFxuICAgICAgICAgIHRlY2ggPSBfcmVmMlsxXTtcblxuICAgICAgaWYgKHRlY2guY2FuUGxheVNvdXJjZShzb3VyY2UsIF90aGlzOS5vcHRpb25zX1t0ZWNoTmFtZS50b0xvd2VyQ2FzZSgpXSkpIHtcbiAgICAgICAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UsIHRlY2g6IHRlY2hOYW1lIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdHJ1dGhpbmVzcyBvZiBgb3B0aW9ucy5zb3VyY2VPcmRlcmAsIHdlIHN3YXAgdGhlIG9yZGVyIG9mIHRlY2hzIGFuZCBzb3VyY2VzXG4gICAgLy8gdG8gc2VsZWN0IGZyb20gdGhlbSBiYXNlZCBvbiB0aGVpciBwcmlvcml0eS5cbiAgICBpZiAodGhpcy5vcHRpb25zXy5zb3VyY2VPcmRlcikge1xuICAgICAgLy8gU291cmNlLWZpcnN0IG9yZGVyaW5nXG4gICAgICBmb3VuZFNvdXJjZUFuZFRlY2ggPSBmaW5kRmlyc3RQYXNzaW5nVGVjaFNvdXJjZVBhaXIoc291cmNlcywgdGVjaHMsIGZsaXAoZmluZGVyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRlY2gtZmlyc3Qgb3JkZXJpbmdcbiAgICAgIGZvdW5kU291cmNlQW5kVGVjaCA9IGZpbmRGaXJzdFBhc3NpbmdUZWNoU291cmNlUGFpcih0ZWNocywgc291cmNlcywgZmluZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmRTb3VyY2VBbmRUZWNoIHx8IGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSB2aWRlbyBzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R8VGVjaH5Tb3VyY2VPYmplY3RbXXxzdHJpbmd9IFtzb3VyY2VdXG4gICAqICAgICAgICBBIFNvdXJjZU9iamVjdCwgYW4gYXJyYXkgb2YgU291cmNlT2JqZWN0cywgb3IgYSBzdHJpbmcgcmVmZXJlbmNpbmdcbiAgICogICAgICAgIGEgVVJMIHRvIGEgbWVkaWEgc291cmNlLiBJdCBpcyBfaGlnaGx5IHJlY29tbWVuZGVkXyB0aGF0IGFuIG9iamVjdFxuICAgKiAgICAgICAgb3IgYXJyYXkgb2Ygb2JqZWN0cyBpcyB1c2VkIGhlcmUsIHNvIHRoYXQgc291cmNlIHNlbGVjdGlvblxuICAgKiAgICAgICAgYWxnb3JpdGhtcyBjYW4gdGFrZSB0aGUgYHR5cGVgIGludG8gYWNjb3VudC5cbiAgICpcbiAgICogICAgICAgIElmIG5vdCBwcm92aWRlZCwgdGhpcyBtZXRob2QgYWN0cyBhcyBhIGdldHRlci5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICogICAgICAgICBJZiB0aGUgYHNvdXJjZWAgYXJndW1lbnQgaXMgbWlzc2luZywgcmV0dXJucyB0aGUgY3VycmVudCBzb3VyY2VcbiAgICogICAgICAgICBVUkwuIE90aGVyd2lzZSwgcmV0dXJucyBub3RoaW5nL3VuZGVmaW5lZC5cbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnNyYyA9IGZ1bmN0aW9uIHNyYyhzb3VyY2UpIHtcbiAgICB2YXIgX3RoaXMxMCA9IHRoaXM7XG5cbiAgICAvLyBnZXR0ZXIgdXNhZ2VcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlXy5zcmMgfHwgJyc7XG4gICAgfVxuICAgIC8vIGZpbHRlciBvdXQgaW52YWxpZCBzb3VyY2VzIGFuZCB0dXJuIG91ciBzb3VyY2UgaW50b1xuICAgIC8vIGFuIGFycmF5IG9mIHNvdXJjZSBvYmplY3RzXG4gICAgdmFyIHNvdXJjZXMgPSBmaWx0ZXJTb3VyY2Uoc291cmNlKTtcblxuICAgIC8vIGlmIGEgc291cmNlIHdhcyBwYXNzZWQgaW4gdGhlbiBpdCBpcyBpbnZhbGlkIGJlY2F1c2VcbiAgICAvLyBpdCB3YXMgZmlsdGVyZWQgdG8gYSB6ZXJvIGxlbmd0aCBBcnJheS4gU28gd2UgaGF2ZSB0b1xuICAgIC8vIHNob3cgYW4gZXJyb3JcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmVycm9yKHsgY29kZTogNCwgbWVzc2FnZTogdGhpcy5sb2NhbGl6ZSh0aGlzLm9wdGlvbnNfLm5vdFN1cHBvcnRlZE1lc3NhZ2UpIH0pO1xuICAgICAgfSwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaW50aWFsIHNvdXJjZXNcbiAgICB0aGlzLmNoYW5naW5nU3JjXyA9IHRydWU7XG5cbiAgICB0aGlzLmNhY2hlXy5zb3VyY2VzID0gc291cmNlcztcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZUNhY2hlc18oc291cmNlc1swXSk7XG5cbiAgICAvLyBtaWRkbGV3YXJlU291cmNlIGlzIHRoZSBzb3VyY2UgYWZ0ZXIgaXQgaGFzIGJlZW4gY2hhbmdlZCBieSBtaWRkbGV3YXJlXG4gICAgc2V0U291cmNlKHRoaXMsIHNvdXJjZXNbMF0sIGZ1bmN0aW9uIChtaWRkbGV3YXJlU291cmNlLCBtd3MpIHtcbiAgICAgIF90aGlzMTAubWlkZGxld2FyZV8gPSBtd3M7XG5cbiAgICAgIC8vIHNpbmNlIHNvdXJjZVNldCBpcyBhc3luYyB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgY2FjaGUgYWdhaW4gYWZ0ZXIgd2Ugc2VsZWN0IGEgc291cmNlIHNpbmNlXG4gICAgICAvLyB0aGUgc291cmNlIHRoYXQgaXMgc2VsZWN0ZWQgY291bGQgYmUgb3V0IG9mIG9yZGVyIGZyb20gdGhlIGNhY2hlIHVwZGF0ZSBhYm92ZSB0aGlzIGNhbGxiYWNrLlxuICAgICAgX3RoaXMxMC5jYWNoZV8uc291cmNlcyA9IHNvdXJjZXM7XG4gICAgICBfdGhpczEwLnVwZGF0ZVNvdXJjZUNhY2hlc18obWlkZGxld2FyZVNvdXJjZSk7XG5cbiAgICAgIHZhciBlcnIgPSBfdGhpczEwLnNyY18obWlkZGxld2FyZVNvdXJjZSk7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgaWYgKHNvdXJjZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczEwLnNyYyhzb3VyY2VzLnNsaWNlKDEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMTAuY2hhbmdpbmdTcmNfID0gZmFsc2U7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3cmFwIHRoaXMgaW4gYSB0aW1lb3V0IHRvIGdpdmUgZm9sa3MgYSBjaGFuY2UgdG8gYWRkIGVycm9yIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIF90aGlzMTAuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcih7IGNvZGU6IDQsIG1lc3NhZ2U6IHRoaXMubG9jYWxpemUodGhpcy5vcHRpb25zXy5ub3RTdXBwb3J0ZWRNZXNzYWdlKSB9KTtcbiAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgLy8gd2UgY291bGQgbm90IGZpbmQgYW4gYXBwcm9wcmlhdGUgdGVjaCwgYnV0IGxldCdzIHN0aWxsIG5vdGlmeSB0aGUgZGVsZWdhdGUgdGhhdCB0aGlzIGlzIGl0XG4gICAgICAgIC8vIHRoaXMgbmVlZHMgYSBiZXR0ZXIgY29tbWVudCBhYm91dCB3aHkgdGhpcyBpcyBuZWVkZWRcbiAgICAgICAgX3RoaXMxMC50cmlnZ2VyUmVhZHkoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldFRlY2gobXdzLCBfdGhpczEwLnRlY2hfKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSBzb3VyY2Ugb2JqZWN0IG9uIHRoZSB0ZWNoLCByZXR1cm5zIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3ZXRoZXJcbiAgICogdGhlcmUgaXMgYSB0ZWNoIHRoYXQgY2FuIHBsYXkgdGhlIHNvdXJjZSBvciBub3RcbiAgICpcbiAgICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdH0gc291cmNlXG4gICAqICAgICAgICBUaGUgc291cmNlIG9iamVjdCB0byBzZXQgb24gdGhlIFRlY2hcbiAgICpcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICogICAgICAgICAtIFRydWUgaWYgdGhlcmUgaXMgbm8gVGVjaCB0byBwbGF5YmFjayB0aGlzIHNvdXJjZVxuICAgKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5zcmNfID0gZnVuY3Rpb24gc3JjXyhzb3VyY2UpIHtcbiAgICB2YXIgX3RoaXMxMSA9IHRoaXM7XG5cbiAgICB2YXIgc291cmNlVGVjaCA9IHRoaXMuc2VsZWN0U291cmNlKFtzb3VyY2VdKTtcblxuICAgIGlmICghc291cmNlVGVjaCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aXRsZUNhc2VFcXVhbHMoc291cmNlVGVjaC50ZWNoLCB0aGlzLnRlY2hOYW1lXykpIHtcbiAgICAgIHRoaXMuY2hhbmdpbmdTcmNfID0gdHJ1ZTtcbiAgICAgIC8vIGxvYWQgdGhpcyB0ZWNobm9sb2d5IHdpdGggdGhlIGNob3NlbiBzb3VyY2VcbiAgICAgIHRoaXMubG9hZFRlY2hfKHNvdXJjZVRlY2gudGVjaCwgc291cmNlVGVjaC5zb3VyY2UpO1xuICAgICAgdGhpcy50ZWNoXy5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMTEuY2hhbmdpbmdTcmNfID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyB3YWl0IHVudGlsIHRoZSB0ZWNoIGlzIHJlYWR5IHRvIHNldCB0aGUgc291cmNlXG4gICAgLy8gYW5kIHNldCBpdCBzeW5jaHJvbm91c2x5IGlmIHBvc3NpYmxlICgjMjMyNilcbiAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHtcblxuICAgICAgLy8gVGhlIHNldFNvdXJjZSB0ZWNoIG1ldGhvZCB3YXMgYWRkZWQgd2l0aCBzb3VyY2UgaGFuZGxlcnNcbiAgICAgIC8vIHNvIG9sZGVyIHRlY2hzIHdvbid0IHN1cHBvcnQgaXRcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdGhlIGRpcmVjdCBwcm90b3R5cGUgZm9yIHRoZSBjYXNlIHdoZXJlIHN1YmNsYXNzZXNcbiAgICAgIC8vIG9mIHRoZSB0ZWNoIGRvIG5vdCBzdXBwb3J0IHNvdXJjZSBoYW5kbGVyc1xuICAgICAgaWYgKHRoaXMudGVjaF8uY29uc3RydWN0b3IucHJvdG90eXBlLmhhc093blByb3BlcnR5KCdzZXRTb3VyY2UnKSkge1xuICAgICAgICB0aGlzLnRlY2hDYWxsXygnc2V0U291cmNlJywgc291cmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGVjaENhbGxfKCdzcmMnLCBzb3VyY2Uuc3JjKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGFuZ2luZ1NyY18gPSBmYWxzZTtcbiAgICB9LCB0cnVlKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogQmVnaW4gbG9hZGluZyB0aGUgc3JjIGRhdGEuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gbG9hZCgpIHtcbiAgICB0aGlzLnRlY2hDYWxsXygnbG9hZCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgcGxheWVyLiBMb2FkcyB0aGUgZmlyc3QgdGVjaCBpbiB0aGUgdGVjaE9yZGVyLFxuICAgKiBhbmQgY2FsbHMgYHJlc2V0YCBvbiB0aGUgdGVjaGAuXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnRlY2hfLmNsZWFyVHJhY2tzKCd0ZXh0Jyk7XG4gICAgfVxuICAgIHRoaXMubG9hZFRlY2hfKHRoaXMub3B0aW9uc18udGVjaE9yZGVyWzBdLCBudWxsKTtcbiAgICB0aGlzLnRlY2hDYWxsXygncmVzZXQnKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgb2YgdGhlIGN1cnJlbnQgc291cmNlIG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm4ge1RlY2h+U291cmNlT2JqZWN0W119XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgc291cmNlIG9iamVjdHNcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmN1cnJlbnRTb3VyY2VzID0gZnVuY3Rpb24gY3VycmVudFNvdXJjZXMoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXMuY3VycmVudFNvdXJjZSgpO1xuICAgIHZhciBzb3VyY2VzID0gW107XG5cbiAgICAvLyBhc3N1bWUgYHt9YCBvciBgeyBzcmMgfWBcbiAgICBpZiAoT2JqZWN0LmtleXMoc291cmNlKS5sZW5ndGggIT09IDApIHtcbiAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhY2hlXy5zb3VyY2VzIHx8IHNvdXJjZXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc291cmNlIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybiB7VGVjaH5Tb3VyY2VPYmplY3R9XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgc291cmNlIG9iamVjdFxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuY3VycmVudFNvdXJjZSA9IGZ1bmN0aW9uIGN1cnJlbnRTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVfLnNvdXJjZSB8fCB7fTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIFVSTCBvZiB0aGUgY3VycmVudCBzb3VyY2UgdmFsdWUgZS5nLiBodHRwOi8vbXlzaXRlLmNvbS92aWRlby5tcDRcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVjdGlvbiB3aXRoIGBjdXJyZW50VHlwZWAgdG8gYXNzaXN0IGluIHJlYnVpbGRpbmcgdGhlIGN1cnJlbnQgc291cmNlIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHNvdXJjZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuY3VycmVudFNyYyA9IGZ1bmN0aW9uIGN1cnJlbnRTcmMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvdXJjZSgpICYmIHRoaXMuY3VycmVudFNvdXJjZSgpLnNyYyB8fCAnJztcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHNvdXJjZSB0eXBlIGUuZy4gdmlkZW8vbXA0XG4gICAqIFRoaXMgY2FuIGFsbG93IHlvdSByZWJ1aWxkIHRoZSBjdXJyZW50IHNvdXJjZSBvYmplY3Qgc28gdGhhdCB5b3UgY291bGQgbG9hZCB0aGUgc2FtZVxuICAgKiBzb3VyY2UgYW5kIHRlY2ggbGF0ZXJcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBzb3VyY2UgTUlNRSB0eXBlXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5jdXJyZW50VHlwZSA9IGZ1bmN0aW9uIGN1cnJlbnRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3VyY2UoKSAmJiB0aGlzLmN1cnJlbnRTb3VyY2UoKS50eXBlIHx8ICcnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBwcmVsb2FkIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZV1cbiAgICogICAgICAgIC0gdHJ1ZSBtZWFucyB0aGF0IHdlIHNob3VsZCBwcmVsb2FkXG4gICAqICAgICAgICAtIGZhbHNlIG1hZW5zIHRoYXQgd2Ugc2hvdWxkIG5vdCBwcmVsb2FkXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgcHJlbG9hZCBhdHRyaWJ1dGUgdmFsdWUgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5wcmVsb2FkID0gZnVuY3Rpb24gcHJlbG9hZCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0UHJlbG9hZCcsIHZhbHVlKTtcbiAgICAgIHRoaXMub3B0aW9uc18ucHJlbG9hZCA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygncHJlbG9hZCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBhdXRvcGxheSBvcHRpb24uIFdoZW4gdGhpcyBpcyBhIGJvb2xlYW4gaXQgd2lsbFxuICAgKiBtb2RpZnkgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgdGVjaC4gV2hlbiB0aGlzIGlzIGEgc3RyaW5nIHRoZSBhdHRyaWJ1dGUgb25cbiAgICogdGhlIHRlY2ggd2lsbCBiZSByZW1vdmVkIGFuZCBgUGxheWVyYCB3aWxsIGhhbmRsZSBhdXRvcGxheSBvbiBsb2Fkc3RhcnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBbdmFsdWVdXG4gICAqICAgICAgICAtIHRydWU6IGF1dG9wbGF5IHVzaW5nIHRoZSBicm93c2VyIGJlaGF2aW9yXG4gICAqICAgICAgICAtIGZhbHNlOiBkbyBub3QgYXV0b3BsYXlcbiAgICogICAgICAgIC0gJ3BsYXknOiBjYWxsIHBsYXkoKSBvbiBldmVyeSBsb2Fkc3RhcnRcbiAgICogICAgICAgIC0gJ211dGVkJzogY2FsbCBtdXRlZCgpIHRoZW4gcGxheSgpIG9uIGV2ZXJ5IGxvYWRzdGFydFxuICAgKiAgICAgICAgLSAnYW55JzogY2FsbCBwbGF5KCkgb24gZXZlcnkgbG9hZHN0YXJ0LiBpZiB0aGF0IGZhaWxzIGNhbGwgbXV0ZWQoKSB0aGVuIHBsYXkoKS5cbiAgICogICAgICAgIC0gKjogdmFsdWVzIG90aGVyIHRoYW4gdGhvc2UgbGlzdGVkIGhlcmUgd2lsbCBiZSBzZXQgYGF1dG9wbGF5YCB0byB0cnVlXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIGF1dG9wbGF5IHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuYXV0b3BsYXkgPSBmdW5jdGlvbiBhdXRvcGxheSh2YWx1ZSkge1xuICAgIC8vIGdldHRlciB1c2FnZVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zXy5hdXRvcGxheSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdGVjaEF1dG9wbGF5ID0gdm9pZCAwO1xuXG4gICAgLy8gaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgc3RyaW5nIHNldCBpdCB0byB0aGF0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgLyhhbnl8cGxheXxtdXRlZCkvLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aGlzLm9wdGlvbnNfLmF1dG9wbGF5ID0gdmFsdWU7XG4gICAgICB0aGlzLm1hbnVhbEF1dG9wbGF5Xyh2YWx1ZSk7XG4gICAgICB0ZWNoQXV0b3BsYXkgPSBmYWxzZTtcblxuICAgICAgLy8gYW55IGZhbHN5IHZhbHVlIHNldHMgYXV0b3BsYXkgdG8gZmFsc2UgaW4gdGhlIGJyb3dzZXIsXG4gICAgICAvLyBsZXRzIGRvIHRoZSBzYW1lXG4gICAgfSBlbHNlIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMub3B0aW9uc18uYXV0b3BsYXkgPSBmYWxzZTtcblxuICAgICAgLy8gYW55IG90aGVyIHZhbHVlIChpZSB0cnV0aHkpIHNldHMgYXV0b3BsYXkgdG8gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnNfLmF1dG9wbGF5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0ZWNoQXV0b3BsYXkgPSB0ZWNoQXV0b3BsYXkgfHwgdGhpcy5vcHRpb25zXy5hdXRvcGxheTtcblxuICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYSB0ZWNoIHRoZW4gd2UgZG8gbm90IHF1ZXVlIHVwXG4gICAgLy8gYSBzZXRBdXRvcGxheSBjYWxsIG9uIHRlY2ggcmVhZHkuIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGVcbiAgICAvLyBhdXRvcGxheSBvcHRpb24gd2lsbCBiZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB3ZVxuICAgIC8vIGRvIG5vdCBuZWVkIHRvIHNldCBpdCB0d2ljZVxuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0QXV0b3BsYXknLCB0ZWNoQXV0b3BsYXkpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2V0IG9yIHVuc2V0IHRoZSBwbGF5c2lubGluZSBhdHRyaWJ1dGUuXG4gICAqIFBsYXlzaW5saW5lIHRlbGxzIHRoZSBicm93c2VyIHRoYXQgbm9uLWZ1bGxzY3JlZW4gcGxheWJhY2sgaXMgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZV1cbiAgICogICAgICAgIC0gdHJ1ZSBtZWFucyB0aGF0IHdlIHNob3VsZCB0cnkgdG8gcGxheSBpbmxpbmUgYnkgZGVmYXVsdFxuICAgKiAgICAgICAgLSBmYWxzZSBtZWFucyB0aGF0IHdlIHNob3VsZCB1c2UgdGhlIGJyb3dzZXIncyBkZWZhdWx0IHBsYXliYWNrIG1vZGUsXG4gICAqICAgICAgICAgIHdoaWNoIGluIG1vc3QgY2FzZXMgaXMgaW5saW5lLiBpT1MgU2FmYXJpIGlzIGEgbm90YWJsZSBleGNlcHRpb25cbiAgICogICAgICAgICAgYW5kIHBsYXlzIGZ1bGxzY3JlZW4gYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfFBsYXllcn1cbiAgICogICAgICAgICAtIHRoZSBjdXJyZW50IHZhbHVlIG9mIHBsYXlzaW5saW5lXG4gICAqICAgICAgICAgLSB0aGUgcGxheWVyIHdoZW4gc2V0dGluZ1xuICAgKlxuICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNhdHRyLXZpZGVvLXBsYXlzaW5saW5lfVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucGxheXNpbmxpbmUgPSBmdW5jdGlvbiBwbGF5c2lubGluZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0UGxheXNpbmxpbmUnLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9wdGlvbnNfLnBsYXlzaW5saW5lID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ3BsYXlzaW5saW5lJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIGxvb3AgYXR0cmlidXRlIG9uIHRoZSB2aWRlbyBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZV1cbiAgICogICAgICAgIC0gdHJ1ZSBtZWFucyB0aGF0IHdlIHNob3VsZCBsb29wIHRoZSB2aWRlb1xuICAgKiAgICAgICAgLSBmYWxzZSBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbG9vcCB0aGUgdmlkZW9cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIGxvb3Agd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5sb29wID0gZnVuY3Rpb24gbG9vcCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0TG9vcCcsIHZhbHVlKTtcbiAgICAgIHRoaXMub3B0aW9uc18ubG9vcCA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnbG9vcCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBwb3N0ZXIgaW1hZ2Ugc291cmNlIHVybFxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3Bvc3RlcmNoYW5nZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NyY11cbiAgICogICAgICAgIFBvc3RlciBpbWFnZSBzb3VyY2UgVVJMXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiBwb3N0ZXIgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5wb3N0ZXIgPSBmdW5jdGlvbiBwb3N0ZXIoc3JjKSB7XG4gICAgaWYgKHNyYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0ZXJfO1xuICAgIH1cblxuICAgIC8vIFRoZSBjb3JyZWN0IHdheSB0byByZW1vdmUgYSBwb3N0ZXIgaXMgdG8gc2V0IGFzIGFuIGVtcHR5IHN0cmluZ1xuICAgIC8vIG90aGVyIGZhbHNleSB2YWx1ZXMgd2lsbCB0aHJvdyBlcnJvcnNcbiAgICBpZiAoIXNyYykge1xuICAgICAgc3JjID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHNyYyA9PT0gdGhpcy5wb3N0ZXJfKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHRoZSBpbnRlcm5hbCBwb3N0ZXIgdmFyaWFibGVcbiAgICB0aGlzLnBvc3Rlcl8gPSBzcmM7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHRlY2gncyBwb3N0ZXJcbiAgICB0aGlzLnRlY2hDYWxsXygnc2V0UG9zdGVyJywgc3JjKTtcblxuICAgIHRoaXMuaXNQb3N0ZXJGcm9tVGVjaF8gPSBmYWxzZTtcblxuICAgIC8vIGFsZXJ0IGNvbXBvbmVudHMgdGhhdCB0aGUgcG9zdGVyIGhhcyBiZWVuIHNldFxuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUgcG9zdGVyIGltYWdlIGlzIGNoYW5nZWQgb24gdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBQbGF5ZXIjcG9zdGVyY2hhbmdlXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMudHJpZ2dlcigncG9zdGVyY2hhbmdlJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNvbWUgdGVjaHMgKGUuZy4gWW91VHViZSkgY2FuIHByb3ZpZGUgYSBwb3N0ZXIgc291cmNlIGluIGFuXG4gICAqIGFzeW5jaHJvbm91cyB3YXkuIFdlIHdhbnQgdGhlIHBvc3RlciBjb21wb25lbnQgdG8gdXNlIHRoaXNcbiAgICogcG9zdGVyIHNvdXJjZSBzbyB0aGF0IGl0IGNvdmVycyB1cCB0aGUgdGVjaCdzIGNvbnRyb2xzLlxuICAgKiAoWW91VHViZSdzIHBsYXkgYnV0dG9uKS4gSG93ZXZlciB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoaXNcbiAgICogc291cmNlIGlmIHRoZSBwbGF5ZXIgdXNlciBoYXNuJ3Qgc2V0IGEgcG9zdGVyIHRocm91Z2hcbiAgICogdGhlIG5vcm1hbCBBUElzLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3Bvc3RlcmNoYW5nZVxuICAgKiBAbGlzdGVucyBUZWNoI3Bvc3RlcmNoYW5nZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFBvc3RlckNoYW5nZV8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoUG9zdGVyQ2hhbmdlXygpIHtcbiAgICBpZiAoKCF0aGlzLnBvc3Rlcl8gfHwgdGhpcy5vcHRpb25zXy50ZWNoQ2FuT3ZlcnJpZGVQb3N0ZXIpICYmIHRoaXMudGVjaF8gJiYgdGhpcy50ZWNoXy5wb3N0ZXIpIHtcbiAgICAgIHZhciBuZXdQb3N0ZXIgPSB0aGlzLnRlY2hfLnBvc3RlcigpIHx8ICcnO1xuXG4gICAgICBpZiAobmV3UG9zdGVyICE9PSB0aGlzLnBvc3Rlcl8pIHtcbiAgICAgICAgdGhpcy5wb3N0ZXJfID0gbmV3UG9zdGVyO1xuICAgICAgICB0aGlzLmlzUG9zdGVyRnJvbVRlY2hfID0gdHJ1ZTtcblxuICAgICAgICAvLyBMZXQgY29tcG9uZW50cyBrbm93IHRoZSBwb3N0ZXIgaGFzIGNoYW5nZWRcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdwb3N0ZXJjaGFuZ2UnKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgd2hldGhlciBvciBub3QgdGhlIGNvbnRyb2xzIGFyZSBzaG93aW5nLlxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI2NvbnRyb2xzZW5hYmxlZFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtib29sXVxuICAgKiAgICAgICAgLSB0cnVlIHRvIHR1cm4gY29udHJvbHMgb25cbiAgICogICAgICAgIC0gZmFsc2UgdG8gdHVybiBjb250cm9scyBvZmZcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiBjb250cm9scyB3aGVuIGdldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmNvbnRyb2xzID0gZnVuY3Rpb24gY29udHJvbHMoYm9vbCkge1xuICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuY29udHJvbHNfO1xuICAgIH1cblxuICAgIGJvb2wgPSAhIWJvb2w7XG5cbiAgICAvLyBEb24ndCB0cmlnZ2VyIGEgY2hhbmdlIGV2ZW50IHVubGVzcyBpdCBhY3R1YWxseSBjaGFuZ2VkXG4gICAgaWYgKHRoaXMuY29udHJvbHNfID09PSBib29sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb250cm9sc18gPSBib29sO1xuXG4gICAgaWYgKHRoaXMudXNpbmdOYXRpdmVDb250cm9scygpKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0Q29udHJvbHMnLCBib29sKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250cm9sc18pIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1jb250cm9scy1kaXNhYmxlZCcpO1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWNvbnRyb2xzLWVuYWJsZWQnKTtcbiAgICAgIC8qKlxuICAgICAgICogQGV2ZW50IFBsYXllciNjb250cm9sc2VuYWJsZWRcbiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAqL1xuICAgICAgdGhpcy50cmlnZ2VyKCdjb250cm9sc2VuYWJsZWQnKTtcbiAgICAgIGlmICghdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzKCkpIHtcbiAgICAgICAgdGhpcy5hZGRUZWNoQ29udHJvbHNMaXN0ZW5lcnNfKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1jb250cm9scy1lbmFibGVkJyk7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtY29udHJvbHMtZGlzYWJsZWQnKTtcbiAgICAgIC8qKlxuICAgICAgICogQGV2ZW50IFBsYXllciNjb250cm9sc2Rpc2FibGVkXG4gICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICAgKi9cbiAgICAgIHRoaXMudHJpZ2dlcignY29udHJvbHNkaXNhYmxlZCcpO1xuICAgICAgaWYgKCF0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHMoKSkge1xuICAgICAgICB0aGlzLnJlbW92ZVRlY2hDb250cm9sc0xpc3RlbmVyc18oKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBuYXRpdmUgY29udHJvbHMgb24vb2ZmLiBOYXRpdmUgY29udHJvbHMgYXJlIHRoZSBjb250cm9scyBidWlsdCBpbnRvXG4gICAqIGRldmljZXMgKGUuZy4gZGVmYXVsdCBpUGhvbmUgY29udHJvbHMpLCBGbGFzaCwgb3Igb3RoZXIgdGVjaHNcbiAgICogKGUuZy4gVmltZW8gQ29udHJvbHMpXG4gICAqICoqVGhpcyBzaG91bGQgb25seSBiZSBzZXQgYnkgdGhlIGN1cnJlbnQgdGVjaCwgYmVjYXVzZSBvbmx5IHRoZSB0ZWNoIGtub3dzXG4gICAqIGlmIGl0IGNhbiBzdXBwb3J0IG5hdGl2ZSBjb250cm9scyoqXG4gICAqXG4gICAqIEBmaXJlcyBQbGF5ZXIjdXNpbmduYXRpdmVjb250cm9sc1xuICAgKiBAZmlyZXMgUGxheWVyI3VzaW5nY3VzdG9tY29udHJvbHNcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYm9vbF1cbiAgICogICAgICAgIC0gdHJ1ZSB0byB0dXJuIG5hdGl2ZSBjb250cm9scyBvblxuICAgKiAgICAgICAgLSBmYWxzZSB0byB0dXJuIG5hdGl2ZSBjb250cm9scyBvZmZcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiBuYXRpdmUgY29udHJvbHMgd2hlbiBnZXR0aW5nXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS51c2luZ05hdGl2ZUNvbnRyb2xzID0gZnVuY3Rpb24gdXNpbmdOYXRpdmVDb250cm9scyhib29sKSB7XG4gICAgaWYgKGJvb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICEhdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzXztcbiAgICB9XG5cbiAgICBib29sID0gISFib29sO1xuXG4gICAgLy8gRG9uJ3QgdHJpZ2dlciBhIGNoYW5nZSBldmVudCB1bmxlc3MgaXQgYWN0dWFsbHkgY2hhbmdlZFxuICAgIGlmICh0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHNfID09PSBib29sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzXyA9IGJvb2w7XG5cbiAgICBpZiAodGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzXykge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLXVzaW5nLW5hdGl2ZS1jb250cm9scycpO1xuXG4gICAgICAvKipcbiAgICAgICAqIHBsYXllciBpcyB1c2luZyB0aGUgbmF0aXZlIGRldmljZSBjb250cm9sc1xuICAgICAgICpcbiAgICAgICAqIEBldmVudCBQbGF5ZXIjdXNpbmduYXRpdmVjb250cm9sc1xuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ3VzaW5nbmF0aXZlY29udHJvbHMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXVzaW5nLW5hdGl2ZS1jb250cm9scycpO1xuXG4gICAgICAvKipcbiAgICAgICAqIHBsYXllciBpcyB1c2luZyB0aGUgY3VzdG9tIEhUTUwgY29udHJvbHNcbiAgICAgICAqXG4gICAgICAgKiBAZXZlbnQgUGxheWVyI3VzaW5nY3VzdG9tY29udHJvbHNcbiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAgICAgICAqL1xuICAgICAgdGhpcy50cmlnZ2VyKCd1c2luZ2N1c3RvbWNvbnRyb2xzJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgb3IgZ2V0IHRoZSBjdXJyZW50IE1lZGlhRXJyb3JcbiAgICpcbiAgICogQGZpcmVzIFBsYXllciNlcnJvclxuICAgKlxuICAgKiBAcGFyYW0gIHtNZWRpYUVycm9yfHN0cmluZ3xudW1iZXJ9IFtlcnJdXG4gICAqICAgICAgICAgQSBNZWRpYUVycm9yIG9yIGEgc3RyaW5nL251bWJlciB0byBiZSB0dXJuZWRcbiAgICogICAgICAgICBpbnRvIGEgTWVkaWFFcnJvclxuICAgKlxuICAgKiBAcmV0dXJuIHtNZWRpYUVycm9yfG51bGx9XG4gICAqICAgICAgICAgVGhlIGN1cnJlbnQgTWVkaWFFcnJvciB3aGVuIGdldHRpbmcgKG9yIG51bGwpXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIGVycm9yKGVycikge1xuICAgIGlmIChlcnIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXJyb3JfIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yaW5nIHRvIGRlZmF1bHRcbiAgICBpZiAoZXJyID09PSBudWxsKSB7XG4gICAgICB0aGlzLmVycm9yXyA9IGVycjtcbiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1lcnJvcicpO1xuICAgICAgaWYgKHRoaXMuZXJyb3JEaXNwbGF5KSB7XG4gICAgICAgIHRoaXMuZXJyb3JEaXNwbGF5LmNsb3NlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lcnJvcl8gPSBuZXcgTWVkaWFFcnJvcihlcnIpO1xuXG4gICAgLy8gYWRkIHRoZSB2anMtZXJyb3IgY2xhc3NuYW1lIHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtZXJyb3InKTtcblxuICAgIC8vIGxvZyB0aGUgbmFtZSBvZiB0aGUgZXJyb3IgdHlwZSBhbmQgYW55IG1lc3NhZ2VcbiAgICAvLyBpZTgganVzdCBsb2dzIFwiW29iamVjdCBvYmplY3RdXCIgaWYgeW91IGp1c3QgbG9nIHRoZSBlcnJvciBvYmplY3RcbiAgICBsb2ckMS5lcnJvcignKENPREU6JyArIHRoaXMuZXJyb3JfLmNvZGUgKyAnICcgKyBNZWRpYUVycm9yLmVycm9yVHlwZXNbdGhpcy5lcnJvcl8uY29kZV0gKyAnKScsIHRoaXMuZXJyb3JfLm1lc3NhZ2UsIHRoaXMuZXJyb3JfKTtcblxuICAgIC8qKlxuICAgICAqIEBldmVudCBQbGF5ZXIjZXJyb3JcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCdlcnJvcicpO1xuXG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXBvcnQgdXNlciBhY3Rpdml0eVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICAgICAgIEV2ZW50IG9iamVjdFxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucmVwb3J0VXNlckFjdGl2aXR5ID0gZnVuY3Rpb24gcmVwb3J0VXNlckFjdGl2aXR5KGV2ZW50KSB7XG4gICAgdGhpcy51c2VyQWN0aXZpdHlfID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0L3NldCBpZiB1c2VyIGlzIGFjdGl2ZVxuICAgKlxuICAgKiBAZmlyZXMgUGxheWVyI3VzZXJhY3RpdmVcbiAgICogQGZpcmVzIFBsYXllciN1c2VyaW5hY3RpdmVcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYm9vbF1cbiAgICogICAgICAgIC0gdHJ1ZSBpZiB0aGUgdXNlciBpcyBhY3RpdmVcbiAgICogICAgICAgIC0gZmFsc2UgaWYgdGhlIHVzZXIgaXMgaW5hY3RpdmVcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiB1c2VyQWN0aXZlIHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUudXNlckFjdGl2ZSA9IGZ1bmN0aW9uIHVzZXJBY3RpdmUoYm9vbCkge1xuICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnVzZXJBY3RpdmVfO1xuICAgIH1cblxuICAgIGJvb2wgPSAhIWJvb2w7XG5cbiAgICBpZiAoYm9vbCA9PT0gdGhpcy51c2VyQWN0aXZlXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXNlckFjdGl2ZV8gPSBib29sO1xuXG4gICAgaWYgKHRoaXMudXNlckFjdGl2ZV8pIHtcbiAgICAgIHRoaXMudXNlckFjdGl2aXR5XyA9IHRydWU7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtdXNlci1pbmFjdGl2ZScpO1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLXVzZXItYWN0aXZlJyk7XG4gICAgICAvKipcbiAgICAgICAqIEBldmVudCBQbGF5ZXIjdXNlcmFjdGl2ZVxuICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICAgICAgICovXG4gICAgICB0aGlzLnRyaWdnZXIoJ3VzZXJhY3RpdmUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaHJvbWUvU2FmYXJpL0lFIGhhdmUgYnVncyB3aGVyZSB3aGVuIHlvdSBjaGFuZ2UgdGhlIGN1cnNvciBpdCBjYW5cbiAgICAvLyB0cmlnZ2VyIGEgbW91c2Vtb3ZlIGV2ZW50LiBUaGlzIGNhdXNlcyBhbiBpc3N1ZSB3aGVuIHlvdSdyZSBoaWRpbmdcbiAgICAvLyB0aGUgY3Vyc29yIHdoZW4gdGhlIHVzZXIgaXMgaW5hY3RpdmUsIGFuZCBhIG1vdXNlbW92ZSBzaWduYWxzIHVzZXJcbiAgICAvLyBhY3Rpdml0eS4gTWFraW5nIGl0IGltcG9zc2libGUgdG8gZ28gaW50byBpbmFjdGl2ZSBtb2RlLiBTcGVjaWZpY2FsbHlcbiAgICAvLyB0aGlzIGhhcHBlbnMgaW4gZnVsbHNjcmVlbiB3aGVuIHdlIHJlYWxseSBuZWVkIHRvIGhpZGUgdGhlIGN1cnNvci5cbiAgICAvL1xuICAgIC8vIFdoZW4gdGhpcyBnZXRzIHJlc29sdmVkIGluIEFMTCBicm93c2VycyBpdCBjYW4gYmUgcmVtb3ZlZFxuICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDMwNDFcbiAgICBpZiAodGhpcy50ZWNoXykge1xuICAgICAgdGhpcy50ZWNoXy5vbmUoJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXNlckFjdGl2aXR5XyA9IGZhbHNlO1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy11c2VyLWFjdGl2ZScpO1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy11c2VyLWluYWN0aXZlJyk7XG4gICAgLyoqXG4gICAgICogQGV2ZW50IFBsYXllciN1c2VyaW5hY3RpdmVcbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG4gICAgdGhpcy50cmlnZ2VyKCd1c2VyaW5hY3RpdmUnKTtcbiAgfTtcblxuICAvKipcbiAgICogTGlzdGVuIGZvciB1c2VyIGFjdGl2aXR5IGJhc2VkIG9uIHRpbWVvdXQgdmFsdWVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmxpc3RlbkZvclVzZXJBY3Rpdml0eV8gPSBmdW5jdGlvbiBsaXN0ZW5Gb3JVc2VyQWN0aXZpdHlfKCkge1xuICAgIHZhciBtb3VzZUluUHJvZ3Jlc3MgPSB2b2lkIDA7XG4gICAgdmFyIGxhc3RNb3ZlWCA9IHZvaWQgMDtcbiAgICB2YXIgbGFzdE1vdmVZID0gdm9pZCAwO1xuICAgIHZhciBoYW5kbGVBY3Rpdml0eSA9IGJpbmQodGhpcywgdGhpcy5yZXBvcnRVc2VyQWN0aXZpdHkpO1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShlKSB7XG4gICAgICAvLyAjMTA2OCAtIFByZXZlbnQgbW91c2Vtb3ZlIHNwYW1taW5nXG4gICAgICAvLyBDaHJvbWUgQnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzY2OTcwXG4gICAgICBpZiAoZS5zY3JlZW5YICE9PSBsYXN0TW92ZVggfHwgZS5zY3JlZW5ZICE9PSBsYXN0TW92ZVkpIHtcbiAgICAgICAgbGFzdE1vdmVYID0gZS5zY3JlZW5YO1xuICAgICAgICBsYXN0TW92ZVkgPSBlLnNjcmVlblk7XG4gICAgICAgIGhhbmRsZUFjdGl2aXR5KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oKSB7XG4gICAgICBoYW5kbGVBY3Rpdml0eSgpO1xuICAgICAgLy8gRm9yIGFzIGxvbmcgYXMgdGhlIHRoZXkgYXJlIHRvdWNoaW5nIHRoZSBkZXZpY2Ugb3IgaGF2ZSB0aGVpciBtb3VzZSBkb3duLFxuICAgICAgLy8gd2UgY29uc2lkZXIgdGhlbSBhY3RpdmUgZXZlbiBpZiB0aGV5J3JlIG5vdCBtb3ZpbmcgdGhlaXIgZmluZ2VyIG9yIG1vdXNlLlxuICAgICAgLy8gU28gd2Ugd2FudCB0byBjb250aW51ZSB0byB1cGRhdGUgdGhhdCB0aGV5IGFyZSBhY3RpdmVcbiAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbChtb3VzZUluUHJvZ3Jlc3MpO1xuICAgICAgLy8gU2V0dGluZyB1c2VyQWN0aXZpdHk9dHJ1ZSBub3cgYW5kIHNldHRpbmcgdGhlIGludGVydmFsIHRvIHRoZSBzYW1lIHRpbWVcbiAgICAgIC8vIGFzIHRoZSBhY3Rpdml0eUNoZWNrIGludGVydmFsICgyNTApIHNob3VsZCBlbnN1cmUgd2UgbmV2ZXIgbWlzcyB0aGVcbiAgICAgIC8vIG5leHQgYWN0aXZpdHlDaGVja1xuICAgICAgbW91c2VJblByb2dyZXNzID0gdGhpcy5zZXRJbnRlcnZhbChoYW5kbGVBY3Rpdml0eSwgMjUwKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlVXAgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2ZW50KSB7XG4gICAgICBoYW5kbGVBY3Rpdml0eSgpO1xuICAgICAgLy8gU3RvcCB0aGUgaW50ZXJ2YWwgdGhhdCBtYWludGFpbnMgYWN0aXZpdHkgaWYgdGhlIG1vdXNlL3RvdWNoIGlzIGRvd25cbiAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbChtb3VzZUluUHJvZ3Jlc3MpO1xuICAgIH07XG5cbiAgICAvLyBBbnkgbW91c2UgbW92ZW1lbnQgd2lsbCBiZSBjb25zaWRlcmVkIHVzZXIgYWN0aXZpdHlcbiAgICB0aGlzLm9uKCdtb3VzZWRvd24nLCBoYW5kbGVNb3VzZURvd24pO1xuICAgIHRoaXMub24oJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgdGhpcy5vbignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgLy8gTGlzdGVuIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgLy8gU2hvdWxkbid0IG5lZWQgdG8gdXNlIGluUHJvZ3Jlc3MgaW50ZXJ2YWwgYmVjYXVzZSBvZiBrZXkgcmVwZWF0XG4gICAgdGhpcy5vbigna2V5ZG93bicsIGhhbmRsZUFjdGl2aXR5KTtcbiAgICB0aGlzLm9uKCdrZXl1cCcsIGhhbmRsZUFjdGl2aXR5KTtcblxuICAgIC8vIFJ1biBhbiBpbnRlcnZhbCBldmVyeSAyNTAgbWlsbGlzZWNvbmRzIGluc3RlYWQgb2Ygc3R1ZmZpbmcgZXZlcnl0aGluZyBpbnRvXG4gICAgLy8gdGhlIG1vdXNlbW92ZS90b3VjaG1vdmUgZnVuY3Rpb24gaXRzZWxmLCB0byBwcmV2ZW50IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLlxuICAgIC8vIGB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eWAgc2ltcGx5IHNldHMgdGhpcy51c2VyQWN0aXZpdHlfIHRvIHRydWUsIHdoaWNoXG4gICAgLy8gdGhlbiBnZXRzIHBpY2tlZCB1cCBieSB0aGlzIGxvb3BcbiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvbGVhcm5pbmctZnJvbS10d2l0dGVyL1xuICAgIHZhciBpbmFjdGl2aXR5VGltZW91dCA9IHZvaWQgMDtcblxuICAgIHRoaXMuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG1vdXNlL3RvdWNoIGFjdGl2aXR5IGhhcyBoYXBwZW5lZFxuICAgICAgaWYgKCF0aGlzLnVzZXJBY3Rpdml0eV8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCB0aGUgYWN0aXZpdHkgdHJhY2tlclxuICAgICAgdGhpcy51c2VyQWN0aXZpdHlfID0gZmFsc2U7XG5cbiAgICAgIC8vIElmIHRoZSB1c2VyIHN0YXRlIHdhcyBpbmFjdGl2ZSwgc2V0IHRoZSBzdGF0ZSB0byBhY3RpdmVcbiAgICAgIHRoaXMudXNlckFjdGl2ZSh0cnVlKTtcblxuICAgICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGluYWN0aXZpdHkgdGltZW91dCB0byBzdGFydCB0aGUgdGltZXIgb3ZlclxuICAgICAgdGhpcy5jbGVhclRpbWVvdXQoaW5hY3Rpdml0eVRpbWVvdXQpO1xuXG4gICAgICB2YXIgdGltZW91dCA9IHRoaXMub3B0aW9uc18uaW5hY3Rpdml0eVRpbWVvdXQ7XG5cbiAgICAgIGlmICh0aW1lb3V0IDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiA8dGltZW91dD4gbWlsbGlzZWNvbmRzLCBpZiBubyBtb3JlIGFjdGl2aXR5IGhhcyBvY2N1cnJlZCB0aGVcbiAgICAgIC8vIHVzZXIgd2lsbCBiZSBjb25zaWRlcmVkIGluYWN0aXZlXG4gICAgICBpbmFjdGl2aXR5VGltZW91dCA9IHRoaXMuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCB0aGUgY2FzZSB3aGVyZSB0aGUgaW5hY3Rpdml0eVRpbWVvdXQgY2FuIHRyaWdnZXIganVzdFxuICAgICAgICAvLyBiZWZvcmUgdGhlIG5leHQgdXNlciBhY3Rpdml0eSBpcyBwaWNrZWQgdXAgYnkgdGhlIGFjdGl2aXR5IGNoZWNrIGxvb3BcbiAgICAgICAgLy8gY2F1c2luZyBhIGZsaWNrZXJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJBY3Rpdml0eV8pIHtcbiAgICAgICAgICB0aGlzLnVzZXJBY3RpdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9LCAyNTApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS4gQSBwbGF5YmFjayByYXRlIG9mXG4gICAqIDEuMCByZXByZXNlbnRzIG5vcm1hbCBzcGVlZCBhbmQgMC41IHdvdWxkIGluZGljYXRlIGhhbGYtc3BlZWRcbiAgICogcGxheWJhY2ssIGZvciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLW1lZGlhLXBsYXliYWNrcmF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3JhdGVdXG4gICAqICAgICAgIE5ldyBwbGF5YmFjayByYXRlIHRvIHNldC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHBsYXliYWNrIHJhdGUgd2hlbiBnZXR0aW5nIG9yIDEuMFxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUucGxheWJhY2tSYXRlID0gZnVuY3Rpb24gcGxheWJhY2tSYXRlKHJhdGUpIHtcbiAgICBpZiAocmF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBOT1RFOiB0aGlzLmNhY2hlXy5sYXN0UGxheWJhY2tSYXRlIGlzIHNldCBmcm9tIHRoZSB0ZWNoIGhhbmRsZXJcbiAgICAgIC8vIHRoYXQgaXMgcmVnaXN0ZXJlZCBhYm92ZVxuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFBsYXliYWNrUmF0ZScsIHJhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlY2hfICYmIHRoaXMudGVjaF8uZmVhdHVyZXNQbGF5YmFja1JhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlXy5sYXN0UGxheWJhY2tSYXRlIHx8IHRoaXMudGVjaEdldF8oJ3BsYXliYWNrUmF0ZScpO1xuICAgIH1cbiAgICByZXR1cm4gMS4wO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBwbGF5YmFjayByYXRlLiBBIGRlZmF1bHQgcGxheWJhY2sgcmF0ZSBvZlxuICAgKiAxLjAgcmVwcmVzZW50cyBub3JtYWwgc3BlZWQgYW5kIDAuNSB3b3VsZCBpbmRpY2F0ZSBoYWxmLXNwZWVkIHBsYXliYWNrLCBmb3IgaW5zdGFuY2UuXG4gICAqIGRlZmF1bHRQbGF5YmFja1JhdGUgd2lsbCBvbmx5IHJlcHJlc2VudCB3aGF0IHRoZSBpbnRpYWwgcGxheWJhY2tSYXRlIG9mIGEgdmlkZW8gd2FzLCBub3RcbiAgICogbm90IHRoZSBjdXJyZW50IHBsYXliYWNrUmF0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLW1lZGlhLWRlZmF1bHRwbGF5YmFja3JhdGVcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtyYXRlXVxuICAgKiAgICAgICBOZXcgZGVmYXVsdCBwbGF5YmFjayByYXRlIHRvIHNldC5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfFBsYXllcn1cbiAgICogICAgICAgICAtIFRoZSBkZWZhdWx0IHBsYXliYWNrIHJhdGUgd2hlbiBnZXR0aW5nIG9yIDEuMFxuICAgKiAgICAgICAgIC0gdGhlIHBsYXllciB3aGVuIHNldHRpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmRlZmF1bHRQbGF5YmFja1JhdGUgPSBmdW5jdGlvbiBkZWZhdWx0UGxheWJhY2tSYXRlKHJhdGUpIHtcbiAgICBpZiAocmF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoQ2FsbF8oJ3NldERlZmF1bHRQbGF5YmFja1JhdGUnLCByYXRlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLmZlYXR1cmVzUGxheWJhY2tSYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnZGVmYXVsdFBsYXliYWNrUmF0ZScpO1xuICAgIH1cbiAgICByZXR1cm4gMS4wO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGF1ZGlvIGZsYWdcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBib29sXG4gICAqICAgICAgICAtIHRydWUgc2lnbmFscyB0aGF0IHRoaXMgaXMgYW4gYXVkaW8gcGxheWVyXG4gICAqICAgICAgICAtIGZhbHNlIHNpZ25hbHMgdGhhdCB0aGlzIGlzIG5vdCBhbiBhdWRpbyBwbGF5ZXJcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiBpc0F1ZGlvIHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuaXNBdWRpbyA9IGZ1bmN0aW9uIGlzQXVkaW8oYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNBdWRpb18gPSAhIWJvb2w7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuICEhdGhpcy5pc0F1ZGlvXztcbiAgfTtcblxuICAvKipcbiAgICogQSBoZWxwZXIgbWV0aG9kIGZvciBhZGRpbmcgYSB7QGxpbmsgVGV4dFRyYWNrfSB0byBvdXJcbiAgICoge0BsaW5rIFRleHRUcmFja0xpc3R9LlxuICAgKlxuICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgVzNDIHNldHRpbmdzIHdlIGFsbG93IGFkZGluZyBhZGRpdGlvbmFsIGluZm8gdGhyb3VnaCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvZHJhZnRzL2h0bWwvbWFzdGVyL2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1hZGR0ZXh0dHJhY2tcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtraW5kXVxuICAgKiAgICAgICAgdGhlIGtpbmQgb2YgVGV4dFRyYWNrIHlvdSBhcmUgYWRkaW5nXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdXG4gICAqICAgICAgICB0aGUgbGFiZWwgdG8gZ2l2ZSB0aGUgVGV4dFRyYWNrIGxhYmVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFuZ3VhZ2VdXG4gICAqICAgICAgICB0aGUgbGFuZ3VhZ2UgdG8gc2V0IG9uIHRoZSBUZXh0VHJhY2tcbiAgICpcbiAgICogQHJldHVybiB7VGV4dFRyYWNrfHVuZGVmaW5lZH1cbiAgICogICAgICAgICB0aGUgVGV4dFRyYWNrIHRoYXQgd2FzIGFkZGVkIG9yIHVuZGVmaW5lZFxuICAgKiAgICAgICAgIGlmIHRoZXJlIGlzIG5vIHRlY2hcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmFkZFRleHRUcmFjayA9IGZ1bmN0aW9uIGFkZFRleHRUcmFjayhraW5kLCBsYWJlbCwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAodGhpcy50ZWNoXykge1xuICAgICAgcmV0dXJuIHRoaXMudGVjaF8uYWRkVGV4dFRyYWNrKGtpbmQsIGxhYmVsLCBsYW5ndWFnZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZW1vdGUge0BsaW5rIFRleHRUcmFja30gYW5kIGFuIHtAbGluayBIVE1MVHJhY2tFbGVtZW50fS4gSXQgd2lsbFxuICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgdmlkZW8gZWxlbWVudCB3aGVuZXZlciB0aGUgc291cmNlIGNoYW5nZXMsIHVubGVzc1xuICAgKiBtYW51YWxDbGVhbnVwIGlzIHNldCB0byBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogICAgICAgIE9wdGlvbnMgdG8gcGFzcyB0byB7QGxpbmsgSFRNTFRyYWNrRWxlbWVudH0gZHVyaW5nIGNyZWF0aW9uLiBTZWVcbiAgICogICAgICAgIHtAbGluayBIVE1MVHJhY2tFbGVtZW50fSBmb3Igb2JqZWN0IHByb3BlcnRpZXMgdGhhdCB5b3Ugc2hvdWxkIHVzZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbbWFudWFsQ2xlYW51cD10cnVlXSBpZiBzZXQgdG8gZmFsc2UsIHRoZSBUZXh0VHJhY2sgd2lsbCBiZVxuICAgKlxuICAgKiBAcmV0dXJuIHtIdG1sVHJhY2tFbGVtZW50fVxuICAgKiAgICAgICAgIHRoZSBIVE1MVHJhY2tFbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQgYW5kIGFkZGVkXG4gICAqICAgICAgICAgdG8gdGhlIEh0bWxUcmFja0VsZW1lbnRMaXN0IGFuZCB0aGUgcmVtb3RlXG4gICAqICAgICAgICAgVGV4dFRyYWNrTGlzdFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgXCJtYW51YWxDbGVhbnVwXCIgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdFxuICAgKiAgICAgICAgICAgICB0byBcImZhbHNlXCIgaW4gdXBjb21pbmcgdmVyc2lvbnMgb2YgVmlkZW8uanNcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmFkZFJlbW90ZVRleHRUcmFjayA9IGZ1bmN0aW9uIGFkZFJlbW90ZVRleHRUcmFjayhvcHRpb25zLCBtYW51YWxDbGVhbnVwKSB7XG4gICAgaWYgKHRoaXMudGVjaF8pIHtcbiAgICAgIHJldHVybiB0aGlzLnRlY2hfLmFkZFJlbW90ZVRleHRUcmFjayhvcHRpb25zLCBtYW51YWxDbGVhbnVwKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHJlbW90ZSB7QGxpbmsgVGV4dFRyYWNrfSBmcm9tIHRoZSByZXNwZWN0aXZlXG4gICAqIHtAbGluayBUZXh0VHJhY2tMaXN0fSBhbmQge0BsaW5rIEh0bWxUcmFja0VsZW1lbnRMaXN0fS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRyYWNrXG4gICAqICAgICAgICBSZW1vdGUge0BsaW5rIFRleHRUcmFja30gdG8gcmVtb3ZlXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICogICAgICAgICBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmdcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnJlbW92ZVJlbW90ZVRleHRUcmFjayA9IGZ1bmN0aW9uIHJlbW92ZVJlbW90ZVRleHRUcmFjaygpIHtcbiAgICB2YXIgX3JlZjMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICBfcmVmMyR0cmFjayA9IF9yZWYzLnRyYWNrLFxuICAgICAgICB0cmFjayA9IF9yZWYzJHRyYWNrID09PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBfcmVmMyR0cmFjaztcblxuICAgIC8vIGRlc3RydWN0dXJlIHRoZSBpbnB1dCBpbnRvIGFuIG9iamVjdCB3aXRoIGEgdHJhY2sgYXJndW1lbnQsIGRlZmF1bHRpbmcgdG8gYXJndW1lbnRzWzBdXG4gICAgLy8gZGVmYXVsdCB0aGUgd2hvbGUgYXJndW1lbnQgdG8gYW4gZW1wdHkgb2JqZWN0IGlmIG5vdGhpbmcgd2FzIHBhc3NlZCBpblxuXG4gICAgaWYgKHRoaXMudGVjaF8pIHtcbiAgICAgIHJldHVybiB0aGlzLnRlY2hfLnJlbW92ZVJlbW90ZVRleHRUcmFjayh0cmFjayk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGF2YWlsYWJsZSBtZWRpYSBwbGF5YmFjayBxdWFsaXR5IG1ldHJpY3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSBXM0MncyBNZWRpYVxuICAgKiBQbGF5YmFjayBRdWFsaXR5IEFQSS5cbiAgICpcbiAgICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9tZWRpYS1wbGF5YmFjay1xdWFsaXR5fVxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfVxuICAgKiAgICAgICAgIEFuIG9iamVjdCB3aXRoIHN1cHBvcnRlZCBtZWRpYSBwbGF5YmFjayBxdWFsaXR5IG1ldHJpY3Mgb3IgdW5kZWZpbmVkIGlmIHRoZXJlXG4gICAqICAgICAgICAgaXMgbm8gdGVjaCBvciB0aGUgdGVjaCBkb2VzIG5vdCBzdXBwb3J0IGl0LlxuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkgPSBmdW5jdGlvbiBnZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHknKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHZpZGVvIHdpZHRoXG4gICAqXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICogICAgICAgICBjdXJyZW50IHZpZGVvIHdpZHRoXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS52aWRlb1dpZHRoID0gZnVuY3Rpb24gdmlkZW9XaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLnZpZGVvV2lkdGggJiYgdGhpcy50ZWNoXy52aWRlb1dpZHRoKCkgfHwgMDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHZpZGVvIGhlaWdodFxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqICAgICAgICAgY3VycmVudCB2aWRlbyBoZWlnaHRcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLnZpZGVvSGVpZ2h0ID0gZnVuY3Rpb24gdmlkZW9IZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaF8gJiYgdGhpcy50ZWNoXy52aWRlb0hlaWdodCAmJiB0aGlzLnRlY2hfLnZpZGVvSGVpZ2h0KCkgfHwgMDtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIHBsYXllcidzIGxhbmd1YWdlIGNvZGVcbiAgICogTk9URTogVGhlIGxhbmd1YWdlIHNob3VsZCBiZSBzZXQgaW4gdGhlIHBsYXllciBvcHRpb25zIGlmIHlvdSB3YW50IHRoZVxuICAgKiB0aGUgY29udHJvbHMgdG8gYmUgYnVpbHQgd2l0aCBhIHNwZWNpZmljIGxhbmd1YWdlLiBDaGFuZ2luZyB0aGUgbGFudWdhZ2VcbiAgICogbGF0ZXIgd2lsbCBub3QgdXBkYXRlIGNvbnRyb2xzIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV1cbiAgICogICAgICAgIHRoZSBsYW5ndWFnZSBjb2RlIHRvIHNldCB0aGUgcGxheWVyIHRvXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogICAgICAgICBUaGUgY3VycmVudCBsYW5ndWFnZSBjb2RlIHdoZW4gZ2V0dGluZ1xuICAgKi9cblxuXG4gIFBsYXllci5wcm90b3R5cGUubGFuZ3VhZ2UgPSBmdW5jdGlvbiBsYW5ndWFnZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VfO1xuICAgIH1cblxuICAgIHRoaXMubGFuZ3VhZ2VfID0gU3RyaW5nKGNvZGUpLnRvTG93ZXJDYXNlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGxheWVyJ3MgbGFuZ3VhZ2UgZGljdGlvbmFyeVxuICAgKiBNZXJnZSBldmVyeSB0aW1lLCBiZWNhdXNlIGEgbmV3bHkgYWRkZWQgcGx1Z2luIG1pZ2h0IGNhbGwgdmlkZW9qcy5hZGRMYW5ndWFnZSgpIGF0IGFueSB0aW1lXG4gICAqIExhbmd1YWdlcyBzcGVjaWZpZWQgZGlyZWN0bHkgaW4gdGhlIHBsYXllciBvcHRpb25zIGhhdmUgcHJlY2VkZW5jZVxuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICogICAgICAgICBBbiBhcnJheSBvZiBvZiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5sYW5ndWFnZXMgPSBmdW5jdGlvbiBsYW5ndWFnZXMoKSB7XG4gICAgcmV0dXJuIG1lcmdlT3B0aW9ucyhQbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfLmxhbmd1YWdlcywgdGhpcy5sYW5ndWFnZXNfKTtcbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHJlcGVyZXNlbnRpbmcgdGhlIGN1cnJlbnQgdHJhY2tcbiAgICogaW5mb3JtYXRpb24uICoqRE9FUyBub3QgcmV0dXJuIGl0IGFzIEpTT04qKlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqICAgICAgICAgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBvZiB0cmFjayBpbmZvXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zXyk7XG4gICAgdmFyIHRyYWNrcyA9IG9wdGlvbnMudHJhY2tzO1xuXG4gICAgb3B0aW9ucy50cmFja3MgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07XG5cbiAgICAgIC8vIGRlZXAgbWVyZ2UgdHJhY2tzIGFuZCBudWxsIG91dCBwbGF5ZXIgc28gbm8gY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgICAgdHJhY2sgPSBtZXJnZU9wdGlvbnModHJhY2spO1xuICAgICAgdHJhY2sucGxheWVyID0gdW5kZWZpbmVkO1xuICAgICAgb3B0aW9ucy50cmFja3NbaV0gPSB0cmFjaztcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNpbXBsZSBtb2RhbCBkaWFsb2cgKGFuIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgTW9kYWxEaWFsb2d9XG4gICAqIGNvbXBvbmVudCkgdGhhdCBpbW1lZGlhdGVseSBvdmVybGF5cyB0aGUgcGxheWVyIHdpdGggYXJiaXRyYXJ5XG4gICAqIGNvbnRlbnQgYW5kIHJlbW92ZXMgaXRzZWxmIHdoZW4gY2xvc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbnxFbGVtZW50fEFycmF5fG51bGx9IGNvbnRlbnRcbiAgICogICAgICAgIFNhbWUgYXMge0BsaW5rIE1vZGFsRGlhbG9nI2NvbnRlbnR9J3MgcGFyYW0gb2YgdGhlIHNhbWUgbmFtZS5cbiAgICogICAgICAgIFRoZSBtb3N0IHN0cmFpZ2h0LWZvcndhcmQgdXNhZ2UgaXMgdG8gcHJvdmlkZSBhIHN0cmluZyBvciBET01cbiAgICogICAgICAgIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIEV4dHJhIG9wdGlvbnMgd2hpY2ggd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhlIHtAbGluayBNb2RhbERpYWxvZ30uXG4gICAqXG4gICAqIEByZXR1cm4ge01vZGFsRGlhbG9nfVxuICAgKiAgICAgICAgIHRoZSB7QGxpbmsgTW9kYWxEaWFsb2d9IHRoYXQgd2FzIGNyZWF0ZWRcbiAgICovXG5cblxuICBQbGF5ZXIucHJvdG90eXBlLmNyZWF0ZU1vZGFsID0gZnVuY3Rpb24gY3JlYXRlTW9kYWwoY29udGVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpczEyID0gdGhpcztcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQgfHwgJyc7XG5cbiAgICB2YXIgbW9kYWwgPSBuZXcgTW9kYWxEaWFsb2codGhpcywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmFkZENoaWxkKG1vZGFsKTtcbiAgICBtb2RhbC5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMTIucmVtb3ZlQ2hpbGQobW9kYWwpO1xuICAgIH0pO1xuXG4gICAgbW9kYWwub3BlbigpO1xuICAgIHJldHVybiBtb2RhbDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyB0YWcgc2V0dGluZ3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YWdcbiAgICogICAgICAgIFRoZSBwbGF5ZXIgdGFnXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICogICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBhbGwgb2YgdGhlIHNldHRpbmdzXG4gICAqICAgICAgICAgZm9yIGEgcGxheWVyIHRhZ1xuICAgKi9cblxuXG4gIFBsYXllci5nZXRUYWdTZXR0aW5ncyA9IGZ1bmN0aW9uIGdldFRhZ1NldHRpbmdzKHRhZykge1xuICAgIHZhciBiYXNlT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZXM6IFtdLFxuICAgICAgdHJhY2tzOiBbXVxuICAgIH07XG5cbiAgICB2YXIgdGFnT3B0aW9ucyA9IGdldEF0dHJpYnV0ZXModGFnKTtcbiAgICB2YXIgZGF0YVNldHVwID0gdGFnT3B0aW9uc1snZGF0YS1zZXR1cCddO1xuXG4gICAgaWYgKGhhc0NsYXNzKHRhZywgJ3Zqcy1mbHVpZCcpKSB7XG4gICAgICB0YWdPcHRpb25zLmZsdWlkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkYXRhLXNldHVwIGF0dHIgZXhpc3RzLlxuICAgIGlmIChkYXRhU2V0dXAgIT09IG51bGwpIHtcbiAgICAgIC8vIFBhcnNlIG9wdGlvbnMgSlNPTlxuICAgICAgLy8gSWYgZW1wdHkgc3RyaW5nLCBtYWtlIGl0IGEgcGFyc2FibGUganNvbiBvYmplY3QuXG4gICAgICB2YXIgX3NhZmVQYXJzZVR1cGxlID0gc2FmZVBhcnNlVHVwbGUoZGF0YVNldHVwIHx8ICd7fScpLFxuICAgICAgICAgIGVyciA9IF9zYWZlUGFyc2VUdXBsZVswXSxcbiAgICAgICAgICBkYXRhID0gX3NhZmVQYXJzZVR1cGxlWzFdO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGxvZyQxLmVycm9yKGVycik7XG4gICAgICB9XG4gICAgICBhc3NpZ24odGFnT3B0aW9ucywgZGF0YSk7XG4gICAgfVxuXG4gICAgYXNzaWduKGJhc2VPcHRpb25zLCB0YWdPcHRpb25zKTtcblxuICAgIC8vIEdldCB0YWcgY2hpbGRyZW4gc2V0dGluZ3NcbiAgICBpZiAodGFnLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gdGFnLmNoaWxkTm9kZXM7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAvLyBDaGFuZ2UgY2FzZSBuZWVkZWQ6IGh0dHA6Ly9lam9obi5vcmcvYmxvZy9ub2RlbmFtZS1jYXNlLXNlbnNpdGl2aXR5L1xuICAgICAgICB2YXIgY2hpbGROYW1lID0gY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoY2hpbGROYW1lID09PSAnc291cmNlJykge1xuICAgICAgICAgIGJhc2VPcHRpb25zLnNvdXJjZXMucHVzaChnZXRBdHRyaWJ1dGVzKGNoaWxkKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGROYW1lID09PSAndHJhY2snKSB7XG4gICAgICAgICAgYmFzZU9wdGlvbnMudHJhY2tzLnB1c2goZ2V0QXR0cmlidXRlcyhjaGlsZCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2VPcHRpb25zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2V0aGVyIG9yIG5vdCBmbGV4Ym94IGlzIHN1cHBvcnRlZFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiAgICAgICAgIC0gdHJ1ZSBpZiBmbGV4Ym94IGlzIHN1cHBvcnRlZFxuICAgKiAgICAgICAgIC0gZmFsc2UgaWYgZmxleGJveCBpcyBub3Qgc3VwcG9ydGVkXG4gICAqL1xuXG5cbiAgUGxheWVyLnByb3RvdHlwZS5mbGV4Tm90U3VwcG9ydGVkXyA9IGZ1bmN0aW9uIGZsZXhOb3RTdXBwb3J0ZWRfKCkge1xuICAgIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xuXG4gICAgLy8gTm90ZTogV2UgZG9uJ3QgYWN0dWFsbHkgdXNlIGZsZXhCYXNpcyAob3IgZmxleE9yZGVyKSwgYnV0IGl0J3Mgb25lIG9mIHRoZSBtb3JlXG4gICAgLy8gY29tbW9uIGZsZXggZmVhdHVyZXMgdGhhdCB3ZSBjYW4gcmVseSBvbiB3aGVuIGNoZWNraW5nIGZvciBmbGV4IHN1cHBvcnQuXG4gICAgcmV0dXJuICEoJ2ZsZXhCYXNpcycgaW4gZWxlbS5zdHlsZSB8fCAnd2Via2l0RmxleEJhc2lzJyBpbiBlbGVtLnN0eWxlIHx8ICdtb3pGbGV4QmFzaXMnIGluIGVsZW0uc3R5bGUgfHwgJ21zRmxleEJhc2lzJyBpbiBlbGVtLnN0eWxlIHx8XG4gICAgLy8gSUUxMC1zcGVjaWZpYyAoMjAxMiBmbGV4IHNwZWMpXG4gICAgJ21zRmxleE9yZGVyJyBpbiBlbGVtLnN0eWxlKTtcbiAgfTtcblxuICByZXR1cm4gUGxheWVyO1xufShDb21wb25lbnQpO1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIFZpZGVvVHJhY2tMaXN0fVxuICogQGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3ZpZGVvdHJhY2tsaXN0XG4gKlxuICogQHJldHVybiB7VmlkZW9UcmFja0xpc3R9XG4gKiAgICAgICAgIHRoZSBjdXJyZW50IHZpZGVvIHRyYWNrIGxpc3RcbiAqXG4gKiBAbWV0aG9kIFBsYXllci5wcm90b3R5cGUudmlkZW9UcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIEF1ZGlvVHJhY2tMaXN0fVxuICogQGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2F1ZGlvdHJhY2tsaXN0XG4gKlxuICogQHJldHVybiB7QXVkaW9UcmFja0xpc3R9XG4gKiAgICAgICAgIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrIGxpc3RcbiAqXG4gKiBAbWV0aG9kIFBsYXllci5wcm90b3R5cGUuYXVkaW9UcmFja3NcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUge0BsaW5rIFRleHRUcmFja0xpc3R9XG4gKlxuICogQGxpbmsgaHR0cDovL3d3dy53My5vcmcvaHRtbC93Zy9kcmFmdHMvaHRtbC9tYXN0ZXIvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXRleHR0cmFja3NcbiAqXG4gKiBAcmV0dXJuIHtUZXh0VHJhY2tMaXN0fVxuICogICAgICAgICB0aGUgY3VycmVudCB0ZXh0IHRyYWNrIGxpc3RcbiAqXG4gKiBAbWV0aG9kIFBsYXllci5wcm90b3R5cGUudGV4dFRyYWNrc1xuICovXG5cbi8qKlxuICogR2V0IHRoZSByZW1vdGUge0BsaW5rIFRleHRUcmFja0xpc3R9XG4gKlxuICogQHJldHVybiB7VGV4dFRyYWNrTGlzdH1cbiAqICAgICAgICAgVGhlIGN1cnJlbnQgcmVtb3RlIHRleHQgdHJhY2sgbGlzdFxuICpcbiAqIEBtZXRob2QgUGxheWVyLnByb3RvdHlwZS5yZW1vdGVUZXh0VHJhY2tzXG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIHJlbW90ZSB7QGxpbmsgSHRtbFRyYWNrRWxlbWVudExpc3R9IHRyYWNrcy5cbiAqXG4gKiBAcmV0dXJuIHtIdG1sVHJhY2tFbGVtZW50TGlzdH1cbiAqICAgICAgICAgVGhlIGN1cnJlbnQgcmVtb3RlIHRleHQgdHJhY2sgZWxlbWVudCBsaXN0XG4gKlxuICogQG1ldGhvZCBQbGF5ZXIucHJvdG90eXBlLnJlbW90ZVRleHRUcmFja0Vsc1xuICovXG5cbkFMTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7XG4gIHZhciBwcm9wcyA9IEFMTFtuYW1lJCQxXTtcblxuICBQbGF5ZXIucHJvdG90eXBlW3Byb3BzLmdldHRlck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoX1twcm9wcy5nZXR0ZXJOYW1lXSgpO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgbm90IHlldCBsb2FkVGVjaF8sIHdlIGNyZWF0ZSB7dmlkZW8sYXVkaW8sdGV4dH1UcmFja3NfXG4gICAgLy8gdGhlc2Ugd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlY2ggZHVyaW5nIGxvYWRpbmdcbiAgICB0aGlzW3Byb3BzLnByaXZhdGVOYW1lXSA9IHRoaXNbcHJvcHMucHJpdmF0ZU5hbWVdIHx8IG5ldyBwcm9wcy5MaXN0Q2xhc3MoKTtcbiAgICByZXR1cm4gdGhpc1twcm9wcy5wcml2YXRlTmFtZV07XG4gIH07XG59KTtcblxuLyoqXG4gKiBHbG9iYWwgcGxheWVyIGxpc3RcbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5QbGF5ZXIucGxheWVycyA9IHt9O1xuXG52YXIgbmF2aWdhdG9yID0gd2luZG93Lm5hdmlnYXRvcjtcblxuLypcbiAqIFBsYXllciBpbnN0YW5jZSBvcHRpb25zLCBzdXJmYWNlZCB1c2luZyBvcHRpb25zXG4gKiBvcHRpb25zID0gUGxheWVyLnByb3RvdHlwZS5vcHRpb25zX1xuICogTWFrZSBjaGFuZ2VzIGluIG9wdGlvbnMsIG5vdCBoZXJlLlxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5QbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICAvLyBEZWZhdWx0IG9yZGVyIG9mIGZhbGxiYWNrIHRlY2hub2xvZ3lcbiAgdGVjaE9yZGVyOiBUZWNoLmRlZmF1bHRUZWNoT3JkZXJfLFxuXG4gIGh0bWw1OiB7fSxcbiAgZmxhc2g6IHt9LFxuXG4gIC8vIGRlZmF1bHQgaW5hY3Rpdml0eSB0aW1lb3V0XG4gIGluYWN0aXZpdHlUaW1lb3V0OiAyMDAwLFxuXG4gIC8vIGRlZmF1bHQgcGxheWJhY2sgcmF0ZXNcbiAgcGxheWJhY2tSYXRlczogW10sXG4gIC8vIEFkZCBwbGF5YmFjayByYXRlIHNlbGVjdGlvbiBieSBhZGRpbmcgcmF0ZXNcbiAgLy8gJ3BsYXliYWNrUmF0ZXMnOiBbMC41LCAxLCAxLjUsIDJdLFxuXG4gIC8vIEluY2x1ZGVkIGNvbnRyb2wgc2V0c1xuICBjaGlsZHJlbjogWydtZWRpYUxvYWRlcicsICdwb3N0ZXJJbWFnZScsICd0ZXh0VHJhY2tEaXNwbGF5JywgJ2xvYWRpbmdTcGlubmVyJywgJ2JpZ1BsYXlCdXR0b24nLCAnY29udHJvbEJhcicsICdlcnJvckRpc3BsYXknLCAndGV4dFRyYWNrU2V0dGluZ3MnXSxcblxuICBsYW5ndWFnZTogbmF2aWdhdG9yICYmIChuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UpIHx8ICdlbicsXG5cbiAgLy8gbG9jYWxlcyBhbmQgdGhlaXIgbGFuZ3VhZ2UgdHJhbnNsYXRpb25zXG4gIGxhbmd1YWdlczoge30sXG5cbiAgLy8gRGVmYXVsdCBtZXNzYWdlIHRvIHNob3cgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuXG4gIG5vdFN1cHBvcnRlZE1lc3NhZ2U6ICdObyBjb21wYXRpYmxlIHNvdXJjZSB3YXMgZm91bmQgZm9yIHRoaXMgbWVkaWEuJ1xufTtcblxuaWYgKCFJU19JRTgpIHtcbiAgUGxheWVyLnByb3RvdHlwZS5vcHRpb25zXy5jaGlsZHJlbi5wdXNoKCdyZXNpemVNYW5hZ2VyJyk7XG59XG5cbltcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGluIHRoZSBcImVuZGVkXCIgc3RhdGUuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGxheWVyIGlzIGluIHRoZSBlbmRlZCBzdGF0ZSwgZmFsc2UgaWYgbm90LlxuICogQG1ldGhvZCBQbGF5ZXIjZW5kZWRcbiAqL1xuJ2VuZGVkJyxcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGluIHRoZSBcInNlZWtpbmdcIiBzdGF0ZS5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBwbGF5ZXIgaXMgaW4gdGhlIHNlZWtpbmcgc3RhdGUsIGZhbHNlIGlmIG5vdC5cbiAqIEBtZXRob2QgUGxheWVyI3NlZWtpbmdcbiAqL1xuJ3NlZWtpbmcnLFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBUaW1lUmFuZ2VzIG9mIHRoZSBtZWRpYSB0aGF0IGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlXG4gKiBmb3Igc2Vla2luZyB0by5cbiAqXG4gKiBAcmV0dXJuIHtUaW1lUmFuZ2VzfSB0aGUgc2Vla2FibGUgaW50ZXJ2YWxzIG9mIHRoZSBtZWRpYSB0aW1lbGluZVxuICogQG1ldGhvZCBQbGF5ZXIjc2Vla2FibGVcbiAqL1xuJ3NlZWthYmxlJyxcbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBuZXR3b3JrIGFjdGl2aXR5IGZvciB0aGUgZWxlbWVudCwgZnJvbVxuICogdGhlIGNvZGVzIGluIHRoZSBsaXN0IGJlbG93LlxuICogLSBORVRXT1JLX0VNUFRZIChudW1lcmljIHZhbHVlIDApXG4gKiAgIFRoZSBlbGVtZW50IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGlzZWQuIEFsbCBhdHRyaWJ1dGVzIGFyZSBpblxuICogICB0aGVpciBpbml0aWFsIHN0YXRlcy5cbiAqIC0gTkVUV09SS19JRExFIChudW1lcmljIHZhbHVlIDEpXG4gKiAgIFRoZSBlbGVtZW50J3MgcmVzb3VyY2Ugc2VsZWN0aW9uIGFsZ29yaXRobSBpcyBhY3RpdmUgYW5kIGhhc1xuICogICBzZWxlY3RlZCBhIHJlc291cmNlLCBidXQgaXQgaXMgbm90IGFjdHVhbGx5IHVzaW5nIHRoZSBuZXR3b3JrIGF0XG4gKiAgIHRoaXMgdGltZS5cbiAqIC0gTkVUV09SS19MT0FESU5HIChudW1lcmljIHZhbHVlIDIpXG4gKiAgIFRoZSB1c2VyIGFnZW50IGlzIGFjdGl2ZWx5IHRyeWluZyB0byBkb3dubG9hZCBkYXRhLlxuICogLSBORVRXT1JLX05PX1NPVVJDRSAobnVtZXJpYyB2YWx1ZSAzKVxuICogICBUaGUgZWxlbWVudCdzIHJlc291cmNlIHNlbGVjdGlvbiBhbGdvcml0aG0gaXMgYWN0aXZlLCBidXQgaXQgaGFzXG4gKiAgIG5vdCB5ZXQgZm91bmQgYSByZXNvdXJjZSB0byB1c2UuXG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjbmV0d29yay1zdGF0ZXNcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIGN1cnJlbnQgbmV0d29yayBhY3Rpdml0eSBzdGF0ZVxuICogQG1ldGhvZCBQbGF5ZXIjbmV0d29ya1N0YXRlXG4gKi9cbiduZXR3b3JrU3RhdGUnLFxuLyoqXG4gKiBSZXR1cm5zIGEgdmFsdWUgdGhhdCBleHByZXNzZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGVsZW1lbnRcbiAqIHdpdGggcmVzcGVjdCB0byByZW5kZXJpbmcgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24sIGZyb20gdGhlXG4gKiBjb2RlcyBpbiB0aGUgbGlzdCBiZWxvdy5cbiAqIC0gSEFWRV9OT1RISU5HIChudW1lcmljIHZhbHVlIDApXG4gKiAgIE5vIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgbWVkaWEgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLlxuICogLSBIQVZFX01FVEFEQVRBIChudW1lcmljIHZhbHVlIDEpXG4gKiAgIEVub3VnaCBvZiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gb2J0YWluZWQgdGhhdCB0aGUgZHVyYXRpb24gb2YgdGhlXG4gKiAgIHJlc291cmNlIGlzIGF2YWlsYWJsZS5cbiAqIC0gSEFWRV9DVVJSRU5UX0RBVEEgKG51bWVyaWMgdmFsdWUgMilcbiAqICAgRGF0YSBmb3IgdGhlIGltbWVkaWF0ZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGlzIGF2YWlsYWJsZS5cbiAqIC0gSEFWRV9GVVRVUkVfREFUQSAobnVtZXJpYyB2YWx1ZSAzKVxuICogICBEYXRhIGZvciB0aGUgaW1tZWRpYXRlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaXMgYXZhaWxhYmxlLCBhc1xuICogICB3ZWxsIGFzIGVub3VnaCBkYXRhIGZvciB0aGUgdXNlciBhZ2VudCB0byBhZHZhbmNlIHRoZSBjdXJyZW50XG4gKiAgIHBsYXliYWNrIHBvc2l0aW9uIGluIHRoZSBkaXJlY3Rpb24gb2YgcGxheWJhY2suXG4gKiAtIEhBVkVfRU5PVUdIX0RBVEEgKG51bWVyaWMgdmFsdWUgNClcbiAqICAgVGhlIHVzZXIgYWdlbnQgZXN0aW1hdGVzIHRoYXQgZW5vdWdoIGRhdGEgaXMgYXZhaWxhYmxlIGZvclxuICogICBwbGF5YmFjayB0byBwcm9jZWVkIHVuaW50ZXJydXB0ZWQuXG4gKlxuICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLW1lZGlhLXJlYWR5c3RhdGVcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIGN1cnJlbnQgcGxheWJhY2sgcmVuZGVyaW5nIHN0YXRlXG4gKiBAbWV0aG9kIFBsYXllciNyZWFkeVN0YXRlXG4gKi9cbidyZWFkeVN0YXRlJ10uZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgUGxheWVyLnByb3RvdHlwZVtmbl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oZm4pO1xuICB9O1xufSk7XG5cblRFQ0hfRVZFTlRTX1JFVFJJR0dFUi5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICBQbGF5ZXIucHJvdG90eXBlWydoYW5kbGVUZWNoJyArIHRvVGl0bGVDYXNlKGV2ZW50KSArICdfJ10gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlcihldmVudCk7XG4gIH07XG59KTtcblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBwbGF5ZXIgaGFzIGluaXRpYWwgZHVyYXRpb24gYW5kIGRpbWVuc2lvbiBpbmZvcm1hdGlvblxuICpcbiAqIEBldmVudCBQbGF5ZXIjbG9hZGVkbWV0YWRhdGFcbiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH1cbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHBsYXllciBoYXMgZG93bmxvYWRlZCBkYXRhIGF0IHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uXG4gKlxuICogQGV2ZW50IFBsYXllciNsb2FkZWRkYXRhXG4gKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGhhcyBjaGFuZ2VkICpcbiAqIER1cmluZyBwbGF5YmFjayB0aGlzIGlzIGZpcmVkIGV2ZXJ5IDE1LTI1MCBtaWxsaXNlY29uZHMsIGRlcGVuZGluZyBvbiB0aGVcbiAqIHBsYXliYWNrIHRlY2hub2xvZ3kgaW4gdXNlLlxuICpcbiAqIEBldmVudCBQbGF5ZXIjdGltZXVwZGF0ZVxuICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgdm9sdW1lIGNoYW5nZXNcbiAqXG4gKiBAZXZlbnQgUGxheWVyI3ZvbHVtZWNoYW5nZVxuICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fVxuICovXG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIG9yIG5vdCBhIHBsYXllciBoYXMgYSBwbHVnaW4gYXZhaWxhYmxlLlxuICpcbiAqIFRoaXMgZG9lcyBub3QgcmVwb3J0IHdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaGFzIGV2ZXIgYmVlbiBpbml0aWFsaXplZFxuICogb24gdGhpcyBwbGF5ZXIuIEZvciB0aGF0LCBbdXNpbmdQbHVnaW5de0BsaW5rIFBsYXllciN1c2luZ1BsdWdpbn0uXG4gKlxuICogQG1ldGhvZCBQbGF5ZXIjaGFzUGx1Z2luXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lXG4gKiAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoaXMgcGxheWVyIGhhcyB0aGUgcmVxdWVzdGVkIHBsdWdpbiBhdmFpbGFibGUuXG4gKi9cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgb3Igbm90IGEgcGxheWVyIGlzIHVzaW5nIGEgcGx1Z2luIGJ5IG5hbWUuXG4gKlxuICogRm9yIGJhc2ljIHBsdWdpbnMsIHRoaXMgb25seSByZXBvcnRzIHdoZXRoZXIgdGhlIHBsdWdpbiBoYXMgX2V2ZXJfIGJlZW5cbiAqIGluaXRpYWxpemVkIG9uIHRoaXMgcGxheWVyLlxuICpcbiAqIEBtZXRob2QgUGxheWVyI3VzaW5nUGx1Z2luXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgV2hldGhlciBvciBub3QgdGhpcyBwbGF5ZXIgaXMgdXNpbmcgdGhlIHJlcXVlc3RlZCBwbHVnaW4uXG4gKi9cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQbGF5ZXInLCBQbGF5ZXIpO1xuXG4vKipcbiAqIEBmaWxlIHBsdWdpbi5qc1xuICovXG4vKipcbiAqIFRoZSBiYXNlIHBsdWdpbiBuYW1lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbnZhciBCQVNFX1BMVUdJTl9OQU1FID0gJ3BsdWdpbic7XG5cbi8qKlxuICogVGhlIGtleSBvbiB3aGljaCBhIHBsYXllcidzIGFjdGl2ZSBwbHVnaW5zIGNhY2hlIGlzIHN0b3JlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0YW50XG4gKiBAdHlwZSAgICAge3N0cmluZ31cbiAqL1xudmFyIFBMVUdJTl9DQUNIRV9LRVkgPSAnYWN0aXZlUGx1Z2luc18nO1xuXG4vKipcbiAqIFN0b3JlcyByZWdpc3RlcmVkIHBsdWdpbnMgaW4gYSBwcml2YXRlIHNwYWNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSAgICB7T2JqZWN0fVxuICovXG52YXIgcGx1Z2luU3RvcmFnZSA9IHt9O1xuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBvciBub3QgYSBwbHVnaW4gaGFzIGJlZW4gcmVnaXN0ZXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICAge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGhhcyBiZWVuIHJlZ2lzdGVyZWQuXG4gKi9cbnZhciBwbHVnaW5FeGlzdHMgPSBmdW5jdGlvbiBwbHVnaW5FeGlzdHMobmFtZSkge1xuICByZXR1cm4gcGx1Z2luU3RvcmFnZS5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbn07XG5cbi8qKlxuICogR2V0IGEgc2luZ2xlIHJlZ2lzdGVyZWQgcGx1Z2luIGJ5IG5hbWUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnx1bmRlZmluZWR9XG4gKiAgICAgICAgICBUaGUgcGx1Z2luIChvciB1bmRlZmluZWQpLlxuICovXG52YXIgZ2V0UGx1Z2luID0gZnVuY3Rpb24gZ2V0UGx1Z2luKG5hbWUpIHtcbiAgcmV0dXJuIHBsdWdpbkV4aXN0cyhuYW1lKSA/IHBsdWdpblN0b3JhZ2VbbmFtZV0gOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIE1hcmtzIGEgcGx1Z2luIGFzIFwiYWN0aXZlXCIgb24gYSBwbGF5ZXIuXG4gKlxuICogQWxzbywgZW5zdXJlcyB0aGF0IHRoZSBwbGF5ZXIgaGFzIGFuIG9iamVjdCBmb3IgdHJhY2tpbmcgYWN0aXZlIHBsdWdpbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtQbGF5ZXJ9IHBsYXllclxuICogICAgICAgICAgQSBWaWRlby5qcyBwbGF5ZXIgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICAge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uXG4gKi9cbnZhciBtYXJrUGx1Z2luQXNBY3RpdmUgPSBmdW5jdGlvbiBtYXJrUGx1Z2luQXNBY3RpdmUocGxheWVyLCBuYW1lKSB7XG4gIHBsYXllcltQTFVHSU5fQ0FDSEVfS0VZXSA9IHBsYXllcltQTFVHSU5fQ0FDSEVfS0VZXSB8fCB7fTtcbiAgcGxheWVyW1BMVUdJTl9DQUNIRV9LRVldW25hbWVdID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlcnMgYSBwYWlyIG9mIHBsdWdpbiBzZXR1cCBldmVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge1BsYXllcn0gcGxheWVyXG4gKiAgICAgICAgIEEgVmlkZW8uanMgcGxheWVyIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSAge1BsdWdpbn5QbHVnaW5FdmVudEhhc2h9IGhhc2hcbiAqICAgICAgICAgQSBwbHVnaW4gZXZlbnQgaGFzaC5cbiAqXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbYmVmb3JlXVxuICogICAgICAgICBJZiB0cnVlLCBwcmVmaXhlcyB0aGUgZXZlbnQgbmFtZSB3aXRoIFwiYmVmb3JlXCIuIEluIG90aGVyIHdvcmRzLFxuICogICAgICAgICB1c2UgdGhpcyB0byB0cmlnZ2VyIFwiYmVmb3JlcGx1Z2luc2V0dXBcIiBpbnN0ZWFkIG9mIFwicGx1Z2luc2V0dXBcIi5cbiAqL1xudmFyIHRyaWdnZXJTZXR1cEV2ZW50ID0gZnVuY3Rpb24gdHJpZ2dlclNldHVwRXZlbnQocGxheWVyLCBoYXNoLCBiZWZvcmUpIHtcbiAgdmFyIGV2ZW50TmFtZSA9IChiZWZvcmUgPyAnYmVmb3JlJyA6ICcnKSArICdwbHVnaW5zZXR1cCc7XG5cbiAgcGxheWVyLnRyaWdnZXIoZXZlbnROYW1lLCBoYXNoKTtcbiAgcGxheWVyLnRyaWdnZXIoZXZlbnROYW1lICsgJzonICsgaGFzaC5uYW1lLCBoYXNoKTtcbn07XG5cbi8qKlxuICogVGFrZXMgYSBiYXNpYyBwbHVnaW4gZnVuY3Rpb24gYW5kIHJldHVybnMgYSB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIG1hcmtzXG4gKiBvbiB0aGUgcGxheWVyIHRoYXQgdGhlIHBsdWdpbiBoYXMgYmVlbiBhY3RpdmF0ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4uXG4gKlxuICogQHBhcmFtICAge0Z1bmN0aW9ufSBwbHVnaW5cbiAqICAgICAgICAgIFRoZSBiYXNpYyBwbHVnaW4uXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICogICAgICAgICAgQSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gcGx1Z2luLlxuICovXG52YXIgY3JlYXRlQmFzaWNQbHVnaW4gPSBmdW5jdGlvbiBjcmVhdGVCYXNpY1BsdWdpbihuYW1lLCBwbHVnaW4pIHtcbiAgdmFyIGJhc2ljUGx1Z2luV3JhcHBlciA9IGZ1bmN0aW9uIGJhc2ljUGx1Z2luV3JhcHBlcigpIHtcblxuICAgIC8vIFdlIHRyaWdnZXIgdGhlIFwiYmVmb3JlcGx1Z2luc2V0dXBcIiBhbmQgXCJwbHVnaW5zZXR1cFwiIGV2ZW50cyBvbiB0aGUgcGxheWVyXG4gICAgLy8gcmVnYXJkbGVzcywgYnV0IHdlIHdhbnQgdGhlIGhhc2ggdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBoYXNoIHByb3ZpZGVkXG4gICAgLy8gZm9yIGFkdmFuY2VkIHBsdWdpbnMuXG4gICAgLy9cbiAgICAvLyBUaGUgb25seSBwb3RlbnRpYWxseSBjb3VudGVyLWludHVpdGl2ZSB0aGluZyBoZXJlIGlzIHRoZSBgaW5zdGFuY2VgIGluXG4gICAgLy8gdGhlIFwicGx1Z2luc2V0dXBcIiBldmVudCBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGBwbHVnaW5gIGZ1bmN0aW9uLlxuICAgIHRyaWdnZXJTZXR1cEV2ZW50KHRoaXMsIHsgbmFtZTogbmFtZSwgcGx1Z2luOiBwbHVnaW4sIGluc3RhbmNlOiBudWxsIH0sIHRydWUpO1xuXG4gICAgdmFyIGluc3RhbmNlID0gcGx1Z2luLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBtYXJrUGx1Z2luQXNBY3RpdmUodGhpcywgbmFtZSk7XG4gICAgdHJpZ2dlclNldHVwRXZlbnQodGhpcywgeyBuYW1lOiBuYW1lLCBwbHVnaW46IHBsdWdpbiwgaW5zdGFuY2U6IGluc3RhbmNlIH0pO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xuXG4gIE9iamVjdC5rZXlzKHBsdWdpbikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIGJhc2ljUGx1Z2luV3JhcHBlcltwcm9wXSA9IHBsdWdpbltwcm9wXTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJhc2ljUGx1Z2luV3JhcHBlcjtcbn07XG5cbi8qKlxuICogVGFrZXMgYSBwbHVnaW4gc3ViLWNsYXNzIGFuZCByZXR1cm5zIGEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZ1xuICogaW5zdGFuY2VzIG9mIGl0LlxuICpcbiAqIFRoaXMgZmFjdG9yeSBmdW5jdGlvbiB3aWxsIHJlcGxhY2UgaXRzZWxmIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3RlZFxuICogc3ViLWNsYXNzIG9mIFBsdWdpbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICAge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0gICB7UGx1Z2lufSBQbHVnaW5TdWJDbGFzc1xuICogICAgICAgICAgVGhlIGFkdmFuY2VkIHBsdWdpbi5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbnZhciBjcmVhdGVQbHVnaW5GYWN0b3J5ID0gZnVuY3Rpb24gY3JlYXRlUGx1Z2luRmFjdG9yeShuYW1lLCBQbHVnaW5TdWJDbGFzcykge1xuXG4gIC8vIEFkZCBhIGBuYW1lYCBwcm9wZXJ0eSB0byB0aGUgcGx1Z2luIHByb3RvdHlwZSBzbyB0aGF0IGVhY2ggcGx1Z2luIGNhblxuICAvLyByZWZlciB0byBpdHNlbGYgYnkgbmFtZS5cbiAgUGx1Z2luU3ViQ2xhc3MucHJvdG90eXBlLm5hbWUgPSBuYW1lO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdHJpZ2dlclNldHVwRXZlbnQodGhpcywgeyBuYW1lOiBuYW1lLCBwbHVnaW46IFBsdWdpblN1YkNsYXNzLCBpbnN0YW5jZTogbnVsbCB9LCB0cnVlKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBpbnN0YW5jZSA9IG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoUGx1Z2luU3ViQ2xhc3MsIFtudWxsXS5jb25jYXQoW3RoaXNdLmNvbmNhdChhcmdzKSkpKSgpO1xuXG4gICAgLy8gVGhlIHBsdWdpbiBpcyByZXBsYWNlZCBieSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBpbnN0YW5jZS5cbiAgICB0aGlzW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG5cbiAgICB0cmlnZ2VyU2V0dXBFdmVudCh0aGlzLCBpbnN0YW5jZS5nZXRFdmVudEhhc2goKSk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59O1xuXG4vKipcbiAqIFBhcmVudCBjbGFzcyBmb3IgYWxsIGFkdmFuY2VkIHBsdWdpbnMuXG4gKlxuICogQG1peGVzICAgbW9kdWxlOmV2ZW50ZWR+RXZlbnRlZE1peGluXG4gKiBAbWl4ZXMgICBtb2R1bGU6c3RhdGVmdWx+U3RhdGVmdWxNaXhpblxuICogQGZpcmVzICAgUGxheWVyI2JlZm9yZXBsdWdpbnNldHVwXG4gKiBAZmlyZXMgICBQbGF5ZXIjYmVmb3JlcGx1Z2luc2V0dXA6JG5hbWVcbiAqIEBmaXJlcyAgIFBsYXllciNwbHVnaW5zZXR1cFxuICogQGZpcmVzICAgUGxheWVyI3BsdWdpbnNldHVwOiRuYW1lXG4gKiBAbGlzdGVucyBQbGF5ZXIjZGlzcG9zZVxuICogQHRocm93cyAge0Vycm9yfVxuICogICAgICAgICAgSWYgYXR0ZW1wdGluZyB0byBpbnN0YW50aWF0ZSB0aGUgYmFzZSB7QGxpbmsgUGx1Z2lufSBjbGFzc1xuICogICAgICAgICAgZGlyZWN0bHkgaW5zdGVhZCBvZiB2aWEgYSBzdWItY2xhc3MuXG4gKi9cblxudmFyIFBsdWdpbiA9IGZ1bmN0aW9uICgpIHtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBTdWItY2xhc3NlcyBzaG91bGQgY2FsbCBgc3VwZXJgIHRvIGVuc3VyZSBwbHVnaW5zIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbiAgICpcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllclxuICAgKiAgICAgICAgQSBWaWRlby5qcyBwbGF5ZXIgaW5zdGFuY2UuXG4gICAqL1xuICBmdW5jdGlvbiBQbHVnaW4ocGxheWVyKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUGx1Z2luKTtcblxuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBQbHVnaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGx1Z2luIG11c3QgYmUgc3ViLWNsYXNzZWQ7IG5vdCBkaXJlY3RseSBpbnN0YW50aWF0ZWQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAvLyBNYWtlIHRoaXMgb2JqZWN0IGV2ZW50ZWQsIGJ1dCByZW1vdmUgdGhlIGFkZGVkIGB0cmlnZ2VyYCBtZXRob2Qgc28gd2VcbiAgICAvLyB1c2UgdGhlIHByb3RvdHlwZSB2ZXJzaW9uIGluc3RlYWQuXG4gICAgZXZlbnRlZCh0aGlzKTtcbiAgICBkZWxldGUgdGhpcy50cmlnZ2VyO1xuXG4gICAgc3RhdGVmdWwodGhpcywgdGhpcy5jb25zdHJ1Y3Rvci5kZWZhdWx0U3RhdGUpO1xuICAgIG1hcmtQbHVnaW5Bc0FjdGl2ZShwbGF5ZXIsIHRoaXMubmFtZSk7XG5cbiAgICAvLyBBdXRvLWJpbmQgdGhlIGRpc3Bvc2UgbWV0aG9kIHNvIHdlIGNhbiB1c2UgaXQgYXMgYSBsaXN0ZW5lciBhbmQgdW5iaW5kXG4gICAgLy8gaXQgbGF0ZXIgZWFzaWx5LlxuICAgIHRoaXMuZGlzcG9zZSA9IGJpbmQodGhpcywgdGhpcy5kaXNwb3NlKTtcblxuICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgZGlzcG9zZWQsIGRpc3Bvc2UgdGhlIHBsdWdpbi5cbiAgICBwbGF5ZXIub24oJ2Rpc3Bvc2UnLCB0aGlzLmRpc3Bvc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luIHRoYXQgd2FzIHNldCBvbiA8cGx1Z2luTmFtZT4uVkVSU0lPTlxuICAgKi9cblxuXG4gIFBsdWdpbi5wcm90b3R5cGUudmVyc2lvbiA9IGZ1bmN0aW9uIHZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuVkVSU0lPTjtcbiAgfTtcblxuICAvKipcbiAgICogRWFjaCBldmVudCB0cmlnZ2VyZWQgYnkgcGx1Z2lucyBpbmNsdWRlcyBhIGhhc2ggb2YgYWRkaXRpb25hbCBkYXRhIHdpdGhcbiAgICogY29udmVudGlvbmFsIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIFRoaXMgcmV0dXJucyB0aGF0IG9iamVjdCBvciBtdXRhdGVzIGFuIGV4aXN0aW5nIGhhc2guXG4gICAqXG4gICAqIEBwYXJhbSAgIHtPYmplY3R9IFtoYXNoPXt9XVxuICAgKiAgICAgICAgICBBbiBvYmplY3QgdG8gYmUgdXNlZCBhcyBldmVudCBhbiBldmVudCBoYXNoLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGx1Z2luflBsdWdpbkV2ZW50SGFzaH1cbiAgICogICAgICAgICAgQW4gZXZlbnQgaGFzaCBvYmplY3Qgd2l0aCBwcm92aWRlZCBwcm9wZXJ0aWVzIG1peGVkLWluLlxuICAgKi9cblxuXG4gIFBsdWdpbi5wcm90b3R5cGUuZ2V0RXZlbnRIYXNoID0gZnVuY3Rpb24gZ2V0RXZlbnRIYXNoKCkge1xuICAgIHZhciBoYXNoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGhhc2gubmFtZSA9IHRoaXMubmFtZTtcbiAgICBoYXNoLnBsdWdpbiA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgaGFzaC5pbnN0YW5jZSA9IHRoaXM7XG4gICAgcmV0dXJuIGhhc2g7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGFuIGV2ZW50IG9uIHRoZSBwbHVnaW4gb2JqZWN0IGFuZCBvdmVycmlkZXNcbiAgICoge0BsaW5rIG1vZHVsZTpldmVudGVkfkV2ZW50ZWRNaXhpbi50cmlnZ2VyfEV2ZW50ZWRNaXhpbi50cmlnZ2VyfS5cbiAgICpcbiAgICogQHBhcmFtICAge3N0cmluZ3xPYmplY3R9IGV2ZW50XG4gICAqICAgICAgICAgIEFuIGV2ZW50IHR5cGUgb3IgYW4gb2JqZWN0IHdpdGggYSB0eXBlIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0gICB7T2JqZWN0fSBbaGFzaD17fV1cbiAgICogICAgICAgICAgQWRkaXRpb25hbCBkYXRhIGhhc2ggdG8gbWVyZ2Ugd2l0aCBhXG4gICAqICAgICAgICAgIHtAbGluayBQbHVnaW5+UGx1Z2luRXZlbnRIYXNofFBsdWdpbkV2ZW50SGFzaH0uXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiAgICAgICAgICBXaGV0aGVyIG9yIG5vdCBkZWZhdWx0IHdhcyBwcmV2ZW50ZWQuXG4gICAqL1xuXG5cbiAgUGx1Z2luLnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24gdHJpZ2dlciQkMShldmVudCkge1xuICAgIHZhciBoYXNoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiB0cmlnZ2VyKHRoaXMuZXZlbnRCdXNFbF8sIGV2ZW50LCB0aGlzLmdldEV2ZW50SGFzaChoYXNoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgXCJzdGF0ZWNoYW5nZWRcIiBldmVudHMgb24gdGhlIHBsdWdpbi4gTm8tb3AgYnkgZGVmYXVsdCwgb3ZlcnJpZGUgYnlcbiAgICogc3ViY2xhc3NpbmcuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0gICAge0V2ZW50fSBlXG4gICAqICAgICAgICAgICBBbiBldmVudCBvYmplY3QgcHJvdmlkZWQgYnkgYSBcInN0YXRlY2hhbmdlZFwiIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gICAge09iamVjdH0gZS5jaGFuZ2VzXG4gICAqICAgICAgICAgICBBbiBvYmplY3QgZGVzY3JpYmluZyBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgd2l0aCB0aGUgXCJzdGF0ZWNoYW5nZWRcIlxuICAgKiAgICAgICAgICAgZXZlbnQuXG4gICAqL1xuXG5cbiAgUGx1Z2luLnByb3RvdHlwZS5oYW5kbGVTdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbiBoYW5kbGVTdGF0ZUNoYW5nZWQoZSkge307XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGEgcGx1Z2luLlxuICAgKlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIGlmIHRoZXkgd2FudCwgYnV0IGZvciB0aGUgc2FrZSBvZiBzYWZldHksXG4gICAqIGl0J3MgcHJvYmFibHkgYmVzdCB0byBzdWJzY3JpYmUgdGhlIFwiZGlzcG9zZVwiIGV2ZW50LlxuICAgKlxuICAgKiBAZmlyZXMgUGx1Z2luI2Rpc3Bvc2VcbiAgICovXG5cblxuICBQbHVnaW4ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHZhciBuYW1lID0gdGhpcy5uYW1lLFxuICAgICAgICBwbGF5ZXIgPSB0aGlzLnBsYXllcjtcblxuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgdGhhdCBhIGFkdmFuY2VkIHBsdWdpbiBpcyBhYm91dCB0byBiZSBkaXNwb3NlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCBQbHVnaW4jZGlzcG9zZVxuICAgICAqIEB0eXBlICB7RXZlbnRUYXJnZXR+RXZlbnR9XG4gICAgICovXG5cbiAgICB0aGlzLnRyaWdnZXIoJ2Rpc3Bvc2UnKTtcbiAgICB0aGlzLm9mZigpO1xuICAgIHBsYXllci5vZmYoJ2Rpc3Bvc2UnLCB0aGlzLmRpc3Bvc2UpO1xuXG4gICAgLy8gRWxpbWluYXRlIGFueSBwb3NzaWJsZSBzb3VyY2VzIG9mIGxlYWtpbmcgbWVtb3J5IGJ5IGNsZWFyaW5nIHVwXG4gICAgLy8gcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwbGF5ZXIgYW5kIHRoZSBwbHVnaW4gaW5zdGFuY2UgYW5kIG51bGxpbmcgb3V0XG4gICAgLy8gdGhlIHBsdWdpbidzIHN0YXRlIGFuZCByZXBsYWNpbmcgbWV0aG9kcyB3aXRoIGEgZnVuY3Rpb24gdGhhdCB0aHJvd3MuXG4gICAgcGxheWVyW1BMVUdJTl9DQUNIRV9LRVldW25hbWVdID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5ZXIgPSB0aGlzLnN0YXRlID0gbnVsbDtcblxuICAgIC8vIEZpbmFsbHksIHJlcGxhY2UgdGhlIHBsdWdpbiBuYW1lIG9uIHRoZSBwbGF5ZXIgd2l0aCBhIG5ldyBmYWN0b3J5XG4gICAgLy8gZnVuY3Rpb24sIHNvIHRoYXQgdGhlIHBsdWdpbiBpcyByZWFkeSB0byBiZSBzZXQgdXAgYWdhaW4uXG4gICAgcGxheWVyW25hbWVdID0gY3JlYXRlUGx1Z2luRmFjdG9yeShuYW1lLCBwbHVnaW5TdG9yYWdlW25hbWVdKTtcbiAgfTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIHBsdWdpbiBpcyBhIGJhc2ljIHBsdWdpbiAoaS5lLiBub3QgYSBzdWItY2xhc3Mgb2YgYFBsdWdpbmApLlxuICAgKlxuICAgKiBAcGFyYW0gICB7c3RyaW5nfEZ1bmN0aW9ufSBwbHVnaW5cbiAgICogICAgICAgICAgSWYgYSBzdHJpbmcsIG1hdGNoZXMgdGhlIG5hbWUgb2YgYSBwbHVnaW4uIElmIGEgZnVuY3Rpb24sIHdpbGwgYmVcbiAgICogICAgICAgICAgdGVzdGVkIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICogICAgICAgICAgV2hldGhlciBvciBub3QgYSBwbHVnaW4gaXMgYSBiYXNpYyBwbHVnaW4uXG4gICAqL1xuXG5cbiAgUGx1Z2luLmlzQmFzaWMgPSBmdW5jdGlvbiBpc0Jhc2ljKHBsdWdpbikge1xuICAgIHZhciBwID0gdHlwZW9mIHBsdWdpbiA9PT0gJ3N0cmluZycgPyBnZXRQbHVnaW4ocGx1Z2luKSA6IHBsdWdpbjtcblxuICAgIHJldHVybiB0eXBlb2YgcCA9PT0gJ2Z1bmN0aW9uJyAmJiAhUGx1Z2luLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHAucHJvdG90eXBlKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBWaWRlby5qcyBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAgICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0byBiZSByZWdpc3RlcmVkLiBNdXN0IGJlIGEgc3RyaW5nIGFuZFxuICAgKiAgICAgICAgICBtdXN0IG5vdCBtYXRjaCBhbiBleGlzdGluZyBwbHVnaW4gb3IgYSBtZXRob2Qgb24gdGhlIGBQbGF5ZXJgXG4gICAqICAgICAgICAgIHByb3RvdHlwZS5cbiAgICpcbiAgICogQHBhcmFtICAge0Z1bmN0aW9ufSBwbHVnaW5cbiAgICogICAgICAgICAgQSBzdWItY2xhc3Mgb2YgYFBsdWdpbmAgb3IgYSBmdW5jdGlvbiBmb3IgYmFzaWMgcGx1Z2lucy5cbiAgICpcbiAgICogQHJldHVybnMge0Z1bmN0aW9ufVxuICAgKiAgICAgICAgICBGb3IgYWR2YW5jZWQgcGx1Z2lucywgYSBmYWN0b3J5IGZ1bmN0aW9uIGZvciB0aGF0IHBsdWdpbi4gRm9yXG4gICAqICAgICAgICAgIGJhc2ljIHBsdWdpbnMsIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBwbHVnaW4uXG4gICAqL1xuXG5cbiAgUGx1Z2luLnJlZ2lzdGVyUGx1Z2luID0gZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW4obmFtZSwgcGx1Z2luKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIHBsdWdpbiBuYW1lLCBcIicgKyBuYW1lICsgJ1wiLCBtdXN0IGJlIGEgc3RyaW5nLCB3YXMgJyArICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmFtZSkpICsgJy4nKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luRXhpc3RzKG5hbWUpKSB7XG4gICAgICBsb2ckMS53YXJuKCdBIHBsdWdpbiBuYW1lZCBcIicgKyBuYW1lICsgJ1wiIGFscmVhZHkgZXhpc3RzLiBZb3UgbWF5IHdhbnQgdG8gYXZvaWQgcmUtcmVnaXN0ZXJpbmcgcGx1Z2lucyEnKTtcbiAgICB9IGVsc2UgaWYgKFBsYXllci5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBwbHVnaW4gbmFtZSwgXCInICsgbmFtZSArICdcIiwgY2Fubm90IHNoYXJlIGEgbmFtZSB3aXRoIGFuIGV4aXN0aW5nIHBsYXllciBtZXRob2QhJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwbHVnaW4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBwbHVnaW4gZm9yIFwiJyArIG5hbWUgKyAnXCIsIG11c3QgYmUgYSBmdW5jdGlvbiwgd2FzICcgKyAodHlwZW9mIHBsdWdpbiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YocGx1Z2luKSkgKyAnLicpO1xuICAgIH1cblxuICAgIHBsdWdpblN0b3JhZ2VbbmFtZV0gPSBwbHVnaW47XG5cbiAgICAvLyBBZGQgYSBwbGF5ZXIgcHJvdG90eXBlIG1ldGhvZCBmb3IgYWxsIHN1Yi1jbGFzc2VkIHBsdWdpbnMgKGJ1dCBub3QgZm9yXG4gICAgLy8gdGhlIGJhc2UgUGx1Z2luIGNsYXNzKS5cbiAgICBpZiAobmFtZSAhPT0gQkFTRV9QTFVHSU5fTkFNRSkge1xuICAgICAgaWYgKFBsdWdpbi5pc0Jhc2ljKHBsdWdpbikpIHtcbiAgICAgICAgUGxheWVyLnByb3RvdHlwZVtuYW1lXSA9IGNyZWF0ZUJhc2ljUGx1Z2luKG5hbWUsIHBsdWdpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBQbGF5ZXIucHJvdG90eXBlW25hbWVdID0gY3JlYXRlUGx1Z2luRmFjdG9yeShuYW1lLCBwbHVnaW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwbHVnaW47XG4gIH07XG5cbiAgLyoqXG4gICAqIERlLXJlZ2lzdGVyIGEgVmlkZW8uanMgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0byBiZSBkZXJlZ2lzdGVyZWQuXG4gICAqL1xuXG5cbiAgUGx1Z2luLmRlcmVnaXN0ZXJQbHVnaW4gPSBmdW5jdGlvbiBkZXJlZ2lzdGVyUGx1Z2luKG5hbWUpIHtcbiAgICBpZiAobmFtZSA9PT0gQkFTRV9QTFVHSU5fTkFNRSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGUtcmVnaXN0ZXIgYmFzZSBwbHVnaW4uJyk7XG4gICAgfVxuICAgIGlmIChwbHVnaW5FeGlzdHMobmFtZSkpIHtcbiAgICAgIGRlbGV0ZSBwbHVnaW5TdG9yYWdlW25hbWVdO1xuICAgICAgZGVsZXRlIFBsYXllci5wcm90b3R5cGVbbmFtZV07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGFuIG9iamVjdCBjb250YWluaW5nIG11bHRpcGxlIFZpZGVvLmpzIHBsdWdpbnMuXG4gICAqXG4gICAqIEBwYXJhbSAgIHtBcnJheX0gW25hbWVzXVxuICAgKiAgICAgICAgICBJZiBwcm92aWRlZCwgc2hvdWxkIGJlIGFuIGFycmF5IG9mIHBsdWdpbiBuYW1lcy4gRGVmYXVsdHMgdG8gX2FsbF9cbiAgICogICAgICAgICAgcGx1Z2luIG5hbWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fHVuZGVmaW5lZH1cbiAgICogICAgICAgICAgQW4gb2JqZWN0IGNvbnRhaW5pbmcgcGx1Z2luKHMpIGFzc29jaWF0ZWQgd2l0aCB0aGVpciBuYW1lKHMpIG9yXG4gICAqICAgICAgICAgIGB1bmRlZmluZWRgIGlmIG5vIG1hdGNoaW5nIHBsdWdpbnMgZXhpc3QpLlxuICAgKi9cblxuXG4gIFBsdWdpbi5nZXRQbHVnaW5zID0gZnVuY3Rpb24gZ2V0UGx1Z2lucygpIHtcbiAgICB2YXIgbmFtZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IE9iamVjdC5rZXlzKHBsdWdpblN0b3JhZ2UpO1xuXG4gICAgdmFyIHJlc3VsdCA9IHZvaWQgMDtcblxuICAgIG5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBwbHVnaW4gPSBnZXRQbHVnaW4obmFtZSk7XG5cbiAgICAgIGlmIChwbHVnaW4pIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgICByZXN1bHRbbmFtZV0gPSBwbHVnaW47XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgcGx1Z2luJ3MgdmVyc2lvbiwgaWYgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAgICogICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqICAgICAgICAgIFRoZSBwbHVnaW4ncyB2ZXJzaW9uIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAgICovXG5cblxuICBQbHVnaW4uZ2V0UGx1Z2luVmVyc2lvbiA9IGZ1bmN0aW9uIGdldFBsdWdpblZlcnNpb24obmFtZSkge1xuICAgIHZhciBwbHVnaW4gPSBnZXRQbHVnaW4obmFtZSk7XG5cbiAgICByZXR1cm4gcGx1Z2luICYmIHBsdWdpbi5WRVJTSU9OIHx8ICcnO1xuICB9O1xuXG4gIHJldHVybiBQbHVnaW47XG59KCk7XG5cbi8qKlxuICogR2V0cyBhIHBsdWdpbiBieSBuYW1lIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWV0aG9kICAgZ2V0UGx1Z2luXG4gKiBAbWVtYmVyT2YgUGx1Z2luXG4gKiBAcGFyYW0gICAge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLlxuICpcbiAqIEByZXR1cm5zICB7RnVuY3Rpb258dW5kZWZpbmVkfVxuICogICAgICAgICAgIFRoZSBwbHVnaW4gKG9yIGB1bmRlZmluZWRgKS5cbiAqL1xuXG5cblBsdWdpbi5nZXRQbHVnaW4gPSBnZXRQbHVnaW47XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGJhc2UgcGx1Z2luIGNsYXNzIGFzIGl0IGlzIHJlZ2lzdGVyZWQuXG4gKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuUGx1Z2luLkJBU0VfUExVR0lOX05BTUUgPSBCQVNFX1BMVUdJTl9OQU1FO1xuXG5QbHVnaW4ucmVnaXN0ZXJQbHVnaW4oQkFTRV9QTFVHSU5fTkFNRSwgUGx1Z2luKTtcblxuLyoqXG4gKiBEb2N1bWVudGVkIGluIHBsYXllci5qc1xuICpcbiAqIEBpZ25vcmVcbiAqL1xuUGxheWVyLnByb3RvdHlwZS51c2luZ1BsdWdpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAhIXRoaXNbUExVR0lOX0NBQ0hFX0tFWV0gJiYgdGhpc1tQTFVHSU5fQ0FDSEVfS0VZXVtuYW1lXSA9PT0gdHJ1ZTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnRlZCBpbiBwbGF5ZXIuanNcbiAqXG4gKiBAaWdub3JlXG4gKi9cblBsYXllci5wcm90b3R5cGUuaGFzUGx1Z2luID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuICEhcGx1Z2luRXhpc3RzKG5hbWUpO1xufTtcblxuLyoqXG4gKiBTaWduYWxzIHRoYXQgYSBwbHVnaW4gaXMgYWJvdXQgdG8gYmUgc2V0IHVwIG9uIGEgcGxheWVyLlxuICpcbiAqIEBldmVudCAgICBQbGF5ZXIjYmVmb3JlcGx1Z2luc2V0dXBcbiAqIEB0eXBlICAgICB7UGx1Z2luflBsdWdpbkV2ZW50SGFzaH1cbiAqL1xuXG4vKipcbiAqIFNpZ25hbHMgdGhhdCBhIHBsdWdpbiBpcyBhYm91dCB0byBiZSBzZXQgdXAgb24gYSBwbGF5ZXIgLSBieSBuYW1lLiBUaGUgbmFtZVxuICogaXMgdGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5cbiAqXG4gKiBAZXZlbnQgICAgUGxheWVyI2JlZm9yZXBsdWdpbnNldHVwOiRuYW1lXG4gKiBAdHlwZSAgICAge1BsdWdpbn5QbHVnaW5FdmVudEhhc2h9XG4gKi9cblxuLyoqXG4gKiBTaWduYWxzIHRoYXQgYSBwbHVnaW4gaGFzIGp1c3QgYmVlbiBzZXQgdXAgb24gYSBwbGF5ZXIuXG4gKlxuICogQGV2ZW50ICAgIFBsYXllciNwbHVnaW5zZXR1cFxuICogQHR5cGUgICAgIHtQbHVnaW5+UGx1Z2luRXZlbnRIYXNofVxuICovXG5cbi8qKlxuICogU2lnbmFscyB0aGF0IGEgcGx1Z2luIGhhcyBqdXN0IGJlZW4gc2V0IHVwIG9uIGEgcGxheWVyIC0gYnkgbmFtZS4gVGhlIG5hbWVcbiAqIGlzIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4uXG4gKlxuICogQGV2ZW50ICAgIFBsYXllciNwbHVnaW5zZXR1cDokbmFtZVxuICogQHR5cGUgICAgIHtQbHVnaW5+UGx1Z2luRXZlbnRIYXNofVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgIHtPYmplY3R9IFBsdWdpbn5QbHVnaW5FdmVudEhhc2hcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFuY2VcbiAqICAgICAgICAgICBGb3IgYmFzaWMgcGx1Z2lucywgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcGx1Z2luIGZ1bmN0aW9uLiBGb3JcbiAqICAgICAgICAgICBhZHZhbmNlZCBwbHVnaW5zLCB0aGUgcGx1Z2luIGluc3RhbmNlIG9uIHdoaWNoIHRoZSBldmVudCBpcyBmaXJlZC5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4uXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsdWdpblxuICogICAgICAgICAgIEZvciBiYXNpYyBwbHVnaW5zLCB0aGUgcGx1Z2luIGZ1bmN0aW9uLiBGb3IgYWR2YW5jZWQgcGx1Z2lucywgdGhlXG4gKiAgICAgICAgICAgcGx1Z2luIGNsYXNzL2NvbnN0cnVjdG9yLlxuICovXG5cbi8qKlxuICogQGZpbGUgZXh0ZW5kLmpzXG4gKiBAbW9kdWxlIGV4dGVuZFxuICovXG5cbi8qKlxuICogQSBjb21iaW5hdGlvbiBvZiBub2RlIGluaGVyaXRzIGFuZCBiYWJlbCdzIGluaGVyaXRzIChhZnRlciB0cmFuc3BpbGUpLlxuICogQm90aCB3b3JrIHRoZSBzYW1lIGJ1dCBub2RlIGFkZHMgYHN1cGVyX2AgdG8gdGhlIHN1YkNsYXNzXG4gKiBhbmQgQmFibGUgYWRkcyB0aGUgc3VwZXJDbGFzcyBhcyBfX3Byb3RvX18uIEJvdGggc2VlbSB1c2VmdWwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN1YkNsYXNzXG4gKiAgICAgICAgVGhlIGNsYXNzIHRvIGluaGVyaXQgdG9cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3VwZXJDbGFzc1xuICogICAgICAgIFRoZSBjbGFzcyB0byBpbmhlcml0IGZyb21cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgX2luaGVyaXRzID0gZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgKHR5cGVvZiBzdXBlckNsYXNzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihzdXBlckNsYXNzKSkpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChzdXBlckNsYXNzKSB7XG4gICAgLy8gbm9kZVxuICAgIHN1YkNsYXNzLnN1cGVyXyA9IHN1cGVyQ2xhc3M7XG4gIH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gZm9yIHN1YmNsYXNzaW5nIHVzaW5nIHRoZSBzYW1lIGluaGVyaXRhbmNlIHRoYXRcbiAqIHZpZGVvanMgdXNlcyBpbnRlcm5hbGx5XG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN1cGVyQ2xhc3NcbiAqICAgICAgICBUaGUgY2xhc3MgdG8gaW5oZXJpdCBmcm9tXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtzdWJDbGFzc01ldGhvZHM9e31dXG4gKiAgICAgICAgVGhlIGNsYXNzIHRvIGluaGVyaXQgdG9cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiAgICAgICAgIFRoZSBuZXcgb2JqZWN0IHdpdGggc3ViQ2xhc3NNZXRob2RzIHRoYXQgaW5oZXJpdGVkIHN1cGVyQ2xhc3MuXG4gKi9cbnZhciBleHRlbmRGbiA9IGZ1bmN0aW9uIGV4dGVuZEZuKHN1cGVyQ2xhc3MpIHtcbiAgdmFyIHN1YkNsYXNzTWV0aG9kcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgdmFyIHN1YkNsYXNzID0gZnVuY3Rpb24gc3ViQ2xhc3MoKSB7XG4gICAgc3VwZXJDbGFzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHZhciBtZXRob2RzID0ge307XG5cbiAgaWYgKCh0eXBlb2Ygc3ViQ2xhc3NNZXRob2RzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihzdWJDbGFzc01ldGhvZHMpKSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoc3ViQ2xhc3NNZXRob2RzLmNvbnN0cnVjdG9yICE9PSBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzdWJDbGFzcyA9IHN1YkNsYXNzTWV0aG9kcy5jb25zdHJ1Y3RvcjtcbiAgICB9XG4gICAgbWV0aG9kcyA9IHN1YkNsYXNzTWV0aG9kcztcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3ViQ2xhc3NNZXRob2RzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3ViQ2xhc3MgPSBzdWJDbGFzc01ldGhvZHM7XG4gIH1cblxuICBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xuXG4gIC8vIEV4dGVuZCBzdWJPYmoncyBwcm90b3R5cGUgd2l0aCBmdW5jdGlvbnMgYW5kIG90aGVyIHByb3BlcnRpZXMgZnJvbSBwcm9wc1xuICBmb3IgKHZhciBuYW1lIGluIG1ldGhvZHMpIHtcbiAgICBpZiAobWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgc3ViQ2xhc3MucHJvdG90eXBlW25hbWVdID0gbWV0aG9kc1tuYW1lXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ViQ2xhc3M7XG59O1xuXG4vKipcbiAqIEBmaWxlIHZpZGVvLmpzXG4gKiBAbW9kdWxlIHZpZGVvanNcbiAqL1xuLy8gSW5jbHVkZSB0aGUgYnVpbHQtaW4gdGVjaHNcbi8vIEhUTUw1IEVsZW1lbnQgU2hpbSBmb3IgSUU4XG5pZiAodHlwZW9mIEhUTUxWaWRlb0VsZW1lbnQgPT09ICd1bmRlZmluZWQnICYmIGlzUmVhbCgpKSB7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2F1ZGlvJyk7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyYWNrJyk7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvLWpzJyk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGBpZGAgdmFsdWUgYnkgdHJpbW1pbmcgb2ZmIGEgbGVhZGluZyBgI2BcbiAqXG4gKiBAcGFyYW0gICB7c3RyaW5nfSBpZFxuICogICAgICAgICAgQSBzdHJpbmcsIG1heWJlIHdpdGggYSBsZWFkaW5nIGAjYC5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICogICAgICAgICAgVGhlIHN0cmluZywgd2l0aG91dCBhbnkgbGVhZGluZyBgI2AuXG4gKi9cbnZhciBub3JtYWxpemVJZCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUlkKGlkKSB7XG4gIHJldHVybiBpZC5pbmRleE9mKCcjJykgPT09IDAgPyBpZC5zbGljZSgxKSA6IGlkO1xufTtcblxuLyoqXG4gKiBEb3VibGVzIGFzIHRoZSBtYWluIGZ1bmN0aW9uIGZvciB1c2VycyB0byBjcmVhdGUgYSBwbGF5ZXIgaW5zdGFuY2UgYW5kIGFsc29cbiAqIHRoZSBtYWluIGxpYnJhcnkgb2JqZWN0LlxuICogVGhlIGB2aWRlb2pzYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIG9yIHJldHJpZXZlIGEgcGxheWVyLlxuICAqXG4gKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSBpZFxuICogICAgICAgIFZpZGVvIGVsZW1lbnQgb3IgdmlkZW8gZWxlbWVudCBJRFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgICAgICBPcHRpb25hbCBvcHRpb25zIG9iamVjdCBmb3IgY29uZmlnL3NldHRpbmdzXG4gKlxuICogQHBhcmFtIHtDb21wb25lbnR+UmVhZHlDYWxsYmFja30gW3JlYWR5XVxuICogICAgICAgIE9wdGlvbmFsIHJlYWR5IGNhbGxiYWNrXG4gKlxuICogQHJldHVybiB7UGxheWVyfVxuICogICAgICAgICBBIHBsYXllciBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiB2aWRlb2pzKGlkLCBvcHRpb25zLCByZWFkeSkge1xuICB2YXIgcGxheWVyID0gdmlkZW9qcy5nZXRQbGF5ZXIoaWQpO1xuXG4gIGlmIChwbGF5ZXIpIHtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgbG9nJDEud2FybignUGxheWVyIFwiJyArIGlkICsgJ1wiIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQuIE9wdGlvbnMgd2lsbCBub3QgYmUgYXBwbGllZC4nKTtcbiAgICB9XG4gICAgaWYgKHJlYWR5KSB7XG4gICAgICBwbGF5ZXIucmVhZHkocmVhZHkpO1xuICAgIH1cbiAgICByZXR1cm4gcGxheWVyO1xuICB9XG5cbiAgdmFyIGVsID0gdHlwZW9mIGlkID09PSAnc3RyaW5nJyA/ICQoJyMnICsgbm9ybWFsaXplSWQoaWQpKSA6IGlkO1xuXG4gIGlmICghaXNFbChlbCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZWxlbWVudCBvciBJRCBzdXBwbGllZCBpcyBub3QgdmFsaWQuICh2aWRlb2pzKScpO1xuICB9XG5cbiAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKSkge1xuICAgIGxvZyQxLndhcm4oJ1RoZSBlbGVtZW50IHN1cHBsaWVkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgRE9NJyk7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICB2aWRlb2pzLmhvb2tzKCdiZWZvcmVzZXR1cCcpLmZvckVhY2goZnVuY3Rpb24gKGhvb2tGdW5jdGlvbikge1xuICAgIHZhciBvcHRzID0gaG9va0Z1bmN0aW9uKGVsLCBtZXJnZU9wdGlvbnMob3B0aW9ucykpO1xuXG4gICAgaWYgKCFpc09iamVjdChvcHRzKSB8fCBBcnJheS5pc0FycmF5KG9wdHMpKSB7XG4gICAgICBsb2ckMS5lcnJvcigncGxlYXNlIHJldHVybiBhbiBvYmplY3QgaW4gYmVmb3Jlc2V0dXAgaG9va3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIG9wdHMpO1xuICB9KTtcblxuICAvLyBXZSBnZXQgdGhlIGN1cnJlbnQgXCJQbGF5ZXJcIiBjb21wb25lbnQgaGVyZSBpbiBjYXNlIGFuIGludGVncmF0aW9uIGhhc1xuICAvLyByZXBsYWNlZCBpdCB3aXRoIGEgY3VzdG9tIHBsYXllci5cbiAgdmFyIFBsYXllckNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoJ1BsYXllcicpO1xuXG4gIHBsYXllciA9IG5ldyBQbGF5ZXJDb21wb25lbnQoZWwsIG9wdGlvbnMsIHJlYWR5KTtcblxuICB2aWRlb2pzLmhvb2tzKCdzZXR1cCcpLmZvckVhY2goZnVuY3Rpb24gKGhvb2tGdW5jdGlvbikge1xuICAgIHJldHVybiBob29rRnVuY3Rpb24ocGxheWVyKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHBsYXllcjtcbn1cblxuLyoqXG4gKiBBbiBPYmplY3QgdGhhdCBjb250YWlucyBsaWZlY3ljbGUgaG9va3MgYXMga2V5cyB3aGljaCBwb2ludCB0byBhbiBhcnJheVxuICogb2YgZnVuY3Rpb25zIHRoYXQgYXJlIHJ1biB3aGVuIGEgbGlmZWN5Y2xlIGlzIHRyaWdnZXJlZFxuICovXG52aWRlb2pzLmhvb2tzXyA9IHt9O1xuXG4vKipcbiAqIEdldCBhIGxpc3Qgb2YgaG9va3MgZm9yIGEgc3BlY2lmaWMgbGlmZWN5Y2xlXG4gKiBAZnVuY3Rpb24gdmlkZW9qcy5ob29rc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiAgICAgICAgdGhlIGxpZmVjeWxlIHRvIGdldCBob29rcyBmcm9tXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxGdW5jdGlvbltdfSBbZm5dXG4gKiAgICAgICAgT3B0aW9uYWxseSBhZGQgYSBob29rIChvciBob29rcykgdG8gdGhlIGxpZmVjeWNsZSB0aGF0IHlvdXIgYXJlIGdldHRpbmcuXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKiAgICAgICAgIGFuIGFycmF5IG9mIGhvb2tzLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm9uZS5cbiAqL1xudmlkZW9qcy5ob29rcyA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICB2aWRlb2pzLmhvb2tzX1t0eXBlXSA9IHZpZGVvanMuaG9va3NfW3R5cGVdIHx8IFtdO1xuICBpZiAoZm4pIHtcbiAgICB2aWRlb2pzLmhvb2tzX1t0eXBlXSA9IHZpZGVvanMuaG9va3NfW3R5cGVdLmNvbmNhdChmbik7XG4gIH1cbiAgcmV0dXJuIHZpZGVvanMuaG9va3NfW3R5cGVdO1xufTtcblxuLyoqXG4gKiBBZGQgYSBmdW5jdGlvbiBob29rIHRvIGEgc3BlY2lmaWMgdmlkZW9qcyBsaWZlY3ljbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICB0aGUgbGlmZWN5Y2xlIHRvIGhvb2sgdGhlIGZ1bmN0aW9uIHRvLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258RnVuY3Rpb25bXX1cbiAqICAgICAgICBUaGUgZnVuY3Rpb24gb3IgYXJyYXkgb2YgZnVuY3Rpb25zIHRvIGF0dGFjaC5cbiAqL1xudmlkZW9qcy5ob29rID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7XG4gIHZpZGVvanMuaG9va3ModHlwZSwgZm4pO1xufTtcblxuLyoqXG4gKiBBZGQgYSBmdW5jdGlvbiBob29rIHRoYXQgd2lsbCBvbmx5IHJ1biBvbmNlIHRvIGEgc3BlY2lmaWMgdmlkZW9qcyBsaWZlY3ljbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqICAgICAgICB0aGUgbGlmZWN5Y2xlIHRvIGhvb2sgdGhlIGZ1bmN0aW9uIHRvLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258RnVuY3Rpb25bXX1cbiAqICAgICAgICBUaGUgZnVuY3Rpb24gb3IgYXJyYXkgb2YgZnVuY3Rpb25zIHRvIGF0dGFjaC5cbiAqL1xudmlkZW9qcy5ob29rT25jZSA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICB2aWRlb2pzLmhvb2tzKHR5cGUsIFtdLmNvbmNhdChmbikubWFwKGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgIHZhciB3cmFwcGVyID0gZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgIHZpZGVvanMucmVtb3ZlSG9vayh0eXBlLCB3cmFwcGVyKTtcbiAgICAgIHJldHVybiBvcmlnaW5hbC5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIHJldHVybiB3cmFwcGVyO1xuICB9KSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIGhvb2sgZnJvbSBhIHNwZWNpZmljIHZpZGVvanMgbGlmZWN5Y2xlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiAgICAgICAgdGhlIGxpZmVjeWNsZSB0aGF0IHRoZSBmdW5jdGlvbiBob29rZWQgdG9cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogICAgICAgIFRoZSBob29rZWQgZnVuY3Rpb24gdG8gcmVtb3ZlXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqICAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgd2FzIHJlbW92ZWQgb3IgdW5kZWZcbiAqL1xudmlkZW9qcy5yZW1vdmVIb29rID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7XG4gIHZhciBpbmRleCA9IHZpZGVvanMuaG9va3ModHlwZSkuaW5kZXhPZihmbik7XG5cbiAgaWYgKGluZGV4IDw9IC0xKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmlkZW9qcy5ob29rc19bdHlwZV0gPSB2aWRlb2pzLmhvb2tzX1t0eXBlXS5zbGljZSgpO1xuICB2aWRlb2pzLmhvb2tzX1t0eXBlXS5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gQWRkIGRlZmF1bHQgc3R5bGVzXG5pZiAod2luZG93LlZJREVPSlNfTk9fRFlOQU1JQ19TVFlMRSAhPT0gdHJ1ZSAmJiBpc1JlYWwoKSkge1xuICB2YXIgc3R5bGUgPSAkKCcudmpzLXN0eWxlcy1kZWZhdWx0cycpO1xuXG4gIGlmICghc3R5bGUpIHtcbiAgICBzdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudCgndmpzLXN0eWxlcy1kZWZhdWx0cycpO1xuICAgIHZhciBoZWFkID0gJCgnaGVhZCcpO1xuXG4gICAgaWYgKGhlYWQpIHtcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBoZWFkLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzZXRUZXh0Q29udGVudChzdHlsZSwgJ1xcbiAgICAgIC52aWRlby1qcyB7XFxuICAgICAgICB3aWR0aDogMzAwcHg7XFxuICAgICAgICBoZWlnaHQ6IDE1MHB4O1xcbiAgICAgIH1cXG5cXG4gICAgICAudmpzLWZsdWlkIHtcXG4gICAgICAgIHBhZGRpbmctdG9wOiA1Ni4yNSVcXG4gICAgICB9XFxuICAgICcpO1xuICB9XG59XG5cbi8vIFJ1biBBdXRvLWxvYWQgcGxheWVyc1xuLy8gWW91IGhhdmUgdG8gd2FpdCBhdCBsZWFzdCBvbmNlIGluIGNhc2UgdGhpcyBzY3JpcHQgaXMgbG9hZGVkIGFmdGVyIHlvdXJcbi8vIHZpZGVvIGluIHRoZSBET00gKHdlaXJkIGJlaGF2aW9yIG9ubHkgd2l0aCBtaW5pZmllZCB2ZXJzaW9uKVxuYXV0b1NldHVwVGltZW91dCgxLCB2aWRlb2pzKTtcblxuLyoqXG4gKiBDdXJyZW50IHNvZnR3YXJlIHZlcnNpb24uIEZvbGxvd3Mgc2VtdmVyLlxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbnZpZGVvanMuVkVSU0lPTiA9IHZlcnNpb247XG5cbi8qKlxuICogVGhlIGdsb2JhbCBvcHRpb25zIG9iamVjdC4gVGhlc2UgYXJlIHRoZSBzZXR0aW5ncyB0aGF0IHRha2UgZWZmZWN0XG4gKiBpZiBubyBvdmVycmlkZXMgYXJlIHNwZWNpZmllZCB3aGVuIHRoZSBwbGF5ZXIgaXMgY3JlYXRlZC5cbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG52aWRlb2pzLm9wdGlvbnMgPSBQbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfO1xuXG4vKipcbiAqIEdldCBhbiBvYmplY3Qgd2l0aCB0aGUgY3VycmVudGx5IGNyZWF0ZWQgcGxheWVycywga2V5ZWQgYnkgcGxheWVyIElEXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogICAgICAgICBUaGUgY3JlYXRlZCBwbGF5ZXJzXG4gKi9cbnZpZGVvanMuZ2V0UGxheWVycyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFBsYXllci5wbGF5ZXJzO1xufTtcblxuLyoqXG4gKiBHZXQgYSBzaW5nbGUgcGxheWVyIGJhc2VkIG9uIGFuIElEIG9yIERPTSBlbGVtZW50LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNoZWNrIGlmIGFuIGVsZW1lbnQgb3IgSUQgaGFzIGFuIGFzc29jaWF0ZWRcbiAqIFZpZGVvLmpzIHBsYXllciwgYnV0IG5vdCBjcmVhdGUgb25lIGlmIGl0IGRvZXNuJ3QuXG4gKlxuICogQHBhcmFtICAge3N0cmluZ3xFbGVtZW50fSBpZFxuICogICAgICAgICAgQW4gSFRNTCBlbGVtZW50IC0gYDx2aWRlbz5gLCBgPGF1ZGlvPmAsIG9yIGA8dmlkZW8tanM+YCAtXG4gKiAgICAgICAgICBvciBhIHN0cmluZyBtYXRjaGluZyB0aGUgYGlkYCBvZiBzdWNoIGFuIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMge1BsYXllcnx1bmRlZmluZWR9XG4gKiAgICAgICAgICBBIHBsYXllciBpbnN0YW5jZSBvciBgdW5kZWZpbmVkYCBpZiB0aGVyZSBpcyBubyBwbGF5ZXIgaW5zdGFuY2VcbiAqICAgICAgICAgIG1hdGNoaW5nIHRoZSBhcmd1bWVudC5cbiAqL1xudmlkZW9qcy5nZXRQbGF5ZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgdmFyIHBsYXllcnMgPSBQbGF5ZXIucGxheWVycztcbiAgdmFyIHRhZyA9IHZvaWQgMDtcblxuICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgIHZhciBuSWQgPSBub3JtYWxpemVJZChpZCk7XG4gICAgdmFyIHBsYXllciA9IHBsYXllcnNbbklkXTtcblxuICAgIGlmIChwbGF5ZXIpIHtcbiAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuXG4gICAgdGFnID0gJCgnIycgKyBuSWQpO1xuICB9IGVsc2Uge1xuICAgIHRhZyA9IGlkO1xuICB9XG5cbiAgaWYgKGlzRWwodGFnKSkge1xuICAgIHZhciBfdGFnID0gdGFnLFxuICAgICAgICBfcGxheWVyID0gX3RhZy5wbGF5ZXIsXG4gICAgICAgIHBsYXllcklkID0gX3RhZy5wbGF5ZXJJZDtcblxuICAgIC8vIEVsZW1lbnQgbWF5IGhhdmUgYSBgcGxheWVyYCBwcm9wZXJ0eSByZWZlcnJpbmcgdG8gYW4gYWxyZWFkeSBjcmVhdGVkXG4gICAgLy8gcGxheWVyIGluc3RhbmNlLiBJZiBzbywgcmV0dXJuIHRoYXQuXG5cbiAgICBpZiAoX3BsYXllciB8fCBwbGF5ZXJzW3BsYXllcklkXSkge1xuICAgICAgcmV0dXJuIF9wbGF5ZXIgfHwgcGxheWVyc1twbGF5ZXJJZF07XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGN1cnJlbnQgcGxheWVycy5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqICAgICAgICAgQW4gYXJyYXkgb2YgYWxsIHBsYXllcnMuIFRoZSBhcnJheSB3aWxsIGJlIGluIHRoZSBvcmRlciB0aGF0XG4gKiAgICAgICAgIGBPYmplY3Qua2V5c2AgcHJvdmlkZXMsIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IHZhcnkgYmV0d2VlblxuICogICAgICAgICBKYXZhU2NyaXB0IGVuZ2luZXMuXG4gKlxuICovXG52aWRlb2pzLmdldEFsbFBsYXllcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoXG5cbiAgICAvLyBEaXNwb3NlZCBwbGF5ZXJzIGxlYXZlIGEga2V5IHdpdGggYSBgbnVsbGAgdmFsdWUsIHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlXG4gICAgLy8gd2UgZmlsdGVyIHRob3NlIG91dC5cbiAgICBPYmplY3Qua2V5cyhQbGF5ZXIucGxheWVycykubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gUGxheWVyLnBsYXllcnNba107XG4gICAgfSkuZmlsdGVyKEJvb2xlYW4pXG4gICk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBwbGF5ZXJzIG9iamVjdC5cbiAqXG4gKiBAbWVtYmVyT2YgdmlkZW9qc1xuICogQHByb3BlcnR5IHtPYmplY3R9IHBsYXllcnNcbiAqL1xudmlkZW9qcy5wbGF5ZXJzID0gUGxheWVyLnBsYXllcnM7XG5cbi8qKlxuICogR2V0IGEgY29tcG9uZW50IGNsYXNzIG9iamVjdCBieSBuYW1lXG4gKlxuICogQGJvcnJvd3MgQ29tcG9uZW50LmdldENvbXBvbmVudCBhcyB2aWRlb2pzLmdldENvbXBvbmVudFxuICovXG52aWRlb2pzLmdldENvbXBvbmVudCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQ7XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBjb21wb25lbnQgc28gaXQgY2FuIHJlZmVycmVkIHRvIGJ5IG5hbWUuIFVzZWQgd2hlbiBhZGRpbmcgdG8gb3RoZXJcbiAqIGNvbXBvbmVudHMsIGVpdGhlciB0aHJvdWdoIGFkZENoaWxkIGBjb21wb25lbnQuYWRkQ2hpbGQoJ215Q29tcG9uZW50JylgIG9yIHRocm91Z2hcbiAqIGRlZmF1bHQgY2hpbGRyZW4gb3B0aW9ucyAgYHsgY2hpbGRyZW46IFsnbXlDb21wb25lbnQnXSB9YC5cbiAqXG4gKiA+IE5PVEU6IFlvdSBjb3VsZCBhbHNvIGp1c3QgaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IGJlZm9yZSBhZGRpbmcuXG4gKiBgY29tcG9uZW50LmFkZENoaWxkKG5ldyBNeUNvbXBvbmVudCgpKTtgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBcbiAqICAgICAgICBUaGUgY29tcG9uZW50IGNsYXNzXG4gKlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICogICAgICAgICBUaGUgbmV3bHkgcmVnaXN0ZXJlZCBjb21wb25lbnRcbiAqL1xudmlkZW9qcy5yZWdpc3RlckNvbXBvbmVudCA9IGZ1bmN0aW9uIChuYW1lJCQxLCBjb21wKSB7XG4gIGlmIChUZWNoLmlzVGVjaChjb21wKSkge1xuICAgIGxvZyQxLndhcm4oJ1RoZSAnICsgbmFtZSQkMSArICcgdGVjaCB3YXMgcmVnaXN0ZXJlZCBhcyBhIGNvbXBvbmVudC4gSXQgc2hvdWxkIGluc3RlYWQgYmUgcmVnaXN0ZXJlZCB1c2luZyB2aWRlb2pzLnJlZ2lzdGVyVGVjaChuYW1lLCB0ZWNoKScpO1xuICB9XG5cbiAgQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50LmNhbGwoQ29tcG9uZW50LCBuYW1lJCQxLCBjb21wKTtcbn07XG5cbi8qKlxuICogR2V0IGEgVGVjaCBjbGFzcyBvYmplY3QgYnkgbmFtZVxuICpcbiAqIEBib3Jyb3dzIFRlY2guZ2V0VGVjaCBhcyB2aWRlb2pzLmdldFRlY2hcbiAqL1xudmlkZW9qcy5nZXRUZWNoID0gVGVjaC5nZXRUZWNoO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgVGVjaCBzbyBpdCBjYW4gcmVmZXJyZWQgdG8gYnkgbmFtZS5cbiAqIFRoaXMgaXMgdXNlZCBpbiB0aGUgdGVjaCBvcmRlciBmb3IgdGhlIHBsYXllci5cbiAqXG4gKiBAYm9ycm93cyBUZWNoLnJlZ2lzdGVyVGVjaCBhcyB2aWRlb2pzLnJlZ2lzdGVyVGVjaFxuICovXG52aWRlb2pzLnJlZ2lzdGVyVGVjaCA9IFRlY2gucmVnaXN0ZXJUZWNoO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgbWlkZGxld2FyZSB0byBhIHNvdXJjZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEEgc3RyaW5nIHJlcHJlc2VudGluZyBhIE1JTUUgdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24ocGxheWVyKTpvYmplY3R9IG1pZGRsZXdhcmUgQSBtaWRkbGV3YXJlIGZhY3RvcnkgdGhhdCB0YWtlcyBhIHBsYXllci5cbiAqL1xudmlkZW9qcy51c2UgPSB1c2U7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IGEgbWlkZGxld2FyZSB0byBzaWduaWZ5XG4gKiB0aGF0IHRoZSBtaWRkbGV3YXJlIGlzIGJlaW5nIHRlcm1pbmF0ZWQuXG4gKlxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJPZiB7dmlkZW9qc31cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBtaWRkbGV3YXJlLlRFUk1JTkFUT1JcbiAqL1xuLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUgaW4gSUU4XG5pZiAoIUlTX0lFOCAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZGVvanMsICdtaWRkbGV3YXJlJywge1xuICAgIHZhbHVlOiB7fSxcbiAgICB3cml0ZWFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZGVvanMubWlkZGxld2FyZSwgJ1RFUk1JTkFUT1InLCB7XG4gICAgdmFsdWU6IFRFUk1JTkFUT1IsXG4gICAgd3JpdGVhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH0pO1xufSBlbHNlIHtcbiAgdmlkZW9qcy5taWRkbGV3YXJlID0geyBURVJNSU5BVE9SOiBURVJNSU5BVE9SIH07XG59XG5cbi8qKlxuICogQSBzdWl0ZSBvZiBicm93c2VyIGFuZCBkZXZpY2UgdGVzdHMgZnJvbSB7QGxpbmsgYnJvd3Nlcn0uXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cbnZpZGVvanMuYnJvd3NlciA9IGJyb3dzZXI7XG5cbi8qKlxuICogV2hldGhlciBvciBub3QgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdG91Y2ggZXZlbnRzLiBJbmNsdWRlZCBmb3IgYmFja3dhcmRcbiAqIGNvbXBhdGliaWxpdHkgd2l0aCA0LngsIGJ1dCBkZXByZWNhdGVkLiBVc2UgYHZpZGVvanMuYnJvd3Nlci5UT1VDSF9FTkFCTEVEYFxuICogaW5zdGVhZCBnb2luZyBmb3J3YXJkLlxuICpcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gNS4wXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqL1xudmlkZW9qcy5UT1VDSF9FTkFCTEVEID0gVE9VQ0hfRU5BQkxFRDtcblxuLyoqXG4gKiBTdWJjbGFzcyBhbiBleGlzdGluZyBjbGFzc1xuICogTWltaWNzIEVTNiBzdWJjbGFzc2luZyB3aXRoIHRoZSBgZXh0ZW5kYCBrZXl3b3JkXG4gKlxuICogQGJvcnJvd3MgZXh0ZW5kOmV4dGVuZEZuIGFzIHZpZGVvanMuZXh0ZW5kXG4gKi9cbnZpZGVvanMuZXh0ZW5kID0gZXh0ZW5kRm47XG5cbi8qKlxuICogTWVyZ2UgdHdvIG9wdGlvbnMgb2JqZWN0cyByZWN1cnNpdmVseVxuICogUGVyZm9ybXMgYSBkZWVwIG1lcmdlIGxpa2UgbG9kYXNoLm1lcmdlIGJ1dCAqKm9ubHkgbWVyZ2VzIHBsYWluIG9iamVjdHMqKlxuICogKG5vdCBhcnJheXMsIGVsZW1lbnRzLCBhbnl0aGluZyBlbHNlKVxuICogT3RoZXIgdmFsdWVzIHdpbGwgYmUgY29waWVkIGRpcmVjdGx5IGZyb20gdGhlIHNlY29uZCBvYmplY3QuXG4gKlxuICogQGJvcnJvd3MgbWVyZ2Utb3B0aW9uczptZXJnZU9wdGlvbnMgYXMgdmlkZW9qcy5tZXJnZU9wdGlvbnNcbiAqL1xudmlkZW9qcy5tZXJnZU9wdGlvbnMgPSBtZXJnZU9wdGlvbnM7XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBjb250ZXh0ICh0aGlzKSBvZiBhIGZ1bmN0aW9uXG4gKlxuICogPiBOT1RFOiBhcyBvZiB2NS4wIHdlIHJlcXVpcmUgYW4gRVM1IHNoaW0sIHNvIHlvdSBzaG91bGQgdXNlIHRoZSBuYXRpdmVcbiAqIGBmdW5jdGlvbigpIHt9LmJpbmQobmV3Q29udGV4dCk7YCBpbnN0ZWFkIG9mIHRoaXMuXG4gKlxuICogQGJvcnJvd3MgZm46YmluZCBhcyB2aWRlb2pzLmJpbmRcbiAqL1xudmlkZW9qcy5iaW5kID0gYmluZDtcblxuLyoqXG4gKiBSZWdpc3RlciBhIFZpZGVvLmpzIHBsdWdpbi5cbiAqXG4gKiBAYm9ycm93cyBwbHVnaW46cmVnaXN0ZXJQbHVnaW4gYXMgdmlkZW9qcy5yZWdpc3RlclBsdWdpblxuICogQG1ldGhvZCByZWdpc3RlclBsdWdpblxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICogICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRvIGJlIHJlZ2lzdGVyZWQuIE11c3QgYmUgYSBzdHJpbmcgYW5kXG4gKiAgICAgICAgIG11c3Qgbm90IG1hdGNoIGFuIGV4aXN0aW5nIHBsdWdpbiBvciBhIG1ldGhvZCBvbiB0aGUgYFBsYXllcmBcbiAqICAgICAgICAgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBwbHVnaW5cbiAqICAgICAgICAgQSBzdWItY2xhc3Mgb2YgYFBsdWdpbmAgb3IgYSBmdW5jdGlvbiBmb3IgYmFzaWMgcGx1Z2lucy5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqICAgICAgICAgRm9yIGFkdmFuY2VkIHBsdWdpbnMsIGEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgdGhhdCBwbHVnaW4uIEZvclxuICogICAgICAgICBiYXNpYyBwbHVnaW5zLCBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyB0aGUgcGx1Z2luLlxuICovXG52aWRlb2pzLnJlZ2lzdGVyUGx1Z2luID0gUGx1Z2luLnJlZ2lzdGVyUGx1Z2luO1xuXG4vKipcbiAqIERlcmVnaXN0ZXIgYSBWaWRlby5qcyBwbHVnaW4uXG4gKlxuICogQGJvcnJvd3MgcGx1Z2luOmRlcmVnaXN0ZXJQbHVnaW4gYXMgdmlkZW9qcy5kZXJlZ2lzdGVyUGx1Z2luXG4gKiBAbWV0aG9kIGRlcmVnaXN0ZXJQbHVnaW5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAqICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0byBiZSBkZXJlZ2lzdGVyZWQuIE11c3QgYmUgYSBzdHJpbmcgYW5kXG4gKiAgICAgICAgIG11c3QgbWF0Y2ggYW4gZXhpc3RpbmcgcGx1Z2luIG9yIGEgbWV0aG9kIG9uIHRoZSBgUGxheWVyYFxuICogICAgICAgICBwcm90b3R5cGUuXG4gKlxuICovXG52aWRlb2pzLmRlcmVnaXN0ZXJQbHVnaW4gPSBQbHVnaW4uZGVyZWdpc3RlclBsdWdpbjtcblxuLyoqXG4gKiBEZXByZWNhdGVkIG1ldGhvZCB0byByZWdpc3RlciBhIHBsdWdpbiB3aXRoIFZpZGVvLmpzXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqICAgICAgICB2aWRlb2pzLnBsdWdpbigpIGlzIGRlcHJlY2F0ZWQ7IHVzZSB2aWRlb2pzLnJlZ2lzdGVyUGx1Z2luKCkgaW5zdGVhZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiAgICAgICAgVGhlIHBsdWdpbiBuYW1lXG4gKlxuICogQHBhcmFtIHtQbHVnaW58RnVuY3Rpb259IHBsdWdpblxuICogICAgICAgICBUaGUgcGx1Z2luIHN1Yi1jbGFzcyBvciBmdW5jdGlvblxuICovXG52aWRlb2pzLnBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lJCQxLCBwbHVnaW4pIHtcbiAgbG9nJDEud2FybigndmlkZW9qcy5wbHVnaW4oKSBpcyBkZXByZWNhdGVkOyB1c2UgdmlkZW9qcy5yZWdpc3RlclBsdWdpbigpIGluc3RlYWQnKTtcbiAgcmV0dXJuIFBsdWdpbi5yZWdpc3RlclBsdWdpbihuYW1lJCQxLCBwbHVnaW4pO1xufTtcblxuLyoqXG4gKiBHZXRzIGFuIG9iamVjdCBjb250YWluaW5nIG11bHRpcGxlIFZpZGVvLmpzIHBsdWdpbnMuXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IFtuYW1lc11cbiAqICAgICAgICAgSWYgcHJvdmlkZWQsIHNob3VsZCBiZSBhbiBhcnJheSBvZiBwbHVnaW4gbmFtZXMuIERlZmF1bHRzIHRvIF9hbGxfXG4gKiAgICAgICAgIHBsdWdpbiBuYW1lcy5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfVxuICogICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBwbHVnaW4ocykgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIG5hbWUocykgb3JcbiAqICAgICAgICAgYHVuZGVmaW5lZGAgaWYgbm8gbWF0Y2hpbmcgcGx1Z2lucyBleGlzdCkuXG4gKi9cbnZpZGVvanMuZ2V0UGx1Z2lucyA9IFBsdWdpbi5nZXRQbHVnaW5zO1xuXG4vKipcbiAqIEdldHMgYSBwbHVnaW4gYnkgbmFtZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBuYW1lXG4gKiAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufHVuZGVmaW5lZH1cbiAqICAgICAgICAgVGhlIHBsdWdpbiAob3IgYHVuZGVmaW5lZGApLlxuICovXG52aWRlb2pzLmdldFBsdWdpbiA9IFBsdWdpbi5nZXRQbHVnaW47XG5cbi8qKlxuICogR2V0cyBhIHBsdWdpbidzIHZlcnNpb24sIGlmIGF2YWlsYWJsZVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICogICAgICAgICBUaGUgbmFtZSBvZiBhIHBsdWdpbi5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiAgICAgICAgIFRoZSBwbHVnaW4ncyB2ZXJzaW9uIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqL1xudmlkZW9qcy5nZXRQbHVnaW5WZXJzaW9uID0gUGx1Z2luLmdldFBsdWdpblZlcnNpb247XG5cbi8qKlxuICogQWRkaW5nIGxhbmd1YWdlcyBzbyB0aGF0IHRoZXkncmUgYXZhaWxhYmxlIHRvIGFsbCBwbGF5ZXJzLlxuICogRXhhbXBsZTogYHZpZGVvanMuYWRkTGFuZ3VhZ2UoJ2VzJywgeyAnSGVsbG8nOiAnSG9sYScgfSk7YFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gKiAgICAgICAgVGhlIGxhbmd1YWdlIGNvZGUgb3IgZGljdGlvbmFyeSBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gKiAgICAgICAgVGhlIGRhdGEgdmFsdWVzIHRvIGJlIHRyYW5zbGF0ZWRcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiAgICAgICAgIFRoZSByZXN1bHRpbmcgbGFuZ3VhZ2UgZGljdGlvbmFyeSBvYmplY3RcbiAqL1xudmlkZW9qcy5hZGRMYW5ndWFnZSA9IGZ1bmN0aW9uIChjb2RlLCBkYXRhKSB7XG4gIHZhciBfbWVyZ2VPcHRpb25zO1xuXG4gIGNvZGUgPSAoJycgKyBjb2RlKS50b0xvd2VyQ2FzZSgpO1xuXG4gIHZpZGVvanMub3B0aW9ucy5sYW5ndWFnZXMgPSBtZXJnZU9wdGlvbnModmlkZW9qcy5vcHRpb25zLmxhbmd1YWdlcywgKF9tZXJnZU9wdGlvbnMgPSB7fSwgX21lcmdlT3B0aW9uc1tjb2RlXSA9IGRhdGEsIF9tZXJnZU9wdGlvbnMpKTtcblxuICByZXR1cm4gdmlkZW9qcy5vcHRpb25zLmxhbmd1YWdlc1tjb2RlXTtcbn07XG5cbi8qKlxuICogTG9nIG1lc3NhZ2VzXG4gKlxuICogQGJvcnJvd3MgbG9nOmxvZyBhcyB2aWRlb2pzLmxvZ1xuICovXG52aWRlb2pzLmxvZyA9IGxvZyQxO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW11bGF0ZWQgVGltZVJhbmdlIG9iamVjdC5cbiAqXG4gKiBAYm9ycm93cyB0aW1lLXJhbmdlczpjcmVhdGVUaW1lUmFuZ2VzIGFzIHZpZGVvanMuY3JlYXRlVGltZVJhbmdlXG4gKi9cbi8qKlxuICogQGJvcnJvd3MgdGltZS1yYW5nZXM6Y3JlYXRlVGltZVJhbmdlcyBhcyB2aWRlb2pzLmNyZWF0ZVRpbWVSYW5nZXNcbiAqL1xudmlkZW9qcy5jcmVhdGVUaW1lUmFuZ2UgPSB2aWRlb2pzLmNyZWF0ZVRpbWVSYW5nZXMgPSBjcmVhdGVUaW1lUmFuZ2VzO1xuXG4vKipcbiAqIEZvcm1hdCBzZWNvbmRzIGFzIGEgdGltZSBzdHJpbmcsIEg6TU06U1Mgb3IgTTpTU1xuICogU3VwcGx5aW5nIGEgZ3VpZGUgKGluIHNlY29uZHMpIHdpbGwgZm9yY2UgYSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvc1xuICogdG8gY292ZXIgdGhlIGxlbmd0aCBvZiB0aGUgZ3VpZGVcbiAqXG4gKiBAYm9ycm93cyBmb3JtYXQtdGltZTpmb3JtYXRUaW1lIGFzIHZpZGVvanMuZm9ybWF0VGltZVxuICovXG52aWRlb2pzLmZvcm1hdFRpbWUgPSBmb3JtYXRUaW1lO1xuXG4vKipcbiAqIFJlcGxhY2VzIGZvcm1hdC10aW1lIHdpdGggYSBjdXN0b20gaW1wbGVtZW50YXRpb24sIHRvIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQuXG4gKlxuICogQGJvcnJvd3MgZm9ybWF0LXRpbWU6c2V0Rm9ybWF0VGltZSBhcyB2aWRlb2pzLnNldEZvcm1hdFRpbWVcbiAqXG4gKiBAbWV0aG9kIHNldEZvcm1hdFRpbWVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21GblxuICogICAgICAgIEEgY3VzdG9tIGZvcm1hdC10aW1lIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGN1cnJlbnQgdGltZSBhbmQgZ3VpZGUgKGluIHNlY29uZHMpIGFzIGFyZ3VtZW50cy5cbiAqICAgICAgICBQYXNzZWQgZm4gc2hvdWxkIHJldHVybiBhIHN0cmluZy5cbiAqL1xudmlkZW9qcy5zZXRGb3JtYXRUaW1lID0gc2V0Rm9ybWF0VGltZTtcblxuLyoqXG4gKiBSZXNldHMgZm9ybWF0LXRpbWUgdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQGJvcnJvd3MgZm9ybWF0LXRpbWU6cmVzZXRGb3JtYXRUaW1lIGFzIHZpZGVvanMucmVzZXRGb3JtYXRUaW1lXG4gKlxuICogQG1ldGhvZCByZXNldEZvcm1hdFRpbWVcbiAqL1xudmlkZW9qcy5yZXNldEZvcm1hdFRpbWUgPSByZXNldEZvcm1hdFRpbWU7XG5cbi8qKlxuICogUmVzb2x2ZSBhbmQgcGFyc2UgdGhlIGVsZW1lbnRzIG9mIGEgVVJMXG4gKlxuICogQGJvcnJvd3MgdXJsOnBhcnNlVXJsIGFzIHZpZGVvanMucGFyc2VVcmxcbiAqXG4gKi9cbnZpZGVvanMucGFyc2VVcmwgPSBwYXJzZVVybDtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVybCBwYXNzZWQgaXMgYSBjcm9zcyBkb21haW4gcmVxdWVzdCBvciBub3QuXG4gKlxuICogQGJvcnJvd3MgdXJsOmlzQ3Jvc3NPcmlnaW4gYXMgdmlkZW9qcy5pc0Nyb3NzT3JpZ2luXG4gKi9cbnZpZGVvanMuaXNDcm9zc09yaWdpbiA9IGlzQ3Jvc3NPcmlnaW47XG5cbi8qKlxuICogRXZlbnQgdGFyZ2V0IGNsYXNzLlxuICpcbiAqIEBib3Jyb3dzIEV2ZW50VGFyZ2V0IGFzIHZpZGVvanMuRXZlbnRUYXJnZXRcbiAqL1xudmlkZW9qcy5FdmVudFRhcmdldCA9IEV2ZW50VGFyZ2V0O1xuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBlbGVtZW50XG4gKiBJdCBzdG9yZXMgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaW4gYSBzZXBhcmF0ZSBjYWNoZSBvYmplY3RcbiAqIGFuZCBhZGRzIGEgZ2VuZXJpYyBoYW5kbGVyIHRvIHRoZSBlbGVtZW50J3MgZXZlbnQsXG4gKiBhbG9uZyB3aXRoIGEgdW5pcXVlIGlkIChndWlkKSB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBAYm9ycm93cyBldmVudHM6b24gYXMgdmlkZW9qcy5vblxuICovXG52aWRlb2pzLm9uID0gb247XG5cbi8qKlxuICogVHJpZ2dlciBhIGxpc3RlbmVyIG9ubHkgb25jZSBmb3IgYW4gZXZlbnRcbiAqXG4gKiBAYm9ycm93cyBldmVudHM6b25lIGFzIHZpZGVvanMub25lXG4gKi9cbnZpZGVvanMub25lID0gb25lO1xuXG4vKipcbiAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZyb20gYW4gZWxlbWVudFxuICpcbiAqIEBib3Jyb3dzIGV2ZW50czpvZmYgYXMgdmlkZW9qcy5vZmZcbiAqL1xudmlkZW9qcy5vZmYgPSBvZmY7XG5cbi8qKlxuICogVHJpZ2dlciBhbiBldmVudCBmb3IgYW4gZWxlbWVudFxuICpcbiAqIEBib3Jyb3dzIGV2ZW50czp0cmlnZ2VyIGFzIHZpZGVvanMudHJpZ2dlclxuICovXG52aWRlb2pzLnRyaWdnZXIgPSB0cmlnZ2VyO1xuXG4vKipcbiAqIEEgY3Jvc3MtYnJvd3NlciBYTUxIdHRwUmVxdWVzdCB3cmFwcGVyLiBIZXJlJ3MgYSBzaW1wbGUgZXhhbXBsZTpcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgIHNldHRpbmdzIGZvciB0aGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJuIHtYTUxIdHRwUmVxdWVzdHxYRG9tYWluUmVxdWVzdH1cbiAqICAgICAgICAgVGhlIHJlcXVlc3Qgb2JqZWN0LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1JheW5vcy94aHJcbiAqL1xudmlkZW9qcy54aHIgPSB4aHI7XG5cbi8qKlxuICogVGV4dFRyYWNrIGNsYXNzXG4gKlxuICogQGJvcnJvd3MgVGV4dFRyYWNrIGFzIHZpZGVvanMuVGV4dFRyYWNrXG4gKi9cbnZpZGVvanMuVGV4dFRyYWNrID0gVGV4dFRyYWNrO1xuXG4vKipcbiAqIGV4cG9ydCB0aGUgQXVkaW9UcmFjayBjbGFzcyBzbyB0aGF0IHNvdXJjZSBoYW5kbGVycyBjYW4gY3JlYXRlXG4gKiBBdWRpb1RyYWNrcyBhbmQgdGhlbiBhZGQgdGhlbSB0byB0aGUgcGxheWVycyBBdWRpb1RyYWNrTGlzdFxuICpcbiAqIEBib3Jyb3dzIEF1ZGlvVHJhY2sgYXMgdmlkZW9qcy5BdWRpb1RyYWNrXG4gKi9cbnZpZGVvanMuQXVkaW9UcmFjayA9IEF1ZGlvVHJhY2s7XG5cbi8qKlxuICogZXhwb3J0IHRoZSBWaWRlb1RyYWNrIGNsYXNzIHNvIHRoYXQgc291cmNlIGhhbmRsZXJzIGNhbiBjcmVhdGVcbiAqIFZpZGVvVHJhY2tzIGFuZCB0aGVuIGFkZCB0aGVtIHRvIHRoZSBwbGF5ZXJzIFZpZGVvVHJhY2tMaXN0XG4gKlxuICogQGJvcnJvd3MgVmlkZW9UcmFjayBhcyB2aWRlb2pzLlZpZGVvVHJhY2tcbiAqL1xudmlkZW9qcy5WaWRlb1RyYWNrID0gVmlkZW9UcmFjaztcblxuLyoqXG4gKiBEZXRlcm1pbmVzLCB2aWEgZHVjayB0eXBpbmcsIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgYSBET00gZWxlbWVudC5cbiAqXG4gKiBAYm9ycm93cyBkb206aXNFbCBhcyB2aWRlb2pzLmlzRWxcbiAqIEBkZXByZWNhdGVkIFVzZSB2aWRlb2pzLmRvbS5pc0VsKCkgaW5zdGVhZFxuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcywgdmlhIGR1Y2sgdHlwaW5nLCB3aGV0aGVyIG9yIG5vdCBhIHZhbHVlIGlzIGEgdGV4dCBub2RlLlxuICpcbiAqIEBib3Jyb3dzIGRvbTppc1RleHROb2RlIGFzIHZpZGVvanMuaXNUZXh0Tm9kZVxuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmlzVGV4dE5vZGUoKSBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgYW5kIGFwcGxpZXMgcHJvcGVydGllcy5cbiAqXG4gKiBAYm9ycm93cyBkb206Y3JlYXRlRWwgYXMgdmlkZW9qcy5jcmVhdGVFbFxuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmNyZWF0ZUVsKCkgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqXG4gKiBAYm9ycm93cyBkb206aGFzRWxDbGFzcyBhcyB2aWRlb2pzLmhhc0NsYXNzXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uaGFzQ2xhc3MoKSBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBBZGQgYSBDU1MgY2xhc3MgbmFtZSB0byBhbiBlbGVtZW50XG4gKlxuICogQGJvcnJvd3MgZG9tOmFkZEVsQ2xhc3MgYXMgdmlkZW9qcy5hZGRDbGFzc1xuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmFkZENsYXNzKCkgaW5zdGVhZFxuICovXG5cbi8qKlxuICogUmVtb3ZlIGEgQ1NTIGNsYXNzIG5hbWUgZnJvbSBhbiBlbGVtZW50XG4gKlxuICogQGJvcnJvd3MgZG9tOnJlbW92ZUVsQ2xhc3MgYXMgdmlkZW9qcy5yZW1vdmVDbGFzc1xuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLnJlbW92ZUNsYXNzKCkgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIGEgQ1NTIGNsYXNzIG5hbWUgb24gYW4gZWxlbWVudCBkZXBlbmRpbmcgb24gYW4gb3B0aW9uYWxcbiAqIGNvbmRpdGlvbiBvciB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiB0aGUgY2xhc3MgbmFtZS5cbiAqXG4gKiBAYm9ycm93cyBkb206dG9nZ2xlRWxDbGFzcyBhcyB2aWRlb2pzLnRvZ2dsZUNsYXNzXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20udG9nZ2xlQ2xhc3MoKSBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBBcHBseSBhdHRyaWJ1dGVzIHRvIGFuIEhUTUwgZWxlbWVudC5cbiAqXG4gKiBAYm9ycm93cyBkb206c2V0RWxBdHRyaWJ1dGVzIGFzIHZpZGVvanMuc2V0QXR0cmlidXRlXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uc2V0QXR0cmlidXRlcygpIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEdldCBhbiBlbGVtZW50J3MgYXR0cmlidXRlIHZhbHVlcywgYXMgZGVmaW5lZCBvbiB0aGUgSFRNTCB0YWdcbiAqIEF0dHJpYnV0ZXMgYXJlIG5vdCB0aGUgc2FtZSBhcyBwcm9wZXJ0aWVzLiBUaGV5J3JlIGRlZmluZWQgb24gdGhlIHRhZ1xuICogb3Igd2l0aCBzZXRBdHRyaWJ1dGUgKHdoaWNoIHNob3VsZG4ndCBiZSB1c2VkIHdpdGggSFRNTClcbiAqIFRoaXMgd2lsbCByZXR1cm4gdHJ1ZSBvciBmYWxzZSBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuICpcbiAqIEBib3Jyb3dzIGRvbTpnZXRFbEF0dHJpYnV0ZXMgYXMgdmlkZW9qcy5nZXRBdHRyaWJ1dGVzXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uZ2V0QXR0cmlidXRlcygpIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEVtcHRpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIGVsZW1lbnQuXG4gKlxuICogQGJvcnJvd3MgZG9tOmVtcHR5RWwgYXMgdmlkZW9qcy5lbXB0eUVsXG4gKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uZW1wdHlFbCgpIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW5kIGFwcGVuZHMgY29udGVudCB0byBhbiBlbGVtZW50LlxuICpcbiAqIFRoZSBjb250ZW50IGZvciBhbiBlbGVtZW50IGNhbiBiZSBwYXNzZWQgaW4gbXVsdGlwbGUgdHlwZXMgYW5kXG4gKiBjb21iaW5hdGlvbnMsIHdob3NlIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogLSBTdHJpbmdcbiAqICAgTm9ybWFsaXplZCBpbnRvIGEgdGV4dCBub2RlLlxuICpcbiAqIC0gRWxlbWVudCwgVGV4dE5vZGVcbiAqICAgUGFzc2VkIHRocm91Z2guXG4gKlxuICogLSBBcnJheVxuICogICBBIG9uZS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzLCBlbGVtZW50cywgbm9kZXMsIG9yIGZ1bmN0aW9ucyAod2hpY2hcbiAqICAgcmV0dXJuIHNpbmdsZSBzdHJpbmdzLCBlbGVtZW50cywgb3Igbm9kZXMpLlxuICpcbiAqIC0gRnVuY3Rpb25cbiAqICAgSWYgdGhlIHNvbGUgYXJndW1lbnQsIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBzdHJpbmcsIGVsZW1lbnQsXG4gKiAgIG5vZGUsIG9yIGFycmF5LlxuICpcbiAqIEBib3Jyb3dzIGRvbTphcHBlbmRDb250ZW50cyBhcyB2aWRlb2pzLmFwcGVuZENvbnRldFxuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmFwcGVuZENvbnRlbnQoKSBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuZCBpbnNlcnRzIGNvbnRlbnQgaW50byBhbiBlbGVtZW50OyB0aGlzIGlzIGlkZW50aWNhbCB0b1xuICogYGFwcGVuZENvbnRlbnQoKWAsIGV4Y2VwdCBpdCBlbXB0aWVzIHRoZSBlbGVtZW50IGZpcnN0LlxuICpcbiAqIFRoZSBjb250ZW50IGZvciBhbiBlbGVtZW50IGNhbiBiZSBwYXNzZWQgaW4gbXVsdGlwbGUgdHlwZXMgYW5kXG4gKiBjb21iaW5hdGlvbnMsIHdob3NlIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogLSBTdHJpbmdcbiAqICAgTm9ybWFsaXplZCBpbnRvIGEgdGV4dCBub2RlLlxuICpcbiAqIC0gRWxlbWVudCwgVGV4dE5vZGVcbiAqICAgUGFzc2VkIHRocm91Z2guXG4gKlxuICogLSBBcnJheVxuICogICBBIG9uZS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzLCBlbGVtZW50cywgbm9kZXMsIG9yIGZ1bmN0aW9ucyAod2hpY2hcbiAqICAgcmV0dXJuIHNpbmdsZSBzdHJpbmdzLCBlbGVtZW50cywgb3Igbm9kZXMpLlxuICpcbiAqIC0gRnVuY3Rpb25cbiAqICAgSWYgdGhlIHNvbGUgYXJndW1lbnQsIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBzdHJpbmcsIGVsZW1lbnQsXG4gKiAgIG5vZGUsIG9yIGFycmF5LlxuICpcbiAqIEBib3Jyb3dzIGRvbTppbnNlcnRDb250ZW50IGFzIHZpZGVvanMuaW5zZXJ0Q29udGVudFxuICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLmluc2VydENvbnRlbnQoKSBpbnN0ZWFkXG4gKi9cblsnaXNFbCcsICdpc1RleHROb2RlJywgJ2NyZWF0ZUVsJywgJ2hhc0NsYXNzJywgJ2FkZENsYXNzJywgJ3JlbW92ZUNsYXNzJywgJ3RvZ2dsZUNsYXNzJywgJ3NldEF0dHJpYnV0ZXMnLCAnZ2V0QXR0cmlidXRlcycsICdlbXB0eUVsJywgJ2FwcGVuZENvbnRlbnQnLCAnaW5zZXJ0Q29udGVudCddLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgdmlkZW9qc1trXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2ckMS53YXJuKCd2aWRlb2pzLicgKyBrICsgJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSB2aWRlb2pzLmRvbS4nICsgayArICcoKSBpbnN0ZWFkJyk7XG4gICAgcmV0dXJuIERvbVtrXS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9O1xufSk7XG5cbi8qKlxuICogQSBzYWZlIGdldENvbXB1dGVkU3R5bGUgd2l0aCBhbiBJRTggZmFsbGJhY2suXG4gKlxuICogVGhpcyBpcyBiZWNhdXNlIGluIEZpcmVmb3gsIGlmIHRoZSBwbGF5ZXIgaXMgbG9hZGVkIGluIGFuIGlmcmFtZSB3aXRoIGBkaXNwbGF5Om5vbmVgLFxuICogdGhlbiBgZ2V0Q29tcHV0ZWRTdHlsZWAgcmV0dXJucyBgbnVsbGAsIHNvLCB3ZSBkbyBhIG51bGwtY2hlY2sgdG8gbWFrZSBzdXJlXG4gKiB0aGF0IHRoZSBwbGF5ZXIgZG9lc24ndCBicmVhayBpbiB0aGVzZSBjYXNlcy5cbiAqIFNlZSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01NDgzOTcgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAYm9ycm93cyBjb21wdXRlZC1zdHlsZTpjb21wdXRlZFN0eWxlIGFzIHZpZGVvanMuY29tcHV0ZWRTdHlsZVxuICovXG52aWRlb2pzLmNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlO1xuXG4vKipcbiAqIEV4cG9ydCB0aGUgRG9tIHV0aWxpdGllcyBmb3IgdXNlIGluIGV4dGVybmFsIHBsdWdpbnNcbiAqIGFuZCBUZWNoJ3NcbiAqL1xudmlkZW9qcy5kb20gPSBEb207XG5cbi8qKlxuICogRXhwb3J0IHRoZSBVcmwgdXRpbGl0aWVzIGZvciB1c2UgaW4gZXh0ZXJuYWwgcGx1Z2luc1xuICogYW5kIFRlY2gnc1xuICovXG52aWRlb2pzLnVybCA9IFVybDtcblxubW9kdWxlLmV4cG9ydHMgPSB2aWRlb2pzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_video.js@6.12.1@video.js/dist/video.cjs.js\n");

/***/ }),

/***/ "./node_modules/_video.js@7.6.6@video.js/dist/video-js.css":
/*!*****************************************************************!*\
  !*** ./node_modules/_video.js@7.6.6@video.js/dist/video-js.css ***!
  \*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./video-js.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"6f2289d7\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./video-js.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\", function() {\n     var newContent = __webpack_require__(/*! !../../_css-loader@1.0.1@css-loader??ref--6-oneOf-3-1!../../_postcss-loader@3.0.0@postcss-loader/src??ref--6-oneOf-3-2!./video-js.css */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvLmpzQDcuNi42QHZpZGVvLmpzL2Rpc3QvdmlkZW8tanMuY3NzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlby5qc0A3LjYuNkB2aWRlby5qcy9kaXN0L3ZpZGVvLWpzLmNzcz9jMWRmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi92aWRlby1qcy5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI2ZjIyODlkN1wiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTEhLi4vLi4vX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS02LW9uZU9mLTMtMiEuL3ZpZGVvLWpzLmNzc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTYtb25lT2YtMy0xIS4uLy4uL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tNi1vbmVPZi0zLTIhLi92aWRlby1qcy5jc3NcIik7XG4gICAgIGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuICAgICB1cGRhdGUobmV3Q29udGVudCk7XG4gICB9KTtcbiB9XG4gLy8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuIG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\n");

/***/ }),

/***/ "./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/browser-index.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/browser-index.js ***!
  \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Default exports for Node. Export the extended versions of VTTCue and\n// VTTRegion in Node since we likely want the capability to convert back and\n// forth between JSON. If we don't then it's not that big of a deal since we're\n// off browser.\n\nvar window = __webpack_require__(/*! global/window */ \"./node_modules/_global@4.4.0@global/window.js\");\n\nvar vttjs = module.exports = {\n  WebVTT: __webpack_require__(/*! ./vtt.js */ \"./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vtt.js\"),\n  VTTCue: __webpack_require__(/*! ./vttcue.js */ \"./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttcue.js\"),\n  VTTRegion: __webpack_require__(/*! ./vttregion.js */ \"./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttregion.js\")\n};\n\nwindow.vttjs = vttjs;\nwindow.WebVTT = vttjs.WebVTT;\n\nvar cueShim = vttjs.VTTCue;\nvar regionShim = vttjs.VTTRegion;\nvar nativeVTTCue = window.VTTCue;\nvar nativeVTTRegion = window.VTTRegion;\n\nvttjs.shim = function() {\n  window.VTTCue = cueShim;\n  window.VTTRegion = regionShim;\n};\n\nvttjs.restore = function() {\n  window.VTTCue = nativeVTTCue;\n  window.VTTRegion = nativeVTTRegion;\n};\n\nif (!window.VTTCue) {\n  vttjs.shim();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvanMtdnR0LmpzQDAuMTIuNkB2aWRlb2pzLXZ0dC5qcy9saWIvYnJvd3Nlci1pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdmlkZW9qcy12dHQuanNAMC4xMi42QHZpZGVvanMtdnR0LmpzL2xpYi9icm93c2VyLWluZGV4LmpzP2VkY2IiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMyB2dHQuanMgQ29udHJpYnV0b3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBEZWZhdWx0IGV4cG9ydHMgZm9yIE5vZGUuIEV4cG9ydCB0aGUgZXh0ZW5kZWQgdmVyc2lvbnMgb2YgVlRUQ3VlIGFuZFxuLy8gVlRUUmVnaW9uIGluIE5vZGUgc2luY2Ugd2UgbGlrZWx5IHdhbnQgdGhlIGNhcGFiaWxpdHkgdG8gY29udmVydCBiYWNrIGFuZFxuLy8gZm9ydGggYmV0d2VlbiBKU09OLiBJZiB3ZSBkb24ndCB0aGVuIGl0J3Mgbm90IHRoYXQgYmlnIG9mIGEgZGVhbCBzaW5jZSB3ZSdyZVxuLy8gb2ZmIGJyb3dzZXIuXG5cbnZhciB3aW5kb3cgPSByZXF1aXJlKCdnbG9iYWwvd2luZG93Jyk7XG5cbnZhciB2dHRqcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBXZWJWVFQ6IHJlcXVpcmUoXCIuL3Z0dC5qc1wiKSxcbiAgVlRUQ3VlOiByZXF1aXJlKFwiLi92dHRjdWUuanNcIiksXG4gIFZUVFJlZ2lvbjogcmVxdWlyZShcIi4vdnR0cmVnaW9uLmpzXCIpXG59O1xuXG53aW5kb3cudnR0anMgPSB2dHRqcztcbndpbmRvdy5XZWJWVFQgPSB2dHRqcy5XZWJWVFQ7XG5cbnZhciBjdWVTaGltID0gdnR0anMuVlRUQ3VlO1xudmFyIHJlZ2lvblNoaW0gPSB2dHRqcy5WVFRSZWdpb247XG52YXIgbmF0aXZlVlRUQ3VlID0gd2luZG93LlZUVEN1ZTtcbnZhciBuYXRpdmVWVFRSZWdpb24gPSB3aW5kb3cuVlRUUmVnaW9uO1xuXG52dHRqcy5zaGltID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5WVFRDdWUgPSBjdWVTaGltO1xuICB3aW5kb3cuVlRUUmVnaW9uID0gcmVnaW9uU2hpbTtcbn07XG5cbnZ0dGpzLnJlc3RvcmUgPSBmdW5jdGlvbigpIHtcbiAgd2luZG93LlZUVEN1ZSA9IG5hdGl2ZVZUVEN1ZTtcbiAgd2luZG93LlZUVFJlZ2lvbiA9IG5hdGl2ZVZUVFJlZ2lvbjtcbn07XG5cbmlmICghd2luZG93LlZUVEN1ZSkge1xuICB2dHRqcy5zaGltKCk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/browser-index.js\n");

/***/ }),

/***/ "./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vtt.js":
/*!***********************************************************************!*\
  !*** ./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vtt.js ***!
  \***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\nvar _objCreate = Object.create || (function() {\n  function F() {}\n  return function(o) {\n    if (arguments.length !== 1) {\n      throw new Error('Object.create shim only accepts one parameter.');\n    }\n    F.prototype = o;\n    return new F();\n  };\n})();\n\n// Creates a new ParserError object from an errorData object. The errorData\n// object should have default code and message properties. The default message\n// property can be overriden by passing in a message parameter.\n// See ParsingError.Errors below for acceptable errors.\nfunction ParsingError(errorData, message) {\n  this.name = \"ParsingError\";\n  this.code = errorData.code;\n  this.message = message || errorData.message;\n}\nParsingError.prototype = _objCreate(Error.prototype);\nParsingError.prototype.constructor = ParsingError;\n\n// ParsingError metadata for acceptable ParsingErrors.\nParsingError.Errors = {\n  BadSignature: {\n    code: 0,\n    message: \"Malformed WebVTT signature.\"\n  },\n  BadTimeStamp: {\n    code: 1,\n    message: \"Malformed time stamp.\"\n  }\n};\n\n// Try to parse input as a time stamp.\nfunction parseTimeStamp(input) {\n\n  function computeSeconds(h, m, s, f) {\n    return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;\n  }\n\n  var m = input.match(/^(\\d+):(\\d{2})(:\\d{2})?\\.(\\d{3})/);\n  if (!m) {\n    return null;\n  }\n\n  if (m[3]) {\n    // Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds]\n    return computeSeconds(m[1], m[2], m[3].replace(\":\", \"\"), m[4]);\n  } else if (m[1] > 59) {\n    // Timestamp takes the form of [hours]:[minutes].[milliseconds]\n    // First position is hours as it's over 59.\n    return computeSeconds(m[1], m[2], 0,  m[4]);\n  } else {\n    // Timestamp takes the form of [minutes]:[seconds].[milliseconds]\n    return computeSeconds(0, m[1], m[2], m[4]);\n  }\n}\n\n// A settings object holds key/value pairs and will ignore anything but the first\n// assignment to a specific key.\nfunction Settings() {\n  this.values = _objCreate(null);\n}\n\nSettings.prototype = {\n  // Only accept the first assignment to any key.\n  set: function(k, v) {\n    if (!this.get(k) && v !== \"\") {\n      this.values[k] = v;\n    }\n  },\n  // Return the value for a key, or a default value.\n  // If 'defaultKey' is passed then 'dflt' is assumed to be an object with\n  // a number of possible default values as properties where 'defaultKey' is\n  // the key of the property that will be chosen; otherwise it's assumed to be\n  // a single value.\n  get: function(k, dflt, defaultKey) {\n    if (defaultKey) {\n      return this.has(k) ? this.values[k] : dflt[defaultKey];\n    }\n    return this.has(k) ? this.values[k] : dflt;\n  },\n  // Check whether we have a value for a key.\n  has: function(k) {\n    return k in this.values;\n  },\n  // Accept a setting if its one of the given alternatives.\n  alt: function(k, v, a) {\n    for (var n = 0; n < a.length; ++n) {\n      if (v === a[n]) {\n        this.set(k, v);\n        break;\n      }\n    }\n  },\n  // Accept a setting if its a valid (signed) integer.\n  integer: function(k, v) {\n    if (/^-?\\d+$/.test(v)) { // integer\n      this.set(k, parseInt(v, 10));\n    }\n  },\n  // Accept a setting if its a valid percentage.\n  percent: function(k, v) {\n    var m;\n    if ((m = v.match(/^([\\d]{1,3})(\\.[\\d]*)?%$/))) {\n      v = parseFloat(v);\n      if (v >= 0 && v <= 100) {\n        this.set(k, v);\n        return true;\n      }\n    }\n    return false;\n  }\n};\n\n// Helper function to parse input into groups separated by 'groupDelim', and\n// interprete each group as a key/value pair separated by 'keyValueDelim'.\nfunction parseOptions(input, callback, keyValueDelim, groupDelim) {\n  var groups = groupDelim ? input.split(groupDelim) : [input];\n  for (var i in groups) {\n    if (typeof groups[i] !== \"string\") {\n      continue;\n    }\n    var kv = groups[i].split(keyValueDelim);\n    if (kv.length !== 2) {\n      continue;\n    }\n    var k = kv[0];\n    var v = kv[1];\n    callback(k, v);\n  }\n}\n\nfunction parseCue(input, cue, regionList) {\n  // Remember the original input if we need to throw an error.\n  var oInput = input;\n  // 4.1 WebVTT timestamp\n  function consumeTimeStamp() {\n    var ts = parseTimeStamp(input);\n    if (ts === null) {\n      throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n                            \"Malformed timestamp: \" + oInput);\n    }\n    // Remove time stamp from input.\n    input = input.replace(/^[^\\sa-zA-Z-]+/, \"\");\n    return ts;\n  }\n\n  // 4.4.2 WebVTT cue settings\n  function consumeCueSettings(input, cue) {\n    var settings = new Settings();\n\n    parseOptions(input, function (k, v) {\n      switch (k) {\n      case \"region\":\n        // Find the last region we parsed with the same region id.\n        for (var i = regionList.length - 1; i >= 0; i--) {\n          if (regionList[i].id === v) {\n            settings.set(k, regionList[i].region);\n            break;\n          }\n        }\n        break;\n      case \"vertical\":\n        settings.alt(k, v, [\"rl\", \"lr\"]);\n        break;\n      case \"line\":\n        var vals = v.split(\",\"),\n            vals0 = vals[0];\n        settings.integer(k, vals0);\n        settings.percent(k, vals0) ? settings.set(\"snapToLines\", false) : null;\n        settings.alt(k, vals0, [\"auto\"]);\n        if (vals.length === 2) {\n          settings.alt(\"lineAlign\", vals[1], [\"start\", \"middle\", \"end\"]);\n        }\n        break;\n      case \"position\":\n        vals = v.split(\",\");\n        settings.percent(k, vals[0]);\n        if (vals.length === 2) {\n          settings.alt(\"positionAlign\", vals[1], [\"start\", \"middle\", \"end\"]);\n        }\n        break;\n      case \"size\":\n        settings.percent(k, v);\n        break;\n      case \"align\":\n        settings.alt(k, v, [\"start\", \"middle\", \"end\", \"left\", \"right\"]);\n        break;\n      }\n    }, /:/, /\\s/);\n\n    // Apply default values for any missing fields.\n    cue.region = settings.get(\"region\", null);\n    cue.vertical = settings.get(\"vertical\", \"\");\n    cue.line = settings.get(\"line\", \"auto\");\n    cue.lineAlign = settings.get(\"lineAlign\", \"start\");\n    cue.snapToLines = settings.get(\"snapToLines\", true);\n    cue.size = settings.get(\"size\", 100);\n    cue.align = settings.get(\"align\", \"middle\");\n    cue.position = settings.get(\"position\", {\n      start: 0,\n      left: 0,\n      middle: 50,\n      end: 100,\n      right: 100\n    }, cue.align);\n    cue.positionAlign = settings.get(\"positionAlign\", {\n      start: \"start\",\n      left: \"start\",\n      middle: \"middle\",\n      end: \"end\",\n      right: \"end\"\n    }, cue.align);\n  }\n\n  function skipWhitespace() {\n    input = input.replace(/^\\s+/, \"\");\n  }\n\n  // 4.1 WebVTT cue timings.\n  skipWhitespace();\n  cue.startTime = consumeTimeStamp();   // (1) collect cue start time\n  skipWhitespace();\n  if (input.substr(0, 3) !== \"-->\") {     // (3) next characters must match \"-->\"\n    throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n                           \"Malformed time stamp (time stamps must be separated by '-->'): \" +\n                           oInput);\n  }\n  input = input.substr(3);\n  skipWhitespace();\n  cue.endTime = consumeTimeStamp();     // (5) collect cue end time\n\n  // 4.1 WebVTT cue settings list.\n  skipWhitespace();\n  consumeCueSettings(input, cue);\n}\n\nvar ESCAPE = {\n  \"&amp;\": \"&\",\n  \"&lt;\": \"<\",\n  \"&gt;\": \">\",\n  \"&lrm;\": \"\\u200e\",\n  \"&rlm;\": \"\\u200f\",\n  \"&nbsp;\": \"\\u00a0\"\n};\n\nvar TAG_NAME = {\n  c: \"span\",\n  i: \"i\",\n  b: \"b\",\n  u: \"u\",\n  ruby: \"ruby\",\n  rt: \"rt\",\n  v: \"span\",\n  lang: \"span\"\n};\n\nvar TAG_ANNOTATION = {\n  v: \"title\",\n  lang: \"lang\"\n};\n\nvar NEEDS_PARENT = {\n  rt: \"ruby\"\n};\n\n// Parse content into a document fragment.\nfunction parseContent(window, input) {\n  function nextToken() {\n    // Check for end-of-string.\n    if (!input) {\n      return null;\n    }\n\n    // Consume 'n' characters from the input.\n    function consume(result) {\n      input = input.substr(result.length);\n      return result;\n    }\n\n    var m = input.match(/^([^<]*)(<[^>]*>?)?/);\n    // If there is some text before the next tag, return it, otherwise return\n    // the tag.\n    return consume(m[1] ? m[1] : m[2]);\n  }\n\n  // Unescape a string 's'.\n  function unescape1(e) {\n    return ESCAPE[e];\n  }\n  function unescape(s) {\n    while ((m = s.match(/&(amp|lt|gt|lrm|rlm|nbsp);/))) {\n      s = s.replace(m[0], unescape1);\n    }\n    return s;\n  }\n\n  function shouldAdd(current, element) {\n    return !NEEDS_PARENT[element.localName] ||\n           NEEDS_PARENT[element.localName] === current.localName;\n  }\n\n  // Create an element for this tag.\n  function createElement(type, annotation) {\n    var tagName = TAG_NAME[type];\n    if (!tagName) {\n      return null;\n    }\n    var element = window.document.createElement(tagName);\n    element.localName = tagName;\n    var name = TAG_ANNOTATION[type];\n    if (name && annotation) {\n      element[name] = annotation.trim();\n    }\n    return element;\n  }\n\n  var rootDiv = window.document.createElement(\"div\"),\n      current = rootDiv,\n      t,\n      tagStack = [];\n\n  while ((t = nextToken()) !== null) {\n    if (t[0] === '<') {\n      if (t[1] === \"/\") {\n        // If the closing tag matches, move back up to the parent node.\n        if (tagStack.length &&\n            tagStack[tagStack.length - 1] === t.substr(2).replace(\">\", \"\")) {\n          tagStack.pop();\n          current = current.parentNode;\n        }\n        // Otherwise just ignore the end tag.\n        continue;\n      }\n      var ts = parseTimeStamp(t.substr(1, t.length - 2));\n      var node;\n      if (ts) {\n        // Timestamps are lead nodes as well.\n        node = window.document.createProcessingInstruction(\"timestamp\", ts);\n        current.appendChild(node);\n        continue;\n      }\n      var m = t.match(/^<([^.\\s/0-9>]+)(\\.[^\\s\\\\>]+)?([^>\\\\]+)?(\\\\?)>?$/);\n      // If we can't parse the tag, skip to the next tag.\n      if (!m) {\n        continue;\n      }\n      // Try to construct an element, and ignore the tag if we couldn't.\n      node = createElement(m[1], m[3]);\n      if (!node) {\n        continue;\n      }\n      // Determine if the tag should be added based on the context of where it\n      // is placed in the cuetext.\n      if (!shouldAdd(current, node)) {\n        continue;\n      }\n      // Set the class list (as a list of classes, separated by space).\n      if (m[2]) {\n        node.className = m[2].substr(1).replace('.', ' ');\n      }\n      // Append the node to the current node, and enter the scope of the new\n      // node.\n      tagStack.push(m[1]);\n      current.appendChild(node);\n      current = node;\n      continue;\n    }\n\n    // Text nodes are leaf nodes.\n    current.appendChild(window.document.createTextNode(unescape(t)));\n  }\n\n  return rootDiv;\n}\n\n// This is a list of all the Unicode characters that have a strong\n// right-to-left category. What this means is that these characters are\n// written right-to-left for sure. It was generated by pulling all the strong\n// right-to-left characters out of the Unicode data table. That table can\n// found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\nvar strongRTLRanges = [[0x5be, 0x5be], [0x5c0, 0x5c0], [0x5c3, 0x5c3], [0x5c6, 0x5c6],\n [0x5d0, 0x5ea], [0x5f0, 0x5f4], [0x608, 0x608], [0x60b, 0x60b], [0x60d, 0x60d],\n [0x61b, 0x61b], [0x61e, 0x64a], [0x66d, 0x66f], [0x671, 0x6d5], [0x6e5, 0x6e6],\n [0x6ee, 0x6ef], [0x6fa, 0x70d], [0x70f, 0x710], [0x712, 0x72f], [0x74d, 0x7a5],\n [0x7b1, 0x7b1], [0x7c0, 0x7ea], [0x7f4, 0x7f5], [0x7fa, 0x7fa], [0x800, 0x815],\n [0x81a, 0x81a], [0x824, 0x824], [0x828, 0x828], [0x830, 0x83e], [0x840, 0x858],\n [0x85e, 0x85e], [0x8a0, 0x8a0], [0x8a2, 0x8ac], [0x200f, 0x200f],\n [0xfb1d, 0xfb1d], [0xfb1f, 0xfb28], [0xfb2a, 0xfb36], [0xfb38, 0xfb3c],\n [0xfb3e, 0xfb3e], [0xfb40, 0xfb41], [0xfb43, 0xfb44], [0xfb46, 0xfbc1],\n [0xfbd3, 0xfd3d], [0xfd50, 0xfd8f], [0xfd92, 0xfdc7], [0xfdf0, 0xfdfc],\n [0xfe70, 0xfe74], [0xfe76, 0xfefc], [0x10800, 0x10805], [0x10808, 0x10808],\n [0x1080a, 0x10835], [0x10837, 0x10838], [0x1083c, 0x1083c], [0x1083f, 0x10855],\n [0x10857, 0x1085f], [0x10900, 0x1091b], [0x10920, 0x10939], [0x1093f, 0x1093f],\n [0x10980, 0x109b7], [0x109be, 0x109bf], [0x10a00, 0x10a00], [0x10a10, 0x10a13],\n [0x10a15, 0x10a17], [0x10a19, 0x10a33], [0x10a40, 0x10a47], [0x10a50, 0x10a58],\n [0x10a60, 0x10a7f], [0x10b00, 0x10b35], [0x10b40, 0x10b55], [0x10b58, 0x10b72],\n [0x10b78, 0x10b7f], [0x10c00, 0x10c48], [0x1ee00, 0x1ee03], [0x1ee05, 0x1ee1f],\n [0x1ee21, 0x1ee22], [0x1ee24, 0x1ee24], [0x1ee27, 0x1ee27], [0x1ee29, 0x1ee32],\n [0x1ee34, 0x1ee37], [0x1ee39, 0x1ee39], [0x1ee3b, 0x1ee3b], [0x1ee42, 0x1ee42],\n [0x1ee47, 0x1ee47], [0x1ee49, 0x1ee49], [0x1ee4b, 0x1ee4b], [0x1ee4d, 0x1ee4f],\n [0x1ee51, 0x1ee52], [0x1ee54, 0x1ee54], [0x1ee57, 0x1ee57], [0x1ee59, 0x1ee59],\n [0x1ee5b, 0x1ee5b], [0x1ee5d, 0x1ee5d], [0x1ee5f, 0x1ee5f], [0x1ee61, 0x1ee62],\n [0x1ee64, 0x1ee64], [0x1ee67, 0x1ee6a], [0x1ee6c, 0x1ee72], [0x1ee74, 0x1ee77],\n [0x1ee79, 0x1ee7c], [0x1ee7e, 0x1ee7e], [0x1ee80, 0x1ee89], [0x1ee8b, 0x1ee9b],\n [0x1eea1, 0x1eea3], [0x1eea5, 0x1eea9], [0x1eeab, 0x1eebb], [0x10fffd, 0x10fffd]];\n\nfunction isStrongRTLChar(charCode) {\n  for (var i = 0; i < strongRTLRanges.length; i++) {\n    var currentRange = strongRTLRanges[i];\n    if (charCode >= currentRange[0] && charCode <= currentRange[1]) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction determineBidi(cueDiv) {\n  var nodeStack = [],\n      text = \"\",\n      charCode;\n\n  if (!cueDiv || !cueDiv.childNodes) {\n    return \"ltr\";\n  }\n\n  function pushNodes(nodeStack, node) {\n    for (var i = node.childNodes.length - 1; i >= 0; i--) {\n      nodeStack.push(node.childNodes[i]);\n    }\n  }\n\n  function nextTextNode(nodeStack) {\n    if (!nodeStack || !nodeStack.length) {\n      return null;\n    }\n\n    var node = nodeStack.pop(),\n        text = node.textContent || node.innerText;\n    if (text) {\n      // TODO: This should match all unicode type B characters (paragraph\n      // separator characters). See issue #115.\n      var m = text.match(/^.*(\\n|\\r)/);\n      if (m) {\n        nodeStack.length = 0;\n        return m[0];\n      }\n      return text;\n    }\n    if (node.tagName === \"ruby\") {\n      return nextTextNode(nodeStack);\n    }\n    if (node.childNodes) {\n      pushNodes(nodeStack, node);\n      return nextTextNode(nodeStack);\n    }\n  }\n\n  pushNodes(nodeStack, cueDiv);\n  while ((text = nextTextNode(nodeStack))) {\n    for (var i = 0; i < text.length; i++) {\n      charCode = text.charCodeAt(i);\n      if (isStrongRTLChar(charCode)) {\n        return \"rtl\";\n      }\n    }\n  }\n  return \"ltr\";\n}\n\nfunction computeLinePos(cue) {\n  if (typeof cue.line === \"number\" &&\n      (cue.snapToLines || (cue.line >= 0 && cue.line <= 100))) {\n    return cue.line;\n  }\n  if (!cue.track || !cue.track.textTrackList ||\n      !cue.track.textTrackList.mediaElement) {\n    return -1;\n  }\n  var track = cue.track,\n      trackList = track.textTrackList,\n      count = 0;\n  for (var i = 0; i < trackList.length && trackList[i] !== track; i++) {\n    if (trackList[i].mode === \"showing\") {\n      count++;\n    }\n  }\n  return ++count * -1;\n}\n\nfunction StyleBox() {\n}\n\n// Apply styles to a div. If there is no div passed then it defaults to the\n// div on 'this'.\nStyleBox.prototype.applyStyles = function(styles, div) {\n  div = div || this.div;\n  for (var prop in styles) {\n    if (styles.hasOwnProperty(prop)) {\n      div.style[prop] = styles[prop];\n    }\n  }\n};\n\nStyleBox.prototype.formatStyle = function(val, unit) {\n  return val === 0 ? 0 : val + unit;\n};\n\n// Constructs the computed display state of the cue (a div). Places the div\n// into the overlay which should be a block level element (usually a div).\nfunction CueStyleBox(window, cue, styleOptions) {\n  var isIE8 = (/MSIE\\s8\\.0/).test(navigator.userAgent);\n  var color = \"rgba(255, 255, 255, 1)\";\n  var backgroundColor = \"rgba(0, 0, 0, 0.8)\";\n\n  if (isIE8) {\n    color = \"rgb(255, 255, 255)\";\n    backgroundColor = \"rgb(0, 0, 0)\";\n  }\n\n  StyleBox.call(this);\n  this.cue = cue;\n\n  // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will\n  // have inline positioning and will function as the cue background box.\n  this.cueDiv = parseContent(window, cue.text);\n  var styles = {\n    color: color,\n    backgroundColor: backgroundColor,\n    position: \"relative\",\n    left: 0,\n    right: 0,\n    top: 0,\n    bottom: 0,\n    display: \"inline\"\n  };\n\n  if (!isIE8) {\n    styles.writingMode = cue.vertical === \"\" ? \"horizontal-tb\"\n                                             : cue.vertical === \"lr\" ? \"vertical-lr\"\n                                                                     : \"vertical-rl\";\n    styles.unicodeBidi = \"plaintext\";\n  }\n  this.applyStyles(styles, this.cueDiv);\n\n  // Create an absolutely positioned div that will be used to position the cue\n  // div. Note, all WebVTT cue-setting alignments are equivalent to the CSS\n  // mirrors of them except \"middle\" which is \"center\" in CSS.\n  this.div = window.document.createElement(\"div\");\n  styles = {\n    textAlign: cue.align === \"middle\" ? \"center\" : cue.align,\n    font: styleOptions.font,\n    whiteSpace: \"pre-line\",\n    position: \"absolute\"\n  };\n\n  if (!isIE8) {\n    styles.direction = determineBidi(this.cueDiv);\n    styles.writingMode = cue.vertical === \"\" ? \"horizontal-tb\"\n                                             : cue.vertical === \"lr\" ? \"vertical-lr\"\n                                                                     : \"vertical-rl\".\n    stylesunicodeBidi =  \"plaintext\";\n  }\n\n  this.applyStyles(styles);\n\n  this.div.appendChild(this.cueDiv);\n\n  // Calculate the distance from the reference edge of the viewport to the text\n  // position of the cue box. The reference edge will be resolved later when\n  // the box orientation styles are applied.\n  var textPos = 0;\n  switch (cue.positionAlign) {\n  case \"start\":\n    textPos = cue.position;\n    break;\n  case \"middle\":\n    textPos = cue.position - (cue.size / 2);\n    break;\n  case \"end\":\n    textPos = cue.position - cue.size;\n    break;\n  }\n\n  // Horizontal box orientation; textPos is the distance from the left edge of the\n  // area to the left edge of the box and cue.size is the distance extending to\n  // the right from there.\n  if (cue.vertical === \"\") {\n    this.applyStyles({\n      left:  this.formatStyle(textPos, \"%\"),\n      width: this.formatStyle(cue.size, \"%\")\n    });\n  // Vertical box orientation; textPos is the distance from the top edge of the\n  // area to the top edge of the box and cue.size is the height extending\n  // downwards from there.\n  } else {\n    this.applyStyles({\n      top: this.formatStyle(textPos, \"%\"),\n      height: this.formatStyle(cue.size, \"%\")\n    });\n  }\n\n  this.move = function(box) {\n    this.applyStyles({\n      top: this.formatStyle(box.top, \"px\"),\n      bottom: this.formatStyle(box.bottom, \"px\"),\n      left: this.formatStyle(box.left, \"px\"),\n      right: this.formatStyle(box.right, \"px\"),\n      height: this.formatStyle(box.height, \"px\"),\n      width: this.formatStyle(box.width, \"px\")\n    });\n  };\n}\nCueStyleBox.prototype = _objCreate(StyleBox.prototype);\nCueStyleBox.prototype.constructor = CueStyleBox;\n\n// Represents the co-ordinates of an Element in a way that we can easily\n// compute things with such as if it overlaps or intersects with another Element.\n// Can initialize it with either a StyleBox or another BoxPosition.\nfunction BoxPosition(obj) {\n  var isIE8 = (/MSIE\\s8\\.0/).test(navigator.userAgent);\n\n  // Either a BoxPosition was passed in and we need to copy it, or a StyleBox\n  // was passed in and we need to copy the results of 'getBoundingClientRect'\n  // as the object returned is readonly. All co-ordinate values are in reference\n  // to the viewport origin (top left).\n  var lh, height, width, top;\n  if (obj.div) {\n    height = obj.div.offsetHeight;\n    width = obj.div.offsetWidth;\n    top = obj.div.offsetTop;\n\n    var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&\n                rects.getClientRects && rects.getClientRects();\n    obj = obj.div.getBoundingClientRect();\n    // In certain cases the outter div will be slightly larger then the sum of\n    // the inner div's lines. This could be due to bold text, etc, on some platforms.\n    // In this case we should get the average line height and use that. This will\n    // result in the desired behaviour.\n    lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)\n               : 0;\n\n  }\n  this.left = obj.left;\n  this.right = obj.right;\n  this.top = obj.top || top;\n  this.height = obj.height || height;\n  this.bottom = obj.bottom || (top + (obj.height || height));\n  this.width = obj.width || width;\n  this.lineHeight = lh !== undefined ? lh : obj.lineHeight;\n\n  if (isIE8 && !this.lineHeight) {\n    this.lineHeight = 13;\n  }\n}\n\n// Move the box along a particular axis. Optionally pass in an amount to move\n// the box. If no amount is passed then the default is the line height of the\n// box.\nBoxPosition.prototype.move = function(axis, toMove) {\n  toMove = toMove !== undefined ? toMove : this.lineHeight;\n  switch (axis) {\n  case \"+x\":\n    this.left += toMove;\n    this.right += toMove;\n    break;\n  case \"-x\":\n    this.left -= toMove;\n    this.right -= toMove;\n    break;\n  case \"+y\":\n    this.top += toMove;\n    this.bottom += toMove;\n    break;\n  case \"-y\":\n    this.top -= toMove;\n    this.bottom -= toMove;\n    break;\n  }\n};\n\n// Check if this box overlaps another box, b2.\nBoxPosition.prototype.overlaps = function(b2) {\n  return this.left < b2.right &&\n         this.right > b2.left &&\n         this.top < b2.bottom &&\n         this.bottom > b2.top;\n};\n\n// Check if this box overlaps any other boxes in boxes.\nBoxPosition.prototype.overlapsAny = function(boxes) {\n  for (var i = 0; i < boxes.length; i++) {\n    if (this.overlaps(boxes[i])) {\n      return true;\n    }\n  }\n  return false;\n};\n\n// Check if this box is within another box.\nBoxPosition.prototype.within = function(container) {\n  return this.top >= container.top &&\n         this.bottom <= container.bottom &&\n         this.left >= container.left &&\n         this.right <= container.right;\n};\n\n// Check if this box is entirely within the container or it is overlapping\n// on the edge opposite of the axis direction passed. For example, if \"+x\" is\n// passed and the box is overlapping on the left edge of the container, then\n// return true.\nBoxPosition.prototype.overlapsOppositeAxis = function(container, axis) {\n  switch (axis) {\n  case \"+x\":\n    return this.left < container.left;\n  case \"-x\":\n    return this.right > container.right;\n  case \"+y\":\n    return this.top < container.top;\n  case \"-y\":\n    return this.bottom > container.bottom;\n  }\n};\n\n// Find the percentage of the area that this box is overlapping with another\n// box.\nBoxPosition.prototype.intersectPercentage = function(b2) {\n  var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),\n      y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),\n      intersectArea = x * y;\n  return intersectArea / (this.height * this.width);\n};\n\n// Convert the positions from this box to CSS compatible positions using\n// the reference container's positions. This has to be done because this\n// box's positions are in reference to the viewport origin, whereas, CSS\n// values are in referecne to their respective edges.\nBoxPosition.prototype.toCSSCompatValues = function(reference) {\n  return {\n    top: this.top - reference.top,\n    bottom: reference.bottom - this.bottom,\n    left: this.left - reference.left,\n    right: reference.right - this.right,\n    height: this.height,\n    width: this.width\n  };\n};\n\n// Get an object that represents the box's position without anything extra.\n// Can pass a StyleBox, HTMLElement, or another BoxPositon.\nBoxPosition.getSimpleBoxPosition = function(obj) {\n  var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0;\n  var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0;\n  var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0;\n\n  obj = obj.div ? obj.div.getBoundingClientRect() :\n                obj.tagName ? obj.getBoundingClientRect() : obj;\n  var ret = {\n    left: obj.left,\n    right: obj.right,\n    top: obj.top || top,\n    height: obj.height || height,\n    bottom: obj.bottom || (top + (obj.height || height)),\n    width: obj.width || width\n  };\n  return ret;\n};\n\n// Move a StyleBox to its specified, or next best, position. The containerBox\n// is the box that contains the StyleBox, such as a div. boxPositions are\n// a list of other boxes that the styleBox can't overlap with.\nfunction moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) {\n\n  // Find the best position for a cue box, b, on the video. The axis parameter\n  // is a list of axis, the order of which, it will move the box along. For example:\n  // Passing [\"+x\", \"-x\"] will move the box first along the x axis in the positive\n  // direction. If it doesn't find a good position for it there it will then move\n  // it along the x axis in the negative direction.\n  function findBestPosition(b, axis) {\n    var bestPosition,\n        specifiedPosition = new BoxPosition(b),\n        percentage = 1; // Highest possible so the first thing we get is better.\n\n    for (var i = 0; i < axis.length; i++) {\n      while (b.overlapsOppositeAxis(containerBox, axis[i]) ||\n             (b.within(containerBox) && b.overlapsAny(boxPositions))) {\n        b.move(axis[i]);\n      }\n      // We found a spot where we aren't overlapping anything. This is our\n      // best position.\n      if (b.within(containerBox)) {\n        return b;\n      }\n      var p = b.intersectPercentage(containerBox);\n      // If we're outside the container box less then we were on our last try\n      // then remember this position as the best position.\n      if (percentage > p) {\n        bestPosition = new BoxPosition(b);\n        percentage = p;\n      }\n      // Reset the box position to the specified position.\n      b = new BoxPosition(specifiedPosition);\n    }\n    return bestPosition || specifiedPosition;\n  }\n\n  var boxPosition = new BoxPosition(styleBox),\n      cue = styleBox.cue,\n      linePos = computeLinePos(cue),\n      axis = [];\n\n  // If we have a line number to align the cue to.\n  if (cue.snapToLines) {\n    var size;\n    switch (cue.vertical) {\n    case \"\":\n      axis = [ \"+y\", \"-y\" ];\n      size = \"height\";\n      break;\n    case \"rl\":\n      axis = [ \"+x\", \"-x\" ];\n      size = \"width\";\n      break;\n    case \"lr\":\n      axis = [ \"-x\", \"+x\" ];\n      size = \"width\";\n      break;\n    }\n\n    var step = boxPosition.lineHeight,\n        position = step * Math.round(linePos),\n        maxPosition = containerBox[size] + step,\n        initialAxis = axis[0];\n\n    // If the specified intial position is greater then the max position then\n    // clamp the box to the amount of steps it would take for the box to\n    // reach the max position.\n    if (Math.abs(position) > maxPosition) {\n      position = position < 0 ? -1 : 1;\n      position *= Math.ceil(maxPosition / step) * step;\n    }\n\n    // If computed line position returns negative then line numbers are\n    // relative to the bottom of the video instead of the top. Therefore, we\n    // need to increase our initial position by the length or width of the\n    // video, depending on the writing direction, and reverse our axis directions.\n    if (linePos < 0) {\n      position += cue.vertical === \"\" ? containerBox.height : containerBox.width;\n      axis = axis.reverse();\n    }\n\n    // Move the box to the specified position. This may not be its best\n    // position.\n    boxPosition.move(initialAxis, position);\n\n  } else {\n    // If we have a percentage line value for the cue.\n    var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100;\n\n    switch (cue.lineAlign) {\n    case \"middle\":\n      linePos -= (calculatedPercentage / 2);\n      break;\n    case \"end\":\n      linePos -= calculatedPercentage;\n      break;\n    }\n\n    // Apply initial line position to the cue box.\n    switch (cue.vertical) {\n    case \"\":\n      styleBox.applyStyles({\n        top: styleBox.formatStyle(linePos, \"%\")\n      });\n      break;\n    case \"rl\":\n      styleBox.applyStyles({\n        left: styleBox.formatStyle(linePos, \"%\")\n      });\n      break;\n    case \"lr\":\n      styleBox.applyStyles({\n        right: styleBox.formatStyle(linePos, \"%\")\n      });\n      break;\n    }\n\n    axis = [ \"+y\", \"-x\", \"+x\", \"-y\" ];\n\n    // Get the box position again after we've applied the specified positioning\n    // to it.\n    boxPosition = new BoxPosition(styleBox);\n  }\n\n  var bestPosition = findBestPosition(boxPosition, axis);\n  styleBox.move(bestPosition.toCSSCompatValues(containerBox));\n}\n\nfunction WebVTT() {\n  // Nothing\n}\n\n// Helper to allow strings to be decoded instead of the default binary utf8 data.\nWebVTT.StringDecoder = function() {\n  return {\n    decode: function(data) {\n      if (!data) {\n        return \"\";\n      }\n      if (typeof data !== \"string\") {\n        throw new Error(\"Error - expected string data.\");\n      }\n      return decodeURIComponent(encodeURIComponent(data));\n    }\n  };\n};\n\nWebVTT.convertCueToDOMTree = function(window, cuetext) {\n  if (!window || !cuetext) {\n    return null;\n  }\n  return parseContent(window, cuetext);\n};\n\nvar FONT_SIZE_PERCENT = 0.05;\nvar FONT_STYLE = \"sans-serif\";\nvar CUE_BACKGROUND_PADDING = \"1.5%\";\n\n// Runs the processing model over the cues and regions passed to it.\n// @param overlay A block level element (usually a div) that the computed cues\n//                and regions will be placed into.\nWebVTT.processCues = function(window, cues, overlay) {\n  if (!window || !cues || !overlay) {\n    return null;\n  }\n\n  // Remove all previous children.\n  while (overlay.firstChild) {\n    overlay.removeChild(overlay.firstChild);\n  }\n\n  var paddedOverlay = window.document.createElement(\"div\");\n  paddedOverlay.style.position = \"absolute\";\n  paddedOverlay.style.left = \"0\";\n  paddedOverlay.style.right = \"0\";\n  paddedOverlay.style.top = \"0\";\n  paddedOverlay.style.bottom = \"0\";\n  paddedOverlay.style.margin = CUE_BACKGROUND_PADDING;\n  overlay.appendChild(paddedOverlay);\n\n  // Determine if we need to compute the display states of the cues. This could\n  // be the case if a cue's state has been changed since the last computation or\n  // if it has not been computed yet.\n  function shouldCompute(cues) {\n    for (var i = 0; i < cues.length; i++) {\n      if (cues[i].hasBeenReset || !cues[i].displayState) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // We don't need to recompute the cues' display states. Just reuse them.\n  if (!shouldCompute(cues)) {\n    for (var i = 0; i < cues.length; i++) {\n      paddedOverlay.appendChild(cues[i].displayState);\n    }\n    return;\n  }\n\n  var boxPositions = [],\n      containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay),\n      fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;\n  var styleOptions = {\n    font: fontSize + \"px \" + FONT_STYLE\n  };\n\n  (function() {\n    var styleBox, cue;\n\n    for (var i = 0; i < cues.length; i++) {\n      cue = cues[i];\n\n      // Compute the intial position and styles of the cue div.\n      styleBox = new CueStyleBox(window, cue, styleOptions);\n      paddedOverlay.appendChild(styleBox.div);\n\n      // Move the cue div to it's correct line position.\n      moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);\n\n      // Remember the computed div so that we don't have to recompute it later\n      // if we don't have too.\n      cue.displayState = styleBox.div;\n\n      boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));\n    }\n  })();\n};\n\nWebVTT.Parser = function(window, vttjs, decoder) {\n  if (!decoder) {\n    decoder = vttjs;\n    vttjs = {};\n  }\n  if (!vttjs) {\n    vttjs = {};\n  }\n\n  this.window = window;\n  this.vttjs = vttjs;\n  this.state = \"INITIAL\";\n  this.buffer = \"\";\n  this.decoder = decoder || new TextDecoder(\"utf8\");\n  this.regionList = [];\n};\n\nWebVTT.Parser.prototype = {\n  // If the error is a ParsingError then report it to the consumer if\n  // possible. If it's not a ParsingError then throw it like normal.\n  reportOrThrowError: function(e) {\n    if (e instanceof ParsingError) {\n      this.onparsingerror && this.onparsingerror(e);\n    } else {\n      throw e;\n    }\n  },\n  parse: function (data) {\n    var self = this;\n\n    // If there is no data then we won't decode it, but will just try to parse\n    // whatever is in buffer already. This may occur in circumstances, for\n    // example when flush() is called.\n    if (data) {\n      // Try to decode the data that we received.\n      self.buffer += self.decoder.decode(data, {stream: true});\n    }\n\n    function collectNextLine() {\n      var buffer = self.buffer;\n      var pos = 0;\n      while (pos < buffer.length && buffer[pos] !== '\\r' && buffer[pos] !== '\\n') {\n        ++pos;\n      }\n      var line = buffer.substr(0, pos);\n      // Advance the buffer early in case we fail below.\n      if (buffer[pos] === '\\r') {\n        ++pos;\n      }\n      if (buffer[pos] === '\\n') {\n        ++pos;\n      }\n      self.buffer = buffer.substr(pos);\n      return line;\n    }\n\n    // 3.4 WebVTT region and WebVTT region settings syntax\n    function parseRegion(input) {\n      var settings = new Settings();\n\n      parseOptions(input, function (k, v) {\n        switch (k) {\n        case \"id\":\n          settings.set(k, v);\n          break;\n        case \"width\":\n          settings.percent(k, v);\n          break;\n        case \"lines\":\n          settings.integer(k, v);\n          break;\n        case \"regionanchor\":\n        case \"viewportanchor\":\n          var xy = v.split(',');\n          if (xy.length !== 2) {\n            break;\n          }\n          // We have to make sure both x and y parse, so use a temporary\n          // settings object here.\n          var anchor = new Settings();\n          anchor.percent(\"x\", xy[0]);\n          anchor.percent(\"y\", xy[1]);\n          if (!anchor.has(\"x\") || !anchor.has(\"y\")) {\n            break;\n          }\n          settings.set(k + \"X\", anchor.get(\"x\"));\n          settings.set(k + \"Y\", anchor.get(\"y\"));\n          break;\n        case \"scroll\":\n          settings.alt(k, v, [\"up\"]);\n          break;\n        }\n      }, /=/, /\\s/);\n\n      // Create the region, using default values for any values that were not\n      // specified.\n      if (settings.has(\"id\")) {\n        var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)();\n        region.width = settings.get(\"width\", 100);\n        region.lines = settings.get(\"lines\", 3);\n        region.regionAnchorX = settings.get(\"regionanchorX\", 0);\n        region.regionAnchorY = settings.get(\"regionanchorY\", 100);\n        region.viewportAnchorX = settings.get(\"viewportanchorX\", 0);\n        region.viewportAnchorY = settings.get(\"viewportanchorY\", 100);\n        region.scroll = settings.get(\"scroll\", \"\");\n        // Register the region.\n        self.onregion && self.onregion(region);\n        // Remember the VTTRegion for later in case we parse any VTTCues that\n        // reference it.\n        self.regionList.push({\n          id: settings.get(\"id\"),\n          region: region\n        });\n      }\n    }\n\n    // draft-pantos-http-live-streaming-20\n    // https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-3.5\n    // 3.5 WebVTT\n    function parseTimestampMap(input) {\n      var settings = new Settings();\n\n      parseOptions(input, function(k, v) {\n        switch(k) {\n        case \"MPEGT\":\n          settings.integer(k + 'S', v);\n          break;\n        case \"LOCA\":\n          settings.set(k + 'L', parseTimeStamp(v));\n          break;\n        }\n      }, /[^\\d]:/, /,/);\n\n      self.ontimestampmap && self.ontimestampmap({\n        \"MPEGTS\": settings.get(\"MPEGTS\"),\n        \"LOCAL\": settings.get(\"LOCAL\")\n      });\n    }\n\n    // 3.2 WebVTT metadata header syntax\n    function parseHeader(input) {\n      if (input.match(/X-TIMESTAMP-MAP/)) {\n        // This line contains HLS X-TIMESTAMP-MAP metadata\n        parseOptions(input, function(k, v) {\n          switch(k) {\n          case \"X-TIMESTAMP-MAP\":\n            parseTimestampMap(v);\n            break;\n          }\n        }, /=/);\n      } else {\n        parseOptions(input, function (k, v) {\n          switch (k) {\n          case \"Region\":\n            // 3.3 WebVTT region metadata header syntax\n            parseRegion(v);\n            break;\n          }\n        }, /:/);\n      }\n\n    }\n\n    // 5.1 WebVTT file parsing.\n    try {\n      var line;\n      if (self.state === \"INITIAL\") {\n        // We can't start parsing until we have the first line.\n        if (!/\\r\\n|\\n/.test(self.buffer)) {\n          return this;\n        }\n\n        line = collectNextLine();\n\n        var m = line.match(/^WEBVTT([ \\t].*)?$/);\n        if (!m || !m[0]) {\n          throw new ParsingError(ParsingError.Errors.BadSignature);\n        }\n\n        self.state = \"HEADER\";\n      }\n\n      var alreadyCollectedLine = false;\n      while (self.buffer) {\n        // We can't parse a line until we have the full line.\n        if (!/\\r\\n|\\n/.test(self.buffer)) {\n          return this;\n        }\n\n        if (!alreadyCollectedLine) {\n          line = collectNextLine();\n        } else {\n          alreadyCollectedLine = false;\n        }\n\n        switch (self.state) {\n        case \"HEADER\":\n          // 13-18 - Allow a header (metadata) under the WEBVTT line.\n          if (/:/.test(line)) {\n            parseHeader(line);\n          } else if (!line) {\n            // An empty line terminates the header and starts the body (cues).\n            self.state = \"ID\";\n          }\n          continue;\n        case \"NOTE\":\n          // Ignore NOTE blocks.\n          if (!line) {\n            self.state = \"ID\";\n          }\n          continue;\n        case \"ID\":\n          // Check for the start of NOTE blocks.\n          if (/^NOTE($|[ \\t])/.test(line)) {\n            self.state = \"NOTE\";\n            break;\n          }\n          // 19-29 - Allow any number of line terminators, then initialize new cue values.\n          if (!line) {\n            continue;\n          }\n          self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, \"\");\n          self.state = \"CUE\";\n          // 30-39 - Check if self line contains an optional identifier or timing data.\n          if (line.indexOf(\"-->\") === -1) {\n            self.cue.id = line;\n            continue;\n          }\n          // Process line as start of a cue.\n          /*falls through*/\n        case \"CUE\":\n          // 40 - Collect cue timings and settings.\n          try {\n            parseCue(line, self.cue, self.regionList);\n          } catch (e) {\n            self.reportOrThrowError(e);\n            // In case of an error ignore rest of the cue.\n            self.cue = null;\n            self.state = \"BADCUE\";\n            continue;\n          }\n          self.state = \"CUETEXT\";\n          continue;\n        case \"CUETEXT\":\n          var hasSubstring = line.indexOf(\"-->\") !== -1;\n          // 34 - If we have an empty line then report the cue.\n          // 35 - If we have the special substring '-->' then report the cue,\n          // but do not collect the line as we need to process the current\n          // one as a new cue.\n          if (!line || hasSubstring && (alreadyCollectedLine = true)) {\n            // We are done parsing self cue.\n            self.oncue && self.oncue(self.cue);\n            self.cue = null;\n            self.state = \"ID\";\n            continue;\n          }\n          if (self.cue.text) {\n            self.cue.text += \"\\n\";\n          }\n          self.cue.text += line;\n          continue;\n        case \"BADCUE\": // BADCUE\n          // 54-62 - Collect and discard the remaining cue.\n          if (!line) {\n            self.state = \"ID\";\n          }\n          continue;\n        }\n      }\n    } catch (e) {\n      self.reportOrThrowError(e);\n\n      // If we are currently parsing a cue, report what we have.\n      if (self.state === \"CUETEXT\" && self.cue && self.oncue) {\n        self.oncue(self.cue);\n      }\n      self.cue = null;\n      // Enter BADWEBVTT state if header was not parsed correctly otherwise\n      // another exception occurred so enter BADCUE state.\n      self.state = self.state === \"INITIAL\" ? \"BADWEBVTT\" : \"BADCUE\";\n    }\n    return this;\n  },\n  flush: function () {\n    var self = this;\n    try {\n      // Finish decoding the stream.\n      self.buffer += self.decoder.decode();\n      // Synthesize the end of the current cue or region.\n      if (self.cue || self.state === \"HEADER\") {\n        self.buffer += \"\\n\\n\";\n        self.parse();\n      }\n      // If we've flushed, parsed, and we're still on the INITIAL state then\n      // that means we don't have enough of the stream to parse the first\n      // line.\n      if (self.state === \"INITIAL\") {\n        throw new ParsingError(ParsingError.Errors.BadSignature);\n      }\n    } catch(e) {\n      self.reportOrThrowError(e);\n    }\n    self.onflush && self.onflush();\n    return this;\n  }\n};\n\nmodule.exports = WebVTT;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvanMtdnR0LmpzQDAuMTIuNkB2aWRlb2pzLXZ0dC5qcy9saWIvdnR0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlb2pzLXZ0dC5qc0AwLjEyLjZAdmlkZW9qcy12dHQuanMvbGliL3Z0dC5qcz83MTYxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMgdnR0LmpzIENvbnRyaWJ1dG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogLSotIE1vZGU6IEphdmE7IHRhYi13aWR0aDogMjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjLWJhc2ljLW9mZnNldDogMiAtKi0gKi9cbi8qIHZpbTogc2V0IHNoaWZ0d2lkdGg9MiB0YWJzdG9wPTIgYXV0b2luZGVudCBjaW5kZW50IGV4cGFuZHRhYjogKi9cbnZhciBfb2JqQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIEYoKSB7fVxuICByZXR1cm4gZnVuY3Rpb24obykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09iamVjdC5jcmVhdGUgc2hpbSBvbmx5IGFjY2VwdHMgb25lIHBhcmFtZXRlci4nKTtcbiAgICB9XG4gICAgRi5wcm90b3R5cGUgPSBvO1xuICAgIHJldHVybiBuZXcgRigpO1xuICB9O1xufSkoKTtcblxuLy8gQ3JlYXRlcyBhIG5ldyBQYXJzZXJFcnJvciBvYmplY3QgZnJvbSBhbiBlcnJvckRhdGEgb2JqZWN0LiBUaGUgZXJyb3JEYXRhXG4vLyBvYmplY3Qgc2hvdWxkIGhhdmUgZGVmYXVsdCBjb2RlIGFuZCBtZXNzYWdlIHByb3BlcnRpZXMuIFRoZSBkZWZhdWx0IG1lc3NhZ2Vcbi8vIHByb3BlcnR5IGNhbiBiZSBvdmVycmlkZW4gYnkgcGFzc2luZyBpbiBhIG1lc3NhZ2UgcGFyYW1ldGVyLlxuLy8gU2VlIFBhcnNpbmdFcnJvci5FcnJvcnMgYmVsb3cgZm9yIGFjY2VwdGFibGUgZXJyb3JzLlxuZnVuY3Rpb24gUGFyc2luZ0Vycm9yKGVycm9yRGF0YSwgbWVzc2FnZSkge1xuICB0aGlzLm5hbWUgPSBcIlBhcnNpbmdFcnJvclwiO1xuICB0aGlzLmNvZGUgPSBlcnJvckRhdGEuY29kZTtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCBlcnJvckRhdGEubWVzc2FnZTtcbn1cblBhcnNpbmdFcnJvci5wcm90b3R5cGUgPSBfb2JqQ3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5QYXJzaW5nRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyc2luZ0Vycm9yO1xuXG4vLyBQYXJzaW5nRXJyb3IgbWV0YWRhdGEgZm9yIGFjY2VwdGFibGUgUGFyc2luZ0Vycm9ycy5cblBhcnNpbmdFcnJvci5FcnJvcnMgPSB7XG4gIEJhZFNpZ25hdHVyZToge1xuICAgIGNvZGU6IDAsXG4gICAgbWVzc2FnZTogXCJNYWxmb3JtZWQgV2ViVlRUIHNpZ25hdHVyZS5cIlxuICB9LFxuICBCYWRUaW1lU3RhbXA6IHtcbiAgICBjb2RlOiAxLFxuICAgIG1lc3NhZ2U6IFwiTWFsZm9ybWVkIHRpbWUgc3RhbXAuXCJcbiAgfVxufTtcblxuLy8gVHJ5IHRvIHBhcnNlIGlucHV0IGFzIGEgdGltZSBzdGFtcC5cbmZ1bmN0aW9uIHBhcnNlVGltZVN0YW1wKGlucHV0KSB7XG5cbiAgZnVuY3Rpb24gY29tcHV0ZVNlY29uZHMoaCwgbSwgcywgZikge1xuICAgIHJldHVybiAoaCB8IDApICogMzYwMCArIChtIHwgMCkgKiA2MCArIChzIHwgMCkgKyAoZiB8IDApIC8gMTAwMDtcbiAgfVxuXG4gIHZhciBtID0gaW5wdXQubWF0Y2goL14oXFxkKyk6KFxcZHsyfSkoOlxcZHsyfSk/XFwuKFxcZHszfSkvKTtcbiAgaWYgKCFtKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobVszXSkge1xuICAgIC8vIFRpbWVzdGFtcCB0YWtlcyB0aGUgZm9ybSBvZiBbaG91cnNdOlttaW51dGVzXTpbc2Vjb25kc10uW21pbGxpc2Vjb25kc11cbiAgICByZXR1cm4gY29tcHV0ZVNlY29uZHMobVsxXSwgbVsyXSwgbVszXS5yZXBsYWNlKFwiOlwiLCBcIlwiKSwgbVs0XSk7XG4gIH0gZWxzZSBpZiAobVsxXSA+IDU5KSB7XG4gICAgLy8gVGltZXN0YW1wIHRha2VzIHRoZSBmb3JtIG9mIFtob3Vyc106W21pbnV0ZXNdLlttaWxsaXNlY29uZHNdXG4gICAgLy8gRmlyc3QgcG9zaXRpb24gaXMgaG91cnMgYXMgaXQncyBvdmVyIDU5LlxuICAgIHJldHVybiBjb21wdXRlU2Vjb25kcyhtWzFdLCBtWzJdLCAwLCAgbVs0XSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGltZXN0YW1wIHRha2VzIHRoZSBmb3JtIG9mIFttaW51dGVzXTpbc2Vjb25kc10uW21pbGxpc2Vjb25kc11cbiAgICByZXR1cm4gY29tcHV0ZVNlY29uZHMoMCwgbVsxXSwgbVsyXSwgbVs0XSk7XG4gIH1cbn1cblxuLy8gQSBzZXR0aW5ncyBvYmplY3QgaG9sZHMga2V5L3ZhbHVlIHBhaXJzIGFuZCB3aWxsIGlnbm9yZSBhbnl0aGluZyBidXQgdGhlIGZpcnN0XG4vLyBhc3NpZ25tZW50IHRvIGEgc3BlY2lmaWMga2V5LlxuZnVuY3Rpb24gU2V0dGluZ3MoKSB7XG4gIHRoaXMudmFsdWVzID0gX29iakNyZWF0ZShudWxsKTtcbn1cblxuU2V0dGluZ3MucHJvdG90eXBlID0ge1xuICAvLyBPbmx5IGFjY2VwdCB0aGUgZmlyc3QgYXNzaWdubWVudCB0byBhbnkga2V5LlxuICBzZXQ6IGZ1bmN0aW9uKGssIHYpIHtcbiAgICBpZiAoIXRoaXMuZ2V0KGspICYmIHYgIT09IFwiXCIpIHtcbiAgICAgIHRoaXMudmFsdWVzW2tdID0gdjtcbiAgICB9XG4gIH0sXG4gIC8vIFJldHVybiB0aGUgdmFsdWUgZm9yIGEga2V5LCBvciBhIGRlZmF1bHQgdmFsdWUuXG4gIC8vIElmICdkZWZhdWx0S2V5JyBpcyBwYXNzZWQgdGhlbiAnZGZsdCcgaXMgYXNzdW1lZCB0byBiZSBhbiBvYmplY3Qgd2l0aFxuICAvLyBhIG51bWJlciBvZiBwb3NzaWJsZSBkZWZhdWx0IHZhbHVlcyBhcyBwcm9wZXJ0aWVzIHdoZXJlICdkZWZhdWx0S2V5JyBpc1xuICAvLyB0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgY2hvc2VuOyBvdGhlcndpc2UgaXQncyBhc3N1bWVkIHRvIGJlXG4gIC8vIGEgc2luZ2xlIHZhbHVlLlxuICBnZXQ6IGZ1bmN0aW9uKGssIGRmbHQsIGRlZmF1bHRLZXkpIHtcbiAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKGspID8gdGhpcy52YWx1ZXNba10gOiBkZmx0W2RlZmF1bHRLZXldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYXMoaykgPyB0aGlzLnZhbHVlc1trXSA6IGRmbHQ7XG4gIH0sXG4gIC8vIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHZhbHVlIGZvciBhIGtleS5cbiAgaGFzOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgaW4gdGhpcy52YWx1ZXM7XG4gIH0sXG4gIC8vIEFjY2VwdCBhIHNldHRpbmcgaWYgaXRzIG9uZSBvZiB0aGUgZ2l2ZW4gYWx0ZXJuYXRpdmVzLlxuICBhbHQ6IGZ1bmN0aW9uKGssIHYsIGEpIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IGEubGVuZ3RoOyArK24pIHtcbiAgICAgIGlmICh2ID09PSBhW25dKSB7XG4gICAgICAgIHRoaXMuc2V0KGssIHYpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vIEFjY2VwdCBhIHNldHRpbmcgaWYgaXRzIGEgdmFsaWQgKHNpZ25lZCkgaW50ZWdlci5cbiAgaW50ZWdlcjogZnVuY3Rpb24oaywgdikge1xuICAgIGlmICgvXi0/XFxkKyQvLnRlc3QodikpIHsgLy8gaW50ZWdlclxuICAgICAgdGhpcy5zZXQoaywgcGFyc2VJbnQodiwgMTApKTtcbiAgICB9XG4gIH0sXG4gIC8vIEFjY2VwdCBhIHNldHRpbmcgaWYgaXRzIGEgdmFsaWQgcGVyY2VudGFnZS5cbiAgcGVyY2VudDogZnVuY3Rpb24oaywgdikge1xuICAgIHZhciBtO1xuICAgIGlmICgobSA9IHYubWF0Y2goL14oW1xcZF17MSwzfSkoXFwuW1xcZF0qKT8lJC8pKSkge1xuICAgICAgdiA9IHBhcnNlRmxvYXQodik7XG4gICAgICBpZiAodiA+PSAwICYmIHYgPD0gMTAwKSB7XG4gICAgICAgIHRoaXMuc2V0KGssIHYpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gcGFyc2UgaW5wdXQgaW50byBncm91cHMgc2VwYXJhdGVkIGJ5ICdncm91cERlbGltJywgYW5kXG4vLyBpbnRlcnByZXRlIGVhY2ggZ3JvdXAgYXMgYSBrZXkvdmFsdWUgcGFpciBzZXBhcmF0ZWQgYnkgJ2tleVZhbHVlRGVsaW0nLlxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKGlucHV0LCBjYWxsYmFjaywga2V5VmFsdWVEZWxpbSwgZ3JvdXBEZWxpbSkge1xuICB2YXIgZ3JvdXBzID0gZ3JvdXBEZWxpbSA/IGlucHV0LnNwbGl0KGdyb3VwRGVsaW0pIDogW2lucHV0XTtcbiAgZm9yICh2YXIgaSBpbiBncm91cHMpIHtcbiAgICBpZiAodHlwZW9mIGdyb3Vwc1tpXSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBrdiA9IGdyb3Vwc1tpXS5zcGxpdChrZXlWYWx1ZURlbGltKTtcbiAgICBpZiAoa3YubGVuZ3RoICE9PSAyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGsgPSBrdlswXTtcbiAgICB2YXIgdiA9IGt2WzFdO1xuICAgIGNhbGxiYWNrKGssIHYpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3VlKGlucHV0LCBjdWUsIHJlZ2lvbkxpc3QpIHtcbiAgLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIGlucHV0IGlmIHdlIG5lZWQgdG8gdGhyb3cgYW4gZXJyb3IuXG4gIHZhciBvSW5wdXQgPSBpbnB1dDtcbiAgLy8gNC4xIFdlYlZUVCB0aW1lc3RhbXBcbiAgZnVuY3Rpb24gY29uc3VtZVRpbWVTdGFtcCgpIHtcbiAgICB2YXIgdHMgPSBwYXJzZVRpbWVTdGFtcChpbnB1dCk7XG4gICAgaWYgKHRzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2luZ0Vycm9yKFBhcnNpbmdFcnJvci5FcnJvcnMuQmFkVGltZVN0YW1wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTWFsZm9ybWVkIHRpbWVzdGFtcDogXCIgKyBvSW5wdXQpO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgdGltZSBzdGFtcCBmcm9tIGlucHV0LlxuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvXlteXFxzYS16QS1aLV0rLywgXCJcIik7XG4gICAgcmV0dXJuIHRzO1xuICB9XG5cbiAgLy8gNC40LjIgV2ViVlRUIGN1ZSBzZXR0aW5nc1xuICBmdW5jdGlvbiBjb25zdW1lQ3VlU2V0dGluZ3MoaW5wdXQsIGN1ZSkge1xuICAgIHZhciBzZXR0aW5ncyA9IG5ldyBTZXR0aW5ncygpO1xuXG4gICAgcGFyc2VPcHRpb25zKGlucHV0LCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgc3dpdGNoIChrKSB7XG4gICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgIC8vIEZpbmQgdGhlIGxhc3QgcmVnaW9uIHdlIHBhcnNlZCB3aXRoIHRoZSBzYW1lIHJlZ2lvbiBpZC5cbiAgICAgICAgZm9yICh2YXIgaSA9IHJlZ2lvbkxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAocmVnaW9uTGlzdFtpXS5pZCA9PT0gdikge1xuICAgICAgICAgICAgc2V0dGluZ3Muc2V0KGssIHJlZ2lvbkxpc3RbaV0ucmVnaW9uKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ2ZXJ0aWNhbFwiOlxuICAgICAgICBzZXR0aW5ncy5hbHQoaywgdiwgW1wicmxcIiwgXCJsclwiXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgICAgdmFyIHZhbHMgPSB2LnNwbGl0KFwiLFwiKSxcbiAgICAgICAgICAgIHZhbHMwID0gdmFsc1swXTtcbiAgICAgICAgc2V0dGluZ3MuaW50ZWdlcihrLCB2YWxzMCk7XG4gICAgICAgIHNldHRpbmdzLnBlcmNlbnQoaywgdmFsczApID8gc2V0dGluZ3Muc2V0KFwic25hcFRvTGluZXNcIiwgZmFsc2UpIDogbnVsbDtcbiAgICAgICAgc2V0dGluZ3MuYWx0KGssIHZhbHMwLCBbXCJhdXRvXCJdKTtcbiAgICAgICAgaWYgKHZhbHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgc2V0dGluZ3MuYWx0KFwibGluZUFsaWduXCIsIHZhbHNbMV0sIFtcInN0YXJ0XCIsIFwibWlkZGxlXCIsIFwiZW5kXCJdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwb3NpdGlvblwiOlxuICAgICAgICB2YWxzID0gdi5zcGxpdChcIixcIik7XG4gICAgICAgIHNldHRpbmdzLnBlcmNlbnQoaywgdmFsc1swXSk7XG4gICAgICAgIGlmICh2YWxzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHNldHRpbmdzLmFsdChcInBvc2l0aW9uQWxpZ25cIiwgdmFsc1sxXSwgW1wic3RhcnRcIiwgXCJtaWRkbGVcIiwgXCJlbmRcIl0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNpemVcIjpcbiAgICAgICAgc2V0dGluZ3MucGVyY2VudChrLCB2KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYWxpZ25cIjpcbiAgICAgICAgc2V0dGluZ3MuYWx0KGssIHYsIFtcInN0YXJ0XCIsIFwibWlkZGxlXCIsIFwiZW5kXCIsIFwibGVmdFwiLCBcInJpZ2h0XCJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSwgLzovLCAvXFxzLyk7XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0IHZhbHVlcyBmb3IgYW55IG1pc3NpbmcgZmllbGRzLlxuICAgIGN1ZS5yZWdpb24gPSBzZXR0aW5ncy5nZXQoXCJyZWdpb25cIiwgbnVsbCk7XG4gICAgY3VlLnZlcnRpY2FsID0gc2V0dGluZ3MuZ2V0KFwidmVydGljYWxcIiwgXCJcIik7XG4gICAgY3VlLmxpbmUgPSBzZXR0aW5ncy5nZXQoXCJsaW5lXCIsIFwiYXV0b1wiKTtcbiAgICBjdWUubGluZUFsaWduID0gc2V0dGluZ3MuZ2V0KFwibGluZUFsaWduXCIsIFwic3RhcnRcIik7XG4gICAgY3VlLnNuYXBUb0xpbmVzID0gc2V0dGluZ3MuZ2V0KFwic25hcFRvTGluZXNcIiwgdHJ1ZSk7XG4gICAgY3VlLnNpemUgPSBzZXR0aW5ncy5nZXQoXCJzaXplXCIsIDEwMCk7XG4gICAgY3VlLmFsaWduID0gc2V0dGluZ3MuZ2V0KFwiYWxpZ25cIiwgXCJtaWRkbGVcIik7XG4gICAgY3VlLnBvc2l0aW9uID0gc2V0dGluZ3MuZ2V0KFwicG9zaXRpb25cIiwge1xuICAgICAgc3RhcnQ6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgbWlkZGxlOiA1MCxcbiAgICAgIGVuZDogMTAwLFxuICAgICAgcmlnaHQ6IDEwMFxuICAgIH0sIGN1ZS5hbGlnbik7XG4gICAgY3VlLnBvc2l0aW9uQWxpZ24gPSBzZXR0aW5ncy5nZXQoXCJwb3NpdGlvbkFsaWduXCIsIHtcbiAgICAgIHN0YXJ0OiBcInN0YXJ0XCIsXG4gICAgICBsZWZ0OiBcInN0YXJ0XCIsXG4gICAgICBtaWRkbGU6IFwibWlkZGxlXCIsXG4gICAgICBlbmQ6IFwiZW5kXCIsXG4gICAgICByaWdodDogXCJlbmRcIlxuICAgIH0sIGN1ZS5hbGlnbik7XG4gIH1cblxuICBmdW5jdGlvbiBza2lwV2hpdGVzcGFjZSgpIHtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL15cXHMrLywgXCJcIik7XG4gIH1cblxuICAvLyA0LjEgV2ViVlRUIGN1ZSB0aW1pbmdzLlxuICBza2lwV2hpdGVzcGFjZSgpO1xuICBjdWUuc3RhcnRUaW1lID0gY29uc3VtZVRpbWVTdGFtcCgpOyAgIC8vICgxKSBjb2xsZWN0IGN1ZSBzdGFydCB0aW1lXG4gIHNraXBXaGl0ZXNwYWNlKCk7XG4gIGlmIChpbnB1dC5zdWJzdHIoMCwgMykgIT09IFwiLS0+XCIpIHsgICAgIC8vICgzKSBuZXh0IGNoYXJhY3RlcnMgbXVzdCBtYXRjaCBcIi0tPlwiXG4gICAgdGhyb3cgbmV3IFBhcnNpbmdFcnJvcihQYXJzaW5nRXJyb3IuRXJyb3JzLkJhZFRpbWVTdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTWFsZm9ybWVkIHRpbWUgc3RhbXAgKHRpbWUgc3RhbXBzIG11c3QgYmUgc2VwYXJhdGVkIGJ5ICctLT4nKTogXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgb0lucHV0KTtcbiAgfVxuICBpbnB1dCA9IGlucHV0LnN1YnN0cigzKTtcbiAgc2tpcFdoaXRlc3BhY2UoKTtcbiAgY3VlLmVuZFRpbWUgPSBjb25zdW1lVGltZVN0YW1wKCk7ICAgICAvLyAoNSkgY29sbGVjdCBjdWUgZW5kIHRpbWVcblxuICAvLyA0LjEgV2ViVlRUIGN1ZSBzZXR0aW5ncyBsaXN0LlxuICBza2lwV2hpdGVzcGFjZSgpO1xuICBjb25zdW1lQ3VlU2V0dGluZ3MoaW5wdXQsIGN1ZSk7XG59XG5cbnZhciBFU0NBUEUgPSB7XG4gIFwiJmFtcDtcIjogXCImXCIsXG4gIFwiJmx0O1wiOiBcIjxcIixcbiAgXCImZ3Q7XCI6IFwiPlwiLFxuICBcIiZscm07XCI6IFwiXFx1MjAwZVwiLFxuICBcIiZybG07XCI6IFwiXFx1MjAwZlwiLFxuICBcIiZuYnNwO1wiOiBcIlxcdTAwYTBcIlxufTtcblxudmFyIFRBR19OQU1FID0ge1xuICBjOiBcInNwYW5cIixcbiAgaTogXCJpXCIsXG4gIGI6IFwiYlwiLFxuICB1OiBcInVcIixcbiAgcnVieTogXCJydWJ5XCIsXG4gIHJ0OiBcInJ0XCIsXG4gIHY6IFwic3BhblwiLFxuICBsYW5nOiBcInNwYW5cIlxufTtcblxudmFyIFRBR19BTk5PVEFUSU9OID0ge1xuICB2OiBcInRpdGxlXCIsXG4gIGxhbmc6IFwibGFuZ1wiXG59O1xuXG52YXIgTkVFRFNfUEFSRU5UID0ge1xuICBydDogXCJydWJ5XCJcbn07XG5cbi8vIFBhcnNlIGNvbnRlbnQgaW50byBhIGRvY3VtZW50IGZyYWdtZW50LlxuZnVuY3Rpb24gcGFyc2VDb250ZW50KHdpbmRvdywgaW5wdXQpIHtcbiAgZnVuY3Rpb24gbmV4dFRva2VuKCkge1xuICAgIC8vIENoZWNrIGZvciBlbmQtb2Ytc3RyaW5nLlxuICAgIGlmICghaW5wdXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENvbnN1bWUgJ24nIGNoYXJhY3RlcnMgZnJvbSB0aGUgaW5wdXQuXG4gICAgZnVuY3Rpb24gY29uc3VtZShyZXN1bHQpIHtcbiAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyKHJlc3VsdC5sZW5ndGgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgbSA9IGlucHV0Lm1hdGNoKC9eKFtePF0qKSg8W14+XSo+Pyk/Lyk7XG4gICAgLy8gSWYgdGhlcmUgaXMgc29tZSB0ZXh0IGJlZm9yZSB0aGUgbmV4dCB0YWcsIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVyblxuICAgIC8vIHRoZSB0YWcuXG4gICAgcmV0dXJuIGNvbnN1bWUobVsxXSA/IG1bMV0gOiBtWzJdKTtcbiAgfVxuXG4gIC8vIFVuZXNjYXBlIGEgc3RyaW5nICdzJy5cbiAgZnVuY3Rpb24gdW5lc2NhcGUxKGUpIHtcbiAgICByZXR1cm4gRVNDQVBFW2VdO1xuICB9XG4gIGZ1bmN0aW9uIHVuZXNjYXBlKHMpIHtcbiAgICB3aGlsZSAoKG0gPSBzLm1hdGNoKC8mKGFtcHxsdHxndHxscm18cmxtfG5ic3ApOy8pKSkge1xuICAgICAgcyA9IHMucmVwbGFjZShtWzBdLCB1bmVzY2FwZTEpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEFkZChjdXJyZW50LCBlbGVtZW50KSB7XG4gICAgcmV0dXJuICFORUVEU19QQVJFTlRbZWxlbWVudC5sb2NhbE5hbWVdIHx8XG4gICAgICAgICAgIE5FRURTX1BBUkVOVFtlbGVtZW50LmxvY2FsTmFtZV0gPT09IGN1cnJlbnQubG9jYWxOYW1lO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGFuIGVsZW1lbnQgZm9yIHRoaXMgdGFnLlxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGFubm90YXRpb24pIHtcbiAgICB2YXIgdGFnTmFtZSA9IFRBR19OQU1FW3R5cGVdO1xuICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBlbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgZWxlbWVudC5sb2NhbE5hbWUgPSB0YWdOYW1lO1xuICAgIHZhciBuYW1lID0gVEFHX0FOTk9UQVRJT05bdHlwZV07XG4gICAgaWYgKG5hbWUgJiYgYW5ub3RhdGlvbikge1xuICAgICAgZWxlbWVudFtuYW1lXSA9IGFubm90YXRpb24udHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHZhciByb290RGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICBjdXJyZW50ID0gcm9vdERpdixcbiAgICAgIHQsXG4gICAgICB0YWdTdGFjayA9IFtdO1xuXG4gIHdoaWxlICgodCA9IG5leHRUb2tlbigpKSAhPT0gbnVsbCkge1xuICAgIGlmICh0WzBdID09PSAnPCcpIHtcbiAgICAgIGlmICh0WzFdID09PSBcIi9cIikge1xuICAgICAgICAvLyBJZiB0aGUgY2xvc2luZyB0YWcgbWF0Y2hlcywgbW92ZSBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKHRhZ1N0YWNrLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGFnU3RhY2tbdGFnU3RhY2subGVuZ3RoIC0gMV0gPT09IHQuc3Vic3RyKDIpLnJlcGxhY2UoXCI+XCIsIFwiXCIpKSB7XG4gICAgICAgICAgdGFnU3RhY2sucG9wKCk7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UganVzdCBpZ25vcmUgdGhlIGVuZCB0YWcuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHRzID0gcGFyc2VUaW1lU3RhbXAodC5zdWJzdHIoMSwgdC5sZW5ndGggLSAyKSk7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIGlmICh0cykge1xuICAgICAgICAvLyBUaW1lc3RhbXBzIGFyZSBsZWFkIG5vZGVzIGFzIHdlbGwuXG4gICAgICAgIG5vZGUgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFwidGltZXN0YW1wXCIsIHRzKTtcbiAgICAgICAgY3VycmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbSA9IHQubWF0Y2goL148KFteLlxccy8wLTk+XSspKFxcLlteXFxzXFxcXD5dKyk/KFtePlxcXFxdKyk/KFxcXFw/KT4/JC8pO1xuICAgICAgLy8gSWYgd2UgY2FuJ3QgcGFyc2UgdGhlIHRhZywgc2tpcCB0byB0aGUgbmV4dCB0YWcuXG4gICAgICBpZiAoIW0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBUcnkgdG8gY29uc3RydWN0IGFuIGVsZW1lbnQsIGFuZCBpZ25vcmUgdGhlIHRhZyBpZiB3ZSBjb3VsZG4ndC5cbiAgICAgIG5vZGUgPSBjcmVhdGVFbGVtZW50KG1bMV0sIG1bM10pO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSB0YWcgc2hvdWxkIGJlIGFkZGVkIGJhc2VkIG9uIHRoZSBjb250ZXh0IG9mIHdoZXJlIGl0XG4gICAgICAvLyBpcyBwbGFjZWQgaW4gdGhlIGN1ZXRleHQuXG4gICAgICBpZiAoIXNob3VsZEFkZChjdXJyZW50LCBub2RlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFNldCB0aGUgY2xhc3MgbGlzdCAoYXMgYSBsaXN0IG9mIGNsYXNzZXMsIHNlcGFyYXRlZCBieSBzcGFjZSkuXG4gICAgICBpZiAobVsyXSkge1xuICAgICAgICBub2RlLmNsYXNzTmFtZSA9IG1bMl0uc3Vic3RyKDEpLnJlcGxhY2UoJy4nLCAnICcpO1xuICAgICAgfVxuICAgICAgLy8gQXBwZW5kIHRoZSBub2RlIHRvIHRoZSBjdXJyZW50IG5vZGUsIGFuZCBlbnRlciB0aGUgc2NvcGUgb2YgdGhlIG5ld1xuICAgICAgLy8gbm9kZS5cbiAgICAgIHRhZ1N0YWNrLnB1c2gobVsxXSk7XG4gICAgICBjdXJyZW50LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgY3VycmVudCA9IG5vZGU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBUZXh0IG5vZGVzIGFyZSBsZWFmIG5vZGVzLlxuICAgIGN1cnJlbnQuYXBwZW5kQ2hpbGQod2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHVuZXNjYXBlKHQpKSk7XG4gIH1cblxuICByZXR1cm4gcm9vdERpdjtcbn1cblxuLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIHRoZSBVbmljb2RlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGEgc3Ryb25nXG4vLyByaWdodC10by1sZWZ0IGNhdGVnb3J5LiBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCB0aGVzZSBjaGFyYWN0ZXJzIGFyZVxuLy8gd3JpdHRlbiByaWdodC10by1sZWZ0IGZvciBzdXJlLiBJdCB3YXMgZ2VuZXJhdGVkIGJ5IHB1bGxpbmcgYWxsIHRoZSBzdHJvbmdcbi8vIHJpZ2h0LXRvLWxlZnQgY2hhcmFjdGVycyBvdXQgb2YgdGhlIFVuaWNvZGUgZGF0YSB0YWJsZS4gVGhhdCB0YWJsZSBjYW5cbi8vIGZvdW5kIGF0OiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL1VuaWNvZGVEYXRhLnR4dFxudmFyIHN0cm9uZ1JUTFJhbmdlcyA9IFtbMHg1YmUsIDB4NWJlXSwgWzB4NWMwLCAweDVjMF0sIFsweDVjMywgMHg1YzNdLCBbMHg1YzYsIDB4NWM2XSxcbiBbMHg1ZDAsIDB4NWVhXSwgWzB4NWYwLCAweDVmNF0sIFsweDYwOCwgMHg2MDhdLCBbMHg2MGIsIDB4NjBiXSwgWzB4NjBkLCAweDYwZF0sXG4gWzB4NjFiLCAweDYxYl0sIFsweDYxZSwgMHg2NGFdLCBbMHg2NmQsIDB4NjZmXSwgWzB4NjcxLCAweDZkNV0sIFsweDZlNSwgMHg2ZTZdLFxuIFsweDZlZSwgMHg2ZWZdLCBbMHg2ZmEsIDB4NzBkXSwgWzB4NzBmLCAweDcxMF0sIFsweDcxMiwgMHg3MmZdLCBbMHg3NGQsIDB4N2E1XSxcbiBbMHg3YjEsIDB4N2IxXSwgWzB4N2MwLCAweDdlYV0sIFsweDdmNCwgMHg3ZjVdLCBbMHg3ZmEsIDB4N2ZhXSwgWzB4ODAwLCAweDgxNV0sXG4gWzB4ODFhLCAweDgxYV0sIFsweDgyNCwgMHg4MjRdLCBbMHg4MjgsIDB4ODI4XSwgWzB4ODMwLCAweDgzZV0sIFsweDg0MCwgMHg4NThdLFxuIFsweDg1ZSwgMHg4NWVdLCBbMHg4YTAsIDB4OGEwXSwgWzB4OGEyLCAweDhhY10sIFsweDIwMGYsIDB4MjAwZl0sXG4gWzB4ZmIxZCwgMHhmYjFkXSwgWzB4ZmIxZiwgMHhmYjI4XSwgWzB4ZmIyYSwgMHhmYjM2XSwgWzB4ZmIzOCwgMHhmYjNjXSxcbiBbMHhmYjNlLCAweGZiM2VdLCBbMHhmYjQwLCAweGZiNDFdLCBbMHhmYjQzLCAweGZiNDRdLCBbMHhmYjQ2LCAweGZiYzFdLFxuIFsweGZiZDMsIDB4ZmQzZF0sIFsweGZkNTAsIDB4ZmQ4Zl0sIFsweGZkOTIsIDB4ZmRjN10sIFsweGZkZjAsIDB4ZmRmY10sXG4gWzB4ZmU3MCwgMHhmZTc0XSwgWzB4ZmU3NiwgMHhmZWZjXSwgWzB4MTA4MDAsIDB4MTA4MDVdLCBbMHgxMDgwOCwgMHgxMDgwOF0sXG4gWzB4MTA4MGEsIDB4MTA4MzVdLCBbMHgxMDgzNywgMHgxMDgzOF0sIFsweDEwODNjLCAweDEwODNjXSwgWzB4MTA4M2YsIDB4MTA4NTVdLFxuIFsweDEwODU3LCAweDEwODVmXSwgWzB4MTA5MDAsIDB4MTA5MWJdLCBbMHgxMDkyMCwgMHgxMDkzOV0sIFsweDEwOTNmLCAweDEwOTNmXSxcbiBbMHgxMDk4MCwgMHgxMDliN10sIFsweDEwOWJlLCAweDEwOWJmXSwgWzB4MTBhMDAsIDB4MTBhMDBdLCBbMHgxMGExMCwgMHgxMGExM10sXG4gWzB4MTBhMTUsIDB4MTBhMTddLCBbMHgxMGExOSwgMHgxMGEzM10sIFsweDEwYTQwLCAweDEwYTQ3XSwgWzB4MTBhNTAsIDB4MTBhNThdLFxuIFsweDEwYTYwLCAweDEwYTdmXSwgWzB4MTBiMDAsIDB4MTBiMzVdLCBbMHgxMGI0MCwgMHgxMGI1NV0sIFsweDEwYjU4LCAweDEwYjcyXSxcbiBbMHgxMGI3OCwgMHgxMGI3Zl0sIFsweDEwYzAwLCAweDEwYzQ4XSwgWzB4MWVlMDAsIDB4MWVlMDNdLCBbMHgxZWUwNSwgMHgxZWUxZl0sXG4gWzB4MWVlMjEsIDB4MWVlMjJdLCBbMHgxZWUyNCwgMHgxZWUyNF0sIFsweDFlZTI3LCAweDFlZTI3XSwgWzB4MWVlMjksIDB4MWVlMzJdLFxuIFsweDFlZTM0LCAweDFlZTM3XSwgWzB4MWVlMzksIDB4MWVlMzldLCBbMHgxZWUzYiwgMHgxZWUzYl0sIFsweDFlZTQyLCAweDFlZTQyXSxcbiBbMHgxZWU0NywgMHgxZWU0N10sIFsweDFlZTQ5LCAweDFlZTQ5XSwgWzB4MWVlNGIsIDB4MWVlNGJdLCBbMHgxZWU0ZCwgMHgxZWU0Zl0sXG4gWzB4MWVlNTEsIDB4MWVlNTJdLCBbMHgxZWU1NCwgMHgxZWU1NF0sIFsweDFlZTU3LCAweDFlZTU3XSwgWzB4MWVlNTksIDB4MWVlNTldLFxuIFsweDFlZTViLCAweDFlZTViXSwgWzB4MWVlNWQsIDB4MWVlNWRdLCBbMHgxZWU1ZiwgMHgxZWU1Zl0sIFsweDFlZTYxLCAweDFlZTYyXSxcbiBbMHgxZWU2NCwgMHgxZWU2NF0sIFsweDFlZTY3LCAweDFlZTZhXSwgWzB4MWVlNmMsIDB4MWVlNzJdLCBbMHgxZWU3NCwgMHgxZWU3N10sXG4gWzB4MWVlNzksIDB4MWVlN2NdLCBbMHgxZWU3ZSwgMHgxZWU3ZV0sIFsweDFlZTgwLCAweDFlZTg5XSwgWzB4MWVlOGIsIDB4MWVlOWJdLFxuIFsweDFlZWExLCAweDFlZWEzXSwgWzB4MWVlYTUsIDB4MWVlYTldLCBbMHgxZWVhYiwgMHgxZWViYl0sIFsweDEwZmZmZCwgMHgxMGZmZmRdXTtcblxuZnVuY3Rpb24gaXNTdHJvbmdSVExDaGFyKGNoYXJDb2RlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Ryb25nUlRMUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1cnJlbnRSYW5nZSA9IHN0cm9uZ1JUTFJhbmdlc1tpXTtcbiAgICBpZiAoY2hhckNvZGUgPj0gY3VycmVudFJhbmdlWzBdICYmIGNoYXJDb2RlIDw9IGN1cnJlbnRSYW5nZVsxXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVCaWRpKGN1ZURpdikge1xuICB2YXIgbm9kZVN0YWNrID0gW10sXG4gICAgICB0ZXh0ID0gXCJcIixcbiAgICAgIGNoYXJDb2RlO1xuXG4gIGlmICghY3VlRGl2IHx8ICFjdWVEaXYuY2hpbGROb2Rlcykge1xuICAgIHJldHVybiBcImx0clwiO1xuICB9XG5cbiAgZnVuY3Rpb24gcHVzaE5vZGVzKG5vZGVTdGFjaywgbm9kZSkge1xuICAgIGZvciAodmFyIGkgPSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIG5vZGVTdGFjay5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbmV4dFRleHROb2RlKG5vZGVTdGFjaykge1xuICAgIGlmICghbm9kZVN0YWNrIHx8ICFub2RlU3RhY2subGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IG5vZGVTdGFjay5wb3AoKSxcbiAgICAgICAgdGV4dCA9IG5vZGUudGV4dENvbnRlbnQgfHwgbm9kZS5pbm5lclRleHQ7XG4gICAgaWYgKHRleHQpIHtcbiAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIG1hdGNoIGFsbCB1bmljb2RlIHR5cGUgQiBjaGFyYWN0ZXJzIChwYXJhZ3JhcGhcbiAgICAgIC8vIHNlcGFyYXRvciBjaGFyYWN0ZXJzKS4gU2VlIGlzc3VlICMxMTUuXG4gICAgICB2YXIgbSA9IHRleHQubWF0Y2goL14uKihcXG58XFxyKS8pO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgbm9kZVN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICAgIHJldHVybiBtWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGlmIChub2RlLnRhZ05hbWUgPT09IFwicnVieVwiKSB7XG4gICAgICByZXR1cm4gbmV4dFRleHROb2RlKG5vZGVTdGFjayk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkTm9kZXMpIHtcbiAgICAgIHB1c2hOb2Rlcyhub2RlU3RhY2ssIG5vZGUpO1xuICAgICAgcmV0dXJuIG5leHRUZXh0Tm9kZShub2RlU3RhY2spO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hOb2Rlcyhub2RlU3RhY2ssIGN1ZURpdik7XG4gIHdoaWxlICgodGV4dCA9IG5leHRUZXh0Tm9kZShub2RlU3RhY2spKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgY2hhckNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoaXNTdHJvbmdSVExDaGFyKGNoYXJDb2RlKSkge1xuICAgICAgICByZXR1cm4gXCJydGxcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFwibHRyXCI7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVMaW5lUG9zKGN1ZSkge1xuICBpZiAodHlwZW9mIGN1ZS5saW5lID09PSBcIm51bWJlclwiICYmXG4gICAgICAoY3VlLnNuYXBUb0xpbmVzIHx8IChjdWUubGluZSA+PSAwICYmIGN1ZS5saW5lIDw9IDEwMCkpKSB7XG4gICAgcmV0dXJuIGN1ZS5saW5lO1xuICB9XG4gIGlmICghY3VlLnRyYWNrIHx8ICFjdWUudHJhY2sudGV4dFRyYWNrTGlzdCB8fFxuICAgICAgIWN1ZS50cmFjay50ZXh0VHJhY2tMaXN0Lm1lZGlhRWxlbWVudCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICB2YXIgdHJhY2sgPSBjdWUudHJhY2ssXG4gICAgICB0cmFja0xpc3QgPSB0cmFjay50ZXh0VHJhY2tMaXN0LFxuICAgICAgY291bnQgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrTGlzdC5sZW5ndGggJiYgdHJhY2tMaXN0W2ldICE9PSB0cmFjazsgaSsrKSB7XG4gICAgaWYgKHRyYWNrTGlzdFtpXS5tb2RlID09PSBcInNob3dpbmdcIikge1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICsrY291bnQgKiAtMTtcbn1cblxuZnVuY3Rpb24gU3R5bGVCb3goKSB7XG59XG5cbi8vIEFwcGx5IHN0eWxlcyB0byBhIGRpdi4gSWYgdGhlcmUgaXMgbm8gZGl2IHBhc3NlZCB0aGVuIGl0IGRlZmF1bHRzIHRvIHRoZVxuLy8gZGl2IG9uICd0aGlzJy5cblN0eWxlQm94LnByb3RvdHlwZS5hcHBseVN0eWxlcyA9IGZ1bmN0aW9uKHN0eWxlcywgZGl2KSB7XG4gIGRpdiA9IGRpdiB8fCB0aGlzLmRpdjtcbiAgZm9yICh2YXIgcHJvcCBpbiBzdHlsZXMpIHtcbiAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICBkaXYuc3R5bGVbcHJvcF0gPSBzdHlsZXNbcHJvcF07XG4gICAgfVxuICB9XG59O1xuXG5TdHlsZUJveC5wcm90b3R5cGUuZm9ybWF0U3R5bGUgPSBmdW5jdGlvbih2YWwsIHVuaXQpIHtcbiAgcmV0dXJuIHZhbCA9PT0gMCA/IDAgOiB2YWwgKyB1bml0O1xufTtcblxuLy8gQ29uc3RydWN0cyB0aGUgY29tcHV0ZWQgZGlzcGxheSBzdGF0ZSBvZiB0aGUgY3VlIChhIGRpdikuIFBsYWNlcyB0aGUgZGl2XG4vLyBpbnRvIHRoZSBvdmVybGF5IHdoaWNoIHNob3VsZCBiZSBhIGJsb2NrIGxldmVsIGVsZW1lbnQgKHVzdWFsbHkgYSBkaXYpLlxuZnVuY3Rpb24gQ3VlU3R5bGVCb3god2luZG93LCBjdWUsIHN0eWxlT3B0aW9ucykge1xuICB2YXIgaXNJRTggPSAoL01TSUVcXHM4XFwuMC8pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIHZhciBjb2xvciA9IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAxKVwiO1xuICB2YXIgYmFja2dyb3VuZENvbG9yID0gXCJyZ2JhKDAsIDAsIDAsIDAuOClcIjtcblxuICBpZiAoaXNJRTgpIHtcbiAgICBjb2xvciA9IFwicmdiKDI1NSwgMjU1LCAyNTUpXCI7XG4gICAgYmFja2dyb3VuZENvbG9yID0gXCJyZ2IoMCwgMCwgMClcIjtcbiAgfVxuXG4gIFN0eWxlQm94LmNhbGwodGhpcyk7XG4gIHRoaXMuY3VlID0gY3VlO1xuXG4gIC8vIFBhcnNlIG91ciBjdWUncyB0ZXh0IGludG8gYSBET00gdHJlZSByb290ZWQgYXQgJ2N1ZURpdicuIFRoaXMgZGl2IHdpbGxcbiAgLy8gaGF2ZSBpbmxpbmUgcG9zaXRpb25pbmcgYW5kIHdpbGwgZnVuY3Rpb24gYXMgdGhlIGN1ZSBiYWNrZ3JvdW5kIGJveC5cbiAgdGhpcy5jdWVEaXYgPSBwYXJzZUNvbnRlbnQod2luZG93LCBjdWUudGV4dCk7XG4gIHZhciBzdHlsZXMgPSB7XG4gICAgY29sb3I6IGNvbG9yLFxuICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgbGVmdDogMCxcbiAgICByaWdodDogMCxcbiAgICB0b3A6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lXCJcbiAgfTtcblxuICBpZiAoIWlzSUU4KSB7XG4gICAgc3R5bGVzLndyaXRpbmdNb2RlID0gY3VlLnZlcnRpY2FsID09PSBcIlwiID8gXCJob3Jpem9udGFsLXRiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VlLnZlcnRpY2FsID09PSBcImxyXCIgPyBcInZlcnRpY2FsLWxyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJ2ZXJ0aWNhbC1ybFwiO1xuICAgIHN0eWxlcy51bmljb2RlQmlkaSA9IFwicGxhaW50ZXh0XCI7XG4gIH1cbiAgdGhpcy5hcHBseVN0eWxlcyhzdHlsZXMsIHRoaXMuY3VlRGl2KTtcblxuICAvLyBDcmVhdGUgYW4gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRpdiB0aGF0IHdpbGwgYmUgdXNlZCB0byBwb3NpdGlvbiB0aGUgY3VlXG4gIC8vIGRpdi4gTm90ZSwgYWxsIFdlYlZUVCBjdWUtc2V0dGluZyBhbGlnbm1lbnRzIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBDU1NcbiAgLy8gbWlycm9ycyBvZiB0aGVtIGV4Y2VwdCBcIm1pZGRsZVwiIHdoaWNoIGlzIFwiY2VudGVyXCIgaW4gQ1NTLlxuICB0aGlzLmRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBzdHlsZXMgPSB7XG4gICAgdGV4dEFsaWduOiBjdWUuYWxpZ24gPT09IFwibWlkZGxlXCIgPyBcImNlbnRlclwiIDogY3VlLmFsaWduLFxuICAgIGZvbnQ6IHN0eWxlT3B0aW9ucy5mb250LFxuICAgIHdoaXRlU3BhY2U6IFwicHJlLWxpbmVcIixcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiXG4gIH07XG5cbiAgaWYgKCFpc0lFOCkge1xuICAgIHN0eWxlcy5kaXJlY3Rpb24gPSBkZXRlcm1pbmVCaWRpKHRoaXMuY3VlRGl2KTtcbiAgICBzdHlsZXMud3JpdGluZ01vZGUgPSBjdWUudmVydGljYWwgPT09IFwiXCIgPyBcImhvcml6b250YWwtdGJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdWUudmVydGljYWwgPT09IFwibHJcIiA/IFwidmVydGljYWwtbHJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInZlcnRpY2FsLXJsXCIuXG4gICAgc3R5bGVzdW5pY29kZUJpZGkgPSAgXCJwbGFpbnRleHRcIjtcbiAgfVxuXG4gIHRoaXMuYXBwbHlTdHlsZXMoc3R5bGVzKTtcblxuICB0aGlzLmRpdi5hcHBlbmRDaGlsZCh0aGlzLmN1ZURpdik7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByZWZlcmVuY2UgZWRnZSBvZiB0aGUgdmlld3BvcnQgdG8gdGhlIHRleHRcbiAgLy8gcG9zaXRpb24gb2YgdGhlIGN1ZSBib3guIFRoZSByZWZlcmVuY2UgZWRnZSB3aWxsIGJlIHJlc29sdmVkIGxhdGVyIHdoZW5cbiAgLy8gdGhlIGJveCBvcmllbnRhdGlvbiBzdHlsZXMgYXJlIGFwcGxpZWQuXG4gIHZhciB0ZXh0UG9zID0gMDtcbiAgc3dpdGNoIChjdWUucG9zaXRpb25BbGlnbikge1xuICBjYXNlIFwic3RhcnRcIjpcbiAgICB0ZXh0UG9zID0gY3VlLnBvc2l0aW9uO1xuICAgIGJyZWFrO1xuICBjYXNlIFwibWlkZGxlXCI6XG4gICAgdGV4dFBvcyA9IGN1ZS5wb3NpdGlvbiAtIChjdWUuc2l6ZSAvIDIpO1xuICAgIGJyZWFrO1xuICBjYXNlIFwiZW5kXCI6XG4gICAgdGV4dFBvcyA9IGN1ZS5wb3NpdGlvbiAtIGN1ZS5zaXplO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gSG9yaXpvbnRhbCBib3ggb3JpZW50YXRpb247IHRleHRQb3MgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGVcbiAgLy8gYXJlYSB0byB0aGUgbGVmdCBlZGdlIG9mIHRoZSBib3ggYW5kIGN1ZS5zaXplIGlzIHRoZSBkaXN0YW5jZSBleHRlbmRpbmcgdG9cbiAgLy8gdGhlIHJpZ2h0IGZyb20gdGhlcmUuXG4gIGlmIChjdWUudmVydGljYWwgPT09IFwiXCIpIHtcbiAgICB0aGlzLmFwcGx5U3R5bGVzKHtcbiAgICAgIGxlZnQ6ICB0aGlzLmZvcm1hdFN0eWxlKHRleHRQb3MsIFwiJVwiKSxcbiAgICAgIHdpZHRoOiB0aGlzLmZvcm1hdFN0eWxlKGN1ZS5zaXplLCBcIiVcIilcbiAgICB9KTtcbiAgLy8gVmVydGljYWwgYm94IG9yaWVudGF0aW9uOyB0ZXh0UG9zIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSB0b3AgZWRnZSBvZiB0aGVcbiAgLy8gYXJlYSB0byB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGJveCBhbmQgY3VlLnNpemUgaXMgdGhlIGhlaWdodCBleHRlbmRpbmdcbiAgLy8gZG93bndhcmRzIGZyb20gdGhlcmUuXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hcHBseVN0eWxlcyh7XG4gICAgICB0b3A6IHRoaXMuZm9ybWF0U3R5bGUodGV4dFBvcywgXCIlXCIpLFxuICAgICAgaGVpZ2h0OiB0aGlzLmZvcm1hdFN0eWxlKGN1ZS5zaXplLCBcIiVcIilcbiAgICB9KTtcbiAgfVxuXG4gIHRoaXMubW92ZSA9IGZ1bmN0aW9uKGJveCkge1xuICAgIHRoaXMuYXBwbHlTdHlsZXMoe1xuICAgICAgdG9wOiB0aGlzLmZvcm1hdFN0eWxlKGJveC50b3AsIFwicHhcIiksXG4gICAgICBib3R0b206IHRoaXMuZm9ybWF0U3R5bGUoYm94LmJvdHRvbSwgXCJweFwiKSxcbiAgICAgIGxlZnQ6IHRoaXMuZm9ybWF0U3R5bGUoYm94LmxlZnQsIFwicHhcIiksXG4gICAgICByaWdodDogdGhpcy5mb3JtYXRTdHlsZShib3gucmlnaHQsIFwicHhcIiksXG4gICAgICBoZWlnaHQ6IHRoaXMuZm9ybWF0U3R5bGUoYm94LmhlaWdodCwgXCJweFwiKSxcbiAgICAgIHdpZHRoOiB0aGlzLmZvcm1hdFN0eWxlKGJveC53aWR0aCwgXCJweFwiKVxuICAgIH0pO1xuICB9O1xufVxuQ3VlU3R5bGVCb3gucHJvdG90eXBlID0gX29iakNyZWF0ZShTdHlsZUJveC5wcm90b3R5cGUpO1xuQ3VlU3R5bGVCb3gucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3VlU3R5bGVCb3g7XG5cbi8vIFJlcHJlc2VudHMgdGhlIGNvLW9yZGluYXRlcyBvZiBhbiBFbGVtZW50IGluIGEgd2F5IHRoYXQgd2UgY2FuIGVhc2lseVxuLy8gY29tcHV0ZSB0aGluZ3Mgd2l0aCBzdWNoIGFzIGlmIGl0IG92ZXJsYXBzIG9yIGludGVyc2VjdHMgd2l0aCBhbm90aGVyIEVsZW1lbnQuXG4vLyBDYW4gaW5pdGlhbGl6ZSBpdCB3aXRoIGVpdGhlciBhIFN0eWxlQm94IG9yIGFub3RoZXIgQm94UG9zaXRpb24uXG5mdW5jdGlvbiBCb3hQb3NpdGlvbihvYmopIHtcbiAgdmFyIGlzSUU4ID0gKC9NU0lFXFxzOFxcLjAvKS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4gIC8vIEVpdGhlciBhIEJveFBvc2l0aW9uIHdhcyBwYXNzZWQgaW4gYW5kIHdlIG5lZWQgdG8gY29weSBpdCwgb3IgYSBTdHlsZUJveFxuICAvLyB3YXMgcGFzc2VkIGluIGFuZCB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlc3VsdHMgb2YgJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCdcbiAgLy8gYXMgdGhlIG9iamVjdCByZXR1cm5lZCBpcyByZWFkb25seS4gQWxsIGNvLW9yZGluYXRlIHZhbHVlcyBhcmUgaW4gcmVmZXJlbmNlXG4gIC8vIHRvIHRoZSB2aWV3cG9ydCBvcmlnaW4gKHRvcCBsZWZ0KS5cbiAgdmFyIGxoLCBoZWlnaHQsIHdpZHRoLCB0b3A7XG4gIGlmIChvYmouZGl2KSB7XG4gICAgaGVpZ2h0ID0gb2JqLmRpdi5vZmZzZXRIZWlnaHQ7XG4gICAgd2lkdGggPSBvYmouZGl2Lm9mZnNldFdpZHRoO1xuICAgIHRvcCA9IG9iai5kaXYub2Zmc2V0VG9wO1xuXG4gICAgdmFyIHJlY3RzID0gKHJlY3RzID0gb2JqLmRpdi5jaGlsZE5vZGVzKSAmJiAocmVjdHMgPSByZWN0c1swXSkgJiZcbiAgICAgICAgICAgICAgICByZWN0cy5nZXRDbGllbnRSZWN0cyAmJiByZWN0cy5nZXRDbGllbnRSZWN0cygpO1xuICAgIG9iaiA9IG9iai5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gSW4gY2VydGFpbiBjYXNlcyB0aGUgb3V0dGVyIGRpdiB3aWxsIGJlIHNsaWdodGx5IGxhcmdlciB0aGVuIHRoZSBzdW0gb2ZcbiAgICAvLyB0aGUgaW5uZXIgZGl2J3MgbGluZXMuIFRoaXMgY291bGQgYmUgZHVlIHRvIGJvbGQgdGV4dCwgZXRjLCBvbiBzb21lIHBsYXRmb3Jtcy5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGdldCB0aGUgYXZlcmFnZSBsaW5lIGhlaWdodCBhbmQgdXNlIHRoYXQuIFRoaXMgd2lsbFxuICAgIC8vIHJlc3VsdCBpbiB0aGUgZGVzaXJlZCBiZWhhdmlvdXIuXG4gICAgbGggPSByZWN0cyA/IE1hdGgubWF4KChyZWN0c1swXSAmJiByZWN0c1swXS5oZWlnaHQpIHx8IDAsIG9iai5oZWlnaHQgLyByZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICAgICA6IDA7XG5cbiAgfVxuICB0aGlzLmxlZnQgPSBvYmoubGVmdDtcbiAgdGhpcy5yaWdodCA9IG9iai5yaWdodDtcbiAgdGhpcy50b3AgPSBvYmoudG9wIHx8IHRvcDtcbiAgdGhpcy5oZWlnaHQgPSBvYmouaGVpZ2h0IHx8IGhlaWdodDtcbiAgdGhpcy5ib3R0b20gPSBvYmouYm90dG9tIHx8ICh0b3AgKyAob2JqLmhlaWdodCB8fCBoZWlnaHQpKTtcbiAgdGhpcy53aWR0aCA9IG9iai53aWR0aCB8fCB3aWR0aDtcbiAgdGhpcy5saW5lSGVpZ2h0ID0gbGggIT09IHVuZGVmaW5lZCA/IGxoIDogb2JqLmxpbmVIZWlnaHQ7XG5cbiAgaWYgKGlzSUU4ICYmICF0aGlzLmxpbmVIZWlnaHQpIHtcbiAgICB0aGlzLmxpbmVIZWlnaHQgPSAxMztcbiAgfVxufVxuXG4vLyBNb3ZlIHRoZSBib3ggYWxvbmcgYSBwYXJ0aWN1bGFyIGF4aXMuIE9wdGlvbmFsbHkgcGFzcyBpbiBhbiBhbW91bnQgdG8gbW92ZVxuLy8gdGhlIGJveC4gSWYgbm8gYW1vdW50IGlzIHBhc3NlZCB0aGVuIHRoZSBkZWZhdWx0IGlzIHRoZSBsaW5lIGhlaWdodCBvZiB0aGVcbi8vIGJveC5cbkJveFBvc2l0aW9uLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24oYXhpcywgdG9Nb3ZlKSB7XG4gIHRvTW92ZSA9IHRvTW92ZSAhPT0gdW5kZWZpbmVkID8gdG9Nb3ZlIDogdGhpcy5saW5lSGVpZ2h0O1xuICBzd2l0Y2ggKGF4aXMpIHtcbiAgY2FzZSBcIit4XCI6XG4gICAgdGhpcy5sZWZ0ICs9IHRvTW92ZTtcbiAgICB0aGlzLnJpZ2h0ICs9IHRvTW92ZTtcbiAgICBicmVhaztcbiAgY2FzZSBcIi14XCI6XG4gICAgdGhpcy5sZWZ0IC09IHRvTW92ZTtcbiAgICB0aGlzLnJpZ2h0IC09IHRvTW92ZTtcbiAgICBicmVhaztcbiAgY2FzZSBcIit5XCI6XG4gICAgdGhpcy50b3AgKz0gdG9Nb3ZlO1xuICAgIHRoaXMuYm90dG9tICs9IHRvTW92ZTtcbiAgICBicmVhaztcbiAgY2FzZSBcIi15XCI6XG4gICAgdGhpcy50b3AgLT0gdG9Nb3ZlO1xuICAgIHRoaXMuYm90dG9tIC09IHRvTW92ZTtcbiAgICBicmVhaztcbiAgfVxufTtcblxuLy8gQ2hlY2sgaWYgdGhpcyBib3ggb3ZlcmxhcHMgYW5vdGhlciBib3gsIGIyLlxuQm94UG9zaXRpb24ucHJvdG90eXBlLm92ZXJsYXBzID0gZnVuY3Rpb24oYjIpIHtcbiAgcmV0dXJuIHRoaXMubGVmdCA8IGIyLnJpZ2h0ICYmXG4gICAgICAgICB0aGlzLnJpZ2h0ID4gYjIubGVmdCAmJlxuICAgICAgICAgdGhpcy50b3AgPCBiMi5ib3R0b20gJiZcbiAgICAgICAgIHRoaXMuYm90dG9tID4gYjIudG9wO1xufTtcblxuLy8gQ2hlY2sgaWYgdGhpcyBib3ggb3ZlcmxhcHMgYW55IG90aGVyIGJveGVzIGluIGJveGVzLlxuQm94UG9zaXRpb24ucHJvdG90eXBlLm92ZXJsYXBzQW55ID0gZnVuY3Rpb24oYm94ZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3hlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0aGlzLm92ZXJsYXBzKGJveGVzW2ldKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8vIENoZWNrIGlmIHRoaXMgYm94IGlzIHdpdGhpbiBhbm90aGVyIGJveC5cbkJveFBvc2l0aW9uLnByb3RvdHlwZS53aXRoaW4gPSBmdW5jdGlvbihjb250YWluZXIpIHtcbiAgcmV0dXJuIHRoaXMudG9wID49IGNvbnRhaW5lci50b3AgJiZcbiAgICAgICAgIHRoaXMuYm90dG9tIDw9IGNvbnRhaW5lci5ib3R0b20gJiZcbiAgICAgICAgIHRoaXMubGVmdCA+PSBjb250YWluZXIubGVmdCAmJlxuICAgICAgICAgdGhpcy5yaWdodCA8PSBjb250YWluZXIucmlnaHQ7XG59O1xuXG4vLyBDaGVjayBpZiB0aGlzIGJveCBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGNvbnRhaW5lciBvciBpdCBpcyBvdmVybGFwcGluZ1xuLy8gb24gdGhlIGVkZ2Ugb3Bwb3NpdGUgb2YgdGhlIGF4aXMgZGlyZWN0aW9uIHBhc3NlZC4gRm9yIGV4YW1wbGUsIGlmIFwiK3hcIiBpc1xuLy8gcGFzc2VkIGFuZCB0aGUgYm94IGlzIG92ZXJsYXBwaW5nIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNvbnRhaW5lciwgdGhlblxuLy8gcmV0dXJuIHRydWUuXG5Cb3hQb3NpdGlvbi5wcm90b3R5cGUub3ZlcmxhcHNPcHBvc2l0ZUF4aXMgPSBmdW5jdGlvbihjb250YWluZXIsIGF4aXMpIHtcbiAgc3dpdGNoIChheGlzKSB7XG4gIGNhc2UgXCIreFwiOlxuICAgIHJldHVybiB0aGlzLmxlZnQgPCBjb250YWluZXIubGVmdDtcbiAgY2FzZSBcIi14XCI6XG4gICAgcmV0dXJuIHRoaXMucmlnaHQgPiBjb250YWluZXIucmlnaHQ7XG4gIGNhc2UgXCIreVwiOlxuICAgIHJldHVybiB0aGlzLnRvcCA8IGNvbnRhaW5lci50b3A7XG4gIGNhc2UgXCIteVwiOlxuICAgIHJldHVybiB0aGlzLmJvdHRvbSA+IGNvbnRhaW5lci5ib3R0b207XG4gIH1cbn07XG5cbi8vIEZpbmQgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGFyZWEgdGhhdCB0aGlzIGJveCBpcyBvdmVybGFwcGluZyB3aXRoIGFub3RoZXJcbi8vIGJveC5cbkJveFBvc2l0aW9uLnByb3RvdHlwZS5pbnRlcnNlY3RQZXJjZW50YWdlID0gZnVuY3Rpb24oYjIpIHtcbiAgdmFyIHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnJpZ2h0LCBiMi5yaWdodCkgLSBNYXRoLm1heCh0aGlzLmxlZnQsIGIyLmxlZnQpKSxcbiAgICAgIHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmJvdHRvbSwgYjIuYm90dG9tKSAtIE1hdGgubWF4KHRoaXMudG9wLCBiMi50b3ApKSxcbiAgICAgIGludGVyc2VjdEFyZWEgPSB4ICogeTtcbiAgcmV0dXJuIGludGVyc2VjdEFyZWEgLyAodGhpcy5oZWlnaHQgKiB0aGlzLndpZHRoKTtcbn07XG5cbi8vIENvbnZlcnQgdGhlIHBvc2l0aW9ucyBmcm9tIHRoaXMgYm94IHRvIENTUyBjb21wYXRpYmxlIHBvc2l0aW9ucyB1c2luZ1xuLy8gdGhlIHJlZmVyZW5jZSBjb250YWluZXIncyBwb3NpdGlvbnMuIFRoaXMgaGFzIHRvIGJlIGRvbmUgYmVjYXVzZSB0aGlzXG4vLyBib3gncyBwb3NpdGlvbnMgYXJlIGluIHJlZmVyZW5jZSB0byB0aGUgdmlld3BvcnQgb3JpZ2luLCB3aGVyZWFzLCBDU1Ncbi8vIHZhbHVlcyBhcmUgaW4gcmVmZXJlY25lIHRvIHRoZWlyIHJlc3BlY3RpdmUgZWRnZXMuXG5Cb3hQb3NpdGlvbi5wcm90b3R5cGUudG9DU1NDb21wYXRWYWx1ZXMgPSBmdW5jdGlvbihyZWZlcmVuY2UpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IHRoaXMudG9wIC0gcmVmZXJlbmNlLnRvcCxcbiAgICBib3R0b206IHJlZmVyZW5jZS5ib3R0b20gLSB0aGlzLmJvdHRvbSxcbiAgICBsZWZ0OiB0aGlzLmxlZnQgLSByZWZlcmVuY2UubGVmdCxcbiAgICByaWdodDogcmVmZXJlbmNlLnJpZ2h0IC0gdGhpcy5yaWdodCxcbiAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgIHdpZHRoOiB0aGlzLndpZHRoXG4gIH07XG59O1xuXG4vLyBHZXQgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgYm94J3MgcG9zaXRpb24gd2l0aG91dCBhbnl0aGluZyBleHRyYS5cbi8vIENhbiBwYXNzIGEgU3R5bGVCb3gsIEhUTUxFbGVtZW50LCBvciBhbm90aGVyIEJveFBvc2l0b24uXG5Cb3hQb3NpdGlvbi5nZXRTaW1wbGVCb3hQb3NpdGlvbiA9IGZ1bmN0aW9uKG9iaikge1xuICB2YXIgaGVpZ2h0ID0gb2JqLmRpdiA/IG9iai5kaXYub2Zmc2V0SGVpZ2h0IDogb2JqLnRhZ05hbWUgPyBvYmoub2Zmc2V0SGVpZ2h0IDogMDtcbiAgdmFyIHdpZHRoID0gb2JqLmRpdiA/IG9iai5kaXYub2Zmc2V0V2lkdGggOiBvYmoudGFnTmFtZSA/IG9iai5vZmZzZXRXaWR0aCA6IDA7XG4gIHZhciB0b3AgPSBvYmouZGl2ID8gb2JqLmRpdi5vZmZzZXRUb3AgOiBvYmoudGFnTmFtZSA/IG9iai5vZmZzZXRUb3AgOiAwO1xuXG4gIG9iaiA9IG9iai5kaXYgPyBvYmouZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDpcbiAgICAgICAgICAgICAgICBvYmoudGFnTmFtZSA/IG9iai5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG9iajtcbiAgdmFyIHJldCA9IHtcbiAgICBsZWZ0OiBvYmoubGVmdCxcbiAgICByaWdodDogb2JqLnJpZ2h0LFxuICAgIHRvcDogb2JqLnRvcCB8fCB0b3AsXG4gICAgaGVpZ2h0OiBvYmouaGVpZ2h0IHx8IGhlaWdodCxcbiAgICBib3R0b206IG9iai5ib3R0b20gfHwgKHRvcCArIChvYmouaGVpZ2h0IHx8IGhlaWdodCkpLFxuICAgIHdpZHRoOiBvYmoud2lkdGggfHwgd2lkdGhcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIE1vdmUgYSBTdHlsZUJveCB0byBpdHMgc3BlY2lmaWVkLCBvciBuZXh0IGJlc3QsIHBvc2l0aW9uLiBUaGUgY29udGFpbmVyQm94XG4vLyBpcyB0aGUgYm94IHRoYXQgY29udGFpbnMgdGhlIFN0eWxlQm94LCBzdWNoIGFzIGEgZGl2LiBib3hQb3NpdGlvbnMgYXJlXG4vLyBhIGxpc3Qgb2Ygb3RoZXIgYm94ZXMgdGhhdCB0aGUgc3R5bGVCb3ggY2FuJ3Qgb3ZlcmxhcCB3aXRoLlxuZnVuY3Rpb24gbW92ZUJveFRvTGluZVBvc2l0aW9uKHdpbmRvdywgc3R5bGVCb3gsIGNvbnRhaW5lckJveCwgYm94UG9zaXRpb25zKSB7XG5cbiAgLy8gRmluZCB0aGUgYmVzdCBwb3NpdGlvbiBmb3IgYSBjdWUgYm94LCBiLCBvbiB0aGUgdmlkZW8uIFRoZSBheGlzIHBhcmFtZXRlclxuICAvLyBpcyBhIGxpc3Qgb2YgYXhpcywgdGhlIG9yZGVyIG9mIHdoaWNoLCBpdCB3aWxsIG1vdmUgdGhlIGJveCBhbG9uZy4gRm9yIGV4YW1wbGU6XG4gIC8vIFBhc3NpbmcgW1wiK3hcIiwgXCIteFwiXSB3aWxsIG1vdmUgdGhlIGJveCBmaXJzdCBhbG9uZyB0aGUgeCBheGlzIGluIHRoZSBwb3NpdGl2ZVxuICAvLyBkaXJlY3Rpb24uIElmIGl0IGRvZXNuJ3QgZmluZCBhIGdvb2QgcG9zaXRpb24gZm9yIGl0IHRoZXJlIGl0IHdpbGwgdGhlbiBtb3ZlXG4gIC8vIGl0IGFsb25nIHRoZSB4IGF4aXMgaW4gdGhlIG5lZ2F0aXZlIGRpcmVjdGlvbi5cbiAgZnVuY3Rpb24gZmluZEJlc3RQb3NpdGlvbihiLCBheGlzKSB7XG4gICAgdmFyIGJlc3RQb3NpdGlvbixcbiAgICAgICAgc3BlY2lmaWVkUG9zaXRpb24gPSBuZXcgQm94UG9zaXRpb24oYiksXG4gICAgICAgIHBlcmNlbnRhZ2UgPSAxOyAvLyBIaWdoZXN0IHBvc3NpYmxlIHNvIHRoZSBmaXJzdCB0aGluZyB3ZSBnZXQgaXMgYmV0dGVyLlxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBheGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3aGlsZSAoYi5vdmVybGFwc09wcG9zaXRlQXhpcyhjb250YWluZXJCb3gsIGF4aXNbaV0pIHx8XG4gICAgICAgICAgICAgKGIud2l0aGluKGNvbnRhaW5lckJveCkgJiYgYi5vdmVybGFwc0FueShib3hQb3NpdGlvbnMpKSkge1xuICAgICAgICBiLm1vdmUoYXhpc1tpXSk7XG4gICAgICB9XG4gICAgICAvLyBXZSBmb3VuZCBhIHNwb3Qgd2hlcmUgd2UgYXJlbid0IG92ZXJsYXBwaW5nIGFueXRoaW5nLiBUaGlzIGlzIG91clxuICAgICAgLy8gYmVzdCBwb3NpdGlvbi5cbiAgICAgIGlmIChiLndpdGhpbihjb250YWluZXJCb3gpKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgICAgfVxuICAgICAgdmFyIHAgPSBiLmludGVyc2VjdFBlcmNlbnRhZ2UoY29udGFpbmVyQm94KTtcbiAgICAgIC8vIElmIHdlJ3JlIG91dHNpZGUgdGhlIGNvbnRhaW5lciBib3ggbGVzcyB0aGVuIHdlIHdlcmUgb24gb3VyIGxhc3QgdHJ5XG4gICAgICAvLyB0aGVuIHJlbWVtYmVyIHRoaXMgcG9zaXRpb24gYXMgdGhlIGJlc3QgcG9zaXRpb24uXG4gICAgICBpZiAocGVyY2VudGFnZSA+IHApIHtcbiAgICAgICAgYmVzdFBvc2l0aW9uID0gbmV3IEJveFBvc2l0aW9uKGIpO1xuICAgICAgICBwZXJjZW50YWdlID0gcDtcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IHRoZSBib3ggcG9zaXRpb24gdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi5cbiAgICAgIGIgPSBuZXcgQm94UG9zaXRpb24oc3BlY2lmaWVkUG9zaXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdFBvc2l0aW9uIHx8IHNwZWNpZmllZFBvc2l0aW9uO1xuICB9XG5cbiAgdmFyIGJveFBvc2l0aW9uID0gbmV3IEJveFBvc2l0aW9uKHN0eWxlQm94KSxcbiAgICAgIGN1ZSA9IHN0eWxlQm94LmN1ZSxcbiAgICAgIGxpbmVQb3MgPSBjb21wdXRlTGluZVBvcyhjdWUpLFxuICAgICAgYXhpcyA9IFtdO1xuXG4gIC8vIElmIHdlIGhhdmUgYSBsaW5lIG51bWJlciB0byBhbGlnbiB0aGUgY3VlIHRvLlxuICBpZiAoY3VlLnNuYXBUb0xpbmVzKSB7XG4gICAgdmFyIHNpemU7XG4gICAgc3dpdGNoIChjdWUudmVydGljYWwpIHtcbiAgICBjYXNlIFwiXCI6XG4gICAgICBheGlzID0gWyBcIit5XCIsIFwiLXlcIiBdO1xuICAgICAgc2l6ZSA9IFwiaGVpZ2h0XCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwicmxcIjpcbiAgICAgIGF4aXMgPSBbIFwiK3hcIiwgXCIteFwiIF07XG4gICAgICBzaXplID0gXCJ3aWR0aFwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxyXCI6XG4gICAgICBheGlzID0gWyBcIi14XCIsIFwiK3hcIiBdO1xuICAgICAgc2l6ZSA9IFwid2lkdGhcIjtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBzdGVwID0gYm94UG9zaXRpb24ubGluZUhlaWdodCxcbiAgICAgICAgcG9zaXRpb24gPSBzdGVwICogTWF0aC5yb3VuZChsaW5lUG9zKSxcbiAgICAgICAgbWF4UG9zaXRpb24gPSBjb250YWluZXJCb3hbc2l6ZV0gKyBzdGVwLFxuICAgICAgICBpbml0aWFsQXhpcyA9IGF4aXNbMF07XG5cbiAgICAvLyBJZiB0aGUgc3BlY2lmaWVkIGludGlhbCBwb3NpdGlvbiBpcyBncmVhdGVyIHRoZW4gdGhlIG1heCBwb3NpdGlvbiB0aGVuXG4gICAgLy8gY2xhbXAgdGhlIGJveCB0byB0aGUgYW1vdW50IG9mIHN0ZXBzIGl0IHdvdWxkIHRha2UgZm9yIHRoZSBib3ggdG9cbiAgICAvLyByZWFjaCB0aGUgbWF4IHBvc2l0aW9uLlxuICAgIGlmIChNYXRoLmFicyhwb3NpdGlvbikgPiBtYXhQb3NpdGlvbikge1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA8IDAgPyAtMSA6IDE7XG4gICAgICBwb3NpdGlvbiAqPSBNYXRoLmNlaWwobWF4UG9zaXRpb24gLyBzdGVwKSAqIHN0ZXA7XG4gICAgfVxuXG4gICAgLy8gSWYgY29tcHV0ZWQgbGluZSBwb3NpdGlvbiByZXR1cm5zIG5lZ2F0aXZlIHRoZW4gbGluZSBudW1iZXJzIGFyZVxuICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBib3R0b20gb2YgdGhlIHZpZGVvIGluc3RlYWQgb2YgdGhlIHRvcC4gVGhlcmVmb3JlLCB3ZVxuICAgIC8vIG5lZWQgdG8gaW5jcmVhc2Ugb3VyIGluaXRpYWwgcG9zaXRpb24gYnkgdGhlIGxlbmd0aCBvciB3aWR0aCBvZiB0aGVcbiAgICAvLyB2aWRlbywgZGVwZW5kaW5nIG9uIHRoZSB3cml0aW5nIGRpcmVjdGlvbiwgYW5kIHJldmVyc2Ugb3VyIGF4aXMgZGlyZWN0aW9ucy5cbiAgICBpZiAobGluZVBvcyA8IDApIHtcbiAgICAgIHBvc2l0aW9uICs9IGN1ZS52ZXJ0aWNhbCA9PT0gXCJcIiA/IGNvbnRhaW5lckJveC5oZWlnaHQgOiBjb250YWluZXJCb3gud2lkdGg7XG4gICAgICBheGlzID0gYXhpcy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgLy8gTW92ZSB0aGUgYm94IHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoaXMgbWF5IG5vdCBiZSBpdHMgYmVzdFxuICAgIC8vIHBvc2l0aW9uLlxuICAgIGJveFBvc2l0aW9uLm1vdmUoaW5pdGlhbEF4aXMsIHBvc2l0aW9uKTtcblxuICB9IGVsc2Uge1xuICAgIC8vIElmIHdlIGhhdmUgYSBwZXJjZW50YWdlIGxpbmUgdmFsdWUgZm9yIHRoZSBjdWUuXG4gICAgdmFyIGNhbGN1bGF0ZWRQZXJjZW50YWdlID0gKGJveFBvc2l0aW9uLmxpbmVIZWlnaHQgLyBjb250YWluZXJCb3guaGVpZ2h0KSAqIDEwMDtcblxuICAgIHN3aXRjaCAoY3VlLmxpbmVBbGlnbikge1xuICAgIGNhc2UgXCJtaWRkbGVcIjpcbiAgICAgIGxpbmVQb3MgLT0gKGNhbGN1bGF0ZWRQZXJjZW50YWdlIC8gMik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiZW5kXCI6XG4gICAgICBsaW5lUG9zIC09IGNhbGN1bGF0ZWRQZXJjZW50YWdlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgaW5pdGlhbCBsaW5lIHBvc2l0aW9uIHRvIHRoZSBjdWUgYm94LlxuICAgIHN3aXRjaCAoY3VlLnZlcnRpY2FsKSB7XG4gICAgY2FzZSBcIlwiOlxuICAgICAgc3R5bGVCb3guYXBwbHlTdHlsZXMoe1xuICAgICAgICB0b3A6IHN0eWxlQm94LmZvcm1hdFN0eWxlKGxpbmVQb3MsIFwiJVwiKVxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwicmxcIjpcbiAgICAgIHN0eWxlQm94LmFwcGx5U3R5bGVzKHtcbiAgICAgICAgbGVmdDogc3R5bGVCb3guZm9ybWF0U3R5bGUobGluZVBvcywgXCIlXCIpXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJsclwiOlxuICAgICAgc3R5bGVCb3guYXBwbHlTdHlsZXMoe1xuICAgICAgICByaWdodDogc3R5bGVCb3guZm9ybWF0U3R5bGUobGluZVBvcywgXCIlXCIpXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF4aXMgPSBbIFwiK3lcIiwgXCIteFwiLCBcIit4XCIsIFwiLXlcIiBdO1xuXG4gICAgLy8gR2V0IHRoZSBib3ggcG9zaXRpb24gYWdhaW4gYWZ0ZXIgd2UndmUgYXBwbGllZCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uaW5nXG4gICAgLy8gdG8gaXQuXG4gICAgYm94UG9zaXRpb24gPSBuZXcgQm94UG9zaXRpb24oc3R5bGVCb3gpO1xuICB9XG5cbiAgdmFyIGJlc3RQb3NpdGlvbiA9IGZpbmRCZXN0UG9zaXRpb24oYm94UG9zaXRpb24sIGF4aXMpO1xuICBzdHlsZUJveC5tb3ZlKGJlc3RQb3NpdGlvbi50b0NTU0NvbXBhdFZhbHVlcyhjb250YWluZXJCb3gpKTtcbn1cblxuZnVuY3Rpb24gV2ViVlRUKCkge1xuICAvLyBOb3RoaW5nXG59XG5cbi8vIEhlbHBlciB0byBhbGxvdyBzdHJpbmdzIHRvIGJlIGRlY29kZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBiaW5hcnkgdXRmOCBkYXRhLlxuV2ViVlRULlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtcbiAgICBkZWNvZGU6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciAtIGV4cGVjdGVkIHN0cmluZyBkYXRhLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlVVJJQ29tcG9uZW50KGRhdGEpKTtcbiAgICB9XG4gIH07XG59O1xuXG5XZWJWVFQuY29udmVydEN1ZVRvRE9NVHJlZSA9IGZ1bmN0aW9uKHdpbmRvdywgY3VldGV4dCkge1xuICBpZiAoIXdpbmRvdyB8fCAhY3VldGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBwYXJzZUNvbnRlbnQod2luZG93LCBjdWV0ZXh0KTtcbn07XG5cbnZhciBGT05UX1NJWkVfUEVSQ0VOVCA9IDAuMDU7XG52YXIgRk9OVF9TVFlMRSA9IFwic2Fucy1zZXJpZlwiO1xudmFyIENVRV9CQUNLR1JPVU5EX1BBRERJTkcgPSBcIjEuNSVcIjtcblxuLy8gUnVucyB0aGUgcHJvY2Vzc2luZyBtb2RlbCBvdmVyIHRoZSBjdWVzIGFuZCByZWdpb25zIHBhc3NlZCB0byBpdC5cbi8vIEBwYXJhbSBvdmVybGF5IEEgYmxvY2sgbGV2ZWwgZWxlbWVudCAodXN1YWxseSBhIGRpdikgdGhhdCB0aGUgY29tcHV0ZWQgY3Vlc1xuLy8gICAgICAgICAgICAgICAgYW5kIHJlZ2lvbnMgd2lsbCBiZSBwbGFjZWQgaW50by5cbldlYlZUVC5wcm9jZXNzQ3VlcyA9IGZ1bmN0aW9uKHdpbmRvdywgY3Vlcywgb3ZlcmxheSkge1xuICBpZiAoIXdpbmRvdyB8fCAhY3VlcyB8fCAhb3ZlcmxheSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gUmVtb3ZlIGFsbCBwcmV2aW91cyBjaGlsZHJlbi5cbiAgd2hpbGUgKG92ZXJsYXkuZmlyc3RDaGlsZCkge1xuICAgIG92ZXJsYXkucmVtb3ZlQ2hpbGQob3ZlcmxheS5maXJzdENoaWxkKTtcbiAgfVxuXG4gIHZhciBwYWRkZWRPdmVybGF5ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUubGVmdCA9IFwiMFwiO1xuICBwYWRkZWRPdmVybGF5LnN0eWxlLnJpZ2h0ID0gXCIwXCI7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUudG9wID0gXCIwXCI7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUuYm90dG9tID0gXCIwXCI7XG4gIHBhZGRlZE92ZXJsYXkuc3R5bGUubWFyZ2luID0gQ1VFX0JBQ0tHUk9VTkRfUEFERElORztcbiAgb3ZlcmxheS5hcHBlbmRDaGlsZChwYWRkZWRPdmVybGF5KTtcblxuICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXNwbGF5IHN0YXRlcyBvZiB0aGUgY3Vlcy4gVGhpcyBjb3VsZFxuICAvLyBiZSB0aGUgY2FzZSBpZiBhIGN1ZSdzIHN0YXRlIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY29tcHV0YXRpb24gb3JcbiAgLy8gaWYgaXQgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIHlldC5cbiAgZnVuY3Rpb24gc2hvdWxkQ29tcHV0ZShjdWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY3Vlc1tpXS5oYXNCZWVuUmVzZXQgfHwgIWN1ZXNbaV0uZGlzcGxheVN0YXRlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgY3VlcycgZGlzcGxheSBzdGF0ZXMuIEp1c3QgcmV1c2UgdGhlbS5cbiAgaWYgKCFzaG91bGRDb21wdXRlKGN1ZXMpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYWRkZWRPdmVybGF5LmFwcGVuZENoaWxkKGN1ZXNbaV0uZGlzcGxheVN0YXRlKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGJveFBvc2l0aW9ucyA9IFtdLFxuICAgICAgY29udGFpbmVyQm94ID0gQm94UG9zaXRpb24uZ2V0U2ltcGxlQm94UG9zaXRpb24ocGFkZGVkT3ZlcmxheSksXG4gICAgICBmb250U2l6ZSA9IE1hdGgucm91bmQoY29udGFpbmVyQm94LmhlaWdodCAqIEZPTlRfU0laRV9QRVJDRU5UICogMTAwKSAvIDEwMDtcbiAgdmFyIHN0eWxlT3B0aW9ucyA9IHtcbiAgICBmb250OiBmb250U2l6ZSArIFwicHggXCIgKyBGT05UX1NUWUxFXG4gIH07XG5cbiAgKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHlsZUJveCwgY3VlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdWUgPSBjdWVzW2ldO1xuXG4gICAgICAvLyBDb21wdXRlIHRoZSBpbnRpYWwgcG9zaXRpb24gYW5kIHN0eWxlcyBvZiB0aGUgY3VlIGRpdi5cbiAgICAgIHN0eWxlQm94ID0gbmV3IEN1ZVN0eWxlQm94KHdpbmRvdywgY3VlLCBzdHlsZU9wdGlvbnMpO1xuICAgICAgcGFkZGVkT3ZlcmxheS5hcHBlbmRDaGlsZChzdHlsZUJveC5kaXYpO1xuXG4gICAgICAvLyBNb3ZlIHRoZSBjdWUgZGl2IHRvIGl0J3MgY29ycmVjdCBsaW5lIHBvc2l0aW9uLlxuICAgICAgbW92ZUJveFRvTGluZVBvc2l0aW9uKHdpbmRvdywgc3R5bGVCb3gsIGNvbnRhaW5lckJveCwgYm94UG9zaXRpb25zKTtcblxuICAgICAgLy8gUmVtZW1iZXIgdGhlIGNvbXB1dGVkIGRpdiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmVjb21wdXRlIGl0IGxhdGVyXG4gICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIHRvby5cbiAgICAgIGN1ZS5kaXNwbGF5U3RhdGUgPSBzdHlsZUJveC5kaXY7XG5cbiAgICAgIGJveFBvc2l0aW9ucy5wdXNoKEJveFBvc2l0aW9uLmdldFNpbXBsZUJveFBvc2l0aW9uKHN0eWxlQm94KSk7XG4gICAgfVxuICB9KSgpO1xufTtcblxuV2ViVlRULlBhcnNlciA9IGZ1bmN0aW9uKHdpbmRvdywgdnR0anMsIGRlY29kZXIpIHtcbiAgaWYgKCFkZWNvZGVyKSB7XG4gICAgZGVjb2RlciA9IHZ0dGpzO1xuICAgIHZ0dGpzID0ge307XG4gIH1cbiAgaWYgKCF2dHRqcykge1xuICAgIHZ0dGpzID0ge307XG4gIH1cblxuICB0aGlzLndpbmRvdyA9IHdpbmRvdztcbiAgdGhpcy52dHRqcyA9IHZ0dGpzO1xuICB0aGlzLnN0YXRlID0gXCJJTklUSUFMXCI7XG4gIHRoaXMuYnVmZmVyID0gXCJcIjtcbiAgdGhpcy5kZWNvZGVyID0gZGVjb2RlciB8fCBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuICB0aGlzLnJlZ2lvbkxpc3QgPSBbXTtcbn07XG5cbldlYlZUVC5QYXJzZXIucHJvdG90eXBlID0ge1xuICAvLyBJZiB0aGUgZXJyb3IgaXMgYSBQYXJzaW5nRXJyb3IgdGhlbiByZXBvcnQgaXQgdG8gdGhlIGNvbnN1bWVyIGlmXG4gIC8vIHBvc3NpYmxlLiBJZiBpdCdzIG5vdCBhIFBhcnNpbmdFcnJvciB0aGVuIHRocm93IGl0IGxpa2Ugbm9ybWFsLlxuICByZXBvcnRPclRocm93RXJyb3I6IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgdGhpcy5vbnBhcnNpbmdlcnJvciAmJiB0aGlzLm9ucGFyc2luZ2Vycm9yKGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfSxcbiAgcGFyc2U6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSB0aGVuIHdlIHdvbid0IGRlY29kZSBpdCwgYnV0IHdpbGwganVzdCB0cnkgdG8gcGFyc2VcbiAgICAvLyB3aGF0ZXZlciBpcyBpbiBidWZmZXIgYWxyZWFkeS4gVGhpcyBtYXkgb2NjdXIgaW4gY2lyY3Vtc3RhbmNlcywgZm9yXG4gICAgLy8gZXhhbXBsZSB3aGVuIGZsdXNoKCkgaXMgY2FsbGVkLlxuICAgIGlmIChkYXRhKSB7XG4gICAgICAvLyBUcnkgdG8gZGVjb2RlIHRoZSBkYXRhIHRoYXQgd2UgcmVjZWl2ZWQuXG4gICAgICBzZWxmLmJ1ZmZlciArPSBzZWxmLmRlY29kZXIuZGVjb2RlKGRhdGEsIHtzdHJlYW06IHRydWV9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb2xsZWN0TmV4dExpbmUoKSB7XG4gICAgICB2YXIgYnVmZmVyID0gc2VsZi5idWZmZXI7XG4gICAgICB2YXIgcG9zID0gMDtcbiAgICAgIHdoaWxlIChwb3MgPCBidWZmZXIubGVuZ3RoICYmIGJ1ZmZlcltwb3NdICE9PSAnXFxyJyAmJiBidWZmZXJbcG9zXSAhPT0gJ1xcbicpIHtcbiAgICAgICAgKytwb3M7XG4gICAgICB9XG4gICAgICB2YXIgbGluZSA9IGJ1ZmZlci5zdWJzdHIoMCwgcG9zKTtcbiAgICAgIC8vIEFkdmFuY2UgdGhlIGJ1ZmZlciBlYXJseSBpbiBjYXNlIHdlIGZhaWwgYmVsb3cuXG4gICAgICBpZiAoYnVmZmVyW3Bvc10gPT09ICdcXHInKSB7XG4gICAgICAgICsrcG9zO1xuICAgICAgfVxuICAgICAgaWYgKGJ1ZmZlcltwb3NdID09PSAnXFxuJykge1xuICAgICAgICArK3BvcztcbiAgICAgIH1cbiAgICAgIHNlbGYuYnVmZmVyID0gYnVmZmVyLnN1YnN0cihwb3MpO1xuICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuXG4gICAgLy8gMy40IFdlYlZUVCByZWdpb24gYW5kIFdlYlZUVCByZWdpb24gc2V0dGluZ3Mgc3ludGF4XG4gICAgZnVuY3Rpb24gcGFyc2VSZWdpb24oaW5wdXQpIHtcbiAgICAgIHZhciBzZXR0aW5ncyA9IG5ldyBTZXR0aW5ncygpO1xuXG4gICAgICBwYXJzZU9wdGlvbnMoaW5wdXQsIGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICAgIHN3aXRjaCAoaykge1xuICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICBzZXR0aW5ncy5zZXQoaywgdik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ3aWR0aFwiOlxuICAgICAgICAgIHNldHRpbmdzLnBlcmNlbnQoaywgdik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJsaW5lc1wiOlxuICAgICAgICAgIHNldHRpbmdzLmludGVnZXIoaywgdik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJyZWdpb25hbmNob3JcIjpcbiAgICAgICAgY2FzZSBcInZpZXdwb3J0YW5jaG9yXCI6XG4gICAgICAgICAgdmFyIHh5ID0gdi5zcGxpdCgnLCcpO1xuICAgICAgICAgIGlmICh4eS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXZSBoYXZlIHRvIG1ha2Ugc3VyZSBib3RoIHggYW5kIHkgcGFyc2UsIHNvIHVzZSBhIHRlbXBvcmFyeVxuICAgICAgICAgIC8vIHNldHRpbmdzIG9iamVjdCBoZXJlLlxuICAgICAgICAgIHZhciBhbmNob3IgPSBuZXcgU2V0dGluZ3MoKTtcbiAgICAgICAgICBhbmNob3IucGVyY2VudChcInhcIiwgeHlbMF0pO1xuICAgICAgICAgIGFuY2hvci5wZXJjZW50KFwieVwiLCB4eVsxXSk7XG4gICAgICAgICAgaWYgKCFhbmNob3IuaGFzKFwieFwiKSB8fCAhYW5jaG9yLmhhcyhcInlcIikpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXR0aW5ncy5zZXQoayArIFwiWFwiLCBhbmNob3IuZ2V0KFwieFwiKSk7XG4gICAgICAgICAgc2V0dGluZ3Muc2V0KGsgKyBcIllcIiwgYW5jaG9yLmdldChcInlcIikpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic2Nyb2xsXCI6XG4gICAgICAgICAgc2V0dGluZ3MuYWx0KGssIHYsIFtcInVwXCJdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSwgLz0vLCAvXFxzLyk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgcmVnaW9uLCB1c2luZyBkZWZhdWx0IHZhbHVlcyBmb3IgYW55IHZhbHVlcyB0aGF0IHdlcmUgbm90XG4gICAgICAvLyBzcGVjaWZpZWQuXG4gICAgICBpZiAoc2V0dGluZ3MuaGFzKFwiaWRcIikpIHtcbiAgICAgICAgdmFyIHJlZ2lvbiA9IG5ldyAoc2VsZi52dHRqcy5WVFRSZWdpb24gfHwgc2VsZi53aW5kb3cuVlRUUmVnaW9uKSgpO1xuICAgICAgICByZWdpb24ud2lkdGggPSBzZXR0aW5ncy5nZXQoXCJ3aWR0aFwiLCAxMDApO1xuICAgICAgICByZWdpb24ubGluZXMgPSBzZXR0aW5ncy5nZXQoXCJsaW5lc1wiLCAzKTtcbiAgICAgICAgcmVnaW9uLnJlZ2lvbkFuY2hvclggPSBzZXR0aW5ncy5nZXQoXCJyZWdpb25hbmNob3JYXCIsIDApO1xuICAgICAgICByZWdpb24ucmVnaW9uQW5jaG9yWSA9IHNldHRpbmdzLmdldChcInJlZ2lvbmFuY2hvcllcIiwgMTAwKTtcbiAgICAgICAgcmVnaW9uLnZpZXdwb3J0QW5jaG9yWCA9IHNldHRpbmdzLmdldChcInZpZXdwb3J0YW5jaG9yWFwiLCAwKTtcbiAgICAgICAgcmVnaW9uLnZpZXdwb3J0QW5jaG9yWSA9IHNldHRpbmdzLmdldChcInZpZXdwb3J0YW5jaG9yWVwiLCAxMDApO1xuICAgICAgICByZWdpb24uc2Nyb2xsID0gc2V0dGluZ3MuZ2V0KFwic2Nyb2xsXCIsIFwiXCIpO1xuICAgICAgICAvLyBSZWdpc3RlciB0aGUgcmVnaW9uLlxuICAgICAgICBzZWxmLm9ucmVnaW9uICYmIHNlbGYub25yZWdpb24ocmVnaW9uKTtcbiAgICAgICAgLy8gUmVtZW1iZXIgdGhlIFZUVFJlZ2lvbiBmb3IgbGF0ZXIgaW4gY2FzZSB3ZSBwYXJzZSBhbnkgVlRUQ3VlcyB0aGF0XG4gICAgICAgIC8vIHJlZmVyZW5jZSBpdC5cbiAgICAgICAgc2VsZi5yZWdpb25MaXN0LnB1c2goe1xuICAgICAgICAgIGlkOiBzZXR0aW5ncy5nZXQoXCJpZFwiKSxcbiAgICAgICAgICByZWdpb246IHJlZ2lvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkcmFmdC1wYW50b3MtaHR0cC1saXZlLXN0cmVhbWluZy0yMFxuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1wYW50b3MtaHR0cC1saXZlLXN0cmVhbWluZy0yMCNzZWN0aW9uLTMuNVxuICAgIC8vIDMuNSBXZWJWVFRcbiAgICBmdW5jdGlvbiBwYXJzZVRpbWVzdGFtcE1hcChpbnB1dCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFNldHRpbmdzKCk7XG5cbiAgICAgIHBhcnNlT3B0aW9ucyhpbnB1dCwgZnVuY3Rpb24oaywgdikge1xuICAgICAgICBzd2l0Y2goaykge1xuICAgICAgICBjYXNlIFwiTVBFR1RcIjpcbiAgICAgICAgICBzZXR0aW5ncy5pbnRlZ2VyKGsgKyAnUycsIHYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTE9DQVwiOlxuICAgICAgICAgIHNldHRpbmdzLnNldChrICsgJ0wnLCBwYXJzZVRpbWVTdGFtcCh2KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0sIC9bXlxcZF06LywgLywvKTtcblxuICAgICAgc2VsZi5vbnRpbWVzdGFtcG1hcCAmJiBzZWxmLm9udGltZXN0YW1wbWFwKHtcbiAgICAgICAgXCJNUEVHVFNcIjogc2V0dGluZ3MuZ2V0KFwiTVBFR1RTXCIpLFxuICAgICAgICBcIkxPQ0FMXCI6IHNldHRpbmdzLmdldChcIkxPQ0FMXCIpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLjIgV2ViVlRUIG1ldGFkYXRhIGhlYWRlciBzeW50YXhcbiAgICBmdW5jdGlvbiBwYXJzZUhlYWRlcihpbnB1dCkge1xuICAgICAgaWYgKGlucHV0Lm1hdGNoKC9YLVRJTUVTVEFNUC1NQVAvKSkge1xuICAgICAgICAvLyBUaGlzIGxpbmUgY29udGFpbnMgSExTIFgtVElNRVNUQU1QLU1BUCBtZXRhZGF0YVxuICAgICAgICBwYXJzZU9wdGlvbnMoaW5wdXQsIGZ1bmN0aW9uKGssIHYpIHtcbiAgICAgICAgICBzd2l0Y2goaykge1xuICAgICAgICAgIGNhc2UgXCJYLVRJTUVTVEFNUC1NQVBcIjpcbiAgICAgICAgICAgIHBhcnNlVGltZXN0YW1wTWFwKHYpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAvPS8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VPcHRpb25zKGlucHV0LCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgICAgIHN3aXRjaCAoaykge1xuICAgICAgICAgIGNhc2UgXCJSZWdpb25cIjpcbiAgICAgICAgICAgIC8vIDMuMyBXZWJWVFQgcmVnaW9uIG1ldGFkYXRhIGhlYWRlciBzeW50YXhcbiAgICAgICAgICAgIHBhcnNlUmVnaW9uKHYpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAvOi8pO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgLy8gNS4xIFdlYlZUVCBmaWxlIHBhcnNpbmcuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBsaW5lO1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFwiSU5JVElBTFwiKSB7XG4gICAgICAgIC8vIFdlIGNhbid0IHN0YXJ0IHBhcnNpbmcgdW50aWwgd2UgaGF2ZSB0aGUgZmlyc3QgbGluZS5cbiAgICAgICAgaWYgKCEvXFxyXFxufFxcbi8udGVzdChzZWxmLmJ1ZmZlcikpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmUgPSBjb2xsZWN0TmV4dExpbmUoKTtcblxuICAgICAgICB2YXIgbSA9IGxpbmUubWF0Y2goL15XRUJWVFQoWyBcXHRdLiopPyQvKTtcbiAgICAgICAgaWYgKCFtIHx8ICFtWzBdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNpbmdFcnJvcihQYXJzaW5nRXJyb3IuRXJyb3JzLkJhZFNpZ25hdHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLnN0YXRlID0gXCJIRUFERVJcIjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFscmVhZHlDb2xsZWN0ZWRMaW5lID0gZmFsc2U7XG4gICAgICB3aGlsZSAoc2VsZi5idWZmZXIpIHtcbiAgICAgICAgLy8gV2UgY2FuJ3QgcGFyc2UgYSBsaW5lIHVudGlsIHdlIGhhdmUgdGhlIGZ1bGwgbGluZS5cbiAgICAgICAgaWYgKCEvXFxyXFxufFxcbi8udGVzdChzZWxmLmJ1ZmZlcikpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWxyZWFkeUNvbGxlY3RlZExpbmUpIHtcbiAgICAgICAgICBsaW5lID0gY29sbGVjdE5leHRMaW5lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWxyZWFkeUNvbGxlY3RlZExpbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2VsZi5zdGF0ZSkge1xuICAgICAgICBjYXNlIFwiSEVBREVSXCI6XG4gICAgICAgICAgLy8gMTMtMTggLSBBbGxvdyBhIGhlYWRlciAobWV0YWRhdGEpIHVuZGVyIHRoZSBXRUJWVFQgbGluZS5cbiAgICAgICAgICBpZiAoLzovLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIHBhcnNlSGVhZGVyKGxpbmUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWxpbmUpIHtcbiAgICAgICAgICAgIC8vIEFuIGVtcHR5IGxpbmUgdGVybWluYXRlcyB0aGUgaGVhZGVyIGFuZCBzdGFydHMgdGhlIGJvZHkgKGN1ZXMpLlxuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiSURcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgXCJOT1RFXCI6XG4gICAgICAgICAgLy8gSWdub3JlIE5PVEUgYmxvY2tzLlxuICAgICAgICAgIGlmICghbGluZSkge1xuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiSURcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgXCJJRFwiOlxuICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgc3RhcnQgb2YgTk9URSBibG9ja3MuXG4gICAgICAgICAgaWYgKC9eTk9URSgkfFsgXFx0XSkvLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBcIk5PVEVcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyAxOS0yOSAtIEFsbG93IGFueSBudW1iZXIgb2YgbGluZSB0ZXJtaW5hdG9ycywgdGhlbiBpbml0aWFsaXplIG5ldyBjdWUgdmFsdWVzLlxuICAgICAgICAgIGlmICghbGluZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYuY3VlID0gbmV3IChzZWxmLnZ0dGpzLlZUVEN1ZSB8fCBzZWxmLndpbmRvdy5WVFRDdWUpKDAsIDAsIFwiXCIpO1xuICAgICAgICAgIHNlbGYuc3RhdGUgPSBcIkNVRVwiO1xuICAgICAgICAgIC8vIDMwLTM5IC0gQ2hlY2sgaWYgc2VsZiBsaW5lIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb3IgdGltaW5nIGRhdGEuXG4gICAgICAgICAgaWYgKGxpbmUuaW5kZXhPZihcIi0tPlwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHNlbGYuY3VlLmlkID0gbGluZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBQcm9jZXNzIGxpbmUgYXMgc3RhcnQgb2YgYSBjdWUuXG4gICAgICAgICAgLypmYWxscyB0aHJvdWdoKi9cbiAgICAgICAgY2FzZSBcIkNVRVwiOlxuICAgICAgICAgIC8vIDQwIC0gQ29sbGVjdCBjdWUgdGltaW5ncyBhbmQgc2V0dGluZ3MuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhcnNlQ3VlKGxpbmUsIHNlbGYuY3VlLCBzZWxmLnJlZ2lvbkxpc3QpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNlbGYucmVwb3J0T3JUaHJvd0Vycm9yKGUpO1xuICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBlcnJvciBpZ25vcmUgcmVzdCBvZiB0aGUgY3VlLlxuICAgICAgICAgICAgc2VsZi5jdWUgPSBudWxsO1xuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiQkFEQ1VFXCI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiQ1VFVEVYVFwiO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIFwiQ1VFVEVYVFwiOlxuICAgICAgICAgIHZhciBoYXNTdWJzdHJpbmcgPSBsaW5lLmluZGV4T2YoXCItLT5cIikgIT09IC0xO1xuICAgICAgICAgIC8vIDM0IC0gSWYgd2UgaGF2ZSBhbiBlbXB0eSBsaW5lIHRoZW4gcmVwb3J0IHRoZSBjdWUuXG4gICAgICAgICAgLy8gMzUgLSBJZiB3ZSBoYXZlIHRoZSBzcGVjaWFsIHN1YnN0cmluZyAnLS0+JyB0aGVuIHJlcG9ydCB0aGUgY3VlLFxuICAgICAgICAgIC8vIGJ1dCBkbyBub3QgY29sbGVjdCB0aGUgbGluZSBhcyB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIGN1cnJlbnRcbiAgICAgICAgICAvLyBvbmUgYXMgYSBuZXcgY3VlLlxuICAgICAgICAgIGlmICghbGluZSB8fCBoYXNTdWJzdHJpbmcgJiYgKGFscmVhZHlDb2xsZWN0ZWRMaW5lID0gdHJ1ZSkpIHtcbiAgICAgICAgICAgIC8vIFdlIGFyZSBkb25lIHBhcnNpbmcgc2VsZiBjdWUuXG4gICAgICAgICAgICBzZWxmLm9uY3VlICYmIHNlbGYub25jdWUoc2VsZi5jdWUpO1xuICAgICAgICAgICAgc2VsZi5jdWUgPSBudWxsO1xuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiSURcIjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2VsZi5jdWUudGV4dCkge1xuICAgICAgICAgICAgc2VsZi5jdWUudGV4dCArPSBcIlxcblwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLmN1ZS50ZXh0ICs9IGxpbmU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgXCJCQURDVUVcIjogLy8gQkFEQ1VFXG4gICAgICAgICAgLy8gNTQtNjIgLSBDb2xsZWN0IGFuZCBkaXNjYXJkIHRoZSByZW1haW5pbmcgY3VlLlxuICAgICAgICAgIGlmICghbGluZSkge1xuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFwiSURcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZWxmLnJlcG9ydE9yVGhyb3dFcnJvcihlKTtcblxuICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIGEgY3VlLCByZXBvcnQgd2hhdCB3ZSBoYXZlLlxuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFwiQ1VFVEVYVFwiICYmIHNlbGYuY3VlICYmIHNlbGYub25jdWUpIHtcbiAgICAgICAgc2VsZi5vbmN1ZShzZWxmLmN1ZSk7XG4gICAgICB9XG4gICAgICBzZWxmLmN1ZSA9IG51bGw7XG4gICAgICAvLyBFbnRlciBCQURXRUJWVFQgc3RhdGUgaWYgaGVhZGVyIHdhcyBub3QgcGFyc2VkIGNvcnJlY3RseSBvdGhlcndpc2VcbiAgICAgIC8vIGFub3RoZXIgZXhjZXB0aW9uIG9jY3VycmVkIHNvIGVudGVyIEJBRENVRSBzdGF0ZS5cbiAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlID09PSBcIklOSVRJQUxcIiA/IFwiQkFEV0VCVlRUXCIgOiBcIkJBRENVRVwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZmx1c2g6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpbmlzaCBkZWNvZGluZyB0aGUgc3RyZWFtLlxuICAgICAgc2VsZi5idWZmZXIgKz0gc2VsZi5kZWNvZGVyLmRlY29kZSgpO1xuICAgICAgLy8gU3ludGhlc2l6ZSB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGN1ZSBvciByZWdpb24uXG4gICAgICBpZiAoc2VsZi5jdWUgfHwgc2VsZi5zdGF0ZSA9PT0gXCJIRUFERVJcIikge1xuICAgICAgICBzZWxmLmJ1ZmZlciArPSBcIlxcblxcblwiO1xuICAgICAgICBzZWxmLnBhcnNlKCk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSd2ZSBmbHVzaGVkLCBwYXJzZWQsIGFuZCB3ZSdyZSBzdGlsbCBvbiB0aGUgSU5JVElBTCBzdGF0ZSB0aGVuXG4gICAgICAvLyB0aGF0IG1lYW5zIHdlIGRvbid0IGhhdmUgZW5vdWdoIG9mIHRoZSBzdHJlYW0gdG8gcGFyc2UgdGhlIGZpcnN0XG4gICAgICAvLyBsaW5lLlxuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFwiSU5JVElBTFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzaW5nRXJyb3IoUGFyc2luZ0Vycm9yLkVycm9ycy5CYWRTaWduYXR1cmUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgc2VsZi5yZXBvcnRPclRocm93RXJyb3IoZSk7XG4gICAgfVxuICAgIHNlbGYub25mbHVzaCAmJiBzZWxmLm9uZmx1c2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWJWVFQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vtt.js\n");

/***/ }),

/***/ "./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttcue.js":
/*!**************************************************************************!*\
  !*** ./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttcue.js ***!
  \**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar autoKeyword = \"auto\";\nvar directionSetting = {\n  \"\": true,\n  \"lr\": true,\n  \"rl\": true\n};\nvar alignSetting = {\n  \"start\": true,\n  \"middle\": true,\n  \"end\": true,\n  \"left\": true,\n  \"right\": true\n};\n\nfunction findDirectionSetting(value) {\n  if (typeof value !== \"string\") {\n    return false;\n  }\n  var dir = directionSetting[value.toLowerCase()];\n  return dir ? value.toLowerCase() : false;\n}\n\nfunction findAlignSetting(value) {\n  if (typeof value !== \"string\") {\n    return false;\n  }\n  var align = alignSetting[value.toLowerCase()];\n  return align ? value.toLowerCase() : false;\n}\n\nfunction extend(obj) {\n  var i = 1;\n  for (; i < arguments.length; i++) {\n    var cobj = arguments[i];\n    for (var p in cobj) {\n      obj[p] = cobj[p];\n    }\n  }\n\n  return obj;\n}\n\nfunction VTTCue(startTime, endTime, text) {\n  var cue = this;\n  var isIE8 = (/MSIE\\s8\\.0/).test(navigator.userAgent);\n  var baseObj = {};\n\n  if (isIE8) {\n    cue = document.createElement('custom');\n  } else {\n    baseObj.enumerable = true;\n  }\n\n  /**\n   * Shim implementation specific properties. These properties are not in\n   * the spec.\n   */\n\n  // Lets us know when the VTTCue's data has changed in such a way that we need\n  // to recompute its display state. This lets us compute its display state\n  // lazily.\n  cue.hasBeenReset = false;\n\n  /**\n   * VTTCue and TextTrackCue properties\n   * http://dev.w3.org/html5/webvtt/#vttcue-interface\n   */\n\n  var _id = \"\";\n  var _pauseOnExit = false;\n  var _startTime = startTime;\n  var _endTime = endTime;\n  var _text = text;\n  var _region = null;\n  var _vertical = \"\";\n  var _snapToLines = true;\n  var _line = \"auto\";\n  var _lineAlign = \"start\";\n  var _position = 50;\n  var _positionAlign = \"middle\";\n  var _size = 50;\n  var _align = \"middle\";\n\n  Object.defineProperty(cue,\n    \"id\", extend({}, baseObj, {\n      get: function() {\n        return _id;\n      },\n      set: function(value) {\n        _id = \"\" + value;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"pauseOnExit\", extend({}, baseObj, {\n      get: function() {\n        return _pauseOnExit;\n      },\n      set: function(value) {\n        _pauseOnExit = !!value;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"startTime\", extend({}, baseObj, {\n      get: function() {\n        return _startTime;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\") {\n          throw new TypeError(\"Start time must be set to a number.\");\n        }\n        _startTime = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"endTime\", extend({}, baseObj, {\n      get: function() {\n        return _endTime;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\") {\n          throw new TypeError(\"End time must be set to a number.\");\n        }\n        _endTime = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"text\", extend({}, baseObj, {\n      get: function() {\n        return _text;\n      },\n      set: function(value) {\n        _text = \"\" + value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"region\", extend({}, baseObj, {\n      get: function() {\n        return _region;\n      },\n      set: function(value) {\n        _region = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"vertical\", extend({}, baseObj, {\n      get: function() {\n        return _vertical;\n      },\n      set: function(value) {\n        var setting = findDirectionSetting(value);\n        // Have to check for false because the setting an be an empty string.\n        if (setting === false) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _vertical = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"snapToLines\", extend({}, baseObj, {\n      get: function() {\n        return _snapToLines;\n      },\n      set: function(value) {\n        _snapToLines = !!value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"line\", extend({}, baseObj, {\n      get: function() {\n        return _line;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\" && value !== autoKeyword) {\n          throw new SyntaxError(\"An invalid number or illegal string was specified.\");\n        }\n        _line = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"lineAlign\", extend({}, baseObj, {\n      get: function() {\n        return _lineAlign;\n      },\n      set: function(value) {\n        var setting = findAlignSetting(value);\n        if (!setting) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _lineAlign = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"position\", extend({}, baseObj, {\n      get: function() {\n        return _position;\n      },\n      set: function(value) {\n        if (value < 0 || value > 100) {\n          throw new Error(\"Position must be between 0 and 100.\");\n        }\n        _position = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"positionAlign\", extend({}, baseObj, {\n      get: function() {\n        return _positionAlign;\n      },\n      set: function(value) {\n        var setting = findAlignSetting(value);\n        if (!setting) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _positionAlign = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"size\", extend({}, baseObj, {\n      get: function() {\n        return _size;\n      },\n      set: function(value) {\n        if (value < 0 || value > 100) {\n          throw new Error(\"Size must be between 0 and 100.\");\n        }\n        _size = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"align\", extend({}, baseObj, {\n      get: function() {\n        return _align;\n      },\n      set: function(value) {\n        var setting = findAlignSetting(value);\n        if (!setting) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _align = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  /**\n   * Other <track> spec defined properties\n   */\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state\n  cue.displayState = undefined;\n\n  if (isIE8) {\n    return cue;\n  }\n}\n\n/**\n * VTTCue methods\n */\n\nVTTCue.prototype.getCueAsHTML = function() {\n  // Assume WebVTT.convertCueToDOMTree is on the global.\n  return WebVTT.convertCueToDOMTree(window, this.text);\n};\n\nmodule.exports = VTTCue;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvanMtdnR0LmpzQDAuMTIuNkB2aWRlb2pzLXZ0dC5qcy9saWIvdnR0Y3VlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlb2pzLXZ0dC5qc0AwLjEyLjZAdmlkZW9qcy12dHQuanMvbGliL3Z0dGN1ZS5qcz84YWFjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMgdnR0LmpzIENvbnRyaWJ1dG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxudmFyIGF1dG9LZXl3b3JkID0gXCJhdXRvXCI7XG52YXIgZGlyZWN0aW9uU2V0dGluZyA9IHtcbiAgXCJcIjogdHJ1ZSxcbiAgXCJsclwiOiB0cnVlLFxuICBcInJsXCI6IHRydWVcbn07XG52YXIgYWxpZ25TZXR0aW5nID0ge1xuICBcInN0YXJ0XCI6IHRydWUsXG4gIFwibWlkZGxlXCI6IHRydWUsXG4gIFwiZW5kXCI6IHRydWUsXG4gIFwibGVmdFwiOiB0cnVlLFxuICBcInJpZ2h0XCI6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGZpbmREaXJlY3Rpb25TZXR0aW5nKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGRpciA9IGRpcmVjdGlvblNldHRpbmdbdmFsdWUudG9Mb3dlckNhc2UoKV07XG4gIHJldHVybiBkaXIgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRBbGlnblNldHRpbmcodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgYWxpZ24gPSBhbGlnblNldHRpbmdbdmFsdWUudG9Mb3dlckNhc2UoKV07XG4gIHJldHVybiBhbGlnbiA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKG9iaikge1xuICB2YXIgaSA9IDE7XG4gIGZvciAoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvYmogPSBhcmd1bWVudHNbaV07XG4gICAgZm9yICh2YXIgcCBpbiBjb2JqKSB7XG4gICAgICBvYmpbcF0gPSBjb2JqW3BdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIFZUVEN1ZShzdGFydFRpbWUsIGVuZFRpbWUsIHRleHQpIHtcbiAgdmFyIGN1ZSA9IHRoaXM7XG4gIHZhciBpc0lFOCA9ICgvTVNJRVxcczhcXC4wLykudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgdmFyIGJhc2VPYmogPSB7fTtcblxuICBpZiAoaXNJRTgpIHtcbiAgICBjdWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTtcbiAgfSBlbHNlIHtcbiAgICBiYXNlT2JqLmVudW1lcmFibGUgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoaW0gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgcHJvcGVydGllcy4gVGhlc2UgcHJvcGVydGllcyBhcmUgbm90IGluXG4gICAqIHRoZSBzcGVjLlxuICAgKi9cblxuICAvLyBMZXRzIHVzIGtub3cgd2hlbiB0aGUgVlRUQ3VlJ3MgZGF0YSBoYXMgY2hhbmdlZCBpbiBzdWNoIGEgd2F5IHRoYXQgd2UgbmVlZFxuICAvLyB0byByZWNvbXB1dGUgaXRzIGRpc3BsYXkgc3RhdGUuIFRoaXMgbGV0cyB1cyBjb21wdXRlIGl0cyBkaXNwbGF5IHN0YXRlXG4gIC8vIGxhemlseS5cbiAgY3VlLmhhc0JlZW5SZXNldCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBWVFRDdWUgYW5kIFRleHRUcmFja0N1ZSBwcm9wZXJ0aWVzXG4gICAqIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3dlYnZ0dC8jdnR0Y3VlLWludGVyZmFjZVxuICAgKi9cblxuICB2YXIgX2lkID0gXCJcIjtcbiAgdmFyIF9wYXVzZU9uRXhpdCA9IGZhbHNlO1xuICB2YXIgX3N0YXJ0VGltZSA9IHN0YXJ0VGltZTtcbiAgdmFyIF9lbmRUaW1lID0gZW5kVGltZTtcbiAgdmFyIF90ZXh0ID0gdGV4dDtcbiAgdmFyIF9yZWdpb24gPSBudWxsO1xuICB2YXIgX3ZlcnRpY2FsID0gXCJcIjtcbiAgdmFyIF9zbmFwVG9MaW5lcyA9IHRydWU7XG4gIHZhciBfbGluZSA9IFwiYXV0b1wiO1xuICB2YXIgX2xpbmVBbGlnbiA9IFwic3RhcnRcIjtcbiAgdmFyIF9wb3NpdGlvbiA9IDUwO1xuICB2YXIgX3Bvc2l0aW9uQWxpZ24gPSBcIm1pZGRsZVwiO1xuICB2YXIgX3NpemUgPSA1MDtcbiAgdmFyIF9hbGlnbiA9IFwibWlkZGxlXCI7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcImlkXCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9pZDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF9pZCA9IFwiXCIgKyB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcInBhdXNlT25FeGl0XCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9wYXVzZU9uRXhpdDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF9wYXVzZU9uRXhpdCA9ICEhdmFsdWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJzdGFydFRpbWVcIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3N0YXJ0VGltZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3RhcnQgdGltZSBtdXN0IGJlIHNldCB0byBhIG51bWJlci5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3N0YXJ0VGltZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJlbmRUaW1lXCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9lbmRUaW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFbmQgdGltZSBtdXN0IGJlIHNldCB0byBhIG51bWJlci5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX2VuZFRpbWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VlLFxuICAgIFwidGV4dFwiLCBleHRlbmQoe30sIGJhc2VPYmosIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfdGV4dDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF90ZXh0ID0gXCJcIiArIHZhbHVlO1xuICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJyZWdpb25cIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3JlZ2lvbjtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF9yZWdpb24gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VlLFxuICAgIFwidmVydGljYWxcIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3ZlcnRpY2FsO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHNldHRpbmcgPSBmaW5kRGlyZWN0aW9uU2V0dGluZyh2YWx1ZSk7XG4gICAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGZhbHNlIGJlY2F1c2UgdGhlIHNldHRpbmcgYW4gYmUgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAgICBpZiAoc2V0dGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF92ZXJ0aWNhbCA9IHNldHRpbmc7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcInNuYXBUb0xpbmVzXCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zbmFwVG9MaW5lcztcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF9zbmFwVG9MaW5lcyA9ICEhdmFsdWU7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcImxpbmVcIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX2xpbmU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiICYmIHZhbHVlICE9PSBhdXRvS2V5d29yZCkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIkFuIGludmFsaWQgbnVtYmVyIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9saW5lID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcImxpbmVBbGlnblwiLCBleHRlbmQoe30sIGJhc2VPYmosIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfbGluZUFsaWduO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHNldHRpbmcgPSBmaW5kQWxpZ25TZXR0aW5nKHZhbHVlKTtcbiAgICAgICAgaWYgKCFzZXR0aW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBfbGluZUFsaWduID0gc2V0dGluZztcbiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VlLFxuICAgIFwicG9zaXRpb25cIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3Bvc2l0aW9uO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBvc2l0aW9uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9wb3NpdGlvbiA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJwb3NpdGlvbkFsaWduXCIsIGV4dGVuZCh7fSwgYmFzZU9iaiwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9wb3NpdGlvbkFsaWduO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHNldHRpbmcgPSBmaW5kQWxpZ25TZXR0aW5nKHZhbHVlKTtcbiAgICAgICAgaWYgKCFzZXR0aW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBfcG9zaXRpb25BbGlnbiA9IHNldHRpbmc7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSxcbiAgICBcInNpemVcIiwgZXh0ZW5kKHt9LCBiYXNlT2JqLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3NpemU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMTAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2l6ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBfc2l6ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsXG4gICAgXCJhbGlnblwiLCBleHRlbmQoe30sIGJhc2VPYmosIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfYWxpZ247XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgc2V0dGluZyA9IGZpbmRBbGlnblNldHRpbmcodmFsdWUpO1xuICAgICAgICBpZiAoIXNldHRpbmcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9hbGlnbiA9IHNldHRpbmc7XG4gICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgLyoqXG4gICAqIE90aGVyIDx0cmFjaz4gc3BlYyBkZWZpbmVkIHByb3BlcnRpZXNcbiAgICovXG5cbiAgLy8gaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdGhlLXZpZGVvLWVsZW1lbnQuaHRtbCN0ZXh0LXRyYWNrLWN1ZS1kaXNwbGF5LXN0YXRlXG4gIGN1ZS5kaXNwbGF5U3RhdGUgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzSUU4KSB7XG4gICAgcmV0dXJuIGN1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFZUVEN1ZSBtZXRob2RzXG4gKi9cblxuVlRUQ3VlLnByb3RvdHlwZS5nZXRDdWVBc0hUTUwgPSBmdW5jdGlvbigpIHtcbiAgLy8gQXNzdW1lIFdlYlZUVC5jb252ZXJ0Q3VlVG9ET01UcmVlIGlzIG9uIHRoZSBnbG9iYWwuXG4gIHJldHVybiBXZWJWVFQuY29udmVydEN1ZVRvRE9NVHJlZSh3aW5kb3csIHRoaXMudGV4dCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZUVEN1ZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttcue.js\n");

/***/ }),

/***/ "./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttregion.js":
/*!*****************************************************************************!*\
  !*** ./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttregion.js ***!
  \*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar scrollSetting = {\n  \"\": true,\n  \"up\": true\n};\n\nfunction findScrollSetting(value) {\n  if (typeof value !== \"string\") {\n    return false;\n  }\n  var scroll = scrollSetting[value.toLowerCase()];\n  return scroll ? value.toLowerCase() : false;\n}\n\nfunction isValidPercentValue(value) {\n  return typeof value === \"number\" && (value >= 0 && value <= 100);\n}\n\n// VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface\nfunction VTTRegion() {\n  var _width = 100;\n  var _lines = 3;\n  var _regionAnchorX = 0;\n  var _regionAnchorY = 100;\n  var _viewportAnchorX = 0;\n  var _viewportAnchorY = 100;\n  var _scroll = \"\";\n\n  Object.defineProperties(this, {\n    \"width\": {\n      enumerable: true,\n      get: function() {\n        return _width;\n      },\n      set: function(value) {\n        if (!isValidPercentValue(value)) {\n          throw new Error(\"Width must be between 0 and 100.\");\n        }\n        _width = value;\n      }\n    },\n    \"lines\": {\n      enumerable: true,\n      get: function() {\n        return _lines;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\") {\n          throw new TypeError(\"Lines must be set to a number.\");\n        }\n        _lines = value;\n      }\n    },\n    \"regionAnchorY\": {\n      enumerable: true,\n      get: function() {\n        return _regionAnchorY;\n      },\n      set: function(value) {\n        if (!isValidPercentValue(value)) {\n          throw new Error(\"RegionAnchorX must be between 0 and 100.\");\n        }\n        _regionAnchorY = value;\n      }\n    },\n    \"regionAnchorX\": {\n      enumerable: true,\n      get: function() {\n        return _regionAnchorX;\n      },\n      set: function(value) {\n        if(!isValidPercentValue(value)) {\n          throw new Error(\"RegionAnchorY must be between 0 and 100.\");\n        }\n        _regionAnchorX = value;\n      }\n    },\n    \"viewportAnchorY\": {\n      enumerable: true,\n      get: function() {\n        return _viewportAnchorY;\n      },\n      set: function(value) {\n        if (!isValidPercentValue(value)) {\n          throw new Error(\"ViewportAnchorY must be between 0 and 100.\");\n        }\n        _viewportAnchorY = value;\n      }\n    },\n    \"viewportAnchorX\": {\n      enumerable: true,\n      get: function() {\n        return _viewportAnchorX;\n      },\n      set: function(value) {\n        if (!isValidPercentValue(value)) {\n          throw new Error(\"ViewportAnchorX must be between 0 and 100.\");\n        }\n        _viewportAnchorX = value;\n      }\n    },\n    \"scroll\": {\n      enumerable: true,\n      get: function() {\n        return _scroll;\n      },\n      set: function(value) {\n        var setting = findScrollSetting(value);\n        // Have to check for false as an empty string is a legal value.\n        if (setting === false) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _scroll = setting;\n      }\n    }\n  });\n}\n\nmodule.exports = VTTRegion;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3ZpZGVvanMtdnR0LmpzQDAuMTIuNkB2aWRlb2pzLXZ0dC5qcy9saWIvdnR0cmVnaW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192aWRlb2pzLXZ0dC5qc0AwLjEyLjZAdmlkZW9qcy12dHQuanMvbGliL3Z0dHJlZ2lvbi5qcz80MjAxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMgdnR0LmpzIENvbnRyaWJ1dG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxudmFyIHNjcm9sbFNldHRpbmcgPSB7XG4gIFwiXCI6IHRydWUsXG4gIFwidXBcIjogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZmluZFNjcm9sbFNldHRpbmcodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgc2Nyb2xsID0gc2Nyb2xsU2V0dGluZ1t2YWx1ZS50b0xvd2VyQ2FzZSgpXTtcbiAgcmV0dXJuIHNjcm9sbCA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZFBlcmNlbnRWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDEwMCk7XG59XG5cbi8vIFZUVFJlZ2lvbiBzaGltIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3dlYnZ0dC8jdnR0cmVnaW9uLWludGVyZmFjZVxuZnVuY3Rpb24gVlRUUmVnaW9uKCkge1xuICB2YXIgX3dpZHRoID0gMTAwO1xuICB2YXIgX2xpbmVzID0gMztcbiAgdmFyIF9yZWdpb25BbmNob3JYID0gMDtcbiAgdmFyIF9yZWdpb25BbmNob3JZID0gMTAwO1xuICB2YXIgX3ZpZXdwb3J0QW5jaG9yWCA9IDA7XG4gIHZhciBfdmlld3BvcnRBbmNob3JZID0gMTAwO1xuICB2YXIgX3Njcm9sbCA9IFwiXCI7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIFwid2lkdGhcIjoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfd2lkdGg7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzVmFsaWRQZXJjZW50VmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2lkdGggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3dpZHRoID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBcImxpbmVzXCI6IHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX2xpbmVzO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJMaW5lcyBtdXN0IGJlIHNldCB0byBhIG51bWJlci5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX2xpbmVzID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBcInJlZ2lvbkFuY2hvcllcIjoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfcmVnaW9uQW5jaG9yWTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNWYWxpZFBlcmNlbnRWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWdpb25BbmNob3JYIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9yZWdpb25BbmNob3JZID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBcInJlZ2lvbkFuY2hvclhcIjoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfcmVnaW9uQW5jaG9yWDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmKCFpc1ZhbGlkUGVyY2VudFZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlZ2lvbkFuY2hvclkgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3JlZ2lvbkFuY2hvclggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFwidmlld3BvcnRBbmNob3JZXCI6IHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3ZpZXdwb3J0QW5jaG9yWTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNWYWxpZFBlcmNlbnRWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWaWV3cG9ydEFuY2hvclkgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3ZpZXdwb3J0QW5jaG9yWSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgXCJ2aWV3cG9ydEFuY2hvclhcIjoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfdmlld3BvcnRBbmNob3JYO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc1ZhbGlkUGVyY2VudFZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZpZXdwb3J0QW5jaG9yWCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBfdmlld3BvcnRBbmNob3JYID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBcInNjcm9sbFwiOiB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zY3JvbGw7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgc2V0dGluZyA9IGZpbmRTY3JvbGxTZXR0aW5nKHZhbHVlKTtcbiAgICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgZmFsc2UgYXMgYW4gZW1wdHkgc3RyaW5nIGlzIGEgbGVnYWwgdmFsdWUuXG4gICAgICAgIGlmIChzZXR0aW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgX3Njcm9sbCA9IHNldHRpbmc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBWVFRSZWdpb247XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_videojs-vtt.js@0.12.6@videojs-vtt.js/lib/vttregion.js\n");

/***/ }),

/***/ "./node_modules/_vue-awesome-swiper@3.1.3@vue-awesome-swiper/dist/vue-awesome-swiper.js":
/*!**********************************************************************************************!*\
  !*** ./node_modules/_vue-awesome-swiper@3.1.3@vue-awesome-swiper/dist/vue-awesome-swiper.js ***!
  \**********************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("!function(e,t){ true?module.exports=t(__webpack_require__(/*! swiper/dist/js/swiper.js */ \"./node_modules/_swiper@4.5.1@swiper/dist/js/swiper.js\")):undefined}(this,function(e){return function(e){function t(i){if(n[i])return n[i].exports;var s=n[i]={i:i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,t),s.l=!0,s.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"/\",t(t.s=4)}([function(t,n){t.exports=e},function(e,t){e.exports=function(e,t,n,i,s,r){var o,a=e=e||{},u=typeof e.default;\"object\"!==u&&\"function\"!==u||(o=e,a=e.default);var p=\"function\"==typeof a?a.options:a;t&&(p.render=t.render,p.staticRenderFns=t.staticRenderFns,p._compiled=!0),n&&(p.functional=!0),s&&(p._scopeId=s);var l;if(r?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},p._ssrRegister=l):i&&(l=i),l){var c=p.functional,d=c?p.render:p.beforeCreate;c?(p._injectStyles=l,p.render=function(e,t){return l.call(t),d(e,t)}):p.beforeCreate=d?[].concat(d,l):[l]}return{esModule:o,exports:a,options:p}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(5),s=n.n(i),r=n(8),o=n(1),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(6),s=n.n(i),r=n(7),o=n(1),a=o(s.a,r.a,!1,null,null,null);t.default=a.exports},function(e,t,n){\"use strict\";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.install=t.swiperSlide=t.swiper=t.Swiper=void 0;var s=n(0),r=i(s),o=n(2),a=i(o),u=n(3),p=i(u),l=window.Swiper||r.default,c=p.default,d=a.default,f=function(e,t){t&&(p.default.props.globalOptions.default=function(){return t}),e.component(p.default.name,p.default),e.component(a.default.name,a.default)},h={Swiper:l,swiper:c,swiperSlide:d,install:f};t.default=h,t.Swiper=l,t.swiper=c,t.swiperSlide=d,t.install=f},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default={name:\"swiper-slide\",data:function(){return{slideClass:\"swiper-slide\"}},ready:function(){this.update()},mounted:function(){this.update(),this.$parent&&this.$parent.options&&this.$parent.options.slideClass&&(this.slideClass=this.$parent.options.slideClass)},updated:function(){this.update()},attached:function(){this.update()},methods:{update:function(){this.$parent&&this.$parent.swiper&&this.$parent.update()}}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(0),s=function(e){return e&&e.__esModule?e:{default:e}}(i),r=window.Swiper||s.default;\"function\"!=typeof Object.assign&&Object.defineProperty(Object,\"assign\",{value:function(e,t){if(null==e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var n=Object(e),i=1;i<arguments.length;i++){var s=arguments[i];if(null!=s)for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(n[r]=s[r])}return n},writable:!0,configurable:!0});var o=[\"beforeDestroy\",\"slideChange\",\"slideChangeTransitionStart\",\"slideChangeTransitionEnd\",\"slideNextTransitionStart\",\"slideNextTransitionEnd\",\"slidePrevTransitionStart\",\"slidePrevTransitionEnd\",\"transitionStart\",\"transitionEnd\",\"touchStart\",\"touchMove\",\"touchMoveOpposite\",\"sliderMove\",\"touchEnd\",\"click\",\"tap\",\"doubleTap\",\"imagesReady\",\"progress\",\"reachBeginning\",\"reachEnd\",\"fromEdge\",\"setTranslate\",\"setTransition\",\"resize\"];t.default={name:\"swiper\",props:{options:{type:Object,default:function(){return{}}},globalOptions:{type:Object,required:!1,default:function(){return{}}}},data:function(){return{swiper:null,classes:{wrapperClass:\"swiper-wrapper\"}}},ready:function(){this.swiper||this.mountInstance()},mounted:function(){if(!this.swiper){var e=!1;for(var t in this.classes)this.classes.hasOwnProperty(t)&&this.options[t]&&(e=!0,this.classes[t]=this.options[t]);e?this.$nextTick(this.mountInstance):this.mountInstance()}},activated:function(){this.update()},updated:function(){this.update()},beforeDestroy:function(){this.$nextTick(function(){this.swiper&&(this.swiper.destroy&&this.swiper.destroy(),delete this.swiper)})},methods:{update:function(){this.swiper&&(this.swiper.update&&this.swiper.update(),this.swiper.navigation&&this.swiper.navigation.update(),this.swiper.pagination&&this.swiper.pagination.render(),this.swiper.pagination&&this.swiper.pagination.update())},mountInstance:function(){var e=Object.assign({},this.globalOptions,this.options);this.swiper=new r(this.$el,e),this.bindEvents(),this.$emit(\"ready\",this.swiper)},bindEvents:function(){var e=this,t=this;o.forEach(function(n){e.swiper.on(n,function(){t.$emit.apply(t,[n].concat(Array.prototype.slice.call(arguments))),t.$emit.apply(t,[n.replace(/([A-Z])/g,\"-$1\").toLowerCase()].concat(Array.prototype.slice.call(arguments)))})})}}}},function(e,t,n){\"use strict\";var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n(\"div\",{staticClass:\"swiper-container\"},[e._t(\"parallax-bg\"),e._v(\" \"),n(\"div\",{class:e.classes.wrapperClass},[e._t(\"default\")],2),e._v(\" \"),e._t(\"pagination\"),e._v(\" \"),e._t(\"button-prev\"),e._v(\" \"),e._t(\"button-next\"),e._v(\" \"),e._t(\"scrollbar\")],2)},s=[],r={render:i,staticRenderFns:s};t.a=r},function(e,t,n){\"use strict\";var i=function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"div\",{class:e.slideClass},[e._t(\"default\")],2)},s=[],r={render:i,staticRenderFns:s};t.a=r}])});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1hd2Vzb21lLXN3aXBlckAzLjEuM0B2dWUtYXdlc29tZS1zd2lwZXIvZGlzdC92dWUtYXdlc29tZS1zd2lwZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3Z1ZS1hd2Vzb21lLXN3aXBlckAzLjEuM0B2dWUtYXdlc29tZS1zd2lwZXIvZGlzdC92dWUtYXdlc29tZS1zd2lwZXIuanM/NmZlOCJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanNcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJWdWVBd2Vzb21lU3dpcGVyXCIsW1wic3dpcGVyXCJdLHQpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuVnVlQXdlc29tZVN3aXBlcj10KHJlcXVpcmUoXCJzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanNcIikpOmUuVnVlQXdlc29tZVN3aXBlcj10KGUuU3dpcGVyKX0odGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChpKXtpZihuW2ldKXJldHVybiBuW2ldLmV4cG9ydHM7dmFyIHM9bltpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbaV0uY2FsbChzLmV4cG9ydHMscyxzLmV4cG9ydHMsdCkscy5sPSEwLHMuZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5pPWZ1bmN0aW9uKGUpe3JldHVybiBlfSx0LmQ9ZnVuY3Rpb24oZSxuLGkpe3QubyhlLG4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6aX0pfSx0Lm49ZnVuY3Rpb24oZSl7dmFyIG49ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHQuZChuLFwiYVwiLG4pLG59LHQubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sdC5wPVwiL1wiLHQodC5zPTQpfShbZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4saSxzLHIpe3ZhciBvLGE9ZT1lfHx7fSx1PXR5cGVvZiBlLmRlZmF1bHQ7XCJvYmplY3RcIiE9PXUmJlwiZnVuY3Rpb25cIiE9PXV8fChvPWUsYT1lLmRlZmF1bHQpO3ZhciBwPVwiZnVuY3Rpb25cIj09dHlwZW9mIGE/YS5vcHRpb25zOmE7dCYmKHAucmVuZGVyPXQucmVuZGVyLHAuc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zLHAuX2NvbXBpbGVkPSEwKSxuJiYocC5mdW5jdGlvbmFsPSEwKSxzJiYocC5fc2NvcGVJZD1zKTt2YXIgbDtpZihyPyhsPWZ1bmN0aW9uKGUpe2U9ZXx8dGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR8fHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC4kdm5vZGUmJnRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0LGV8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9ffHwoZT1fX1ZVRV9TU1JfQ09OVEVYVF9fKSxpJiZpLmNhbGwodGhpcyxlKSxlJiZlLl9yZWdpc3RlcmVkQ29tcG9uZW50cyYmZS5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKHIpfSxwLl9zc3JSZWdpc3Rlcj1sKTppJiYobD1pKSxsKXt2YXIgYz1wLmZ1bmN0aW9uYWwsZD1jP3AucmVuZGVyOnAuYmVmb3JlQ3JlYXRlO2M/KHAuX2luamVjdFN0eWxlcz1sLHAucmVuZGVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGwuY2FsbCh0KSxkKGUsdCl9KTpwLmJlZm9yZUNyZWF0ZT1kP1tdLmNvbmNhdChkLGwpOltsXX1yZXR1cm57ZXNNb2R1bGU6byxleHBvcnRzOmEsb3B0aW9uczpwfX19LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgaT1uKDUpLHM9bi5uKGkpLHI9big4KSxvPW4oMSksYT1vKHMuYSxyLmEsITEsbnVsbCxudWxsLG51bGwpO3QuZGVmYXVsdD1hLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgaT1uKDYpLHM9bi5uKGkpLHI9big3KSxvPW4oMSksYT1vKHMuYSxyLmEsITEsbnVsbCxudWxsLG51bGwpO3QuZGVmYXVsdD1hLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0Lmluc3RhbGw9dC5zd2lwZXJTbGlkZT10LnN3aXBlcj10LlN3aXBlcj12b2lkIDA7dmFyIHM9bigwKSxyPWkocyksbz1uKDIpLGE9aShvKSx1PW4oMykscD1pKHUpLGw9d2luZG93LlN3aXBlcnx8ci5kZWZhdWx0LGM9cC5kZWZhdWx0LGQ9YS5kZWZhdWx0LGY9ZnVuY3Rpb24oZSx0KXt0JiYocC5kZWZhdWx0LnByb3BzLmdsb2JhbE9wdGlvbnMuZGVmYXVsdD1mdW5jdGlvbigpe3JldHVybiB0fSksZS5jb21wb25lbnQocC5kZWZhdWx0Lm5hbWUscC5kZWZhdWx0KSxlLmNvbXBvbmVudChhLmRlZmF1bHQubmFtZSxhLmRlZmF1bHQpfSxoPXtTd2lwZXI6bCxzd2lwZXI6Yyxzd2lwZXJTbGlkZTpkLGluc3RhbGw6Zn07dC5kZWZhdWx0PWgsdC5Td2lwZXI9bCx0LnN3aXBlcj1jLHQuc3dpcGVyU2xpZGU9ZCx0Lmluc3RhbGw9Zn0sZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD17bmFtZTpcInN3aXBlci1zbGlkZVwiLGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57c2xpZGVDbGFzczpcInN3aXBlci1zbGlkZVwifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZSgpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGUoKSx0aGlzLiRwYXJlbnQmJnRoaXMuJHBhcmVudC5vcHRpb25zJiZ0aGlzLiRwYXJlbnQub3B0aW9ucy5zbGlkZUNsYXNzJiYodGhpcy5zbGlkZUNsYXNzPXRoaXMuJHBhcmVudC5vcHRpb25zLnNsaWRlQ2xhc3MpfSx1cGRhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGUoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZSgpfSxtZXRob2RzOnt1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLiRwYXJlbnQmJnRoaXMuJHBhcmVudC5zd2lwZXImJnRoaXMuJHBhcmVudC51cGRhdGUoKX19fX0sZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBpPW4oMCkscz1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19KGkpLHI9d2luZG93LlN3aXBlcnx8cy5kZWZhdWx0O1wiZnVuY3Rpb25cIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QsXCJhc3NpZ25cIix7dmFsdWU6ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3RcIik7Zm9yKHZhciBuPU9iamVjdChlKSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHM9YXJndW1lbnRzW2ldO2lmKG51bGwhPXMpZm9yKHZhciByIGluIHMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMscikmJihuW3JdPXNbcl0pfXJldHVybiBufSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KTt2YXIgbz1bXCJiZWZvcmVEZXN0cm95XCIsXCJzbGlkZUNoYW5nZVwiLFwic2xpZGVDaGFuZ2VUcmFuc2l0aW9uU3RhcnRcIixcInNsaWRlQ2hhbmdlVHJhbnNpdGlvbkVuZFwiLFwic2xpZGVOZXh0VHJhbnNpdGlvblN0YXJ0XCIsXCJzbGlkZU5leHRUcmFuc2l0aW9uRW5kXCIsXCJzbGlkZVByZXZUcmFuc2l0aW9uU3RhcnRcIixcInNsaWRlUHJldlRyYW5zaXRpb25FbmRcIixcInRyYW5zaXRpb25TdGFydFwiLFwidHJhbnNpdGlvbkVuZFwiLFwidG91Y2hTdGFydFwiLFwidG91Y2hNb3ZlXCIsXCJ0b3VjaE1vdmVPcHBvc2l0ZVwiLFwic2xpZGVyTW92ZVwiLFwidG91Y2hFbmRcIixcImNsaWNrXCIsXCJ0YXBcIixcImRvdWJsZVRhcFwiLFwiaW1hZ2VzUmVhZHlcIixcInByb2dyZXNzXCIsXCJyZWFjaEJlZ2lubmluZ1wiLFwicmVhY2hFbmRcIixcImZyb21FZGdlXCIsXCJzZXRUcmFuc2xhdGVcIixcInNldFRyYW5zaXRpb25cIixcInJlc2l6ZVwiXTt0LmRlZmF1bHQ9e25hbWU6XCJzd2lwZXJcIixwcm9wczp7b3B0aW9uczp7dHlwZTpPYmplY3QsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybnt9fX0sZ2xvYmFsT3B0aW9uczp7dHlwZTpPYmplY3QscmVxdWlyZWQ6ITEsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybnt9fX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57c3dpcGVyOm51bGwsY2xhc3Nlczp7d3JhcHBlckNsYXNzOlwic3dpcGVyLXdyYXBwZXJcIn19fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc3dpcGVyfHx0aGlzLm1vdW50SW5zdGFuY2UoKX0sbW91bnRlZDpmdW5jdGlvbigpe2lmKCF0aGlzLnN3aXBlcil7dmFyIGU9ITE7Zm9yKHZhciB0IGluIHRoaXMuY2xhc3Nlcyl0aGlzLmNsYXNzZXMuaGFzT3duUHJvcGVydHkodCkmJnRoaXMub3B0aW9uc1t0XSYmKGU9ITAsdGhpcy5jbGFzc2VzW3RdPXRoaXMub3B0aW9uc1t0XSk7ZT90aGlzLiRuZXh0VGljayh0aGlzLm1vdW50SW5zdGFuY2UpOnRoaXMubW91bnRJbnN0YW5jZSgpfX0sYWN0aXZhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGUoKX0sdXBkYXRlZDpmdW5jdGlvbigpe3RoaXMudXBkYXRlKCl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3RoaXMuc3dpcGVyJiYodGhpcy5zd2lwZXIuZGVzdHJveSYmdGhpcy5zd2lwZXIuZGVzdHJveSgpLGRlbGV0ZSB0aGlzLnN3aXBlcil9KX0sbWV0aG9kczp7dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5zd2lwZXImJih0aGlzLnN3aXBlci51cGRhdGUmJnRoaXMuc3dpcGVyLnVwZGF0ZSgpLHRoaXMuc3dpcGVyLm5hdmlnYXRpb24mJnRoaXMuc3dpcGVyLm5hdmlnYXRpb24udXBkYXRlKCksdGhpcy5zd2lwZXIucGFnaW5hdGlvbiYmdGhpcy5zd2lwZXIucGFnaW5hdGlvbi5yZW5kZXIoKSx0aGlzLnN3aXBlci5wYWdpbmF0aW9uJiZ0aGlzLnN3aXBlci5wYWdpbmF0aW9uLnVwZGF0ZSgpKX0sbW91bnRJbnN0YW5jZTpmdW5jdGlvbigpe3ZhciBlPU9iamVjdC5hc3NpZ24oe30sdGhpcy5nbG9iYWxPcHRpb25zLHRoaXMub3B0aW9ucyk7dGhpcy5zd2lwZXI9bmV3IHIodGhpcy4kZWwsZSksdGhpcy5iaW5kRXZlbnRzKCksdGhpcy4kZW1pdChcInJlYWR5XCIsdGhpcy5zd2lwZXIpfSxiaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXM7by5mb3JFYWNoKGZ1bmN0aW9uKG4pe2Uuc3dpcGVyLm9uKG4sZnVuY3Rpb24oKXt0LiRlbWl0LmFwcGx5KHQsW25dLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSksdC4kZW1pdC5hcHBseSh0LFtuLnJlcGxhY2UoLyhbQS1aXSkvZyxcIi0kMVwiKS50b0xvd2VyQ2FzZSgpXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpfSl9KX19fX0sZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQsbj1lLl9zZWxmLl9jfHx0O3JldHVybiBuKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwic3dpcGVyLWNvbnRhaW5lclwifSxbZS5fdChcInBhcmFsbGF4LWJnXCIpLGUuX3YoXCIgXCIpLG4oXCJkaXZcIix7Y2xhc3M6ZS5jbGFzc2VzLndyYXBwZXJDbGFzc30sW2UuX3QoXCJkZWZhdWx0XCIpXSwyKSxlLl92KFwiIFwiKSxlLl90KFwicGFnaW5hdGlvblwiKSxlLl92KFwiIFwiKSxlLl90KFwiYnV0dG9uLXByZXZcIiksZS5fdihcIiBcIiksZS5fdChcImJ1dHRvbi1uZXh0XCIpLGUuX3YoXCIgXCIpLGUuX3QoXCJzY3JvbGxiYXJcIildLDIpfSxzPVtdLHI9e3JlbmRlcjppLHN0YXRpY1JlbmRlckZuczpzfTt0LmE9cn0sZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQ7cmV0dXJuKGUuX3NlbGYuX2N8fHQpKFwiZGl2XCIse2NsYXNzOmUuc2xpZGVDbGFzc30sW2UuX3QoXCJkZWZhdWx0XCIpXSwyKX0scz1bXSxyPXtyZW5kZXI6aSxzdGF0aWNSZW5kZXJGbnM6c307dC5hPXJ9XSl9KTsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-awesome-swiper@3.1.3@vue-awesome-swiper/dist/vue-awesome-swiper.js\n");

/***/ }),

/***/ "./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js ***!
  \*********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var Vue // late bind\nvar version\nvar map = Object.create(null)\nif (typeof window !== 'undefined') {\n  window.__VUE_HOT_MAP__ = map\n}\nvar installed = false\nvar isBrowserify = false\nvar initHookName = 'beforeCreate'\n\nexports.install = function (vue, browserify) {\n  if (installed) { return }\n  installed = true\n\n  Vue = vue.__esModule ? vue.default : vue\n  version = Vue.version.split('.').map(Number)\n  isBrowserify = browserify\n\n  // compat with < 2.0.0-alpha.7\n  if (Vue.config._lifecycleHooks.indexOf('init') > -1) {\n    initHookName = 'init'\n  }\n\n  exports.compatible = version[0] >= 2\n  if (!exports.compatible) {\n    console.warn(\n      '[HMR] You are using a version of vue-hot-reload-api that is ' +\n        'only compatible with Vue.js core ^2.0.0.'\n    )\n    return\n  }\n}\n\n/**\n * Create a record for a hot module, which keeps track of its constructor\n * and instances\n *\n * @param {String} id\n * @param {Object} options\n */\n\nexports.createRecord = function (id, options) {\n  if(map[id]) { return }\n\n  var Ctor = null\n  if (typeof options === 'function') {\n    Ctor = options\n    options = Ctor.options\n  }\n  makeOptionsHot(id, options)\n  map[id] = {\n    Ctor: Ctor,\n    options: options,\n    instances: []\n  }\n}\n\n/**\n * Check if module is recorded\n *\n * @param {String} id\n */\n\nexports.isRecorded = function (id) {\n  return typeof map[id] !== 'undefined'\n}\n\n/**\n * Make a Component options object hot.\n *\n * @param {String} id\n * @param {Object} options\n */\n\nfunction makeOptionsHot(id, options) {\n  if (options.functional) {\n    var render = options.render\n    options.render = function (h, ctx) {\n      var instances = map[id].instances\n      if (ctx && instances.indexOf(ctx.parent) < 0) {\n        instances.push(ctx.parent)\n      }\n      return render(h, ctx)\n    }\n  } else {\n    injectHook(options, initHookName, function() {\n      var record = map[id]\n      if (!record.Ctor) {\n        record.Ctor = this.constructor\n      }\n      record.instances.push(this)\n    })\n    injectHook(options, 'beforeDestroy', function() {\n      var instances = map[id].instances\n      instances.splice(instances.indexOf(this), 1)\n    })\n  }\n}\n\n/**\n * Inject a hook to a hot reloadable component so that\n * we can keep track of it.\n *\n * @param {Object} options\n * @param {String} name\n * @param {Function} hook\n */\n\nfunction injectHook(options, name, hook) {\n  var existing = options[name]\n  options[name] = existing\n    ? Array.isArray(existing) ? existing.concat(hook) : [existing, hook]\n    : [hook]\n}\n\nfunction tryWrap(fn) {\n  return function (id, arg) {\n    try {\n      fn(id, arg)\n    } catch (e) {\n      console.error(e)\n      console.warn(\n        'Something went wrong during Vue component hot-reload. Full reload required.'\n      )\n    }\n  }\n}\n\nfunction updateOptions (oldOptions, newOptions) {\n  for (var key in oldOptions) {\n    if (!(key in newOptions)) {\n      delete oldOptions[key]\n    }\n  }\n  for (var key$1 in newOptions) {\n    oldOptions[key$1] = newOptions[key$1]\n  }\n}\n\nexports.rerender = tryWrap(function (id, options) {\n  var record = map[id]\n  if (!options) {\n    record.instances.slice().forEach(function (instance) {\n      instance.$forceUpdate()\n    })\n    return\n  }\n  if (typeof options === 'function') {\n    options = options.options\n  }\n  if (record.Ctor) {\n    record.Ctor.options.render = options.render\n    record.Ctor.options.staticRenderFns = options.staticRenderFns\n    record.instances.slice().forEach(function (instance) {\n      instance.$options.render = options.render\n      instance.$options.staticRenderFns = options.staticRenderFns\n      // reset static trees\n      // pre 2.5, all static trees are cached together on the instance\n      if (instance._staticTrees) {\n        instance._staticTrees = []\n      }\n      // 2.5.0\n      if (Array.isArray(record.Ctor.options.cached)) {\n        record.Ctor.options.cached = []\n      }\n      // 2.5.3\n      if (Array.isArray(instance.$options.cached)) {\n        instance.$options.cached = []\n      }\n\n      // post 2.5.4: v-once trees are cached on instance._staticTrees.\n      // Pure static trees are cached on the staticRenderFns array\n      // (both already reset above)\n\n      // 2.6: temporarily mark rendered scoped slots as unstable so that\n      // child components can be forced to update\n      var restore = patchScopedSlots(instance)\n      instance.$forceUpdate()\n      instance.$nextTick(restore)\n    })\n  } else {\n    // functional or no instance created yet\n    record.options.render = options.render\n    record.options.staticRenderFns = options.staticRenderFns\n\n    // handle functional component re-render\n    if (record.options.functional) {\n      // rerender with full options\n      if (Object.keys(options).length > 2) {\n        updateOptions(record.options, options)\n      } else {\n        // template-only rerender.\n        // need to inject the style injection code for CSS modules\n        // to work properly.\n        var injectStyles = record.options._injectStyles\n        if (injectStyles) {\n          var render = options.render\n          record.options.render = function (h, ctx) {\n            injectStyles.call(ctx)\n            return render(h, ctx)\n          }\n        }\n      }\n      record.options._Ctor = null\n      // 2.5.3\n      if (Array.isArray(record.options.cached)) {\n        record.options.cached = []\n      }\n      record.instances.slice().forEach(function (instance) {\n        instance.$forceUpdate()\n      })\n    }\n  }\n})\n\nexports.reload = tryWrap(function (id, options) {\n  var record = map[id]\n  if (options) {\n    if (typeof options === 'function') {\n      options = options.options\n    }\n    makeOptionsHot(id, options)\n    if (record.Ctor) {\n      if (version[1] < 2) {\n        // preserve pre 2.2 behavior for global mixin handling\n        record.Ctor.extendOptions = options\n      }\n      var newCtor = record.Ctor.super.extend(options)\n      // prevent record.options._Ctor from being overwritten accidentally\n      newCtor.options._Ctor = record.options._Ctor\n      record.Ctor.options = newCtor.options\n      record.Ctor.cid = newCtor.cid\n      record.Ctor.prototype = newCtor.prototype\n      if (newCtor.release) {\n        // temporary global mixin strategy used in < 2.0.0-alpha.6\n        newCtor.release()\n      }\n    } else {\n      updateOptions(record.options, options)\n    }\n  }\n  record.instances.slice().forEach(function (instance) {\n    if (instance.$vnode && instance.$vnode.context) {\n      instance.$vnode.context.$forceUpdate()\n    } else {\n      console.warn(\n        'Root or manually mounted instance modified. Full reload required.'\n      )\n    }\n  })\n})\n\n// 2.6 optimizes template-compiled scoped slots and skips updates if child\n// only uses scoped slots. We need to patch the scoped slots resolving helper\n// to temporarily mark all scoped slots as unstable in order to force child\n// updates.\nfunction patchScopedSlots (instance) {\n  if (!instance._u) { return }\n  // https://github.com/vuejs/vue/blob/dev/src/core/instance/render-helpers/resolve-scoped-slots.js\n  var original = instance._u\n  instance._u = function (slots) {\n    try {\n      // 2.6.4 ~ 2.6.6\n      return original(slots, true)\n    } catch (e) {\n      // 2.5 / >= 2.6.7\n      return original(slots, null, true)\n    }\n  }\n  return function () {\n    instance._u = original\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1ob3QtcmVsb2FkLWFwaUAyLjMuNEB2dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdnVlLWhvdC1yZWxvYWQtYXBpQDIuMy40QHZ1ZS1ob3QtcmVsb2FkLWFwaS9kaXN0L2luZGV4LmpzP2Q1NDUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIFZ1ZSAvLyBsYXRlIGJpbmRcbnZhciB2ZXJzaW9uXG52YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5fX1ZVRV9IT1RfTUFQX18gPSBtYXBcbn1cbnZhciBpbnN0YWxsZWQgPSBmYWxzZVxudmFyIGlzQnJvd3NlcmlmeSA9IGZhbHNlXG52YXIgaW5pdEhvb2tOYW1lID0gJ2JlZm9yZUNyZWF0ZSdcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24gKHZ1ZSwgYnJvd3NlcmlmeSkge1xuICBpZiAoaW5zdGFsbGVkKSB7IHJldHVybiB9XG4gIGluc3RhbGxlZCA9IHRydWVcblxuICBWdWUgPSB2dWUuX19lc01vZHVsZSA/IHZ1ZS5kZWZhdWx0IDogdnVlXG4gIHZlcnNpb24gPSBWdWUudmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpXG4gIGlzQnJvd3NlcmlmeSA9IGJyb3dzZXJpZnlcblxuICAvLyBjb21wYXQgd2l0aCA8IDIuMC4wLWFscGhhLjdcbiAgaWYgKFZ1ZS5jb25maWcuX2xpZmVjeWNsZUhvb2tzLmluZGV4T2YoJ2luaXQnKSA+IC0xKSB7XG4gICAgaW5pdEhvb2tOYW1lID0gJ2luaXQnXG4gIH1cblxuICBleHBvcnRzLmNvbXBhdGlibGUgPSB2ZXJzaW9uWzBdID49IDJcbiAgaWYgKCFleHBvcnRzLmNvbXBhdGlibGUpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW0hNUl0gWW91IGFyZSB1c2luZyBhIHZlcnNpb24gb2YgdnVlLWhvdC1yZWxvYWQtYXBpIHRoYXQgaXMgJyArXG4gICAgICAgICdvbmx5IGNvbXBhdGlibGUgd2l0aCBWdWUuanMgY29yZSBeMi4wLjAuJ1xuICAgIClcbiAgICByZXR1cm5cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIHJlY29yZCBmb3IgYSBob3QgbW9kdWxlLCB3aGljaCBrZWVwcyB0cmFjayBvZiBpdHMgY29uc3RydWN0b3JcbiAqIGFuZCBpbnN0YW5jZXNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cblxuZXhwb3J0cy5jcmVhdGVSZWNvcmQgPSBmdW5jdGlvbiAoaWQsIG9wdGlvbnMpIHtcbiAgaWYobWFwW2lkXSkgeyByZXR1cm4gfVxuXG4gIHZhciBDdG9yID0gbnVsbFxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBDdG9yID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnNcbiAgfVxuICBtYWtlT3B0aW9uc0hvdChpZCwgb3B0aW9ucylcbiAgbWFwW2lkXSA9IHtcbiAgICBDdG9yOiBDdG9yLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgaW5zdGFuY2VzOiBbXVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgbW9kdWxlIGlzIHJlY29yZGVkXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGlkXG4gKi9cblxuZXhwb3J0cy5pc1JlY29yZGVkID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiB0eXBlb2YgbWFwW2lkXSAhPT0gJ3VuZGVmaW5lZCdcbn1cblxuLyoqXG4gKiBNYWtlIGEgQ29tcG9uZW50IG9wdGlvbnMgb2JqZWN0IGhvdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cblxuZnVuY3Rpb24gbWFrZU9wdGlvbnNIb3QoaWQsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgIHZhciByZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgIG9wdGlvbnMucmVuZGVyID0gZnVuY3Rpb24gKGgsIGN0eCkge1xuICAgICAgdmFyIGluc3RhbmNlcyA9IG1hcFtpZF0uaW5zdGFuY2VzXG4gICAgICBpZiAoY3R4ICYmIGluc3RhbmNlcy5pbmRleE9mKGN0eC5wYXJlbnQpIDwgMCkge1xuICAgICAgICBpbnN0YW5jZXMucHVzaChjdHgucGFyZW50KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlbmRlcihoLCBjdHgpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGluamVjdEhvb2sob3B0aW9ucywgaW5pdEhvb2tOYW1lLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZWNvcmQgPSBtYXBbaWRdXG4gICAgICBpZiAoIXJlY29yZC5DdG9yKSB7XG4gICAgICAgIHJlY29yZC5DdG9yID0gdGhpcy5jb25zdHJ1Y3RvclxuICAgICAgfVxuICAgICAgcmVjb3JkLmluc3RhbmNlcy5wdXNoKHRoaXMpXG4gICAgfSlcbiAgICBpbmplY3RIb29rKG9wdGlvbnMsICdiZWZvcmVEZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaW5zdGFuY2VzID0gbWFwW2lkXS5pbnN0YW5jZXNcbiAgICAgIGluc3RhbmNlcy5zcGxpY2UoaW5zdGFuY2VzLmluZGV4T2YodGhpcyksIDEpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEluamVjdCBhIGhvb2sgdG8gYSBob3QgcmVsb2FkYWJsZSBjb21wb25lbnQgc28gdGhhdFxuICogd2UgY2FuIGtlZXAgdHJhY2sgb2YgaXQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBob29rXG4gKi9cblxuZnVuY3Rpb24gaW5qZWN0SG9vayhvcHRpb25zLCBuYW1lLCBob29rKSB7XG4gIHZhciBleGlzdGluZyA9IG9wdGlvbnNbbmFtZV1cbiAgb3B0aW9uc1tuYW1lXSA9IGV4aXN0aW5nXG4gICAgPyBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IGV4aXN0aW5nLmNvbmNhdChob29rKSA6IFtleGlzdGluZywgaG9va11cbiAgICA6IFtob29rXVxufVxuXG5mdW5jdGlvbiB0cnlXcmFwKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaWQsIGFyZykge1xuICAgIHRyeSB7XG4gICAgICBmbihpZCwgYXJnKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1NvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBWdWUgY29tcG9uZW50IGhvdC1yZWxvYWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLidcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyAob2xkT3B0aW9ucywgbmV3T3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gb2xkT3B0aW9ucykge1xuICAgIGlmICghKGtleSBpbiBuZXdPcHRpb25zKSkge1xuICAgICAgZGVsZXRlIG9sZE9wdGlvbnNba2V5XVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciBrZXkkMSBpbiBuZXdPcHRpb25zKSB7XG4gICAgb2xkT3B0aW9uc1trZXkkMV0gPSBuZXdPcHRpb25zW2tleSQxXVxuICB9XG59XG5cbmV4cG9ydHMucmVyZW5kZXIgPSB0cnlXcmFwKGZ1bmN0aW9uIChpZCwgb3B0aW9ucykge1xuICB2YXIgcmVjb3JkID0gbWFwW2lkXVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZWNvcmQuaW5zdGFuY2VzLnNsaWNlKCkuZm9yRWFjaChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLiRmb3JjZVVwZGF0ZSgpXG4gICAgfSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucy5vcHRpb25zXG4gIH1cbiAgaWYgKHJlY29yZC5DdG9yKSB7XG4gICAgcmVjb3JkLkN0b3Iub3B0aW9ucy5yZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgIHJlY29yZC5DdG9yLm9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNcbiAgICByZWNvcmQuaW5zdGFuY2VzLnNsaWNlKCkuZm9yRWFjaChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLiRvcHRpb25zLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyXG4gICAgICBpbnN0YW5jZS4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuc1xuICAgICAgLy8gcmVzZXQgc3RhdGljIHRyZWVzXG4gICAgICAvLyBwcmUgMi41LCBhbGwgc3RhdGljIHRyZWVzIGFyZSBjYWNoZWQgdG9nZXRoZXIgb24gdGhlIGluc3RhbmNlXG4gICAgICBpZiAoaW5zdGFuY2UuX3N0YXRpY1RyZWVzKSB7XG4gICAgICAgIGluc3RhbmNlLl9zdGF0aWNUcmVlcyA9IFtdXG4gICAgICB9XG4gICAgICAvLyAyLjUuMFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVjb3JkLkN0b3Iub3B0aW9ucy5jYWNoZWQpKSB7XG4gICAgICAgIHJlY29yZC5DdG9yLm9wdGlvbnMuY2FjaGVkID0gW11cbiAgICAgIH1cbiAgICAgIC8vIDIuNS4zXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnN0YW5jZS4kb3B0aW9ucy5jYWNoZWQpKSB7XG4gICAgICAgIGluc3RhbmNlLiRvcHRpb25zLmNhY2hlZCA9IFtdXG4gICAgICB9XG5cbiAgICAgIC8vIHBvc3QgMi41LjQ6IHYtb25jZSB0cmVlcyBhcmUgY2FjaGVkIG9uIGluc3RhbmNlLl9zdGF0aWNUcmVlcy5cbiAgICAgIC8vIFB1cmUgc3RhdGljIHRyZWVzIGFyZSBjYWNoZWQgb24gdGhlIHN0YXRpY1JlbmRlckZucyBhcnJheVxuICAgICAgLy8gKGJvdGggYWxyZWFkeSByZXNldCBhYm92ZSlcblxuICAgICAgLy8gMi42OiB0ZW1wb3JhcmlseSBtYXJrIHJlbmRlcmVkIHNjb3BlZCBzbG90cyBhcyB1bnN0YWJsZSBzbyB0aGF0XG4gICAgICAvLyBjaGlsZCBjb21wb25lbnRzIGNhbiBiZSBmb3JjZWQgdG8gdXBkYXRlXG4gICAgICB2YXIgcmVzdG9yZSA9IHBhdGNoU2NvcGVkU2xvdHMoaW5zdGFuY2UpXG4gICAgICBpbnN0YW5jZS4kZm9yY2VVcGRhdGUoKVxuICAgICAgaW5zdGFuY2UuJG5leHRUaWNrKHJlc3RvcmUpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICAvLyBmdW5jdGlvbmFsIG9yIG5vIGluc3RhbmNlIGNyZWF0ZWQgeWV0XG4gICAgcmVjb3JkLm9wdGlvbnMucmVuZGVyID0gb3B0aW9ucy5yZW5kZXJcbiAgICByZWNvcmQub3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuc1xuXG4gICAgLy8gaGFuZGxlIGZ1bmN0aW9uYWwgY29tcG9uZW50IHJlLXJlbmRlclxuICAgIGlmIChyZWNvcmQub3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyByZXJlbmRlciB3aXRoIGZ1bGwgb3B0aW9uc1xuICAgICAgaWYgKE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdXBkYXRlT3B0aW9ucyhyZWNvcmQub3B0aW9ucywgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRlbXBsYXRlLW9ubHkgcmVyZW5kZXIuXG4gICAgICAgIC8vIG5lZWQgdG8gaW5qZWN0IHRoZSBzdHlsZSBpbmplY3Rpb24gY29kZSBmb3IgQ1NTIG1vZHVsZXNcbiAgICAgICAgLy8gdG8gd29yayBwcm9wZXJseS5cbiAgICAgICAgdmFyIGluamVjdFN0eWxlcyA9IHJlY29yZC5vcHRpb25zLl9pbmplY3RTdHlsZXNcbiAgICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICAgIHZhciByZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgICAgIHJlY29yZC5vcHRpb25zLnJlbmRlciA9IGZ1bmN0aW9uIChoLCBjdHgpIHtcbiAgICAgICAgICAgIGluamVjdFN0eWxlcy5jYWxsKGN0eClcbiAgICAgICAgICAgIHJldHVybiByZW5kZXIoaCwgY3R4KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVjb3JkLm9wdGlvbnMuX0N0b3IgPSBudWxsXG4gICAgICAvLyAyLjUuM1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVjb3JkLm9wdGlvbnMuY2FjaGVkKSkge1xuICAgICAgICByZWNvcmQub3B0aW9ucy5jYWNoZWQgPSBbXVxuICAgICAgfVxuICAgICAgcmVjb3JkLmluc3RhbmNlcy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgIGluc3RhbmNlLiRmb3JjZVVwZGF0ZSgpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufSlcblxuZXhwb3J0cy5yZWxvYWQgPSB0cnlXcmFwKGZ1bmN0aW9uIChpZCwgb3B0aW9ucykge1xuICB2YXIgcmVjb3JkID0gbWFwW2lkXVxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMub3B0aW9uc1xuICAgIH1cbiAgICBtYWtlT3B0aW9uc0hvdChpZCwgb3B0aW9ucylcbiAgICBpZiAocmVjb3JkLkN0b3IpIHtcbiAgICAgIGlmICh2ZXJzaW9uWzFdIDwgMikge1xuICAgICAgICAvLyBwcmVzZXJ2ZSBwcmUgMi4yIGJlaGF2aW9yIGZvciBnbG9iYWwgbWl4aW4gaGFuZGxpbmdcbiAgICAgICAgcmVjb3JkLkN0b3IuZXh0ZW5kT3B0aW9ucyA9IG9wdGlvbnNcbiAgICAgIH1cbiAgICAgIHZhciBuZXdDdG9yID0gcmVjb3JkLkN0b3Iuc3VwZXIuZXh0ZW5kKG9wdGlvbnMpXG4gICAgICAvLyBwcmV2ZW50IHJlY29yZC5vcHRpb25zLl9DdG9yIGZyb20gYmVpbmcgb3ZlcndyaXR0ZW4gYWNjaWRlbnRhbGx5XG4gICAgICBuZXdDdG9yLm9wdGlvbnMuX0N0b3IgPSByZWNvcmQub3B0aW9ucy5fQ3RvclxuICAgICAgcmVjb3JkLkN0b3Iub3B0aW9ucyA9IG5ld0N0b3Iub3B0aW9uc1xuICAgICAgcmVjb3JkLkN0b3IuY2lkID0gbmV3Q3Rvci5jaWRcbiAgICAgIHJlY29yZC5DdG9yLnByb3RvdHlwZSA9IG5ld0N0b3IucHJvdG90eXBlXG4gICAgICBpZiAobmV3Q3Rvci5yZWxlYXNlKSB7XG4gICAgICAgIC8vIHRlbXBvcmFyeSBnbG9iYWwgbWl4aW4gc3RyYXRlZ3kgdXNlZCBpbiA8IDIuMC4wLWFscGhhLjZcbiAgICAgICAgbmV3Q3Rvci5yZWxlYXNlKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlT3B0aW9ucyhyZWNvcmQub3B0aW9ucywgb3B0aW9ucylcbiAgICB9XG4gIH1cbiAgcmVjb3JkLmluc3RhbmNlcy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgaWYgKGluc3RhbmNlLiR2bm9kZSAmJiBpbnN0YW5jZS4kdm5vZGUuY29udGV4dCkge1xuICAgICAgaW5zdGFuY2UuJHZub2RlLmNvbnRleHQuJGZvcmNlVXBkYXRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnUm9vdCBvciBtYW51YWxseSBtb3VudGVkIGluc3RhbmNlIG1vZGlmaWVkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC4nXG4gICAgICApXG4gICAgfVxuICB9KVxufSlcblxuLy8gMi42IG9wdGltaXplcyB0ZW1wbGF0ZS1jb21waWxlZCBzY29wZWQgc2xvdHMgYW5kIHNraXBzIHVwZGF0ZXMgaWYgY2hpbGRcbi8vIG9ubHkgdXNlcyBzY29wZWQgc2xvdHMuIFdlIG5lZWQgdG8gcGF0Y2ggdGhlIHNjb3BlZCBzbG90cyByZXNvbHZpbmcgaGVscGVyXG4vLyB0byB0ZW1wb3JhcmlseSBtYXJrIGFsbCBzY29wZWQgc2xvdHMgYXMgdW5zdGFibGUgaW4gb3JkZXIgdG8gZm9yY2UgY2hpbGRcbi8vIHVwZGF0ZXMuXG5mdW5jdGlvbiBwYXRjaFNjb3BlZFNsb3RzIChpbnN0YW5jZSkge1xuICBpZiAoIWluc3RhbmNlLl91KSB7IHJldHVybiB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvYmxvYi9kZXYvc3JjL2NvcmUvaW5zdGFuY2UvcmVuZGVyLWhlbHBlcnMvcmVzb2x2ZS1zY29wZWQtc2xvdHMuanNcbiAgdmFyIG9yaWdpbmFsID0gaW5zdGFuY2UuX3VcbiAgaW5zdGFuY2UuX3UgPSBmdW5jdGlvbiAoc2xvdHMpIHtcbiAgICB0cnkge1xuICAgICAgLy8gMi42LjQgfiAyLjYuNlxuICAgICAgcmV0dXJuIG9yaWdpbmFsKHNsb3RzLCB0cnVlKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIDIuNSAvID49IDIuNi43XG4gICAgICByZXR1cm4gb3JpZ2luYWwoc2xvdHMsIG51bGwsIHRydWUpXG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaW5zdGFuY2UuX3UgPSBvcmlnaW5hbFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\n");

/***/ }),

/***/ "./node_modules/_vue-i18n@8.15.0@vue-i18n/dist/vue-i18n.esm.js":
/*!*********************************************************************!*\
  !*** ./node_modules/_vue-i18n@8.15.0@vue-i18n/dist/vue-i18n.esm.js ***!
  \*********************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/*!\n * vue-i18n v8.15.0 \n * (c) 2019 kazuya kawaguchi\n * Released under the MIT License.\n */\n/*  */\n\n/**\n * constants\n */\n\nvar numberFormatKeys = [\n  'style',\n  'currency',\n  'currencyDisplay',\n  'useGrouping',\n  'minimumIntegerDigits',\n  'minimumFractionDigits',\n  'maximumFractionDigits',\n  'minimumSignificantDigits',\n  'maximumSignificantDigits',\n  'localeMatcher',\n  'formatMatcher'\n];\n\n/**\n * utilities\n */\n\nfunction warn (msg, err) {\n  if (typeof console !== 'undefined') {\n    console.warn('[vue-i18n] ' + msg);\n    /* istanbul ignore if */\n    if (err) {\n      console.warn(err.stack);\n    }\n  }\n}\n\nfunction error (msg, err) {\n  if (typeof console !== 'undefined') {\n    console.error('[vue-i18n] ' + msg);\n    /* istanbul ignore if */\n    if (err) {\n      console.error(err.stack);\n    }\n  }\n}\n\nfunction isObject (obj) {\n  return obj !== null && typeof obj === 'object'\n}\n\nvar toString = Object.prototype.toString;\nvar OBJECT_STRING = '[object Object]';\nfunction isPlainObject (obj) {\n  return toString.call(obj) === OBJECT_STRING\n}\n\nfunction isNull (val) {\n  return val === null || val === undefined\n}\n\nfunction parseArgs () {\n  var args = [], len = arguments.length;\n  while ( len-- ) args[ len ] = arguments[ len ];\n\n  var locale = null;\n  var params = null;\n  if (args.length === 1) {\n    if (isObject(args[0]) || Array.isArray(args[0])) {\n      params = args[0];\n    } else if (typeof args[0] === 'string') {\n      locale = args[0];\n    }\n  } else if (args.length === 2) {\n    if (typeof args[0] === 'string') {\n      locale = args[0];\n    }\n    /* istanbul ignore if */\n    if (isObject(args[1]) || Array.isArray(args[1])) {\n      params = args[1];\n    }\n  }\n\n  return { locale: locale, params: params }\n}\n\nfunction looseClone (obj) {\n  return JSON.parse(JSON.stringify(obj))\n}\n\nfunction remove (arr, item) {\n  if (arr.length) {\n    var index = arr.indexOf(item);\n    if (index > -1) {\n      return arr.splice(index, 1)\n    }\n  }\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n  return hasOwnProperty.call(obj, key)\n}\n\nfunction merge (target) {\n  var arguments$1 = arguments;\n\n  var output = Object(target);\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments$1[i];\n    if (source !== undefined && source !== null) {\n      var key = (void 0);\n      for (key in source) {\n        if (hasOwn(source, key)) {\n          if (isObject(source[key])) {\n            output[key] = merge(output[key], source[key]);\n          } else {\n            output[key] = source[key];\n          }\n        }\n      }\n    }\n  }\n  return output\n}\n\nfunction looseEqual (a, b) {\n  if (a === b) { return true }\n  var isObjectA = isObject(a);\n  var isObjectB = isObject(b);\n  if (isObjectA && isObjectB) {\n    try {\n      var isArrayA = Array.isArray(a);\n      var isArrayB = Array.isArray(b);\n      if (isArrayA && isArrayB) {\n        return a.length === b.length && a.every(function (e, i) {\n          return looseEqual(e, b[i])\n        })\n      } else if (!isArrayA && !isArrayB) {\n        var keysA = Object.keys(a);\n        var keysB = Object.keys(b);\n        return keysA.length === keysB.length && keysA.every(function (key) {\n          return looseEqual(a[key], b[key])\n        })\n      } else {\n        /* istanbul ignore next */\n        return false\n      }\n    } catch (e) {\n      /* istanbul ignore next */\n      return false\n    }\n  } else if (!isObjectA && !isObjectB) {\n    return String(a) === String(b)\n  } else {\n    return false\n  }\n}\n\n/*  */\n\nfunction extend (Vue) {\n  if (!Vue.prototype.hasOwnProperty('$i18n')) {\n    // $FlowFixMe\n    Object.defineProperty(Vue.prototype, '$i18n', {\n      get: function get () { return this._i18n }\n    });\n  }\n\n  Vue.prototype.$t = function (key) {\n    var values = [], len = arguments.length - 1;\n    while ( len-- > 0 ) values[ len ] = arguments[ len + 1 ];\n\n    var i18n = this.$i18n;\n    return i18n._t.apply(i18n, [ key, i18n.locale, i18n._getMessages(), this ].concat( values ))\n  };\n\n  Vue.prototype.$tc = function (key, choice) {\n    var values = [], len = arguments.length - 2;\n    while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];\n\n    var i18n = this.$i18n;\n    return i18n._tc.apply(i18n, [ key, i18n.locale, i18n._getMessages(), this, choice ].concat( values ))\n  };\n\n  Vue.prototype.$te = function (key, locale) {\n    var i18n = this.$i18n;\n    return i18n._te(key, i18n.locale, i18n._getMessages(), locale)\n  };\n\n  Vue.prototype.$d = function (value) {\n    var ref;\n\n    var args = [], len = arguments.length - 1;\n    while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n    return (ref = this.$i18n).d.apply(ref, [ value ].concat( args ))\n  };\n\n  Vue.prototype.$n = function (value) {\n    var ref;\n\n    var args = [], len = arguments.length - 1;\n    while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n    return (ref = this.$i18n).n.apply(ref, [ value ].concat( args ))\n  };\n}\n\n/*  */\n\nvar mixin = {\n  beforeCreate: function beforeCreate () {\n    var options = this.$options;\n    options.i18n = options.i18n || (options.__i18n ? {} : null);\n\n    if (options.i18n) {\n      if (options.i18n instanceof VueI18n) {\n        // init locale messages via custom blocks\n        if (options.__i18n) {\n          try {\n            var localeMessages = {};\n            options.__i18n.forEach(function (resource) {\n              localeMessages = merge(localeMessages, JSON.parse(resource));\n            });\n            Object.keys(localeMessages).forEach(function (locale) {\n              options.i18n.mergeLocaleMessage(locale, localeMessages[locale]);\n            });\n          } catch (e) {\n            if (true) {\n              warn(\"Cannot parse locale messages via custom blocks.\", e);\n            }\n          }\n        }\n        this._i18n = options.i18n;\n        this._i18nWatcher = this._i18n.watchI18nData();\n      } else if (isPlainObject(options.i18n)) {\n        // component local i18n\n        if (this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n) {\n          options.i18n.root = this.$root;\n          options.i18n.formatter = this.$root.$i18n.formatter;\n          options.i18n.fallbackLocale = this.$root.$i18n.fallbackLocale;\n          options.i18n.formatFallbackMessages = this.$root.$i18n.formatFallbackMessages;\n          options.i18n.silentTranslationWarn = this.$root.$i18n.silentTranslationWarn;\n          options.i18n.silentFallbackWarn = this.$root.$i18n.silentFallbackWarn;\n          options.i18n.pluralizationRules = this.$root.$i18n.pluralizationRules;\n          options.i18n.preserveDirectiveContent = this.$root.$i18n.preserveDirectiveContent;\n        }\n\n        // init locale messages via custom blocks\n        if (options.__i18n) {\n          try {\n            var localeMessages$1 = {};\n            options.__i18n.forEach(function (resource) {\n              localeMessages$1 = merge(localeMessages$1, JSON.parse(resource));\n            });\n            options.i18n.messages = localeMessages$1;\n          } catch (e) {\n            if (true) {\n              warn(\"Cannot parse locale messages via custom blocks.\", e);\n            }\n          }\n        }\n\n        var ref = options.i18n;\n        var sharedMessages = ref.sharedMessages;\n        if (sharedMessages && isPlainObject(sharedMessages)) {\n          options.i18n.messages = merge(options.i18n.messages, sharedMessages);\n        }\n\n        this._i18n = new VueI18n(options.i18n);\n        this._i18nWatcher = this._i18n.watchI18nData();\n\n        if (options.i18n.sync === undefined || !!options.i18n.sync) {\n          this._localeWatcher = this.$i18n.watchLocale();\n        }\n      } else {\n        if (true) {\n          warn(\"Cannot be interpreted 'i18n' option.\");\n        }\n      }\n    } else if (this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n) {\n      // root i18n\n      this._i18n = this.$root.$i18n;\n    } else if (options.parent && options.parent.$i18n && options.parent.$i18n instanceof VueI18n) {\n      // parent i18n\n      this._i18n = options.parent.$i18n;\n    }\n  },\n\n  beforeMount: function beforeMount () {\n    var options = this.$options;\n    options.i18n = options.i18n || (options.__i18n ? {} : null);\n\n    if (options.i18n) {\n      if (options.i18n instanceof VueI18n) {\n        // init locale messages via custom blocks\n        this._i18n.subscribeDataChanging(this);\n        this._subscribing = true;\n      } else if (isPlainObject(options.i18n)) {\n        this._i18n.subscribeDataChanging(this);\n        this._subscribing = true;\n      } else {\n        if (true) {\n          warn(\"Cannot be interpreted 'i18n' option.\");\n        }\n      }\n    } else if (this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n) {\n      this._i18n.subscribeDataChanging(this);\n      this._subscribing = true;\n    } else if (options.parent && options.parent.$i18n && options.parent.$i18n instanceof VueI18n) {\n      this._i18n.subscribeDataChanging(this);\n      this._subscribing = true;\n    }\n  },\n\n  beforeDestroy: function beforeDestroy () {\n    if (!this._i18n) { return }\n\n    var self = this;\n    this.$nextTick(function () {\n      if (self._subscribing) {\n        self._i18n.unsubscribeDataChanging(self);\n        delete self._subscribing;\n      }\n\n      if (self._i18nWatcher) {\n        self._i18nWatcher();\n        self._i18n.destroyVM();\n        delete self._i18nWatcher;\n      }\n\n      if (self._localeWatcher) {\n        self._localeWatcher();\n        delete self._localeWatcher;\n      }\n\n      self._i18n = null;\n    });\n  }\n};\n\n/*  */\n\nvar interpolationComponent = {\n  name: 'i18n',\n  functional: true,\n  props: {\n    tag: {\n      type: String\n    },\n    path: {\n      type: String,\n      required: true\n    },\n    locale: {\n      type: String\n    },\n    places: {\n      type: [Array, Object]\n    }\n  },\n  render: function render (h, ref) {\n    var data = ref.data;\n    var parent = ref.parent;\n    var props = ref.props;\n    var slots = ref.slots;\n\n    var $i18n = parent.$i18n;\n    if (!$i18n) {\n      if (true) {\n        warn('Cannot find VueI18n instance!');\n      }\n      return\n    }\n\n    var path = props.path;\n    var locale = props.locale;\n    var places = props.places;\n    var params = slots();\n    var children = $i18n.i(\n      path,\n      locale,\n      onlyHasDefaultPlace(params) || places\n        ? useLegacyPlaces(params.default, places)\n        : params\n    );\n\n    var tag = props.tag || 'span';\n    return tag ? h(tag, data, children) : children\n  }\n};\n\nfunction onlyHasDefaultPlace (params) {\n  var prop;\n  for (prop in params) {\n    if (prop !== 'default') { return false }\n  }\n  return Boolean(prop)\n}\n\nfunction useLegacyPlaces (children, places) {\n  var params = places ? createParamsFromPlaces(places) : {};\n\n  if (!children) { return params }\n\n  // Filter empty text nodes\n  children = children.filter(function (child) {\n    return child.tag || child.text.trim() !== ''\n  });\n\n  var everyPlace = children.every(vnodeHasPlaceAttribute);\n  if ( true && everyPlace) {\n    warn('`place` attribute is deprecated in next major version. Please switch to Vue slots.');\n  }\n\n  return children.reduce(\n    everyPlace ? assignChildPlace : assignChildIndex,\n    params\n  )\n}\n\nfunction createParamsFromPlaces (places) {\n  if (true) {\n    warn('`places` prop is deprecated in next major version. Please switch to Vue slots.');\n  }\n\n  return Array.isArray(places)\n    ? places.reduce(assignChildIndex, {})\n    : Object.assign({}, places)\n}\n\nfunction assignChildPlace (params, child) {\n  if (child.data && child.data.attrs && child.data.attrs.place) {\n    params[child.data.attrs.place] = child;\n  }\n  return params\n}\n\nfunction assignChildIndex (params, child, index) {\n  params[index] = child;\n  return params\n}\n\nfunction vnodeHasPlaceAttribute (vnode) {\n  return Boolean(vnode.data && vnode.data.attrs && vnode.data.attrs.place)\n}\n\n/*  */\n\nvar numberComponent = {\n  name: 'i18n-n',\n  functional: true,\n  props: {\n    tag: {\n      type: String,\n      default: 'span'\n    },\n    value: {\n      type: Number,\n      required: true\n    },\n    format: {\n      type: [String, Object]\n    },\n    locale: {\n      type: String\n    }\n  },\n  render: function render (h, ref) {\n    var props = ref.props;\n    var parent = ref.parent;\n    var data = ref.data;\n\n    var i18n = parent.$i18n;\n\n    if (!i18n) {\n      if (true) {\n        warn('Cannot find VueI18n instance!');\n      }\n      return null\n    }\n\n    var key = null;\n    var options = null;\n\n    if (typeof props.format === 'string') {\n      key = props.format;\n    } else if (isObject(props.format)) {\n      if (props.format.key) {\n        key = props.format.key;\n      }\n\n      // Filter out number format options only\n      options = Object.keys(props.format).reduce(function (acc, prop) {\n        var obj;\n\n        if (numberFormatKeys.includes(prop)) {\n          return Object.assign({}, acc, ( obj = {}, obj[prop] = props.format[prop], obj ))\n        }\n        return acc\n      }, null);\n    }\n\n    var locale = props.locale || i18n.locale;\n    var parts = i18n._ntp(props.value, locale, key, options);\n\n    var values = parts.map(function (part, index) {\n      var obj;\n\n      var slot = data.scopedSlots && data.scopedSlots[part.type];\n      return slot ? slot(( obj = {}, obj[part.type] = part.value, obj.index = index, obj.parts = parts, obj )) : part.value\n    });\n\n    return h(props.tag, {\n      attrs: data.attrs,\n      'class': data['class'],\n      staticClass: data.staticClass\n    }, values)\n  }\n};\n\n/*  */\n\nfunction bind (el, binding, vnode) {\n  if (!assert(el, vnode)) { return }\n\n  t(el, binding, vnode);\n}\n\nfunction update (el, binding, vnode, oldVNode) {\n  if (!assert(el, vnode)) { return }\n\n  var i18n = vnode.context.$i18n;\n  if (localeEqual(el, vnode) &&\n    (looseEqual(binding.value, binding.oldValue) &&\n     looseEqual(el._localeMessage, i18n.getLocaleMessage(i18n.locale)))) { return }\n\n  t(el, binding, vnode);\n}\n\nfunction unbind (el, binding, vnode, oldVNode) {\n  var vm = vnode.context;\n  if (!vm) {\n    warn('Vue instance does not exists in VNode context');\n    return\n  }\n\n  var i18n = vnode.context.$i18n || {};\n  if (!binding.modifiers.preserve && !i18n.preserveDirectiveContent) {\n    el.textContent = '';\n  }\n  el._vt = undefined;\n  delete el['_vt'];\n  el._locale = undefined;\n  delete el['_locale'];\n  el._localeMessage = undefined;\n  delete el['_localeMessage'];\n}\n\nfunction assert (el, vnode) {\n  var vm = vnode.context;\n  if (!vm) {\n    warn('Vue instance does not exists in VNode context');\n    return false\n  }\n\n  if (!vm.$i18n) {\n    warn('VueI18n instance does not exists in Vue instance');\n    return false\n  }\n\n  return true\n}\n\nfunction localeEqual (el, vnode) {\n  var vm = vnode.context;\n  return el._locale === vm.$i18n.locale\n}\n\nfunction t (el, binding, vnode) {\n  var ref$1, ref$2;\n\n  var value = binding.value;\n\n  var ref = parseValue(value);\n  var path = ref.path;\n  var locale = ref.locale;\n  var args = ref.args;\n  var choice = ref.choice;\n  if (!path && !locale && !args) {\n    warn('value type not supported');\n    return\n  }\n\n  if (!path) {\n    warn('`path` is required in v-t directive');\n    return\n  }\n\n  var vm = vnode.context;\n  if (choice) {\n    el._vt = el.textContent = (ref$1 = vm.$i18n).tc.apply(ref$1, [ path, choice ].concat( makeParams(locale, args) ));\n  } else {\n    el._vt = el.textContent = (ref$2 = vm.$i18n).t.apply(ref$2, [ path ].concat( makeParams(locale, args) ));\n  }\n  el._locale = vm.$i18n.locale;\n  el._localeMessage = vm.$i18n.getLocaleMessage(vm.$i18n.locale);\n}\n\nfunction parseValue (value) {\n  var path;\n  var locale;\n  var args;\n  var choice;\n\n  if (typeof value === 'string') {\n    path = value;\n  } else if (isPlainObject(value)) {\n    path = value.path;\n    locale = value.locale;\n    args = value.args;\n    choice = value.choice;\n  }\n\n  return { path: path, locale: locale, args: args, choice: choice }\n}\n\nfunction makeParams (locale, args) {\n  var params = [];\n\n  locale && params.push(locale);\n  if (args && (Array.isArray(args) || isPlainObject(args))) {\n    params.push(args);\n  }\n\n  return params\n}\n\nvar Vue;\n\nfunction install (_Vue) {\n  /* istanbul ignore if */\n  if ( true && install.installed && _Vue === Vue) {\n    warn('already installed.');\n    return\n  }\n  install.installed = true;\n\n  Vue = _Vue;\n\n  var version = (Vue.version && Number(Vue.version.split('.')[0])) || -1;\n  /* istanbul ignore if */\n  if ( true && version < 2) {\n    warn((\"vue-i18n (\" + (install.version) + \") need to use Vue 2.0 or later (Vue: \" + (Vue.version) + \").\"));\n    return\n  }\n\n  extend(Vue);\n  Vue.mixin(mixin);\n  Vue.directive('t', { bind: bind, update: update, unbind: unbind });\n  Vue.component(interpolationComponent.name, interpolationComponent);\n  Vue.component(numberComponent.name, numberComponent);\n\n  // use simple mergeStrategies to prevent i18n instance lose '__proto__'\n  var strats = Vue.config.optionMergeStrategies;\n  strats.i18n = function (parentVal, childVal) {\n    return childVal === undefined\n      ? parentVal\n      : childVal\n  };\n}\n\n/*  */\n\nvar BaseFormatter = function BaseFormatter () {\n  this._caches = Object.create(null);\n};\n\nBaseFormatter.prototype.interpolate = function interpolate (message, values) {\n  if (!values) {\n    return [message]\n  }\n  var tokens = this._caches[message];\n  if (!tokens) {\n    tokens = parse(message);\n    this._caches[message] = tokens;\n  }\n  return compile(tokens, values)\n};\n\n\n\nvar RE_TOKEN_LIST_VALUE = /^(?:\\d)+/;\nvar RE_TOKEN_NAMED_VALUE = /^(?:\\w)+/;\n\nfunction parse (format) {\n  var tokens = [];\n  var position = 0;\n\n  var text = '';\n  while (position < format.length) {\n    var char = format[position++];\n    if (char === '{') {\n      if (text) {\n        tokens.push({ type: 'text', value: text });\n      }\n\n      text = '';\n      var sub = '';\n      char = format[position++];\n      while (char !== undefined && char !== '}') {\n        sub += char;\n        char = format[position++];\n      }\n      var isClosed = char === '}';\n\n      var type = RE_TOKEN_LIST_VALUE.test(sub)\n        ? 'list'\n        : isClosed && RE_TOKEN_NAMED_VALUE.test(sub)\n          ? 'named'\n          : 'unknown';\n      tokens.push({ value: sub, type: type });\n    } else if (char === '%') {\n      // when found rails i18n syntax, skip text capture\n      if (format[(position)] !== '{') {\n        text += char;\n      }\n    } else {\n      text += char;\n    }\n  }\n\n  text && tokens.push({ type: 'text', value: text });\n\n  return tokens\n}\n\nfunction compile (tokens, values) {\n  var compiled = [];\n  var index = 0;\n\n  var mode = Array.isArray(values)\n    ? 'list'\n    : isObject(values)\n      ? 'named'\n      : 'unknown';\n  if (mode === 'unknown') { return compiled }\n\n  while (index < tokens.length) {\n    var token = tokens[index];\n    switch (token.type) {\n      case 'text':\n        compiled.push(token.value);\n        break\n      case 'list':\n        compiled.push(values[parseInt(token.value, 10)]);\n        break\n      case 'named':\n        if (mode === 'named') {\n          compiled.push((values)[token.value]);\n        } else {\n          if (true) {\n            warn((\"Type of token '\" + (token.type) + \"' and format of value '\" + mode + \"' don't match!\"));\n          }\n        }\n        break\n      case 'unknown':\n        if (true) {\n          warn(\"Detect 'unknown' type of token!\");\n        }\n        break\n    }\n    index++;\n  }\n\n  return compiled\n}\n\n/*  */\n\n/**\n *  Path parser\n *  - Inspired:\n *    Vue.js Path parser\n */\n\n// actions\nvar APPEND = 0;\nvar PUSH = 1;\nvar INC_SUB_PATH_DEPTH = 2;\nvar PUSH_SUB_PATH = 3;\n\n// states\nvar BEFORE_PATH = 0;\nvar IN_PATH = 1;\nvar BEFORE_IDENT = 2;\nvar IN_IDENT = 3;\nvar IN_SUB_PATH = 4;\nvar IN_SINGLE_QUOTE = 5;\nvar IN_DOUBLE_QUOTE = 6;\nvar AFTER_PATH = 7;\nvar ERROR = 8;\n\nvar pathStateMachine = [];\n\npathStateMachine[BEFORE_PATH] = {\n  'ws': [BEFORE_PATH],\n  'ident': [IN_IDENT, APPEND],\n  '[': [IN_SUB_PATH],\n  'eof': [AFTER_PATH]\n};\n\npathStateMachine[IN_PATH] = {\n  'ws': [IN_PATH],\n  '.': [BEFORE_IDENT],\n  '[': [IN_SUB_PATH],\n  'eof': [AFTER_PATH]\n};\n\npathStateMachine[BEFORE_IDENT] = {\n  'ws': [BEFORE_IDENT],\n  'ident': [IN_IDENT, APPEND],\n  '0': [IN_IDENT, APPEND],\n  'number': [IN_IDENT, APPEND]\n};\n\npathStateMachine[IN_IDENT] = {\n  'ident': [IN_IDENT, APPEND],\n  '0': [IN_IDENT, APPEND],\n  'number': [IN_IDENT, APPEND],\n  'ws': [IN_PATH, PUSH],\n  '.': [BEFORE_IDENT, PUSH],\n  '[': [IN_SUB_PATH, PUSH],\n  'eof': [AFTER_PATH, PUSH]\n};\n\npathStateMachine[IN_SUB_PATH] = {\n  \"'\": [IN_SINGLE_QUOTE, APPEND],\n  '\"': [IN_DOUBLE_QUOTE, APPEND],\n  '[': [IN_SUB_PATH, INC_SUB_PATH_DEPTH],\n  ']': [IN_PATH, PUSH_SUB_PATH],\n  'eof': ERROR,\n  'else': [IN_SUB_PATH, APPEND]\n};\n\npathStateMachine[IN_SINGLE_QUOTE] = {\n  \"'\": [IN_SUB_PATH, APPEND],\n  'eof': ERROR,\n  'else': [IN_SINGLE_QUOTE, APPEND]\n};\n\npathStateMachine[IN_DOUBLE_QUOTE] = {\n  '\"': [IN_SUB_PATH, APPEND],\n  'eof': ERROR,\n  'else': [IN_DOUBLE_QUOTE, APPEND]\n};\n\n/**\n * Check if an expression is a literal value.\n */\n\nvar literalValueRE = /^\\s?(?:true|false|-?[\\d.]+|'[^']*'|\"[^\"]*\")\\s?$/;\nfunction isLiteral (exp) {\n  return literalValueRE.test(exp)\n}\n\n/**\n * Strip quotes from a string\n */\n\nfunction stripQuotes (str) {\n  var a = str.charCodeAt(0);\n  var b = str.charCodeAt(str.length - 1);\n  return a === b && (a === 0x22 || a === 0x27)\n    ? str.slice(1, -1)\n    : str\n}\n\n/**\n * Determine the type of a character in a keypath.\n */\n\nfunction getPathCharType (ch) {\n  if (ch === undefined || ch === null) { return 'eof' }\n\n  var code = ch.charCodeAt(0);\n\n  switch (code) {\n    case 0x5B: // [\n    case 0x5D: // ]\n    case 0x2E: // .\n    case 0x22: // \"\n    case 0x27: // '\n      return ch\n\n    case 0x5F: // _\n    case 0x24: // $\n    case 0x2D: // -\n      return 'ident'\n\n    case 0x09: // Tab\n    case 0x0A: // Newline\n    case 0x0D: // Return\n    case 0xA0:  // No-break space\n    case 0xFEFF:  // Byte Order Mark\n    case 0x2028:  // Line Separator\n    case 0x2029:  // Paragraph Separator\n      return 'ws'\n  }\n\n  return 'ident'\n}\n\n/**\n * Format a subPath, return its plain form if it is\n * a literal string or number. Otherwise prepend the\n * dynamic indicator (*).\n */\n\nfunction formatSubPath (path) {\n  var trimmed = path.trim();\n  // invalid leading 0\n  if (path.charAt(0) === '0' && isNaN(path)) { return false }\n\n  return isLiteral(trimmed) ? stripQuotes(trimmed) : '*' + trimmed\n}\n\n/**\n * Parse a string path into an array of segments\n */\n\nfunction parse$1 (path) {\n  var keys = [];\n  var index = -1;\n  var mode = BEFORE_PATH;\n  var subPathDepth = 0;\n  var c;\n  var key;\n  var newChar;\n  var type;\n  var transition;\n  var action;\n  var typeMap;\n  var actions = [];\n\n  actions[PUSH] = function () {\n    if (key !== undefined) {\n      keys.push(key);\n      key = undefined;\n    }\n  };\n\n  actions[APPEND] = function () {\n    if (key === undefined) {\n      key = newChar;\n    } else {\n      key += newChar;\n    }\n  };\n\n  actions[INC_SUB_PATH_DEPTH] = function () {\n    actions[APPEND]();\n    subPathDepth++;\n  };\n\n  actions[PUSH_SUB_PATH] = function () {\n    if (subPathDepth > 0) {\n      subPathDepth--;\n      mode = IN_SUB_PATH;\n      actions[APPEND]();\n    } else {\n      subPathDepth = 0;\n      if (key === undefined) { return false }\n      key = formatSubPath(key);\n      if (key === false) {\n        return false\n      } else {\n        actions[PUSH]();\n      }\n    }\n  };\n\n  function maybeUnescapeQuote () {\n    var nextChar = path[index + 1];\n    if ((mode === IN_SINGLE_QUOTE && nextChar === \"'\") ||\n      (mode === IN_DOUBLE_QUOTE && nextChar === '\"')) {\n      index++;\n      newChar = '\\\\' + nextChar;\n      actions[APPEND]();\n      return true\n    }\n  }\n\n  while (mode !== null) {\n    index++;\n    c = path[index];\n\n    if (c === '\\\\' && maybeUnescapeQuote()) {\n      continue\n    }\n\n    type = getPathCharType(c);\n    typeMap = pathStateMachine[mode];\n    transition = typeMap[type] || typeMap['else'] || ERROR;\n\n    if (transition === ERROR) {\n      return // parse error\n    }\n\n    mode = transition[0];\n    action = actions[transition[1]];\n    if (action) {\n      newChar = transition[2];\n      newChar = newChar === undefined\n        ? c\n        : newChar;\n      if (action() === false) {\n        return\n      }\n    }\n\n    if (mode === AFTER_PATH) {\n      return keys\n    }\n  }\n}\n\n\n\n\n\nvar I18nPath = function I18nPath () {\n  this._cache = Object.create(null);\n};\n\n/**\n * External parse that check for a cache hit first\n */\nI18nPath.prototype.parsePath = function parsePath (path) {\n  var hit = this._cache[path];\n  if (!hit) {\n    hit = parse$1(path);\n    if (hit) {\n      this._cache[path] = hit;\n    }\n  }\n  return hit || []\n};\n\n/**\n * Get path value from path string\n */\nI18nPath.prototype.getPathValue = function getPathValue (obj, path) {\n  if (!isObject(obj)) { return null }\n\n  var paths = this.parsePath(path);\n  if (paths.length === 0) {\n    return null\n  } else {\n    var length = paths.length;\n    var last = obj;\n    var i = 0;\n    while (i < length) {\n      var value = last[paths[i]];\n      if (value === undefined) {\n        return null\n      }\n      last = value;\n      i++;\n    }\n\n    return last\n  }\n};\n\n/*  */\n\n\n\nvar htmlTagMatcher = /<\\/?[\\w\\s=\"/.':;#-\\/]+>/;\nvar linkKeyMatcher = /(?:@(?:\\.[a-z]+)?:(?:[\\w\\-_|.]+|\\([\\w\\-_|.]+\\)))/g;\nvar linkKeyPrefixMatcher = /^@(?:\\.([a-z]+))?:/;\nvar bracketsMatcher = /[()]/g;\nvar defaultModifiers = {\n  'upper': function (str) { return str.toLocaleUpperCase(); },\n  'lower': function (str) { return str.toLocaleLowerCase(); }\n};\n\nvar defaultFormatter = new BaseFormatter();\n\nvar VueI18n = function VueI18n (options) {\n  var this$1 = this;\n  if ( options === void 0 ) options = {};\n\n  // Auto install if it is not done yet and `window` has `Vue`.\n  // To allow users to avoid auto-installation in some cases,\n  // this code should be placed here. See #290\n  /* istanbul ignore if */\n  if (!Vue && typeof window !== 'undefined' && window.Vue) {\n    install(window.Vue);\n  }\n\n  var locale = options.locale || 'en-US';\n  var fallbackLocale = options.fallbackLocale || 'en-US';\n  var messages = options.messages || {};\n  var dateTimeFormats = options.dateTimeFormats || {};\n  var numberFormats = options.numberFormats || {};\n\n  this._vm = null;\n  this._formatter = options.formatter || defaultFormatter;\n  this._modifiers = options.modifiers || {};\n  this._missing = options.missing || null;\n  this._root = options.root || null;\n  this._sync = options.sync === undefined ? true : !!options.sync;\n  this._fallbackRoot = options.fallbackRoot === undefined\n    ? true\n    : !!options.fallbackRoot;\n  this._formatFallbackMessages = options.formatFallbackMessages === undefined\n    ? false\n    : !!options.formatFallbackMessages;\n  this._silentTranslationWarn = options.silentTranslationWarn === undefined\n    ? false\n    : options.silentTranslationWarn;\n  this._silentFallbackWarn = options.silentFallbackWarn === undefined\n    ? false\n    : !!options.silentFallbackWarn;\n  this._dateTimeFormatters = {};\n  this._numberFormatters = {};\n  this._path = new I18nPath();\n  this._dataListeners = [];\n  this._preserveDirectiveContent = options.preserveDirectiveContent === undefined\n    ? false\n    : !!options.preserveDirectiveContent;\n  this.pluralizationRules = options.pluralizationRules || {};\n  this._warnHtmlInMessage = options.warnHtmlInMessage || 'off';\n\n  this._exist = function (message, key) {\n    if (!message || !key) { return false }\n    if (!isNull(this$1._path.getPathValue(message, key))) { return true }\n    // fallback for flat key\n    if (message[key]) { return true }\n    return false\n  };\n\n  if (this._warnHtmlInMessage === 'warn' || this._warnHtmlInMessage === 'error') {\n    Object.keys(messages).forEach(function (locale) {\n      this$1._checkLocaleMessage(locale, this$1._warnHtmlInMessage, messages[locale]);\n    });\n  }\n\n  this._initVM({\n    locale: locale,\n    fallbackLocale: fallbackLocale,\n    messages: messages,\n    dateTimeFormats: dateTimeFormats,\n    numberFormats: numberFormats\n  });\n};\n\nvar prototypeAccessors = { vm: { configurable: true },messages: { configurable: true },dateTimeFormats: { configurable: true },numberFormats: { configurable: true },availableLocales: { configurable: true },locale: { configurable: true },fallbackLocale: { configurable: true },formatFallbackMessages: { configurable: true },missing: { configurable: true },formatter: { configurable: true },silentTranslationWarn: { configurable: true },silentFallbackWarn: { configurable: true },preserveDirectiveContent: { configurable: true },warnHtmlInMessage: { configurable: true } };\n\nVueI18n.prototype._checkLocaleMessage = function _checkLocaleMessage (locale, level, message) {\n  var paths = [];\n\n  var fn = function (level, locale, message, paths) {\n    if (isPlainObject(message)) {\n      Object.keys(message).forEach(function (key) {\n        var val = message[key];\n        if (isPlainObject(val)) {\n          paths.push(key);\n          paths.push('.');\n          fn(level, locale, val, paths);\n          paths.pop();\n          paths.pop();\n        } else {\n          paths.push(key);\n          fn(level, locale, val, paths);\n          paths.pop();\n        }\n      });\n    } else if (Array.isArray(message)) {\n      message.forEach(function (item, index) {\n        if (isPlainObject(item)) {\n          paths.push((\"[\" + index + \"]\"));\n          paths.push('.');\n          fn(level, locale, item, paths);\n          paths.pop();\n          paths.pop();\n        } else {\n          paths.push((\"[\" + index + \"]\"));\n          fn(level, locale, item, paths);\n          paths.pop();\n        }\n      });\n    } else if (typeof message === 'string') {\n      var ret = htmlTagMatcher.test(message);\n      if (ret) {\n        var msg = \"Detected HTML in message '\" + message + \"' of keypath '\" + (paths.join('')) + \"' at '\" + locale + \"'. Consider component interpolation with '<i18n>' to avoid XSS. See https://bit.ly/2ZqJzkp\";\n        if (level === 'warn') {\n          warn(msg);\n        } else if (level === 'error') {\n          error(msg);\n        }\n      }\n    }\n  };\n\n  fn(level, locale, message, paths);\n};\n\nVueI18n.prototype._initVM = function _initVM (data) {\n  var silent = Vue.config.silent;\n  Vue.config.silent = true;\n  this._vm = new Vue({ data: data });\n  Vue.config.silent = silent;\n};\n\nVueI18n.prototype.destroyVM = function destroyVM () {\n  this._vm.$destroy();\n};\n\nVueI18n.prototype.subscribeDataChanging = function subscribeDataChanging (vm) {\n  this._dataListeners.push(vm);\n};\n\nVueI18n.prototype.unsubscribeDataChanging = function unsubscribeDataChanging (vm) {\n  remove(this._dataListeners, vm);\n};\n\nVueI18n.prototype.watchI18nData = function watchI18nData () {\n  var self = this;\n  return this._vm.$watch('$data', function () {\n    var i = self._dataListeners.length;\n    while (i--) {\n      Vue.nextTick(function () {\n        self._dataListeners[i] && self._dataListeners[i].$forceUpdate();\n      });\n    }\n  }, { deep: true })\n};\n\nVueI18n.prototype.watchLocale = function watchLocale () {\n  /* istanbul ignore if */\n  if (!this._sync || !this._root) { return null }\n  var target = this._vm;\n  return this._root.$i18n.vm.$watch('locale', function (val) {\n    target.$set(target, 'locale', val);\n    target.$forceUpdate();\n  }, { immediate: true })\n};\n\nprototypeAccessors.vm.get = function () { return this._vm };\n\nprototypeAccessors.messages.get = function () { return looseClone(this._getMessages()) };\nprototypeAccessors.dateTimeFormats.get = function () { return looseClone(this._getDateTimeFormats()) };\nprototypeAccessors.numberFormats.get = function () { return looseClone(this._getNumberFormats()) };\nprototypeAccessors.availableLocales.get = function () { return Object.keys(this.messages).sort() };\n\nprototypeAccessors.locale.get = function () { return this._vm.locale };\nprototypeAccessors.locale.set = function (locale) {\n  this._vm.$set(this._vm, 'locale', locale);\n};\n\nprototypeAccessors.fallbackLocale.get = function () { return this._vm.fallbackLocale };\nprototypeAccessors.fallbackLocale.set = function (locale) {\n  this._vm.$set(this._vm, 'fallbackLocale', locale);\n};\n\nprototypeAccessors.formatFallbackMessages.get = function () { return this._formatFallbackMessages };\nprototypeAccessors.formatFallbackMessages.set = function (fallback) { this._formatFallbackMessages = fallback; };\n\nprototypeAccessors.missing.get = function () { return this._missing };\nprototypeAccessors.missing.set = function (handler) { this._missing = handler; };\n\nprototypeAccessors.formatter.get = function () { return this._formatter };\nprototypeAccessors.formatter.set = function (formatter) { this._formatter = formatter; };\n\nprototypeAccessors.silentTranslationWarn.get = function () { return this._silentTranslationWarn };\nprototypeAccessors.silentTranslationWarn.set = function (silent) { this._silentTranslationWarn = silent; };\n\nprototypeAccessors.silentFallbackWarn.get = function () { return this._silentFallbackWarn };\nprototypeAccessors.silentFallbackWarn.set = function (silent) { this._silentFallbackWarn = silent; };\n\nprototypeAccessors.preserveDirectiveContent.get = function () { return this._preserveDirectiveContent };\nprototypeAccessors.preserveDirectiveContent.set = function (preserve) { this._preserveDirectiveContent = preserve; };\n\nprototypeAccessors.warnHtmlInMessage.get = function () { return this._warnHtmlInMessage };\nprototypeAccessors.warnHtmlInMessage.set = function (level) {\n    var this$1 = this;\n\n  var orgLevel = this._warnHtmlInMessage;\n  this._warnHtmlInMessage = level;\n  if (orgLevel !== level && (level === 'warn' || level === 'error')) {\n    var messages = this._getMessages();\n    Object.keys(messages).forEach(function (locale) {\n      this$1._checkLocaleMessage(locale, this$1._warnHtmlInMessage, messages[locale]);\n    });\n  }\n};\n\nVueI18n.prototype._getMessages = function _getMessages () { return this._vm.messages };\nVueI18n.prototype._getDateTimeFormats = function _getDateTimeFormats () { return this._vm.dateTimeFormats };\nVueI18n.prototype._getNumberFormats = function _getNumberFormats () { return this._vm.numberFormats };\n\nVueI18n.prototype._warnDefault = function _warnDefault (locale, key, result, vm, values) {\n  if (!isNull(result)) { return result }\n  if (this._missing) {\n    var missingRet = this._missing.apply(null, [locale, key, vm, values]);\n    if (typeof missingRet === 'string') {\n      return missingRet\n    }\n  } else {\n    if ( true && !this._isSilentTranslationWarn(key)) {\n      warn(\n        \"Cannot translate the value of keypath '\" + key + \"'. \" +\n        'Use the value of keypath as default.'\n      );\n    }\n  }\n\n  if (this._formatFallbackMessages) {\n    var parsedArgs = parseArgs.apply(void 0, values);\n    return this._render(key, 'string', parsedArgs.params, key)\n  } else {\n    return key\n  }\n};\n\nVueI18n.prototype._isFallbackRoot = function _isFallbackRoot (val) {\n  return !val && !isNull(this._root) && this._fallbackRoot\n};\n\nVueI18n.prototype._isSilentFallbackWarn = function _isSilentFallbackWarn (key) {\n  return this._silentFallbackWarn instanceof RegExp\n    ? this._silentFallbackWarn.test(key)\n    : this._silentFallbackWarn\n};\n\nVueI18n.prototype._isSilentFallback = function _isSilentFallback (locale, key) {\n  return this._isSilentFallbackWarn(key) && (this._isFallbackRoot() || locale !== this.fallbackLocale)\n};\n\nVueI18n.prototype._isSilentTranslationWarn = function _isSilentTranslationWarn (key) {\n  return this._silentTranslationWarn instanceof RegExp\n    ? this._silentTranslationWarn.test(key)\n    : this._silentTranslationWarn\n};\n\nVueI18n.prototype._interpolate = function _interpolate (\n  locale,\n  message,\n  key,\n  host,\n  interpolateMode,\n  values,\n  visitedLinkStack\n) {\n  if (!message) { return null }\n\n  var pathRet = this._path.getPathValue(message, key);\n  if (Array.isArray(pathRet) || isPlainObject(pathRet)) { return pathRet }\n\n  var ret;\n  if (isNull(pathRet)) {\n    /* istanbul ignore else */\n    if (isPlainObject(message)) {\n      ret = message[key];\n      if (typeof ret !== 'string') {\n        if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallback(locale, key)) {\n          warn((\"Value of key '\" + key + \"' is not a string!\"));\n        }\n        return null\n      }\n    } else {\n      return null\n    }\n  } else {\n    /* istanbul ignore else */\n    if (typeof pathRet === 'string') {\n      ret = pathRet;\n    } else {\n      if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallback(locale, key)) {\n        warn((\"Value of key '\" + key + \"' is not a string!\"));\n      }\n      return null\n    }\n  }\n\n  // Check for the existence of links within the translated string\n  if (ret.indexOf('@:') >= 0 || ret.indexOf('@.') >= 0) {\n    ret = this._link(locale, message, ret, host, 'raw', values, visitedLinkStack);\n  }\n\n  return this._render(ret, interpolateMode, values, key)\n};\n\nVueI18n.prototype._link = function _link (\n  locale,\n  message,\n  str,\n  host,\n  interpolateMode,\n  values,\n  visitedLinkStack\n) {\n  var ret = str;\n\n  // Match all the links within the local\n  // We are going to replace each of\n  // them with its translation\n  var matches = ret.match(linkKeyMatcher);\n  for (var idx in matches) {\n    // ie compatible: filter custom array\n    // prototype method\n    if (!matches.hasOwnProperty(idx)) {\n      continue\n    }\n    var link = matches[idx];\n    var linkKeyPrefixMatches = link.match(linkKeyPrefixMatcher);\n    var linkPrefix = linkKeyPrefixMatches[0];\n      var formatterName = linkKeyPrefixMatches[1];\n\n    // Remove the leading @:, @.case: and the brackets\n    var linkPlaceholder = link.replace(linkPrefix, '').replace(bracketsMatcher, '');\n\n    if (visitedLinkStack.includes(linkPlaceholder)) {\n      if (true) {\n        warn((\"Circular reference found. \\\"\" + link + \"\\\" is already visited in the chain of \" + (visitedLinkStack.reverse().join(' <- '))));\n      }\n      return ret\n    }\n    visitedLinkStack.push(linkPlaceholder);\n\n    // Translate the link\n    var translated = this._interpolate(\n      locale, message, linkPlaceholder, host,\n      interpolateMode === 'raw' ? 'string' : interpolateMode,\n      interpolateMode === 'raw' ? undefined : values,\n      visitedLinkStack\n    );\n\n    if (this._isFallbackRoot(translated)) {\n      if ( true && !this._isSilentTranslationWarn(linkPlaceholder)) {\n        warn((\"Fall back to translate the link placeholder '\" + linkPlaceholder + \"' with root locale.\"));\n      }\n      /* istanbul ignore if */\n      if (!this._root) { throw Error('unexpected error') }\n      var root = this._root.$i18n;\n      translated = root._translate(\n        root._getMessages(), root.locale, root.fallbackLocale,\n        linkPlaceholder, host, interpolateMode, values\n      );\n    }\n    translated = this._warnDefault(\n      locale, linkPlaceholder, translated, host,\n      Array.isArray(values) ? values : [values]\n    );\n\n    if (this._modifiers.hasOwnProperty(formatterName)) {\n      translated = this._modifiers[formatterName](translated);\n    } else if (defaultModifiers.hasOwnProperty(formatterName)) {\n      translated = defaultModifiers[formatterName](translated);\n    }\n\n    visitedLinkStack.pop();\n\n    // Replace the link with the translated\n    ret = !translated ? ret : ret.replace(link, translated);\n  }\n\n  return ret\n};\n\nVueI18n.prototype._render = function _render (message, interpolateMode, values, path) {\n  var ret = this._formatter.interpolate(message, values, path);\n\n  // If the custom formatter refuses to work - apply the default one\n  if (!ret) {\n    ret = defaultFormatter.interpolate(message, values, path);\n  }\n\n  // if interpolateMode is **not** 'string' ('row'),\n  // return the compiled data (e.g. ['foo', VNode, 'bar']) with formatter\n  return interpolateMode === 'string' ? ret.join('') : ret\n};\n\nVueI18n.prototype._translate = function _translate (\n  messages,\n  locale,\n  fallback,\n  key,\n  host,\n  interpolateMode,\n  args\n) {\n  var res =\n    this._interpolate(locale, messages[locale], key, host, interpolateMode, args, [key]);\n  if (!isNull(res)) { return res }\n\n  res = this._interpolate(fallback, messages[fallback], key, host, interpolateMode, args, [key]);\n  if (!isNull(res)) {\n    if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n      warn((\"Fall back to translate the keypath '\" + key + \"' with '\" + fallback + \"' locale.\"));\n    }\n    return res\n  } else {\n    return null\n  }\n};\n\nVueI18n.prototype._t = function _t (key, _locale, messages, host) {\n    var ref;\n\n    var values = [], len = arguments.length - 4;\n    while ( len-- > 0 ) values[ len ] = arguments[ len + 4 ];\n  if (!key) { return '' }\n\n  var parsedArgs = parseArgs.apply(void 0, values);\n  var locale = parsedArgs.locale || _locale;\n\n  var ret = this._translate(\n    messages, locale, this.fallbackLocale, key,\n    host, 'string', parsedArgs.params\n  );\n  if (this._isFallbackRoot(ret)) {\n    if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n      warn((\"Fall back to translate the keypath '\" + key + \"' with root locale.\"));\n    }\n    /* istanbul ignore if */\n    if (!this._root) { throw Error('unexpected error') }\n    return (ref = this._root).$t.apply(ref, [ key ].concat( values ))\n  } else {\n    return this._warnDefault(locale, key, ret, host, values)\n  }\n};\n\nVueI18n.prototype.t = function t (key) {\n    var ref;\n\n    var values = [], len = arguments.length - 1;\n    while ( len-- > 0 ) values[ len ] = arguments[ len + 1 ];\n  return (ref = this)._t.apply(ref, [ key, this.locale, this._getMessages(), null ].concat( values ))\n};\n\nVueI18n.prototype._i = function _i (key, locale, messages, host, values) {\n  var ret =\n    this._translate(messages, locale, this.fallbackLocale, key, host, 'raw', values);\n  if (this._isFallbackRoot(ret)) {\n    if ( true && !this._isSilentTranslationWarn(key)) {\n      warn((\"Fall back to interpolate the keypath '\" + key + \"' with root locale.\"));\n    }\n    if (!this._root) { throw Error('unexpected error') }\n    return this._root.$i18n.i(key, locale, values)\n  } else {\n    return this._warnDefault(locale, key, ret, host, [values])\n  }\n};\n\nVueI18n.prototype.i = function i (key, locale, values) {\n  /* istanbul ignore if */\n  if (!key) { return '' }\n\n  if (typeof locale !== 'string') {\n    locale = this.locale;\n  }\n\n  return this._i(key, locale, this._getMessages(), null, values)\n};\n\nVueI18n.prototype._tc = function _tc (\n  key,\n  _locale,\n  messages,\n  host,\n  choice\n) {\n    var ref;\n\n    var values = [], len = arguments.length - 5;\n    while ( len-- > 0 ) values[ len ] = arguments[ len + 5 ];\n  if (!key) { return '' }\n  if (choice === undefined) {\n    choice = 1;\n  }\n\n  var predefined = { 'count': choice, 'n': choice };\n  var parsedArgs = parseArgs.apply(void 0, values);\n  parsedArgs.params = Object.assign(predefined, parsedArgs.params);\n  values = parsedArgs.locale === null ? [parsedArgs.params] : [parsedArgs.locale, parsedArgs.params];\n  return this.fetchChoice((ref = this)._t.apply(ref, [ key, _locale, messages, host ].concat( values )), choice)\n};\n\nVueI18n.prototype.fetchChoice = function fetchChoice (message, choice) {\n  /* istanbul ignore if */\n  if (!message && typeof message !== 'string') { return null }\n  var choices = message.split('|');\n\n  choice = this.getChoiceIndex(choice, choices.length);\n  if (!choices[choice]) { return message }\n  return choices[choice].trim()\n};\n\n/**\n * @param choice {number} a choice index given by the input to $tc: `$tc('path.to.rule', choiceIndex)`\n * @param choicesLength {number} an overall amount of available choices\n * @returns a final choice index\n*/\nVueI18n.prototype.getChoiceIndex = function getChoiceIndex (choice, choicesLength) {\n  // Default (old) getChoiceIndex implementation - english-compatible\n  var defaultImpl = function (_choice, _choicesLength) {\n    _choice = Math.abs(_choice);\n\n    if (_choicesLength === 2) {\n      return _choice\n        ? _choice > 1\n          ? 1\n          : 0\n        : 1\n    }\n\n    return _choice ? Math.min(_choice, 2) : 0\n  };\n\n  if (this.locale in this.pluralizationRules) {\n    return this.pluralizationRules[this.locale].apply(this, [choice, choicesLength])\n  } else {\n    return defaultImpl(choice, choicesLength)\n  }\n};\n\nVueI18n.prototype.tc = function tc (key, choice) {\n    var ref;\n\n    var values = [], len = arguments.length - 2;\n    while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];\n  return (ref = this)._tc.apply(ref, [ key, this.locale, this._getMessages(), null, choice ].concat( values ))\n};\n\nVueI18n.prototype._te = function _te (key, locale, messages) {\n    var args = [], len = arguments.length - 3;\n    while ( len-- > 0 ) args[ len ] = arguments[ len + 3 ];\n\n  var _locale = parseArgs.apply(void 0, args).locale || locale;\n  return this._exist(messages[_locale], key)\n};\n\nVueI18n.prototype.te = function te (key, locale) {\n  return this._te(key, this.locale, this._getMessages(), locale)\n};\n\nVueI18n.prototype.getLocaleMessage = function getLocaleMessage (locale) {\n  return looseClone(this._vm.messages[locale] || {})\n};\n\nVueI18n.prototype.setLocaleMessage = function setLocaleMessage (locale, message) {\n  if (this._warnHtmlInMessage === 'warn' || this._warnHtmlInMessage === 'error') {\n    this._checkLocaleMessage(locale, this._warnHtmlInMessage, message);\n    if (this._warnHtmlInMessage === 'error') { return }\n  }\n  this._vm.$set(this._vm.messages, locale, message);\n};\n\nVueI18n.prototype.mergeLocaleMessage = function mergeLocaleMessage (locale, message) {\n  if (this._warnHtmlInMessage === 'warn' || this._warnHtmlInMessage === 'error') {\n    this._checkLocaleMessage(locale, this._warnHtmlInMessage, message);\n    if (this._warnHtmlInMessage === 'error') { return }\n  }\n  this._vm.$set(this._vm.messages, locale, merge(this._vm.messages[locale] || {}, message));\n};\n\nVueI18n.prototype.getDateTimeFormat = function getDateTimeFormat (locale) {\n  return looseClone(this._vm.dateTimeFormats[locale] || {})\n};\n\nVueI18n.prototype.setDateTimeFormat = function setDateTimeFormat (locale, format) {\n  this._vm.$set(this._vm.dateTimeFormats, locale, format);\n};\n\nVueI18n.prototype.mergeDateTimeFormat = function mergeDateTimeFormat (locale, format) {\n  this._vm.$set(this._vm.dateTimeFormats, locale, merge(this._vm.dateTimeFormats[locale] || {}, format));\n};\n\nVueI18n.prototype._localizeDateTime = function _localizeDateTime (\n  value,\n  locale,\n  fallback,\n  dateTimeFormats,\n  key\n) {\n  var _locale = locale;\n  var formats = dateTimeFormats[_locale];\n\n  // fallback locale\n  if (isNull(formats) || isNull(formats[key])) {\n    if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n      warn((\"Fall back to '\" + fallback + \"' datetime formats from '\" + locale + \"' datetime formats.\"));\n    }\n    _locale = fallback;\n    formats = dateTimeFormats[_locale];\n  }\n\n  if (isNull(formats) || isNull(formats[key])) {\n    return null\n  } else {\n    var format = formats[key];\n    var id = _locale + \"__\" + key;\n    var formatter = this._dateTimeFormatters[id];\n    if (!formatter) {\n      formatter = this._dateTimeFormatters[id] = new Intl.DateTimeFormat(_locale, format);\n    }\n    return formatter.format(value)\n  }\n};\n\nVueI18n.prototype._d = function _d (value, locale, key) {\n  /* istanbul ignore if */\n  if ( true && !VueI18n.availabilities.dateTimeFormat) {\n    warn('Cannot format a Date value due to not supported Intl.DateTimeFormat.');\n    return ''\n  }\n\n  if (!key) {\n    return new Intl.DateTimeFormat(locale).format(value)\n  }\n\n  var ret =\n    this._localizeDateTime(value, locale, this.fallbackLocale, this._getDateTimeFormats(), key);\n  if (this._isFallbackRoot(ret)) {\n    if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n      warn((\"Fall back to datetime localization of root: key '\" + key + \"'.\"));\n    }\n    /* istanbul ignore if */\n    if (!this._root) { throw Error('unexpected error') }\n    return this._root.$i18n.d(value, key, locale)\n  } else {\n    return ret || ''\n  }\n};\n\nVueI18n.prototype.d = function d (value) {\n    var args = [], len = arguments.length - 1;\n    while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n  var locale = this.locale;\n  var key = null;\n\n  if (args.length === 1) {\n    if (typeof args[0] === 'string') {\n      key = args[0];\n    } else if (isObject(args[0])) {\n      if (args[0].locale) {\n        locale = args[0].locale;\n      }\n      if (args[0].key) {\n        key = args[0].key;\n      }\n    }\n  } else if (args.length === 2) {\n    if (typeof args[0] === 'string') {\n      key = args[0];\n    }\n    if (typeof args[1] === 'string') {\n      locale = args[1];\n    }\n  }\n\n  return this._d(value, locale, key)\n};\n\nVueI18n.prototype.getNumberFormat = function getNumberFormat (locale) {\n  return looseClone(this._vm.numberFormats[locale] || {})\n};\n\nVueI18n.prototype.setNumberFormat = function setNumberFormat (locale, format) {\n  this._vm.$set(this._vm.numberFormats, locale, format);\n};\n\nVueI18n.prototype.mergeNumberFormat = function mergeNumberFormat (locale, format) {\n  this._vm.$set(this._vm.numberFormats, locale, merge(this._vm.numberFormats[locale] || {}, format));\n};\n\nVueI18n.prototype._getNumberFormatter = function _getNumberFormatter (\n  value,\n  locale,\n  fallback,\n  numberFormats,\n  key,\n  options\n) {\n  var _locale = locale;\n  var formats = numberFormats[_locale];\n\n  // fallback locale\n  if (isNull(formats) || isNull(formats[key])) {\n    if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n      warn((\"Fall back to '\" + fallback + \"' number formats from '\" + locale + \"' number formats.\"));\n    }\n    _locale = fallback;\n    formats = numberFormats[_locale];\n  }\n\n  if (isNull(formats) || isNull(formats[key])) {\n    return null\n  } else {\n    var format = formats[key];\n\n    var formatter;\n    if (options) {\n      // If options specified - create one time number formatter\n      formatter = new Intl.NumberFormat(_locale, Object.assign({}, format, options));\n    } else {\n      var id = _locale + \"__\" + key;\n      formatter = this._numberFormatters[id];\n      if (!formatter) {\n        formatter = this._numberFormatters[id] = new Intl.NumberFormat(_locale, format);\n      }\n    }\n    return formatter\n  }\n};\n\nVueI18n.prototype._n = function _n (value, locale, key, options) {\n  /* istanbul ignore if */\n  if (!VueI18n.availabilities.numberFormat) {\n    if (true) {\n      warn('Cannot format a Number value due to not supported Intl.NumberFormat.');\n    }\n    return ''\n  }\n\n  if (!key) {\n    var nf = !options ? new Intl.NumberFormat(locale) : new Intl.NumberFormat(locale, options);\n    return nf.format(value)\n  }\n\n  var formatter = this._getNumberFormatter(value, locale, this.fallbackLocale, this._getNumberFormats(), key, options);\n  var ret = formatter && formatter.format(value);\n  if (this._isFallbackRoot(ret)) {\n    if ( true && !this._isSilentTranslationWarn(key) && !this._isSilentFallbackWarn(key)) {\n      warn((\"Fall back to number localization of root: key '\" + key + \"'.\"));\n    }\n    /* istanbul ignore if */\n    if (!this._root) { throw Error('unexpected error') }\n    return this._root.$i18n.n(value, Object.assign({}, { key: key, locale: locale }, options))\n  } else {\n    return ret || ''\n  }\n};\n\nVueI18n.prototype.n = function n (value) {\n    var args = [], len = arguments.length - 1;\n    while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];\n\n  var locale = this.locale;\n  var key = null;\n  var options = null;\n\n  if (args.length === 1) {\n    if (typeof args[0] === 'string') {\n      key = args[0];\n    } else if (isObject(args[0])) {\n      if (args[0].locale) {\n        locale = args[0].locale;\n      }\n      if (args[0].key) {\n        key = args[0].key;\n      }\n\n      // Filter out number format options only\n      options = Object.keys(args[0]).reduce(function (acc, key) {\n          var obj;\n\n        if (numberFormatKeys.includes(key)) {\n          return Object.assign({}, acc, ( obj = {}, obj[key] = args[0][key], obj ))\n        }\n        return acc\n      }, null);\n    }\n  } else if (args.length === 2) {\n    if (typeof args[0] === 'string') {\n      key = args[0];\n    }\n    if (typeof args[1] === 'string') {\n      locale = args[1];\n    }\n  }\n\n  return this._n(value, locale, key, options)\n};\n\nVueI18n.prototype._ntp = function _ntp (value, locale, key, options) {\n  /* istanbul ignore if */\n  if (!VueI18n.availabilities.numberFormat) {\n    if (true) {\n      warn('Cannot format to parts a Number value due to not supported Intl.NumberFormat.');\n    }\n    return []\n  }\n\n  if (!key) {\n    var nf = !options ? new Intl.NumberFormat(locale) : new Intl.NumberFormat(locale, options);\n    return nf.formatToParts(value)\n  }\n\n  var formatter = this._getNumberFormatter(value, locale, this.fallbackLocale, this._getNumberFormats(), key, options);\n  var ret = formatter && formatter.formatToParts(value);\n  if (this._isFallbackRoot(ret)) {\n    if ( true && !this._isSilentTranslationWarn(key)) {\n      warn((\"Fall back to format number to parts of root: key '\" + key + \"' .\"));\n    }\n    /* istanbul ignore if */\n    if (!this._root) { throw Error('unexpected error') }\n    return this._root.$i18n._ntp(value, locale, key, options)\n  } else {\n    return ret || []\n  }\n};\n\nObject.defineProperties( VueI18n.prototype, prototypeAccessors );\n\nvar availabilities;\n// $FlowFixMe\nObject.defineProperty(VueI18n, 'availabilities', {\n  get: function get () {\n    if (!availabilities) {\n      var intlDefined = typeof Intl !== 'undefined';\n      availabilities = {\n        dateTimeFormat: intlDefined && typeof Intl.DateTimeFormat !== 'undefined',\n        numberFormat: intlDefined && typeof Intl.NumberFormat !== 'undefined'\n      };\n    }\n\n    return availabilities\n  }\n});\n\nVueI18n.install = install;\nVueI18n.version = '8.15.0';\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (VueI18n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1pMThuQDguMTUuMEB2dWUtaTE4bi9kaXN0L3Z1ZS1pMThuLmVzbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdnVlLWkxOG5AOC4xNS4wQHZ1ZS1pMThuL2Rpc3QvdnVlLWkxOG4uZXNtLmpzPzRiYTQiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiB2dWUtaTE4biB2OC4xNS4wIFxuICogKGMpIDIwMTkga2F6dXlhIGthd2FndWNoaVxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG4vKiAgKi9cblxuLyoqXG4gKiBjb25zdGFudHNcbiAqL1xuXG52YXIgbnVtYmVyRm9ybWF0S2V5cyA9IFtcbiAgJ3N0eWxlJyxcbiAgJ2N1cnJlbmN5JyxcbiAgJ2N1cnJlbmN5RGlzcGxheScsXG4gICd1c2VHcm91cGluZycsXG4gICdtaW5pbXVtSW50ZWdlckRpZ2l0cycsXG4gICdtaW5pbXVtRnJhY3Rpb25EaWdpdHMnLFxuICAnbWF4aW11bUZyYWN0aW9uRGlnaXRzJyxcbiAgJ21pbmltdW1TaWduaWZpY2FudERpZ2l0cycsXG4gICdtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMnLFxuICAnbG9jYWxlTWF0Y2hlcicsXG4gICdmb3JtYXRNYXRjaGVyJ1xuXTtcblxuLyoqXG4gKiB1dGlsaXRpZXNcbiAqL1xuXG5mdW5jdGlvbiB3YXJuIChtc2csIGVycikge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc29sZS53YXJuKCdbdnVlLWkxOG5dICcgKyBtc2cpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnIuc3RhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlcnJvciAobXNnLCBlcnIpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1t2dWUtaTE4bl0gJyArIG1zZyk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc09iamVjdCAob2JqKSB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcbn1cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBPQkpFQ1RfU1RSSU5HID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gT0JKRUNUX1NUUklOR1xufVxuXG5mdW5jdGlvbiBpc051bGwgKHZhbCkge1xuICByZXR1cm4gdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHBhcnNlQXJncyAoKSB7XG4gIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgdmFyIGxvY2FsZSA9IG51bGw7XG4gIHZhciBwYXJhbXMgPSBudWxsO1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoaXNPYmplY3QoYXJnc1swXSkgfHwgQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuICAgICAgcGFyYW1zID0gYXJnc1swXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgbG9jYWxlID0gYXJnc1swXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb2NhbGUgPSBhcmdzWzBdO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNPYmplY3QoYXJnc1sxXSkgfHwgQXJyYXkuaXNBcnJheShhcmdzWzFdKSkge1xuICAgICAgcGFyYW1zID0gYXJnc1sxXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBsb2NhbGU6IGxvY2FsZSwgcGFyYW1zOiBwYXJhbXMgfVxufVxuXG5mdW5jdGlvbiBsb29zZUNsb25lIChvYmopIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSlcbn1cblxuZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHtcbiAgaWYgKGFyci5sZW5ndGgpIHtcbiAgICB2YXIgaW5kZXggPSBhcnIuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgcmV0dXJuIGFyci5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBoYXNPd24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxufVxuXG5mdW5jdGlvbiBtZXJnZSAodGFyZ2V0KSB7XG4gIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50cyQxW2ldO1xuICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgIHZhciBrZXkgPSAodm9pZCAwKTtcbiAgICAgIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoaGFzT3duKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gbWVyZ2Uob3V0cHV0W2tleV0sIHNvdXJjZVtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dFxufVxuXG5mdW5jdGlvbiBsb29zZUVxdWFsIChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpO1xuICB2YXIgaXNPYmplY3RCID0gaXNPYmplY3QoYik7XG4gIGlmIChpc09iamVjdEEgJiYgaXNPYmplY3RCKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc0FycmF5QSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gICAgICB2YXIgaXNBcnJheUIgPSBBcnJheS5pc0FycmF5KGIpO1xuICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7XG4gICAgICAgIHJldHVybiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeShmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGUsIGJbaV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKCFpc0FycmF5QSAmJiAhaXNBcnJheUIpIHtcbiAgICAgICAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga2V5c0EubGVuZ3RoID09PSBrZXlzQi5sZW5ndGggJiYga2V5c0EuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZXh0ZW5kIChWdWUpIHtcbiAgaWYgKCFWdWUucHJvdG90eXBlLmhhc093blByb3BlcnR5KCckaTE4bicpKSB7XG4gICAgLy8gJEZsb3dGaXhNZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGkxOG4nLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7IHJldHVybiB0aGlzLl9pMThuIH1cbiAgICB9KTtcbiAgfVxuXG4gIFZ1ZS5wcm90b3R5cGUuJHQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIHZhbHVlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgIHZhciBpMThuID0gdGhpcy4kaTE4bjtcbiAgICByZXR1cm4gaTE4bi5fdC5hcHBseShpMThuLCBbIGtleSwgaTE4bi5sb2NhbGUsIGkxOG4uX2dldE1lc3NhZ2VzKCksIHRoaXMgXS5jb25jYXQoIHZhbHVlcyApKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJHRjID0gZnVuY3Rpb24gKGtleSwgY2hvaWNlKSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIHZhbHVlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDIgXTtcblxuICAgIHZhciBpMThuID0gdGhpcy4kaTE4bjtcbiAgICByZXR1cm4gaTE4bi5fdGMuYXBwbHkoaTE4biwgWyBrZXksIGkxOG4ubG9jYWxlLCBpMThuLl9nZXRNZXNzYWdlcygpLCB0aGlzLCBjaG9pY2UgXS5jb25jYXQoIHZhbHVlcyApKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJHRlID0gZnVuY3Rpb24gKGtleSwgbG9jYWxlKSB7XG4gICAgdmFyIGkxOG4gPSB0aGlzLiRpMThuO1xuICAgIHJldHVybiBpMThuLl90ZShrZXksIGkxOG4ubG9jYWxlLCBpMThuLl9nZXRNZXNzYWdlcygpLCBsb2NhbGUpXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciByZWY7XG5cbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG4gICAgcmV0dXJuIChyZWYgPSB0aGlzLiRpMThuKS5kLmFwcGx5KHJlZiwgWyB2YWx1ZSBdLmNvbmNhdCggYXJncyApKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgcmVmO1xuXG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuICAgIHJldHVybiAocmVmID0gdGhpcy4kaTE4bikubi5hcHBseShyZWYsIFsgdmFsdWUgXS5jb25jYXQoIGFyZ3MgKSlcbiAgfTtcbn1cblxuLyogICovXG5cbnZhciBtaXhpbiA9IHtcbiAgYmVmb3JlQ3JlYXRlOiBmdW5jdGlvbiBiZWZvcmVDcmVhdGUgKCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy4kb3B0aW9ucztcbiAgICBvcHRpb25zLmkxOG4gPSBvcHRpb25zLmkxOG4gfHwgKG9wdGlvbnMuX19pMThuID8ge30gOiBudWxsKTtcblxuICAgIGlmIChvcHRpb25zLmkxOG4pIHtcbiAgICAgIGlmIChvcHRpb25zLmkxOG4gaW5zdGFuY2VvZiBWdWVJMThuKSB7XG4gICAgICAgIC8vIGluaXQgbG9jYWxlIG1lc3NhZ2VzIHZpYSBjdXN0b20gYmxvY2tzXG4gICAgICAgIGlmIChvcHRpb25zLl9faTE4bikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlTWVzc2FnZXMgPSB7fTtcbiAgICAgICAgICAgIG9wdGlvbnMuX19pMThuLmZvckVhY2goZnVuY3Rpb24gKHJlc291cmNlKSB7XG4gICAgICAgICAgICAgIGxvY2FsZU1lc3NhZ2VzID0gbWVyZ2UobG9jYWxlTWVzc2FnZXMsIEpTT04ucGFyc2UocmVzb3VyY2UpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMobG9jYWxlTWVzc2FnZXMpLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgICAgICAgICBvcHRpb25zLmkxOG4ubWVyZ2VMb2NhbGVNZXNzYWdlKGxvY2FsZSwgbG9jYWxlTWVzc2FnZXNbbG9jYWxlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICB3YXJuKFwiQ2Fubm90IHBhcnNlIGxvY2FsZSBtZXNzYWdlcyB2aWEgY3VzdG9tIGJsb2Nrcy5cIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2kxOG4gPSBvcHRpb25zLmkxOG47XG4gICAgICAgIHRoaXMuX2kxOG5XYXRjaGVyID0gdGhpcy5faTE4bi53YXRjaEkxOG5EYXRhKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qob3B0aW9ucy5pMThuKSkge1xuICAgICAgICAvLyBjb21wb25lbnQgbG9jYWwgaTE4blxuICAgICAgICBpZiAodGhpcy4kcm9vdCAmJiB0aGlzLiRyb290LiRpMThuICYmIHRoaXMuJHJvb3QuJGkxOG4gaW5zdGFuY2VvZiBWdWVJMThuKSB7XG4gICAgICAgICAgb3B0aW9ucy5pMThuLnJvb3QgPSB0aGlzLiRyb290O1xuICAgICAgICAgIG9wdGlvbnMuaTE4bi5mb3JtYXR0ZXIgPSB0aGlzLiRyb290LiRpMThuLmZvcm1hdHRlcjtcbiAgICAgICAgICBvcHRpb25zLmkxOG4uZmFsbGJhY2tMb2NhbGUgPSB0aGlzLiRyb290LiRpMThuLmZhbGxiYWNrTG9jYWxlO1xuICAgICAgICAgIG9wdGlvbnMuaTE4bi5mb3JtYXRGYWxsYmFja01lc3NhZ2VzID0gdGhpcy4kcm9vdC4kaTE4bi5mb3JtYXRGYWxsYmFja01lc3NhZ2VzO1xuICAgICAgICAgIG9wdGlvbnMuaTE4bi5zaWxlbnRUcmFuc2xhdGlvbldhcm4gPSB0aGlzLiRyb290LiRpMThuLnNpbGVudFRyYW5zbGF0aW9uV2FybjtcbiAgICAgICAgICBvcHRpb25zLmkxOG4uc2lsZW50RmFsbGJhY2tXYXJuID0gdGhpcy4kcm9vdC4kaTE4bi5zaWxlbnRGYWxsYmFja1dhcm47XG4gICAgICAgICAgb3B0aW9ucy5pMThuLnBsdXJhbGl6YXRpb25SdWxlcyA9IHRoaXMuJHJvb3QuJGkxOG4ucGx1cmFsaXphdGlvblJ1bGVzO1xuICAgICAgICAgIG9wdGlvbnMuaTE4bi5wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQgPSB0aGlzLiRyb290LiRpMThuLnByZXNlcnZlRGlyZWN0aXZlQ29udGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluaXQgbG9jYWxlIG1lc3NhZ2VzIHZpYSBjdXN0b20gYmxvY2tzXG4gICAgICAgIGlmIChvcHRpb25zLl9faTE4bikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlTWVzc2FnZXMkMSA9IHt9O1xuICAgICAgICAgICAgb3B0aW9ucy5fX2kxOG4uZm9yRWFjaChmdW5jdGlvbiAocmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgbG9jYWxlTWVzc2FnZXMkMSA9IG1lcmdlKGxvY2FsZU1lc3NhZ2VzJDEsIEpTT04ucGFyc2UocmVzb3VyY2UpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3B0aW9ucy5pMThuLm1lc3NhZ2VzID0gbG9jYWxlTWVzc2FnZXMkMTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICB3YXJuKFwiQ2Fubm90IHBhcnNlIGxvY2FsZSBtZXNzYWdlcyB2aWEgY3VzdG9tIGJsb2Nrcy5cIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlZiA9IG9wdGlvbnMuaTE4bjtcbiAgICAgICAgdmFyIHNoYXJlZE1lc3NhZ2VzID0gcmVmLnNoYXJlZE1lc3NhZ2VzO1xuICAgICAgICBpZiAoc2hhcmVkTWVzc2FnZXMgJiYgaXNQbGFpbk9iamVjdChzaGFyZWRNZXNzYWdlcykpIHtcbiAgICAgICAgICBvcHRpb25zLmkxOG4ubWVzc2FnZXMgPSBtZXJnZShvcHRpb25zLmkxOG4ubWVzc2FnZXMsIHNoYXJlZE1lc3NhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2kxOG4gPSBuZXcgVnVlSTE4bihvcHRpb25zLmkxOG4pO1xuICAgICAgICB0aGlzLl9pMThuV2F0Y2hlciA9IHRoaXMuX2kxOG4ud2F0Y2hJMThuRGF0YSgpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmkxOG4uc3luYyA9PT0gdW5kZWZpbmVkIHx8ICEhb3B0aW9ucy5pMThuLnN5bmMpIHtcbiAgICAgICAgICB0aGlzLl9sb2NhbGVXYXRjaGVyID0gdGhpcy4kaTE4bi53YXRjaExvY2FsZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHdhcm4oXCJDYW5ub3QgYmUgaW50ZXJwcmV0ZWQgJ2kxOG4nIG9wdGlvbi5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuJHJvb3QgJiYgdGhpcy4kcm9vdC4kaTE4biAmJiB0aGlzLiRyb290LiRpMThuIGluc3RhbmNlb2YgVnVlSTE4bikge1xuICAgICAgLy8gcm9vdCBpMThuXG4gICAgICB0aGlzLl9pMThuID0gdGhpcy4kcm9vdC4kaTE4bjtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMucGFyZW50ICYmIG9wdGlvbnMucGFyZW50LiRpMThuICYmIG9wdGlvbnMucGFyZW50LiRpMThuIGluc3RhbmNlb2YgVnVlSTE4bikge1xuICAgICAgLy8gcGFyZW50IGkxOG5cbiAgICAgIHRoaXMuX2kxOG4gPSBvcHRpb25zLnBhcmVudC4kaTE4bjtcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlTW91bnQ6IGZ1bmN0aW9uIGJlZm9yZU1vdW50ICgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7XG4gICAgb3B0aW9ucy5pMThuID0gb3B0aW9ucy5pMThuIHx8IChvcHRpb25zLl9faTE4biA/IHt9IDogbnVsbCk7XG5cbiAgICBpZiAob3B0aW9ucy5pMThuKSB7XG4gICAgICBpZiAob3B0aW9ucy5pMThuIGluc3RhbmNlb2YgVnVlSTE4bikge1xuICAgICAgICAvLyBpbml0IGxvY2FsZSBtZXNzYWdlcyB2aWEgY3VzdG9tIGJsb2Nrc1xuICAgICAgICB0aGlzLl9pMThuLnN1YnNjcmliZURhdGFDaGFuZ2luZyh0aGlzKTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJpbmcgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnMuaTE4bikpIHtcbiAgICAgICAgdGhpcy5faTE4bi5zdWJzY3JpYmVEYXRhQ2hhbmdpbmcodGhpcyk7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliaW5nID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybihcIkNhbm5vdCBiZSBpbnRlcnByZXRlZCAnaTE4bicgb3B0aW9uLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy4kcm9vdCAmJiB0aGlzLiRyb290LiRpMThuICYmIHRoaXMuJHJvb3QuJGkxOG4gaW5zdGFuY2VvZiBWdWVJMThuKSB7XG4gICAgICB0aGlzLl9pMThuLnN1YnNjcmliZURhdGFDaGFuZ2luZyh0aGlzKTtcbiAgICAgIHRoaXMuX3N1YnNjcmliaW5nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMucGFyZW50ICYmIG9wdGlvbnMucGFyZW50LiRpMThuICYmIG9wdGlvbnMucGFyZW50LiRpMThuIGluc3RhbmNlb2YgVnVlSTE4bikge1xuICAgICAgdGhpcy5faTE4bi5zdWJzY3JpYmVEYXRhQ2hhbmdpbmcodGhpcyk7XG4gICAgICB0aGlzLl9zdWJzY3JpYmluZyA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3kgKCkge1xuICAgIGlmICghdGhpcy5faTE4bikgeyByZXR1cm4gfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLl9zdWJzY3JpYmluZykge1xuICAgICAgICBzZWxmLl9pMThuLnVuc3Vic2NyaWJlRGF0YUNoYW5naW5nKHNlbGYpO1xuICAgICAgICBkZWxldGUgc2VsZi5fc3Vic2NyaWJpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9pMThuV2F0Y2hlcikge1xuICAgICAgICBzZWxmLl9pMThuV2F0Y2hlcigpO1xuICAgICAgICBzZWxmLl9pMThuLmRlc3Ryb3lWTSgpO1xuICAgICAgICBkZWxldGUgc2VsZi5faTE4bldhdGNoZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLl9sb2NhbGVXYXRjaGVyKSB7XG4gICAgICAgIHNlbGYuX2xvY2FsZVdhdGNoZXIoKTtcbiAgICAgICAgZGVsZXRlIHNlbGYuX2xvY2FsZVdhdGNoZXI7XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX2kxOG4gPSBudWxsO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKiAgKi9cblxudmFyIGludGVycG9sYXRpb25Db21wb25lbnQgPSB7XG4gIG5hbWU6ICdpMThuJyxcbiAgZnVuY3Rpb25hbDogdHJ1ZSxcbiAgcHJvcHM6IHtcbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGF0aDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGxvY2FsZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcbiAgICBwbGFjZXM6IHtcbiAgICAgIHR5cGU6IFtBcnJheSwgT2JqZWN0XVxuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgsIHJlZikge1xuICAgIHZhciBkYXRhID0gcmVmLmRhdGE7XG4gICAgdmFyIHBhcmVudCA9IHJlZi5wYXJlbnQ7XG4gICAgdmFyIHByb3BzID0gcmVmLnByb3BzO1xuICAgIHZhciBzbG90cyA9IHJlZi5zbG90cztcblxuICAgIHZhciAkaTE4biA9IHBhcmVudC4kaTE4bjtcbiAgICBpZiAoISRpMThuKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuKCdDYW5ub3QgZmluZCBWdWVJMThuIGluc3RhbmNlIScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIHBhdGggPSBwcm9wcy5wYXRoO1xuICAgIHZhciBsb2NhbGUgPSBwcm9wcy5sb2NhbGU7XG4gICAgdmFyIHBsYWNlcyA9IHByb3BzLnBsYWNlcztcbiAgICB2YXIgcGFyYW1zID0gc2xvdHMoKTtcbiAgICB2YXIgY2hpbGRyZW4gPSAkaTE4bi5pKFxuICAgICAgcGF0aCxcbiAgICAgIGxvY2FsZSxcbiAgICAgIG9ubHlIYXNEZWZhdWx0UGxhY2UocGFyYW1zKSB8fCBwbGFjZXNcbiAgICAgICAgPyB1c2VMZWdhY3lQbGFjZXMocGFyYW1zLmRlZmF1bHQsIHBsYWNlcylcbiAgICAgICAgOiBwYXJhbXNcbiAgICApO1xuXG4gICAgdmFyIHRhZyA9IHByb3BzLnRhZyB8fCAnc3Bhbic7XG4gICAgcmV0dXJuIHRhZyA/IGgodGFnLCBkYXRhLCBjaGlsZHJlbikgOiBjaGlsZHJlblxuICB9XG59O1xuXG5mdW5jdGlvbiBvbmx5SGFzRGVmYXVsdFBsYWNlIChwYXJhbXMpIHtcbiAgdmFyIHByb3A7XG4gIGZvciAocHJvcCBpbiBwYXJhbXMpIHtcbiAgICBpZiAocHJvcCAhPT0gJ2RlZmF1bHQnKSB7IHJldHVybiBmYWxzZSB9XG4gIH1cbiAgcmV0dXJuIEJvb2xlYW4ocHJvcClcbn1cblxuZnVuY3Rpb24gdXNlTGVnYWN5UGxhY2VzIChjaGlsZHJlbiwgcGxhY2VzKSB7XG4gIHZhciBwYXJhbXMgPSBwbGFjZXMgPyBjcmVhdGVQYXJhbXNGcm9tUGxhY2VzKHBsYWNlcykgOiB7fTtcblxuICBpZiAoIWNoaWxkcmVuKSB7IHJldHVybiBwYXJhbXMgfVxuXG4gIC8vIEZpbHRlciBlbXB0eSB0ZXh0IG5vZGVzXG4gIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50YWcgfHwgY2hpbGQudGV4dC50cmltKCkgIT09ICcnXG4gIH0pO1xuXG4gIHZhciBldmVyeVBsYWNlID0gY2hpbGRyZW4uZXZlcnkodm5vZGVIYXNQbGFjZUF0dHJpYnV0ZSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV2ZXJ5UGxhY2UpIHtcbiAgICB3YXJuKCdgcGxhY2VgIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkIGluIG5leHQgbWFqb3IgdmVyc2lvbi4gUGxlYXNlIHN3aXRjaCB0byBWdWUgc2xvdHMuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW4ucmVkdWNlKFxuICAgIGV2ZXJ5UGxhY2UgPyBhc3NpZ25DaGlsZFBsYWNlIDogYXNzaWduQ2hpbGRJbmRleCxcbiAgICBwYXJhbXNcbiAgKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXJhbXNGcm9tUGxhY2VzIChwbGFjZXMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKCdgcGxhY2VzYCBwcm9wIGlzIGRlcHJlY2F0ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLiBQbGVhc2Ugc3dpdGNoIHRvIFZ1ZSBzbG90cy4nKTtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBsYWNlcylcbiAgICA/IHBsYWNlcy5yZWR1Y2UoYXNzaWduQ2hpbGRJbmRleCwge30pXG4gICAgOiBPYmplY3QuYXNzaWduKHt9LCBwbGFjZXMpXG59XG5cbmZ1bmN0aW9uIGFzc2lnbkNoaWxkUGxhY2UgKHBhcmFtcywgY2hpbGQpIHtcbiAgaWYgKGNoaWxkLmRhdGEgJiYgY2hpbGQuZGF0YS5hdHRycyAmJiBjaGlsZC5kYXRhLmF0dHJzLnBsYWNlKSB7XG4gICAgcGFyYW1zW2NoaWxkLmRhdGEuYXR0cnMucGxhY2VdID0gY2hpbGQ7XG4gIH1cbiAgcmV0dXJuIHBhcmFtc1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DaGlsZEluZGV4IChwYXJhbXMsIGNoaWxkLCBpbmRleCkge1xuICBwYXJhbXNbaW5kZXhdID0gY2hpbGQ7XG4gIHJldHVybiBwYXJhbXNcbn1cblxuZnVuY3Rpb24gdm5vZGVIYXNQbGFjZUF0dHJpYnV0ZSAodm5vZGUpIHtcbiAgcmV0dXJuIEJvb2xlYW4odm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMucGxhY2UpXG59XG5cbi8qICAqL1xuXG52YXIgbnVtYmVyQ29tcG9uZW50ID0ge1xuICBuYW1lOiAnaTE4bi1uJyxcbiAgZnVuY3Rpb25hbDogdHJ1ZSxcbiAgcHJvcHM6IHtcbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdzcGFuJ1xuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE9iamVjdF1cbiAgICB9LFxuICAgIGxvY2FsZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCwgcmVmKSB7XG4gICAgdmFyIHByb3BzID0gcmVmLnByb3BzO1xuICAgIHZhciBwYXJlbnQgPSByZWYucGFyZW50O1xuICAgIHZhciBkYXRhID0gcmVmLmRhdGE7XG5cbiAgICB2YXIgaTE4biA9IHBhcmVudC4kaTE4bjtcblxuICAgIGlmICghaTE4bikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybignQ2Fubm90IGZpbmQgVnVlSTE4biBpbnN0YW5jZSEnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdmFyIGtleSA9IG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5mb3JtYXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBrZXkgPSBwcm9wcy5mb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChwcm9wcy5mb3JtYXQpKSB7XG4gICAgICBpZiAocHJvcHMuZm9ybWF0LmtleSkge1xuICAgICAgICBrZXkgPSBwcm9wcy5mb3JtYXQua2V5O1xuICAgICAgfVxuXG4gICAgICAvLyBGaWx0ZXIgb3V0IG51bWJlciBmb3JtYXQgb3B0aW9ucyBvbmx5XG4gICAgICBvcHRpb25zID0gT2JqZWN0LmtleXMocHJvcHMuZm9ybWF0KS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcHJvcCkge1xuICAgICAgICB2YXIgb2JqO1xuXG4gICAgICAgIGlmIChudW1iZXJGb3JtYXRLZXlzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGFjYywgKCBvYmogPSB7fSwgb2JqW3Byb3BdID0gcHJvcHMuZm9ybWF0W3Byb3BdLCBvYmogKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9LCBudWxsKTtcbiAgICB9XG5cbiAgICB2YXIgbG9jYWxlID0gcHJvcHMubG9jYWxlIHx8IGkxOG4ubG9jYWxlO1xuICAgIHZhciBwYXJ0cyA9IGkxOG4uX250cChwcm9wcy52YWx1ZSwgbG9jYWxlLCBrZXksIG9wdGlvbnMpO1xuXG4gICAgdmFyIHZhbHVlcyA9IHBhcnRzLm1hcChmdW5jdGlvbiAocGFydCwgaW5kZXgpIHtcbiAgICAgIHZhciBvYmo7XG5cbiAgICAgIHZhciBzbG90ID0gZGF0YS5zY29wZWRTbG90cyAmJiBkYXRhLnNjb3BlZFNsb3RzW3BhcnQudHlwZV07XG4gICAgICByZXR1cm4gc2xvdCA/IHNsb3QoKCBvYmogPSB7fSwgb2JqW3BhcnQudHlwZV0gPSBwYXJ0LnZhbHVlLCBvYmouaW5kZXggPSBpbmRleCwgb2JqLnBhcnRzID0gcGFydHMsIG9iaiApKSA6IHBhcnQudmFsdWVcbiAgICB9KTtcblxuICAgIHJldHVybiBoKHByb3BzLnRhZywge1xuICAgICAgYXR0cnM6IGRhdGEuYXR0cnMsXG4gICAgICAnY2xhc3MnOiBkYXRhWydjbGFzcyddLFxuICAgICAgc3RhdGljQ2xhc3M6IGRhdGEuc3RhdGljQ2xhc3NcbiAgICB9LCB2YWx1ZXMpXG4gIH1cbn07XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBiaW5kIChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgaWYgKCFhc3NlcnQoZWwsIHZub2RlKSkgeyByZXR1cm4gfVxuXG4gIHQoZWwsIGJpbmRpbmcsIHZub2RlKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlIChlbCwgYmluZGluZywgdm5vZGUsIG9sZFZOb2RlKSB7XG4gIGlmICghYXNzZXJ0KGVsLCB2bm9kZSkpIHsgcmV0dXJuIH1cblxuICB2YXIgaTE4biA9IHZub2RlLmNvbnRleHQuJGkxOG47XG4gIGlmIChsb2NhbGVFcXVhbChlbCwgdm5vZGUpICYmXG4gICAgKGxvb3NlRXF1YWwoYmluZGluZy52YWx1ZSwgYmluZGluZy5vbGRWYWx1ZSkgJiZcbiAgICAgbG9vc2VFcXVhbChlbC5fbG9jYWxlTWVzc2FnZSwgaTE4bi5nZXRMb2NhbGVNZXNzYWdlKGkxOG4ubG9jYWxlKSkpKSB7IHJldHVybiB9XG5cbiAgdChlbCwgYmluZGluZywgdm5vZGUpO1xufVxuXG5mdW5jdGlvbiB1bmJpbmQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVk5vZGUpIHtcbiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDtcbiAgaWYgKCF2bSkge1xuICAgIHdhcm4oJ1Z1ZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdHMgaW4gVk5vZGUgY29udGV4dCcpO1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGkxOG4gPSB2bm9kZS5jb250ZXh0LiRpMThuIHx8IHt9O1xuICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLnByZXNlcnZlICYmICFpMThuLnByZXNlcnZlRGlyZWN0aXZlQ29udGVudCkge1xuICAgIGVsLnRleHRDb250ZW50ID0gJyc7XG4gIH1cbiAgZWwuX3Z0ID0gdW5kZWZpbmVkO1xuICBkZWxldGUgZWxbJ192dCddO1xuICBlbC5fbG9jYWxlID0gdW5kZWZpbmVkO1xuICBkZWxldGUgZWxbJ19sb2NhbGUnXTtcbiAgZWwuX2xvY2FsZU1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gIGRlbGV0ZSBlbFsnX2xvY2FsZU1lc3NhZ2UnXTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0IChlbCwgdm5vZGUpIHtcbiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDtcbiAgaWYgKCF2bSkge1xuICAgIHdhcm4oJ1Z1ZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdHMgaW4gVk5vZGUgY29udGV4dCcpO1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKCF2bS4kaTE4bikge1xuICAgIHdhcm4oJ1Z1ZUkxOG4gaW5zdGFuY2UgZG9lcyBub3QgZXhpc3RzIGluIFZ1ZSBpbnN0YW5jZScpO1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gbG9jYWxlRXF1YWwgKGVsLCB2bm9kZSkge1xuICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0O1xuICByZXR1cm4gZWwuX2xvY2FsZSA9PT0gdm0uJGkxOG4ubG9jYWxlXG59XG5cbmZ1bmN0aW9uIHQgKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICB2YXIgcmVmJDEsIHJlZiQyO1xuXG4gIHZhciB2YWx1ZSA9IGJpbmRpbmcudmFsdWU7XG5cbiAgdmFyIHJlZiA9IHBhcnNlVmFsdWUodmFsdWUpO1xuICB2YXIgcGF0aCA9IHJlZi5wYXRoO1xuICB2YXIgbG9jYWxlID0gcmVmLmxvY2FsZTtcbiAgdmFyIGFyZ3MgPSByZWYuYXJncztcbiAgdmFyIGNob2ljZSA9IHJlZi5jaG9pY2U7XG4gIGlmICghcGF0aCAmJiAhbG9jYWxlICYmICFhcmdzKSB7XG4gICAgd2FybigndmFsdWUgdHlwZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoIXBhdGgpIHtcbiAgICB3YXJuKCdgcGF0aGAgaXMgcmVxdWlyZWQgaW4gdi10IGRpcmVjdGl2ZScpO1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDtcbiAgaWYgKGNob2ljZSkge1xuICAgIGVsLl92dCA9IGVsLnRleHRDb250ZW50ID0gKHJlZiQxID0gdm0uJGkxOG4pLnRjLmFwcGx5KHJlZiQxLCBbIHBhdGgsIGNob2ljZSBdLmNvbmNhdCggbWFrZVBhcmFtcyhsb2NhbGUsIGFyZ3MpICkpO1xuICB9IGVsc2Uge1xuICAgIGVsLl92dCA9IGVsLnRleHRDb250ZW50ID0gKHJlZiQyID0gdm0uJGkxOG4pLnQuYXBwbHkocmVmJDIsIFsgcGF0aCBdLmNvbmNhdCggbWFrZVBhcmFtcyhsb2NhbGUsIGFyZ3MpICkpO1xuICB9XG4gIGVsLl9sb2NhbGUgPSB2bS4kaTE4bi5sb2NhbGU7XG4gIGVsLl9sb2NhbGVNZXNzYWdlID0gdm0uJGkxOG4uZ2V0TG9jYWxlTWVzc2FnZSh2bS4kaTE4bi5sb2NhbGUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVZhbHVlICh2YWx1ZSkge1xuICB2YXIgcGF0aDtcbiAgdmFyIGxvY2FsZTtcbiAgdmFyIGFyZ3M7XG4gIHZhciBjaG9pY2U7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXRoID0gdmFsdWU7XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBwYXRoID0gdmFsdWUucGF0aDtcbiAgICBsb2NhbGUgPSB2YWx1ZS5sb2NhbGU7XG4gICAgYXJncyA9IHZhbHVlLmFyZ3M7XG4gICAgY2hvaWNlID0gdmFsdWUuY2hvaWNlO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aDogcGF0aCwgbG9jYWxlOiBsb2NhbGUsIGFyZ3M6IGFyZ3MsIGNob2ljZTogY2hvaWNlIH1cbn1cblxuZnVuY3Rpb24gbWFrZVBhcmFtcyAobG9jYWxlLCBhcmdzKSB7XG4gIHZhciBwYXJhbXMgPSBbXTtcblxuICBsb2NhbGUgJiYgcGFyYW1zLnB1c2gobG9jYWxlKTtcbiAgaWYgKGFyZ3MgJiYgKEFycmF5LmlzQXJyYXkoYXJncykgfHwgaXNQbGFpbk9iamVjdChhcmdzKSkpIHtcbiAgICBwYXJhbXMucHVzaChhcmdzKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXNcbn1cblxudmFyIFZ1ZTtcblxuZnVuY3Rpb24gaW5zdGFsbCAoX1Z1ZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaW5zdGFsbC5pbnN0YWxsZWQgJiYgX1Z1ZSA9PT0gVnVlKSB7XG4gICAgd2FybignYWxyZWFkeSBpbnN0YWxsZWQuJyk7XG4gICAgcmV0dXJuXG4gIH1cbiAgaW5zdGFsbC5pbnN0YWxsZWQgPSB0cnVlO1xuXG4gIFZ1ZSA9IF9WdWU7XG5cbiAgdmFyIHZlcnNpb24gPSAoVnVlLnZlcnNpb24gJiYgTnVtYmVyKFZ1ZS52ZXJzaW9uLnNwbGl0KCcuJylbMF0pKSB8fCAtMTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHZlcnNpb24gPCAyKSB7XG4gICAgd2FybigoXCJ2dWUtaTE4biAoXCIgKyAoaW5zdGFsbC52ZXJzaW9uKSArIFwiKSBuZWVkIHRvIHVzZSBWdWUgMi4wIG9yIGxhdGVyIChWdWU6IFwiICsgKFZ1ZS52ZXJzaW9uKSArIFwiKS5cIikpO1xuICAgIHJldHVyblxuICB9XG5cbiAgZXh0ZW5kKFZ1ZSk7XG4gIFZ1ZS5taXhpbihtaXhpbik7XG4gIFZ1ZS5kaXJlY3RpdmUoJ3QnLCB7IGJpbmQ6IGJpbmQsIHVwZGF0ZTogdXBkYXRlLCB1bmJpbmQ6IHVuYmluZCB9KTtcbiAgVnVlLmNvbXBvbmVudChpbnRlcnBvbGF0aW9uQ29tcG9uZW50Lm5hbWUsIGludGVycG9sYXRpb25Db21wb25lbnQpO1xuICBWdWUuY29tcG9uZW50KG51bWJlckNvbXBvbmVudC5uYW1lLCBudW1iZXJDb21wb25lbnQpO1xuXG4gIC8vIHVzZSBzaW1wbGUgbWVyZ2VTdHJhdGVnaWVzIHRvIHByZXZlbnQgaTE4biBpbnN0YW5jZSBsb3NlICdfX3Byb3RvX18nXG4gIHZhciBzdHJhdHMgPSBWdWUuY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztcbiAgc3RyYXRzLmkxOG4gPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkge1xuICAgIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHBhcmVudFZhbFxuICAgICAgOiBjaGlsZFZhbFxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIEJhc2VGb3JtYXR0ZXIgPSBmdW5jdGlvbiBCYXNlRm9ybWF0dGVyICgpIHtcbiAgdGhpcy5fY2FjaGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn07XG5cbkJhc2VGb3JtYXR0ZXIucHJvdG90eXBlLmludGVycG9sYXRlID0gZnVuY3Rpb24gaW50ZXJwb2xhdGUgKG1lc3NhZ2UsIHZhbHVlcykge1xuICBpZiAoIXZhbHVlcykge1xuICAgIHJldHVybiBbbWVzc2FnZV1cbiAgfVxuICB2YXIgdG9rZW5zID0gdGhpcy5fY2FjaGVzW21lc3NhZ2VdO1xuICBpZiAoIXRva2Vucykge1xuICAgIHRva2VucyA9IHBhcnNlKG1lc3NhZ2UpO1xuICAgIHRoaXMuX2NhY2hlc1ttZXNzYWdlXSA9IHRva2VucztcbiAgfVxuICByZXR1cm4gY29tcGlsZSh0b2tlbnMsIHZhbHVlcylcbn07XG5cblxuXG52YXIgUkVfVE9LRU5fTElTVF9WQUxVRSA9IC9eKD86XFxkKSsvO1xudmFyIFJFX1RPS0VOX05BTUVEX1ZBTFVFID0gL14oPzpcXHcpKy87XG5cbmZ1bmN0aW9uIHBhcnNlIChmb3JtYXQpIHtcbiAgdmFyIHRva2VucyA9IFtdO1xuICB2YXIgcG9zaXRpb24gPSAwO1xuXG4gIHZhciB0ZXh0ID0gJyc7XG4gIHdoaWxlIChwb3NpdGlvbiA8IGZvcm1hdC5sZW5ndGgpIHtcbiAgICB2YXIgY2hhciA9IGZvcm1hdFtwb3NpdGlvbisrXTtcbiAgICBpZiAoY2hhciA9PT0gJ3snKSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHRleHQgfSk7XG4gICAgICB9XG5cbiAgICAgIHRleHQgPSAnJztcbiAgICAgIHZhciBzdWIgPSAnJztcbiAgICAgIGNoYXIgPSBmb3JtYXRbcG9zaXRpb24rK107XG4gICAgICB3aGlsZSAoY2hhciAhPT0gdW5kZWZpbmVkICYmIGNoYXIgIT09ICd9Jykge1xuICAgICAgICBzdWIgKz0gY2hhcjtcbiAgICAgICAgY2hhciA9IGZvcm1hdFtwb3NpdGlvbisrXTtcbiAgICAgIH1cbiAgICAgIHZhciBpc0Nsb3NlZCA9IGNoYXIgPT09ICd9JztcblxuICAgICAgdmFyIHR5cGUgPSBSRV9UT0tFTl9MSVNUX1ZBTFVFLnRlc3Qoc3ViKVxuICAgICAgICA/ICdsaXN0J1xuICAgICAgICA6IGlzQ2xvc2VkICYmIFJFX1RPS0VOX05BTUVEX1ZBTFVFLnRlc3Qoc3ViKVxuICAgICAgICAgID8gJ25hbWVkJ1xuICAgICAgICAgIDogJ3Vua25vd24nO1xuICAgICAgdG9rZW5zLnB1c2goeyB2YWx1ZTogc3ViLCB0eXBlOiB0eXBlIH0pO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJyUnKSB7XG4gICAgICAvLyB3aGVuIGZvdW5kIHJhaWxzIGkxOG4gc3ludGF4LCBza2lwIHRleHQgY2FwdHVyZVxuICAgICAgaWYgKGZvcm1hdFsocG9zaXRpb24pXSAhPT0gJ3snKSB7XG4gICAgICAgIHRleHQgKz0gY2hhcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dCArPSBjaGFyO1xuICAgIH1cbiAgfVxuXG4gIHRleHQgJiYgdG9rZW5zLnB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiB0ZXh0IH0pO1xuXG4gIHJldHVybiB0b2tlbnNcbn1cblxuZnVuY3Rpb24gY29tcGlsZSAodG9rZW5zLCB2YWx1ZXMpIHtcbiAgdmFyIGNvbXBpbGVkID0gW107XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgdmFyIG1vZGUgPSBBcnJheS5pc0FycmF5KHZhbHVlcylcbiAgICA/ICdsaXN0J1xuICAgIDogaXNPYmplY3QodmFsdWVzKVxuICAgICAgPyAnbmFtZWQnXG4gICAgICA6ICd1bmtub3duJztcbiAgaWYgKG1vZGUgPT09ICd1bmtub3duJykgeyByZXR1cm4gY29tcGlsZWQgfVxuXG4gIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaW5kZXhdO1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIGNvbXBpbGVkLnB1c2godG9rZW4udmFsdWUpO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgIGNvbXBpbGVkLnB1c2godmFsdWVzW3BhcnNlSW50KHRva2VuLnZhbHVlLCAxMCldKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ25hbWVkJzpcbiAgICAgICAgaWYgKG1vZGUgPT09ICduYW1lZCcpIHtcbiAgICAgICAgICBjb21waWxlZC5wdXNoKCh2YWx1ZXMpW3Rva2VuLnZhbHVlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHdhcm4oKFwiVHlwZSBvZiB0b2tlbiAnXCIgKyAodG9rZW4udHlwZSkgKyBcIicgYW5kIGZvcm1hdCBvZiB2YWx1ZSAnXCIgKyBtb2RlICsgXCInIGRvbid0IG1hdGNoIVwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICd1bmtub3duJzpcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuKFwiRGV0ZWN0ICd1bmtub3duJyB0eXBlIG9mIHRva2VuIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBpbGVkXG59XG5cbi8qICAqL1xuXG4vKipcbiAqICBQYXRoIHBhcnNlclxuICogIC0gSW5zcGlyZWQ6XG4gKiAgICBWdWUuanMgUGF0aCBwYXJzZXJcbiAqL1xuXG4vLyBhY3Rpb25zXG52YXIgQVBQRU5EID0gMDtcbnZhciBQVVNIID0gMTtcbnZhciBJTkNfU1VCX1BBVEhfREVQVEggPSAyO1xudmFyIFBVU0hfU1VCX1BBVEggPSAzO1xuXG4vLyBzdGF0ZXNcbnZhciBCRUZPUkVfUEFUSCA9IDA7XG52YXIgSU5fUEFUSCA9IDE7XG52YXIgQkVGT1JFX0lERU5UID0gMjtcbnZhciBJTl9JREVOVCA9IDM7XG52YXIgSU5fU1VCX1BBVEggPSA0O1xudmFyIElOX1NJTkdMRV9RVU9URSA9IDU7XG52YXIgSU5fRE9VQkxFX1FVT1RFID0gNjtcbnZhciBBRlRFUl9QQVRIID0gNztcbnZhciBFUlJPUiA9IDg7XG5cbnZhciBwYXRoU3RhdGVNYWNoaW5lID0gW107XG5cbnBhdGhTdGF0ZU1hY2hpbmVbQkVGT1JFX1BBVEhdID0ge1xuICAnd3MnOiBbQkVGT1JFX1BBVEhdLFxuICAnaWRlbnQnOiBbSU5fSURFTlQsIEFQUEVORF0sXG4gICdbJzogW0lOX1NVQl9QQVRIXSxcbiAgJ2VvZic6IFtBRlRFUl9QQVRIXVxufTtcblxucGF0aFN0YXRlTWFjaGluZVtJTl9QQVRIXSA9IHtcbiAgJ3dzJzogW0lOX1BBVEhdLFxuICAnLic6IFtCRUZPUkVfSURFTlRdLFxuICAnWyc6IFtJTl9TVUJfUEFUSF0sXG4gICdlb2YnOiBbQUZURVJfUEFUSF1cbn07XG5cbnBhdGhTdGF0ZU1hY2hpbmVbQkVGT1JFX0lERU5UXSA9IHtcbiAgJ3dzJzogW0JFRk9SRV9JREVOVF0sXG4gICdpZGVudCc6IFtJTl9JREVOVCwgQVBQRU5EXSxcbiAgJzAnOiBbSU5fSURFTlQsIEFQUEVORF0sXG4gICdudW1iZXInOiBbSU5fSURFTlQsIEFQUEVORF1cbn07XG5cbnBhdGhTdGF0ZU1hY2hpbmVbSU5fSURFTlRdID0ge1xuICAnaWRlbnQnOiBbSU5fSURFTlQsIEFQUEVORF0sXG4gICcwJzogW0lOX0lERU5ULCBBUFBFTkRdLFxuICAnbnVtYmVyJzogW0lOX0lERU5ULCBBUFBFTkRdLFxuICAnd3MnOiBbSU5fUEFUSCwgUFVTSF0sXG4gICcuJzogW0JFRk9SRV9JREVOVCwgUFVTSF0sXG4gICdbJzogW0lOX1NVQl9QQVRILCBQVVNIXSxcbiAgJ2VvZic6IFtBRlRFUl9QQVRILCBQVVNIXVxufTtcblxucGF0aFN0YXRlTWFjaGluZVtJTl9TVUJfUEFUSF0gPSB7XG4gIFwiJ1wiOiBbSU5fU0lOR0xFX1FVT1RFLCBBUFBFTkRdLFxuICAnXCInOiBbSU5fRE9VQkxFX1FVT1RFLCBBUFBFTkRdLFxuICAnWyc6IFtJTl9TVUJfUEFUSCwgSU5DX1NVQl9QQVRIX0RFUFRIXSxcbiAgJ10nOiBbSU5fUEFUSCwgUFVTSF9TVUJfUEFUSF0sXG4gICdlb2YnOiBFUlJPUixcbiAgJ2Vsc2UnOiBbSU5fU1VCX1BBVEgsIEFQUEVORF1cbn07XG5cbnBhdGhTdGF0ZU1hY2hpbmVbSU5fU0lOR0xFX1FVT1RFXSA9IHtcbiAgXCInXCI6IFtJTl9TVUJfUEFUSCwgQVBQRU5EXSxcbiAgJ2VvZic6IEVSUk9SLFxuICAnZWxzZSc6IFtJTl9TSU5HTEVfUVVPVEUsIEFQUEVORF1cbn07XG5cbnBhdGhTdGF0ZU1hY2hpbmVbSU5fRE9VQkxFX1FVT1RFXSA9IHtcbiAgJ1wiJzogW0lOX1NVQl9QQVRILCBBUFBFTkRdLFxuICAnZW9mJzogRVJST1IsXG4gICdlbHNlJzogW0lOX0RPVUJMRV9RVU9URSwgQVBQRU5EXVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBleHByZXNzaW9uIGlzIGEgbGl0ZXJhbCB2YWx1ZS5cbiAqL1xuXG52YXIgbGl0ZXJhbFZhbHVlUkUgPSAvXlxccz8oPzp0cnVlfGZhbHNlfC0/W1xcZC5dK3wnW14nXSonfFwiW15cIl0qXCIpXFxzPyQvO1xuZnVuY3Rpb24gaXNMaXRlcmFsIChleHApIHtcbiAgcmV0dXJuIGxpdGVyYWxWYWx1ZVJFLnRlc3QoZXhwKVxufVxuXG4vKipcbiAqIFN0cmlwIHF1b3RlcyBmcm9tIGEgc3RyaW5nXG4gKi9cblxuZnVuY3Rpb24gc3RyaXBRdW90ZXMgKHN0cikge1xuICB2YXIgYSA9IHN0ci5jaGFyQ29kZUF0KDApO1xuICB2YXIgYiA9IHN0ci5jaGFyQ29kZUF0KHN0ci5sZW5ndGggLSAxKTtcbiAgcmV0dXJuIGEgPT09IGIgJiYgKGEgPT09IDB4MjIgfHwgYSA9PT0gMHgyNylcbiAgICA/IHN0ci5zbGljZSgxLCAtMSlcbiAgICA6IHN0clxufVxuXG4vKipcbiAqIERldGVybWluZSB0aGUgdHlwZSBvZiBhIGNoYXJhY3RlciBpbiBhIGtleXBhdGguXG4gKi9cblxuZnVuY3Rpb24gZ2V0UGF0aENoYXJUeXBlIChjaCkge1xuICBpZiAoY2ggPT09IHVuZGVmaW5lZCB8fCBjaCA9PT0gbnVsbCkgeyByZXR1cm4gJ2VvZicgfVxuXG4gIHZhciBjb2RlID0gY2guY2hhckNvZGVBdCgwKTtcblxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlIDB4NUI6IC8vIFtcbiAgICBjYXNlIDB4NUQ6IC8vIF1cbiAgICBjYXNlIDB4MkU6IC8vIC5cbiAgICBjYXNlIDB4MjI6IC8vIFwiXG4gICAgY2FzZSAweDI3OiAvLyAnXG4gICAgICByZXR1cm4gY2hcblxuICAgIGNhc2UgMHg1RjogLy8gX1xuICAgIGNhc2UgMHgyNDogLy8gJFxuICAgIGNhc2UgMHgyRDogLy8gLVxuICAgICAgcmV0dXJuICdpZGVudCdcblxuICAgIGNhc2UgMHgwOTogLy8gVGFiXG4gICAgY2FzZSAweDBBOiAvLyBOZXdsaW5lXG4gICAgY2FzZSAweDBEOiAvLyBSZXR1cm5cbiAgICBjYXNlIDB4QTA6ICAvLyBOby1icmVhayBzcGFjZVxuICAgIGNhc2UgMHhGRUZGOiAgLy8gQnl0ZSBPcmRlciBNYXJrXG4gICAgY2FzZSAweDIwMjg6ICAvLyBMaW5lIFNlcGFyYXRvclxuICAgIGNhc2UgMHgyMDI5OiAgLy8gUGFyYWdyYXBoIFNlcGFyYXRvclxuICAgICAgcmV0dXJuICd3cydcbiAgfVxuXG4gIHJldHVybiAnaWRlbnQnXG59XG5cbi8qKlxuICogRm9ybWF0IGEgc3ViUGF0aCwgcmV0dXJuIGl0cyBwbGFpbiBmb3JtIGlmIGl0IGlzXG4gKiBhIGxpdGVyYWwgc3RyaW5nIG9yIG51bWJlci4gT3RoZXJ3aXNlIHByZXBlbmQgdGhlXG4gKiBkeW5hbWljIGluZGljYXRvciAoKikuXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0U3ViUGF0aCAocGF0aCkge1xuICB2YXIgdHJpbW1lZCA9IHBhdGgudHJpbSgpO1xuICAvLyBpbnZhbGlkIGxlYWRpbmcgMFxuICBpZiAocGF0aC5jaGFyQXQoMCkgPT09ICcwJyAmJiBpc05hTihwYXRoKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIHJldHVybiBpc0xpdGVyYWwodHJpbW1lZCkgPyBzdHJpcFF1b3Rlcyh0cmltbWVkKSA6ICcqJyArIHRyaW1tZWRcbn1cblxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBwYXRoIGludG8gYW4gYXJyYXkgb2Ygc2VnbWVudHNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZSQxIChwYXRoKSB7XG4gIHZhciBrZXlzID0gW107XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbW9kZSA9IEJFRk9SRV9QQVRIO1xuICB2YXIgc3ViUGF0aERlcHRoID0gMDtcbiAgdmFyIGM7XG4gIHZhciBrZXk7XG4gIHZhciBuZXdDaGFyO1xuICB2YXIgdHlwZTtcbiAgdmFyIHRyYW5zaXRpb247XG4gIHZhciBhY3Rpb247XG4gIHZhciB0eXBlTWFwO1xuICB2YXIgYWN0aW9ucyA9IFtdO1xuXG4gIGFjdGlvbnNbUFVTSF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIGtleSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgYWN0aW9uc1tBUFBFTkRdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5ID0gbmV3Q2hhcjtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5ICs9IG5ld0NoYXI7XG4gICAgfVxuICB9O1xuXG4gIGFjdGlvbnNbSU5DX1NVQl9QQVRIX0RFUFRIXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBhY3Rpb25zW0FQUEVORF0oKTtcbiAgICBzdWJQYXRoRGVwdGgrKztcbiAgfTtcblxuICBhY3Rpb25zW1BVU0hfU1VCX1BBVEhdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzdWJQYXRoRGVwdGggPiAwKSB7XG4gICAgICBzdWJQYXRoRGVwdGgtLTtcbiAgICAgIG1vZGUgPSBJTl9TVUJfUEFUSDtcbiAgICAgIGFjdGlvbnNbQVBQRU5EXSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWJQYXRoRGVwdGggPSAwO1xuICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBmYWxzZSB9XG4gICAgICBrZXkgPSBmb3JtYXRTdWJQYXRoKGtleSk7XG4gICAgICBpZiAoa2V5ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGlvbnNbUFVTSF0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gbWF5YmVVbmVzY2FwZVF1b3RlICgpIHtcbiAgICB2YXIgbmV4dENoYXIgPSBwYXRoW2luZGV4ICsgMV07XG4gICAgaWYgKChtb2RlID09PSBJTl9TSU5HTEVfUVVPVEUgJiYgbmV4dENoYXIgPT09IFwiJ1wiKSB8fFxuICAgICAgKG1vZGUgPT09IElOX0RPVUJMRV9RVU9URSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBuZXdDaGFyID0gJ1xcXFwnICsgbmV4dENoYXI7XG4gICAgICBhY3Rpb25zW0FQUEVORF0oKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKG1vZGUgIT09IG51bGwpIHtcbiAgICBpbmRleCsrO1xuICAgIGMgPSBwYXRoW2luZGV4XTtcblxuICAgIGlmIChjID09PSAnXFxcXCcgJiYgbWF5YmVVbmVzY2FwZVF1b3RlKCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdHlwZSA9IGdldFBhdGhDaGFyVHlwZShjKTtcbiAgICB0eXBlTWFwID0gcGF0aFN0YXRlTWFjaGluZVttb2RlXTtcbiAgICB0cmFuc2l0aW9uID0gdHlwZU1hcFt0eXBlXSB8fCB0eXBlTWFwWydlbHNlJ10gfHwgRVJST1I7XG5cbiAgICBpZiAodHJhbnNpdGlvbiA9PT0gRVJST1IpIHtcbiAgICAgIHJldHVybiAvLyBwYXJzZSBlcnJvclxuICAgIH1cblxuICAgIG1vZGUgPSB0cmFuc2l0aW9uWzBdO1xuICAgIGFjdGlvbiA9IGFjdGlvbnNbdHJhbnNpdGlvblsxXV07XG4gICAgaWYgKGFjdGlvbikge1xuICAgICAgbmV3Q2hhciA9IHRyYW5zaXRpb25bMl07XG4gICAgICBuZXdDaGFyID0gbmV3Q2hhciA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gY1xuICAgICAgICA6IG5ld0NoYXI7XG4gICAgICBpZiAoYWN0aW9uKCkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2RlID09PSBBRlRFUl9QQVRIKSB7XG4gICAgICByZXR1cm4ga2V5c1xuICAgIH1cbiAgfVxufVxuXG5cblxuXG5cbnZhciBJMThuUGF0aCA9IGZ1bmN0aW9uIEkxOG5QYXRoICgpIHtcbiAgdGhpcy5fY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xufTtcblxuLyoqXG4gKiBFeHRlcm5hbCBwYXJzZSB0aGF0IGNoZWNrIGZvciBhIGNhY2hlIGhpdCBmaXJzdFxuICovXG5JMThuUGF0aC5wcm90b3R5cGUucGFyc2VQYXRoID0gZnVuY3Rpb24gcGFyc2VQYXRoIChwYXRoKSB7XG4gIHZhciBoaXQgPSB0aGlzLl9jYWNoZVtwYXRoXTtcbiAgaWYgKCFoaXQpIHtcbiAgICBoaXQgPSBwYXJzZSQxKHBhdGgpO1xuICAgIGlmIChoaXQpIHtcbiAgICAgIHRoaXMuX2NhY2hlW3BhdGhdID0gaGl0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGl0IHx8IFtdXG59O1xuXG4vKipcbiAqIEdldCBwYXRoIHZhbHVlIGZyb20gcGF0aCBzdHJpbmdcbiAqL1xuSTE4blBhdGgucHJvdG90eXBlLmdldFBhdGhWYWx1ZSA9IGZ1bmN0aW9uIGdldFBhdGhWYWx1ZSAob2JqLCBwYXRoKSB7XG4gIGlmICghaXNPYmplY3Qob2JqKSkgeyByZXR1cm4gbnVsbCB9XG5cbiAgdmFyIHBhdGhzID0gdGhpcy5wYXJzZVBhdGgocGF0aCk7XG4gIGlmIChwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGg7XG4gICAgdmFyIGxhc3QgPSBvYmo7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBsYXN0W3BhdGhzW2ldXTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBsYXN0ID0gdmFsdWU7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3RcbiAgfVxufTtcblxuLyogICovXG5cblxuXG52YXIgaHRtbFRhZ01hdGNoZXIgPSAvPFxcLz9bXFx3XFxzPVwiLy4nOjsjLVxcL10rPi87XG52YXIgbGlua0tleU1hdGNoZXIgPSAvKD86QCg/OlxcLlthLXpdKyk/Oig/OltcXHdcXC1ffC5dK3xcXChbXFx3XFwtX3wuXStcXCkpKS9nO1xudmFyIGxpbmtLZXlQcmVmaXhNYXRjaGVyID0gL15AKD86XFwuKFthLXpdKykpPzovO1xudmFyIGJyYWNrZXRzTWF0Y2hlciA9IC9bKCldL2c7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IHtcbiAgJ3VwcGVyJzogZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyLnRvTG9jYWxlVXBwZXJDYXNlKCk7IH0sXG4gICdsb3dlcic6IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHN0ci50b0xvY2FsZUxvd2VyQ2FzZSgpOyB9XG59O1xuXG52YXIgZGVmYXVsdEZvcm1hdHRlciA9IG5ldyBCYXNlRm9ybWF0dGVyKCk7XG5cbnZhciBWdWVJMThuID0gZnVuY3Rpb24gVnVlSTE4biAob3B0aW9ucykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcbiAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgLy8gQXV0byBpbnN0YWxsIGlmIGl0IGlzIG5vdCBkb25lIHlldCBhbmQgYHdpbmRvd2AgaGFzIGBWdWVgLlxuICAvLyBUbyBhbGxvdyB1c2VycyB0byBhdm9pZCBhdXRvLWluc3RhbGxhdGlvbiBpbiBzb21lIGNhc2VzLFxuICAvLyB0aGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCBoZXJlLiBTZWUgIzI5MFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFWdWUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlZ1ZSkge1xuICAgIGluc3RhbGwod2luZG93LlZ1ZSk7XG4gIH1cblxuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgJ2VuLVVTJztcbiAgdmFyIGZhbGxiYWNrTG9jYWxlID0gb3B0aW9ucy5mYWxsYmFja0xvY2FsZSB8fCAnZW4tVVMnO1xuICB2YXIgbWVzc2FnZXMgPSBvcHRpb25zLm1lc3NhZ2VzIHx8IHt9O1xuICB2YXIgZGF0ZVRpbWVGb3JtYXRzID0gb3B0aW9ucy5kYXRlVGltZUZvcm1hdHMgfHwge307XG4gIHZhciBudW1iZXJGb3JtYXRzID0gb3B0aW9ucy5udW1iZXJGb3JtYXRzIHx8IHt9O1xuXG4gIHRoaXMuX3ZtID0gbnVsbDtcbiAgdGhpcy5fZm9ybWF0dGVyID0gb3B0aW9ucy5mb3JtYXR0ZXIgfHwgZGVmYXVsdEZvcm1hdHRlcjtcbiAgdGhpcy5fbW9kaWZpZXJzID0gb3B0aW9ucy5tb2RpZmllcnMgfHwge307XG4gIHRoaXMuX21pc3NpbmcgPSBvcHRpb25zLm1pc3NpbmcgfHwgbnVsbDtcbiAgdGhpcy5fcm9vdCA9IG9wdGlvbnMucm9vdCB8fCBudWxsO1xuICB0aGlzLl9zeW5jID0gb3B0aW9ucy5zeW5jID09PSB1bmRlZmluZWQgPyB0cnVlIDogISFvcHRpb25zLnN5bmM7XG4gIHRoaXMuX2ZhbGxiYWNrUm9vdCA9IG9wdGlvbnMuZmFsbGJhY2tSb290ID09PSB1bmRlZmluZWRcbiAgICA/IHRydWVcbiAgICA6ICEhb3B0aW9ucy5mYWxsYmFja1Jvb3Q7XG4gIHRoaXMuX2Zvcm1hdEZhbGxiYWNrTWVzc2FnZXMgPSBvcHRpb25zLmZvcm1hdEZhbGxiYWNrTWVzc2FnZXMgPT09IHVuZGVmaW5lZFxuICAgID8gZmFsc2VcbiAgICA6ICEhb3B0aW9ucy5mb3JtYXRGYWxsYmFja01lc3NhZ2VzO1xuICB0aGlzLl9zaWxlbnRUcmFuc2xhdGlvbldhcm4gPSBvcHRpb25zLnNpbGVudFRyYW5zbGF0aW9uV2FybiA9PT0gdW5kZWZpbmVkXG4gICAgPyBmYWxzZVxuICAgIDogb3B0aW9ucy5zaWxlbnRUcmFuc2xhdGlvbldhcm47XG4gIHRoaXMuX3NpbGVudEZhbGxiYWNrV2FybiA9IG9wdGlvbnMuc2lsZW50RmFsbGJhY2tXYXJuID09PSB1bmRlZmluZWRcbiAgICA/IGZhbHNlXG4gICAgOiAhIW9wdGlvbnMuc2lsZW50RmFsbGJhY2tXYXJuO1xuICB0aGlzLl9kYXRlVGltZUZvcm1hdHRlcnMgPSB7fTtcbiAgdGhpcy5fbnVtYmVyRm9ybWF0dGVycyA9IHt9O1xuICB0aGlzLl9wYXRoID0gbmV3IEkxOG5QYXRoKCk7XG4gIHRoaXMuX2RhdGFMaXN0ZW5lcnMgPSBbXTtcbiAgdGhpcy5fcHJlc2VydmVEaXJlY3RpdmVDb250ZW50ID0gb3B0aW9ucy5wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQgPT09IHVuZGVmaW5lZFxuICAgID8gZmFsc2VcbiAgICA6ICEhb3B0aW9ucy5wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQ7XG4gIHRoaXMucGx1cmFsaXphdGlvblJ1bGVzID0gb3B0aW9ucy5wbHVyYWxpemF0aW9uUnVsZXMgfHwge307XG4gIHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID0gb3B0aW9ucy53YXJuSHRtbEluTWVzc2FnZSB8fCAnb2ZmJztcblxuICB0aGlzLl9leGlzdCA9IGZ1bmN0aW9uIChtZXNzYWdlLCBrZXkpIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgIWtleSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIGlmICghaXNOdWxsKHRoaXMkMS5fcGF0aC5nZXRQYXRoVmFsdWUobWVzc2FnZSwga2V5KSkpIHsgcmV0dXJuIHRydWUgfVxuICAgIC8vIGZhbGxiYWNrIGZvciBmbGF0IGtleVxuICAgIGlmIChtZXNzYWdlW2tleV0pIHsgcmV0dXJuIHRydWUgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIGlmICh0aGlzLl93YXJuSHRtbEluTWVzc2FnZSA9PT0gJ3dhcm4nIHx8IHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID09PSAnZXJyb3InKSB7XG4gICAgT2JqZWN0LmtleXMobWVzc2FnZXMpLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgdGhpcyQxLl9jaGVja0xvY2FsZU1lc3NhZ2UobG9jYWxlLCB0aGlzJDEuX3dhcm5IdG1sSW5NZXNzYWdlLCBtZXNzYWdlc1tsb2NhbGVdKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRoaXMuX2luaXRWTSh7XG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZmFsbGJhY2tMb2NhbGU6IGZhbGxiYWNrTG9jYWxlLFxuICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyxcbiAgICBkYXRlVGltZUZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cyxcbiAgICBudW1iZXJGb3JtYXRzOiBudW1iZXJGb3JtYXRzXG4gIH0pO1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgdm06IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sbWVzc2FnZXM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZGF0ZVRpbWVGb3JtYXRzOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LG51bWJlckZvcm1hdHM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYXZhaWxhYmxlTG9jYWxlczogeyBjb25maWd1cmFibGU6IHRydWUgfSxsb2NhbGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZmFsbGJhY2tMb2NhbGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZm9ybWF0RmFsbGJhY2tNZXNzYWdlczogeyBjb25maWd1cmFibGU6IHRydWUgfSxtaXNzaW5nOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGZvcm1hdHRlcjogeyBjb25maWd1cmFibGU6IHRydWUgfSxzaWxlbnRUcmFuc2xhdGlvbldhcm46IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sc2lsZW50RmFsbGJhY2tXYXJuOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHByZXNlcnZlRGlyZWN0aXZlQ29udGVudDogeyBjb25maWd1cmFibGU6IHRydWUgfSx3YXJuSHRtbEluTWVzc2FnZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fY2hlY2tMb2NhbGVNZXNzYWdlID0gZnVuY3Rpb24gX2NoZWNrTG9jYWxlTWVzc2FnZSAobG9jYWxlLCBsZXZlbCwgbWVzc2FnZSkge1xuICB2YXIgcGF0aHMgPSBbXTtcblxuICB2YXIgZm4gPSBmdW5jdGlvbiAobGV2ZWwsIGxvY2FsZSwgbWVzc2FnZSwgcGF0aHMpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChtZXNzYWdlKSkge1xuICAgICAgT2JqZWN0LmtleXMobWVzc2FnZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWwgPSBtZXNzYWdlW2tleV07XG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgICBwYXRocy5wdXNoKGtleSk7XG4gICAgICAgICAgcGF0aHMucHVzaCgnLicpO1xuICAgICAgICAgIGZuKGxldmVsLCBsb2NhbGUsIHZhbCwgcGF0aHMpO1xuICAgICAgICAgIHBhdGhzLnBvcCgpO1xuICAgICAgICAgIHBhdGhzLnBvcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGhzLnB1c2goa2V5KTtcbiAgICAgICAgICBmbihsZXZlbCwgbG9jYWxlLCB2YWwsIHBhdGhzKTtcbiAgICAgICAgICBwYXRocy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UpKSB7XG4gICAgICBtZXNzYWdlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgICAgcGF0aHMucHVzaCgoXCJbXCIgKyBpbmRleCArIFwiXVwiKSk7XG4gICAgICAgICAgcGF0aHMucHVzaCgnLicpO1xuICAgICAgICAgIGZuKGxldmVsLCBsb2NhbGUsIGl0ZW0sIHBhdGhzKTtcbiAgICAgICAgICBwYXRocy5wb3AoKTtcbiAgICAgICAgICBwYXRocy5wb3AoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRocy5wdXNoKChcIltcIiArIGluZGV4ICsgXCJdXCIpKTtcbiAgICAgICAgICBmbihsZXZlbCwgbG9jYWxlLCBpdGVtLCBwYXRocyk7XG4gICAgICAgICAgcGF0aHMucG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgcmV0ID0gaHRtbFRhZ01hdGNoZXIudGVzdChtZXNzYWdlKTtcbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgdmFyIG1zZyA9IFwiRGV0ZWN0ZWQgSFRNTCBpbiBtZXNzYWdlICdcIiArIG1lc3NhZ2UgKyBcIicgb2Yga2V5cGF0aCAnXCIgKyAocGF0aHMuam9pbignJykpICsgXCInIGF0ICdcIiArIGxvY2FsZSArIFwiJy4gQ29uc2lkZXIgY29tcG9uZW50IGludGVycG9sYXRpb24gd2l0aCAnPGkxOG4+JyB0byBhdm9pZCBYU1MuIFNlZSBodHRwczovL2JpdC5seS8yWnFKemtwXCI7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gJ3dhcm4nKSB7XG4gICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgZXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBmbihsZXZlbCwgbG9jYWxlLCBtZXNzYWdlLCBwYXRocyk7XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5faW5pdFZNID0gZnVuY3Rpb24gX2luaXRWTSAoZGF0YSkge1xuICB2YXIgc2lsZW50ID0gVnVlLmNvbmZpZy5zaWxlbnQ7XG4gIFZ1ZS5jb25maWcuc2lsZW50ID0gdHJ1ZTtcbiAgdGhpcy5fdm0gPSBuZXcgVnVlKHsgZGF0YTogZGF0YSB9KTtcbiAgVnVlLmNvbmZpZy5zaWxlbnQgPSBzaWxlbnQ7XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5kZXN0cm95Vk0gPSBmdW5jdGlvbiBkZXN0cm95Vk0gKCkge1xuICB0aGlzLl92bS4kZGVzdHJveSgpO1xufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuc3Vic2NyaWJlRGF0YUNoYW5naW5nID0gZnVuY3Rpb24gc3Vic2NyaWJlRGF0YUNoYW5naW5nICh2bSkge1xuICB0aGlzLl9kYXRhTGlzdGVuZXJzLnB1c2godm0pO1xufTtcblxuVnVlSTE4bi5wcm90b3R5cGUudW5zdWJzY3JpYmVEYXRhQ2hhbmdpbmcgPSBmdW5jdGlvbiB1bnN1YnNjcmliZURhdGFDaGFuZ2luZyAodm0pIHtcbiAgcmVtb3ZlKHRoaXMuX2RhdGFMaXN0ZW5lcnMsIHZtKTtcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLndhdGNoSTE4bkRhdGEgPSBmdW5jdGlvbiB3YXRjaEkxOG5EYXRhICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gdGhpcy5fdm0uJHdhdGNoKCckZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaSA9IHNlbGYuX2RhdGFMaXN0ZW5lcnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIFZ1ZS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuX2RhdGFMaXN0ZW5lcnNbaV0gJiYgc2VsZi5fZGF0YUxpc3RlbmVyc1tpXS4kZm9yY2VVcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgeyBkZWVwOiB0cnVlIH0pXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS53YXRjaExvY2FsZSA9IGZ1bmN0aW9uIHdhdGNoTG9jYWxlICgpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghdGhpcy5fc3luYyB8fCAhdGhpcy5fcm9vdCkgeyByZXR1cm4gbnVsbCB9XG4gIHZhciB0YXJnZXQgPSB0aGlzLl92bTtcbiAgcmV0dXJuIHRoaXMuX3Jvb3QuJGkxOG4udm0uJHdhdGNoKCdsb2NhbGUnLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGFyZ2V0LiRzZXQodGFyZ2V0LCAnbG9jYWxlJywgdmFsKTtcbiAgICB0YXJnZXQuJGZvcmNlVXBkYXRlKCk7XG4gIH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMudm0uZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdm0gfTtcblxucHJvdG90eXBlQWNjZXNzb3JzLm1lc3NhZ2VzLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxvb3NlQ2xvbmUodGhpcy5fZ2V0TWVzc2FnZXMoKSkgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5kYXRlVGltZUZvcm1hdHMuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbG9vc2VDbG9uZSh0aGlzLl9nZXREYXRlVGltZUZvcm1hdHMoKSkgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5udW1iZXJGb3JtYXRzLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxvb3NlQ2xvbmUodGhpcy5fZ2V0TnVtYmVyRm9ybWF0cygpKSB9O1xucHJvdG90eXBlQWNjZXNzb3JzLmF2YWlsYWJsZUxvY2FsZXMuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gT2JqZWN0LmtleXModGhpcy5tZXNzYWdlcykuc29ydCgpIH07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5sb2NhbGUuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdm0ubG9jYWxlIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMubG9jYWxlLnNldCA9IGZ1bmN0aW9uIChsb2NhbGUpIHtcbiAgdGhpcy5fdm0uJHNldCh0aGlzLl92bSwgJ2xvY2FsZScsIGxvY2FsZSk7XG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuZmFsbGJhY2tMb2NhbGUuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdm0uZmFsbGJhY2tMb2NhbGUgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5mYWxsYmFja0xvY2FsZS5zZXQgPSBmdW5jdGlvbiAobG9jYWxlKSB7XG4gIHRoaXMuX3ZtLiRzZXQodGhpcy5fdm0sICdmYWxsYmFja0xvY2FsZScsIGxvY2FsZSk7XG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuZm9ybWF0RmFsbGJhY2tNZXNzYWdlcy5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9mb3JtYXRGYWxsYmFja01lc3NhZ2VzIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMuZm9ybWF0RmFsbGJhY2tNZXNzYWdlcy5zZXQgPSBmdW5jdGlvbiAoZmFsbGJhY2spIHsgdGhpcy5fZm9ybWF0RmFsbGJhY2tNZXNzYWdlcyA9IGZhbGxiYWNrOyB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMubWlzc2luZy5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9taXNzaW5nIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMubWlzc2luZy5zZXQgPSBmdW5jdGlvbiAoaGFuZGxlcikgeyB0aGlzLl9taXNzaW5nID0gaGFuZGxlcjsgfTtcblxucHJvdG90eXBlQWNjZXNzb3JzLmZvcm1hdHRlci5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9mb3JtYXR0ZXIgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5mb3JtYXR0ZXIuc2V0ID0gZnVuY3Rpb24gKGZvcm1hdHRlcikgeyB0aGlzLl9mb3JtYXR0ZXIgPSBmb3JtYXR0ZXI7IH07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5zaWxlbnRUcmFuc2xhdGlvbldhcm4uZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fc2lsZW50VHJhbnNsYXRpb25XYXJuIH07XG5wcm90b3R5cGVBY2Nlc3NvcnMuc2lsZW50VHJhbnNsYXRpb25XYXJuLnNldCA9IGZ1bmN0aW9uIChzaWxlbnQpIHsgdGhpcy5fc2lsZW50VHJhbnNsYXRpb25XYXJuID0gc2lsZW50OyB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuc2lsZW50RmFsbGJhY2tXYXJuLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3NpbGVudEZhbGxiYWNrV2FybiB9O1xucHJvdG90eXBlQWNjZXNzb3JzLnNpbGVudEZhbGxiYWNrV2Fybi5zZXQgPSBmdW5jdGlvbiAoc2lsZW50KSB7IHRoaXMuX3NpbGVudEZhbGxiYWNrV2FybiA9IHNpbGVudDsgfTtcblxucHJvdG90eXBlQWNjZXNzb3JzLnByZXNlcnZlRGlyZWN0aXZlQ29udGVudC5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy5wcmVzZXJ2ZURpcmVjdGl2ZUNvbnRlbnQuc2V0ID0gZnVuY3Rpb24gKHByZXNlcnZlKSB7IHRoaXMuX3ByZXNlcnZlRGlyZWN0aXZlQ29udGVudCA9IHByZXNlcnZlOyB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMud2Fybkh0bWxJbk1lc3NhZ2UuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fd2Fybkh0bWxJbk1lc3NhZ2UgfTtcbnByb3RvdHlwZUFjY2Vzc29ycy53YXJuSHRtbEluTWVzc2FnZS5zZXQgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgb3JnTGV2ZWwgPSB0aGlzLl93YXJuSHRtbEluTWVzc2FnZTtcbiAgdGhpcy5fd2Fybkh0bWxJbk1lc3NhZ2UgPSBsZXZlbDtcbiAgaWYgKG9yZ0xldmVsICE9PSBsZXZlbCAmJiAobGV2ZWwgPT09ICd3YXJuJyB8fCBsZXZlbCA9PT0gJ2Vycm9yJykpIHtcbiAgICB2YXIgbWVzc2FnZXMgPSB0aGlzLl9nZXRNZXNzYWdlcygpO1xuICAgIE9iamVjdC5rZXlzKG1lc3NhZ2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbGUpIHtcbiAgICAgIHRoaXMkMS5fY2hlY2tMb2NhbGVNZXNzYWdlKGxvY2FsZSwgdGhpcyQxLl93YXJuSHRtbEluTWVzc2FnZSwgbWVzc2FnZXNbbG9jYWxlXSk7XG4gICAgfSk7XG4gIH1cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9nZXRNZXNzYWdlcyA9IGZ1bmN0aW9uIF9nZXRNZXNzYWdlcyAoKSB7IHJldHVybiB0aGlzLl92bS5tZXNzYWdlcyB9O1xuVnVlSTE4bi5wcm90b3R5cGUuX2dldERhdGVUaW1lRm9ybWF0cyA9IGZ1bmN0aW9uIF9nZXREYXRlVGltZUZvcm1hdHMgKCkgeyByZXR1cm4gdGhpcy5fdm0uZGF0ZVRpbWVGb3JtYXRzIH07XG5WdWVJMThuLnByb3RvdHlwZS5fZ2V0TnVtYmVyRm9ybWF0cyA9IGZ1bmN0aW9uIF9nZXROdW1iZXJGb3JtYXRzICgpIHsgcmV0dXJuIHRoaXMuX3ZtLm51bWJlckZvcm1hdHMgfTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX3dhcm5EZWZhdWx0ID0gZnVuY3Rpb24gX3dhcm5EZWZhdWx0IChsb2NhbGUsIGtleSwgcmVzdWx0LCB2bSwgdmFsdWVzKSB7XG4gIGlmICghaXNOdWxsKHJlc3VsdCkpIHsgcmV0dXJuIHJlc3VsdCB9XG4gIGlmICh0aGlzLl9taXNzaW5nKSB7XG4gICAgdmFyIG1pc3NpbmdSZXQgPSB0aGlzLl9taXNzaW5nLmFwcGx5KG51bGwsIFtsb2NhbGUsIGtleSwgdm0sIHZhbHVlc10pO1xuICAgIGlmICh0eXBlb2YgbWlzc2luZ1JldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtaXNzaW5nUmV0XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF0aGlzLl9pc1NpbGVudFRyYW5zbGF0aW9uV2FybihrZXkpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBcIkNhbm5vdCB0cmFuc2xhdGUgdGhlIHZhbHVlIG9mIGtleXBhdGggJ1wiICsga2V5ICsgXCInLiBcIiArXG4gICAgICAgICdVc2UgdGhlIHZhbHVlIG9mIGtleXBhdGggYXMgZGVmYXVsdC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl9mb3JtYXRGYWxsYmFja01lc3NhZ2VzKSB7XG4gICAgdmFyIHBhcnNlZEFyZ3MgPSBwYXJzZUFyZ3MuYXBwbHkodm9pZCAwLCB2YWx1ZXMpO1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXIoa2V5LCAnc3RyaW5nJywgcGFyc2VkQXJncy5wYXJhbXMsIGtleSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ga2V5XG4gIH1cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9pc0ZhbGxiYWNrUm9vdCA9IGZ1bmN0aW9uIF9pc0ZhbGxiYWNrUm9vdCAodmFsKSB7XG4gIHJldHVybiAhdmFsICYmICFpc051bGwodGhpcy5fcm9vdCkgJiYgdGhpcy5fZmFsbGJhY2tSb290XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5faXNTaWxlbnRGYWxsYmFja1dhcm4gPSBmdW5jdGlvbiBfaXNTaWxlbnRGYWxsYmFja1dhcm4gKGtleSkge1xuICByZXR1cm4gdGhpcy5fc2lsZW50RmFsbGJhY2tXYXJuIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgPyB0aGlzLl9zaWxlbnRGYWxsYmFja1dhcm4udGVzdChrZXkpXG4gICAgOiB0aGlzLl9zaWxlbnRGYWxsYmFja1dhcm5cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9pc1NpbGVudEZhbGxiYWNrID0gZnVuY3Rpb24gX2lzU2lsZW50RmFsbGJhY2sgKGxvY2FsZSwga2V5KSB7XG4gIHJldHVybiB0aGlzLl9pc1NpbGVudEZhbGxiYWNrV2FybihrZXkpICYmICh0aGlzLl9pc0ZhbGxiYWNrUm9vdCgpIHx8IGxvY2FsZSAhPT0gdGhpcy5mYWxsYmFja0xvY2FsZSlcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9pc1NpbGVudFRyYW5zbGF0aW9uV2FybiA9IGZ1bmN0aW9uIF9pc1NpbGVudFRyYW5zbGF0aW9uV2FybiAoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9zaWxlbnRUcmFuc2xhdGlvbldhcm4gaW5zdGFuY2VvZiBSZWdFeHBcbiAgICA/IHRoaXMuX3NpbGVudFRyYW5zbGF0aW9uV2Fybi50ZXN0KGtleSlcbiAgICA6IHRoaXMuX3NpbGVudFRyYW5zbGF0aW9uV2FyblxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX2ludGVycG9sYXRlID0gZnVuY3Rpb24gX2ludGVycG9sYXRlIChcbiAgbG9jYWxlLFxuICBtZXNzYWdlLFxuICBrZXksXG4gIGhvc3QsXG4gIGludGVycG9sYXRlTW9kZSxcbiAgdmFsdWVzLFxuICB2aXNpdGVkTGlua1N0YWNrXG4pIHtcbiAgaWYgKCFtZXNzYWdlKSB7IHJldHVybiBudWxsIH1cblxuICB2YXIgcGF0aFJldCA9IHRoaXMuX3BhdGguZ2V0UGF0aFZhbHVlKG1lc3NhZ2UsIGtleSk7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhdGhSZXQpIHx8IGlzUGxhaW5PYmplY3QocGF0aFJldCkpIHsgcmV0dXJuIHBhdGhSZXQgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChpc051bGwocGF0aFJldCkpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpc1BsYWluT2JqZWN0KG1lc3NhZ2UpKSB7XG4gICAgICByZXQgPSBtZXNzYWdlW2tleV07XG4gICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkgJiYgIXRoaXMuX2lzU2lsZW50RmFsbGJhY2sobG9jYWxlLCBrZXkpKSB7XG4gICAgICAgICAgd2FybigoXCJWYWx1ZSBvZiBrZXkgJ1wiICsga2V5ICsgXCInIGlzIG5vdCBhIHN0cmluZyFcIikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHR5cGVvZiBwYXRoUmV0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0ID0gcGF0aFJldDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkgJiYgIXRoaXMuX2lzU2lsZW50RmFsbGJhY2sobG9jYWxlLCBrZXkpKSB7XG4gICAgICAgIHdhcm4oKFwiVmFsdWUgb2Yga2V5ICdcIiArIGtleSArIFwiJyBpcyBub3QgYSBzdHJpbmchXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgbGlua3Mgd2l0aGluIHRoZSB0cmFuc2xhdGVkIHN0cmluZ1xuICBpZiAocmV0LmluZGV4T2YoJ0A6JykgPj0gMCB8fCByZXQuaW5kZXhPZignQC4nKSA+PSAwKSB7XG4gICAgcmV0ID0gdGhpcy5fbGluayhsb2NhbGUsIG1lc3NhZ2UsIHJldCwgaG9zdCwgJ3JhdycsIHZhbHVlcywgdmlzaXRlZExpbmtTdGFjayk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fcmVuZGVyKHJldCwgaW50ZXJwb2xhdGVNb2RlLCB2YWx1ZXMsIGtleSlcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl9saW5rID0gZnVuY3Rpb24gX2xpbmsgKFxuICBsb2NhbGUsXG4gIG1lc3NhZ2UsXG4gIHN0cixcbiAgaG9zdCxcbiAgaW50ZXJwb2xhdGVNb2RlLFxuICB2YWx1ZXMsXG4gIHZpc2l0ZWRMaW5rU3RhY2tcbikge1xuICB2YXIgcmV0ID0gc3RyO1xuXG4gIC8vIE1hdGNoIGFsbCB0aGUgbGlua3Mgd2l0aGluIHRoZSBsb2NhbFxuICAvLyBXZSBhcmUgZ29pbmcgdG8gcmVwbGFjZSBlYWNoIG9mXG4gIC8vIHRoZW0gd2l0aCBpdHMgdHJhbnNsYXRpb25cbiAgdmFyIG1hdGNoZXMgPSByZXQubWF0Y2gobGlua0tleU1hdGNoZXIpO1xuICBmb3IgKHZhciBpZHggaW4gbWF0Y2hlcykge1xuICAgIC8vIGllIGNvbXBhdGlibGU6IGZpbHRlciBjdXN0b20gYXJyYXlcbiAgICAvLyBwcm90b3R5cGUgbWV0aG9kXG4gICAgaWYgKCFtYXRjaGVzLmhhc093blByb3BlcnR5KGlkeCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIHZhciBsaW5rID0gbWF0Y2hlc1tpZHhdO1xuICAgIHZhciBsaW5rS2V5UHJlZml4TWF0Y2hlcyA9IGxpbmsubWF0Y2gobGlua0tleVByZWZpeE1hdGNoZXIpO1xuICAgIHZhciBsaW5rUHJlZml4ID0gbGlua0tleVByZWZpeE1hdGNoZXNbMF07XG4gICAgICB2YXIgZm9ybWF0dGVyTmFtZSA9IGxpbmtLZXlQcmVmaXhNYXRjaGVzWzFdO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBsZWFkaW5nIEA6LCBALmNhc2U6IGFuZCB0aGUgYnJhY2tldHNcbiAgICB2YXIgbGlua1BsYWNlaG9sZGVyID0gbGluay5yZXBsYWNlKGxpbmtQcmVmaXgsICcnKS5yZXBsYWNlKGJyYWNrZXRzTWF0Y2hlciwgJycpO1xuXG4gICAgaWYgKHZpc2l0ZWRMaW5rU3RhY2suaW5jbHVkZXMobGlua1BsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybigoXCJDaXJjdWxhciByZWZlcmVuY2UgZm91bmQuIFxcXCJcIiArIGxpbmsgKyBcIlxcXCIgaXMgYWxyZWFkeSB2aXNpdGVkIGluIHRoZSBjaGFpbiBvZiBcIiArICh2aXNpdGVkTGlua1N0YWNrLnJldmVyc2UoKS5qb2luKCcgPC0gJykpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICAgIHZpc2l0ZWRMaW5rU3RhY2sucHVzaChsaW5rUGxhY2Vob2xkZXIpO1xuXG4gICAgLy8gVHJhbnNsYXRlIHRoZSBsaW5rXG4gICAgdmFyIHRyYW5zbGF0ZWQgPSB0aGlzLl9pbnRlcnBvbGF0ZShcbiAgICAgIGxvY2FsZSwgbWVzc2FnZSwgbGlua1BsYWNlaG9sZGVyLCBob3N0LFxuICAgICAgaW50ZXJwb2xhdGVNb2RlID09PSAncmF3JyA/ICdzdHJpbmcnIDogaW50ZXJwb2xhdGVNb2RlLFxuICAgICAgaW50ZXJwb2xhdGVNb2RlID09PSAncmF3JyA/IHVuZGVmaW5lZCA6IHZhbHVlcyxcbiAgICAgIHZpc2l0ZWRMaW5rU3RhY2tcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuX2lzRmFsbGJhY2tSb290KHRyYW5zbGF0ZWQpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGhpcy5faXNTaWxlbnRUcmFuc2xhdGlvbldhcm4obGlua1BsYWNlaG9sZGVyKSkge1xuICAgICAgICB3YXJuKChcIkZhbGwgYmFjayB0byB0cmFuc2xhdGUgdGhlIGxpbmsgcGxhY2Vob2xkZXIgJ1wiICsgbGlua1BsYWNlaG9sZGVyICsgXCInIHdpdGggcm9vdCBsb2NhbGUuXCIpKTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgICAgdmFyIHJvb3QgPSB0aGlzLl9yb290LiRpMThuO1xuICAgICAgdHJhbnNsYXRlZCA9IHJvb3QuX3RyYW5zbGF0ZShcbiAgICAgICAgcm9vdC5fZ2V0TWVzc2FnZXMoKSwgcm9vdC5sb2NhbGUsIHJvb3QuZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgIGxpbmtQbGFjZWhvbGRlciwgaG9zdCwgaW50ZXJwb2xhdGVNb2RlLCB2YWx1ZXNcbiAgICAgICk7XG4gICAgfVxuICAgIHRyYW5zbGF0ZWQgPSB0aGlzLl93YXJuRGVmYXVsdChcbiAgICAgIGxvY2FsZSwgbGlua1BsYWNlaG9sZGVyLCB0cmFuc2xhdGVkLCBob3N0LFxuICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzIDogW3ZhbHVlc11cbiAgICApO1xuXG4gICAgaWYgKHRoaXMuX21vZGlmaWVycy5oYXNPd25Qcm9wZXJ0eShmb3JtYXR0ZXJOYW1lKSkge1xuICAgICAgdHJhbnNsYXRlZCA9IHRoaXMuX21vZGlmaWVyc1tmb3JtYXR0ZXJOYW1lXSh0cmFuc2xhdGVkKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRNb2RpZmllcnMuaGFzT3duUHJvcGVydHkoZm9ybWF0dGVyTmFtZSkpIHtcbiAgICAgIHRyYW5zbGF0ZWQgPSBkZWZhdWx0TW9kaWZpZXJzW2Zvcm1hdHRlck5hbWVdKHRyYW5zbGF0ZWQpO1xuICAgIH1cblxuICAgIHZpc2l0ZWRMaW5rU3RhY2sucG9wKCk7XG5cbiAgICAvLyBSZXBsYWNlIHRoZSBsaW5rIHdpdGggdGhlIHRyYW5zbGF0ZWRcbiAgICByZXQgPSAhdHJhbnNsYXRlZCA/IHJldCA6IHJldC5yZXBsYWNlKGxpbmssIHRyYW5zbGF0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIHJldFxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uIF9yZW5kZXIgKG1lc3NhZ2UsIGludGVycG9sYXRlTW9kZSwgdmFsdWVzLCBwYXRoKSB7XG4gIHZhciByZXQgPSB0aGlzLl9mb3JtYXR0ZXIuaW50ZXJwb2xhdGUobWVzc2FnZSwgdmFsdWVzLCBwYXRoKTtcblxuICAvLyBJZiB0aGUgY3VzdG9tIGZvcm1hdHRlciByZWZ1c2VzIHRvIHdvcmsgLSBhcHBseSB0aGUgZGVmYXVsdCBvbmVcbiAgaWYgKCFyZXQpIHtcbiAgICByZXQgPSBkZWZhdWx0Rm9ybWF0dGVyLmludGVycG9sYXRlKG1lc3NhZ2UsIHZhbHVlcywgcGF0aCk7XG4gIH1cblxuICAvLyBpZiBpbnRlcnBvbGF0ZU1vZGUgaXMgKipub3QqKiAnc3RyaW5nJyAoJ3JvdycpLFxuICAvLyByZXR1cm4gdGhlIGNvbXBpbGVkIGRhdGEgKGUuZy4gWydmb28nLCBWTm9kZSwgJ2JhciddKSB3aXRoIGZvcm1hdHRlclxuICByZXR1cm4gaW50ZXJwb2xhdGVNb2RlID09PSAnc3RyaW5nJyA/IHJldC5qb2luKCcnKSA6IHJldFxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX3RyYW5zbGF0ZSA9IGZ1bmN0aW9uIF90cmFuc2xhdGUgKFxuICBtZXNzYWdlcyxcbiAgbG9jYWxlLFxuICBmYWxsYmFjayxcbiAga2V5LFxuICBob3N0LFxuICBpbnRlcnBvbGF0ZU1vZGUsXG4gIGFyZ3Ncbikge1xuICB2YXIgcmVzID1cbiAgICB0aGlzLl9pbnRlcnBvbGF0ZShsb2NhbGUsIG1lc3NhZ2VzW2xvY2FsZV0sIGtleSwgaG9zdCwgaW50ZXJwb2xhdGVNb2RlLCBhcmdzLCBba2V5XSk7XG4gIGlmICghaXNOdWxsKHJlcykpIHsgcmV0dXJuIHJlcyB9XG5cbiAgcmVzID0gdGhpcy5faW50ZXJwb2xhdGUoZmFsbGJhY2ssIG1lc3NhZ2VzW2ZhbGxiYWNrXSwga2V5LCBob3N0LCBpbnRlcnBvbGF0ZU1vZGUsIGFyZ3MsIFtrZXldKTtcbiAgaWYgKCFpc051bGwocmVzKSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF0aGlzLl9pc1NpbGVudFRyYW5zbGF0aW9uV2FybihrZXkpICYmICF0aGlzLl9pc1NpbGVudEZhbGxiYWNrV2FybihrZXkpKSB7XG4gICAgICB3YXJuKChcIkZhbGwgYmFjayB0byB0cmFuc2xhdGUgdGhlIGtleXBhdGggJ1wiICsga2V5ICsgXCInIHdpdGggJ1wiICsgZmFsbGJhY2sgKyBcIicgbG9jYWxlLlwiKSk7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fdCA9IGZ1bmN0aW9uIF90IChrZXksIF9sb2NhbGUsIG1lc3NhZ2VzLCBob3N0KSB7XG4gICAgdmFyIHJlZjtcblxuICAgIHZhciB2YWx1ZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDQ7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSB2YWx1ZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyA0IF07XG4gIGlmICgha2V5KSB7IHJldHVybiAnJyB9XG5cbiAgdmFyIHBhcnNlZEFyZ3MgPSBwYXJzZUFyZ3MuYXBwbHkodm9pZCAwLCB2YWx1ZXMpO1xuICB2YXIgbG9jYWxlID0gcGFyc2VkQXJncy5sb2NhbGUgfHwgX2xvY2FsZTtcblxuICB2YXIgcmV0ID0gdGhpcy5fdHJhbnNsYXRlKFxuICAgIG1lc3NhZ2VzLCBsb2NhbGUsIHRoaXMuZmFsbGJhY2tMb2NhbGUsIGtleSxcbiAgICBob3N0LCAnc3RyaW5nJywgcGFyc2VkQXJncy5wYXJhbXNcbiAgKTtcbiAgaWYgKHRoaXMuX2lzRmFsbGJhY2tSb290KHJldCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGhpcy5faXNTaWxlbnRUcmFuc2xhdGlvbldhcm4oa2V5KSAmJiAhdGhpcy5faXNTaWxlbnRGYWxsYmFja1dhcm4oa2V5KSkge1xuICAgICAgd2FybigoXCJGYWxsIGJhY2sgdG8gdHJhbnNsYXRlIHRoZSBrZXlwYXRoICdcIiArIGtleSArIFwiJyB3aXRoIHJvb3QgbG9jYWxlLlwiKSk7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghdGhpcy5fcm9vdCkgeyB0aHJvdyBFcnJvcigndW5leHBlY3RlZCBlcnJvcicpIH1cbiAgICByZXR1cm4gKHJlZiA9IHRoaXMuX3Jvb3QpLiR0LmFwcGx5KHJlZiwgWyBrZXkgXS5jb25jYXQoIHZhbHVlcyApKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLl93YXJuRGVmYXVsdChsb2NhbGUsIGtleSwgcmV0LCBob3N0LCB2YWx1ZXMpXG4gIH1cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLnQgPSBmdW5jdGlvbiB0IChrZXkpIHtcbiAgICB2YXIgcmVmO1xuXG4gICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIHZhbHVlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcbiAgcmV0dXJuIChyZWYgPSB0aGlzKS5fdC5hcHBseShyZWYsIFsga2V5LCB0aGlzLmxvY2FsZSwgdGhpcy5fZ2V0TWVzc2FnZXMoKSwgbnVsbCBdLmNvbmNhdCggdmFsdWVzICkpXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5faSA9IGZ1bmN0aW9uIF9pIChrZXksIGxvY2FsZSwgbWVzc2FnZXMsIGhvc3QsIHZhbHVlcykge1xuICB2YXIgcmV0ID1cbiAgICB0aGlzLl90cmFuc2xhdGUobWVzc2FnZXMsIGxvY2FsZSwgdGhpcy5mYWxsYmFja0xvY2FsZSwga2V5LCBob3N0LCAncmF3JywgdmFsdWVzKTtcbiAgaWYgKHRoaXMuX2lzRmFsbGJhY2tSb290KHJldCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGhpcy5faXNTaWxlbnRUcmFuc2xhdGlvbldhcm4oa2V5KSkge1xuICAgICAgd2FybigoXCJGYWxsIGJhY2sgdG8gaW50ZXJwb2xhdGUgdGhlIGtleXBhdGggJ1wiICsga2V5ICsgXCInIHdpdGggcm9vdCBsb2NhbGUuXCIpKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgIHJldHVybiB0aGlzLl9yb290LiRpMThuLmkoa2V5LCBsb2NhbGUsIHZhbHVlcylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5fd2FybkRlZmF1bHQobG9jYWxlLCBrZXksIHJldCwgaG9zdCwgW3ZhbHVlc10pXG4gIH1cbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLmkgPSBmdW5jdGlvbiBpIChrZXksIGxvY2FsZSwgdmFsdWVzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIWtleSkgeyByZXR1cm4gJycgfVxuXG4gIGlmICh0eXBlb2YgbG9jYWxlICE9PSAnc3RyaW5nJykge1xuICAgIGxvY2FsZSA9IHRoaXMubG9jYWxlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2koa2V5LCBsb2NhbGUsIHRoaXMuX2dldE1lc3NhZ2VzKCksIG51bGwsIHZhbHVlcylcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLl90YyA9IGZ1bmN0aW9uIF90YyAoXG4gIGtleSxcbiAgX2xvY2FsZSxcbiAgbWVzc2FnZXMsXG4gIGhvc3QsXG4gIGNob2ljZVxuKSB7XG4gICAgdmFyIHJlZjtcblxuICAgIHZhciB2YWx1ZXMgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDU7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSB2YWx1ZXNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyA1IF07XG4gIGlmICgha2V5KSB7IHJldHVybiAnJyB9XG4gIGlmIChjaG9pY2UgPT09IHVuZGVmaW5lZCkge1xuICAgIGNob2ljZSA9IDE7XG4gIH1cblxuICB2YXIgcHJlZGVmaW5lZCA9IHsgJ2NvdW50JzogY2hvaWNlLCAnbic6IGNob2ljZSB9O1xuICB2YXIgcGFyc2VkQXJncyA9IHBhcnNlQXJncy5hcHBseSh2b2lkIDAsIHZhbHVlcyk7XG4gIHBhcnNlZEFyZ3MucGFyYW1zID0gT2JqZWN0LmFzc2lnbihwcmVkZWZpbmVkLCBwYXJzZWRBcmdzLnBhcmFtcyk7XG4gIHZhbHVlcyA9IHBhcnNlZEFyZ3MubG9jYWxlID09PSBudWxsID8gW3BhcnNlZEFyZ3MucGFyYW1zXSA6IFtwYXJzZWRBcmdzLmxvY2FsZSwgcGFyc2VkQXJncy5wYXJhbXNdO1xuICByZXR1cm4gdGhpcy5mZXRjaENob2ljZSgocmVmID0gdGhpcykuX3QuYXBwbHkocmVmLCBbIGtleSwgX2xvY2FsZSwgbWVzc2FnZXMsIGhvc3QgXS5jb25jYXQoIHZhbHVlcyApKSwgY2hvaWNlKVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuZmV0Y2hDaG9pY2UgPSBmdW5jdGlvbiBmZXRjaENob2ljZSAobWVzc2FnZSwgY2hvaWNlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIW1lc3NhZ2UgJiYgdHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7IHJldHVybiBudWxsIH1cbiAgdmFyIGNob2ljZXMgPSBtZXNzYWdlLnNwbGl0KCd8Jyk7XG5cbiAgY2hvaWNlID0gdGhpcy5nZXRDaG9pY2VJbmRleChjaG9pY2UsIGNob2ljZXMubGVuZ3RoKTtcbiAgaWYgKCFjaG9pY2VzW2Nob2ljZV0pIHsgcmV0dXJuIG1lc3NhZ2UgfVxuICByZXR1cm4gY2hvaWNlc1tjaG9pY2VdLnRyaW0oKVxufTtcblxuLyoqXG4gKiBAcGFyYW0gY2hvaWNlIHtudW1iZXJ9IGEgY2hvaWNlIGluZGV4IGdpdmVuIGJ5IHRoZSBpbnB1dCB0byAkdGM6IGAkdGMoJ3BhdGgudG8ucnVsZScsIGNob2ljZUluZGV4KWBcbiAqIEBwYXJhbSBjaG9pY2VzTGVuZ3RoIHtudW1iZXJ9IGFuIG92ZXJhbGwgYW1vdW50IG9mIGF2YWlsYWJsZSBjaG9pY2VzXG4gKiBAcmV0dXJucyBhIGZpbmFsIGNob2ljZSBpbmRleFxuKi9cblZ1ZUkxOG4ucHJvdG90eXBlLmdldENob2ljZUluZGV4ID0gZnVuY3Rpb24gZ2V0Q2hvaWNlSW5kZXggKGNob2ljZSwgY2hvaWNlc0xlbmd0aCkge1xuICAvLyBEZWZhdWx0IChvbGQpIGdldENob2ljZUluZGV4IGltcGxlbWVudGF0aW9uIC0gZW5nbGlzaC1jb21wYXRpYmxlXG4gIHZhciBkZWZhdWx0SW1wbCA9IGZ1bmN0aW9uIChfY2hvaWNlLCBfY2hvaWNlc0xlbmd0aCkge1xuICAgIF9jaG9pY2UgPSBNYXRoLmFicyhfY2hvaWNlKTtcblxuICAgIGlmIChfY2hvaWNlc0xlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIF9jaG9pY2VcbiAgICAgICAgPyBfY2hvaWNlID4gMVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMFxuICAgICAgICA6IDFcbiAgICB9XG5cbiAgICByZXR1cm4gX2Nob2ljZSA/IE1hdGgubWluKF9jaG9pY2UsIDIpIDogMFxuICB9O1xuXG4gIGlmICh0aGlzLmxvY2FsZSBpbiB0aGlzLnBsdXJhbGl6YXRpb25SdWxlcykge1xuICAgIHJldHVybiB0aGlzLnBsdXJhbGl6YXRpb25SdWxlc1t0aGlzLmxvY2FsZV0uYXBwbHkodGhpcywgW2Nob2ljZSwgY2hvaWNlc0xlbmd0aF0pXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlZmF1bHRJbXBsKGNob2ljZSwgY2hvaWNlc0xlbmd0aClcbiAgfVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUudGMgPSBmdW5jdGlvbiB0YyAoa2V5LCBjaG9pY2UpIHtcbiAgICB2YXIgcmVmO1xuXG4gICAgdmFyIHZhbHVlcyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIHZhbHVlc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDIgXTtcbiAgcmV0dXJuIChyZWYgPSB0aGlzKS5fdGMuYXBwbHkocmVmLCBbIGtleSwgdGhpcy5sb2NhbGUsIHRoaXMuX2dldE1lc3NhZ2VzKCksIG51bGwsIGNob2ljZSBdLmNvbmNhdCggdmFsdWVzICkpXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fdGUgPSBmdW5jdGlvbiBfdGUgKGtleSwgbG9jYWxlLCBtZXNzYWdlcykge1xuICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAzO1xuICAgIHdoaWxlICggbGVuLS0gPiAwICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDMgXTtcblxuICB2YXIgX2xvY2FsZSA9IHBhcnNlQXJncy5hcHBseSh2b2lkIDAsIGFyZ3MpLmxvY2FsZSB8fCBsb2NhbGU7XG4gIHJldHVybiB0aGlzLl9leGlzdChtZXNzYWdlc1tfbG9jYWxlXSwga2V5KVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUudGUgPSBmdW5jdGlvbiB0ZSAoa2V5LCBsb2NhbGUpIHtcbiAgcmV0dXJuIHRoaXMuX3RlKGtleSwgdGhpcy5sb2NhbGUsIHRoaXMuX2dldE1lc3NhZ2VzKCksIGxvY2FsZSlcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLmdldExvY2FsZU1lc3NhZ2UgPSBmdW5jdGlvbiBnZXRMb2NhbGVNZXNzYWdlIChsb2NhbGUpIHtcbiAgcmV0dXJuIGxvb3NlQ2xvbmUodGhpcy5fdm0ubWVzc2FnZXNbbG9jYWxlXSB8fCB7fSlcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLnNldExvY2FsZU1lc3NhZ2UgPSBmdW5jdGlvbiBzZXRMb2NhbGVNZXNzYWdlIChsb2NhbGUsIG1lc3NhZ2UpIHtcbiAgaWYgKHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID09PSAnd2FybicgfHwgdGhpcy5fd2Fybkh0bWxJbk1lc3NhZ2UgPT09ICdlcnJvcicpIHtcbiAgICB0aGlzLl9jaGVja0xvY2FsZU1lc3NhZ2UobG9jYWxlLCB0aGlzLl93YXJuSHRtbEluTWVzc2FnZSwgbWVzc2FnZSk7XG4gICAgaWYgKHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID09PSAnZXJyb3InKSB7IHJldHVybiB9XG4gIH1cbiAgdGhpcy5fdm0uJHNldCh0aGlzLl92bS5tZXNzYWdlcywgbG9jYWxlLCBtZXNzYWdlKTtcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLm1lcmdlTG9jYWxlTWVzc2FnZSA9IGZ1bmN0aW9uIG1lcmdlTG9jYWxlTWVzc2FnZSAobG9jYWxlLCBtZXNzYWdlKSB7XG4gIGlmICh0aGlzLl93YXJuSHRtbEluTWVzc2FnZSA9PT0gJ3dhcm4nIHx8IHRoaXMuX3dhcm5IdG1sSW5NZXNzYWdlID09PSAnZXJyb3InKSB7XG4gICAgdGhpcy5fY2hlY2tMb2NhbGVNZXNzYWdlKGxvY2FsZSwgdGhpcy5fd2Fybkh0bWxJbk1lc3NhZ2UsIG1lc3NhZ2UpO1xuICAgIGlmICh0aGlzLl93YXJuSHRtbEluTWVzc2FnZSA9PT0gJ2Vycm9yJykgeyByZXR1cm4gfVxuICB9XG4gIHRoaXMuX3ZtLiRzZXQodGhpcy5fdm0ubWVzc2FnZXMsIGxvY2FsZSwgbWVyZ2UodGhpcy5fdm0ubWVzc2FnZXNbbG9jYWxlXSB8fCB7fSwgbWVzc2FnZSkpO1xufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuZ2V0RGF0ZVRpbWVGb3JtYXQgPSBmdW5jdGlvbiBnZXREYXRlVGltZUZvcm1hdCAobG9jYWxlKSB7XG4gIHJldHVybiBsb29zZUNsb25lKHRoaXMuX3ZtLmRhdGVUaW1lRm9ybWF0c1tsb2NhbGVdIHx8IHt9KVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuc2V0RGF0ZVRpbWVGb3JtYXQgPSBmdW5jdGlvbiBzZXREYXRlVGltZUZvcm1hdCAobG9jYWxlLCBmb3JtYXQpIHtcbiAgdGhpcy5fdm0uJHNldCh0aGlzLl92bS5kYXRlVGltZUZvcm1hdHMsIGxvY2FsZSwgZm9ybWF0KTtcbn07XG5cblZ1ZUkxOG4ucHJvdG90eXBlLm1lcmdlRGF0ZVRpbWVGb3JtYXQgPSBmdW5jdGlvbiBtZXJnZURhdGVUaW1lRm9ybWF0IChsb2NhbGUsIGZvcm1hdCkge1xuICB0aGlzLl92bS4kc2V0KHRoaXMuX3ZtLmRhdGVUaW1lRm9ybWF0cywgbG9jYWxlLCBtZXJnZSh0aGlzLl92bS5kYXRlVGltZUZvcm1hdHNbbG9jYWxlXSB8fCB7fSwgZm9ybWF0KSk7XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fbG9jYWxpemVEYXRlVGltZSA9IGZ1bmN0aW9uIF9sb2NhbGl6ZURhdGVUaW1lIChcbiAgdmFsdWUsXG4gIGxvY2FsZSxcbiAgZmFsbGJhY2ssXG4gIGRhdGVUaW1lRm9ybWF0cyxcbiAga2V5XG4pIHtcbiAgdmFyIF9sb2NhbGUgPSBsb2NhbGU7XG4gIHZhciBmb3JtYXRzID0gZGF0ZVRpbWVGb3JtYXRzW19sb2NhbGVdO1xuXG4gIC8vIGZhbGxiYWNrIGxvY2FsZVxuICBpZiAoaXNOdWxsKGZvcm1hdHMpIHx8IGlzTnVsbChmb3JtYXRzW2tleV0pKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkgJiYgIXRoaXMuX2lzU2lsZW50RmFsbGJhY2tXYXJuKGtleSkpIHtcbiAgICAgIHdhcm4oKFwiRmFsbCBiYWNrIHRvICdcIiArIGZhbGxiYWNrICsgXCInIGRhdGV0aW1lIGZvcm1hdHMgZnJvbSAnXCIgKyBsb2NhbGUgKyBcIicgZGF0ZXRpbWUgZm9ybWF0cy5cIikpO1xuICAgIH1cbiAgICBfbG9jYWxlID0gZmFsbGJhY2s7XG4gICAgZm9ybWF0cyA9IGRhdGVUaW1lRm9ybWF0c1tfbG9jYWxlXTtcbiAgfVxuXG4gIGlmIChpc051bGwoZm9ybWF0cykgfHwgaXNOdWxsKGZvcm1hdHNba2V5XSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzW2tleV07XG4gICAgdmFyIGlkID0gX2xvY2FsZSArIFwiX19cIiArIGtleTtcbiAgICB2YXIgZm9ybWF0dGVyID0gdGhpcy5fZGF0ZVRpbWVGb3JtYXR0ZXJzW2lkXTtcbiAgICBpZiAoIWZvcm1hdHRlcikge1xuICAgICAgZm9ybWF0dGVyID0gdGhpcy5fZGF0ZVRpbWVGb3JtYXR0ZXJzW2lkXSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KF9sb2NhbGUsIGZvcm1hdCk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHZhbHVlKVxuICB9XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fZCA9IGZ1bmN0aW9uIF9kICh2YWx1ZSwgbG9jYWxlLCBrZXkpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFWdWVJMThuLmF2YWlsYWJpbGl0aWVzLmRhdGVUaW1lRm9ybWF0KSB7XG4gICAgd2FybignQ2Fubm90IGZvcm1hdCBhIERhdGUgdmFsdWUgZHVlIHRvIG5vdCBzdXBwb3J0ZWQgSW50bC5EYXRlVGltZUZvcm1hdC4nKTtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICgha2V5KSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSkuZm9ybWF0KHZhbHVlKVxuICB9XG5cbiAgdmFyIHJldCA9XG4gICAgdGhpcy5fbG9jYWxpemVEYXRlVGltZSh2YWx1ZSwgbG9jYWxlLCB0aGlzLmZhbGxiYWNrTG9jYWxlLCB0aGlzLl9nZXREYXRlVGltZUZvcm1hdHMoKSwga2V5KTtcbiAgaWYgKHRoaXMuX2lzRmFsbGJhY2tSb290KHJldCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGhpcy5faXNTaWxlbnRUcmFuc2xhdGlvbldhcm4oa2V5KSAmJiAhdGhpcy5faXNTaWxlbnRGYWxsYmFja1dhcm4oa2V5KSkge1xuICAgICAgd2FybigoXCJGYWxsIGJhY2sgdG8gZGF0ZXRpbWUgbG9jYWxpemF0aW9uIG9mIHJvb3Q6IGtleSAnXCIgKyBrZXkgKyBcIicuXCIpKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgIHJldHVybiB0aGlzLl9yb290LiRpMThuLmQodmFsdWUsIGtleSwgbG9jYWxlKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXQgfHwgJydcbiAgfVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuZCA9IGZ1bmN0aW9uIGQgKHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZTtcbiAgdmFyIGtleSA9IG51bGw7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAga2V5ID0gYXJnc1swXTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGFyZ3NbMF0pKSB7XG4gICAgICBpZiAoYXJnc1swXS5sb2NhbGUpIHtcbiAgICAgICAgbG9jYWxlID0gYXJnc1swXS5sb2NhbGU7XG4gICAgICB9XG4gICAgICBpZiAoYXJnc1swXS5rZXkpIHtcbiAgICAgICAga2V5ID0gYXJnc1swXS5rZXk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAga2V5ID0gYXJnc1swXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdID09PSAnc3RyaW5nJykge1xuICAgICAgbG9jYWxlID0gYXJnc1sxXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fZCh2YWx1ZSwgbG9jYWxlLCBrZXkpXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5nZXROdW1iZXJGb3JtYXQgPSBmdW5jdGlvbiBnZXROdW1iZXJGb3JtYXQgKGxvY2FsZSkge1xuICByZXR1cm4gbG9vc2VDbG9uZSh0aGlzLl92bS5udW1iZXJGb3JtYXRzW2xvY2FsZV0gfHwge30pXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5zZXROdW1iZXJGb3JtYXQgPSBmdW5jdGlvbiBzZXROdW1iZXJGb3JtYXQgKGxvY2FsZSwgZm9ybWF0KSB7XG4gIHRoaXMuX3ZtLiRzZXQodGhpcy5fdm0ubnVtYmVyRm9ybWF0cywgbG9jYWxlLCBmb3JtYXQpO1xufTtcblxuVnVlSTE4bi5wcm90b3R5cGUubWVyZ2VOdW1iZXJGb3JtYXQgPSBmdW5jdGlvbiBtZXJnZU51bWJlckZvcm1hdCAobG9jYWxlLCBmb3JtYXQpIHtcbiAgdGhpcy5fdm0uJHNldCh0aGlzLl92bS5udW1iZXJGb3JtYXRzLCBsb2NhbGUsIG1lcmdlKHRoaXMuX3ZtLm51bWJlckZvcm1hdHNbbG9jYWxlXSB8fCB7fSwgZm9ybWF0KSk7XG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fZ2V0TnVtYmVyRm9ybWF0dGVyID0gZnVuY3Rpb24gX2dldE51bWJlckZvcm1hdHRlciAoXG4gIHZhbHVlLFxuICBsb2NhbGUsXG4gIGZhbGxiYWNrLFxuICBudW1iZXJGb3JtYXRzLFxuICBrZXksXG4gIG9wdGlvbnNcbikge1xuICB2YXIgX2xvY2FsZSA9IGxvY2FsZTtcbiAgdmFyIGZvcm1hdHMgPSBudW1iZXJGb3JtYXRzW19sb2NhbGVdO1xuXG4gIC8vIGZhbGxiYWNrIGxvY2FsZVxuICBpZiAoaXNOdWxsKGZvcm1hdHMpIHx8IGlzTnVsbChmb3JtYXRzW2tleV0pKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkgJiYgIXRoaXMuX2lzU2lsZW50RmFsbGJhY2tXYXJuKGtleSkpIHtcbiAgICAgIHdhcm4oKFwiRmFsbCBiYWNrIHRvICdcIiArIGZhbGxiYWNrICsgXCInIG51bWJlciBmb3JtYXRzIGZyb20gJ1wiICsgbG9jYWxlICsgXCInIG51bWJlciBmb3JtYXRzLlwiKSk7XG4gICAgfVxuICAgIF9sb2NhbGUgPSBmYWxsYmFjaztcbiAgICBmb3JtYXRzID0gbnVtYmVyRm9ybWF0c1tfbG9jYWxlXTtcbiAgfVxuXG4gIGlmIChpc051bGwoZm9ybWF0cykgfHwgaXNOdWxsKGZvcm1hdHNba2V5XSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzW2tleV07XG5cbiAgICB2YXIgZm9ybWF0dGVyO1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAvLyBJZiBvcHRpb25zIHNwZWNpZmllZCAtIGNyZWF0ZSBvbmUgdGltZSBudW1iZXIgZm9ybWF0dGVyXG4gICAgICBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQoX2xvY2FsZSwgT2JqZWN0LmFzc2lnbih7fSwgZm9ybWF0LCBvcHRpb25zKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpZCA9IF9sb2NhbGUgKyBcIl9fXCIgKyBrZXk7XG4gICAgICBmb3JtYXR0ZXIgPSB0aGlzLl9udW1iZXJGb3JtYXR0ZXJzW2lkXTtcbiAgICAgIGlmICghZm9ybWF0dGVyKSB7XG4gICAgICAgIGZvcm1hdHRlciA9IHRoaXMuX251bWJlckZvcm1hdHRlcnNbaWRdID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KF9sb2NhbGUsIGZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZXJcbiAgfVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUuX24gPSBmdW5jdGlvbiBfbiAodmFsdWUsIGxvY2FsZSwga2V5LCBvcHRpb25zKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIVZ1ZUkxOG4uYXZhaWxhYmlsaXRpZXMubnVtYmVyRm9ybWF0KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oJ0Nhbm5vdCBmb3JtYXQgYSBOdW1iZXIgdmFsdWUgZHVlIHRvIG5vdCBzdXBwb3J0ZWQgSW50bC5OdW1iZXJGb3JtYXQuJyk7XG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFrZXkpIHtcbiAgICB2YXIgbmYgPSAhb3B0aW9ucyA/IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUpIDogbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG5mLmZvcm1hdCh2YWx1ZSlcbiAgfVxuXG4gIHZhciBmb3JtYXR0ZXIgPSB0aGlzLl9nZXROdW1iZXJGb3JtYXR0ZXIodmFsdWUsIGxvY2FsZSwgdGhpcy5mYWxsYmFja0xvY2FsZSwgdGhpcy5fZ2V0TnVtYmVyRm9ybWF0cygpLCBrZXksIG9wdGlvbnMpO1xuICB2YXIgcmV0ID0gZm9ybWF0dGVyICYmIGZvcm1hdHRlci5mb3JtYXQodmFsdWUpO1xuICBpZiAodGhpcy5faXNGYWxsYmFja1Jvb3QocmV0KSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF0aGlzLl9pc1NpbGVudFRyYW5zbGF0aW9uV2FybihrZXkpICYmICF0aGlzLl9pc1NpbGVudEZhbGxiYWNrV2FybihrZXkpKSB7XG4gICAgICB3YXJuKChcIkZhbGwgYmFjayB0byBudW1iZXIgbG9jYWxpemF0aW9uIG9mIHJvb3Q6IGtleSAnXCIgKyBrZXkgKyBcIicuXCIpKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgIHJldHVybiB0aGlzLl9yb290LiRpMThuLm4odmFsdWUsIE9iamVjdC5hc3NpZ24oe30sIHsga2V5OiBrZXksIGxvY2FsZTogbG9jYWxlIH0sIG9wdGlvbnMpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXQgfHwgJydcbiAgfVxufTtcblxuVnVlSTE4bi5wcm90b3R5cGUubiA9IGZ1bmN0aW9uIG4gKHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZTtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciBvcHRpb25zID0gbnVsbDtcblxuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBrZXkgPSBhcmdzWzBdO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoYXJnc1swXSkpIHtcbiAgICAgIGlmIChhcmdzWzBdLmxvY2FsZSkge1xuICAgICAgICBsb2NhbGUgPSBhcmdzWzBdLmxvY2FsZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzWzBdLmtleSkge1xuICAgICAgICBrZXkgPSBhcmdzWzBdLmtleTtcbiAgICAgIH1cblxuICAgICAgLy8gRmlsdGVyIG91dCBudW1iZXIgZm9ybWF0IG9wdGlvbnMgb25seVxuICAgICAgb3B0aW9ucyA9IE9iamVjdC5rZXlzKGFyZ3NbMF0pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgICB2YXIgb2JqO1xuXG4gICAgICAgIGlmIChudW1iZXJGb3JtYXRLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYWNjLCAoIG9iaiA9IHt9LCBvYmpba2V5XSA9IGFyZ3NbMF1ba2V5XSwgb2JqICkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfSwgbnVsbCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAga2V5ID0gYXJnc1swXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdID09PSAnc3RyaW5nJykge1xuICAgICAgbG9jYWxlID0gYXJnc1sxXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fbih2YWx1ZSwgbG9jYWxlLCBrZXksIG9wdGlvbnMpXG59O1xuXG5WdWVJMThuLnByb3RvdHlwZS5fbnRwID0gZnVuY3Rpb24gX250cCAodmFsdWUsIGxvY2FsZSwga2V5LCBvcHRpb25zKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIVZ1ZUkxOG4uYXZhaWxhYmlsaXRpZXMubnVtYmVyRm9ybWF0KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oJ0Nhbm5vdCBmb3JtYXQgdG8gcGFydHMgYSBOdW1iZXIgdmFsdWUgZHVlIHRvIG5vdCBzdXBwb3J0ZWQgSW50bC5OdW1iZXJGb3JtYXQuJyk7XG4gICAgfVxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgaWYgKCFrZXkpIHtcbiAgICB2YXIgbmYgPSAhb3B0aW9ucyA/IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUpIDogbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG5mLmZvcm1hdFRvUGFydHModmFsdWUpXG4gIH1cblxuICB2YXIgZm9ybWF0dGVyID0gdGhpcy5fZ2V0TnVtYmVyRm9ybWF0dGVyKHZhbHVlLCBsb2NhbGUsIHRoaXMuZmFsbGJhY2tMb2NhbGUsIHRoaXMuX2dldE51bWJlckZvcm1hdHMoKSwga2V5LCBvcHRpb25zKTtcbiAgdmFyIHJldCA9IGZvcm1hdHRlciAmJiBmb3JtYXR0ZXIuZm9ybWF0VG9QYXJ0cyh2YWx1ZSk7XG4gIGlmICh0aGlzLl9pc0ZhbGxiYWNrUm9vdChyZXQpKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXRoaXMuX2lzU2lsZW50VHJhbnNsYXRpb25XYXJuKGtleSkpIHtcbiAgICAgIHdhcm4oKFwiRmFsbCBiYWNrIHRvIGZvcm1hdCBudW1iZXIgdG8gcGFydHMgb2Ygcm9vdDoga2V5ICdcIiArIGtleSArIFwiJyAuXCIpKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCF0aGlzLl9yb290KSB7IHRocm93IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yJykgfVxuICAgIHJldHVybiB0aGlzLl9yb290LiRpMThuLl9udHAodmFsdWUsIGxvY2FsZSwga2V5LCBvcHRpb25zKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXQgfHwgW11cbiAgfVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZ1ZUkxOG4ucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxudmFyIGF2YWlsYWJpbGl0aWVzO1xuLy8gJEZsb3dGaXhNZVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZUkxOG4sICdhdmFpbGFiaWxpdGllcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgIGlmICghYXZhaWxhYmlsaXRpZXMpIHtcbiAgICAgIHZhciBpbnRsRGVmaW5lZCA9IHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJztcbiAgICAgIGF2YWlsYWJpbGl0aWVzID0ge1xuICAgICAgICBkYXRlVGltZUZvcm1hdDogaW50bERlZmluZWQgJiYgdHlwZW9mIEludGwuRGF0ZVRpbWVGb3JtYXQgIT09ICd1bmRlZmluZWQnLFxuICAgICAgICBudW1iZXJGb3JtYXQ6IGludGxEZWZpbmVkICYmIHR5cGVvZiBJbnRsLk51bWJlckZvcm1hdCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGF2YWlsYWJpbGl0aWVzXG4gIH1cbn0pO1xuXG5WdWVJMThuLmluc3RhbGwgPSBpbnN0YWxsO1xuVnVlSTE4bi52ZXJzaW9uID0gJzguMTUuMCc7XG5cbmV4cG9ydCBkZWZhdWx0IFZ1ZUkxOG47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-i18n@8.15.0@vue-i18n/dist/vue-i18n.esm.js\n");

/***/ }),

/***/ "./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js":
/*!***************************************************************************************!*\
  !*** ./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js ***!
  \***************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return normalizeComponent; });\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n  scriptExports,\n  render,\n  staticRenderFns,\n  functionalTemplate,\n  injectStyles,\n  scopeId,\n  moduleIdentifier, /* server only */\n  shadowMode /* vue-cli only */\n) {\n  // Vue.extend constructor export interop\n  var options = typeof scriptExports === 'function'\n    ? scriptExports.options\n    : scriptExports\n\n  // render functions\n  if (render) {\n    options.render = render\n    options.staticRenderFns = staticRenderFns\n    options._compiled = true\n  }\n\n  // functional template\n  if (functionalTemplate) {\n    options.functional = true\n  }\n\n  // scopedId\n  if (scopeId) {\n    options._scopeId = 'data-v-' + scopeId\n  }\n\n  var hook\n  if (moduleIdentifier) { // server build\n    hook = function (context) {\n      // 2.3 injection\n      context =\n        context || // cached call\n        (this.$vnode && this.$vnode.ssrContext) || // stateful\n        (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n      // 2.2 with runInNewContext: true\n      if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n        context = __VUE_SSR_CONTEXT__\n      }\n      // inject component styles\n      if (injectStyles) {\n        injectStyles.call(this, context)\n      }\n      // register component module identifier for async chunk inferrence\n      if (context && context._registeredComponents) {\n        context._registeredComponents.add(moduleIdentifier)\n      }\n    }\n    // used by ssr in case component is cached and beforeCreate\n    // never gets called\n    options._ssrRegister = hook\n  } else if (injectStyles) {\n    hook = shadowMode\n      ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }\n      : injectStyles\n  }\n\n  if (hook) {\n    if (options.functional) {\n      // for template-only hot-reload because in that case the render fn doesn't\n      // go through the normalizer\n      options._injectStyles = hook\n      // register for functioal component in vue file\n      var originalRender = options.render\n      options.render = function renderWithStyleInjection (h, context) {\n        hook.call(context)\n        return originalRender(h, context)\n      }\n    } else {\n      // inject component registration as beforeCreate hook\n      var existing = options.beforeCreate\n      options.beforeCreate = existing\n        ? [].concat(existing, hook)\n        : [hook]\n    }\n  }\n\n  return {\n    exports: scriptExports,\n    options: options\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzPzY2OTEiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFscyBfX1ZVRV9TU1JfQ09OVEVYVF9fICovXG5cbi8vIElNUE9SVEFOVDogRG8gTk9UIHVzZSBFUzIwMTUgZmVhdHVyZXMgaW4gdGhpcyBmaWxlIChleGNlcHQgZm9yIG1vZHVsZXMpLlxuLy8gVGhpcyBtb2R1bGUgaXMgYSBydW50aW1lIHV0aWxpdHkgZm9yIGNsZWFuZXIgY29tcG9uZW50IG1vZHVsZSBvdXRwdXQgYW5kIHdpbGxcbi8vIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCB3ZWJwYWNrIHVzZXIgYnVuZGxlLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnQgKFxuICBzY3JpcHRFeHBvcnRzLFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZnVuY3Rpb25hbFRlbXBsYXRlLFxuICBpbmplY3RTdHlsZXMsXG4gIHNjb3BlSWQsXG4gIG1vZHVsZUlkZW50aWZpZXIsIC8qIHNlcnZlciBvbmx5ICovXG4gIHNoYWRvd01vZGUgLyogdnVlLWNsaSBvbmx5ICovXG4pIHtcbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyByZW5kZXIgZnVuY3Rpb25zXG4gIGlmIChyZW5kZXIpIHtcbiAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlclxuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gc3RhdGljUmVuZGVyRm5zXG4gICAgb3B0aW9ucy5fY29tcGlsZWQgPSB0cnVlXG4gIH1cblxuICAvLyBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChmdW5jdGlvbmFsVGVtcGxhdGUpIHtcbiAgICBvcHRpb25zLmZ1bmN0aW9uYWwgPSB0cnVlXG4gIH1cblxuICAvLyBzY29wZWRJZFxuICBpZiAoc2NvcGVJZCkge1xuICAgIG9wdGlvbnMuX3Njb3BlSWQgPSAnZGF0YS12LScgKyBzY29wZUlkXG4gIH1cblxuICB2YXIgaG9va1xuICBpZiAobW9kdWxlSWRlbnRpZmllcikgeyAvLyBzZXJ2ZXIgYnVpbGRcbiAgICBob29rID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIC8vIDIuMyBpbmplY3Rpb25cbiAgICAgIGNvbnRleHQgPVxuICAgICAgICBjb250ZXh0IHx8IC8vIGNhY2hlZCBjYWxsXG4gICAgICAgICh0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0KSB8fCAvLyBzdGF0ZWZ1bFxuICAgICAgICAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuJHZub2RlICYmIHRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0KSAvLyBmdW5jdGlvbmFsXG4gICAgICAvLyAyLjIgd2l0aCBydW5Jbk5ld0NvbnRleHQ6IHRydWVcbiAgICAgIGlmICghY29udGV4dCAmJiB0eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfXyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGV4dCA9IF9fVlVFX1NTUl9DT05URVhUX19cbiAgICAgIH1cbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgc3R5bGVzXG4gICAgICBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgICAgIGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIGNvbnRleHQpXG4gICAgICB9XG4gICAgICAvLyByZWdpc3RlciBjb21wb25lbnQgbW9kdWxlIGlkZW50aWZpZXIgZm9yIGFzeW5jIGNodW5rIGluZmVycmVuY2VcbiAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzKSB7XG4gICAgICAgIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzLmFkZChtb2R1bGVJZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB1c2VkIGJ5IHNzciBpbiBjYXNlIGNvbXBvbmVudCBpcyBjYWNoZWQgYW5kIGJlZm9yZUNyZWF0ZVxuICAgIC8vIG5ldmVyIGdldHMgY2FsbGVkXG4gICAgb3B0aW9ucy5fc3NyUmVnaXN0ZXIgPSBob29rXG4gIH0gZWxzZSBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgaG9vayA9IHNoYWRvd01vZGVcbiAgICAgID8gZnVuY3Rpb24gKCkgeyBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCB0aGlzLiRyb290LiRvcHRpb25zLnNoYWRvd1Jvb3QpIH1cbiAgICAgIDogaW5qZWN0U3R5bGVzXG4gIH1cblxuICBpZiAoaG9vaykge1xuICAgIGlmIChvcHRpb25zLmZ1bmN0aW9uYWwpIHtcbiAgICAgIC8vIGZvciB0ZW1wbGF0ZS1vbmx5IGhvdC1yZWxvYWQgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIHJlbmRlciBmbiBkb2Vzbid0XG4gICAgICAvLyBnbyB0aHJvdWdoIHRoZSBub3JtYWxpemVyXG4gICAgICBvcHRpb25zLl9pbmplY3RTdHlsZXMgPSBob29rXG4gICAgICAvLyByZWdpc3RlciBmb3IgZnVuY3Rpb2FsIGNvbXBvbmVudCBpbiB2dWUgZmlsZVxuICAgICAgdmFyIG9yaWdpbmFsUmVuZGVyID0gb3B0aW9ucy5yZW5kZXJcbiAgICAgIG9wdGlvbnMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyV2l0aFN0eWxlSW5qZWN0aW9uIChoLCBjb250ZXh0KSB7XG4gICAgICAgIGhvb2suY2FsbChjb250ZXh0KVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW5kZXIoaCwgY29udGV4dClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCByZWdpc3RyYXRpb24gYXMgYmVmb3JlQ3JlYXRlIGhvb2tcbiAgICAgIHZhciBleGlzdGluZyA9IG9wdGlvbnMuYmVmb3JlQ3JlYXRlXG4gICAgICBvcHRpb25zLmJlZm9yZUNyZWF0ZSA9IGV4aXN0aW5nXG4gICAgICAgID8gW10uY29uY2F0KGV4aXN0aW5nLCBob29rKVxuICAgICAgICA6IFtob29rXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXhwb3J0czogc2NyaXB0RXhwb3J0cyxcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\n");

/***/ }),

/***/ "./node_modules/_vue-router@3.1.3@vue-router/dist/vue-router.esm.js":
/*!**************************************************************************!*\
  !*** ./node_modules/_vue-router@3.1.3@vue-router/dist/vue-router.esm.js ***!
  \**************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/*!\n  * vue-router v3.1.3\n  * (c) 2019 Evan You\n  * @license MIT\n  */\n/*  */\n\nfunction assert (condition, message) {\n  if (!condition) {\n    throw new Error((\"[vue-router] \" + message))\n  }\n}\n\nfunction warn (condition, message) {\n  if ( true && !condition) {\n    typeof console !== 'undefined' && console.warn((\"[vue-router] \" + message));\n  }\n}\n\nfunction isError (err) {\n  return Object.prototype.toString.call(err).indexOf('Error') > -1\n}\n\nfunction isExtendedError (constructor, err) {\n  return (\n    err instanceof constructor ||\n    // _name is to support IE9 too\n    (err && (err.name === constructor.name || err._name === constructor._name))\n  )\n}\n\nfunction extend (a, b) {\n  for (var key in b) {\n    a[key] = b[key];\n  }\n  return a\n}\n\nvar View = {\n  name: 'RouterView',\n  functional: true,\n  props: {\n    name: {\n      type: String,\n      default: 'default'\n    }\n  },\n  render: function render (_, ref) {\n    var props = ref.props;\n    var children = ref.children;\n    var parent = ref.parent;\n    var data = ref.data;\n\n    // used by devtools to display a router-view badge\n    data.routerView = true;\n\n    // directly use parent context's createElement() function\n    // so that components rendered by router-view can resolve named slots\n    var h = parent.$createElement;\n    var name = props.name;\n    var route = parent.$route;\n    var cache = parent._routerViewCache || (parent._routerViewCache = {});\n\n    // determine current view depth, also check to see if the tree\n    // has been toggled inactive but kept-alive.\n    var depth = 0;\n    var inactive = false;\n    while (parent && parent._routerRoot !== parent) {\n      var vnodeData = parent.$vnode && parent.$vnode.data;\n      if (vnodeData) {\n        if (vnodeData.routerView) {\n          depth++;\n        }\n        if (vnodeData.keepAlive && parent._inactive) {\n          inactive = true;\n        }\n      }\n      parent = parent.$parent;\n    }\n    data.routerViewDepth = depth;\n\n    // render previous view if the tree is inactive and kept-alive\n    if (inactive) {\n      return h(cache[name], data, children)\n    }\n\n    var matched = route.matched[depth];\n    // render empty node if no matched route\n    if (!matched) {\n      cache[name] = null;\n      return h()\n    }\n\n    var component = cache[name] = matched.components[name];\n\n    // attach instance registration hook\n    // this will be called in the instance's injected lifecycle hooks\n    data.registerRouteInstance = function (vm, val) {\n      // val could be undefined for unregistration\n      var current = matched.instances[name];\n      if (\n        (val && current !== vm) ||\n        (!val && current === vm)\n      ) {\n        matched.instances[name] = val;\n      }\n    }\n\n    // also register instance in prepatch hook\n    // in case the same component instance is reused across different routes\n    ;(data.hook || (data.hook = {})).prepatch = function (_, vnode) {\n      matched.instances[name] = vnode.componentInstance;\n    };\n\n    // register instance in init hook\n    // in case kept-alive component be actived when routes changed\n    data.hook.init = function (vnode) {\n      if (vnode.data.keepAlive &&\n        vnode.componentInstance &&\n        vnode.componentInstance !== matched.instances[name]\n      ) {\n        matched.instances[name] = vnode.componentInstance;\n      }\n    };\n\n    // resolve props\n    var propsToPass = data.props = resolveProps(route, matched.props && matched.props[name]);\n    if (propsToPass) {\n      // clone to prevent mutation\n      propsToPass = data.props = extend({}, propsToPass);\n      // pass non-declared props as attrs\n      var attrs = data.attrs = data.attrs || {};\n      for (var key in propsToPass) {\n        if (!component.props || !(key in component.props)) {\n          attrs[key] = propsToPass[key];\n          delete propsToPass[key];\n        }\n      }\n    }\n\n    return h(component, data, children)\n  }\n};\n\nfunction resolveProps (route, config) {\n  switch (typeof config) {\n    case 'undefined':\n      return\n    case 'object':\n      return config\n    case 'function':\n      return config(route)\n    case 'boolean':\n      return config ? route.params : undefined\n    default:\n      if (true) {\n        warn(\n          false,\n          \"props in \\\"\" + (route.path) + \"\\\" is a \" + (typeof config) + \", \" +\n          \"expecting an object, function or boolean.\"\n        );\n      }\n  }\n}\n\n/*  */\n\nvar encodeReserveRE = /[!'()*]/g;\nvar encodeReserveReplacer = function (c) { return '%' + c.charCodeAt(0).toString(16); };\nvar commaRE = /%2C/g;\n\n// fixed encodeURIComponent which is more conformant to RFC3986:\n// - escapes [!'()*]\n// - preserve commas\nvar encode = function (str) { return encodeURIComponent(str)\n  .replace(encodeReserveRE, encodeReserveReplacer)\n  .replace(commaRE, ','); };\n\nvar decode = decodeURIComponent;\n\nfunction resolveQuery (\n  query,\n  extraQuery,\n  _parseQuery\n) {\n  if ( extraQuery === void 0 ) extraQuery = {};\n\n  var parse = _parseQuery || parseQuery;\n  var parsedQuery;\n  try {\n    parsedQuery = parse(query || '');\n  } catch (e) {\n     true && warn(false, e.message);\n    parsedQuery = {};\n  }\n  for (var key in extraQuery) {\n    parsedQuery[key] = extraQuery[key];\n  }\n  return parsedQuery\n}\n\nfunction parseQuery (query) {\n  var res = {};\n\n  query = query.trim().replace(/^(\\?|#|&)/, '');\n\n  if (!query) {\n    return res\n  }\n\n  query.split('&').forEach(function (param) {\n    var parts = param.replace(/\\+/g, ' ').split('=');\n    var key = decode(parts.shift());\n    var val = parts.length > 0\n      ? decode(parts.join('='))\n      : null;\n\n    if (res[key] === undefined) {\n      res[key] = val;\n    } else if (Array.isArray(res[key])) {\n      res[key].push(val);\n    } else {\n      res[key] = [res[key], val];\n    }\n  });\n\n  return res\n}\n\nfunction stringifyQuery (obj) {\n  var res = obj ? Object.keys(obj).map(function (key) {\n    var val = obj[key];\n\n    if (val === undefined) {\n      return ''\n    }\n\n    if (val === null) {\n      return encode(key)\n    }\n\n    if (Array.isArray(val)) {\n      var result = [];\n      val.forEach(function (val2) {\n        if (val2 === undefined) {\n          return\n        }\n        if (val2 === null) {\n          result.push(encode(key));\n        } else {\n          result.push(encode(key) + '=' + encode(val2));\n        }\n      });\n      return result.join('&')\n    }\n\n    return encode(key) + '=' + encode(val)\n  }).filter(function (x) { return x.length > 0; }).join('&') : null;\n  return res ? (\"?\" + res) : ''\n}\n\n/*  */\n\nvar trailingSlashRE = /\\/?$/;\n\nfunction createRoute (\n  record,\n  location,\n  redirectedFrom,\n  router\n) {\n  var stringifyQuery = router && router.options.stringifyQuery;\n\n  var query = location.query || {};\n  try {\n    query = clone(query);\n  } catch (e) {}\n\n  var route = {\n    name: location.name || (record && record.name),\n    meta: (record && record.meta) || {},\n    path: location.path || '/',\n    hash: location.hash || '',\n    query: query,\n    params: location.params || {},\n    fullPath: getFullPath(location, stringifyQuery),\n    matched: record ? formatMatch(record) : []\n  };\n  if (redirectedFrom) {\n    route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery);\n  }\n  return Object.freeze(route)\n}\n\nfunction clone (value) {\n  if (Array.isArray(value)) {\n    return value.map(clone)\n  } else if (value && typeof value === 'object') {\n    var res = {};\n    for (var key in value) {\n      res[key] = clone(value[key]);\n    }\n    return res\n  } else {\n    return value\n  }\n}\n\n// the starting route that represents the initial state\nvar START = createRoute(null, {\n  path: '/'\n});\n\nfunction formatMatch (record) {\n  var res = [];\n  while (record) {\n    res.unshift(record);\n    record = record.parent;\n  }\n  return res\n}\n\nfunction getFullPath (\n  ref,\n  _stringifyQuery\n) {\n  var path = ref.path;\n  var query = ref.query; if ( query === void 0 ) query = {};\n  var hash = ref.hash; if ( hash === void 0 ) hash = '';\n\n  var stringify = _stringifyQuery || stringifyQuery;\n  return (path || '/') + stringify(query) + hash\n}\n\nfunction isSameRoute (a, b) {\n  if (b === START) {\n    return a === b\n  } else if (!b) {\n    return false\n  } else if (a.path && b.path) {\n    return (\n      a.path.replace(trailingSlashRE, '') === b.path.replace(trailingSlashRE, '') &&\n      a.hash === b.hash &&\n      isObjectEqual(a.query, b.query)\n    )\n  } else if (a.name && b.name) {\n    return (\n      a.name === b.name &&\n      a.hash === b.hash &&\n      isObjectEqual(a.query, b.query) &&\n      isObjectEqual(a.params, b.params)\n    )\n  } else {\n    return false\n  }\n}\n\nfunction isObjectEqual (a, b) {\n  if ( a === void 0 ) a = {};\n  if ( b === void 0 ) b = {};\n\n  // handle null value #1566\n  if (!a || !b) { return a === b }\n  var aKeys = Object.keys(a);\n  var bKeys = Object.keys(b);\n  if (aKeys.length !== bKeys.length) {\n    return false\n  }\n  return aKeys.every(function (key) {\n    var aVal = a[key];\n    var bVal = b[key];\n    // check nested equality\n    if (typeof aVal === 'object' && typeof bVal === 'object') {\n      return isObjectEqual(aVal, bVal)\n    }\n    return String(aVal) === String(bVal)\n  })\n}\n\nfunction isIncludedRoute (current, target) {\n  return (\n    current.path.replace(trailingSlashRE, '/').indexOf(\n      target.path.replace(trailingSlashRE, '/')\n    ) === 0 &&\n    (!target.hash || current.hash === target.hash) &&\n    queryIncludes(current.query, target.query)\n  )\n}\n\nfunction queryIncludes (current, target) {\n  for (var key in target) {\n    if (!(key in current)) {\n      return false\n    }\n  }\n  return true\n}\n\n/*  */\n\nfunction resolvePath (\n  relative,\n  base,\n  append\n) {\n  var firstChar = relative.charAt(0);\n  if (firstChar === '/') {\n    return relative\n  }\n\n  if (firstChar === '?' || firstChar === '#') {\n    return base + relative\n  }\n\n  var stack = base.split('/');\n\n  // remove trailing segment if:\n  // - not appending\n  // - appending to trailing slash (last segment is empty)\n  if (!append || !stack[stack.length - 1]) {\n    stack.pop();\n  }\n\n  // resolve relative path\n  var segments = relative.replace(/^\\//, '').split('/');\n  for (var i = 0; i < segments.length; i++) {\n    var segment = segments[i];\n    if (segment === '..') {\n      stack.pop();\n    } else if (segment !== '.') {\n      stack.push(segment);\n    }\n  }\n\n  // ensure leading slash\n  if (stack[0] !== '') {\n    stack.unshift('');\n  }\n\n  return stack.join('/')\n}\n\nfunction parsePath (path) {\n  var hash = '';\n  var query = '';\n\n  var hashIndex = path.indexOf('#');\n  if (hashIndex >= 0) {\n    hash = path.slice(hashIndex);\n    path = path.slice(0, hashIndex);\n  }\n\n  var queryIndex = path.indexOf('?');\n  if (queryIndex >= 0) {\n    query = path.slice(queryIndex + 1);\n    path = path.slice(0, queryIndex);\n  }\n\n  return {\n    path: path,\n    query: query,\n    hash: hash\n  }\n}\n\nfunction cleanPath (path) {\n  return path.replace(/\\/\\//g, '/')\n}\n\nvar isarray = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n/**\n * Expose `pathToRegexp`.\n */\nvar pathToRegexp_1 = pathToRegexp;\nvar parse_1 = parse;\nvar compile_1 = compile;\nvar tokensToFunction_1 = tokensToFunction;\nvar tokensToRegExp_1 = tokensToRegExp;\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n  // Match escaped characters that would otherwise appear in future matches.\n  // This allows the user to escape special characters that won't transform.\n  '(\\\\\\\\.)',\n  // Match Express-style parameters and un-named parameters with a prefix\n  // and optional suffixes. Matches appear as:\n  //\n  // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n  // \"/route(\\\\d+)\"  => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n  // \"/*\"            => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n  '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g');\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param  {string}  str\n * @param  {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n  var tokens = [];\n  var key = 0;\n  var index = 0;\n  var path = '';\n  var defaultDelimiter = options && options.delimiter || '/';\n  var res;\n\n  while ((res = PATH_REGEXP.exec(str)) != null) {\n    var m = res[0];\n    var escaped = res[1];\n    var offset = res.index;\n    path += str.slice(index, offset);\n    index = offset + m.length;\n\n    // Ignore already escaped sequences.\n    if (escaped) {\n      path += escaped[1];\n      continue\n    }\n\n    var next = str[index];\n    var prefix = res[2];\n    var name = res[3];\n    var capture = res[4];\n    var group = res[5];\n    var modifier = res[6];\n    var asterisk = res[7];\n\n    // Push the current path onto the tokens.\n    if (path) {\n      tokens.push(path);\n      path = '';\n    }\n\n    var partial = prefix != null && next != null && next !== prefix;\n    var repeat = modifier === '+' || modifier === '*';\n    var optional = modifier === '?' || modifier === '*';\n    var delimiter = res[2] || defaultDelimiter;\n    var pattern = capture || group;\n\n    tokens.push({\n      name: name || key++,\n      prefix: prefix || '',\n      delimiter: delimiter,\n      optional: optional,\n      repeat: repeat,\n      partial: partial,\n      asterisk: !!asterisk,\n      pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n    });\n  }\n\n  // Match any characters still remaining.\n  if (index < str.length) {\n    path += str.substr(index);\n  }\n\n  // If the path exists, push it onto the end.\n  if (path) {\n    tokens.push(path);\n  }\n\n  return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param  {string}             str\n * @param  {Object=}            options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n  return tokensToFunction(parse(str, options))\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n  return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n  return encodeURI(str).replace(/[?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n  // Compile all the tokens into regexps.\n  var matches = new Array(tokens.length);\n\n  // Compile all the patterns before compilation.\n  for (var i = 0; i < tokens.length; i++) {\n    if (typeof tokens[i] === 'object') {\n      matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$');\n    }\n  }\n\n  return function (obj, opts) {\n    var path = '';\n    var data = obj || {};\n    var options = opts || {};\n    var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;\n\n    for (var i = 0; i < tokens.length; i++) {\n      var token = tokens[i];\n\n      if (typeof token === 'string') {\n        path += token;\n\n        continue\n      }\n\n      var value = data[token.name];\n      var segment;\n\n      if (value == null) {\n        if (token.optional) {\n          // Prepend partial segment prefixes.\n          if (token.partial) {\n            path += token.prefix;\n          }\n\n          continue\n        } else {\n          throw new TypeError('Expected \"' + token.name + '\" to be defined')\n        }\n      }\n\n      if (isarray(value)) {\n        if (!token.repeat) {\n          throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n        }\n\n        if (value.length === 0) {\n          if (token.optional) {\n            continue\n          } else {\n            throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n          }\n        }\n\n        for (var j = 0; j < value.length; j++) {\n          segment = encode(value[j]);\n\n          if (!matches[i].test(segment)) {\n            throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n          }\n\n          path += (j === 0 ? token.prefix : token.delimiter) + segment;\n        }\n\n        continue\n      }\n\n      segment = token.asterisk ? encodeAsterisk(value) : encode(value);\n\n      if (!matches[i].test(segment)) {\n        throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n      }\n\n      path += token.prefix + segment;\n    }\n\n    return path\n  }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param  {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n  return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param  {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n  return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param  {!RegExp} re\n * @param  {Array}   keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n  re.keys = keys;\n  return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param  {Object} options\n * @return {string}\n */\nfunction flags (options) {\n  return options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param  {!RegExp} path\n * @param  {!Array}  keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n  // Use a negative lookahead to match only capturing groups.\n  var groups = path.source.match(/\\((?!\\?)/g);\n\n  if (groups) {\n    for (var i = 0; i < groups.length; i++) {\n      keys.push({\n        name: i,\n        prefix: null,\n        delimiter: null,\n        optional: false,\n        repeat: false,\n        partial: false,\n        asterisk: false,\n        pattern: null\n      });\n    }\n  }\n\n  return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param  {!Array}  path\n * @param  {Array}   keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n  var parts = [];\n\n  for (var i = 0; i < path.length; i++) {\n    parts.push(pathToRegexp(path[i], keys, options).source);\n  }\n\n  var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));\n\n  return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param  {string}  path\n * @param  {!Array}  keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n  return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param  {!Array}          tokens\n * @param  {(Array|Object)=} keys\n * @param  {Object=}         options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options);\n    keys = [];\n  }\n\n  options = options || {};\n\n  var strict = options.strict;\n  var end = options.end !== false;\n  var route = '';\n\n  // Iterate over the tokens and create our regexp string.\n  for (var i = 0; i < tokens.length; i++) {\n    var token = tokens[i];\n\n    if (typeof token === 'string') {\n      route += escapeString(token);\n    } else {\n      var prefix = escapeString(token.prefix);\n      var capture = '(?:' + token.pattern + ')';\n\n      keys.push(token);\n\n      if (token.repeat) {\n        capture += '(?:' + prefix + capture + ')*';\n      }\n\n      if (token.optional) {\n        if (!token.partial) {\n          capture = '(?:' + prefix + '(' + capture + '))?';\n        } else {\n          capture = prefix + '(' + capture + ')?';\n        }\n      } else {\n        capture = prefix + '(' + capture + ')';\n      }\n\n      route += capture;\n    }\n  }\n\n  var delimiter = escapeString(options.delimiter || '/');\n  var endsWithDelimiter = route.slice(-delimiter.length) === delimiter;\n\n  // In non-strict mode we allow a slash at the end of match. If the path to\n  // match already ends with a slash, we remove it for consistency. The slash\n  // is valid at the end of a path match, not in the middle. This is important\n  // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n  if (!strict) {\n    route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?';\n  }\n\n  if (end) {\n    route += '$';\n  } else {\n    // In non-ending mode, we need the capturing groups to match as much as\n    // possible by using a positive lookahead to the end or next path segment.\n    route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)';\n  }\n\n  return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param  {(string|RegExp|Array)} path\n * @param  {(Array|Object)=}       keys\n * @param  {Object=}               options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options);\n    keys = [];\n  }\n\n  options = options || {};\n\n  if (path instanceof RegExp) {\n    return regexpToRegexp(path, /** @type {!Array} */ (keys))\n  }\n\n  if (isarray(path)) {\n    return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n  }\n\n  return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\npathToRegexp_1.parse = parse_1;\npathToRegexp_1.compile = compile_1;\npathToRegexp_1.tokensToFunction = tokensToFunction_1;\npathToRegexp_1.tokensToRegExp = tokensToRegExp_1;\n\n/*  */\n\n// $flow-disable-line\nvar regexpCompileCache = Object.create(null);\n\nfunction fillParams (\n  path,\n  params,\n  routeMsg\n) {\n  params = params || {};\n  try {\n    var filler =\n      regexpCompileCache[path] ||\n      (regexpCompileCache[path] = pathToRegexp_1.compile(path));\n\n    // Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }}\n    if (params.pathMatch) { params[0] = params.pathMatch; }\n\n    return filler(params, { pretty: true })\n  } catch (e) {\n    if (true) {\n      warn(false, (\"missing param for \" + routeMsg + \": \" + (e.message)));\n    }\n    return ''\n  } finally {\n    // delete the 0 if it was added\n    delete params[0];\n  }\n}\n\n/*  */\n\nfunction normalizeLocation (\n  raw,\n  current,\n  append,\n  router\n) {\n  var next = typeof raw === 'string' ? { path: raw } : raw;\n  // named target\n  if (next._normalized) {\n    return next\n  } else if (next.name) {\n    return extend({}, raw)\n  }\n\n  // relative params\n  if (!next.path && next.params && current) {\n    next = extend({}, next);\n    next._normalized = true;\n    var params = extend(extend({}, current.params), next.params);\n    if (current.name) {\n      next.name = current.name;\n      next.params = params;\n    } else if (current.matched.length) {\n      var rawPath = current.matched[current.matched.length - 1].path;\n      next.path = fillParams(rawPath, params, (\"path \" + (current.path)));\n    } else if (true) {\n      warn(false, \"relative params navigation requires a current route.\");\n    }\n    return next\n  }\n\n  var parsedPath = parsePath(next.path || '');\n  var basePath = (current && current.path) || '/';\n  var path = parsedPath.path\n    ? resolvePath(parsedPath.path, basePath, append || next.append)\n    : basePath;\n\n  var query = resolveQuery(\n    parsedPath.query,\n    next.query,\n    router && router.options.parseQuery\n  );\n\n  var hash = next.hash || parsedPath.hash;\n  if (hash && hash.charAt(0) !== '#') {\n    hash = \"#\" + hash;\n  }\n\n  return {\n    _normalized: true,\n    path: path,\n    query: query,\n    hash: hash\n  }\n}\n\n/*  */\n\n// work around weird flow bug\nvar toTypes = [String, Object];\nvar eventTypes = [String, Array];\n\nvar noop = function () {};\n\nvar Link = {\n  name: 'RouterLink',\n  props: {\n    to: {\n      type: toTypes,\n      required: true\n    },\n    tag: {\n      type: String,\n      default: 'a'\n    },\n    exact: Boolean,\n    append: Boolean,\n    replace: Boolean,\n    activeClass: String,\n    exactActiveClass: String,\n    event: {\n      type: eventTypes,\n      default: 'click'\n    }\n  },\n  render: function render (h) {\n    var this$1 = this;\n\n    var router = this.$router;\n    var current = this.$route;\n    var ref = router.resolve(\n      this.to,\n      current,\n      this.append\n    );\n    var location = ref.location;\n    var route = ref.route;\n    var href = ref.href;\n\n    var classes = {};\n    var globalActiveClass = router.options.linkActiveClass;\n    var globalExactActiveClass = router.options.linkExactActiveClass;\n    // Support global empty active class\n    var activeClassFallback =\n      globalActiveClass == null ? 'router-link-active' : globalActiveClass;\n    var exactActiveClassFallback =\n      globalExactActiveClass == null\n        ? 'router-link-exact-active'\n        : globalExactActiveClass;\n    var activeClass =\n      this.activeClass == null ? activeClassFallback : this.activeClass;\n    var exactActiveClass =\n      this.exactActiveClass == null\n        ? exactActiveClassFallback\n        : this.exactActiveClass;\n\n    var compareTarget = route.redirectedFrom\n      ? createRoute(null, normalizeLocation(route.redirectedFrom), null, router)\n      : route;\n\n    classes[exactActiveClass] = isSameRoute(current, compareTarget);\n    classes[activeClass] = this.exact\n      ? classes[exactActiveClass]\n      : isIncludedRoute(current, compareTarget);\n\n    var handler = function (e) {\n      if (guardEvent(e)) {\n        if (this$1.replace) {\n          router.replace(location, noop);\n        } else {\n          router.push(location, noop);\n        }\n      }\n    };\n\n    var on = { click: guardEvent };\n    if (Array.isArray(this.event)) {\n      this.event.forEach(function (e) {\n        on[e] = handler;\n      });\n    } else {\n      on[this.event] = handler;\n    }\n\n    var data = { class: classes };\n\n    var scopedSlot =\n      !this.$scopedSlots.$hasNormal &&\n      this.$scopedSlots.default &&\n      this.$scopedSlots.default({\n        href: href,\n        route: route,\n        navigate: handler,\n        isActive: classes[activeClass],\n        isExactActive: classes[exactActiveClass]\n      });\n\n    if (scopedSlot) {\n      if (scopedSlot.length === 1) {\n        return scopedSlot[0]\n      } else if (scopedSlot.length > 1 || !scopedSlot.length) {\n        if (true) {\n          warn(\n            false,\n            (\"RouterLink with to=\\\"\" + (this.props.to) + \"\\\" is trying to use a scoped slot but it didn't provide exactly one child.\")\n          );\n        }\n        return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot)\n      }\n    }\n\n    if (this.tag === 'a') {\n      data.on = on;\n      data.attrs = { href: href };\n    } else {\n      // find the first <a> child and apply listener and href\n      var a = findAnchor(this.$slots.default);\n      if (a) {\n        // in case the <a> is a static node\n        a.isStatic = false;\n        var aData = (a.data = extend({}, a.data));\n        aData.on = aData.on || {};\n        // transform existing events in both objects into arrays so we can push later\n        for (var event in aData.on) {\n          var handler$1 = aData.on[event];\n          if (event in on) {\n            aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1];\n          }\n        }\n        // append new listeners for router-link\n        for (var event$1 in on) {\n          if (event$1 in aData.on) {\n            // on[event] is always a function\n            aData.on[event$1].push(on[event$1]);\n          } else {\n            aData.on[event$1] = handler;\n          }\n        }\n\n        var aAttrs = (a.data.attrs = extend({}, a.data.attrs));\n        aAttrs.href = href;\n      } else {\n        // doesn't have <a> child, apply listener to self\n        data.on = on;\n      }\n    }\n\n    return h(this.tag, data, this.$slots.default)\n  }\n};\n\nfunction guardEvent (e) {\n  // don't redirect with control keys\n  if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { return }\n  // don't redirect when preventDefault called\n  if (e.defaultPrevented) { return }\n  // don't redirect on right click\n  if (e.button !== undefined && e.button !== 0) { return }\n  // don't redirect if `target=\"_blank\"`\n  if (e.currentTarget && e.currentTarget.getAttribute) {\n    var target = e.currentTarget.getAttribute('target');\n    if (/\\b_blank\\b/i.test(target)) { return }\n  }\n  // this may be a Weex event which doesn't have this method\n  if (e.preventDefault) {\n    e.preventDefault();\n  }\n  return true\n}\n\nfunction findAnchor (children) {\n  if (children) {\n    var child;\n    for (var i = 0; i < children.length; i++) {\n      child = children[i];\n      if (child.tag === 'a') {\n        return child\n      }\n      if (child.children && (child = findAnchor(child.children))) {\n        return child\n      }\n    }\n  }\n}\n\nvar _Vue;\n\nfunction install (Vue) {\n  if (install.installed && _Vue === Vue) { return }\n  install.installed = true;\n\n  _Vue = Vue;\n\n  var isDef = function (v) { return v !== undefined; };\n\n  var registerInstance = function (vm, callVal) {\n    var i = vm.$options._parentVnode;\n    if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {\n      i(vm, callVal);\n    }\n  };\n\n  Vue.mixin({\n    beforeCreate: function beforeCreate () {\n      if (isDef(this.$options.router)) {\n        this._routerRoot = this;\n        this._router = this.$options.router;\n        this._router.init(this);\n        Vue.util.defineReactive(this, '_route', this._router.history.current);\n      } else {\n        this._routerRoot = (this.$parent && this.$parent._routerRoot) || this;\n      }\n      registerInstance(this, this);\n    },\n    destroyed: function destroyed () {\n      registerInstance(this);\n    }\n  });\n\n  Object.defineProperty(Vue.prototype, '$router', {\n    get: function get () { return this._routerRoot._router }\n  });\n\n  Object.defineProperty(Vue.prototype, '$route', {\n    get: function get () { return this._routerRoot._route }\n  });\n\n  Vue.component('RouterView', View);\n  Vue.component('RouterLink', Link);\n\n  var strats = Vue.config.optionMergeStrategies;\n  // use the same hook merging strategy for route hooks\n  strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created;\n}\n\n/*  */\n\nvar inBrowser = typeof window !== 'undefined';\n\n/*  */\n\nfunction createRouteMap (\n  routes,\n  oldPathList,\n  oldPathMap,\n  oldNameMap\n) {\n  // the path list is used to control path matching priority\n  var pathList = oldPathList || [];\n  // $flow-disable-line\n  var pathMap = oldPathMap || Object.create(null);\n  // $flow-disable-line\n  var nameMap = oldNameMap || Object.create(null);\n\n  routes.forEach(function (route) {\n    addRouteRecord(pathList, pathMap, nameMap, route);\n  });\n\n  // ensure wildcard routes are always at the end\n  for (var i = 0, l = pathList.length; i < l; i++) {\n    if (pathList[i] === '*') {\n      pathList.push(pathList.splice(i, 1)[0]);\n      l--;\n      i--;\n    }\n  }\n\n  if (false) { var pathNames, found; }\n\n  return {\n    pathList: pathList,\n    pathMap: pathMap,\n    nameMap: nameMap\n  }\n}\n\nfunction addRouteRecord (\n  pathList,\n  pathMap,\n  nameMap,\n  route,\n  parent,\n  matchAs\n) {\n  var path = route.path;\n  var name = route.name;\n  if (true) {\n    assert(path != null, \"\\\"path\\\" is required in a route configuration.\");\n    assert(\n      typeof route.component !== 'string',\n      \"route config \\\"component\\\" for path: \" + (String(\n        path || name\n      )) + \" cannot be a \" + \"string id. Use an actual component instead.\"\n    );\n  }\n\n  var pathToRegexpOptions =\n    route.pathToRegexpOptions || {};\n  var normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict);\n\n  if (typeof route.caseSensitive === 'boolean') {\n    pathToRegexpOptions.sensitive = route.caseSensitive;\n  }\n\n  var record = {\n    path: normalizedPath,\n    regex: compileRouteRegex(normalizedPath, pathToRegexpOptions),\n    components: route.components || { default: route.component },\n    instances: {},\n    name: name,\n    parent: parent,\n    matchAs: matchAs,\n    redirect: route.redirect,\n    beforeEnter: route.beforeEnter,\n    meta: route.meta || {},\n    props:\n      route.props == null\n        ? {}\n        : route.components\n          ? route.props\n          : { default: route.props }\n  };\n\n  if (route.children) {\n    // Warn if route is named, does not redirect and has a default child route.\n    // If users navigate to this route by name, the default child will\n    // not be rendered (GH Issue #629)\n    if (true) {\n      if (\n        route.name &&\n        !route.redirect &&\n        route.children.some(function (child) { return /^\\/?$/.test(child.path); })\n      ) {\n        warn(\n          false,\n          \"Named Route '\" + (route.name) + \"' has a default child route. \" +\n            \"When navigating to this named route (:to=\\\"{name: '\" + (route.name) + \"'\\\"), \" +\n            \"the default child route will not be rendered. Remove the name from \" +\n            \"this route and use the name of the default child route for named \" +\n            \"links instead.\"\n        );\n      }\n    }\n    route.children.forEach(function (child) {\n      var childMatchAs = matchAs\n        ? cleanPath((matchAs + \"/\" + (child.path)))\n        : undefined;\n      addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs);\n    });\n  }\n\n  if (!pathMap[record.path]) {\n    pathList.push(record.path);\n    pathMap[record.path] = record;\n  }\n\n  if (route.alias !== undefined) {\n    var aliases = Array.isArray(route.alias) ? route.alias : [route.alias];\n    for (var i = 0; i < aliases.length; ++i) {\n      var alias = aliases[i];\n      if ( true && alias === path) {\n        warn(\n          false,\n          (\"Found an alias with the same value as the path: \\\"\" + path + \"\\\". You have to remove that alias. It will be ignored in development.\")\n        );\n        // skip in dev to make it work\n        continue\n      }\n\n      var aliasRoute = {\n        path: alias,\n        children: route.children\n      };\n      addRouteRecord(\n        pathList,\n        pathMap,\n        nameMap,\n        aliasRoute,\n        parent,\n        record.path || '/' // matchAs\n      );\n    }\n  }\n\n  if (name) {\n    if (!nameMap[name]) {\n      nameMap[name] = record;\n    } else if ( true && !matchAs) {\n      warn(\n        false,\n        \"Duplicate named routes definition: \" +\n          \"{ name: \\\"\" + name + \"\\\", path: \\\"\" + (record.path) + \"\\\" }\"\n      );\n    }\n  }\n}\n\nfunction compileRouteRegex (\n  path,\n  pathToRegexpOptions\n) {\n  var regex = pathToRegexp_1(path, [], pathToRegexpOptions);\n  if (true) {\n    var keys = Object.create(null);\n    regex.keys.forEach(function (key) {\n      warn(\n        !keys[key.name],\n        (\"Duplicate param keys in route with path: \\\"\" + path + \"\\\"\")\n      );\n      keys[key.name] = true;\n    });\n  }\n  return regex\n}\n\nfunction normalizePath (\n  path,\n  parent,\n  strict\n) {\n  if (!strict) { path = path.replace(/\\/$/, ''); }\n  if (path[0] === '/') { return path }\n  if (parent == null) { return path }\n  return cleanPath(((parent.path) + \"/\" + path))\n}\n\n/*  */\n\n\n\nfunction createMatcher (\n  routes,\n  router\n) {\n  var ref = createRouteMap(routes);\n  var pathList = ref.pathList;\n  var pathMap = ref.pathMap;\n  var nameMap = ref.nameMap;\n\n  function addRoutes (routes) {\n    createRouteMap(routes, pathList, pathMap, nameMap);\n  }\n\n  function match (\n    raw,\n    currentRoute,\n    redirectedFrom\n  ) {\n    var location = normalizeLocation(raw, currentRoute, false, router);\n    var name = location.name;\n\n    if (name) {\n      var record = nameMap[name];\n      if (true) {\n        warn(record, (\"Route with name '\" + name + \"' does not exist\"));\n      }\n      if (!record) { return _createRoute(null, location) }\n      var paramNames = record.regex.keys\n        .filter(function (key) { return !key.optional; })\n        .map(function (key) { return key.name; });\n\n      if (typeof location.params !== 'object') {\n        location.params = {};\n      }\n\n      if (currentRoute && typeof currentRoute.params === 'object') {\n        for (var key in currentRoute.params) {\n          if (!(key in location.params) && paramNames.indexOf(key) > -1) {\n            location.params[key] = currentRoute.params[key];\n          }\n        }\n      }\n\n      location.path = fillParams(record.path, location.params, (\"named route \\\"\" + name + \"\\\"\"));\n      return _createRoute(record, location, redirectedFrom)\n    } else if (location.path) {\n      location.params = {};\n      for (var i = 0; i < pathList.length; i++) {\n        var path = pathList[i];\n        var record$1 = pathMap[path];\n        if (matchRoute(record$1.regex, location.path, location.params)) {\n          return _createRoute(record$1, location, redirectedFrom)\n        }\n      }\n    }\n    // no match\n    return _createRoute(null, location)\n  }\n\n  function redirect (\n    record,\n    location\n  ) {\n    var originalRedirect = record.redirect;\n    var redirect = typeof originalRedirect === 'function'\n      ? originalRedirect(createRoute(record, location, null, router))\n      : originalRedirect;\n\n    if (typeof redirect === 'string') {\n      redirect = { path: redirect };\n    }\n\n    if (!redirect || typeof redirect !== 'object') {\n      if (true) {\n        warn(\n          false, (\"invalid redirect option: \" + (JSON.stringify(redirect)))\n        );\n      }\n      return _createRoute(null, location)\n    }\n\n    var re = redirect;\n    var name = re.name;\n    var path = re.path;\n    var query = location.query;\n    var hash = location.hash;\n    var params = location.params;\n    query = re.hasOwnProperty('query') ? re.query : query;\n    hash = re.hasOwnProperty('hash') ? re.hash : hash;\n    params = re.hasOwnProperty('params') ? re.params : params;\n\n    if (name) {\n      // resolved named direct\n      var targetRecord = nameMap[name];\n      if (true) {\n        assert(targetRecord, (\"redirect failed: named route \\\"\" + name + \"\\\" not found.\"));\n      }\n      return match({\n        _normalized: true,\n        name: name,\n        query: query,\n        hash: hash,\n        params: params\n      }, undefined, location)\n    } else if (path) {\n      // 1. resolve relative redirect\n      var rawPath = resolveRecordPath(path, record);\n      // 2. resolve params\n      var resolvedPath = fillParams(rawPath, params, (\"redirect route with path \\\"\" + rawPath + \"\\\"\"));\n      // 3. rematch with existing query and hash\n      return match({\n        _normalized: true,\n        path: resolvedPath,\n        query: query,\n        hash: hash\n      }, undefined, location)\n    } else {\n      if (true) {\n        warn(false, (\"invalid redirect option: \" + (JSON.stringify(redirect))));\n      }\n      return _createRoute(null, location)\n    }\n  }\n\n  function alias (\n    record,\n    location,\n    matchAs\n  ) {\n    var aliasedPath = fillParams(matchAs, location.params, (\"aliased route with path \\\"\" + matchAs + \"\\\"\"));\n    var aliasedMatch = match({\n      _normalized: true,\n      path: aliasedPath\n    });\n    if (aliasedMatch) {\n      var matched = aliasedMatch.matched;\n      var aliasedRecord = matched[matched.length - 1];\n      location.params = aliasedMatch.params;\n      return _createRoute(aliasedRecord, location)\n    }\n    return _createRoute(null, location)\n  }\n\n  function _createRoute (\n    record,\n    location,\n    redirectedFrom\n  ) {\n    if (record && record.redirect) {\n      return redirect(record, redirectedFrom || location)\n    }\n    if (record && record.matchAs) {\n      return alias(record, location, record.matchAs)\n    }\n    return createRoute(record, location, redirectedFrom, router)\n  }\n\n  return {\n    match: match,\n    addRoutes: addRoutes\n  }\n}\n\nfunction matchRoute (\n  regex,\n  path,\n  params\n) {\n  var m = path.match(regex);\n\n  if (!m) {\n    return false\n  } else if (!params) {\n    return true\n  }\n\n  for (var i = 1, len = m.length; i < len; ++i) {\n    var key = regex.keys[i - 1];\n    var val = typeof m[i] === 'string' ? decodeURIComponent(m[i]) : m[i];\n    if (key) {\n      // Fix #1994: using * with props: true generates a param named 0\n      params[key.name || 'pathMatch'] = val;\n    }\n  }\n\n  return true\n}\n\nfunction resolveRecordPath (path, record) {\n  return resolvePath(path, record.parent ? record.parent.path : '/', true)\n}\n\n/*  */\n\n// use User Timing api (if present) for more accurate key precision\nvar Time =\n  inBrowser && window.performance && window.performance.now\n    ? window.performance\n    : Date;\n\nfunction genStateKey () {\n  return Time.now().toFixed(3)\n}\n\nvar _key = genStateKey();\n\nfunction getStateKey () {\n  return _key\n}\n\nfunction setStateKey (key) {\n  return (_key = key)\n}\n\n/*  */\n\nvar positionStore = Object.create(null);\n\nfunction setupScroll () {\n  // Fix for #1585 for Firefox\n  // Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678\n  // Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with\n  // window.location.protocol + '//' + window.location.host\n  // location.host contains the port and location.hostname doesn't\n  var protocolAndPath = window.location.protocol + '//' + window.location.host;\n  var absolutePath = window.location.href.replace(protocolAndPath, '');\n  window.history.replaceState({ key: getStateKey() }, '', absolutePath);\n  window.addEventListener('popstate', function (e) {\n    saveScrollPosition();\n    if (e.state && e.state.key) {\n      setStateKey(e.state.key);\n    }\n  });\n}\n\nfunction handleScroll (\n  router,\n  to,\n  from,\n  isPop\n) {\n  if (!router.app) {\n    return\n  }\n\n  var behavior = router.options.scrollBehavior;\n  if (!behavior) {\n    return\n  }\n\n  if (true) {\n    assert(typeof behavior === 'function', \"scrollBehavior must be a function\");\n  }\n\n  // wait until re-render finishes before scrolling\n  router.app.$nextTick(function () {\n    var position = getScrollPosition();\n    var shouldScroll = behavior.call(\n      router,\n      to,\n      from,\n      isPop ? position : null\n    );\n\n    if (!shouldScroll) {\n      return\n    }\n\n    if (typeof shouldScroll.then === 'function') {\n      shouldScroll\n        .then(function (shouldScroll) {\n          scrollToPosition((shouldScroll), position);\n        })\n        .catch(function (err) {\n          if (true) {\n            assert(false, err.toString());\n          }\n        });\n    } else {\n      scrollToPosition(shouldScroll, position);\n    }\n  });\n}\n\nfunction saveScrollPosition () {\n  var key = getStateKey();\n  if (key) {\n    positionStore[key] = {\n      x: window.pageXOffset,\n      y: window.pageYOffset\n    };\n  }\n}\n\nfunction getScrollPosition () {\n  var key = getStateKey();\n  if (key) {\n    return positionStore[key]\n  }\n}\n\nfunction getElementPosition (el, offset) {\n  var docEl = document.documentElement;\n  var docRect = docEl.getBoundingClientRect();\n  var elRect = el.getBoundingClientRect();\n  return {\n    x: elRect.left - docRect.left - offset.x,\n    y: elRect.top - docRect.top - offset.y\n  }\n}\n\nfunction isValidPosition (obj) {\n  return isNumber(obj.x) || isNumber(obj.y)\n}\n\nfunction normalizePosition (obj) {\n  return {\n    x: isNumber(obj.x) ? obj.x : window.pageXOffset,\n    y: isNumber(obj.y) ? obj.y : window.pageYOffset\n  }\n}\n\nfunction normalizeOffset (obj) {\n  return {\n    x: isNumber(obj.x) ? obj.x : 0,\n    y: isNumber(obj.y) ? obj.y : 0\n  }\n}\n\nfunction isNumber (v) {\n  return typeof v === 'number'\n}\n\nvar hashStartsWithNumberRE = /^#\\d/;\n\nfunction scrollToPosition (shouldScroll, position) {\n  var isObject = typeof shouldScroll === 'object';\n  if (isObject && typeof shouldScroll.selector === 'string') {\n    // getElementById would still fail if the selector contains a more complicated query like #main[data-attr]\n    // but at the same time, it doesn't make much sense to select an element with an id and an extra selector\n    var el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line\n      ? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line\n      : document.querySelector(shouldScroll.selector);\n\n    if (el) {\n      var offset =\n        shouldScroll.offset && typeof shouldScroll.offset === 'object'\n          ? shouldScroll.offset\n          : {};\n      offset = normalizeOffset(offset);\n      position = getElementPosition(el, offset);\n    } else if (isValidPosition(shouldScroll)) {\n      position = normalizePosition(shouldScroll);\n    }\n  } else if (isObject && isValidPosition(shouldScroll)) {\n    position = normalizePosition(shouldScroll);\n  }\n\n  if (position) {\n    window.scrollTo(position.x, position.y);\n  }\n}\n\n/*  */\n\nvar supportsPushState =\n  inBrowser &&\n  (function () {\n    var ua = window.navigator.userAgent;\n\n    if (\n      (ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) &&\n      ua.indexOf('Mobile Safari') !== -1 &&\n      ua.indexOf('Chrome') === -1 &&\n      ua.indexOf('Windows Phone') === -1\n    ) {\n      return false\n    }\n\n    return window.history && 'pushState' in window.history\n  })();\n\nfunction pushState (url, replace) {\n  saveScrollPosition();\n  // try...catch the pushState call to get around Safari\n  // DOM Exception 18 where it limits to 100 pushState calls\n  var history = window.history;\n  try {\n    if (replace) {\n      history.replaceState({ key: getStateKey() }, '', url);\n    } else {\n      history.pushState({ key: setStateKey(genStateKey()) }, '', url);\n    }\n  } catch (e) {\n    window.location[replace ? 'replace' : 'assign'](url);\n  }\n}\n\nfunction replaceState (url) {\n  pushState(url, true);\n}\n\n/*  */\n\nfunction runQueue (queue, fn, cb) {\n  var step = function (index) {\n    if (index >= queue.length) {\n      cb();\n    } else {\n      if (queue[index]) {\n        fn(queue[index], function () {\n          step(index + 1);\n        });\n      } else {\n        step(index + 1);\n      }\n    }\n  };\n  step(0);\n}\n\n/*  */\n\nfunction resolveAsyncComponents (matched) {\n  return function (to, from, next) {\n    var hasAsync = false;\n    var pending = 0;\n    var error = null;\n\n    flatMapComponents(matched, function (def, _, match, key) {\n      // if it's a function and doesn't have cid attached,\n      // assume it's an async component resolve function.\n      // we are not using Vue's default async resolving mechanism because\n      // we want to halt the navigation until the incoming component has been\n      // resolved.\n      if (typeof def === 'function' && def.cid === undefined) {\n        hasAsync = true;\n        pending++;\n\n        var resolve = once(function (resolvedDef) {\n          if (isESModule(resolvedDef)) {\n            resolvedDef = resolvedDef.default;\n          }\n          // save resolved on async factory in case it's used elsewhere\n          def.resolved = typeof resolvedDef === 'function'\n            ? resolvedDef\n            : _Vue.extend(resolvedDef);\n          match.components[key] = resolvedDef;\n          pending--;\n          if (pending <= 0) {\n            next();\n          }\n        });\n\n        var reject = once(function (reason) {\n          var msg = \"Failed to resolve async component \" + key + \": \" + reason;\n           true && warn(false, msg);\n          if (!error) {\n            error = isError(reason)\n              ? reason\n              : new Error(msg);\n            next(error);\n          }\n        });\n\n        var res;\n        try {\n          res = def(resolve, reject);\n        } catch (e) {\n          reject(e);\n        }\n        if (res) {\n          if (typeof res.then === 'function') {\n            res.then(resolve, reject);\n          } else {\n            // new syntax in Vue 2.3\n            var comp = res.component;\n            if (comp && typeof comp.then === 'function') {\n              comp.then(resolve, reject);\n            }\n          }\n        }\n      }\n    });\n\n    if (!hasAsync) { next(); }\n  }\n}\n\nfunction flatMapComponents (\n  matched,\n  fn\n) {\n  return flatten(matched.map(function (m) {\n    return Object.keys(m.components).map(function (key) { return fn(\n      m.components[key],\n      m.instances[key],\n      m, key\n    ); })\n  }))\n}\n\nfunction flatten (arr) {\n  return Array.prototype.concat.apply([], arr)\n}\n\nvar hasSymbol =\n  typeof Symbol === 'function' &&\n  typeof Symbol.toStringTag === 'symbol';\n\nfunction isESModule (obj) {\n  return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module')\n}\n\n// in Webpack 2, require.ensure now also returns a Promise\n// so the resolve/reject functions may get called an extra time\n// if the user uses an arrow function shorthand that happens to\n// return that Promise.\nfunction once (fn) {\n  var called = false;\n  return function () {\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n\n    if (called) { return }\n    called = true;\n    return fn.apply(this, args)\n  }\n}\n\nvar NavigationDuplicated = /*@__PURE__*/(function (Error) {\n  function NavigationDuplicated (normalizedLocation) {\n    Error.call(this);\n    this.name = this._name = 'NavigationDuplicated';\n    // passing the message to super() doesn't seem to work in the transpiled version\n    this.message = \"Navigating to current location (\\\"\" + (normalizedLocation.fullPath) + \"\\\") is not allowed\";\n    // add a stack property so services like Sentry can correctly display it\n    Object.defineProperty(this, 'stack', {\n      value: new Error().stack,\n      writable: true,\n      configurable: true\n    });\n    // we could also have used\n    // Error.captureStackTrace(this, this.constructor)\n    // but it only exists on node and chrome\n  }\n\n  if ( Error ) NavigationDuplicated.__proto__ = Error;\n  NavigationDuplicated.prototype = Object.create( Error && Error.prototype );\n  NavigationDuplicated.prototype.constructor = NavigationDuplicated;\n\n  return NavigationDuplicated;\n}(Error));\n\n// support IE9\nNavigationDuplicated._name = 'NavigationDuplicated';\n\n/*  */\n\nvar History = function History (router, base) {\n  this.router = router;\n  this.base = normalizeBase(base);\n  // start with a route object that stands for \"nowhere\"\n  this.current = START;\n  this.pending = null;\n  this.ready = false;\n  this.readyCbs = [];\n  this.readyErrorCbs = [];\n  this.errorCbs = [];\n};\n\nHistory.prototype.listen = function listen (cb) {\n  this.cb = cb;\n};\n\nHistory.prototype.onReady = function onReady (cb, errorCb) {\n  if (this.ready) {\n    cb();\n  } else {\n    this.readyCbs.push(cb);\n    if (errorCb) {\n      this.readyErrorCbs.push(errorCb);\n    }\n  }\n};\n\nHistory.prototype.onError = function onError (errorCb) {\n  this.errorCbs.push(errorCb);\n};\n\nHistory.prototype.transitionTo = function transitionTo (\n  location,\n  onComplete,\n  onAbort\n) {\n    var this$1 = this;\n\n  var route = this.router.match(location, this.current);\n  this.confirmTransition(\n    route,\n    function () {\n      this$1.updateRoute(route);\n      onComplete && onComplete(route);\n      this$1.ensureURL();\n\n      // fire ready cbs once\n      if (!this$1.ready) {\n        this$1.ready = true;\n        this$1.readyCbs.forEach(function (cb) {\n          cb(route);\n        });\n      }\n    },\n    function (err) {\n      if (onAbort) {\n        onAbort(err);\n      }\n      if (err && !this$1.ready) {\n        this$1.ready = true;\n        this$1.readyErrorCbs.forEach(function (cb) {\n          cb(err);\n        });\n      }\n    }\n  );\n};\n\nHistory.prototype.confirmTransition = function confirmTransition (route, onComplete, onAbort) {\n    var this$1 = this;\n\n  var current = this.current;\n  var abort = function (err) {\n    // after merging https://github.com/vuejs/vue-router/pull/2771 we\n    // When the user navigates through history through back/forward buttons\n    // we do not want to throw the error. We only throw it if directly calling\n    // push/replace. That's why it's not included in isError\n    if (!isExtendedError(NavigationDuplicated, err) && isError(err)) {\n      if (this$1.errorCbs.length) {\n        this$1.errorCbs.forEach(function (cb) {\n          cb(err);\n        });\n      } else {\n        warn(false, 'uncaught error during route navigation:');\n        console.error(err);\n      }\n    }\n    onAbort && onAbort(err);\n  };\n  if (\n    isSameRoute(route, current) &&\n    // in the case the route map has been dynamically appended to\n    route.matched.length === current.matched.length\n  ) {\n    this.ensureURL();\n    return abort(new NavigationDuplicated(route))\n  }\n\n  var ref = resolveQueue(\n    this.current.matched,\n    route.matched\n  );\n    var updated = ref.updated;\n    var deactivated = ref.deactivated;\n    var activated = ref.activated;\n\n  var queue = [].concat(\n    // in-component leave guards\n    extractLeaveGuards(deactivated),\n    // global before hooks\n    this.router.beforeHooks,\n    // in-component update hooks\n    extractUpdateHooks(updated),\n    // in-config enter guards\n    activated.map(function (m) { return m.beforeEnter; }),\n    // async components\n    resolveAsyncComponents(activated)\n  );\n\n  this.pending = route;\n  var iterator = function (hook, next) {\n    if (this$1.pending !== route) {\n      return abort()\n    }\n    try {\n      hook(route, current, function (to) {\n        if (to === false || isError(to)) {\n          // next(false) -> abort navigation, ensure current URL\n          this$1.ensureURL(true);\n          abort(to);\n        } else if (\n          typeof to === 'string' ||\n          (typeof to === 'object' &&\n            (typeof to.path === 'string' || typeof to.name === 'string'))\n        ) {\n          // next('/') or next({ path: '/' }) -> redirect\n          abort();\n          if (typeof to === 'object' && to.replace) {\n            this$1.replace(to);\n          } else {\n            this$1.push(to);\n          }\n        } else {\n          // confirm transition and pass on the value\n          next(to);\n        }\n      });\n    } catch (e) {\n      abort(e);\n    }\n  };\n\n  runQueue(queue, iterator, function () {\n    var postEnterCbs = [];\n    var isValid = function () { return this$1.current === route; };\n    // wait until async components are resolved before\n    // extracting in-component enter guards\n    var enterGuards = extractEnterGuards(activated, postEnterCbs, isValid);\n    var queue = enterGuards.concat(this$1.router.resolveHooks);\n    runQueue(queue, iterator, function () {\n      if (this$1.pending !== route) {\n        return abort()\n      }\n      this$1.pending = null;\n      onComplete(route);\n      if (this$1.router.app) {\n        this$1.router.app.$nextTick(function () {\n          postEnterCbs.forEach(function (cb) {\n            cb();\n          });\n        });\n      }\n    });\n  });\n};\n\nHistory.prototype.updateRoute = function updateRoute (route) {\n  var prev = this.current;\n  this.current = route;\n  this.cb && this.cb(route);\n  this.router.afterHooks.forEach(function (hook) {\n    hook && hook(route, prev);\n  });\n};\n\nfunction normalizeBase (base) {\n  if (!base) {\n    if (inBrowser) {\n      // respect <base> tag\n      var baseEl = document.querySelector('base');\n      base = (baseEl && baseEl.getAttribute('href')) || '/';\n      // strip full URL origin\n      base = base.replace(/^https?:\\/\\/[^\\/]+/, '');\n    } else {\n      base = '/';\n    }\n  }\n  // make sure there's the starting slash\n  if (base.charAt(0) !== '/') {\n    base = '/' + base;\n  }\n  // remove trailing slash\n  return base.replace(/\\/$/, '')\n}\n\nfunction resolveQueue (\n  current,\n  next\n) {\n  var i;\n  var max = Math.max(current.length, next.length);\n  for (i = 0; i < max; i++) {\n    if (current[i] !== next[i]) {\n      break\n    }\n  }\n  return {\n    updated: next.slice(0, i),\n    activated: next.slice(i),\n    deactivated: current.slice(i)\n  }\n}\n\nfunction extractGuards (\n  records,\n  name,\n  bind,\n  reverse\n) {\n  var guards = flatMapComponents(records, function (def, instance, match, key) {\n    var guard = extractGuard(def, name);\n    if (guard) {\n      return Array.isArray(guard)\n        ? guard.map(function (guard) { return bind(guard, instance, match, key); })\n        : bind(guard, instance, match, key)\n    }\n  });\n  return flatten(reverse ? guards.reverse() : guards)\n}\n\nfunction extractGuard (\n  def,\n  key\n) {\n  if (typeof def !== 'function') {\n    // extend now so that global mixins are applied.\n    def = _Vue.extend(def);\n  }\n  return def.options[key]\n}\n\nfunction extractLeaveGuards (deactivated) {\n  return extractGuards(deactivated, 'beforeRouteLeave', bindGuard, true)\n}\n\nfunction extractUpdateHooks (updated) {\n  return extractGuards(updated, 'beforeRouteUpdate', bindGuard)\n}\n\nfunction bindGuard (guard, instance) {\n  if (instance) {\n    return function boundRouteGuard () {\n      return guard.apply(instance, arguments)\n    }\n  }\n}\n\nfunction extractEnterGuards (\n  activated,\n  cbs,\n  isValid\n) {\n  return extractGuards(\n    activated,\n    'beforeRouteEnter',\n    function (guard, _, match, key) {\n      return bindEnterGuard(guard, match, key, cbs, isValid)\n    }\n  )\n}\n\nfunction bindEnterGuard (\n  guard,\n  match,\n  key,\n  cbs,\n  isValid\n) {\n  return function routeEnterGuard (to, from, next) {\n    return guard(to, from, function (cb) {\n      if (typeof cb === 'function') {\n        cbs.push(function () {\n          // #750\n          // if a router-view is wrapped with an out-in transition,\n          // the instance may not have been registered at this time.\n          // we will need to poll for registration until current route\n          // is no longer valid.\n          poll(cb, match.instances, key, isValid);\n        });\n      }\n      next(cb);\n    })\n  }\n}\n\nfunction poll (\n  cb, // somehow flow cannot infer this is a function\n  instances,\n  key,\n  isValid\n) {\n  if (\n    instances[key] &&\n    !instances[key]._isBeingDestroyed // do not reuse being destroyed instance\n  ) {\n    cb(instances[key]);\n  } else if (isValid()) {\n    setTimeout(function () {\n      poll(cb, instances, key, isValid);\n    }, 16);\n  }\n}\n\n/*  */\n\nvar HTML5History = /*@__PURE__*/(function (History) {\n  function HTML5History (router, base) {\n    var this$1 = this;\n\n    History.call(this, router, base);\n\n    var expectScroll = router.options.scrollBehavior;\n    var supportsScroll = supportsPushState && expectScroll;\n\n    if (supportsScroll) {\n      setupScroll();\n    }\n\n    var initLocation = getLocation(this.base);\n    window.addEventListener('popstate', function (e) {\n      var current = this$1.current;\n\n      // Avoiding first `popstate` event dispatched in some browsers but first\n      // history route not updated since async guard at the same time.\n      var location = getLocation(this$1.base);\n      if (this$1.current === START && location === initLocation) {\n        return\n      }\n\n      this$1.transitionTo(location, function (route) {\n        if (supportsScroll) {\n          handleScroll(router, route, current, true);\n        }\n      });\n    });\n  }\n\n  if ( History ) HTML5History.__proto__ = History;\n  HTML5History.prototype = Object.create( History && History.prototype );\n  HTML5History.prototype.constructor = HTML5History;\n\n  HTML5History.prototype.go = function go (n) {\n    window.history.go(n);\n  };\n\n  HTML5History.prototype.push = function push (location, onComplete, onAbort) {\n    var this$1 = this;\n\n    var ref = this;\n    var fromRoute = ref.current;\n    this.transitionTo(location, function (route) {\n      pushState(cleanPath(this$1.base + route.fullPath));\n      handleScroll(this$1.router, route, fromRoute, false);\n      onComplete && onComplete(route);\n    }, onAbort);\n  };\n\n  HTML5History.prototype.replace = function replace (location, onComplete, onAbort) {\n    var this$1 = this;\n\n    var ref = this;\n    var fromRoute = ref.current;\n    this.transitionTo(location, function (route) {\n      replaceState(cleanPath(this$1.base + route.fullPath));\n      handleScroll(this$1.router, route, fromRoute, false);\n      onComplete && onComplete(route);\n    }, onAbort);\n  };\n\n  HTML5History.prototype.ensureURL = function ensureURL (push) {\n    if (getLocation(this.base) !== this.current.fullPath) {\n      var current = cleanPath(this.base + this.current.fullPath);\n      push ? pushState(current) : replaceState(current);\n    }\n  };\n\n  HTML5History.prototype.getCurrentLocation = function getCurrentLocation () {\n    return getLocation(this.base)\n  };\n\n  return HTML5History;\n}(History));\n\nfunction getLocation (base) {\n  var path = decodeURI(window.location.pathname);\n  if (base && path.indexOf(base) === 0) {\n    path = path.slice(base.length);\n  }\n  return (path || '/') + window.location.search + window.location.hash\n}\n\n/*  */\n\nvar HashHistory = /*@__PURE__*/(function (History) {\n  function HashHistory (router, base, fallback) {\n    History.call(this, router, base);\n    // check history fallback deeplinking\n    if (fallback && checkFallback(this.base)) {\n      return\n    }\n    ensureSlash();\n  }\n\n  if ( History ) HashHistory.__proto__ = History;\n  HashHistory.prototype = Object.create( History && History.prototype );\n  HashHistory.prototype.constructor = HashHistory;\n\n  // this is delayed until the app mounts\n  // to avoid the hashchange listener being fired too early\n  HashHistory.prototype.setupListeners = function setupListeners () {\n    var this$1 = this;\n\n    var router = this.router;\n    var expectScroll = router.options.scrollBehavior;\n    var supportsScroll = supportsPushState && expectScroll;\n\n    if (supportsScroll) {\n      setupScroll();\n    }\n\n    window.addEventListener(\n      supportsPushState ? 'popstate' : 'hashchange',\n      function () {\n        var current = this$1.current;\n        if (!ensureSlash()) {\n          return\n        }\n        this$1.transitionTo(getHash(), function (route) {\n          if (supportsScroll) {\n            handleScroll(this$1.router, route, current, true);\n          }\n          if (!supportsPushState) {\n            replaceHash(route.fullPath);\n          }\n        });\n      }\n    );\n  };\n\n  HashHistory.prototype.push = function push (location, onComplete, onAbort) {\n    var this$1 = this;\n\n    var ref = this;\n    var fromRoute = ref.current;\n    this.transitionTo(\n      location,\n      function (route) {\n        pushHash(route.fullPath);\n        handleScroll(this$1.router, route, fromRoute, false);\n        onComplete && onComplete(route);\n      },\n      onAbort\n    );\n  };\n\n  HashHistory.prototype.replace = function replace (location, onComplete, onAbort) {\n    var this$1 = this;\n\n    var ref = this;\n    var fromRoute = ref.current;\n    this.transitionTo(\n      location,\n      function (route) {\n        replaceHash(route.fullPath);\n        handleScroll(this$1.router, route, fromRoute, false);\n        onComplete && onComplete(route);\n      },\n      onAbort\n    );\n  };\n\n  HashHistory.prototype.go = function go (n) {\n    window.history.go(n);\n  };\n\n  HashHistory.prototype.ensureURL = function ensureURL (push) {\n    var current = this.current.fullPath;\n    if (getHash() !== current) {\n      push ? pushHash(current) : replaceHash(current);\n    }\n  };\n\n  HashHistory.prototype.getCurrentLocation = function getCurrentLocation () {\n    return getHash()\n  };\n\n  return HashHistory;\n}(History));\n\nfunction checkFallback (base) {\n  var location = getLocation(base);\n  if (!/^\\/#/.test(location)) {\n    window.location.replace(cleanPath(base + '/#' + location));\n    return true\n  }\n}\n\nfunction ensureSlash () {\n  var path = getHash();\n  if (path.charAt(0) === '/') {\n    return true\n  }\n  replaceHash('/' + path);\n  return false\n}\n\nfunction getHash () {\n  // We can't use window.location.hash here because it's not\n  // consistent across browsers - Firefox will pre-decode it!\n  var href = window.location.href;\n  var index = href.indexOf('#');\n  // empty path\n  if (index < 0) { return '' }\n\n  href = href.slice(index + 1);\n  // decode the hash but not the search or hash\n  // as search(query) is already decoded\n  // https://github.com/vuejs/vue-router/issues/2708\n  var searchIndex = href.indexOf('?');\n  if (searchIndex < 0) {\n    var hashIndex = href.indexOf('#');\n    if (hashIndex > -1) {\n      href = decodeURI(href.slice(0, hashIndex)) + href.slice(hashIndex);\n    } else { href = decodeURI(href); }\n  } else {\n    if (searchIndex > -1) {\n      href = decodeURI(href.slice(0, searchIndex)) + href.slice(searchIndex);\n    }\n  }\n\n  return href\n}\n\nfunction getUrl (path) {\n  var href = window.location.href;\n  var i = href.indexOf('#');\n  var base = i >= 0 ? href.slice(0, i) : href;\n  return (base + \"#\" + path)\n}\n\nfunction pushHash (path) {\n  if (supportsPushState) {\n    pushState(getUrl(path));\n  } else {\n    window.location.hash = path;\n  }\n}\n\nfunction replaceHash (path) {\n  if (supportsPushState) {\n    replaceState(getUrl(path));\n  } else {\n    window.location.replace(getUrl(path));\n  }\n}\n\n/*  */\n\nvar AbstractHistory = /*@__PURE__*/(function (History) {\n  function AbstractHistory (router, base) {\n    History.call(this, router, base);\n    this.stack = [];\n    this.index = -1;\n  }\n\n  if ( History ) AbstractHistory.__proto__ = History;\n  AbstractHistory.prototype = Object.create( History && History.prototype );\n  AbstractHistory.prototype.constructor = AbstractHistory;\n\n  AbstractHistory.prototype.push = function push (location, onComplete, onAbort) {\n    var this$1 = this;\n\n    this.transitionTo(\n      location,\n      function (route) {\n        this$1.stack = this$1.stack.slice(0, this$1.index + 1).concat(route);\n        this$1.index++;\n        onComplete && onComplete(route);\n      },\n      onAbort\n    );\n  };\n\n  AbstractHistory.prototype.replace = function replace (location, onComplete, onAbort) {\n    var this$1 = this;\n\n    this.transitionTo(\n      location,\n      function (route) {\n        this$1.stack = this$1.stack.slice(0, this$1.index).concat(route);\n        onComplete && onComplete(route);\n      },\n      onAbort\n    );\n  };\n\n  AbstractHistory.prototype.go = function go (n) {\n    var this$1 = this;\n\n    var targetIndex = this.index + n;\n    if (targetIndex < 0 || targetIndex >= this.stack.length) {\n      return\n    }\n    var route = this.stack[targetIndex];\n    this.confirmTransition(\n      route,\n      function () {\n        this$1.index = targetIndex;\n        this$1.updateRoute(route);\n      },\n      function (err) {\n        if (isExtendedError(NavigationDuplicated, err)) {\n          this$1.index = targetIndex;\n        }\n      }\n    );\n  };\n\n  AbstractHistory.prototype.getCurrentLocation = function getCurrentLocation () {\n    var current = this.stack[this.stack.length - 1];\n    return current ? current.fullPath : '/'\n  };\n\n  AbstractHistory.prototype.ensureURL = function ensureURL () {\n    // noop\n  };\n\n  return AbstractHistory;\n}(History));\n\n/*  */\n\n\n\nvar VueRouter = function VueRouter (options) {\n  if ( options === void 0 ) options = {};\n\n  this.app = null;\n  this.apps = [];\n  this.options = options;\n  this.beforeHooks = [];\n  this.resolveHooks = [];\n  this.afterHooks = [];\n  this.matcher = createMatcher(options.routes || [], this);\n\n  var mode = options.mode || 'hash';\n  this.fallback = mode === 'history' && !supportsPushState && options.fallback !== false;\n  if (this.fallback) {\n    mode = 'hash';\n  }\n  if (!inBrowser) {\n    mode = 'abstract';\n  }\n  this.mode = mode;\n\n  switch (mode) {\n    case 'history':\n      this.history = new HTML5History(this, options.base);\n      break\n    case 'hash':\n      this.history = new HashHistory(this, options.base, this.fallback);\n      break\n    case 'abstract':\n      this.history = new AbstractHistory(this, options.base);\n      break\n    default:\n      if (true) {\n        assert(false, (\"invalid mode: \" + mode));\n      }\n  }\n};\n\nvar prototypeAccessors = { currentRoute: { configurable: true } };\n\nVueRouter.prototype.match = function match (\n  raw,\n  current,\n  redirectedFrom\n) {\n  return this.matcher.match(raw, current, redirectedFrom)\n};\n\nprototypeAccessors.currentRoute.get = function () {\n  return this.history && this.history.current\n};\n\nVueRouter.prototype.init = function init (app /* Vue component instance */) {\n    var this$1 = this;\n\n   true && assert(\n    install.installed,\n    \"not installed. Make sure to call `Vue.use(VueRouter)` \" +\n    \"before creating root instance.\"\n  );\n\n  this.apps.push(app);\n\n  // set up app destroyed handler\n  // https://github.com/vuejs/vue-router/issues/2639\n  app.$once('hook:destroyed', function () {\n    // clean out app from this.apps array once destroyed\n    var index = this$1.apps.indexOf(app);\n    if (index > -1) { this$1.apps.splice(index, 1); }\n    // ensure we still have a main app or null if no apps\n    // we do not release the router so it can be reused\n    if (this$1.app === app) { this$1.app = this$1.apps[0] || null; }\n  });\n\n  // main app previously initialized\n  // return as we don't need to set up new history listener\n  if (this.app) {\n    return\n  }\n\n  this.app = app;\n\n  var history = this.history;\n\n  if (history instanceof HTML5History) {\n    history.transitionTo(history.getCurrentLocation());\n  } else if (history instanceof HashHistory) {\n    var setupHashListener = function () {\n      history.setupListeners();\n    };\n    history.transitionTo(\n      history.getCurrentLocation(),\n      setupHashListener,\n      setupHashListener\n    );\n  }\n\n  history.listen(function (route) {\n    this$1.apps.forEach(function (app) {\n      app._route = route;\n    });\n  });\n};\n\nVueRouter.prototype.beforeEach = function beforeEach (fn) {\n  return registerHook(this.beforeHooks, fn)\n};\n\nVueRouter.prototype.beforeResolve = function beforeResolve (fn) {\n  return registerHook(this.resolveHooks, fn)\n};\n\nVueRouter.prototype.afterEach = function afterEach (fn) {\n  return registerHook(this.afterHooks, fn)\n};\n\nVueRouter.prototype.onReady = function onReady (cb, errorCb) {\n  this.history.onReady(cb, errorCb);\n};\n\nVueRouter.prototype.onError = function onError (errorCb) {\n  this.history.onError(errorCb);\n};\n\nVueRouter.prototype.push = function push (location, onComplete, onAbort) {\n    var this$1 = this;\n\n  // $flow-disable-line\n  if (!onComplete && !onAbort && typeof Promise !== 'undefined') {\n    return new Promise(function (resolve, reject) {\n      this$1.history.push(location, resolve, reject);\n    })\n  } else {\n    this.history.push(location, onComplete, onAbort);\n  }\n};\n\nVueRouter.prototype.replace = function replace (location, onComplete, onAbort) {\n    var this$1 = this;\n\n  // $flow-disable-line\n  if (!onComplete && !onAbort && typeof Promise !== 'undefined') {\n    return new Promise(function (resolve, reject) {\n      this$1.history.replace(location, resolve, reject);\n    })\n  } else {\n    this.history.replace(location, onComplete, onAbort);\n  }\n};\n\nVueRouter.prototype.go = function go (n) {\n  this.history.go(n);\n};\n\nVueRouter.prototype.back = function back () {\n  this.go(-1);\n};\n\nVueRouter.prototype.forward = function forward () {\n  this.go(1);\n};\n\nVueRouter.prototype.getMatchedComponents = function getMatchedComponents (to) {\n  var route = to\n    ? to.matched\n      ? to\n      : this.resolve(to).route\n    : this.currentRoute;\n  if (!route) {\n    return []\n  }\n  return [].concat.apply([], route.matched.map(function (m) {\n    return Object.keys(m.components).map(function (key) {\n      return m.components[key]\n    })\n  }))\n};\n\nVueRouter.prototype.resolve = function resolve (\n  to,\n  current,\n  append\n) {\n  current = current || this.history.current;\n  var location = normalizeLocation(\n    to,\n    current,\n    append,\n    this\n  );\n  var route = this.match(location, current);\n  var fullPath = route.redirectedFrom || route.fullPath;\n  var base = this.history.base;\n  var href = createHref(base, fullPath, this.mode);\n  return {\n    location: location,\n    route: route,\n    href: href,\n    // for backwards compat\n    normalizedTo: location,\n    resolved: route\n  }\n};\n\nVueRouter.prototype.addRoutes = function addRoutes (routes) {\n  this.matcher.addRoutes(routes);\n  if (this.history.current !== START) {\n    this.history.transitionTo(this.history.getCurrentLocation());\n  }\n};\n\nObject.defineProperties( VueRouter.prototype, prototypeAccessors );\n\nfunction registerHook (list, fn) {\n  list.push(fn);\n  return function () {\n    var i = list.indexOf(fn);\n    if (i > -1) { list.splice(i, 1); }\n  }\n}\n\nfunction createHref (base, fullPath, mode) {\n  var path = mode === 'hash' ? '#' + fullPath : fullPath;\n  return base ? cleanPath(base + '/' + path) : path\n}\n\nVueRouter.install = install;\nVueRouter.version = '3.1.3';\n\nif (inBrowser && window.Vue) {\n  window.Vue.use(VueRouter);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (VueRouter);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1yb3V0ZXJAMy4xLjNAdnVlLXJvdXRlci9kaXN0L3Z1ZS1yb3V0ZXIuZXNtLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWUtcm91dGVyQDMuMS4zQHZ1ZS1yb3V0ZXIvZGlzdC92dWUtcm91dGVyLmVzbS5qcz9jNDc4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICAqIHZ1ZS1yb3V0ZXIgdjMuMS4zXG4gICogKGMpIDIwMTkgRXZhbiBZb3VcbiAgKiBAbGljZW5zZSBNSVRcbiAgKi9cbi8qICAqL1xuXG5mdW5jdGlvbiBhc3NlcnQgKGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcigoXCJbdnVlLXJvdXRlcl0gXCIgKyBtZXNzYWdlKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuIChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbmRpdGlvbikge1xuICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4oKFwiW3Z1ZS1yb3V0ZXJdIFwiICsgbWVzc2FnZSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3IgKGVycikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycikuaW5kZXhPZignRXJyb3InKSA+IC0xXG59XG5cbmZ1bmN0aW9uIGlzRXh0ZW5kZWRFcnJvciAoY29uc3RydWN0b3IsIGVycikge1xuICByZXR1cm4gKFxuICAgIGVyciBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yIHx8XG4gICAgLy8gX25hbWUgaXMgdG8gc3VwcG9ydCBJRTkgdG9vXG4gICAgKGVyciAmJiAoZXJyLm5hbWUgPT09IGNvbnN0cnVjdG9yLm5hbWUgfHwgZXJyLl9uYW1lID09PSBjb25zdHJ1Y3Rvci5fbmFtZSkpXG4gIClcbn1cblxuZnVuY3Rpb24gZXh0ZW5kIChhLCBiKSB7XG4gIGZvciAodmFyIGtleSBpbiBiKSB7XG4gICAgYVtrZXldID0gYltrZXldO1xuICB9XG4gIHJldHVybiBhXG59XG5cbnZhciBWaWV3ID0ge1xuICBuYW1lOiAnUm91dGVyVmlldycsXG4gIGZ1bmN0aW9uYWw6IHRydWUsXG4gIHByb3BzOiB7XG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2RlZmF1bHQnXG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoXywgcmVmKSB7XG4gICAgdmFyIHByb3BzID0gcmVmLnByb3BzO1xuICAgIHZhciBjaGlsZHJlbiA9IHJlZi5jaGlsZHJlbjtcbiAgICB2YXIgcGFyZW50ID0gcmVmLnBhcmVudDtcbiAgICB2YXIgZGF0YSA9IHJlZi5kYXRhO1xuXG4gICAgLy8gdXNlZCBieSBkZXZ0b29scyB0byBkaXNwbGF5IGEgcm91dGVyLXZpZXcgYmFkZ2VcbiAgICBkYXRhLnJvdXRlclZpZXcgPSB0cnVlO1xuXG4gICAgLy8gZGlyZWN0bHkgdXNlIHBhcmVudCBjb250ZXh0J3MgY3JlYXRlRWxlbWVudCgpIGZ1bmN0aW9uXG4gICAgLy8gc28gdGhhdCBjb21wb25lbnRzIHJlbmRlcmVkIGJ5IHJvdXRlci12aWV3IGNhbiByZXNvbHZlIG5hbWVkIHNsb3RzXG4gICAgdmFyIGggPSBwYXJlbnQuJGNyZWF0ZUVsZW1lbnQ7XG4gICAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuICAgIHZhciByb3V0ZSA9IHBhcmVudC4kcm91dGU7XG4gICAgdmFyIGNhY2hlID0gcGFyZW50Ll9yb3V0ZXJWaWV3Q2FjaGUgfHwgKHBhcmVudC5fcm91dGVyVmlld0NhY2hlID0ge30pO1xuXG4gICAgLy8gZGV0ZXJtaW5lIGN1cnJlbnQgdmlldyBkZXB0aCwgYWxzbyBjaGVjayB0byBzZWUgaWYgdGhlIHRyZWVcbiAgICAvLyBoYXMgYmVlbiB0b2dnbGVkIGluYWN0aXZlIGJ1dCBrZXB0LWFsaXZlLlxuICAgIHZhciBkZXB0aCA9IDA7XG4gICAgdmFyIGluYWN0aXZlID0gZmFsc2U7XG4gICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuX3JvdXRlclJvb3QgIT09IHBhcmVudCkge1xuICAgICAgdmFyIHZub2RlRGF0YSA9IHBhcmVudC4kdm5vZGUgJiYgcGFyZW50LiR2bm9kZS5kYXRhO1xuICAgICAgaWYgKHZub2RlRGF0YSkge1xuICAgICAgICBpZiAodm5vZGVEYXRhLnJvdXRlclZpZXcpIHtcbiAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZURhdGEua2VlcEFsaXZlICYmIHBhcmVudC5faW5hY3RpdmUpIHtcbiAgICAgICAgICBpbmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuICAgIH1cbiAgICBkYXRhLnJvdXRlclZpZXdEZXB0aCA9IGRlcHRoO1xuXG4gICAgLy8gcmVuZGVyIHByZXZpb3VzIHZpZXcgaWYgdGhlIHRyZWUgaXMgaW5hY3RpdmUgYW5kIGtlcHQtYWxpdmVcbiAgICBpZiAoaW5hY3RpdmUpIHtcbiAgICAgIHJldHVybiBoKGNhY2hlW25hbWVdLCBkYXRhLCBjaGlsZHJlbilcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2hlZCA9IHJvdXRlLm1hdGNoZWRbZGVwdGhdO1xuICAgIC8vIHJlbmRlciBlbXB0eSBub2RlIGlmIG5vIG1hdGNoZWQgcm91dGVcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNhY2hlW25hbWVdID0gbnVsbDtcbiAgICAgIHJldHVybiBoKClcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50ID0gY2FjaGVbbmFtZV0gPSBtYXRjaGVkLmNvbXBvbmVudHNbbmFtZV07XG5cbiAgICAvLyBhdHRhY2ggaW5zdGFuY2UgcmVnaXN0cmF0aW9uIGhvb2tcbiAgICAvLyB0aGlzIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBpbnN0YW5jZSdzIGluamVjdGVkIGxpZmVjeWNsZSBob29rc1xuICAgIGRhdGEucmVnaXN0ZXJSb3V0ZUluc3RhbmNlID0gZnVuY3Rpb24gKHZtLCB2YWwpIHtcbiAgICAgIC8vIHZhbCBjb3VsZCBiZSB1bmRlZmluZWQgZm9yIHVucmVnaXN0cmF0aW9uXG4gICAgICB2YXIgY3VycmVudCA9IG1hdGNoZWQuaW5zdGFuY2VzW25hbWVdO1xuICAgICAgaWYgKFxuICAgICAgICAodmFsICYmIGN1cnJlbnQgIT09IHZtKSB8fFxuICAgICAgICAoIXZhbCAmJiBjdXJyZW50ID09PSB2bSlcbiAgICAgICkge1xuICAgICAgICBtYXRjaGVkLmluc3RhbmNlc1tuYW1lXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbHNvIHJlZ2lzdGVyIGluc3RhbmNlIGluIHByZXBhdGNoIGhvb2tcbiAgICAvLyBpbiBjYXNlIHRoZSBzYW1lIGNvbXBvbmVudCBpbnN0YW5jZSBpcyByZXVzZWQgYWNyb3NzIGRpZmZlcmVudCByb3V0ZXNcbiAgICA7KGRhdGEuaG9vayB8fCAoZGF0YS5ob29rID0ge30pKS5wcmVwYXRjaCA9IGZ1bmN0aW9uIChfLCB2bm9kZSkge1xuICAgICAgbWF0Y2hlZC5pbnN0YW5jZXNbbmFtZV0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICB9O1xuXG4gICAgLy8gcmVnaXN0ZXIgaW5zdGFuY2UgaW4gaW5pdCBob29rXG4gICAgLy8gaW4gY2FzZSBrZXB0LWFsaXZlIGNvbXBvbmVudCBiZSBhY3RpdmVkIHdoZW4gcm91dGVzIGNoYW5nZWRcbiAgICBkYXRhLmhvb2suaW5pdCA9IGZ1bmN0aW9uICh2bm9kZSkge1xuICAgICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlICYmXG4gICAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmXG4gICAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICE9PSBtYXRjaGVkLmluc3RhbmNlc1tuYW1lXVxuICAgICAgKSB7XG4gICAgICAgIG1hdGNoZWQuaW5zdGFuY2VzW25hbWVdID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIHJlc29sdmUgcHJvcHNcbiAgICB2YXIgcHJvcHNUb1Bhc3MgPSBkYXRhLnByb3BzID0gcmVzb2x2ZVByb3BzKHJvdXRlLCBtYXRjaGVkLnByb3BzICYmIG1hdGNoZWQucHJvcHNbbmFtZV0pO1xuICAgIGlmIChwcm9wc1RvUGFzcykge1xuICAgICAgLy8gY2xvbmUgdG8gcHJldmVudCBtdXRhdGlvblxuICAgICAgcHJvcHNUb1Bhc3MgPSBkYXRhLnByb3BzID0gZXh0ZW5kKHt9LCBwcm9wc1RvUGFzcyk7XG4gICAgICAvLyBwYXNzIG5vbi1kZWNsYXJlZCBwcm9wcyBhcyBhdHRyc1xuICAgICAgdmFyIGF0dHJzID0gZGF0YS5hdHRycyA9IGRhdGEuYXR0cnMgfHwge307XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHNUb1Bhc3MpIHtcbiAgICAgICAgaWYgKCFjb21wb25lbnQucHJvcHMgfHwgIShrZXkgaW4gY29tcG9uZW50LnByb3BzKSkge1xuICAgICAgICAgIGF0dHJzW2tleV0gPSBwcm9wc1RvUGFzc1trZXldO1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1RvUGFzc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGgoY29tcG9uZW50LCBkYXRhLCBjaGlsZHJlbilcbiAgfVxufTtcblxuZnVuY3Rpb24gcmVzb2x2ZVByb3BzIChyb3V0ZSwgY29uZmlnKSB7XG4gIHN3aXRjaCAodHlwZW9mIGNvbmZpZykge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgcmV0dXJuIGNvbmZpZ1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHJldHVybiBjb25maWcocm91dGUpXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gY29uZmlnID8gcm91dGUucGFyYW1zIDogdW5kZWZpbmVkXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgXCJwcm9wcyBpbiBcXFwiXCIgKyAocm91dGUucGF0aCkgKyBcIlxcXCIgaXMgYSBcIiArICh0eXBlb2YgY29uZmlnKSArIFwiLCBcIiArXG4gICAgICAgICAgXCJleHBlY3RpbmcgYW4gb2JqZWN0LCBmdW5jdGlvbiBvciBib29sZWFuLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBlbmNvZGVSZXNlcnZlUkUgPSAvWyEnKCkqXS9nO1xudmFyIGVuY29kZVJlc2VydmVSZXBsYWNlciA9IGZ1bmN0aW9uIChjKSB7IHJldHVybiAnJScgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpOyB9O1xudmFyIGNvbW1hUkUgPSAvJTJDL2c7XG5cbi8vIGZpeGVkIGVuY29kZVVSSUNvbXBvbmVudCB3aGljaCBpcyBtb3JlIGNvbmZvcm1hbnQgdG8gUkZDMzk4Njpcbi8vIC0gZXNjYXBlcyBbIScoKSpdXG4vLyAtIHByZXNlcnZlIGNvbW1hc1xudmFyIGVuY29kZSA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpXG4gIC5yZXBsYWNlKGVuY29kZVJlc2VydmVSRSwgZW5jb2RlUmVzZXJ2ZVJlcGxhY2VyKVxuICAucmVwbGFjZShjb21tYVJFLCAnLCcpOyB9O1xuXG52YXIgZGVjb2RlID0gZGVjb2RlVVJJQ29tcG9uZW50O1xuXG5mdW5jdGlvbiByZXNvbHZlUXVlcnkgKFxuICBxdWVyeSxcbiAgZXh0cmFRdWVyeSxcbiAgX3BhcnNlUXVlcnlcbikge1xuICBpZiAoIGV4dHJhUXVlcnkgPT09IHZvaWQgMCApIGV4dHJhUXVlcnkgPSB7fTtcblxuICB2YXIgcGFyc2UgPSBfcGFyc2VRdWVyeSB8fCBwYXJzZVF1ZXJ5O1xuICB2YXIgcGFyc2VkUXVlcnk7XG4gIHRyeSB7XG4gICAgcGFyc2VkUXVlcnkgPSBwYXJzZShxdWVyeSB8fCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oZmFsc2UsIGUubWVzc2FnZSk7XG4gICAgcGFyc2VkUXVlcnkgPSB7fTtcbiAgfVxuICBmb3IgKHZhciBrZXkgaW4gZXh0cmFRdWVyeSkge1xuICAgIHBhcnNlZFF1ZXJ5W2tleV0gPSBleHRyYVF1ZXJ5W2tleV07XG4gIH1cbiAgcmV0dXJuIHBhcnNlZFF1ZXJ5XG59XG5cbmZ1bmN0aW9uIHBhcnNlUXVlcnkgKHF1ZXJ5KSB7XG4gIHZhciByZXMgPSB7fTtcblxuICBxdWVyeSA9IHF1ZXJ5LnRyaW0oKS5yZXBsYWNlKC9eKFxcP3wjfCYpLywgJycpO1xuXG4gIGlmICghcXVlcnkpIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICBxdWVyeS5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgdmFyIHBhcnRzID0gcGFyYW0ucmVwbGFjZSgvXFwrL2csICcgJykuc3BsaXQoJz0nKTtcbiAgICB2YXIga2V5ID0gZGVjb2RlKHBhcnRzLnNoaWZ0KCkpO1xuICAgIHZhciB2YWwgPSBwYXJ0cy5sZW5ndGggPiAwXG4gICAgICA/IGRlY29kZShwYXJ0cy5qb2luKCc9JykpXG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAocmVzW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzW2tleV0gPSB2YWw7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc1trZXldKSkge1xuICAgICAgcmVzW2tleV0ucHVzaCh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNba2V5XSA9IFtyZXNba2V5XSwgdmFsXTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5UXVlcnkgKG9iaikge1xuICB2YXIgcmVzID0gb2JqID8gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWwgPSBvYmpba2V5XTtcblxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZShrZXkpXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFsLmZvckVhY2goZnVuY3Rpb24gKHZhbDIpIHtcbiAgICAgICAgaWYgKHZhbDIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWwyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlKGtleSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKHZhbDIpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJyYnKVxuICAgIH1cblxuICAgIHJldHVybiBlbmNvZGUoa2V5KSArICc9JyArIGVuY29kZSh2YWwpXG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5sZW5ndGggPiAwOyB9KS5qb2luKCcmJykgOiBudWxsO1xuICByZXR1cm4gcmVzID8gKFwiP1wiICsgcmVzKSA6ICcnXG59XG5cbi8qICAqL1xuXG52YXIgdHJhaWxpbmdTbGFzaFJFID0gL1xcLz8kLztcblxuZnVuY3Rpb24gY3JlYXRlUm91dGUgKFxuICByZWNvcmQsXG4gIGxvY2F0aW9uLFxuICByZWRpcmVjdGVkRnJvbSxcbiAgcm91dGVyXG4pIHtcbiAgdmFyIHN0cmluZ2lmeVF1ZXJ5ID0gcm91dGVyICYmIHJvdXRlci5vcHRpb25zLnN0cmluZ2lmeVF1ZXJ5O1xuXG4gIHZhciBxdWVyeSA9IGxvY2F0aW9uLnF1ZXJ5IHx8IHt9O1xuICB0cnkge1xuICAgIHF1ZXJ5ID0gY2xvbmUocXVlcnkpO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByb3V0ZSA9IHtcbiAgICBuYW1lOiBsb2NhdGlvbi5uYW1lIHx8IChyZWNvcmQgJiYgcmVjb3JkLm5hbWUpLFxuICAgIG1ldGE6IChyZWNvcmQgJiYgcmVjb3JkLm1ldGEpIHx8IHt9LFxuICAgIHBhdGg6IGxvY2F0aW9uLnBhdGggfHwgJy8nLFxuICAgIGhhc2g6IGxvY2F0aW9uLmhhc2ggfHwgJycsXG4gICAgcXVlcnk6IHF1ZXJ5LFxuICAgIHBhcmFtczogbG9jYXRpb24ucGFyYW1zIHx8IHt9LFxuICAgIGZ1bGxQYXRoOiBnZXRGdWxsUGF0aChsb2NhdGlvbiwgc3RyaW5naWZ5UXVlcnkpLFxuICAgIG1hdGNoZWQ6IHJlY29yZCA/IGZvcm1hdE1hdGNoKHJlY29yZCkgOiBbXVxuICB9O1xuICBpZiAocmVkaXJlY3RlZEZyb20pIHtcbiAgICByb3V0ZS5yZWRpcmVjdGVkRnJvbSA9IGdldEZ1bGxQYXRoKHJlZGlyZWN0ZWRGcm9tLCBzdHJpbmdpZnlRdWVyeSk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUocm91dGUpXG59XG5cbmZ1bmN0aW9uIGNsb25lICh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKGNsb25lKVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcmVzID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICByZXNba2V5XSA9IGNsb25lKHZhbHVlW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxuLy8gdGhlIHN0YXJ0aW5nIHJvdXRlIHRoYXQgcmVwcmVzZW50cyB0aGUgaW5pdGlhbCBzdGF0ZVxudmFyIFNUQVJUID0gY3JlYXRlUm91dGUobnVsbCwge1xuICBwYXRoOiAnLydcbn0pO1xuXG5mdW5jdGlvbiBmb3JtYXRNYXRjaCAocmVjb3JkKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgd2hpbGUgKHJlY29yZCkge1xuICAgIHJlcy51bnNoaWZ0KHJlY29yZCk7XG4gICAgcmVjb3JkID0gcmVjb3JkLnBhcmVudDtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGdldEZ1bGxQYXRoIChcbiAgcmVmLFxuICBfc3RyaW5naWZ5UXVlcnlcbikge1xuICB2YXIgcGF0aCA9IHJlZi5wYXRoO1xuICB2YXIgcXVlcnkgPSByZWYucXVlcnk7IGlmICggcXVlcnkgPT09IHZvaWQgMCApIHF1ZXJ5ID0ge307XG4gIHZhciBoYXNoID0gcmVmLmhhc2g7IGlmICggaGFzaCA9PT0gdm9pZCAwICkgaGFzaCA9ICcnO1xuXG4gIHZhciBzdHJpbmdpZnkgPSBfc3RyaW5naWZ5UXVlcnkgfHwgc3RyaW5naWZ5UXVlcnk7XG4gIHJldHVybiAocGF0aCB8fCAnLycpICsgc3RyaW5naWZ5KHF1ZXJ5KSArIGhhc2hcbn1cblxuZnVuY3Rpb24gaXNTYW1lUm91dGUgKGEsIGIpIHtcbiAgaWYgKGIgPT09IFNUQVJUKSB7XG4gICAgcmV0dXJuIGEgPT09IGJcbiAgfSBlbHNlIGlmICghYikge1xuICAgIHJldHVybiBmYWxzZVxuICB9IGVsc2UgaWYgKGEucGF0aCAmJiBiLnBhdGgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYS5wYXRoLnJlcGxhY2UodHJhaWxpbmdTbGFzaFJFLCAnJykgPT09IGIucGF0aC5yZXBsYWNlKHRyYWlsaW5nU2xhc2hSRSwgJycpICYmXG4gICAgICBhLmhhc2ggPT09IGIuaGFzaCAmJlxuICAgICAgaXNPYmplY3RFcXVhbChhLnF1ZXJ5LCBiLnF1ZXJ5KVxuICAgIClcbiAgfSBlbHNlIGlmIChhLm5hbWUgJiYgYi5uYW1lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEubmFtZSA9PT0gYi5uYW1lICYmXG4gICAgICBhLmhhc2ggPT09IGIuaGFzaCAmJlxuICAgICAgaXNPYmplY3RFcXVhbChhLnF1ZXJ5LCBiLnF1ZXJ5KSAmJlxuICAgICAgaXNPYmplY3RFcXVhbChhLnBhcmFtcywgYi5wYXJhbXMpXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0RXF1YWwgKGEsIGIpIHtcbiAgaWYgKCBhID09PSB2b2lkIDAgKSBhID0ge307XG4gIGlmICggYiA9PT0gdm9pZCAwICkgYiA9IHt9O1xuXG4gIC8vIGhhbmRsZSBudWxsIHZhbHVlICMxNTY2XG4gIGlmICghYSB8fCAhYikgeyByZXR1cm4gYSA9PT0gYiB9XG4gIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICB2YXIgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgYVZhbCA9IGFba2V5XTtcbiAgICB2YXIgYlZhbCA9IGJba2V5XTtcbiAgICAvLyBjaGVjayBuZXN0ZWQgZXF1YWxpdHlcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiVmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0RXF1YWwoYVZhbCwgYlZhbClcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhhVmFsKSA9PT0gU3RyaW5nKGJWYWwpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGlzSW5jbHVkZWRSb3V0ZSAoY3VycmVudCwgdGFyZ2V0KSB7XG4gIHJldHVybiAoXG4gICAgY3VycmVudC5wYXRoLnJlcGxhY2UodHJhaWxpbmdTbGFzaFJFLCAnLycpLmluZGV4T2YoXG4gICAgICB0YXJnZXQucGF0aC5yZXBsYWNlKHRyYWlsaW5nU2xhc2hSRSwgJy8nKVxuICAgICkgPT09IDAgJiZcbiAgICAoIXRhcmdldC5oYXNoIHx8IGN1cnJlbnQuaGFzaCA9PT0gdGFyZ2V0Lmhhc2gpICYmXG4gICAgcXVlcnlJbmNsdWRlcyhjdXJyZW50LnF1ZXJ5LCB0YXJnZXQucXVlcnkpXG4gIClcbn1cblxuZnVuY3Rpb24gcXVlcnlJbmNsdWRlcyAoY3VycmVudCwgdGFyZ2V0KSB7XG4gIGZvciAodmFyIGtleSBpbiB0YXJnZXQpIHtcbiAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVBhdGggKFxuICByZWxhdGl2ZSxcbiAgYmFzZSxcbiAgYXBwZW5kXG4pIHtcbiAgdmFyIGZpcnN0Q2hhciA9IHJlbGF0aXZlLmNoYXJBdCgwKTtcbiAgaWYgKGZpcnN0Q2hhciA9PT0gJy8nKSB7XG4gICAgcmV0dXJuIHJlbGF0aXZlXG4gIH1cblxuICBpZiAoZmlyc3RDaGFyID09PSAnPycgfHwgZmlyc3RDaGFyID09PSAnIycpIHtcbiAgICByZXR1cm4gYmFzZSArIHJlbGF0aXZlXG4gIH1cblxuICB2YXIgc3RhY2sgPSBiYXNlLnNwbGl0KCcvJyk7XG5cbiAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNlZ21lbnQgaWY6XG4gIC8vIC0gbm90IGFwcGVuZGluZ1xuICAvLyAtIGFwcGVuZGluZyB0byB0cmFpbGluZyBzbGFzaCAobGFzdCBzZWdtZW50IGlzIGVtcHR5KVxuICBpZiAoIWFwcGVuZCB8fCAhc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0pIHtcbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIC8vIHJlc29sdmUgcmVsYXRpdmUgcGF0aFxuICB2YXIgc2VnbWVudHMgPSByZWxhdGl2ZS5yZXBsYWNlKC9eXFwvLywgJycpLnNwbGl0KCcvJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuICAgIGlmIChzZWdtZW50ID09PSAnLi4nKSB7XG4gICAgICBzdGFjay5wb3AoKTtcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnQgIT09ICcuJykge1xuICAgICAgc3RhY2sucHVzaChzZWdtZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBlbnN1cmUgbGVhZGluZyBzbGFzaFxuICBpZiAoc3RhY2tbMF0gIT09ICcnKSB7XG4gICAgc3RhY2sudW5zaGlmdCgnJyk7XG4gIH1cblxuICByZXR1cm4gc3RhY2suam9pbignLycpXG59XG5cbmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkge1xuICB2YXIgaGFzaCA9ICcnO1xuICB2YXIgcXVlcnkgPSAnJztcblxuICB2YXIgaGFzaEluZGV4ID0gcGF0aC5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoSW5kZXggPj0gMCkge1xuICAgIGhhc2ggPSBwYXRoLnNsaWNlKGhhc2hJbmRleCk7XG4gICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgaGFzaEluZGV4KTtcbiAgfVxuXG4gIHZhciBxdWVyeUluZGV4ID0gcGF0aC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxdWVyeUluZGV4ID49IDApIHtcbiAgICBxdWVyeSA9IHBhdGguc2xpY2UocXVlcnlJbmRleCArIDEpO1xuICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIHF1ZXJ5SW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBwYXRoLFxuICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICBoYXNoOiBoYXNoXG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW5QYXRoIChwYXRoKSB7XG4gIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG59XG5cbnZhciBpc2FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYHBhdGhUb1JlZ2V4cGAuXG4gKi9cbnZhciBwYXRoVG9SZWdleHBfMSA9IHBhdGhUb1JlZ2V4cDtcbnZhciBwYXJzZV8xID0gcGFyc2U7XG52YXIgY29tcGlsZV8xID0gY29tcGlsZTtcbnZhciB0b2tlbnNUb0Z1bmN0aW9uXzEgPSB0b2tlbnNUb0Z1bmN0aW9uO1xudmFyIHRva2Vuc1RvUmVnRXhwXzEgPSB0b2tlbnNUb1JlZ0V4cDtcblxuLyoqXG4gKiBUaGUgbWFpbiBwYXRoIG1hdGNoaW5nIHJlZ2V4cCB1dGlsaXR5LlxuICpcbiAqIEB0eXBlIHtSZWdFeHB9XG4gKi9cbnZhciBQQVRIX1JFR0VYUCA9IG5ldyBSZWdFeHAoW1xuICAvLyBNYXRjaCBlc2NhcGVkIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYXBwZWFyIGluIGZ1dHVyZSBtYXRjaGVzLlxuICAvLyBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIHRoYXQgd29uJ3QgdHJhbnNmb3JtLlxuICAnKFxcXFxcXFxcLiknLFxuICAvLyBNYXRjaCBFeHByZXNzLXN0eWxlIHBhcmFtZXRlcnMgYW5kIHVuLW5hbWVkIHBhcmFtZXRlcnMgd2l0aCBhIHByZWZpeFxuICAvLyBhbmQgb3B0aW9uYWwgc3VmZml4ZXMuIE1hdGNoZXMgYXBwZWFyIGFzOlxuICAvL1xuICAvLyBcIi86dGVzdChcXFxcZCspP1wiID0+IFtcIi9cIiwgXCJ0ZXN0XCIsIFwiXFxkK1wiLCB1bmRlZmluZWQsIFwiP1wiLCB1bmRlZmluZWRdXG4gIC8vIFwiL3JvdXRlKFxcXFxkKylcIiAgPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFwiXFxkK1wiLCB1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgLy8gXCIvKlwiICAgICAgICAgICAgPT4gW1wiL1wiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFwiKlwiXVxuICAnKFtcXFxcLy5dKT8oPzooPzpcXFxcOihcXFxcdyspKD86XFxcXCgoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKV0pKylcXFxcKSk/fFxcXFwoKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKCldKSspXFxcXCkpKFsrKj9dKT98KFxcXFwqKSknXG5dLmpvaW4oJ3wnKSwgJ2cnKTtcblxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBmb3IgdGhlIHJhdyB0b2tlbnMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgc3RyXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshQXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlIChzdHIsIG9wdGlvbnMpIHtcbiAgdmFyIHRva2VucyA9IFtdO1xuICB2YXIga2V5ID0gMDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHBhdGggPSAnJztcbiAgdmFyIGRlZmF1bHREZWxpbWl0ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuZGVsaW1pdGVyIHx8ICcvJztcbiAgdmFyIHJlcztcblxuICB3aGlsZSAoKHJlcyA9IFBBVEhfUkVHRVhQLmV4ZWMoc3RyKSkgIT0gbnVsbCkge1xuICAgIHZhciBtID0gcmVzWzBdO1xuICAgIHZhciBlc2NhcGVkID0gcmVzWzFdO1xuICAgIHZhciBvZmZzZXQgPSByZXMuaW5kZXg7XG4gICAgcGF0aCArPSBzdHIuc2xpY2UoaW5kZXgsIG9mZnNldCk7XG4gICAgaW5kZXggPSBvZmZzZXQgKyBtLmxlbmd0aDtcblxuICAgIC8vIElnbm9yZSBhbHJlYWR5IGVzY2FwZWQgc2VxdWVuY2VzLlxuICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICBwYXRoICs9IGVzY2FwZWRbMV07XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBuZXh0ID0gc3RyW2luZGV4XTtcbiAgICB2YXIgcHJlZml4ID0gcmVzWzJdO1xuICAgIHZhciBuYW1lID0gcmVzWzNdO1xuICAgIHZhciBjYXB0dXJlID0gcmVzWzRdO1xuICAgIHZhciBncm91cCA9IHJlc1s1XTtcbiAgICB2YXIgbW9kaWZpZXIgPSByZXNbNl07XG4gICAgdmFyIGFzdGVyaXNrID0gcmVzWzddO1xuXG4gICAgLy8gUHVzaCB0aGUgY3VycmVudCBwYXRoIG9udG8gdGhlIHRva2Vucy5cbiAgICBpZiAocGF0aCkge1xuICAgICAgdG9rZW5zLnB1c2gocGF0aCk7XG4gICAgICBwYXRoID0gJyc7XG4gICAgfVxuXG4gICAgdmFyIHBhcnRpYWwgPSBwcmVmaXggIT0gbnVsbCAmJiBuZXh0ICE9IG51bGwgJiYgbmV4dCAhPT0gcHJlZml4O1xuICAgIHZhciByZXBlYXQgPSBtb2RpZmllciA9PT0gJysnIHx8IG1vZGlmaWVyID09PSAnKic7XG4gICAgdmFyIG9wdGlvbmFsID0gbW9kaWZpZXIgPT09ICc/JyB8fCBtb2RpZmllciA9PT0gJyonO1xuICAgIHZhciBkZWxpbWl0ZXIgPSByZXNbMl0gfHwgZGVmYXVsdERlbGltaXRlcjtcbiAgICB2YXIgcGF0dGVybiA9IGNhcHR1cmUgfHwgZ3JvdXA7XG5cbiAgICB0b2tlbnMucHVzaCh7XG4gICAgICBuYW1lOiBuYW1lIHx8IGtleSsrLFxuICAgICAgcHJlZml4OiBwcmVmaXggfHwgJycsXG4gICAgICBkZWxpbWl0ZXI6IGRlbGltaXRlcixcbiAgICAgIG9wdGlvbmFsOiBvcHRpb25hbCxcbiAgICAgIHJlcGVhdDogcmVwZWF0LFxuICAgICAgcGFydGlhbDogcGFydGlhbCxcbiAgICAgIGFzdGVyaXNrOiAhIWFzdGVyaXNrLFxuICAgICAgcGF0dGVybjogcGF0dGVybiA/IGVzY2FwZUdyb3VwKHBhdHRlcm4pIDogKGFzdGVyaXNrID8gJy4qJyA6ICdbXicgKyBlc2NhcGVTdHJpbmcoZGVsaW1pdGVyKSArICddKz8nKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTWF0Y2ggYW55IGNoYXJhY3RlcnMgc3RpbGwgcmVtYWluaW5nLlxuICBpZiAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgcGF0aCArPSBzdHIuc3Vic3RyKGluZGV4KTtcbiAgfVxuXG4gIC8vIElmIHRoZSBwYXRoIGV4aXN0cywgcHVzaCBpdCBvbnRvIHRoZSBlbmQuXG4gIGlmIChwYXRoKSB7XG4gICAgdG9rZW5zLnB1c2gocGF0aCk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5zXG59XG5cbi8qKlxuICogQ29tcGlsZSBhIHN0cmluZyB0byBhIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciB0aGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgIHN0clxuICogQHBhcmFtICB7T2JqZWN0PX0gICAgICAgICAgICBvcHRpb25zXG4gKiBAcmV0dXJuIHshZnVuY3Rpb24oT2JqZWN0PSwgT2JqZWN0PSl9XG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGUgKHN0ciwgb3B0aW9ucykge1xuICByZXR1cm4gdG9rZW5zVG9GdW5jdGlvbihwYXJzZShzdHIsIG9wdGlvbnMpKVxufVxuXG4vKipcbiAqIFByZXR0aWVyIGVuY29kaW5nIG9mIFVSSSBwYXRoIHNlZ21lbnRzLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ31cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50UHJldHR5IChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShzdHIpLnJlcGxhY2UoL1tcXC8/I10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbi8qKlxuICogRW5jb2RlIHRoZSBhc3RlcmlzayBwYXJhbWV0ZXIuIFNpbWlsYXIgdG8gYHByZXR0eWAsIGJ1dCBhbGxvd3Mgc2xhc2hlcy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZUFzdGVyaXNrIChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShzdHIpLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbi8qKlxuICogRXhwb3NlIGEgbWV0aG9kIGZvciB0cmFuc2Zvcm1pbmcgdG9rZW5zIGludG8gdGhlIHBhdGggZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRva2Vuc1RvRnVuY3Rpb24gKHRva2Vucykge1xuICAvLyBDb21waWxlIGFsbCB0aGUgdG9rZW5zIGludG8gcmVnZXhwcy5cbiAgdmFyIG1hdGNoZXMgPSBuZXcgQXJyYXkodG9rZW5zLmxlbmd0aCk7XG5cbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHBhdHRlcm5zIGJlZm9yZSBjb21waWxhdGlvbi5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIHRva2Vuc1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG1hdGNoZXNbaV0gPSBuZXcgUmVnRXhwKCdeKD86JyArIHRva2Vuc1tpXS5wYXR0ZXJuICsgJykkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmosIG9wdHMpIHtcbiAgICB2YXIgcGF0aCA9ICcnO1xuICAgIHZhciBkYXRhID0gb2JqIHx8IHt9O1xuICAgIHZhciBvcHRpb25zID0gb3B0cyB8fCB7fTtcbiAgICB2YXIgZW5jb2RlID0gb3B0aW9ucy5wcmV0dHkgPyBlbmNvZGVVUklDb21wb25lbnRQcmV0dHkgOiBlbmNvZGVVUklDb21wb25lbnQ7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXRoICs9IHRva2VuO1xuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZSA9IGRhdGFbdG9rZW4ubmFtZV07XG4gICAgICB2YXIgc2VnbWVudDtcblxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgaWYgKHRva2VuLm9wdGlvbmFsKSB7XG4gICAgICAgICAgLy8gUHJlcGVuZCBwYXJ0aWFsIHNlZ21lbnQgcHJlZml4ZXMuXG4gICAgICAgICAgaWYgKHRva2VuLnBhcnRpYWwpIHtcbiAgICAgICAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBiZSBkZWZpbmVkJylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNhcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKCF0b2tlbi5yZXBlYXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG5vdCByZXBlYXQsIGJ1dCByZWNlaXZlZCBgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICdgJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbm90IGJlIGVtcHR5JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgc2VnbWVudCA9IGVuY29kZSh2YWx1ZVtqXSk7XG5cbiAgICAgICAgICBpZiAoIW1hdGNoZXNbaV0udGVzdChzZWdtZW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWxsIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbWF0Y2ggXCInICsgdG9rZW4ucGF0dGVybiArICdcIiwgYnV0IHJlY2VpdmVkIGAnICsgSlNPTi5zdHJpbmdpZnkoc2VnbWVudCkgKyAnYCcpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGF0aCArPSAoaiA9PT0gMCA/IHRva2VuLnByZWZpeCA6IHRva2VuLmRlbGltaXRlcikgKyBzZWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc2VnbWVudCA9IHRva2VuLmFzdGVyaXNrID8gZW5jb2RlQXN0ZXJpc2sodmFsdWUpIDogZW5jb2RlKHZhbHVlKTtcblxuICAgICAgaWYgKCFtYXRjaGVzW2ldLnRlc3Qoc2VnbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBtYXRjaCBcIicgKyB0b2tlbi5wYXR0ZXJuICsgJ1wiLCBidXQgcmVjZWl2ZWQgXCInICsgc2VnbWVudCArICdcIicpXG4gICAgICB9XG5cbiAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4ICsgc2VnbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aFxuICB9XG59XG5cbi8qKlxuICogRXNjYXBlIGEgcmVndWxhciBleHByZXNzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcgKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLisqPz1eIToke30oKVtcXF18XFwvXFxcXF0pL2csICdcXFxcJDEnKVxufVxuXG4vKipcbiAqIEVzY2FwZSB0aGUgY2FwdHVyaW5nIGdyb3VwIGJ5IGVzY2FwaW5nIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgbWVhbmluZy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGdyb3VwXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUdyb3VwIChncm91cCkge1xuICByZXR1cm4gZ3JvdXAucmVwbGFjZSgvKFs9ITokXFwvKCldKS9nLCAnXFxcXCQxJylcbn1cblxuLyoqXG4gKiBBdHRhY2ggdGhlIGtleXMgYXMgYSBwcm9wZXJ0eSBvZiB0aGUgcmVnZXhwLlxuICpcbiAqIEBwYXJhbSAgeyFSZWdFeHB9IHJlXG4gKiBAcGFyYW0gIHtBcnJheX0gICBrZXlzXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBhdHRhY2hLZXlzIChyZSwga2V5cykge1xuICByZS5rZXlzID0ga2V5cztcbiAgcmV0dXJuIHJlXG59XG5cbi8qKlxuICogR2V0IHRoZSBmbGFncyBmb3IgYSByZWdleHAgZnJvbSB0aGUgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZmxhZ3MgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMuc2Vuc2l0aXZlID8gJycgOiAnaSdcbn1cblxuLyoqXG4gKiBQdWxsIG91dCBrZXlzIGZyb20gYSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IVJlZ0V4cH0gcGF0aFxuICogQHBhcmFtICB7IUFycmF5fSAga2V5c1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gcmVnZXhwVG9SZWdleHAgKHBhdGgsIGtleXMpIHtcbiAgLy8gVXNlIGEgbmVnYXRpdmUgbG9va2FoZWFkIHRvIG1hdGNoIG9ubHkgY2FwdHVyaW5nIGdyb3Vwcy5cbiAgdmFyIGdyb3VwcyA9IHBhdGguc291cmNlLm1hdGNoKC9cXCgoPyFcXD8pL2cpO1xuXG4gIGlmIChncm91cHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgbmFtZTogaSxcbiAgICAgICAgcHJlZml4OiBudWxsLFxuICAgICAgICBkZWxpbWl0ZXI6IG51bGwsXG4gICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgcmVwZWF0OiBmYWxzZSxcbiAgICAgICAgcGFydGlhbDogZmFsc2UsXG4gICAgICAgIGFzdGVyaXNrOiBmYWxzZSxcbiAgICAgICAgcGF0dGVybjogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF0dGFjaEtleXMocGF0aCwga2V5cylcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYXJyYXkgaW50byBhIHJlZ2V4cC5cbiAqXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBwYXRoXG4gKiBAcGFyYW0gIHtBcnJheX0gICBrZXlzXG4gKiBAcGFyYW0gIHshT2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBhcnJheVRvUmVnZXhwIChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIHZhciBwYXJ0cyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIHBhcnRzLnB1c2gocGF0aFRvUmVnZXhwKHBhdGhbaV0sIGtleXMsIG9wdGlvbnMpLnNvdXJjZSk7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgnKD86JyArIHBhcnRzLmpvaW4oJ3wnKSArICcpJywgZmxhZ3Mob3B0aW9ucykpO1xuXG4gIHJldHVybiBhdHRhY2hLZXlzKHJlZ2V4cCwga2V5cylcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwYXRoIHJlZ2V4cCBmcm9tIHN0cmluZyBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBwYXRoXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBrZXlzXG4gKiBAcGFyYW0gIHshT2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBzdHJpbmdUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICByZXR1cm4gdG9rZW5zVG9SZWdFeHAocGFyc2UocGF0aCwgb3B0aW9ucyksIGtleXMsIG9wdGlvbnMpXG59XG5cbi8qKlxuICogRXhwb3NlIGEgZnVuY3Rpb24gZm9yIHRha2luZyB0b2tlbnMgYW5kIHJldHVybmluZyBhIFJlZ0V4cC5cbiAqXG4gKiBAcGFyYW0gIHshQXJyYXl9ICAgICAgICAgIHRva2Vuc1xuICogQHBhcmFtICB7KEFycmF5fE9iamVjdCk9fSBrZXlzXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHRva2Vuc1RvUmVnRXhwICh0b2tlbnMsIGtleXMsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc2FycmF5KGtleXMpKSB7XG4gICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKGtleXMgfHwgb3B0aW9ucyk7XG4gICAga2V5cyA9IFtdO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0O1xuICB2YXIgZW5kID0gb3B0aW9ucy5lbmQgIT09IGZhbHNlO1xuICB2YXIgcm91dGUgPSAnJztcblxuICAvLyBJdGVyYXRlIG92ZXIgdGhlIHRva2VucyBhbmQgY3JlYXRlIG91ciByZWdleHAgc3RyaW5nLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTtcblxuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByb3V0ZSArPSBlc2NhcGVTdHJpbmcodG9rZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcHJlZml4ID0gZXNjYXBlU3RyaW5nKHRva2VuLnByZWZpeCk7XG4gICAgICB2YXIgY2FwdHVyZSA9ICcoPzonICsgdG9rZW4ucGF0dGVybiArICcpJztcblxuICAgICAga2V5cy5wdXNoKHRva2VuKTtcblxuICAgICAgaWYgKHRva2VuLnJlcGVhdCkge1xuICAgICAgICBjYXB0dXJlICs9ICcoPzonICsgcHJlZml4ICsgY2FwdHVyZSArICcpKic7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICBpZiAoIXRva2VuLnBhcnRpYWwpIHtcbiAgICAgICAgICBjYXB0dXJlID0gJyg/OicgKyBwcmVmaXggKyAnKCcgKyBjYXB0dXJlICsgJykpPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FwdHVyZSA9IHByZWZpeCArICcoJyArIGNhcHR1cmUgKyAnKT8nO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYXB0dXJlID0gcHJlZml4ICsgJygnICsgY2FwdHVyZSArICcpJztcbiAgICAgIH1cblxuICAgICAgcm91dGUgKz0gY2FwdHVyZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZGVsaW1pdGVyID0gZXNjYXBlU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVyIHx8ICcvJyk7XG4gIHZhciBlbmRzV2l0aERlbGltaXRlciA9IHJvdXRlLnNsaWNlKC1kZWxpbWl0ZXIubGVuZ3RoKSA9PT0gZGVsaW1pdGVyO1xuXG4gIC8vIEluIG5vbi1zdHJpY3QgbW9kZSB3ZSBhbGxvdyBhIHNsYXNoIGF0IHRoZSBlbmQgb2YgbWF0Y2guIElmIHRoZSBwYXRoIHRvXG4gIC8vIG1hdGNoIGFscmVhZHkgZW5kcyB3aXRoIGEgc2xhc2gsIHdlIHJlbW92ZSBpdCBmb3IgY29uc2lzdGVuY3kuIFRoZSBzbGFzaFxuICAvLyBpcyB2YWxpZCBhdCB0aGUgZW5kIG9mIGEgcGF0aCBtYXRjaCwgbm90IGluIHRoZSBtaWRkbGUuIFRoaXMgaXMgaW1wb3J0YW50XG4gIC8vIGluIG5vbi1lbmRpbmcgbW9kZSwgd2hlcmUgXCIvdGVzdC9cIiBzaG91bGRuJ3QgbWF0Y2ggXCIvdGVzdC8vcm91dGVcIi5cbiAgaWYgKCFzdHJpY3QpIHtcbiAgICByb3V0ZSA9IChlbmRzV2l0aERlbGltaXRlciA/IHJvdXRlLnNsaWNlKDAsIC1kZWxpbWl0ZXIubGVuZ3RoKSA6IHJvdXRlKSArICcoPzonICsgZGVsaW1pdGVyICsgJyg/PSQpKT8nO1xuICB9XG5cbiAgaWYgKGVuZCkge1xuICAgIHJvdXRlICs9ICckJztcbiAgfSBlbHNlIHtcbiAgICAvLyBJbiBub24tZW5kaW5nIG1vZGUsIHdlIG5lZWQgdGhlIGNhcHR1cmluZyBncm91cHMgdG8gbWF0Y2ggYXMgbXVjaCBhc1xuICAgIC8vIHBvc3NpYmxlIGJ5IHVzaW5nIGEgcG9zaXRpdmUgbG9va2FoZWFkIHRvIHRoZSBlbmQgb3IgbmV4dCBwYXRoIHNlZ21lbnQuXG4gICAgcm91dGUgKz0gc3RyaWN0ICYmIGVuZHNXaXRoRGVsaW1pdGVyID8gJycgOiAnKD89JyArIGRlbGltaXRlciArICd8JCknO1xuICB9XG5cbiAgcmV0dXJuIGF0dGFjaEtleXMobmV3IFJlZ0V4cCgnXicgKyByb3V0ZSwgZmxhZ3Mob3B0aW9ucykpLCBrZXlzKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgZ2l2ZW4gcGF0aCBzdHJpbmcsIHJldHVybmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBBbiBlbXB0eSBhcnJheSBjYW4gYmUgcGFzc2VkIGluIGZvciB0aGUga2V5cywgd2hpY2ggd2lsbCBob2xkIHRoZVxuICogcGxhY2Vob2xkZXIga2V5IGRlc2NyaXB0aW9ucy4gRm9yIGV4YW1wbGUsIHVzaW5nIGAvdXNlci86aWRgLCBga2V5c2Agd2lsbFxuICogY29udGFpbiBgW3sgbmFtZTogJ2lkJywgZGVsaW1pdGVyOiAnLycsIG9wdGlvbmFsOiBmYWxzZSwgcmVwZWF0OiBmYWxzZSB9XWAuXG4gKlxuICogQHBhcmFtICB7KHN0cmluZ3xSZWdFeHB8QXJyYXkpfSBwYXRoXG4gKiBAcGFyYW0gIHsoQXJyYXl8T2JqZWN0KT19ICAgICAgIGtleXNcbiAqIEBwYXJhbSAge09iamVjdD19ICAgICAgICAgICAgICAgb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gcGF0aFRvUmVnZXhwIChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIGlmICghaXNhcnJheShrZXlzKSkge1xuICAgIG9wdGlvbnMgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovIChrZXlzIHx8IG9wdGlvbnMpO1xuICAgIGtleXMgPSBbXTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChwYXRoIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cFRvUmVnZXhwKHBhdGgsIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cykpXG4gIH1cblxuICBpZiAoaXNhcnJheShwYXRoKSkge1xuICAgIHJldHVybiBhcnJheVRvUmVnZXhwKC8qKiBAdHlwZSB7IUFycmF5fSAqLyAocGF0aCksIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cyksIG9wdGlvbnMpXG4gIH1cblxuICByZXR1cm4gc3RyaW5nVG9SZWdleHAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXRoKSwgLyoqIEB0eXBlIHshQXJyYXl9ICovIChrZXlzKSwgb3B0aW9ucylcbn1cbnBhdGhUb1JlZ2V4cF8xLnBhcnNlID0gcGFyc2VfMTtcbnBhdGhUb1JlZ2V4cF8xLmNvbXBpbGUgPSBjb21waWxlXzE7XG5wYXRoVG9SZWdleHBfMS50b2tlbnNUb0Z1bmN0aW9uID0gdG9rZW5zVG9GdW5jdGlvbl8xO1xucGF0aFRvUmVnZXhwXzEudG9rZW5zVG9SZWdFeHAgPSB0b2tlbnNUb1JlZ0V4cF8xO1xuXG4vKiAgKi9cblxuLy8gJGZsb3ctZGlzYWJsZS1saW5lXG52YXIgcmVnZXhwQ29tcGlsZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuZnVuY3Rpb24gZmlsbFBhcmFtcyAoXG4gIHBhdGgsXG4gIHBhcmFtcyxcbiAgcm91dGVNc2dcbikge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIHRyeSB7XG4gICAgdmFyIGZpbGxlciA9XG4gICAgICByZWdleHBDb21waWxlQ2FjaGVbcGF0aF0gfHxcbiAgICAgIChyZWdleHBDb21waWxlQ2FjaGVbcGF0aF0gPSBwYXRoVG9SZWdleHBfMS5jb21waWxlKHBhdGgpKTtcblxuICAgIC8vIEZpeCAjMjUwNSByZXNvbHZpbmcgYXN0ZXJpc2sgcm91dGVzIHsgbmFtZTogJ25vdC1mb3VuZCcsIHBhcmFtczogeyBwYXRoTWF0Y2g6ICcvbm90LWZvdW5kJyB9fVxuICAgIGlmIChwYXJhbXMucGF0aE1hdGNoKSB7IHBhcmFtc1swXSA9IHBhcmFtcy5wYXRoTWF0Y2g7IH1cblxuICAgIHJldHVybiBmaWxsZXIocGFyYW1zLCB7IHByZXR0eTogdHJ1ZSB9KVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oZmFsc2UsIChcIm1pc3NpbmcgcGFyYW0gZm9yIFwiICsgcm91dGVNc2cgKyBcIjogXCIgKyAoZS5tZXNzYWdlKSkpO1xuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBkZWxldGUgdGhlIDAgaWYgaXQgd2FzIGFkZGVkXG4gICAgZGVsZXRlIHBhcmFtc1swXTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplTG9jYXRpb24gKFxuICByYXcsXG4gIGN1cnJlbnQsXG4gIGFwcGVuZCxcbiAgcm91dGVyXG4pIHtcbiAgdmFyIG5leHQgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJyA/IHsgcGF0aDogcmF3IH0gOiByYXc7XG4gIC8vIG5hbWVkIHRhcmdldFxuICBpZiAobmV4dC5fbm9ybWFsaXplZCkge1xuICAgIHJldHVybiBuZXh0XG4gIH0gZWxzZSBpZiAobmV4dC5uYW1lKSB7XG4gICAgcmV0dXJuIGV4dGVuZCh7fSwgcmF3KVxuICB9XG5cbiAgLy8gcmVsYXRpdmUgcGFyYW1zXG4gIGlmICghbmV4dC5wYXRoICYmIG5leHQucGFyYW1zICYmIGN1cnJlbnQpIHtcbiAgICBuZXh0ID0gZXh0ZW5kKHt9LCBuZXh0KTtcbiAgICBuZXh0Ll9ub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB2YXIgcGFyYW1zID0gZXh0ZW5kKGV4dGVuZCh7fSwgY3VycmVudC5wYXJhbXMpLCBuZXh0LnBhcmFtcyk7XG4gICAgaWYgKGN1cnJlbnQubmFtZSkge1xuICAgICAgbmV4dC5uYW1lID0gY3VycmVudC5uYW1lO1xuICAgICAgbmV4dC5wYXJhbXMgPSBwYXJhbXM7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Lm1hdGNoZWQubGVuZ3RoKSB7XG4gICAgICB2YXIgcmF3UGF0aCA9IGN1cnJlbnQubWF0Y2hlZFtjdXJyZW50Lm1hdGNoZWQubGVuZ3RoIC0gMV0ucGF0aDtcbiAgICAgIG5leHQucGF0aCA9IGZpbGxQYXJhbXMocmF3UGF0aCwgcGFyYW1zLCAoXCJwYXRoIFwiICsgKGN1cnJlbnQucGF0aCkpKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oZmFsc2UsIFwicmVsYXRpdmUgcGFyYW1zIG5hdmlnYXRpb24gcmVxdWlyZXMgYSBjdXJyZW50IHJvdXRlLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRcbiAgfVxuXG4gIHZhciBwYXJzZWRQYXRoID0gcGFyc2VQYXRoKG5leHQucGF0aCB8fCAnJyk7XG4gIHZhciBiYXNlUGF0aCA9IChjdXJyZW50ICYmIGN1cnJlbnQucGF0aCkgfHwgJy8nO1xuICB2YXIgcGF0aCA9IHBhcnNlZFBhdGgucGF0aFxuICAgID8gcmVzb2x2ZVBhdGgocGFyc2VkUGF0aC5wYXRoLCBiYXNlUGF0aCwgYXBwZW5kIHx8IG5leHQuYXBwZW5kKVxuICAgIDogYmFzZVBhdGg7XG5cbiAgdmFyIHF1ZXJ5ID0gcmVzb2x2ZVF1ZXJ5KFxuICAgIHBhcnNlZFBhdGgucXVlcnksXG4gICAgbmV4dC5xdWVyeSxcbiAgICByb3V0ZXIgJiYgcm91dGVyLm9wdGlvbnMucGFyc2VRdWVyeVxuICApO1xuXG4gIHZhciBoYXNoID0gbmV4dC5oYXNoIHx8IHBhcnNlZFBhdGguaGFzaDtcbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykge1xuICAgIGhhc2ggPSBcIiNcIiArIGhhc2g7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIF9ub3JtYWxpemVkOiB0cnVlLFxuICAgIHBhdGg6IHBhdGgsXG4gICAgcXVlcnk6IHF1ZXJ5LFxuICAgIGhhc2g6IGhhc2hcbiAgfVxufVxuXG4vKiAgKi9cblxuLy8gd29yayBhcm91bmQgd2VpcmQgZmxvdyBidWdcbnZhciB0b1R5cGVzID0gW1N0cmluZywgT2JqZWN0XTtcbnZhciBldmVudFR5cGVzID0gW1N0cmluZywgQXJyYXldO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgTGluayA9IHtcbiAgbmFtZTogJ1JvdXRlckxpbmsnLFxuICBwcm9wczoge1xuICAgIHRvOiB7XG4gICAgICB0eXBlOiB0b1R5cGVzLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHRhZzoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2EnXG4gICAgfSxcbiAgICBleGFjdDogQm9vbGVhbixcbiAgICBhcHBlbmQ6IEJvb2xlYW4sXG4gICAgcmVwbGFjZTogQm9vbGVhbixcbiAgICBhY3RpdmVDbGFzczogU3RyaW5nLFxuICAgIGV4YWN0QWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgICBldmVudDoge1xuICAgICAgdHlwZTogZXZlbnRUeXBlcyxcbiAgICAgIGRlZmF1bHQ6ICdjbGljaydcbiAgICB9XG4gIH0sXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyIChoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcm91dGVyID0gdGhpcy4kcm91dGVyO1xuICAgIHZhciBjdXJyZW50ID0gdGhpcy4kcm91dGU7XG4gICAgdmFyIHJlZiA9IHJvdXRlci5yZXNvbHZlKFxuICAgICAgdGhpcy50byxcbiAgICAgIGN1cnJlbnQsXG4gICAgICB0aGlzLmFwcGVuZFxuICAgICk7XG4gICAgdmFyIGxvY2F0aW9uID0gcmVmLmxvY2F0aW9uO1xuICAgIHZhciByb3V0ZSA9IHJlZi5yb3V0ZTtcbiAgICB2YXIgaHJlZiA9IHJlZi5ocmVmO1xuXG4gICAgdmFyIGNsYXNzZXMgPSB7fTtcbiAgICB2YXIgZ2xvYmFsQWN0aXZlQ2xhc3MgPSByb3V0ZXIub3B0aW9ucy5saW5rQWN0aXZlQ2xhc3M7XG4gICAgdmFyIGdsb2JhbEV4YWN0QWN0aXZlQ2xhc3MgPSByb3V0ZXIub3B0aW9ucy5saW5rRXhhY3RBY3RpdmVDbGFzcztcbiAgICAvLyBTdXBwb3J0IGdsb2JhbCBlbXB0eSBhY3RpdmUgY2xhc3NcbiAgICB2YXIgYWN0aXZlQ2xhc3NGYWxsYmFjayA9XG4gICAgICBnbG9iYWxBY3RpdmVDbGFzcyA9PSBudWxsID8gJ3JvdXRlci1saW5rLWFjdGl2ZScgOiBnbG9iYWxBY3RpdmVDbGFzcztcbiAgICB2YXIgZXhhY3RBY3RpdmVDbGFzc0ZhbGxiYWNrID1cbiAgICAgIGdsb2JhbEV4YWN0QWN0aXZlQ2xhc3MgPT0gbnVsbFxuICAgICAgICA/ICdyb3V0ZXItbGluay1leGFjdC1hY3RpdmUnXG4gICAgICAgIDogZ2xvYmFsRXhhY3RBY3RpdmVDbGFzcztcbiAgICB2YXIgYWN0aXZlQ2xhc3MgPVxuICAgICAgdGhpcy5hY3RpdmVDbGFzcyA9PSBudWxsID8gYWN0aXZlQ2xhc3NGYWxsYmFjayA6IHRoaXMuYWN0aXZlQ2xhc3M7XG4gICAgdmFyIGV4YWN0QWN0aXZlQ2xhc3MgPVxuICAgICAgdGhpcy5leGFjdEFjdGl2ZUNsYXNzID09IG51bGxcbiAgICAgICAgPyBleGFjdEFjdGl2ZUNsYXNzRmFsbGJhY2tcbiAgICAgICAgOiB0aGlzLmV4YWN0QWN0aXZlQ2xhc3M7XG5cbiAgICB2YXIgY29tcGFyZVRhcmdldCA9IHJvdXRlLnJlZGlyZWN0ZWRGcm9tXG4gICAgICA/IGNyZWF0ZVJvdXRlKG51bGwsIG5vcm1hbGl6ZUxvY2F0aW9uKHJvdXRlLnJlZGlyZWN0ZWRGcm9tKSwgbnVsbCwgcm91dGVyKVxuICAgICAgOiByb3V0ZTtcblxuICAgIGNsYXNzZXNbZXhhY3RBY3RpdmVDbGFzc10gPSBpc1NhbWVSb3V0ZShjdXJyZW50LCBjb21wYXJlVGFyZ2V0KTtcbiAgICBjbGFzc2VzW2FjdGl2ZUNsYXNzXSA9IHRoaXMuZXhhY3RcbiAgICAgID8gY2xhc3Nlc1tleGFjdEFjdGl2ZUNsYXNzXVxuICAgICAgOiBpc0luY2x1ZGVkUm91dGUoY3VycmVudCwgY29tcGFyZVRhcmdldCk7XG5cbiAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZ3VhcmRFdmVudChlKSkge1xuICAgICAgICBpZiAodGhpcyQxLnJlcGxhY2UpIHtcbiAgICAgICAgICByb3V0ZXIucmVwbGFjZShsb2NhdGlvbiwgbm9vcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcm91dGVyLnB1c2gobG9jYXRpb24sIG5vb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBvbiA9IHsgY2xpY2s6IGd1YXJkRXZlbnQgfTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmV2ZW50KSkge1xuICAgICAgdGhpcy5ldmVudC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIG9uW2VdID0gaGFuZGxlcjtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvblt0aGlzLmV2ZW50XSA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSB7IGNsYXNzOiBjbGFzc2VzIH07XG5cbiAgICB2YXIgc2NvcGVkU2xvdCA9XG4gICAgICAhdGhpcy4kc2NvcGVkU2xvdHMuJGhhc05vcm1hbCAmJlxuICAgICAgdGhpcy4kc2NvcGVkU2xvdHMuZGVmYXVsdCAmJlxuICAgICAgdGhpcy4kc2NvcGVkU2xvdHMuZGVmYXVsdCh7XG4gICAgICAgIGhyZWY6IGhyZWYsXG4gICAgICAgIHJvdXRlOiByb3V0ZSxcbiAgICAgICAgbmF2aWdhdGU6IGhhbmRsZXIsXG4gICAgICAgIGlzQWN0aXZlOiBjbGFzc2VzW2FjdGl2ZUNsYXNzXSxcbiAgICAgICAgaXNFeGFjdEFjdGl2ZTogY2xhc3Nlc1tleGFjdEFjdGl2ZUNsYXNzXVxuICAgICAgfSk7XG5cbiAgICBpZiAoc2NvcGVkU2xvdCkge1xuICAgICAgaWYgKHNjb3BlZFNsb3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBzY29wZWRTbG90WzBdXG4gICAgICB9IGVsc2UgaWYgKHNjb3BlZFNsb3QubGVuZ3RoID4gMSB8fCAhc2NvcGVkU2xvdC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAoXCJSb3V0ZXJMaW5rIHdpdGggdG89XFxcIlwiICsgKHRoaXMucHJvcHMudG8pICsgXCJcXFwiIGlzIHRyeWluZyB0byB1c2UgYSBzY29wZWQgc2xvdCBidXQgaXQgZGlkbid0IHByb3ZpZGUgZXhhY3RseSBvbmUgY2hpbGQuXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NvcGVkU2xvdC5sZW5ndGggPT09IDAgPyBoKCkgOiBoKCdzcGFuJywge30sIHNjb3BlZFNsb3QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFnID09PSAnYScpIHtcbiAgICAgIGRhdGEub24gPSBvbjtcbiAgICAgIGRhdGEuYXR0cnMgPSB7IGhyZWY6IGhyZWYgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZmluZCB0aGUgZmlyc3QgPGE+IGNoaWxkIGFuZCBhcHBseSBsaXN0ZW5lciBhbmQgaHJlZlxuICAgICAgdmFyIGEgPSBmaW5kQW5jaG9yKHRoaXMuJHNsb3RzLmRlZmF1bHQpO1xuICAgICAgaWYgKGEpIHtcbiAgICAgICAgLy8gaW4gY2FzZSB0aGUgPGE+IGlzIGEgc3RhdGljIG5vZGVcbiAgICAgICAgYS5pc1N0YXRpYyA9IGZhbHNlO1xuICAgICAgICB2YXIgYURhdGEgPSAoYS5kYXRhID0gZXh0ZW5kKHt9LCBhLmRhdGEpKTtcbiAgICAgICAgYURhdGEub24gPSBhRGF0YS5vbiB8fCB7fTtcbiAgICAgICAgLy8gdHJhbnNmb3JtIGV4aXN0aW5nIGV2ZW50cyBpbiBib3RoIG9iamVjdHMgaW50byBhcnJheXMgc28gd2UgY2FuIHB1c2ggbGF0ZXJcbiAgICAgICAgZm9yICh2YXIgZXZlbnQgaW4gYURhdGEub24pIHtcbiAgICAgICAgICB2YXIgaGFuZGxlciQxID0gYURhdGEub25bZXZlbnRdO1xuICAgICAgICAgIGlmIChldmVudCBpbiBvbikge1xuICAgICAgICAgICAgYURhdGEub25bZXZlbnRdID0gQXJyYXkuaXNBcnJheShoYW5kbGVyJDEpID8gaGFuZGxlciQxIDogW2hhbmRsZXIkMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGFwcGVuZCBuZXcgbGlzdGVuZXJzIGZvciByb3V0ZXItbGlua1xuICAgICAgICBmb3IgKHZhciBldmVudCQxIGluIG9uKSB7XG4gICAgICAgICAgaWYgKGV2ZW50JDEgaW4gYURhdGEub24pIHtcbiAgICAgICAgICAgIC8vIG9uW2V2ZW50XSBpcyBhbHdheXMgYSBmdW5jdGlvblxuICAgICAgICAgICAgYURhdGEub25bZXZlbnQkMV0ucHVzaChvbltldmVudCQxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFEYXRhLm9uW2V2ZW50JDFdID0gaGFuZGxlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYUF0dHJzID0gKGEuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYS5kYXRhLmF0dHJzKSk7XG4gICAgICAgIGFBdHRycy5ocmVmID0gaHJlZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSA8YT4gY2hpbGQsIGFwcGx5IGxpc3RlbmVyIHRvIHNlbGZcbiAgICAgICAgZGF0YS5vbiA9IG9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoKHRoaXMudGFnLCBkYXRhLCB0aGlzLiRzbG90cy5kZWZhdWx0KVxuICB9XG59O1xuXG5mdW5jdGlvbiBndWFyZEV2ZW50IChlKSB7XG4gIC8vIGRvbid0IHJlZGlyZWN0IHdpdGggY29udHJvbCBrZXlzXG4gIGlmIChlLm1ldGFLZXkgfHwgZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkpIHsgcmV0dXJuIH1cbiAgLy8gZG9uJ3QgcmVkaXJlY3Qgd2hlbiBwcmV2ZW50RGVmYXVsdCBjYWxsZWRcbiAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkgeyByZXR1cm4gfVxuICAvLyBkb24ndCByZWRpcmVjdCBvbiByaWdodCBjbGlja1xuICBpZiAoZS5idXR0b24gIT09IHVuZGVmaW5lZCAmJiBlLmJ1dHRvbiAhPT0gMCkgeyByZXR1cm4gfVxuICAvLyBkb24ndCByZWRpcmVjdCBpZiBgdGFyZ2V0PVwiX2JsYW5rXCJgXG4gIGlmIChlLmN1cnJlbnRUYXJnZXQgJiYgZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSkge1xuICAgIHZhciB0YXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICBpZiAoL1xcYl9ibGFua1xcYi9pLnRlc3QodGFyZ2V0KSkgeyByZXR1cm4gfVxuICB9XG4gIC8vIHRoaXMgbWF5IGJlIGEgV2VleCBldmVudCB3aGljaCBkb2Vzbid0IGhhdmUgdGhpcyBtZXRob2RcbiAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gZmluZEFuY2hvciAoY2hpbGRyZW4pIHtcbiAgaWYgKGNoaWxkcmVuKSB7XG4gICAgdmFyIGNoaWxkO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2hpbGQudGFnID09PSAnYScpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkXG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgKGNoaWxkID0gZmluZEFuY2hvcihjaGlsZC5jaGlsZHJlbikpKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgX1Z1ZTtcblxuZnVuY3Rpb24gaW5zdGFsbCAoVnVlKSB7XG4gIGlmIChpbnN0YWxsLmluc3RhbGxlZCAmJiBfVnVlID09PSBWdWUpIHsgcmV0dXJuIH1cbiAgaW5zdGFsbC5pbnN0YWxsZWQgPSB0cnVlO1xuXG4gIF9WdWUgPSBWdWU7XG5cbiAgdmFyIGlzRGVmID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgIT09IHVuZGVmaW5lZDsgfTtcblxuICB2YXIgcmVnaXN0ZXJJbnN0YW5jZSA9IGZ1bmN0aW9uICh2bSwgY2FsbFZhbCkge1xuICAgIHZhciBpID0gdm0uJG9wdGlvbnMuX3BhcmVudFZub2RlO1xuICAgIGlmIChpc0RlZihpKSAmJiBpc0RlZihpID0gaS5kYXRhKSAmJiBpc0RlZihpID0gaS5yZWdpc3RlclJvdXRlSW5zdGFuY2UpKSB7XG4gICAgICBpKHZtLCBjYWxsVmFsKTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLm1peGluKHtcbiAgICBiZWZvcmVDcmVhdGU6IGZ1bmN0aW9uIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgICBpZiAoaXNEZWYodGhpcy4kb3B0aW9ucy5yb3V0ZXIpKSB7XG4gICAgICAgIHRoaXMuX3JvdXRlclJvb3QgPSB0aGlzO1xuICAgICAgICB0aGlzLl9yb3V0ZXIgPSB0aGlzLiRvcHRpb25zLnJvdXRlcjtcbiAgICAgICAgdGhpcy5fcm91dGVyLmluaXQodGhpcyk7XG4gICAgICAgIFZ1ZS51dGlsLmRlZmluZVJlYWN0aXZlKHRoaXMsICdfcm91dGUnLCB0aGlzLl9yb3V0ZXIuaGlzdG9yeS5jdXJyZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JvdXRlclJvb3QgPSAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5fcm91dGVyUm9vdCkgfHwgdGhpcztcbiAgICAgIH1cbiAgICAgIHJlZ2lzdGVySW5zdGFuY2UodGhpcywgdGhpcyk7XG4gICAgfSxcbiAgICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCAoKSB7XG4gICAgICByZWdpc3Rlckluc3RhbmNlKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckcm91dGVyJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsgcmV0dXJuIHRoaXMuX3JvdXRlclJvb3QuX3JvdXRlciB9XG4gIH0pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJHJvdXRlJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsgcmV0dXJuIHRoaXMuX3JvdXRlclJvb3QuX3JvdXRlIH1cbiAgfSk7XG5cbiAgVnVlLmNvbXBvbmVudCgnUm91dGVyVmlldycsIFZpZXcpO1xuICBWdWUuY29tcG9uZW50KCdSb3V0ZXJMaW5rJywgTGluayk7XG5cbiAgdmFyIHN0cmF0cyA9IFZ1ZS5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO1xuICAvLyB1c2UgdGhlIHNhbWUgaG9vayBtZXJnaW5nIHN0cmF0ZWd5IGZvciByb3V0ZSBob29rc1xuICBzdHJhdHMuYmVmb3JlUm91dGVFbnRlciA9IHN0cmF0cy5iZWZvcmVSb3V0ZUxlYXZlID0gc3RyYXRzLmJlZm9yZVJvdXRlVXBkYXRlID0gc3RyYXRzLmNyZWF0ZWQ7XG59XG5cbi8qICAqL1xuXG52YXIgaW5Ccm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZU1hcCAoXG4gIHJvdXRlcyxcbiAgb2xkUGF0aExpc3QsXG4gIG9sZFBhdGhNYXAsXG4gIG9sZE5hbWVNYXBcbikge1xuICAvLyB0aGUgcGF0aCBsaXN0IGlzIHVzZWQgdG8gY29udHJvbCBwYXRoIG1hdGNoaW5nIHByaW9yaXR5XG4gIHZhciBwYXRoTGlzdCA9IG9sZFBhdGhMaXN0IHx8IFtdO1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgdmFyIHBhdGhNYXAgPSBvbGRQYXRoTWFwIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICB2YXIgbmFtZU1hcCA9IG9sZE5hbWVNYXAgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICByb3V0ZXMuZm9yRWFjaChmdW5jdGlvbiAocm91dGUpIHtcbiAgICBhZGRSb3V0ZVJlY29yZChwYXRoTGlzdCwgcGF0aE1hcCwgbmFtZU1hcCwgcm91dGUpO1xuICB9KTtcblxuICAvLyBlbnN1cmUgd2lsZGNhcmQgcm91dGVzIGFyZSBhbHdheXMgYXQgdGhlIGVuZFxuICBmb3IgKHZhciBpID0gMCwgbCA9IHBhdGhMaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmIChwYXRoTGlzdFtpXSA9PT0gJyonKSB7XG4gICAgICBwYXRoTGlzdC5wdXNoKHBhdGhMaXN0LnNwbGljZShpLCAxKVswXSk7XG4gICAgICBsLS07XG4gICAgICBpLS07XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgLy8gd2FybiBpZiByb3V0ZXMgZG8gbm90IGluY2x1ZGUgbGVhZGluZyBzbGFzaGVzXG4gICAgdmFyIGZvdW5kID0gcGF0aExpc3RcbiAgICAvLyBjaGVjayBmb3IgbWlzc2luZyBsZWFkaW5nIHNsYXNoXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChwYXRoKSB7IHJldHVybiBwYXRoICYmIHBhdGguY2hhckF0KDApICE9PSAnKicgJiYgcGF0aC5jaGFyQXQoMCkgIT09ICcvJzsgfSk7XG5cbiAgICBpZiAoZm91bmQubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHBhdGhOYW1lcyA9IGZvdW5kLm1hcChmdW5jdGlvbiAocGF0aCkgeyByZXR1cm4gKFwiLSBcIiArIHBhdGgpOyB9KS5qb2luKCdcXG4nKTtcbiAgICAgIHdhcm4oZmFsc2UsIChcIk5vbi1uZXN0ZWQgcm91dGVzIG11c3QgaW5jbHVkZSBhIGxlYWRpbmcgc2xhc2ggY2hhcmFjdGVyLiBGaXggdGhlIGZvbGxvd2luZyByb3V0ZXM6IFxcblwiICsgcGF0aE5hbWVzKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoTGlzdDogcGF0aExpc3QsXG4gICAgcGF0aE1hcDogcGF0aE1hcCxcbiAgICBuYW1lTWFwOiBuYW1lTWFwXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkUm91dGVSZWNvcmQgKFxuICBwYXRoTGlzdCxcbiAgcGF0aE1hcCxcbiAgbmFtZU1hcCxcbiAgcm91dGUsXG4gIHBhcmVudCxcbiAgbWF0Y2hBc1xuKSB7XG4gIHZhciBwYXRoID0gcm91dGUucGF0aDtcbiAgdmFyIG5hbWUgPSByb3V0ZS5uYW1lO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydChwYXRoICE9IG51bGwsIFwiXFxcInBhdGhcXFwiIGlzIHJlcXVpcmVkIGluIGEgcm91dGUgY29uZmlndXJhdGlvbi5cIik7XG4gICAgYXNzZXJ0KFxuICAgICAgdHlwZW9mIHJvdXRlLmNvbXBvbmVudCAhPT0gJ3N0cmluZycsXG4gICAgICBcInJvdXRlIGNvbmZpZyBcXFwiY29tcG9uZW50XFxcIiBmb3IgcGF0aDogXCIgKyAoU3RyaW5nKFxuICAgICAgICBwYXRoIHx8IG5hbWVcbiAgICAgICkpICsgXCIgY2Fubm90IGJlIGEgXCIgKyBcInN0cmluZyBpZC4gVXNlIGFuIGFjdHVhbCBjb21wb25lbnQgaW5zdGVhZC5cIlxuICAgICk7XG4gIH1cblxuICB2YXIgcGF0aFRvUmVnZXhwT3B0aW9ucyA9XG4gICAgcm91dGUucGF0aFRvUmVnZXhwT3B0aW9ucyB8fCB7fTtcbiAgdmFyIG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChwYXRoLCBwYXJlbnQsIHBhdGhUb1JlZ2V4cE9wdGlvbnMuc3RyaWN0KTtcblxuICBpZiAodHlwZW9mIHJvdXRlLmNhc2VTZW5zaXRpdmUgPT09ICdib29sZWFuJykge1xuICAgIHBhdGhUb1JlZ2V4cE9wdGlvbnMuc2Vuc2l0aXZlID0gcm91dGUuY2FzZVNlbnNpdGl2ZTtcbiAgfVxuXG4gIHZhciByZWNvcmQgPSB7XG4gICAgcGF0aDogbm9ybWFsaXplZFBhdGgsXG4gICAgcmVnZXg6IGNvbXBpbGVSb3V0ZVJlZ2V4KG5vcm1hbGl6ZWRQYXRoLCBwYXRoVG9SZWdleHBPcHRpb25zKSxcbiAgICBjb21wb25lbnRzOiByb3V0ZS5jb21wb25lbnRzIHx8IHsgZGVmYXVsdDogcm91dGUuY29tcG9uZW50IH0sXG4gICAgaW5zdGFuY2VzOiB7fSxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBhcmVudDogcGFyZW50LFxuICAgIG1hdGNoQXM6IG1hdGNoQXMsXG4gICAgcmVkaXJlY3Q6IHJvdXRlLnJlZGlyZWN0LFxuICAgIGJlZm9yZUVudGVyOiByb3V0ZS5iZWZvcmVFbnRlcixcbiAgICBtZXRhOiByb3V0ZS5tZXRhIHx8IHt9LFxuICAgIHByb3BzOlxuICAgICAgcm91dGUucHJvcHMgPT0gbnVsbFxuICAgICAgICA/IHt9XG4gICAgICAgIDogcm91dGUuY29tcG9uZW50c1xuICAgICAgICAgID8gcm91dGUucHJvcHNcbiAgICAgICAgICA6IHsgZGVmYXVsdDogcm91dGUucHJvcHMgfVxuICB9O1xuXG4gIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgIC8vIFdhcm4gaWYgcm91dGUgaXMgbmFtZWQsIGRvZXMgbm90IHJlZGlyZWN0IGFuZCBoYXMgYSBkZWZhdWx0IGNoaWxkIHJvdXRlLlxuICAgIC8vIElmIHVzZXJzIG5hdmlnYXRlIHRvIHRoaXMgcm91dGUgYnkgbmFtZSwgdGhlIGRlZmF1bHQgY2hpbGQgd2lsbFxuICAgIC8vIG5vdCBiZSByZW5kZXJlZCAoR0ggSXNzdWUgIzYyOSlcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKFxuICAgICAgICByb3V0ZS5uYW1lICYmXG4gICAgICAgICFyb3V0ZS5yZWRpcmVjdCAmJlxuICAgICAgICByb3V0ZS5jaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChjaGlsZCkgeyByZXR1cm4gL15cXC8/JC8udGVzdChjaGlsZC5wYXRoKTsgfSlcbiAgICAgICkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFwiTmFtZWQgUm91dGUgJ1wiICsgKHJvdXRlLm5hbWUpICsgXCInIGhhcyBhIGRlZmF1bHQgY2hpbGQgcm91dGUuIFwiICtcbiAgICAgICAgICAgIFwiV2hlbiBuYXZpZ2F0aW5nIHRvIHRoaXMgbmFtZWQgcm91dGUgKDp0bz1cXFwie25hbWU6ICdcIiArIChyb3V0ZS5uYW1lKSArIFwiJ1xcXCIpLCBcIiArXG4gICAgICAgICAgICBcInRoZSBkZWZhdWx0IGNoaWxkIHJvdXRlIHdpbGwgbm90IGJlIHJlbmRlcmVkLiBSZW1vdmUgdGhlIG5hbWUgZnJvbSBcIiArXG4gICAgICAgICAgICBcInRoaXMgcm91dGUgYW5kIHVzZSB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBjaGlsZCByb3V0ZSBmb3IgbmFtZWQgXCIgK1xuICAgICAgICAgICAgXCJsaW5rcyBpbnN0ZWFkLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJvdXRlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICB2YXIgY2hpbGRNYXRjaEFzID0gbWF0Y2hBc1xuICAgICAgICA/IGNsZWFuUGF0aCgobWF0Y2hBcyArIFwiL1wiICsgKGNoaWxkLnBhdGgpKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBhZGRSb3V0ZVJlY29yZChwYXRoTGlzdCwgcGF0aE1hcCwgbmFtZU1hcCwgY2hpbGQsIHJlY29yZCwgY2hpbGRNYXRjaEFzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmICghcGF0aE1hcFtyZWNvcmQucGF0aF0pIHtcbiAgICBwYXRoTGlzdC5wdXNoKHJlY29yZC5wYXRoKTtcbiAgICBwYXRoTWFwW3JlY29yZC5wYXRoXSA9IHJlY29yZDtcbiAgfVxuXG4gIGlmIChyb3V0ZS5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGFsaWFzZXMgPSBBcnJheS5pc0FycmF5KHJvdXRlLmFsaWFzKSA/IHJvdXRlLmFsaWFzIDogW3JvdXRlLmFsaWFzXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBhbGlhcyA9IGFsaWFzZXNbaV07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBhbGlhcyA9PT0gcGF0aCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIChcIkZvdW5kIGFuIGFsaWFzIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHBhdGg6IFxcXCJcIiArIHBhdGggKyBcIlxcXCIuIFlvdSBoYXZlIHRvIHJlbW92ZSB0aGF0IGFsaWFzLiBJdCB3aWxsIGJlIGlnbm9yZWQgaW4gZGV2ZWxvcG1lbnQuXCIpXG4gICAgICAgICk7XG4gICAgICAgIC8vIHNraXAgaW4gZGV2IHRvIG1ha2UgaXQgd29ya1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB2YXIgYWxpYXNSb3V0ZSA9IHtcbiAgICAgICAgcGF0aDogYWxpYXMsXG4gICAgICAgIGNoaWxkcmVuOiByb3V0ZS5jaGlsZHJlblxuICAgICAgfTtcbiAgICAgIGFkZFJvdXRlUmVjb3JkKFxuICAgICAgICBwYXRoTGlzdCxcbiAgICAgICAgcGF0aE1hcCxcbiAgICAgICAgbmFtZU1hcCxcbiAgICAgICAgYWxpYXNSb3V0ZSxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICByZWNvcmQucGF0aCB8fCAnLycgLy8gbWF0Y2hBc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAobmFtZSkge1xuICAgIGlmICghbmFtZU1hcFtuYW1lXSkge1xuICAgICAgbmFtZU1hcFtuYW1lXSA9IHJlY29yZDtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIW1hdGNoQXMpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBcIkR1cGxpY2F0ZSBuYW1lZCByb3V0ZXMgZGVmaW5pdGlvbjogXCIgK1xuICAgICAgICAgIFwieyBuYW1lOiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiLCBwYXRoOiBcXFwiXCIgKyAocmVjb3JkLnBhdGgpICsgXCJcXFwiIH1cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGlsZVJvdXRlUmVnZXggKFxuICBwYXRoLFxuICBwYXRoVG9SZWdleHBPcHRpb25zXG4pIHtcbiAgdmFyIHJlZ2V4ID0gcGF0aFRvUmVnZXhwXzEocGF0aCwgW10sIHBhdGhUb1JlZ2V4cE9wdGlvbnMpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICByZWdleC5rZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgd2FybihcbiAgICAgICAgIWtleXNba2V5Lm5hbWVdLFxuICAgICAgICAoXCJEdXBsaWNhdGUgcGFyYW0ga2V5cyBpbiByb3V0ZSB3aXRoIHBhdGg6IFxcXCJcIiArIHBhdGggKyBcIlxcXCJcIilcbiAgICAgICk7XG4gICAgICBrZXlzW2tleS5uYW1lXSA9IHRydWU7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlZ2V4XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGggKFxuICBwYXRoLFxuICBwYXJlbnQsXG4gIHN0cmljdFxuKSB7XG4gIGlmICghc3RyaWN0KSB7IHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyQvLCAnJyk7IH1cbiAgaWYgKHBhdGhbMF0gPT09ICcvJykgeyByZXR1cm4gcGF0aCB9XG4gIGlmIChwYXJlbnQgPT0gbnVsbCkgeyByZXR1cm4gcGF0aCB9XG4gIHJldHVybiBjbGVhblBhdGgoKChwYXJlbnQucGF0aCkgKyBcIi9cIiArIHBhdGgpKVxufVxuXG4vKiAgKi9cblxuXG5cbmZ1bmN0aW9uIGNyZWF0ZU1hdGNoZXIgKFxuICByb3V0ZXMsXG4gIHJvdXRlclxuKSB7XG4gIHZhciByZWYgPSBjcmVhdGVSb3V0ZU1hcChyb3V0ZXMpO1xuICB2YXIgcGF0aExpc3QgPSByZWYucGF0aExpc3Q7XG4gIHZhciBwYXRoTWFwID0gcmVmLnBhdGhNYXA7XG4gIHZhciBuYW1lTWFwID0gcmVmLm5hbWVNYXA7XG5cbiAgZnVuY3Rpb24gYWRkUm91dGVzIChyb3V0ZXMpIHtcbiAgICBjcmVhdGVSb3V0ZU1hcChyb3V0ZXMsIHBhdGhMaXN0LCBwYXRoTWFwLCBuYW1lTWFwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hdGNoIChcbiAgICByYXcsXG4gICAgY3VycmVudFJvdXRlLFxuICAgIHJlZGlyZWN0ZWRGcm9tXG4gICkge1xuICAgIHZhciBsb2NhdGlvbiA9IG5vcm1hbGl6ZUxvY2F0aW9uKHJhdywgY3VycmVudFJvdXRlLCBmYWxzZSwgcm91dGVyKTtcbiAgICB2YXIgbmFtZSA9IGxvY2F0aW9uLm5hbWU7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgdmFyIHJlY29yZCA9IG5hbWVNYXBbbmFtZV07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuKHJlY29yZCwgKFwiUm91dGUgd2l0aCBuYW1lICdcIiArIG5hbWUgKyBcIicgZG9lcyBub3QgZXhpc3RcIikpO1xuICAgICAgfVxuICAgICAgaWYgKCFyZWNvcmQpIHsgcmV0dXJuIF9jcmVhdGVSb3V0ZShudWxsLCBsb2NhdGlvbikgfVxuICAgICAgdmFyIHBhcmFtTmFtZXMgPSByZWNvcmQucmVnZXgua2V5c1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuICFrZXkub3B0aW9uYWw7IH0pXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5Lm5hbWU7IH0pO1xuXG4gICAgICBpZiAodHlwZW9mIGxvY2F0aW9uLnBhcmFtcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgbG9jYXRpb24ucGFyYW1zID0ge307XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50Um91dGUgJiYgdHlwZW9mIGN1cnJlbnRSb3V0ZS5wYXJhbXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjdXJyZW50Um91dGUucGFyYW1zKSB7XG4gICAgICAgICAgaWYgKCEoa2V5IGluIGxvY2F0aW9uLnBhcmFtcykgJiYgcGFyYW1OYW1lcy5pbmRleE9mKGtleSkgPiAtMSkge1xuICAgICAgICAgICAgbG9jYXRpb24ucGFyYW1zW2tleV0gPSBjdXJyZW50Um91dGUucGFyYW1zW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvY2F0aW9uLnBhdGggPSBmaWxsUGFyYW1zKHJlY29yZC5wYXRoLCBsb2NhdGlvbi5wYXJhbXMsIChcIm5hbWVkIHJvdXRlIFxcXCJcIiArIG5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShyZWNvcmQsIGxvY2F0aW9uLCByZWRpcmVjdGVkRnJvbSlcbiAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLnBhdGgpIHtcbiAgICAgIGxvY2F0aW9uLnBhcmFtcyA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGF0aCA9IHBhdGhMaXN0W2ldO1xuICAgICAgICB2YXIgcmVjb3JkJDEgPSBwYXRoTWFwW3BhdGhdO1xuICAgICAgICBpZiAobWF0Y2hSb3V0ZShyZWNvcmQkMS5yZWdleCwgbG9jYXRpb24ucGF0aCwgbG9jYXRpb24ucGFyYW1zKSkge1xuICAgICAgICAgIHJldHVybiBfY3JlYXRlUm91dGUocmVjb3JkJDEsIGxvY2F0aW9uLCByZWRpcmVjdGVkRnJvbSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaFxuICAgIHJldHVybiBfY3JlYXRlUm91dGUobnVsbCwgbG9jYXRpb24pXG4gIH1cblxuICBmdW5jdGlvbiByZWRpcmVjdCAoXG4gICAgcmVjb3JkLFxuICAgIGxvY2F0aW9uXG4gICkge1xuICAgIHZhciBvcmlnaW5hbFJlZGlyZWN0ID0gcmVjb3JkLnJlZGlyZWN0O1xuICAgIHZhciByZWRpcmVjdCA9IHR5cGVvZiBvcmlnaW5hbFJlZGlyZWN0ID09PSAnZnVuY3Rpb24nXG4gICAgICA/IG9yaWdpbmFsUmVkaXJlY3QoY3JlYXRlUm91dGUocmVjb3JkLCBsb2NhdGlvbiwgbnVsbCwgcm91dGVyKSlcbiAgICAgIDogb3JpZ2luYWxSZWRpcmVjdDtcblxuICAgIGlmICh0eXBlb2YgcmVkaXJlY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZWRpcmVjdCA9IHsgcGF0aDogcmVkaXJlY3QgfTtcbiAgICB9XG5cbiAgICBpZiAoIXJlZGlyZWN0IHx8IHR5cGVvZiByZWRpcmVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgZmFsc2UsIChcImludmFsaWQgcmVkaXJlY3Qgb3B0aW9uOiBcIiArIChKU09OLnN0cmluZ2lmeShyZWRpcmVjdCkpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShudWxsLCBsb2NhdGlvbilcbiAgICB9XG5cbiAgICB2YXIgcmUgPSByZWRpcmVjdDtcbiAgICB2YXIgbmFtZSA9IHJlLm5hbWU7XG4gICAgdmFyIHBhdGggPSByZS5wYXRoO1xuICAgIHZhciBxdWVyeSA9IGxvY2F0aW9uLnF1ZXJ5O1xuICAgIHZhciBoYXNoID0gbG9jYXRpb24uaGFzaDtcbiAgICB2YXIgcGFyYW1zID0gbG9jYXRpb24ucGFyYW1zO1xuICAgIHF1ZXJ5ID0gcmUuaGFzT3duUHJvcGVydHkoJ3F1ZXJ5JykgPyByZS5xdWVyeSA6IHF1ZXJ5O1xuICAgIGhhc2ggPSByZS5oYXNPd25Qcm9wZXJ0eSgnaGFzaCcpID8gcmUuaGFzaCA6IGhhc2g7XG4gICAgcGFyYW1zID0gcmUuaGFzT3duUHJvcGVydHkoJ3BhcmFtcycpID8gcmUucGFyYW1zIDogcGFyYW1zO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIC8vIHJlc29sdmVkIG5hbWVkIGRpcmVjdFxuICAgICAgdmFyIHRhcmdldFJlY29yZCA9IG5hbWVNYXBbbmFtZV07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBhc3NlcnQodGFyZ2V0UmVjb3JkLCAoXCJyZWRpcmVjdCBmYWlsZWQ6IG5hbWVkIHJvdXRlIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgbm90IGZvdW5kLlwiKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2goe1xuICAgICAgICBfbm9ybWFsaXplZDogdHJ1ZSxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgcXVlcnk6IHF1ZXJ5LFxuICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgfSwgdW5kZWZpbmVkLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKHBhdGgpIHtcbiAgICAgIC8vIDEuIHJlc29sdmUgcmVsYXRpdmUgcmVkaXJlY3RcbiAgICAgIHZhciByYXdQYXRoID0gcmVzb2x2ZVJlY29yZFBhdGgocGF0aCwgcmVjb3JkKTtcbiAgICAgIC8vIDIuIHJlc29sdmUgcGFyYW1zXG4gICAgICB2YXIgcmVzb2x2ZWRQYXRoID0gZmlsbFBhcmFtcyhyYXdQYXRoLCBwYXJhbXMsIChcInJlZGlyZWN0IHJvdXRlIHdpdGggcGF0aCBcXFwiXCIgKyByYXdQYXRoICsgXCJcXFwiXCIpKTtcbiAgICAgIC8vIDMuIHJlbWF0Y2ggd2l0aCBleGlzdGluZyBxdWVyeSBhbmQgaGFzaFxuICAgICAgcmV0dXJuIG1hdGNoKHtcbiAgICAgICAgX25vcm1hbGl6ZWQ6IHRydWUsXG4gICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgcXVlcnk6IHF1ZXJ5LFxuICAgICAgICBoYXNoOiBoYXNoXG4gICAgICB9LCB1bmRlZmluZWQsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuKGZhbHNlLCAoXCJpbnZhbGlkIHJlZGlyZWN0IG9wdGlvbjogXCIgKyAoSlNPTi5zdHJpbmdpZnkocmVkaXJlY3QpKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShudWxsLCBsb2NhdGlvbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhbGlhcyAoXG4gICAgcmVjb3JkLFxuICAgIGxvY2F0aW9uLFxuICAgIG1hdGNoQXNcbiAgKSB7XG4gICAgdmFyIGFsaWFzZWRQYXRoID0gZmlsbFBhcmFtcyhtYXRjaEFzLCBsb2NhdGlvbi5wYXJhbXMsIChcImFsaWFzZWQgcm91dGUgd2l0aCBwYXRoIFxcXCJcIiArIG1hdGNoQXMgKyBcIlxcXCJcIikpO1xuICAgIHZhciBhbGlhc2VkTWF0Y2ggPSBtYXRjaCh7XG4gICAgICBfbm9ybWFsaXplZDogdHJ1ZSxcbiAgICAgIHBhdGg6IGFsaWFzZWRQYXRoXG4gICAgfSk7XG4gICAgaWYgKGFsaWFzZWRNYXRjaCkge1xuICAgICAgdmFyIG1hdGNoZWQgPSBhbGlhc2VkTWF0Y2gubWF0Y2hlZDtcbiAgICAgIHZhciBhbGlhc2VkUmVjb3JkID0gbWF0Y2hlZFttYXRjaGVkLmxlbmd0aCAtIDFdO1xuICAgICAgbG9jYXRpb24ucGFyYW1zID0gYWxpYXNlZE1hdGNoLnBhcmFtcztcbiAgICAgIHJldHVybiBfY3JlYXRlUm91dGUoYWxpYXNlZFJlY29yZCwgbG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBfY3JlYXRlUm91dGUobnVsbCwgbG9jYXRpb24pXG4gIH1cblxuICBmdW5jdGlvbiBfY3JlYXRlUm91dGUgKFxuICAgIHJlY29yZCxcbiAgICBsb2NhdGlvbixcbiAgICByZWRpcmVjdGVkRnJvbVxuICApIHtcbiAgICBpZiAocmVjb3JkICYmIHJlY29yZC5yZWRpcmVjdCkge1xuICAgICAgcmV0dXJuIHJlZGlyZWN0KHJlY29yZCwgcmVkaXJlY3RlZEZyb20gfHwgbG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChyZWNvcmQgJiYgcmVjb3JkLm1hdGNoQXMpIHtcbiAgICAgIHJldHVybiBhbGlhcyhyZWNvcmQsIGxvY2F0aW9uLCByZWNvcmQubWF0Y2hBcylcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVJvdXRlKHJlY29yZCwgbG9jYXRpb24sIHJlZGlyZWN0ZWRGcm9tLCByb3V0ZXIpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hdGNoOiBtYXRjaCxcbiAgICBhZGRSb3V0ZXM6IGFkZFJvdXRlc1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoUm91dGUgKFxuICByZWdleCxcbiAgcGF0aCxcbiAgcGFyYW1zXG4pIHtcbiAgdmFyIG0gPSBwYXRoLm1hdGNoKHJlZ2V4KTtcblxuICBpZiAoIW0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAxLCBsZW4gPSBtLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIGtleSA9IHJlZ2V4LmtleXNbaSAtIDFdO1xuICAgIHZhciB2YWwgPSB0eXBlb2YgbVtpXSA9PT0gJ3N0cmluZycgPyBkZWNvZGVVUklDb21wb25lbnQobVtpXSkgOiBtW2ldO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIC8vIEZpeCAjMTk5NDogdXNpbmcgKiB3aXRoIHByb3BzOiB0cnVlIGdlbmVyYXRlcyBhIHBhcmFtIG5hbWVkIDBcbiAgICAgIHBhcmFtc1trZXkubmFtZSB8fCAncGF0aE1hdGNoJ10gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlY29yZFBhdGggKHBhdGgsIHJlY29yZCkge1xuICByZXR1cm4gcmVzb2x2ZVBhdGgocGF0aCwgcmVjb3JkLnBhcmVudCA/IHJlY29yZC5wYXJlbnQucGF0aCA6ICcvJywgdHJ1ZSlcbn1cblxuLyogICovXG5cbi8vIHVzZSBVc2VyIFRpbWluZyBhcGkgKGlmIHByZXNlbnQpIGZvciBtb3JlIGFjY3VyYXRlIGtleSBwcmVjaXNpb25cbnZhciBUaW1lID1cbiAgaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZSAmJiB3aW5kb3cucGVyZm9ybWFuY2Uubm93XG4gICAgPyB3aW5kb3cucGVyZm9ybWFuY2VcbiAgICA6IERhdGU7XG5cbmZ1bmN0aW9uIGdlblN0YXRlS2V5ICgpIHtcbiAgcmV0dXJuIFRpbWUubm93KCkudG9GaXhlZCgzKVxufVxuXG52YXIgX2tleSA9IGdlblN0YXRlS2V5KCk7XG5cbmZ1bmN0aW9uIGdldFN0YXRlS2V5ICgpIHtcbiAgcmV0dXJuIF9rZXlcbn1cblxuZnVuY3Rpb24gc2V0U3RhdGVLZXkgKGtleSkge1xuICByZXR1cm4gKF9rZXkgPSBrZXkpXG59XG5cbi8qICAqL1xuXG52YXIgcG9zaXRpb25TdG9yZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIHNldHVwU2Nyb2xsICgpIHtcbiAgLy8gRml4IGZvciAjMTU4NSBmb3IgRmlyZWZveFxuICAvLyBGaXggZm9yICMyMTk1IEFkZCBvcHRpb25hbCB0aGlyZCBhdHRyaWJ1dGUgdG8gd29ya2Fyb3VuZCBhIGJ1ZyBpbiBzYWZhcmkgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE4MjY3OFxuICAvLyBGaXggZm9yICMyNzc0IFN1cHBvcnQgZm9yIGFwcHMgbG9hZGVkIGZyb20gV2luZG93cyBmaWxlIHNoYXJlcyBub3QgbWFwcGVkIHRvIG5ldHdvcmsgZHJpdmVzOiByZXBsYWNlZCBsb2NhdGlvbi5vcmlnaW4gd2l0aFxuICAvLyB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3RcbiAgLy8gbG9jYXRpb24uaG9zdCBjb250YWlucyB0aGUgcG9ydCBhbmQgbG9jYXRpb24uaG9zdG5hbWUgZG9lc24ndFxuICB2YXIgcHJvdG9jb2xBbmRQYXRoID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICB2YXIgYWJzb2x1dGVQYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZShwcm90b2NvbEFuZFBhdGgsICcnKTtcbiAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHsga2V5OiBnZXRTdGF0ZUtleSgpIH0sICcnLCBhYnNvbHV0ZVBhdGgpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBmdW5jdGlvbiAoZSkge1xuICAgIHNhdmVTY3JvbGxQb3NpdGlvbigpO1xuICAgIGlmIChlLnN0YXRlICYmIGUuc3RhdGUua2V5KSB7XG4gICAgICBzZXRTdGF0ZUtleShlLnN0YXRlLmtleSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU2Nyb2xsIChcbiAgcm91dGVyLFxuICB0byxcbiAgZnJvbSxcbiAgaXNQb3Bcbikge1xuICBpZiAoIXJvdXRlci5hcHApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBiZWhhdmlvciA9IHJvdXRlci5vcHRpb25zLnNjcm9sbEJlaGF2aW9yO1xuICBpZiAoIWJlaGF2aW9yKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydCh0eXBlb2YgYmVoYXZpb3IgPT09ICdmdW5jdGlvbicsIFwic2Nyb2xsQmVoYXZpb3IgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgLy8gd2FpdCB1bnRpbCByZS1yZW5kZXIgZmluaXNoZXMgYmVmb3JlIHNjcm9sbGluZ1xuICByb3V0ZXIuYXBwLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICB2YXIgc2hvdWxkU2Nyb2xsID0gYmVoYXZpb3IuY2FsbChcbiAgICAgIHJvdXRlcixcbiAgICAgIHRvLFxuICAgICAgZnJvbSxcbiAgICAgIGlzUG9wID8gcG9zaXRpb24gOiBudWxsXG4gICAgKTtcblxuICAgIGlmICghc2hvdWxkU2Nyb2xsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNob3VsZFNjcm9sbC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzaG91bGRTY3JvbGxcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHNob3VsZFNjcm9sbCkge1xuICAgICAgICAgIHNjcm9sbFRvUG9zaXRpb24oKHNob3VsZFNjcm9sbCksIHBvc2l0aW9uKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBlcnIudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbihzaG91bGRTY3JvbGwsIHBvc2l0aW9uKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzYXZlU2Nyb2xsUG9zaXRpb24gKCkge1xuICB2YXIga2V5ID0gZ2V0U3RhdGVLZXkoKTtcbiAgaWYgKGtleSkge1xuICAgIHBvc2l0aW9uU3RvcmVba2V5XSA9IHtcbiAgICAgIHg6IHdpbmRvdy5wYWdlWE9mZnNldCxcbiAgICAgIHk6IHdpbmRvdy5wYWdlWU9mZnNldFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsUG9zaXRpb24gKCkge1xuICB2YXIga2V5ID0gZ2V0U3RhdGVLZXkoKTtcbiAgaWYgKGtleSkge1xuICAgIHJldHVybiBwb3NpdGlvblN0b3JlW2tleV1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50UG9zaXRpb24gKGVsLCBvZmZzZXQpIHtcbiAgdmFyIGRvY0VsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgZG9jUmVjdCA9IGRvY0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgZWxSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiB7XG4gICAgeDogZWxSZWN0LmxlZnQgLSBkb2NSZWN0LmxlZnQgLSBvZmZzZXQueCxcbiAgICB5OiBlbFJlY3QudG9wIC0gZG9jUmVjdC50b3AgLSBvZmZzZXQueVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRQb3NpdGlvbiAob2JqKSB7XG4gIHJldHVybiBpc051bWJlcihvYmoueCkgfHwgaXNOdW1iZXIob2JqLnkpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvc2l0aW9uIChvYmopIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBpc051bWJlcihvYmoueCkgPyBvYmoueCA6IHdpbmRvdy5wYWdlWE9mZnNldCxcbiAgICB5OiBpc051bWJlcihvYmoueSkgPyBvYmoueSA6IHdpbmRvdy5wYWdlWU9mZnNldFxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldCAob2JqKSB7XG4gIHJldHVybiB7XG4gICAgeDogaXNOdW1iZXIob2JqLngpID8gb2JqLnggOiAwLFxuICAgIHk6IGlzTnVtYmVyKG9iai55KSA/IG9iai55IDogMFxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyICh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcidcbn1cblxudmFyIGhhc2hTdGFydHNXaXRoTnVtYmVyUkUgPSAvXiNcXGQvO1xuXG5mdW5jdGlvbiBzY3JvbGxUb1Bvc2l0aW9uIChzaG91bGRTY3JvbGwsIHBvc2l0aW9uKSB7XG4gIHZhciBpc09iamVjdCA9IHR5cGVvZiBzaG91bGRTY3JvbGwgPT09ICdvYmplY3QnO1xuICBpZiAoaXNPYmplY3QgJiYgdHlwZW9mIHNob3VsZFNjcm9sbC5zZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBnZXRFbGVtZW50QnlJZCB3b3VsZCBzdGlsbCBmYWlsIGlmIHRoZSBzZWxlY3RvciBjb250YWlucyBhIG1vcmUgY29tcGxpY2F0ZWQgcXVlcnkgbGlrZSAjbWFpbltkYXRhLWF0dHJdXG4gICAgLy8gYnV0IGF0IHRoZSBzYW1lIHRpbWUsIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHNlbGVjdCBhbiBlbGVtZW50IHdpdGggYW4gaWQgYW5kIGFuIGV4dHJhIHNlbGVjdG9yXG4gICAgdmFyIGVsID0gaGFzaFN0YXJ0c1dpdGhOdW1iZXJSRS50ZXN0KHNob3VsZFNjcm9sbC5zZWxlY3RvcikgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNob3VsZFNjcm9sbC5zZWxlY3Rvci5zbGljZSgxKSkgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2hvdWxkU2Nyb2xsLnNlbGVjdG9yKTtcblxuICAgIGlmIChlbCkge1xuICAgICAgdmFyIG9mZnNldCA9XG4gICAgICAgIHNob3VsZFNjcm9sbC5vZmZzZXQgJiYgdHlwZW9mIHNob3VsZFNjcm9sbC5vZmZzZXQgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBzaG91bGRTY3JvbGwub2Zmc2V0XG4gICAgICAgICAgOiB7fTtcbiAgICAgIG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldChvZmZzZXQpO1xuICAgICAgcG9zaXRpb24gPSBnZXRFbGVtZW50UG9zaXRpb24oZWwsIG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkUG9zaXRpb24oc2hvdWxkU2Nyb2xsKSkge1xuICAgICAgcG9zaXRpb24gPSBub3JtYWxpemVQb3NpdGlvbihzaG91bGRTY3JvbGwpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdCAmJiBpc1ZhbGlkUG9zaXRpb24oc2hvdWxkU2Nyb2xsKSkge1xuICAgIHBvc2l0aW9uID0gbm9ybWFsaXplUG9zaXRpb24oc2hvdWxkU2Nyb2xsKTtcbiAgfVxuXG4gIGlmIChwb3NpdGlvbikge1xuICAgIHdpbmRvdy5zY3JvbGxUbyhwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIHN1cHBvcnRzUHVzaFN0YXRlID1cbiAgaW5Ccm93c2VyICYmXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICBpZiAoXG4gICAgICAodWEuaW5kZXhPZignQW5kcm9pZCAyLicpICE9PSAtMSB8fCB1YS5pbmRleE9mKCdBbmRyb2lkIDQuMCcpICE9PSAtMSkgJiZcbiAgICAgIHVhLmluZGV4T2YoJ01vYmlsZSBTYWZhcmknKSAhPT0gLTEgJiZcbiAgICAgIHVhLmluZGV4T2YoJ0Nocm9tZScpID09PSAtMSAmJlxuICAgICAgdWEuaW5kZXhPZignV2luZG93cyBQaG9uZScpID09PSAtMVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHdpbmRvdy5oaXN0b3J5ICYmICdwdXNoU3RhdGUnIGluIHdpbmRvdy5oaXN0b3J5XG4gIH0pKCk7XG5cbmZ1bmN0aW9uIHB1c2hTdGF0ZSAodXJsLCByZXBsYWNlKSB7XG4gIHNhdmVTY3JvbGxQb3NpdGlvbigpO1xuICAvLyB0cnkuLi5jYXRjaCB0aGUgcHVzaFN0YXRlIGNhbGwgdG8gZ2V0IGFyb3VuZCBTYWZhcmlcbiAgLy8gRE9NIEV4Y2VwdGlvbiAxOCB3aGVyZSBpdCBsaW1pdHMgdG8gMTAwIHB1c2hTdGF0ZSBjYWxsc1xuICB2YXIgaGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5O1xuICB0cnkge1xuICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGtleTogZ2V0U3RhdGVLZXkoKSB9LCAnJywgdXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBrZXk6IHNldFN0YXRlS2V5KGdlblN0YXRlS2V5KCkpIH0sICcnLCB1cmwpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHdpbmRvdy5sb2NhdGlvbltyZXBsYWNlID8gJ3JlcGxhY2UnIDogJ2Fzc2lnbiddKHVybCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVN0YXRlICh1cmwpIHtcbiAgcHVzaFN0YXRlKHVybCwgdHJ1ZSk7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBydW5RdWV1ZSAocXVldWUsIGZuLCBjYikge1xuICB2YXIgc3RlcCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGlmIChpbmRleCA+PSBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChxdWV1ZVtpbmRleF0pIHtcbiAgICAgICAgZm4ocXVldWVbaW5kZXhdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RlcChpbmRleCArIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ZXAoaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHN0ZXAoMCk7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnRzIChtYXRjaGVkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodG8sIGZyb20sIG5leHQpIHtcbiAgICB2YXIgaGFzQXN5bmMgPSBmYWxzZTtcbiAgICB2YXIgcGVuZGluZyA9IDA7XG4gICAgdmFyIGVycm9yID0gbnVsbDtcblxuICAgIGZsYXRNYXBDb21wb25lbnRzKG1hdGNoZWQsIGZ1bmN0aW9uIChkZWYsIF8sIG1hdGNoLCBrZXkpIHtcbiAgICAgIC8vIGlmIGl0J3MgYSBmdW5jdGlvbiBhbmQgZG9lc24ndCBoYXZlIGNpZCBhdHRhY2hlZCxcbiAgICAgIC8vIGFzc3VtZSBpdCdzIGFuIGFzeW5jIGNvbXBvbmVudCByZXNvbHZlIGZ1bmN0aW9uLlxuICAgICAgLy8gd2UgYXJlIG5vdCB1c2luZyBWdWUncyBkZWZhdWx0IGFzeW5jIHJlc29sdmluZyBtZWNoYW5pc20gYmVjYXVzZVxuICAgICAgLy8gd2Ugd2FudCB0byBoYWx0IHRoZSBuYXZpZ2F0aW9uIHVudGlsIHRoZSBpbmNvbWluZyBjb21wb25lbnQgaGFzIGJlZW5cbiAgICAgIC8vIHJlc29sdmVkLlxuICAgICAgaWYgKHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicgJiYgZGVmLmNpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhhc0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgcGVuZGluZysrO1xuXG4gICAgICAgIHZhciByZXNvbHZlID0gb25jZShmdW5jdGlvbiAocmVzb2x2ZWREZWYpIHtcbiAgICAgICAgICBpZiAoaXNFU01vZHVsZShyZXNvbHZlZERlZikpIHtcbiAgICAgICAgICAgIHJlc29sdmVkRGVmID0gcmVzb2x2ZWREZWYuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc2F2ZSByZXNvbHZlZCBvbiBhc3luYyBmYWN0b3J5IGluIGNhc2UgaXQncyB1c2VkIGVsc2V3aGVyZVxuICAgICAgICAgIGRlZi5yZXNvbHZlZCA9IHR5cGVvZiByZXNvbHZlZERlZiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyByZXNvbHZlZERlZlxuICAgICAgICAgICAgOiBfVnVlLmV4dGVuZChyZXNvbHZlZERlZik7XG4gICAgICAgICAgbWF0Y2guY29tcG9uZW50c1trZXldID0gcmVzb2x2ZWREZWY7XG4gICAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICAgIGlmIChwZW5kaW5nIDw9IDApIHtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciByZWplY3QgPSBvbmNlKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcmVzb2x2ZSBhc3luYyBjb21wb25lbnQgXCIgKyBrZXkgKyBcIjogXCIgKyByZWFzb247XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKGZhbHNlLCBtc2cpO1xuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yID0gaXNFcnJvcihyZWFzb24pXG4gICAgICAgICAgICAgID8gcmVhc29uXG4gICAgICAgICAgICAgIDogbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgICBuZXh0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzID0gZGVmKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlcy50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5ldyBzeW50YXggaW4gVnVlIDIuM1xuICAgICAgICAgICAgdmFyIGNvbXAgPSByZXMuY29tcG9uZW50O1xuICAgICAgICAgICAgaWYgKGNvbXAgJiYgdHlwZW9mIGNvbXAudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBjb21wLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaGFzQXN5bmMpIHsgbmV4dCgpOyB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmxhdE1hcENvbXBvbmVudHMgKFxuICBtYXRjaGVkLFxuICBmblxuKSB7XG4gIHJldHVybiBmbGF0dGVuKG1hdGNoZWQubWFwKGZ1bmN0aW9uIChtKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG0uY29tcG9uZW50cykubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGZuKFxuICAgICAgbS5jb21wb25lbnRzW2tleV0sXG4gICAgICBtLmluc3RhbmNlc1trZXldLFxuICAgICAgbSwga2V5XG4gICAgKTsgfSlcbiAgfSkpXG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW4gKGFycikge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgYXJyKVxufVxuXG52YXIgaGFzU3ltYm9sID1cbiAgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJztcblxuZnVuY3Rpb24gaXNFU01vZHVsZSAob2JqKSB7XG4gIHJldHVybiBvYmouX19lc01vZHVsZSB8fCAoaGFzU3ltYm9sICYmIG9ialtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJylcbn1cblxuLy8gaW4gV2VicGFjayAyLCByZXF1aXJlLmVuc3VyZSBub3cgYWxzbyByZXR1cm5zIGEgUHJvbWlzZVxuLy8gc28gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBtYXkgZ2V0IGNhbGxlZCBhbiBleHRyYSB0aW1lXG4vLyBpZiB0aGUgdXNlciB1c2VzIGFuIGFycm93IGZ1bmN0aW9uIHNob3J0aGFuZCB0aGF0IGhhcHBlbnMgdG9cbi8vIHJldHVybiB0aGF0IFByb21pc2UuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgaWYgKGNhbGxlZCkgeyByZXR1cm4gfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gIH1cbn1cblxudmFyIE5hdmlnYXRpb25EdXBsaWNhdGVkID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoRXJyb3IpIHtcbiAgZnVuY3Rpb24gTmF2aWdhdGlvbkR1cGxpY2F0ZWQgKG5vcm1hbGl6ZWRMb2NhdGlvbikge1xuICAgIEVycm9yLmNhbGwodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5fbmFtZSA9ICdOYXZpZ2F0aW9uRHVwbGljYXRlZCc7XG4gICAgLy8gcGFzc2luZyB0aGUgbWVzc2FnZSB0byBzdXBlcigpIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGluIHRoZSB0cmFuc3BpbGVkIHZlcnNpb25cbiAgICB0aGlzLm1lc3NhZ2UgPSBcIk5hdmlnYXRpbmcgdG8gY3VycmVudCBsb2NhdGlvbiAoXFxcIlwiICsgKG5vcm1hbGl6ZWRMb2NhdGlvbi5mdWxsUGF0aCkgKyBcIlxcXCIpIGlzIG5vdCBhbGxvd2VkXCI7XG4gICAgLy8gYWRkIGEgc3RhY2sgcHJvcGVydHkgc28gc2VydmljZXMgbGlrZSBTZW50cnkgY2FuIGNvcnJlY3RseSBkaXNwbGF5IGl0XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzdGFjaycsIHtcbiAgICAgIHZhbHVlOiBuZXcgRXJyb3IoKS5zdGFjayxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLy8gd2UgY291bGQgYWxzbyBoYXZlIHVzZWRcbiAgICAvLyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKVxuICAgIC8vIGJ1dCBpdCBvbmx5IGV4aXN0cyBvbiBub2RlIGFuZCBjaHJvbWVcbiAgfVxuXG4gIGlmICggRXJyb3IgKSBOYXZpZ2F0aW9uRHVwbGljYXRlZC5fX3Byb3RvX18gPSBFcnJvcjtcbiAgTmF2aWdhdGlvbkR1cGxpY2F0ZWQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXJyb3IgJiYgRXJyb3IucHJvdG90eXBlICk7XG4gIE5hdmlnYXRpb25EdXBsaWNhdGVkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE5hdmlnYXRpb25EdXBsaWNhdGVkO1xuXG4gIHJldHVybiBOYXZpZ2F0aW9uRHVwbGljYXRlZDtcbn0oRXJyb3IpKTtcblxuLy8gc3VwcG9ydCBJRTlcbk5hdmlnYXRpb25EdXBsaWNhdGVkLl9uYW1lID0gJ05hdmlnYXRpb25EdXBsaWNhdGVkJztcblxuLyogICovXG5cbnZhciBIaXN0b3J5ID0gZnVuY3Rpb24gSGlzdG9yeSAocm91dGVyLCBiYXNlKSB7XG4gIHRoaXMucm91dGVyID0gcm91dGVyO1xuICB0aGlzLmJhc2UgPSBub3JtYWxpemVCYXNlKGJhc2UpO1xuICAvLyBzdGFydCB3aXRoIGEgcm91dGUgb2JqZWN0IHRoYXQgc3RhbmRzIGZvciBcIm5vd2hlcmVcIlxuICB0aGlzLmN1cnJlbnQgPSBTVEFSVDtcbiAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICB0aGlzLnJlYWR5Q2JzID0gW107XG4gIHRoaXMucmVhZHlFcnJvckNicyA9IFtdO1xuICB0aGlzLmVycm9yQ2JzID0gW107XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbiBsaXN0ZW4gKGNiKSB7XG4gIHRoaXMuY2IgPSBjYjtcbn07XG5cbkhpc3RvcnkucHJvdG90eXBlLm9uUmVhZHkgPSBmdW5jdGlvbiBvblJlYWR5IChjYiwgZXJyb3JDYikge1xuICBpZiAodGhpcy5yZWFkeSkge1xuICAgIGNiKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZWFkeUNicy5wdXNoKGNiKTtcbiAgICBpZiAoZXJyb3JDYikge1xuICAgICAgdGhpcy5yZWFkeUVycm9yQ2JzLnB1c2goZXJyb3JDYik7XG4gICAgfVxuICB9XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gb25FcnJvciAoZXJyb3JDYikge1xuICB0aGlzLmVycm9yQ2JzLnB1c2goZXJyb3JDYik7XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS50cmFuc2l0aW9uVG8gPSBmdW5jdGlvbiB0cmFuc2l0aW9uVG8gKFxuICBsb2NhdGlvbixcbiAgb25Db21wbGV0ZSxcbiAgb25BYm9ydFxuKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIHJvdXRlID0gdGhpcy5yb3V0ZXIubWF0Y2gobG9jYXRpb24sIHRoaXMuY3VycmVudCk7XG4gIHRoaXMuY29uZmlybVRyYW5zaXRpb24oXG4gICAgcm91dGUsXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcyQxLnVwZGF0ZVJvdXRlKHJvdXRlKTtcbiAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgICB0aGlzJDEuZW5zdXJlVVJMKCk7XG5cbiAgICAgIC8vIGZpcmUgcmVhZHkgY2JzIG9uY2VcbiAgICAgIGlmICghdGhpcyQxLnJlYWR5KSB7XG4gICAgICAgIHRoaXMkMS5yZWFkeSA9IHRydWU7XG4gICAgICAgIHRoaXMkMS5yZWFkeUNicy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgIGNiKHJvdXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAob25BYm9ydCkge1xuICAgICAgICBvbkFib3J0KGVycik7XG4gICAgICB9XG4gICAgICBpZiAoZXJyICYmICF0aGlzJDEucmVhZHkpIHtcbiAgICAgICAgdGhpcyQxLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcyQxLnJlYWR5RXJyb3JDYnMuZm9yRWFjaChmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICBjYihlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS5jb25maXJtVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIGNvbmZpcm1UcmFuc2l0aW9uIChyb3V0ZSwgb25Db21wbGV0ZSwgb25BYm9ydCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICB2YXIgYWJvcnQgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgLy8gYWZ0ZXIgbWVyZ2luZyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9wdWxsLzI3NzEgd2VcbiAgICAvLyBXaGVuIHRoZSB1c2VyIG5hdmlnYXRlcyB0aHJvdWdoIGhpc3RvcnkgdGhyb3VnaCBiYWNrL2ZvcndhcmQgYnV0dG9uc1xuICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIHRocm93IHRoZSBlcnJvci4gV2Ugb25seSB0aHJvdyBpdCBpZiBkaXJlY3RseSBjYWxsaW5nXG4gICAgLy8gcHVzaC9yZXBsYWNlLiBUaGF0J3Mgd2h5IGl0J3Mgbm90IGluY2x1ZGVkIGluIGlzRXJyb3JcbiAgICBpZiAoIWlzRXh0ZW5kZWRFcnJvcihOYXZpZ2F0aW9uRHVwbGljYXRlZCwgZXJyKSAmJiBpc0Vycm9yKGVycikpIHtcbiAgICAgIGlmICh0aGlzJDEuZXJyb3JDYnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMkMS5lcnJvckNicy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybihmYWxzZSwgJ3VuY2F1Z2h0IGVycm9yIGR1cmluZyByb3V0ZSBuYXZpZ2F0aW9uOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIG9uQWJvcnQgJiYgb25BYm9ydChlcnIpO1xuICB9O1xuICBpZiAoXG4gICAgaXNTYW1lUm91dGUocm91dGUsIGN1cnJlbnQpICYmXG4gICAgLy8gaW4gdGhlIGNhc2UgdGhlIHJvdXRlIG1hcCBoYXMgYmVlbiBkeW5hbWljYWxseSBhcHBlbmRlZCB0b1xuICAgIHJvdXRlLm1hdGNoZWQubGVuZ3RoID09PSBjdXJyZW50Lm1hdGNoZWQubGVuZ3RoXG4gICkge1xuICAgIHRoaXMuZW5zdXJlVVJMKCk7XG4gICAgcmV0dXJuIGFib3J0KG5ldyBOYXZpZ2F0aW9uRHVwbGljYXRlZChyb3V0ZSkpXG4gIH1cblxuICB2YXIgcmVmID0gcmVzb2x2ZVF1ZXVlKFxuICAgIHRoaXMuY3VycmVudC5tYXRjaGVkLFxuICAgIHJvdXRlLm1hdGNoZWRcbiAgKTtcbiAgICB2YXIgdXBkYXRlZCA9IHJlZi51cGRhdGVkO1xuICAgIHZhciBkZWFjdGl2YXRlZCA9IHJlZi5kZWFjdGl2YXRlZDtcbiAgICB2YXIgYWN0aXZhdGVkID0gcmVmLmFjdGl2YXRlZDtcblxuICB2YXIgcXVldWUgPSBbXS5jb25jYXQoXG4gICAgLy8gaW4tY29tcG9uZW50IGxlYXZlIGd1YXJkc1xuICAgIGV4dHJhY3RMZWF2ZUd1YXJkcyhkZWFjdGl2YXRlZCksXG4gICAgLy8gZ2xvYmFsIGJlZm9yZSBob29rc1xuICAgIHRoaXMucm91dGVyLmJlZm9yZUhvb2tzLFxuICAgIC8vIGluLWNvbXBvbmVudCB1cGRhdGUgaG9va3NcbiAgICBleHRyYWN0VXBkYXRlSG9va3ModXBkYXRlZCksXG4gICAgLy8gaW4tY29uZmlnIGVudGVyIGd1YXJkc1xuICAgIGFjdGl2YXRlZC5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG0uYmVmb3JlRW50ZXI7IH0pLFxuICAgIC8vIGFzeW5jIGNvbXBvbmVudHNcbiAgICByZXNvbHZlQXN5bmNDb21wb25lbnRzKGFjdGl2YXRlZClcbiAgKTtcblxuICB0aGlzLnBlbmRpbmcgPSByb3V0ZTtcbiAgdmFyIGl0ZXJhdG9yID0gZnVuY3Rpb24gKGhvb2ssIG5leHQpIHtcbiAgICBpZiAodGhpcyQxLnBlbmRpbmcgIT09IHJvdXRlKSB7XG4gICAgICByZXR1cm4gYWJvcnQoKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgaG9vayhyb3V0ZSwgY3VycmVudCwgZnVuY3Rpb24gKHRvKSB7XG4gICAgICAgIGlmICh0byA9PT0gZmFsc2UgfHwgaXNFcnJvcih0bykpIHtcbiAgICAgICAgICAvLyBuZXh0KGZhbHNlKSAtPiBhYm9ydCBuYXZpZ2F0aW9uLCBlbnN1cmUgY3VycmVudCBVUkxcbiAgICAgICAgICB0aGlzJDEuZW5zdXJlVVJMKHRydWUpO1xuICAgICAgICAgIGFib3J0KHRvKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0eXBlb2YgdG8gPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgKHR5cGVvZiB0byA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICh0eXBlb2YgdG8ucGF0aCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHRvLm5hbWUgPT09ICdzdHJpbmcnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gbmV4dCgnLycpIG9yIG5leHQoeyBwYXRoOiAnLycgfSkgLT4gcmVkaXJlY3RcbiAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgIGlmICh0eXBlb2YgdG8gPT09ICdvYmplY3QnICYmIHRvLnJlcGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMkMS5yZXBsYWNlKHRvKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcyQxLnB1c2godG8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb25maXJtIHRyYW5zaXRpb24gYW5kIHBhc3Mgb24gdGhlIHZhbHVlXG4gICAgICAgICAgbmV4dCh0byk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFib3J0KGUpO1xuICAgIH1cbiAgfTtcblxuICBydW5RdWV1ZShxdWV1ZSwgaXRlcmF0b3IsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcG9zdEVudGVyQ2JzID0gW107XG4gICAgdmFyIGlzVmFsaWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEuY3VycmVudCA9PT0gcm91dGU7IH07XG4gICAgLy8gd2FpdCB1bnRpbCBhc3luYyBjb21wb25lbnRzIGFyZSByZXNvbHZlZCBiZWZvcmVcbiAgICAvLyBleHRyYWN0aW5nIGluLWNvbXBvbmVudCBlbnRlciBndWFyZHNcbiAgICB2YXIgZW50ZXJHdWFyZHMgPSBleHRyYWN0RW50ZXJHdWFyZHMoYWN0aXZhdGVkLCBwb3N0RW50ZXJDYnMsIGlzVmFsaWQpO1xuICAgIHZhciBxdWV1ZSA9IGVudGVyR3VhcmRzLmNvbmNhdCh0aGlzJDEucm91dGVyLnJlc29sdmVIb29rcyk7XG4gICAgcnVuUXVldWUocXVldWUsIGl0ZXJhdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcyQxLnBlbmRpbmcgIT09IHJvdXRlKSB7XG4gICAgICAgIHJldHVybiBhYm9ydCgpXG4gICAgICB9XG4gICAgICB0aGlzJDEucGVuZGluZyA9IG51bGw7XG4gICAgICBvbkNvbXBsZXRlKHJvdXRlKTtcbiAgICAgIGlmICh0aGlzJDEucm91dGVyLmFwcCkge1xuICAgICAgICB0aGlzJDEucm91dGVyLmFwcC4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBvc3RFbnRlckNicy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuSGlzdG9yeS5wcm90b3R5cGUudXBkYXRlUm91dGUgPSBmdW5jdGlvbiB1cGRhdGVSb3V0ZSAocm91dGUpIHtcbiAgdmFyIHByZXYgPSB0aGlzLmN1cnJlbnQ7XG4gIHRoaXMuY3VycmVudCA9IHJvdXRlO1xuICB0aGlzLmNiICYmIHRoaXMuY2Iocm91dGUpO1xuICB0aGlzLnJvdXRlci5hZnRlckhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgICBob29rICYmIGhvb2socm91dGUsIHByZXYpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUJhc2UgKGJhc2UpIHtcbiAgaWYgKCFiYXNlKSB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgLy8gcmVzcGVjdCA8YmFzZT4gdGFnXG4gICAgICB2YXIgYmFzZUVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpO1xuICAgICAgYmFzZSA9IChiYXNlRWwgJiYgYmFzZUVsLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB8fCAnLyc7XG4gICAgICAvLyBzdHJpcCBmdWxsIFVSTCBvcmlnaW5cbiAgICAgIGJhc2UgPSBiYXNlLnJlcGxhY2UoL15odHRwcz86XFwvXFwvW15cXC9dKy8sICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFzZSA9ICcvJztcbiAgICB9XG4gIH1cbiAgLy8gbWFrZSBzdXJlIHRoZXJlJ3MgdGhlIHN0YXJ0aW5nIHNsYXNoXG4gIGlmIChiYXNlLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgYmFzZSA9ICcvJyArIGJhc2U7XG4gIH1cbiAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoXG4gIHJldHVybiBiYXNlLnJlcGxhY2UoL1xcLyQvLCAnJylcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVF1ZXVlIChcbiAgY3VycmVudCxcbiAgbmV4dFxuKSB7XG4gIHZhciBpO1xuICB2YXIgbWF4ID0gTWF0aC5tYXgoY3VycmVudC5sZW5ndGgsIG5leHQubGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7XG4gICAgaWYgKGN1cnJlbnRbaV0gIT09IG5leHRbaV0pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdXBkYXRlZDogbmV4dC5zbGljZSgwLCBpKSxcbiAgICBhY3RpdmF0ZWQ6IG5leHQuc2xpY2UoaSksXG4gICAgZGVhY3RpdmF0ZWQ6IGN1cnJlbnQuc2xpY2UoaSlcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0R3VhcmRzIChcbiAgcmVjb3JkcyxcbiAgbmFtZSxcbiAgYmluZCxcbiAgcmV2ZXJzZVxuKSB7XG4gIHZhciBndWFyZHMgPSBmbGF0TWFwQ29tcG9uZW50cyhyZWNvcmRzLCBmdW5jdGlvbiAoZGVmLCBpbnN0YW5jZSwgbWF0Y2gsIGtleSkge1xuICAgIHZhciBndWFyZCA9IGV4dHJhY3RHdWFyZChkZWYsIG5hbWUpO1xuICAgIGlmIChndWFyZCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZ3VhcmQpXG4gICAgICAgID8gZ3VhcmQubWFwKGZ1bmN0aW9uIChndWFyZCkgeyByZXR1cm4gYmluZChndWFyZCwgaW5zdGFuY2UsIG1hdGNoLCBrZXkpOyB9KVxuICAgICAgICA6IGJpbmQoZ3VhcmQsIGluc3RhbmNlLCBtYXRjaCwga2V5KVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmbGF0dGVuKHJldmVyc2UgPyBndWFyZHMucmV2ZXJzZSgpIDogZ3VhcmRzKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0R3VhcmQgKFxuICBkZWYsXG4gIGtleVxuKSB7XG4gIGlmICh0eXBlb2YgZGVmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gZXh0ZW5kIG5vdyBzbyB0aGF0IGdsb2JhbCBtaXhpbnMgYXJlIGFwcGxpZWQuXG4gICAgZGVmID0gX1Z1ZS5leHRlbmQoZGVmKTtcbiAgfVxuICByZXR1cm4gZGVmLm9wdGlvbnNba2V5XVxufVxuXG5mdW5jdGlvbiBleHRyYWN0TGVhdmVHdWFyZHMgKGRlYWN0aXZhdGVkKSB7XG4gIHJldHVybiBleHRyYWN0R3VhcmRzKGRlYWN0aXZhdGVkLCAnYmVmb3JlUm91dGVMZWF2ZScsIGJpbmRHdWFyZCwgdHJ1ZSlcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFVwZGF0ZUhvb2tzICh1cGRhdGVkKSB7XG4gIHJldHVybiBleHRyYWN0R3VhcmRzKHVwZGF0ZWQsICdiZWZvcmVSb3V0ZVVwZGF0ZScsIGJpbmRHdWFyZClcbn1cblxuZnVuY3Rpb24gYmluZEd1YXJkIChndWFyZCwgaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGJvdW5kUm91dGVHdWFyZCAoKSB7XG4gICAgICByZXR1cm4gZ3VhcmQuYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cylcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEVudGVyR3VhcmRzIChcbiAgYWN0aXZhdGVkLFxuICBjYnMsXG4gIGlzVmFsaWRcbikge1xuICByZXR1cm4gZXh0cmFjdEd1YXJkcyhcbiAgICBhY3RpdmF0ZWQsXG4gICAgJ2JlZm9yZVJvdXRlRW50ZXInLFxuICAgIGZ1bmN0aW9uIChndWFyZCwgXywgbWF0Y2gsIGtleSkge1xuICAgICAgcmV0dXJuIGJpbmRFbnRlckd1YXJkKGd1YXJkLCBtYXRjaCwga2V5LCBjYnMsIGlzVmFsaWQpXG4gICAgfVxuICApXG59XG5cbmZ1bmN0aW9uIGJpbmRFbnRlckd1YXJkIChcbiAgZ3VhcmQsXG4gIG1hdGNoLFxuICBrZXksXG4gIGNicyxcbiAgaXNWYWxpZFxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiByb3V0ZUVudGVyR3VhcmQgKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgcmV0dXJuIGd1YXJkKHRvLCBmcm9tLCBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2JzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vICM3NTBcbiAgICAgICAgICAvLyBpZiBhIHJvdXRlci12aWV3IGlzIHdyYXBwZWQgd2l0aCBhbiBvdXQtaW4gdHJhbnNpdGlvbixcbiAgICAgICAgICAvLyB0aGUgaW5zdGFuY2UgbWF5IG5vdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBhdCB0aGlzIHRpbWUuXG4gICAgICAgICAgLy8gd2Ugd2lsbCBuZWVkIHRvIHBvbGwgZm9yIHJlZ2lzdHJhdGlvbiB1bnRpbCBjdXJyZW50IHJvdXRlXG4gICAgICAgICAgLy8gaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICAgICAgICAgIHBvbGwoY2IsIG1hdGNoLmluc3RhbmNlcywga2V5LCBpc1ZhbGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBuZXh0KGNiKTtcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvbGwgKFxuICBjYiwgLy8gc29tZWhvdyBmbG93IGNhbm5vdCBpbmZlciB0aGlzIGlzIGEgZnVuY3Rpb25cbiAgaW5zdGFuY2VzLFxuICBrZXksXG4gIGlzVmFsaWRcbikge1xuICBpZiAoXG4gICAgaW5zdGFuY2VzW2tleV0gJiZcbiAgICAhaW5zdGFuY2VzW2tleV0uX2lzQmVpbmdEZXN0cm95ZWQgLy8gZG8gbm90IHJldXNlIGJlaW5nIGRlc3Ryb3llZCBpbnN0YW5jZVxuICApIHtcbiAgICBjYihpbnN0YW5jZXNba2V5XSk7XG4gIH0gZWxzZSBpZiAoaXNWYWxpZCgpKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBwb2xsKGNiLCBpbnN0YW5jZXMsIGtleSwgaXNWYWxpZCk7XG4gICAgfSwgMTYpO1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgSFRNTDVIaXN0b3J5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSGlzdG9yeSkge1xuICBmdW5jdGlvbiBIVE1MNUhpc3RvcnkgKHJvdXRlciwgYmFzZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgSGlzdG9yeS5jYWxsKHRoaXMsIHJvdXRlciwgYmFzZSk7XG5cbiAgICB2YXIgZXhwZWN0U2Nyb2xsID0gcm91dGVyLm9wdGlvbnMuc2Nyb2xsQmVoYXZpb3I7XG4gICAgdmFyIHN1cHBvcnRzU2Nyb2xsID0gc3VwcG9ydHNQdXNoU3RhdGUgJiYgZXhwZWN0U2Nyb2xsO1xuXG4gICAgaWYgKHN1cHBvcnRzU2Nyb2xsKSB7XG4gICAgICBzZXR1cFNjcm9sbCgpO1xuICAgIH1cblxuICAgIHZhciBpbml0TG9jYXRpb24gPSBnZXRMb2NhdGlvbih0aGlzLmJhc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgY3VycmVudCA9IHRoaXMkMS5jdXJyZW50O1xuXG4gICAgICAvLyBBdm9pZGluZyBmaXJzdCBgcG9wc3RhdGVgIGV2ZW50IGRpc3BhdGNoZWQgaW4gc29tZSBicm93c2VycyBidXQgZmlyc3RcbiAgICAgIC8vIGhpc3Rvcnkgcm91dGUgbm90IHVwZGF0ZWQgc2luY2UgYXN5bmMgZ3VhcmQgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgIHZhciBsb2NhdGlvbiA9IGdldExvY2F0aW9uKHRoaXMkMS5iYXNlKTtcbiAgICAgIGlmICh0aGlzJDEuY3VycmVudCA9PT0gU1RBUlQgJiYgbG9jYXRpb24gPT09IGluaXRMb2NhdGlvbikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcyQxLnRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICAgIGlmIChzdXBwb3J0c1Njcm9sbCkge1xuICAgICAgICAgIGhhbmRsZVNjcm9sbChyb3V0ZXIsIHJvdXRlLCBjdXJyZW50LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIEhpc3RvcnkgKSBIVE1MNUhpc3RvcnkuX19wcm90b19fID0gSGlzdG9yeTtcbiAgSFRNTDVIaXN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEhpc3RvcnkgJiYgSGlzdG9yeS5wcm90b3R5cGUgKTtcbiAgSFRNTDVIaXN0b3J5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEhUTUw1SGlzdG9yeTtcblxuICBIVE1MNUhpc3RvcnkucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgICB3aW5kb3cuaGlzdG9yeS5nbyhuKTtcbiAgfTtcblxuICBIVE1MNUhpc3RvcnkucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoIChsb2NhdGlvbiwgb25Db21wbGV0ZSwgb25BYm9ydCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgdmFyIGZyb21Sb3V0ZSA9IHJlZi5jdXJyZW50O1xuICAgIHRoaXMudHJhbnNpdGlvblRvKGxvY2F0aW9uLCBmdW5jdGlvbiAocm91dGUpIHtcbiAgICAgIHB1c2hTdGF0ZShjbGVhblBhdGgodGhpcyQxLmJhc2UgKyByb3V0ZS5mdWxsUGF0aCkpO1xuICAgICAgaGFuZGxlU2Nyb2xsKHRoaXMkMS5yb3V0ZXIsIHJvdXRlLCBmcm9tUm91dGUsIGZhbHNlKTtcbiAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgfSwgb25BYm9ydCk7XG4gIH07XG5cbiAgSFRNTDVIaXN0b3J5LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZSAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciByZWYgPSB0aGlzO1xuICAgIHZhciBmcm9tUm91dGUgPSByZWYuY3VycmVudDtcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICByZXBsYWNlU3RhdGUoY2xlYW5QYXRoKHRoaXMkMS5iYXNlICsgcm91dGUuZnVsbFBhdGgpKTtcbiAgICAgIGhhbmRsZVNjcm9sbCh0aGlzJDEucm91dGVyLCByb3V0ZSwgZnJvbVJvdXRlLCBmYWxzZSk7XG4gICAgICBvbkNvbXBsZXRlICYmIG9uQ29tcGxldGUocm91dGUpO1xuICAgIH0sIG9uQWJvcnQpO1xuICB9O1xuXG4gIEhUTUw1SGlzdG9yeS5wcm90b3R5cGUuZW5zdXJlVVJMID0gZnVuY3Rpb24gZW5zdXJlVVJMIChwdXNoKSB7XG4gICAgaWYgKGdldExvY2F0aW9uKHRoaXMuYmFzZSkgIT09IHRoaXMuY3VycmVudC5mdWxsUGF0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBjbGVhblBhdGgodGhpcy5iYXNlICsgdGhpcy5jdXJyZW50LmZ1bGxQYXRoKTtcbiAgICAgIHB1c2ggPyBwdXNoU3RhdGUoY3VycmVudCkgOiByZXBsYWNlU3RhdGUoY3VycmVudCk7XG4gICAgfVxuICB9O1xuXG4gIEhUTUw1SGlzdG9yeS5wcm90b3R5cGUuZ2V0Q3VycmVudExvY2F0aW9uID0gZnVuY3Rpb24gZ2V0Q3VycmVudExvY2F0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0TG9jYXRpb24odGhpcy5iYXNlKVxuICB9O1xuXG4gIHJldHVybiBIVE1MNUhpc3Rvcnk7XG59KEhpc3RvcnkpKTtcblxuZnVuY3Rpb24gZ2V0TG9jYXRpb24gKGJhc2UpIHtcbiAgdmFyIHBhdGggPSBkZWNvZGVVUkkod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgaWYgKGJhc2UgJiYgcGF0aC5pbmRleE9mKGJhc2UpID09PSAwKSB7XG4gICAgcGF0aCA9IHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpO1xuICB9XG4gIHJldHVybiAocGF0aCB8fCAnLycpICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCArIHdpbmRvdy5sb2NhdGlvbi5oYXNoXG59XG5cbi8qICAqL1xuXG52YXIgSGFzaEhpc3RvcnkgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChIaXN0b3J5KSB7XG4gIGZ1bmN0aW9uIEhhc2hIaXN0b3J5IChyb3V0ZXIsIGJhc2UsIGZhbGxiYWNrKSB7XG4gICAgSGlzdG9yeS5jYWxsKHRoaXMsIHJvdXRlciwgYmFzZSk7XG4gICAgLy8gY2hlY2sgaGlzdG9yeSBmYWxsYmFjayBkZWVwbGlua2luZ1xuICAgIGlmIChmYWxsYmFjayAmJiBjaGVja0ZhbGxiYWNrKHRoaXMuYmFzZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBlbnN1cmVTbGFzaCgpO1xuICB9XG5cbiAgaWYgKCBIaXN0b3J5ICkgSGFzaEhpc3RvcnkuX19wcm90b19fID0gSGlzdG9yeTtcbiAgSGFzaEhpc3RvcnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSGlzdG9yeSAmJiBIaXN0b3J5LnByb3RvdHlwZSApO1xuICBIYXNoSGlzdG9yeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBIYXNoSGlzdG9yeTtcblxuICAvLyB0aGlzIGlzIGRlbGF5ZWQgdW50aWwgdGhlIGFwcCBtb3VudHNcbiAgLy8gdG8gYXZvaWQgdGhlIGhhc2hjaGFuZ2UgbGlzdGVuZXIgYmVpbmcgZmlyZWQgdG9vIGVhcmx5XG4gIEhhc2hIaXN0b3J5LnByb3RvdHlwZS5zZXR1cExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldHVwTGlzdGVuZXJzICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciByb3V0ZXIgPSB0aGlzLnJvdXRlcjtcbiAgICB2YXIgZXhwZWN0U2Nyb2xsID0gcm91dGVyLm9wdGlvbnMuc2Nyb2xsQmVoYXZpb3I7XG4gICAgdmFyIHN1cHBvcnRzU2Nyb2xsID0gc3VwcG9ydHNQdXNoU3RhdGUgJiYgZXhwZWN0U2Nyb2xsO1xuXG4gICAgaWYgKHN1cHBvcnRzU2Nyb2xsKSB7XG4gICAgICBzZXR1cFNjcm9sbCgpO1xuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgc3VwcG9ydHNQdXNoU3RhdGUgPyAncG9wc3RhdGUnIDogJ2hhc2hjaGFuZ2UnLFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMkMS5jdXJyZW50O1xuICAgICAgICBpZiAoIWVuc3VyZVNsYXNoKCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzJDEudHJhbnNpdGlvblRvKGdldEhhc2goKSwgZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICAgICAgaWYgKHN1cHBvcnRzU2Nyb2xsKSB7XG4gICAgICAgICAgICBoYW5kbGVTY3JvbGwodGhpcyQxLnJvdXRlciwgcm91dGUsIGN1cnJlbnQsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1cHBvcnRzUHVzaFN0YXRlKSB7XG4gICAgICAgICAgICByZXBsYWNlSGFzaChyb3V0ZS5mdWxsUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIEhhc2hIaXN0b3J5LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciByZWYgPSB0aGlzO1xuICAgIHZhciBmcm9tUm91dGUgPSByZWYuY3VycmVudDtcbiAgICB0aGlzLnRyYW5zaXRpb25UbyhcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICAgIHB1c2hIYXNoKHJvdXRlLmZ1bGxQYXRoKTtcbiAgICAgICAgaGFuZGxlU2Nyb2xsKHRoaXMkMS5yb3V0ZXIsIHJvdXRlLCBmcm9tUm91dGUsIGZhbHNlKTtcbiAgICAgICAgb25Db21wbGV0ZSAmJiBvbkNvbXBsZXRlKHJvdXRlKTtcbiAgICAgIH0sXG4gICAgICBvbkFib3J0XG4gICAgKTtcbiAgfTtcblxuICBIYXNoSGlzdG9yeS5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2UgKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcmVmID0gdGhpcztcbiAgICB2YXIgZnJvbVJvdXRlID0gcmVmLmN1cnJlbnQ7XG4gICAgdGhpcy50cmFuc2l0aW9uVG8oXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGZ1bmN0aW9uIChyb3V0ZSkge1xuICAgICAgICByZXBsYWNlSGFzaChyb3V0ZS5mdWxsUGF0aCk7XG4gICAgICAgIGhhbmRsZVNjcm9sbCh0aGlzJDEucm91dGVyLCByb3V0ZSwgZnJvbVJvdXRlLCBmYWxzZSk7XG4gICAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgICB9LFxuICAgICAgb25BYm9ydFxuICAgICk7XG4gIH07XG5cbiAgSGFzaEhpc3RvcnkucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgICB3aW5kb3cuaGlzdG9yeS5nbyhuKTtcbiAgfTtcblxuICBIYXNoSGlzdG9yeS5wcm90b3R5cGUuZW5zdXJlVVJMID0gZnVuY3Rpb24gZW5zdXJlVVJMIChwdXNoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQuZnVsbFBhdGg7XG4gICAgaWYgKGdldEhhc2goKSAhPT0gY3VycmVudCkge1xuICAgICAgcHVzaCA/IHB1c2hIYXNoKGN1cnJlbnQpIDogcmVwbGFjZUhhc2goY3VycmVudCk7XG4gICAgfVxuICB9O1xuXG4gIEhhc2hIaXN0b3J5LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb24gPSBmdW5jdGlvbiBnZXRDdXJyZW50TG9jYXRpb24gKCkge1xuICAgIHJldHVybiBnZXRIYXNoKClcbiAgfTtcblxuICByZXR1cm4gSGFzaEhpc3Rvcnk7XG59KEhpc3RvcnkpKTtcblxuZnVuY3Rpb24gY2hlY2tGYWxsYmFjayAoYmFzZSkge1xuICB2YXIgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihiYXNlKTtcbiAgaWYgKCEvXlxcLyMvLnRlc3QobG9jYXRpb24pKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoY2xlYW5QYXRoKGJhc2UgKyAnLyMnICsgbG9jYXRpb24pKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVNsYXNoICgpIHtcbiAgdmFyIHBhdGggPSBnZXRIYXNoKCk7XG4gIGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXBsYWNlSGFzaCgnLycgKyBwYXRoKTtcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGdldEhhc2ggKCkge1xuICAvLyBXZSBjYW4ndCB1c2Ugd2luZG93LmxvY2F0aW9uLmhhc2ggaGVyZSBiZWNhdXNlIGl0J3Mgbm90XG4gIC8vIGNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzIC0gRmlyZWZveCB3aWxsIHByZS1kZWNvZGUgaXQhXG4gIHZhciBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHZhciBpbmRleCA9IGhyZWYuaW5kZXhPZignIycpO1xuICAvLyBlbXB0eSBwYXRoXG4gIGlmIChpbmRleCA8IDApIHsgcmV0dXJuICcnIH1cblxuICBocmVmID0gaHJlZi5zbGljZShpbmRleCArIDEpO1xuICAvLyBkZWNvZGUgdGhlIGhhc2ggYnV0IG5vdCB0aGUgc2VhcmNoIG9yIGhhc2hcbiAgLy8gYXMgc2VhcmNoKHF1ZXJ5KSBpcyBhbHJlYWR5IGRlY29kZWRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1yb3V0ZXIvaXNzdWVzLzI3MDhcbiAgdmFyIHNlYXJjaEluZGV4ID0gaHJlZi5pbmRleE9mKCc/Jyk7XG4gIGlmIChzZWFyY2hJbmRleCA8IDApIHtcbiAgICB2YXIgaGFzaEluZGV4ID0gaHJlZi5pbmRleE9mKCcjJyk7XG4gICAgaWYgKGhhc2hJbmRleCA+IC0xKSB7XG4gICAgICBocmVmID0gZGVjb2RlVVJJKGhyZWYuc2xpY2UoMCwgaGFzaEluZGV4KSkgKyBocmVmLnNsaWNlKGhhc2hJbmRleCk7XG4gICAgfSBlbHNlIHsgaHJlZiA9IGRlY29kZVVSSShocmVmKTsgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzZWFyY2hJbmRleCA+IC0xKSB7XG4gICAgICBocmVmID0gZGVjb2RlVVJJKGhyZWYuc2xpY2UoMCwgc2VhcmNoSW5kZXgpKSArIGhyZWYuc2xpY2Uoc2VhcmNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBocmVmXG59XG5cbmZ1bmN0aW9uIGdldFVybCAocGF0aCkge1xuICB2YXIgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICB2YXIgaSA9IGhyZWYuaW5kZXhPZignIycpO1xuICB2YXIgYmFzZSA9IGkgPj0gMCA/IGhyZWYuc2xpY2UoMCwgaSkgOiBocmVmO1xuICByZXR1cm4gKGJhc2UgKyBcIiNcIiArIHBhdGgpXG59XG5cbmZ1bmN0aW9uIHB1c2hIYXNoIChwYXRoKSB7XG4gIGlmIChzdXBwb3J0c1B1c2hTdGF0ZSkge1xuICAgIHB1c2hTdGF0ZShnZXRVcmwocGF0aCkpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gcGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlSGFzaCAocGF0aCkge1xuICBpZiAoc3VwcG9ydHNQdXNoU3RhdGUpIHtcbiAgICByZXBsYWNlU3RhdGUoZ2V0VXJsKHBhdGgpKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShnZXRVcmwocGF0aCkpO1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgQWJzdHJhY3RIaXN0b3J5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSGlzdG9yeSkge1xuICBmdW5jdGlvbiBBYnN0cmFjdEhpc3RvcnkgKHJvdXRlciwgYmFzZSkge1xuICAgIEhpc3RvcnkuY2FsbCh0aGlzLCByb3V0ZXIsIGJhc2UpO1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICB0aGlzLmluZGV4ID0gLTE7XG4gIH1cblxuICBpZiAoIEhpc3RvcnkgKSBBYnN0cmFjdEhpc3RvcnkuX19wcm90b19fID0gSGlzdG9yeTtcbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEhpc3RvcnkgJiYgSGlzdG9yeS5wcm90b3R5cGUgKTtcbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFic3RyYWN0SGlzdG9yeTtcblxuICBBYnN0cmFjdEhpc3RvcnkucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoIChsb2NhdGlvbiwgb25Db21wbGV0ZSwgb25BYm9ydCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdGhpcy50cmFuc2l0aW9uVG8oXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGZ1bmN0aW9uIChyb3V0ZSkge1xuICAgICAgICB0aGlzJDEuc3RhY2sgPSB0aGlzJDEuc3RhY2suc2xpY2UoMCwgdGhpcyQxLmluZGV4ICsgMSkuY29uY2F0KHJvdXRlKTtcbiAgICAgICAgdGhpcyQxLmluZGV4Kys7XG4gICAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgICB9LFxuICAgICAgb25BYm9ydFxuICAgICk7XG4gIH07XG5cbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZSAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHRoaXMudHJhbnNpdGlvblRvKFxuICAgICAgbG9jYXRpb24sXG4gICAgICBmdW5jdGlvbiAocm91dGUpIHtcbiAgICAgICAgdGhpcyQxLnN0YWNrID0gdGhpcyQxLnN0YWNrLnNsaWNlKDAsIHRoaXMkMS5pbmRleCkuY29uY2F0KHJvdXRlKTtcbiAgICAgICAgb25Db21wbGV0ZSAmJiBvbkNvbXBsZXRlKHJvdXRlKTtcbiAgICAgIH0sXG4gICAgICBvbkFib3J0XG4gICAgKTtcbiAgfTtcblxuICBBYnN0cmFjdEhpc3RvcnkucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciB0YXJnZXRJbmRleCA9IHRoaXMuaW5kZXggKyBuO1xuICAgIGlmICh0YXJnZXRJbmRleCA8IDAgfHwgdGFyZ2V0SW5kZXggPj0gdGhpcy5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgcm91dGUgPSB0aGlzLnN0YWNrW3RhcmdldEluZGV4XTtcbiAgICB0aGlzLmNvbmZpcm1UcmFuc2l0aW9uKFxuICAgICAgcm91dGUsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMkMS5pbmRleCA9IHRhcmdldEluZGV4O1xuICAgICAgICB0aGlzJDEudXBkYXRlUm91dGUocm91dGUpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGlzRXh0ZW5kZWRFcnJvcihOYXZpZ2F0aW9uRHVwbGljYXRlZCwgZXJyKSkge1xuICAgICAgICAgIHRoaXMkMS5pbmRleCA9IHRhcmdldEluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICBBYnN0cmFjdEhpc3RvcnkucHJvdG90eXBlLmdldEN1cnJlbnRMb2NhdGlvbiA9IGZ1bmN0aW9uIGdldEN1cnJlbnRMb2NhdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGN1cnJlbnQgPyBjdXJyZW50LmZ1bGxQYXRoIDogJy8nXG4gIH07XG5cbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZS5lbnN1cmVVUkwgPSBmdW5jdGlvbiBlbnN1cmVVUkwgKCkge1xuICAgIC8vIG5vb3BcbiAgfTtcblxuICByZXR1cm4gQWJzdHJhY3RIaXN0b3J5O1xufShIaXN0b3J5KSk7XG5cbi8qICAqL1xuXG5cblxudmFyIFZ1ZVJvdXRlciA9IGZ1bmN0aW9uIFZ1ZVJvdXRlciAob3B0aW9ucykge1xuICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICB0aGlzLmFwcCA9IG51bGw7XG4gIHRoaXMuYXBwcyA9IFtdO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLmJlZm9yZUhvb2tzID0gW107XG4gIHRoaXMucmVzb2x2ZUhvb2tzID0gW107XG4gIHRoaXMuYWZ0ZXJIb29rcyA9IFtdO1xuICB0aGlzLm1hdGNoZXIgPSBjcmVhdGVNYXRjaGVyKG9wdGlvbnMucm91dGVzIHx8IFtdLCB0aGlzKTtcblxuICB2YXIgbW9kZSA9IG9wdGlvbnMubW9kZSB8fCAnaGFzaCc7XG4gIHRoaXMuZmFsbGJhY2sgPSBtb2RlID09PSAnaGlzdG9yeScgJiYgIXN1cHBvcnRzUHVzaFN0YXRlICYmIG9wdGlvbnMuZmFsbGJhY2sgIT09IGZhbHNlO1xuICBpZiAodGhpcy5mYWxsYmFjaykge1xuICAgIG1vZGUgPSAnaGFzaCc7XG4gIH1cbiAgaWYgKCFpbkJyb3dzZXIpIHtcbiAgICBtb2RlID0gJ2Fic3RyYWN0JztcbiAgfVxuICB0aGlzLm1vZGUgPSBtb2RlO1xuXG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgJ2hpc3RvcnknOlxuICAgICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhUTUw1SGlzdG9yeSh0aGlzLCBvcHRpb25zLmJhc2UpO1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdoYXNoJzpcbiAgICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIYXNoSGlzdG9yeSh0aGlzLCBvcHRpb25zLmJhc2UsIHRoaXMuZmFsbGJhY2spO1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdhYnN0cmFjdCc6XG4gICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgQWJzdHJhY3RIaXN0b3J5KHRoaXMsIG9wdGlvbnMuYmFzZSk7XG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBhc3NlcnQoZmFsc2UsIChcImludmFsaWQgbW9kZTogXCIgKyBtb2RlKSk7XG4gICAgICB9XG4gIH1cbn07XG5cbnZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IGN1cnJlbnRSb3V0ZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gbWF0Y2ggKFxuICByYXcsXG4gIGN1cnJlbnQsXG4gIHJlZGlyZWN0ZWRGcm9tXG4pIHtcbiAgcmV0dXJuIHRoaXMubWF0Y2hlci5tYXRjaChyYXcsIGN1cnJlbnQsIHJlZGlyZWN0ZWRGcm9tKVxufTtcblxucHJvdG90eXBlQWNjZXNzb3JzLmN1cnJlbnRSb3V0ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmhpc3RvcnkgJiYgdGhpcy5oaXN0b3J5LmN1cnJlbnRcbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIGluaXQgKGFwcCAvKiBWdWUgY29tcG9uZW50IGluc3RhbmNlICovKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBhc3NlcnQoXG4gICAgaW5zdGFsbC5pbnN0YWxsZWQsXG4gICAgXCJub3QgaW5zdGFsbGVkLiBNYWtlIHN1cmUgdG8gY2FsbCBgVnVlLnVzZShWdWVSb3V0ZXIpYCBcIiArXG4gICAgXCJiZWZvcmUgY3JlYXRpbmcgcm9vdCBpbnN0YW5jZS5cIlxuICApO1xuXG4gIHRoaXMuYXBwcy5wdXNoKGFwcCk7XG5cbiAgLy8gc2V0IHVwIGFwcCBkZXN0cm95ZWQgaGFuZGxlclxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMjYzOVxuICBhcHAuJG9uY2UoJ2hvb2s6ZGVzdHJveWVkJywgZnVuY3Rpb24gKCkge1xuICAgIC8vIGNsZWFuIG91dCBhcHAgZnJvbSB0aGlzLmFwcHMgYXJyYXkgb25jZSBkZXN0cm95ZWRcbiAgICB2YXIgaW5kZXggPSB0aGlzJDEuYXBwcy5pbmRleE9mKGFwcCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHsgdGhpcyQxLmFwcHMuc3BsaWNlKGluZGV4LCAxKTsgfVxuICAgIC8vIGVuc3VyZSB3ZSBzdGlsbCBoYXZlIGEgbWFpbiBhcHAgb3IgbnVsbCBpZiBubyBhcHBzXG4gICAgLy8gd2UgZG8gbm90IHJlbGVhc2UgdGhlIHJvdXRlciBzbyBpdCBjYW4gYmUgcmV1c2VkXG4gICAgaWYgKHRoaXMkMS5hcHAgPT09IGFwcCkgeyB0aGlzJDEuYXBwID0gdGhpcyQxLmFwcHNbMF0gfHwgbnVsbDsgfVxuICB9KTtcblxuICAvLyBtYWluIGFwcCBwcmV2aW91c2x5IGluaXRpYWxpemVkXG4gIC8vIHJldHVybiBhcyB3ZSBkb24ndCBuZWVkIHRvIHNldCB1cCBuZXcgaGlzdG9yeSBsaXN0ZW5lclxuICBpZiAodGhpcy5hcHApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRoaXMuYXBwID0gYXBwO1xuXG4gIHZhciBoaXN0b3J5ID0gdGhpcy5oaXN0b3J5O1xuXG4gIGlmIChoaXN0b3J5IGluc3RhbmNlb2YgSFRNTDVIaXN0b3J5KSB7XG4gICAgaGlzdG9yeS50cmFuc2l0aW9uVG8oaGlzdG9yeS5nZXRDdXJyZW50TG9jYXRpb24oKSk7XG4gIH0gZWxzZSBpZiAoaGlzdG9yeSBpbnN0YW5jZW9mIEhhc2hIaXN0b3J5KSB7XG4gICAgdmFyIHNldHVwSGFzaExpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgaGlzdG9yeS5zZXR1cExpc3RlbmVycygpO1xuICAgIH07XG4gICAgaGlzdG9yeS50cmFuc2l0aW9uVG8oXG4gICAgICBoaXN0b3J5LmdldEN1cnJlbnRMb2NhdGlvbigpLFxuICAgICAgc2V0dXBIYXNoTGlzdGVuZXIsXG4gICAgICBzZXR1cEhhc2hMaXN0ZW5lclxuICAgICk7XG4gIH1cblxuICBoaXN0b3J5Lmxpc3RlbihmdW5jdGlvbiAocm91dGUpIHtcbiAgICB0aGlzJDEuYXBwcy5mb3JFYWNoKGZ1bmN0aW9uIChhcHApIHtcbiAgICAgIGFwcC5fcm91dGUgPSByb3V0ZTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLmJlZm9yZUVhY2ggPSBmdW5jdGlvbiBiZWZvcmVFYWNoIChmbikge1xuICByZXR1cm4gcmVnaXN0ZXJIb29rKHRoaXMuYmVmb3JlSG9va3MsIGZuKVxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5iZWZvcmVSZXNvbHZlID0gZnVuY3Rpb24gYmVmb3JlUmVzb2x2ZSAoZm4pIHtcbiAgcmV0dXJuIHJlZ2lzdGVySG9vayh0aGlzLnJlc29sdmVIb29rcywgZm4pXG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLmFmdGVyRWFjaCA9IGZ1bmN0aW9uIGFmdGVyRWFjaCAoZm4pIHtcbiAgcmV0dXJuIHJlZ2lzdGVySG9vayh0aGlzLmFmdGVySG9va3MsIGZuKVxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5vblJlYWR5ID0gZnVuY3Rpb24gb25SZWFkeSAoY2IsIGVycm9yQ2IpIHtcbiAgdGhpcy5oaXN0b3J5Lm9uUmVhZHkoY2IsIGVycm9yQ2IpO1xufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gb25FcnJvciAoZXJyb3JDYikge1xuICB0aGlzLmhpc3Rvcnkub25FcnJvcihlcnJvckNiKTtcbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2ggKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIGlmICghb25Db21wbGV0ZSAmJiAhb25BYm9ydCAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdGhpcyQxLmhpc3RvcnkucHVzaChsb2NhdGlvbiwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRoaXMuaGlzdG9yeS5wdXNoKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KTtcbiAgfVxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZSAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgaWYgKCFvbkNvbXBsZXRlICYmICFvbkFib3J0ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB0aGlzJDEuaGlzdG9yeS5yZXBsYWNlKGxvY2F0aW9uLCByZXNvbHZlLCByZWplY3QpO1xuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5oaXN0b3J5LnJlcGxhY2UobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpO1xuICB9XG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgdGhpcy5oaXN0b3J5LmdvKG4pO1xufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5iYWNrID0gZnVuY3Rpb24gYmFjayAoKSB7XG4gIHRoaXMuZ28oLTEpO1xufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5mb3J3YXJkID0gZnVuY3Rpb24gZm9yd2FyZCAoKSB7XG4gIHRoaXMuZ28oMSk7XG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLmdldE1hdGNoZWRDb21wb25lbnRzID0gZnVuY3Rpb24gZ2V0TWF0Y2hlZENvbXBvbmVudHMgKHRvKSB7XG4gIHZhciByb3V0ZSA9IHRvXG4gICAgPyB0by5tYXRjaGVkXG4gICAgICA/IHRvXG4gICAgICA6IHRoaXMucmVzb2x2ZSh0bykucm91dGVcbiAgICA6IHRoaXMuY3VycmVudFJvdXRlO1xuICBpZiAoIXJvdXRlKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgcm91dGUubWF0Y2hlZC5tYXAoZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobS5jb21wb25lbnRzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIG0uY29tcG9uZW50c1trZXldXG4gICAgfSlcbiAgfSkpXG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlIChcbiAgdG8sXG4gIGN1cnJlbnQsXG4gIGFwcGVuZFxuKSB7XG4gIGN1cnJlbnQgPSBjdXJyZW50IHx8IHRoaXMuaGlzdG9yeS5jdXJyZW50O1xuICB2YXIgbG9jYXRpb24gPSBub3JtYWxpemVMb2NhdGlvbihcbiAgICB0byxcbiAgICBjdXJyZW50LFxuICAgIGFwcGVuZCxcbiAgICB0aGlzXG4gICk7XG4gIHZhciByb3V0ZSA9IHRoaXMubWF0Y2gobG9jYXRpb24sIGN1cnJlbnQpO1xuICB2YXIgZnVsbFBhdGggPSByb3V0ZS5yZWRpcmVjdGVkRnJvbSB8fCByb3V0ZS5mdWxsUGF0aDtcbiAgdmFyIGJhc2UgPSB0aGlzLmhpc3RvcnkuYmFzZTtcbiAgdmFyIGhyZWYgPSBjcmVhdGVIcmVmKGJhc2UsIGZ1bGxQYXRoLCB0aGlzLm1vZGUpO1xuICByZXR1cm4ge1xuICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICByb3V0ZTogcm91dGUsXG4gICAgaHJlZjogaHJlZixcbiAgICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdFxuICAgIG5vcm1hbGl6ZWRUbzogbG9jYXRpb24sXG4gICAgcmVzb2x2ZWQ6IHJvdXRlXG4gIH1cbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUuYWRkUm91dGVzID0gZnVuY3Rpb24gYWRkUm91dGVzIChyb3V0ZXMpIHtcbiAgdGhpcy5tYXRjaGVyLmFkZFJvdXRlcyhyb3V0ZXMpO1xuICBpZiAodGhpcy5oaXN0b3J5LmN1cnJlbnQgIT09IFNUQVJUKSB7XG4gICAgdGhpcy5oaXN0b3J5LnRyYW5zaXRpb25Ubyh0aGlzLmhpc3RvcnkuZ2V0Q3VycmVudExvY2F0aW9uKCkpO1xuICB9XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVnVlUm91dGVyLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVySG9vayAobGlzdCwgZm4pIHtcbiAgbGlzdC5wdXNoKGZuKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaSA9IGxpc3QuaW5kZXhPZihmbik7XG4gICAgaWYgKGkgPiAtMSkgeyBsaXN0LnNwbGljZShpLCAxKTsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhyZWYgKGJhc2UsIGZ1bGxQYXRoLCBtb2RlKSB7XG4gIHZhciBwYXRoID0gbW9kZSA9PT0gJ2hhc2gnID8gJyMnICsgZnVsbFBhdGggOiBmdWxsUGF0aDtcbiAgcmV0dXJuIGJhc2UgPyBjbGVhblBhdGgoYmFzZSArICcvJyArIHBhdGgpIDogcGF0aFxufVxuXG5WdWVSb3V0ZXIuaW5zdGFsbCA9IGluc3RhbGw7XG5WdWVSb3V0ZXIudmVyc2lvbiA9ICczLjEuMyc7XG5cbmlmIChpbkJyb3dzZXIgJiYgd2luZG93LlZ1ZSkge1xuICB3aW5kb3cuVnVlLnVzZShWdWVSb3V0ZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBWdWVSb3V0ZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-router@3.1.3@vue-router/dist/vue-router.esm.js\n");

/***/ }),

/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=style&index=0&lang=scss& ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"07db42f3\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\", function() {\n     var newContent = __webpack_require__(/*! !../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT8wNjJmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9BcHAudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmbGFuZz1zY3NzJlwiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgYWRkID0gcmVxdWlyZShcIiEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCIwN2RiNDJmM1wiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0FwcC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZsYW5nPXNjc3MmXCIsIGZ1bmN0aW9uKCkge1xuICAgICB2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0FwcC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZsYW5nPXNjc3MmXCIpO1xuICAgICBpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcbiAgICAgdXBkYXRlKG5ld0NvbnRlbnQpO1xuICAgfSk7XG4gfVxuIC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3NcbiBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\n");

/***/ }),

/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&":
/*!**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& ***!
  \**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"4d682107\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\", function() {\n     var newContent = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT8xNmNkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0zYjRmMzVhZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCIpO1xuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcbi8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cbnZhciBhZGQgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXNDbGllbnQuanNcIikuZGVmYXVsdFxudmFyIHVwZGF0ZSA9IGFkZChcIjRkNjgyMTA3XCIsIGNvbnRlbnQsIGZhbHNlLCB7XCJzb3VyY2VNYXBcIjpmYWxzZSxcInNoYWRvd01vZGVcIjpmYWxzZX0pO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuIC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG4gaWYoIWNvbnRlbnQubG9jYWxzKSB7XG4gICBtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9M2I0ZjM1YWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0zYjRmMzVhZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCIpO1xuICAgICBpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcbiAgICAgdXBkYXRlKG5ld0NvbnRlbnQpO1xuICAgfSk7XG4gfVxuIC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3NcbiBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&":
/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& ***!
  \******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"63df74aa\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\", function() {\n     var newContent = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/ZDk1NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZm9vdGVyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPWY2NzhmYzIyJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlc0NsaWVudC5qc1wiKS5kZWZhdWx0XG52YXIgdXBkYXRlID0gYWRkKFwiNjNkZjc0YWFcIiwgY29udGVudCwgZmFsc2UsIHtcInNvdXJjZU1hcFwiOmZhbHNlLFwic2hhZG93TW9kZVwiOmZhbHNlfSk7XG4vLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5pZihtb2R1bGUuaG90KSB7XG4gLy8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3NcbiBpZighY29udGVudC5sb2NhbHMpIHtcbiAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbiAgICAgaWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG4gICAgIHVwZGF0ZShuZXdDb250ZW50KTtcbiAgIH0pO1xuIH1cbiAvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG4gbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&":
/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& ***!
  \******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"3568dd4b\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\", function() {\n     var newContent = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/OWVlNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vaGVhZGVyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTZmYmE4ZGFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxudmFyIGFkZCA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlc0NsaWVudC5qc1wiKS5kZWZhdWx0XG52YXIgdXBkYXRlID0gYWRkKFwiMzU2OGRkNGJcIiwgY29udGVudCwgZmFsc2UsIHtcInNvdXJjZU1hcFwiOmZhbHNlLFwic2hhZG93TW9kZVwiOmZhbHNlfSk7XG4vLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5pZihtb2R1bGUuaG90KSB7XG4gLy8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3NcbiBpZighY29udGVudC5sb2NhbHMpIHtcbiAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbiAgICAgaWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG4gICAgIHVwZGF0ZShuZXdDb250ZW50KTtcbiAgIH0pO1xuIH1cbiAvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG4gbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&":
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"4f0b2316\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\", function() {\n     var newContent = __webpack_require__(/*! !../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wNGM1NWUyZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlP2MxMTYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblxuLy8gbG9hZCB0aGUgc3R5bGVzXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL20tZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MDRjNTVlMmYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgYWRkID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCI0ZjBiMjMxNlwiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL20tZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MDRjNTVlMmYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiLCBmdW5jdGlvbigpIHtcbiAgICAgdmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTA0YzU1ZTJmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIik7XG4gICAgIGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuICAgICB1cGRhdGUobmV3Q29udGVudCk7XG4gICB9KTtcbiB9XG4gLy8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuIG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&":
/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& ***!
  \******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"c0b7fb5c\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(true) {\n // When the styles change, update the <style> tags\n if(!content.locals) {\n   module.hot.accept(/*! !../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\", function() {\n     var newContent = __webpack_require__(/*! !../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\");\n     if(typeof newContent === 'string') newContent = [[module.i, newContent, '']];\n     update(newContent);\n   });\n }\n // When the module is disposed, remove the <style> tags\n module.hot.dispose(function() { update(); });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8hLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/IS4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8hLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/IS4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8hLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/MTEwNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXG4vLyBsb2FkIHRoZSBzdHlsZXNcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgYWRkID0gcmVxdWlyZShcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzXCIpLmRlZmF1bHRcbnZhciB1cGRhdGUgPSBhZGQoXCJjMGI3ZmI1Y1wiLCBjb250ZW50LCBmYWxzZSwge1wic291cmNlTWFwXCI6ZmFsc2UsXCJzaGFkb3dNb2RlXCI6ZmFsc2V9KTtcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcbiAvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuIGlmKCFjb250ZW50LmxvY2Fscykge1xuICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTFiYWRjODAxJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24oKSB7XG4gICAgIHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiKTtcbiAgICAgaWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG4gICAgIHVwZGF0ZShuZXdDb250ZW50KTtcbiAgIH0pO1xuIH1cbiAvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG4gbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js":
/*!**************************************************************************************!*\
  !*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js ***!
  \**************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return addStylesClient; });\n/* harmony import */ var _listToStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./listToStyles */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/listToStyles.js\");\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n  Modified by Evan You @yyx990803\n*/\n\n\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n  if (!hasDocument) {\n    throw new Error(\n    'vue-style-loader cannot be used in a non-browser environment. ' +\n    \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n  ) }\n}\n\n/*\ntype StyleObject = {\n  id: number;\n  parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n  css: string;\n  media: string;\n  sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n  [id: number]: {\n    id: number,\n    refs: number,\n    parts: Array<(obj?: StyleObjectPart) => void>\n  }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nfunction addStylesClient (parentId, list, _isProduction, _options) {\n  isProduction = _isProduction\n\n  options = _options || {}\n\n  var styles = Object(_listToStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(parentId, list)\n  addStylesToDom(styles)\n\n  return function update (newList) {\n    var mayRemove = []\n    for (var i = 0; i < styles.length; i++) {\n      var item = styles[i]\n      var domStyle = stylesInDom[item.id]\n      domStyle.refs--\n      mayRemove.push(domStyle)\n    }\n    if (newList) {\n      styles = Object(_listToStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(parentId, newList)\n      addStylesToDom(styles)\n    } else {\n      styles = []\n    }\n    for (var i = 0; i < mayRemove.length; i++) {\n      var domStyle = mayRemove[i]\n      if (domStyle.refs === 0) {\n        for (var j = 0; j < domStyle.parts.length; j++) {\n          domStyle.parts[j]()\n        }\n        delete stylesInDom[domStyle.id]\n      }\n    }\n  }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n  for (var i = 0; i < styles.length; i++) {\n    var item = styles[i]\n    var domStyle = stylesInDom[item.id]\n    if (domStyle) {\n      domStyle.refs++\n      for (var j = 0; j < domStyle.parts.length; j++) {\n        domStyle.parts[j](item.parts[j])\n      }\n      for (; j < item.parts.length; j++) {\n        domStyle.parts.push(addStyle(item.parts[j]))\n      }\n      if (domStyle.parts.length > item.parts.length) {\n        domStyle.parts.length = item.parts.length\n      }\n    } else {\n      var parts = []\n      for (var j = 0; j < item.parts.length; j++) {\n        parts.push(addStyle(item.parts[j]))\n      }\n      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n    }\n  }\n}\n\nfunction createStyleElement () {\n  var styleElement = document.createElement('style')\n  styleElement.type = 'text/css'\n  head.appendChild(styleElement)\n  return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n  var update, remove\n  var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n  if (styleElement) {\n    if (isProduction) {\n      // has SSR styles and in production mode.\n      // simply do nothing.\n      return noop\n    } else {\n      // has SSR styles but in dev mode.\n      // for some reason Chrome can't handle source map in server-rendered\n      // style tags - source maps in <style> only works if the style tag is\n      // created and inserted dynamically. So we remove the server rendered\n      // styles and inject new ones.\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  if (isOldIE) {\n    // use singleton mode for IE9.\n    var styleIndex = singletonCounter++\n    styleElement = singletonElement || (singletonElement = createStyleElement())\n    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n  } else {\n    // use multi-style-tag mode in all other cases\n    styleElement = createStyleElement()\n    update = applyToTag.bind(null, styleElement)\n    remove = function () {\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  update(obj)\n\n  return function updateStyle (newObj /* StyleObjectPart */) {\n    if (newObj) {\n      if (newObj.css === obj.css &&\n          newObj.media === obj.media &&\n          newObj.sourceMap === obj.sourceMap) {\n        return\n      }\n      update(obj = newObj)\n    } else {\n      remove()\n    }\n  }\n}\n\nvar replaceText = (function () {\n  var textStore = []\n\n  return function (index, replacement) {\n    textStore[index] = replacement\n    return textStore.filter(Boolean).join('\\n')\n  }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n  var css = remove ? '' : obj.css\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = replaceText(index, css)\n  } else {\n    var cssNode = document.createTextNode(css)\n    var childNodes = styleElement.childNodes\n    if (childNodes[index]) styleElement.removeChild(childNodes[index])\n    if (childNodes.length) {\n      styleElement.insertBefore(cssNode, childNodes[index])\n    } else {\n      styleElement.appendChild(cssNode)\n    }\n  }\n}\n\nfunction applyToTag (styleElement, obj) {\n  var css = obj.css\n  var media = obj.media\n  var sourceMap = obj.sourceMap\n\n  if (media) {\n    styleElement.setAttribute('media', media)\n  }\n  if (options.ssrId) {\n    styleElement.setAttribute(ssrIdKey, obj.id)\n  }\n\n  if (sourceMap) {\n    // https://developer.chrome.com/devtools/docs/javascript-debugging\n    // this makes source maps inside style tags work properly in Chrome\n    css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n    // http://stackoverflow.com/a/26603875\n    css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n  }\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = css\n  } else {\n    while (styleElement.firstChild) {\n      styleElement.removeChild(styleElement.firstChild)\n    }\n    styleElement.appendChild(document.createTextNode(css))\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzQ2xpZW50LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlc0NsaWVudC5qcz84NWNiIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiAgTW9kaWZpZWQgYnkgRXZhbiBZb3UgQHl5eDk5MDgwM1xuKi9cblxuaW1wb3J0IGxpc3RUb1N0eWxlcyBmcm9tICcuL2xpc3RUb1N0eWxlcydcblxudmFyIGhhc0RvY3VtZW50ID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG5pZiAodHlwZW9mIERFQlVHICE9PSAndW5kZWZpbmVkJyAmJiBERUJVRykge1xuICBpZiAoIWhhc0RvY3VtZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2dWUtc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQuICcgK1xuICAgIFwiVXNlIHsgdGFyZ2V0OiAnbm9kZScgfSBpbiB5b3VyIFdlYnBhY2sgY29uZmlnIHRvIGluZGljYXRlIGEgc2VydmVyLXJlbmRlcmluZyBlbnZpcm9ubWVudC5cIlxuICApIH1cbn1cblxuLypcbnR5cGUgU3R5bGVPYmplY3QgPSB7XG4gIGlkOiBudW1iZXI7XG4gIHBhcnRzOiBBcnJheTxTdHlsZU9iamVjdFBhcnQ+XG59XG5cbnR5cGUgU3R5bGVPYmplY3RQYXJ0ID0ge1xuICBjc3M6IHN0cmluZztcbiAgbWVkaWE6IHN0cmluZztcbiAgc291cmNlTWFwOiA/c3RyaW5nXG59XG4qL1xuXG52YXIgc3R5bGVzSW5Eb20gPSB7LypcbiAgW2lkOiBudW1iZXJdOiB7XG4gICAgaWQ6IG51bWJlcixcbiAgICByZWZzOiBudW1iZXIsXG4gICAgcGFydHM6IEFycmF5PChvYmo/OiBTdHlsZU9iamVjdFBhcnQpID0+IHZvaWQ+XG4gIH1cbiovfVxuXG52YXIgaGVhZCA9IGhhc0RvY3VtZW50ICYmIChkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0pXG52YXIgc2luZ2xldG9uRWxlbWVudCA9IG51bGxcbnZhciBzaW5nbGV0b25Db3VudGVyID0gMFxudmFyIGlzUHJvZHVjdGlvbiA9IGZhbHNlXG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG52YXIgb3B0aW9ucyA9IG51bGxcbnZhciBzc3JJZEtleSA9ICdkYXRhLXZ1ZS1zc3ItaWQnXG5cbi8vIEZvcmNlIHNpbmdsZS10YWcgc29sdXRpb24gb24gSUU2LTksIHdoaWNoIGhhcyBhIGhhcmQgbGltaXQgb24gdGhlICMgb2YgPHN0eWxlPlxuLy8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxudmFyIGlzT2xkSUUgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAvbXNpZSBbNi05XVxcYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZFN0eWxlc0NsaWVudCAocGFyZW50SWQsIGxpc3QsIF9pc1Byb2R1Y3Rpb24sIF9vcHRpb25zKSB7XG4gIGlzUHJvZHVjdGlvbiA9IF9pc1Byb2R1Y3Rpb25cblxuICBvcHRpb25zID0gX29wdGlvbnMgfHwge31cblxuICB2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKHBhcmVudElkLCBsaXN0KVxuICBhZGRTdHlsZXNUb0RvbShzdHlsZXMpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSAobmV3TGlzdCkge1xuICAgIHZhciBtYXlSZW1vdmUgPSBbXVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHN0eWxlc1tpXVxuICAgICAgdmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF1cbiAgICAgIGRvbVN0eWxlLnJlZnMtLVxuICAgICAgbWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpXG4gICAgfVxuICAgIGlmIChuZXdMaXN0KSB7XG4gICAgICBzdHlsZXMgPSBsaXN0VG9TdHlsZXMocGFyZW50SWQsIG5ld0xpc3QpXG4gICAgICBhZGRTdHlsZXNUb0RvbShzdHlsZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlcyA9IFtdXG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV1cbiAgICAgIGlmIChkb21TdHlsZS5yZWZzID09PSAwKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBkb21TdHlsZS5wYXJ0c1tqXSgpXG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHN0eWxlc0luRG9tW2RvbVN0eWxlLmlkXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRTdHlsZXNUb0RvbSAoc3R5bGVzIC8qIEFycmF5PFN0eWxlT2JqZWN0PiAqLykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gc3R5bGVzW2ldXG4gICAgdmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF1cbiAgICBpZiAoZG9tU3R5bGUpIHtcbiAgICAgIGRvbVN0eWxlLnJlZnMrK1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICBkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKVxuICAgICAgfVxuICAgICAgZm9yICg7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGRvbVN0eWxlLnBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSkpXG4gICAgICB9XG4gICAgICBpZiAoZG9tU3R5bGUucGFydHMubGVuZ3RoID4gaXRlbS5wYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgZG9tU3R5bGUucGFydHMubGVuZ3RoID0gaXRlbS5wYXJ0cy5sZW5ndGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBhcnRzID0gW11cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICBwYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0pKVxuICAgICAgfVxuICAgICAgc3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7IGlkOiBpdGVtLmlkLCByZWZzOiAxLCBwYXJ0czogcGFydHMgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdHlsZUVsZW1lbnQgKCkge1xuICB2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICBzdHlsZUVsZW1lbnQudHlwZSA9ICd0ZXh0L2NzcydcbiAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpXG4gIHJldHVybiBzdHlsZUVsZW1lbnRcbn1cblxuZnVuY3Rpb24gYWRkU3R5bGUgKG9iaiAvKiBTdHlsZU9iamVjdFBhcnQgKi8pIHtcbiAgdmFyIHVwZGF0ZSwgcmVtb3ZlXG4gIHZhciBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzdHlsZVsnICsgc3NySWRLZXkgKyAnfj1cIicgKyBvYmouaWQgKyAnXCJdJylcblxuICBpZiAoc3R5bGVFbGVtZW50KSB7XG4gICAgaWYgKGlzUHJvZHVjdGlvbikge1xuICAgICAgLy8gaGFzIFNTUiBzdHlsZXMgYW5kIGluIHByb2R1Y3Rpb24gbW9kZS5cbiAgICAgIC8vIHNpbXBseSBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG5vb3BcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaGFzIFNTUiBzdHlsZXMgYnV0IGluIGRldiBtb2RlLlxuICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIENocm9tZSBjYW4ndCBoYW5kbGUgc291cmNlIG1hcCBpbiBzZXJ2ZXItcmVuZGVyZWRcbiAgICAgIC8vIHN0eWxlIHRhZ3MgLSBzb3VyY2UgbWFwcyBpbiA8c3R5bGU+IG9ubHkgd29ya3MgaWYgdGhlIHN0eWxlIHRhZyBpc1xuICAgICAgLy8gY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgZHluYW1pY2FsbHkuIFNvIHdlIHJlbW92ZSB0aGUgc2VydmVyIHJlbmRlcmVkXG4gICAgICAvLyBzdHlsZXMgYW5kIGluamVjdCBuZXcgb25lcy5cbiAgICAgIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudClcbiAgICB9XG4gIH1cblxuICBpZiAoaXNPbGRJRSkge1xuICAgIC8vIHVzZSBzaW5nbGV0b24gbW9kZSBmb3IgSUU5LlxuICAgIHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrXG4gICAgc3R5bGVFbGVtZW50ID0gc2luZ2xldG9uRWxlbWVudCB8fCAoc2luZ2xldG9uRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudCgpKVxuICAgIHVwZGF0ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQsIHN0eWxlSW5kZXgsIGZhbHNlKVxuICAgIHJlbW92ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQsIHN0eWxlSW5kZXgsIHRydWUpXG4gIH0gZWxzZSB7XG4gICAgLy8gdXNlIG11bHRpLXN0eWxlLXRhZyBtb2RlIGluIGFsbCBvdGhlciBjYXNlc1xuICAgIHN0eWxlRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudCgpXG4gICAgdXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudClcbiAgICByZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKG9iailcblxuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUgKG5ld09iaiAvKiBTdHlsZU9iamVjdFBhcnQgKi8pIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJlxuICAgICAgICAgIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmXG4gICAgICAgICAgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHVwZGF0ZShvYmogPSBuZXdPYmopXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbW92ZSgpXG4gICAgfVxuICB9XG59XG5cbnZhciByZXBsYWNlVGV4dCA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXh0U3RvcmUgPSBbXVxuXG4gIHJldHVybiBmdW5jdGlvbiAoaW5kZXgsIHJlcGxhY2VtZW50KSB7XG4gICAgdGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50XG4gICAgcmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJylcbiAgfVxufSkoKVxuXG5mdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnIChzdHlsZUVsZW1lbnQsIGluZGV4LCByZW1vdmUsIG9iaikge1xuICB2YXIgY3NzID0gcmVtb3ZlID8gJycgOiBvYmouY3NzXG5cbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpXG4gIH0gZWxzZSB7XG4gICAgdmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpXG4gICAgdmFyIGNoaWxkTm9kZXMgPSBzdHlsZUVsZW1lbnQuY2hpbGROb2Rlc1xuICAgIGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKVxuICAgIGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgc3R5bGVFbGVtZW50Lmluc2VydEJlZm9yZShjc3NOb2RlLCBjaGlsZE5vZGVzW2luZGV4XSlcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGNzc05vZGUpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9UYWcgKHN0eWxlRWxlbWVudCwgb2JqKSB7XG4gIHZhciBjc3MgPSBvYmouY3NzXG4gIHZhciBtZWRpYSA9IG9iai5tZWRpYVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcFxuXG4gIGlmIChtZWRpYSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ21lZGlhJywgbWVkaWEpXG4gIH1cbiAgaWYgKG9wdGlvbnMuc3NySWQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKHNzcklkS2V5LCBvYmouaWQpXG4gIH1cblxuICBpZiAoc291cmNlTWFwKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kZXZ0b29scy9kb2NzL2phdmFzY3JpcHQtZGVidWdnaW5nXG4gICAgLy8gdGhpcyBtYWtlcyBzb3VyY2UgbWFwcyBpbnNpZGUgc3R5bGUgdGFncyB3b3JrIHByb3Blcmx5IGluIENocm9tZVxuICAgIGNzcyArPSAnXFxuLyojIHNvdXJjZVVSTD0nICsgc291cmNlTWFwLnNvdXJjZXNbMF0gKyAnICovJ1xuICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI2NjAzODc1XG4gICAgY3NzICs9ICdcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCcgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgJyAqLydcbiAgfVxuXG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3NcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZClcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/addStylesClient.js\n");

/***/ }),

/***/ "./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/listToStyles.js":
/*!***********************************************************************************!*\
  !*** ./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/listToStyles.js ***!
  \***********************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return listToStyles; });\n/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nfunction listToStyles (parentId, list) {\n  var styles = []\n  var newStyles = {}\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i]\n    var id = item[0]\n    var css = item[1]\n    var media = item[2]\n    var sourceMap = item[3]\n    var part = {\n      id: parentId + ':' + i,\n      css: css,\n      media: media,\n      sourceMap: sourceMap\n    }\n    if (!newStyles[id]) {\n      styles.push(newStyles[id] = { id: id, parts: [part] })\n    } else {\n      newStyles[id].parts.push(part)\n    }\n  }\n  return styles\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9saWIvbGlzdFRvU3R5bGVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvbGliL2xpc3RUb1N0eWxlcy5qcz82MTgxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNsYXRlcyB0aGUgbGlzdCBmb3JtYXQgcHJvZHVjZWQgYnkgY3NzLWxvYWRlciBpbnRvIHNvbWV0aGluZ1xuICogZWFzaWVyIHRvIG1hbmlwdWxhdGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RUb1N0eWxlcyAocGFyZW50SWQsIGxpc3QpIHtcbiAgdmFyIHN0eWxlcyA9IFtdXG4gIHZhciBuZXdTdHlsZXMgPSB7fVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICB2YXIgaWQgPSBpdGVtWzBdXG4gICAgdmFyIGNzcyA9IGl0ZW1bMV1cbiAgICB2YXIgbWVkaWEgPSBpdGVtWzJdXG4gICAgdmFyIHNvdXJjZU1hcCA9IGl0ZW1bM11cbiAgICB2YXIgcGFydCA9IHtcbiAgICAgIGlkOiBwYXJlbnRJZCArICc6JyArIGksXG4gICAgICBjc3M6IGNzcyxcbiAgICAgIG1lZGlhOiBtZWRpYSxcbiAgICAgIHNvdXJjZU1hcDogc291cmNlTWFwXG4gICAgfVxuICAgIGlmICghbmV3U3R5bGVzW2lkXSkge1xuICAgICAgc3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHsgaWQ6IGlkLCBwYXJ0czogW3BhcnRdIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGVzXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-style-loader@4.1.2@vue-style-loader/lib/listToStyles.js\n");

/***/ }),

/***/ "./node_modules/_vue-video-player@5.0.2@vue-video-player/dist/vue-video-player.js":
/*!****************************************************************************************!*\
  !*** ./node_modules/_vue-video-player@5.0.2@vue-video-player/dist/vue-video-player.js ***!
  \****************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("!function(e,t){ true?module.exports=t(__webpack_require__(/*! video.js */ \"./node_modules/_video.js@6.12.1@video.js/dist/video.cjs.js\")):undefined}(this,function(e){return function(e){function t(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,i){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:i})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"/\",t(t.s=3)}([function(t,n){t.exports=e},function(e,t,n){\"use strict\";function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(0),o=function(e){return e&&e.__esModule?e:{default:e}}(r),s=window.videojs||o.default;\"function\"!=typeof Object.assign&&Object.defineProperty(Object,\"assign\",{value:function(e,t){if(null==e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var n=Object(e),i=1;i<arguments.length;i++){var r=arguments[i];if(null!=r)for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(n[o]=r[o])}return n},writable:!0,configurable:!0});var a=[\"loadeddata\",\"canplay\",\"canplaythrough\",\"play\",\"pause\",\"waiting\",\"playing\",\"ended\",\"error\"];t.default={name:\"video-player\",props:{start:{type:Number,default:0},crossOrigin:{type:String,default:\"\"},playsinline:{type:Boolean,default:!1},customEventName:{type:String,default:\"statechanged\"},options:{type:Object,required:!0},events:{type:Array,default:function(){return[]}},globalOptions:{type:Object,default:function(){return{controls:!0,controlBar:{remainingTimeDisplay:!1,playToggle:{},progressControl:{},fullscreenToggle:{},volumeMenuButton:{inline:!1,vertical:!0}},techOrder:[\"html5\"],plugins:{}}}},globalEvents:{type:Array,default:function(){return[]}}},data:function(){return{player:null,reseted:!0}},mounted:function(){this.player||this.initialize()},beforeDestroy:function(){this.player&&this.dispose()},methods:{initialize:function(){var e=this,t=Object.assign({},this.globalOptions,this.options);this.playsinline&&(this.$refs.video.setAttribute(\"playsinline\",this.playsinline),this.$refs.video.setAttribute(\"webkit-playsinline\",this.playsinline),this.$refs.video.setAttribute(\"x5-playsinline\",this.playsinline),this.$refs.video.setAttribute(\"x5-video-player-type\",\"h5\"),this.$refs.video.setAttribute(\"x5-video-player-fullscreen\",!1)),\"\"!==this.crossOrigin&&(this.$refs.video.crossOrigin=this.crossOrigin,this.$refs.video.setAttribute(\"crossOrigin\",this.crossOrigin));var n=function(t,n){t&&e.$emit(t,e.player),n&&e.$emit(e.customEventName,i({},t,n))};t.plugins&&delete t.plugins.__ob__;var r=this;this.player=s(this.$refs.video,t,function(){for(var e=this,t=a.concat(r.events).concat(r.globalEvents),i={},o=0;o<t.length;o++)\"string\"==typeof t[o]&&void 0===i[t[o]]&&function(t){i[t]=null,e.on(t,function(){n(t,!0)})}(t[o]);this.on(\"timeupdate\",function(){n(\"timeupdate\",this.currentTime())}),r.$emit(\"ready\",this)})},dispose:function(e){var t=this;this.player&&this.player.dispose&&(\"Flash\"!==this.player.techName_&&this.player.pause&&this.player.pause(),this.player.dispose(),this.player=null,this.$nextTick(function(){t.reseted=!1,t.$nextTick(function(){t.reseted=!0,t.$nextTick(function(){e&&e()})})}))}},watch:{options:{deep:!0,handler:function(e,t){var n=this;this.dispose(function(){e&&e.sources&&e.sources.length&&n.initialize()})}}}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(1),r=n.n(i);for(var o in i)[\"default\",\"default\"].indexOf(o)<0&&function(e){n.d(t,e,function(){return i[e]})}(o);var s=n(5),a=n(4),l=a(r.a,s.a,!1,null,null,null);t.default=l.exports},function(e,t,n){\"use strict\";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.install=t.videoPlayer=t.videojs=void 0;var r=n(0),o=i(r),s=n(2),a=i(s),l=window.videojs||o.default,u=function(e,t){t&&(t.options&&(a.default.props.globalOptions.default=function(){return t.options}),t.events&&(a.default.props.globalEvents.default=function(){return t.events})),e.component(a.default.name,a.default)},d={videojs:l,videoPlayer:a.default,install:u};t.default=d,t.videojs=l,t.videoPlayer=a.default,t.install=u},function(e,t){e.exports=function(e,t,n,i,r,o){var s,a=e=e||{},l=typeof e.default;\"object\"!==l&&\"function\"!==l||(s=e,a=e.default);var u=\"function\"==typeof a?a.options:a;t&&(u.render=t.render,u.staticRenderFns=t.staticRenderFns,u._compiled=!0),n&&(u.functional=!0),r&&(u._scopeId=r);var d;if(o?(d=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(o)},u._ssrRegister=d):i&&(d=i),d){var c=u.functional,f=c?u.render:u.beforeCreate;c?(u._injectStyles=d,u.render=function(e,t){return d.call(t),f(e,t)}):u.beforeCreate=f?[].concat(f,d):[d]}return{esModule:s,exports:a,options:u}}},function(e,t,n){\"use strict\";var i=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.reseted?n(\"div\",{staticClass:\"video-player\"},[n(\"video\",{ref:\"video\",staticClass:\"video-js\"})]):e._e()},r=[],o={render:i,staticRenderFns:r};t.a=o}])});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZS12aWRlby1wbGF5ZXJANS4wLjJAdnVlLXZpZGVvLXBsYXllci9kaXN0L3Z1ZS12aWRlby1wbGF5ZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3Z1ZS12aWRlby1wbGF5ZXJANS4wLjJAdnVlLXZpZGVvLXBsYXllci9kaXN0L3Z1ZS12aWRlby1wbGF5ZXIuanM/ZTI0OCJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJ2aWRlby5qc1wiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJ2aWRlb2pzXCJdLHQpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuVnVlVmlkZW9QbGF5ZXI9dChyZXF1aXJlKFwidmlkZW8uanNcIikpOmUuVnVlVmlkZW9QbGF5ZXI9dChlLnZpZGVvanMpfSh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGkpe2lmKG5baV0pcmV0dXJuIG5baV0uZXhwb3J0czt2YXIgcj1uW2ldPXtpOmksbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtpXS5jYWxsKHIuZXhwb3J0cyxyLHIuZXhwb3J0cyx0KSxyLmw9ITAsci5leHBvcnRzfXZhciBuPXt9O3JldHVybiB0Lm09ZSx0LmM9bix0Lmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHQuZD1mdW5jdGlvbihlLG4saSl7dC5vKGUsbil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDppfSl9LHQubj1mdW5jdGlvbihlKXt2YXIgbj1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gdC5kKG4sXCJhXCIsbiksbn0sdC5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSx0LnA9XCIvXCIsdCh0LnM9Myl9KFtmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSxmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaShlLHQsbil7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHI9bigwKSxvPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX0ocikscz13aW5kb3cudmlkZW9qc3x8by5kZWZhdWx0O1wiZnVuY3Rpb25cIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QsXCJhc3NpZ25cIix7dmFsdWU6ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3RcIik7Zm9yKHZhciBuPU9iamVjdChlKSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHI9YXJndW1lbnRzW2ldO2lmKG51bGwhPXIpZm9yKHZhciBvIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsbykmJihuW29dPXJbb10pfXJldHVybiBufSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KTt2YXIgYT1bXCJsb2FkZWRkYXRhXCIsXCJjYW5wbGF5XCIsXCJjYW5wbGF5dGhyb3VnaFwiLFwicGxheVwiLFwicGF1c2VcIixcIndhaXRpbmdcIixcInBsYXlpbmdcIixcImVuZGVkXCIsXCJlcnJvclwiXTt0LmRlZmF1bHQ9e25hbWU6XCJ2aWRlby1wbGF5ZXJcIixwcm9wczp7c3RhcnQ6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH0sY3Jvc3NPcmlnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCJcIn0scGxheXNpbmxpbmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxjdXN0b21FdmVudE5hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCJzdGF0ZWNoYW5nZWRcIn0sb3B0aW9uczp7dHlwZTpPYmplY3QscmVxdWlyZWQ6ITB9LGV2ZW50czp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fSxnbG9iYWxPcHRpb25zOnt0eXBlOk9iamVjdCxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJue2NvbnRyb2xzOiEwLGNvbnRyb2xCYXI6e3JlbWFpbmluZ1RpbWVEaXNwbGF5OiExLHBsYXlUb2dnbGU6e30scHJvZ3Jlc3NDb250cm9sOnt9LGZ1bGxzY3JlZW5Ub2dnbGU6e30sdm9sdW1lTWVudUJ1dHRvbjp7aW5saW5lOiExLHZlcnRpY2FsOiEwfX0sdGVjaE9yZGVyOltcImh0bWw1XCJdLHBsdWdpbnM6e319fX0sZ2xvYmFsRXZlbnRzOnt0eXBlOkFycmF5LGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3BsYXllcjpudWxsLHJlc2V0ZWQ6ITB9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXJ8fHRoaXMuaW5pdGlhbGl6ZSgpfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXImJnRoaXMuZGlzcG9zZSgpfSxtZXRob2RzOntpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PU9iamVjdC5hc3NpZ24oe30sdGhpcy5nbG9iYWxPcHRpb25zLHRoaXMub3B0aW9ucyk7dGhpcy5wbGF5c2lubGluZSYmKHRoaXMuJHJlZnMudmlkZW8uc2V0QXR0cmlidXRlKFwicGxheXNpbmxpbmVcIix0aGlzLnBsYXlzaW5saW5lKSx0aGlzLiRyZWZzLnZpZGVvLnNldEF0dHJpYnV0ZShcIndlYmtpdC1wbGF5c2lubGluZVwiLHRoaXMucGxheXNpbmxpbmUpLHRoaXMuJHJlZnMudmlkZW8uc2V0QXR0cmlidXRlKFwieDUtcGxheXNpbmxpbmVcIix0aGlzLnBsYXlzaW5saW5lKSx0aGlzLiRyZWZzLnZpZGVvLnNldEF0dHJpYnV0ZShcIng1LXZpZGVvLXBsYXllci10eXBlXCIsXCJoNVwiKSx0aGlzLiRyZWZzLnZpZGVvLnNldEF0dHJpYnV0ZShcIng1LXZpZGVvLXBsYXllci1mdWxsc2NyZWVuXCIsITEpKSxcIlwiIT09dGhpcy5jcm9zc09yaWdpbiYmKHRoaXMuJHJlZnMudmlkZW8uY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbix0aGlzLiRyZWZzLnZpZGVvLnNldEF0dHJpYnV0ZShcImNyb3NzT3JpZ2luXCIsdGhpcy5jcm9zc09yaWdpbikpO3ZhciBuPWZ1bmN0aW9uKHQsbil7dCYmZS4kZW1pdCh0LGUucGxheWVyKSxuJiZlLiRlbWl0KGUuY3VzdG9tRXZlbnROYW1lLGkoe30sdCxuKSl9O3QucGx1Z2lucyYmZGVsZXRlIHQucGx1Z2lucy5fX29iX187dmFyIHI9dGhpczt0aGlzLnBsYXllcj1zKHRoaXMuJHJlZnMudmlkZW8sdCxmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLHQ9YS5jb25jYXQoci5ldmVudHMpLmNvbmNhdChyLmdsb2JhbEV2ZW50cyksaT17fSxvPTA7bzx0Lmxlbmd0aDtvKyspXCJzdHJpbmdcIj09dHlwZW9mIHRbb10mJnZvaWQgMD09PWlbdFtvXV0mJmZ1bmN0aW9uKHQpe2lbdF09bnVsbCxlLm9uKHQsZnVuY3Rpb24oKXtuKHQsITApfSl9KHRbb10pO3RoaXMub24oXCJ0aW1ldXBkYXRlXCIsZnVuY3Rpb24oKXtuKFwidGltZXVwZGF0ZVwiLHRoaXMuY3VycmVudFRpbWUoKSl9KSxyLiRlbWl0KFwicmVhZHlcIix0aGlzKX0pfSxkaXNwb3NlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5wbGF5ZXImJnRoaXMucGxheWVyLmRpc3Bvc2UmJihcIkZsYXNoXCIhPT10aGlzLnBsYXllci50ZWNoTmFtZV8mJnRoaXMucGxheWVyLnBhdXNlJiZ0aGlzLnBsYXllci5wYXVzZSgpLHRoaXMucGxheWVyLmRpc3Bvc2UoKSx0aGlzLnBsYXllcj1udWxsLHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7dC5yZXNldGVkPSExLHQuJG5leHRUaWNrKGZ1bmN0aW9uKCl7dC5yZXNldGVkPSEwLHQuJG5leHRUaWNrKGZ1bmN0aW9uKCl7ZSYmZSgpfSl9KX0pKX19LHdhdGNoOntvcHRpb25zOntkZWVwOiEwLGhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuZGlzcG9zZShmdW5jdGlvbigpe2UmJmUuc291cmNlcyYmZS5zb3VyY2VzLmxlbmd0aCYmbi5pbml0aWFsaXplKCl9KX19fX19LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgaT1uKDEpLHI9bi5uKGkpO2Zvcih2YXIgbyBpbiBpKVtcImRlZmF1bHRcIixcImRlZmF1bHRcIl0uaW5kZXhPZihvKTwwJiZmdW5jdGlvbihlKXtuLmQodCxlLGZ1bmN0aW9uKCl7cmV0dXJuIGlbZV19KX0obyk7dmFyIHM9big1KSxhPW4oNCksbD1hKHIuYSxzLmEsITEsbnVsbCxudWxsLG51bGwpO3QuZGVmYXVsdD1sLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0Lmluc3RhbGw9dC52aWRlb1BsYXllcj10LnZpZGVvanM9dm9pZCAwO3ZhciByPW4oMCksbz1pKHIpLHM9bigyKSxhPWkocyksbD13aW5kb3cudmlkZW9qc3x8by5kZWZhdWx0LHU9ZnVuY3Rpb24oZSx0KXt0JiYodC5vcHRpb25zJiYoYS5kZWZhdWx0LnByb3BzLmdsb2JhbE9wdGlvbnMuZGVmYXVsdD1mdW5jdGlvbigpe3JldHVybiB0Lm9wdGlvbnN9KSx0LmV2ZW50cyYmKGEuZGVmYXVsdC5wcm9wcy5nbG9iYWxFdmVudHMuZGVmYXVsdD1mdW5jdGlvbigpe3JldHVybiB0LmV2ZW50c30pKSxlLmNvbXBvbmVudChhLmRlZmF1bHQubmFtZSxhLmRlZmF1bHQpfSxkPXt2aWRlb2pzOmwsdmlkZW9QbGF5ZXI6YS5kZWZhdWx0LGluc3RhbGw6dX07dC5kZWZhdWx0PWQsdC52aWRlb2pzPWwsdC52aWRlb1BsYXllcj1hLmRlZmF1bHQsdC5pbnN0YWxsPXV9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLGkscixvKXt2YXIgcyxhPWU9ZXx8e30sbD10eXBlb2YgZS5kZWZhdWx0O1wib2JqZWN0XCIhPT1sJiZcImZ1bmN0aW9uXCIhPT1sfHwocz1lLGE9ZS5kZWZhdWx0KTt2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBhP2Eub3B0aW9uczphO3QmJih1LnJlbmRlcj10LnJlbmRlcix1LnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyx1Ll9jb21waWxlZD0hMCksbiYmKHUuZnVuY3Rpb25hbD0hMCksciYmKHUuX3Njb3BlSWQ9cik7dmFyIGQ7aWYobz8oZD1mdW5jdGlvbihlKXtlPWV8fHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fHx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuJHZub2RlJiZ0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCxlfHxcInVuZGVmaW5lZFwiPT10eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfX3x8KGU9X19WVUVfU1NSX0NPTlRFWFRfXyksaSYmaS5jYWxsKHRoaXMsZSksZSYmZS5fcmVnaXN0ZXJlZENvbXBvbmVudHMmJmUuX3JlZ2lzdGVyZWRDb21wb25lbnRzLmFkZChvKX0sdS5fc3NyUmVnaXN0ZXI9ZCk6aSYmKGQ9aSksZCl7dmFyIGM9dS5mdW5jdGlvbmFsLGY9Yz91LnJlbmRlcjp1LmJlZm9yZUNyZWF0ZTtjPyh1Ll9pbmplY3RTdHlsZXM9ZCx1LnJlbmRlcj1mdW5jdGlvbihlLHQpe3JldHVybiBkLmNhbGwodCksZihlLHQpfSk6dS5iZWZvcmVDcmVhdGU9Zj9bXS5jb25jYXQoZixkKTpbZF19cmV0dXJue2VzTW9kdWxlOnMsZXhwb3J0czphLG9wdGlvbnM6dX19fSxmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudCxuPWUuX3NlbGYuX2N8fHQ7cmV0dXJuIGUucmVzZXRlZD9uKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwidmlkZW8tcGxheWVyXCJ9LFtuKFwidmlkZW9cIix7cmVmOlwidmlkZW9cIixzdGF0aWNDbGFzczpcInZpZGVvLWpzXCJ9KV0pOmUuX2UoKX0scj1bXSxvPXtyZW5kZXI6aSxzdGF0aWNSZW5kZXJGbnM6cn07dC5hPW99XSl9KTsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue-video-player@5.0.2@vue-video-player/dist/vue-video-player.js\n");

/***/ }),

/***/ "./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js":
/*!**************************************************************!*\
  !*** ./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js ***!
  \**************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/*!\n * Vue.js v2.6.10\n * (c) 2014-2019 Evan You\n * Released under the MIT License.\n */\n/*  */\n\nvar emptyObject = Object.freeze({});\n\n// These helpers produce better VM code in JS engines due to their\n// explicitness and function inlining.\nfunction isUndef (v) {\n  return v === undefined || v === null\n}\n\nfunction isDef (v) {\n  return v !== undefined && v !== null\n}\n\nfunction isTrue (v) {\n  return v === true\n}\n\nfunction isFalse (v) {\n  return v === false\n}\n\n/**\n * Check if value is primitive.\n */\nfunction isPrimitive (value) {\n  return (\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    // $flow-disable-line\n    typeof value === 'symbol' ||\n    typeof value === 'boolean'\n  )\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n */\nfunction isObject (obj) {\n  return obj !== null && typeof obj === 'object'\n}\n\n/**\n * Get the raw type string of a value, e.g., [object Object].\n */\nvar _toString = Object.prototype.toString;\n\nfunction toRawType (value) {\n  return _toString.call(value).slice(8, -1)\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\nfunction isPlainObject (obj) {\n  return _toString.call(obj) === '[object Object]'\n}\n\nfunction isRegExp (v) {\n  return _toString.call(v) === '[object RegExp]'\n}\n\n/**\n * Check if val is a valid array index.\n */\nfunction isValidArrayIndex (val) {\n  var n = parseFloat(String(val));\n  return n >= 0 && Math.floor(n) === n && isFinite(val)\n}\n\nfunction isPromise (val) {\n  return (\n    isDef(val) &&\n    typeof val.then === 'function' &&\n    typeof val.catch === 'function'\n  )\n}\n\n/**\n * Convert a value to a string that is actually rendered.\n */\nfunction toString (val) {\n  return val == null\n    ? ''\n    : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)\n      ? JSON.stringify(val, null, 2)\n      : String(val)\n}\n\n/**\n * Convert an input value to a number for persistence.\n * If the conversion fails, return original string.\n */\nfunction toNumber (val) {\n  var n = parseFloat(val);\n  return isNaN(n) ? val : n\n}\n\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n */\nfunction makeMap (\n  str,\n  expectsLowerCase\n) {\n  var map = Object.create(null);\n  var list = str.split(',');\n  for (var i = 0; i < list.length; i++) {\n    map[list[i]] = true;\n  }\n  return expectsLowerCase\n    ? function (val) { return map[val.toLowerCase()]; }\n    : function (val) { return map[val]; }\n}\n\n/**\n * Check if a tag is a built-in tag.\n */\nvar isBuiltInTag = makeMap('slot,component', true);\n\n/**\n * Check if an attribute is a reserved attribute.\n */\nvar isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n\n/**\n * Remove an item from an array.\n */\nfunction remove (arr, item) {\n  if (arr.length) {\n    var index = arr.indexOf(item);\n    if (index > -1) {\n      return arr.splice(index, 1)\n    }\n  }\n}\n\n/**\n * Check whether an object has the property.\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n  return hasOwnProperty.call(obj, key)\n}\n\n/**\n * Create a cached version of a pure function.\n */\nfunction cached (fn) {\n  var cache = Object.create(null);\n  return (function cachedFn (str) {\n    var hit = cache[str];\n    return hit || (cache[str] = fn(str))\n  })\n}\n\n/**\n * Camelize a hyphen-delimited string.\n */\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cached(function (str) {\n  return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n});\n\n/**\n * Capitalize a string.\n */\nvar capitalize = cached(function (str) {\n  return str.charAt(0).toUpperCase() + str.slice(1)\n});\n\n/**\n * Hyphenate a camelCase string.\n */\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cached(function (str) {\n  return str.replace(hyphenateRE, '-$1').toLowerCase()\n});\n\n/**\n * Simple bind polyfill for environments that do not support it,\n * e.g., PhantomJS 1.x. Technically, we don't need this anymore\n * since native bind is now performant enough in most browsers.\n * But removing it would mean breaking code that was able to run in\n * PhantomJS 1.x, so this must be kept for backward compatibility.\n */\n\n/* istanbul ignore next */\nfunction polyfillBind (fn, ctx) {\n  function boundFn (a) {\n    var l = arguments.length;\n    return l\n      ? l > 1\n        ? fn.apply(ctx, arguments)\n        : fn.call(ctx, a)\n      : fn.call(ctx)\n  }\n\n  boundFn._length = fn.length;\n  return boundFn\n}\n\nfunction nativeBind (fn, ctx) {\n  return fn.bind(ctx)\n}\n\nvar bind = Function.prototype.bind\n  ? nativeBind\n  : polyfillBind;\n\n/**\n * Convert an Array-like object to a real Array.\n */\nfunction toArray (list, start) {\n  start = start || 0;\n  var i = list.length - start;\n  var ret = new Array(i);\n  while (i--) {\n    ret[i] = list[i + start];\n  }\n  return ret\n}\n\n/**\n * Mix properties into target object.\n */\nfunction extend (to, _from) {\n  for (var key in _from) {\n    to[key] = _from[key];\n  }\n  return to\n}\n\n/**\n * Merge an Array of Objects into a single Object.\n */\nfunction toObject (arr) {\n  var res = {};\n  for (var i = 0; i < arr.length; i++) {\n    if (arr[i]) {\n      extend(res, arr[i]);\n    }\n  }\n  return res\n}\n\n/* eslint-disable no-unused-vars */\n\n/**\n * Perform no operation.\n * Stubbing args to make Flow happy without leaving useless transpiled code\n * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).\n */\nfunction noop (a, b, c) {}\n\n/**\n * Always return false.\n */\nvar no = function (a, b, c) { return false; };\n\n/* eslint-enable no-unused-vars */\n\n/**\n * Return the same value.\n */\nvar identity = function (_) { return _; };\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n */\nfunction looseEqual (a, b) {\n  if (a === b) { return true }\n  var isObjectA = isObject(a);\n  var isObjectB = isObject(b);\n  if (isObjectA && isObjectB) {\n    try {\n      var isArrayA = Array.isArray(a);\n      var isArrayB = Array.isArray(b);\n      if (isArrayA && isArrayB) {\n        return a.length === b.length && a.every(function (e, i) {\n          return looseEqual(e, b[i])\n        })\n      } else if (a instanceof Date && b instanceof Date) {\n        return a.getTime() === b.getTime()\n      } else if (!isArrayA && !isArrayB) {\n        var keysA = Object.keys(a);\n        var keysB = Object.keys(b);\n        return keysA.length === keysB.length && keysA.every(function (key) {\n          return looseEqual(a[key], b[key])\n        })\n      } else {\n        /* istanbul ignore next */\n        return false\n      }\n    } catch (e) {\n      /* istanbul ignore next */\n      return false\n    }\n  } else if (!isObjectA && !isObjectB) {\n    return String(a) === String(b)\n  } else {\n    return false\n  }\n}\n\n/**\n * Return the first index at which a loosely equal value can be\n * found in the array (if value is a plain object, the array must\n * contain an object of the same shape), or -1 if it is not present.\n */\nfunction looseIndexOf (arr, val) {\n  for (var i = 0; i < arr.length; i++) {\n    if (looseEqual(arr[i], val)) { return i }\n  }\n  return -1\n}\n\n/**\n * Ensure a function is called only once.\n */\nfunction once (fn) {\n  var called = false;\n  return function () {\n    if (!called) {\n      called = true;\n      fn.apply(this, arguments);\n    }\n  }\n}\n\nvar SSR_ATTR = 'data-server-rendered';\n\nvar ASSET_TYPES = [\n  'component',\n  'directive',\n  'filter'\n];\n\nvar LIFECYCLE_HOOKS = [\n  'beforeCreate',\n  'created',\n  'beforeMount',\n  'mounted',\n  'beforeUpdate',\n  'updated',\n  'beforeDestroy',\n  'destroyed',\n  'activated',\n  'deactivated',\n  'errorCaptured',\n  'serverPrefetch'\n];\n\n/*  */\n\n\n\nvar config = ({\n  /**\n   * Option merge strategies (used in core/util/options)\n   */\n  // $flow-disable-line\n  optionMergeStrategies: Object.create(null),\n\n  /**\n   * Whether to suppress warnings.\n   */\n  silent: false,\n\n  /**\n   * Show production mode tip message on boot?\n   */\n  productionTip: \"sandbox\" !== 'production',\n\n  /**\n   * Whether to enable devtools\n   */\n  devtools: \"sandbox\" !== 'production',\n\n  /**\n   * Whether to record perf\n   */\n  performance: false,\n\n  /**\n   * Error handler for watcher errors\n   */\n  errorHandler: null,\n\n  /**\n   * Warn handler for watcher warns\n   */\n  warnHandler: null,\n\n  /**\n   * Ignore certain custom elements\n   */\n  ignoredElements: [],\n\n  /**\n   * Custom user key aliases for v-on\n   */\n  // $flow-disable-line\n  keyCodes: Object.create(null),\n\n  /**\n   * Check if a tag is reserved so that it cannot be registered as a\n   * component. This is platform-dependent and may be overwritten.\n   */\n  isReservedTag: no,\n\n  /**\n   * Check if an attribute is reserved so that it cannot be used as a component\n   * prop. This is platform-dependent and may be overwritten.\n   */\n  isReservedAttr: no,\n\n  /**\n   * Check if a tag is an unknown element.\n   * Platform-dependent.\n   */\n  isUnknownElement: no,\n\n  /**\n   * Get the namespace of an element\n   */\n  getTagNamespace: noop,\n\n  /**\n   * Parse the real tag name for the specific platform.\n   */\n  parsePlatformTagName: identity,\n\n  /**\n   * Check if an attribute must be bound using property, e.g. value\n   * Platform-dependent.\n   */\n  mustUseProp: no,\n\n  /**\n   * Perform updates asynchronously. Intended to be used by Vue Test Utils\n   * This will significantly reduce performance if set to false.\n   */\n  async: true,\n\n  /**\n   * Exposed for legacy reasons\n   */\n  _lifecycleHooks: LIFECYCLE_HOOKS\n});\n\n/*  */\n\n/**\n * unicode letters used for parsing html tags, component names and property paths.\n * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname\n * skipping \\u10000-\\uEFFFF due to it freezing up PhantomJS\n */\nvar unicodeRegExp = /a-zA-Z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD/;\n\n/**\n * Check if a string starts with $ or _\n */\nfunction isReserved (str) {\n  var c = (str + '').charCodeAt(0);\n  return c === 0x24 || c === 0x5F\n}\n\n/**\n * Define a property.\n */\nfunction def (obj, key, val, enumerable) {\n  Object.defineProperty(obj, key, {\n    value: val,\n    enumerable: !!enumerable,\n    writable: true,\n    configurable: true\n  });\n}\n\n/**\n * Parse simple path.\n */\nvar bailRE = new RegExp((\"[^\" + (unicodeRegExp.source) + \".$_\\\\d]\"));\nfunction parsePath (path) {\n  if (bailRE.test(path)) {\n    return\n  }\n  var segments = path.split('.');\n  return function (obj) {\n    for (var i = 0; i < segments.length; i++) {\n      if (!obj) { return }\n      obj = obj[segments[i]];\n    }\n    return obj\n  }\n}\n\n/*  */\n\n// can we use __proto__?\nvar hasProto = '__proto__' in {};\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined';\nvar inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\nvar weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && /msie|trident/.test(UA);\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isEdge = UA && UA.indexOf('edge/') > 0;\nvar isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');\nvar isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');\nvar isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\nvar isPhantomJS = UA && /phantomjs/.test(UA);\nvar isFF = UA && UA.match(/firefox\\/(\\d+)/);\n\n// Firefox has a \"watch\" function on Object.prototype...\nvar nativeWatch = ({}).watch;\n\nvar supportsPassive = false;\nif (inBrowser) {\n  try {\n    var opts = {};\n    Object.defineProperty(opts, 'passive', ({\n      get: function get () {\n        /* istanbul ignore next */\n        supportsPassive = true;\n      }\n    })); // https://github.com/facebook/flow/issues/285\n    window.addEventListener('test-passive', null, opts);\n  } catch (e) {}\n}\n\n// this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\nvar _isServer;\nvar isServerRendering = function () {\n  if (_isServer === undefined) {\n    /* istanbul ignore if */\n    if (!inBrowser && !inWeex && typeof global !== 'undefined') {\n      // detect presence of vue-server-renderer and avoid\n      // Webpack shimming the process\n      _isServer = global['process'] && global['process'].env.VUE_ENV === 'server';\n    } else {\n      _isServer = false;\n    }\n  }\n  return _isServer\n};\n\n// detect devtools\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n/* istanbul ignore next */\nfunction isNative (Ctor) {\n  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())\n}\n\nvar hasSymbol =\n  typeof Symbol !== 'undefined' && isNative(Symbol) &&\n  typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\nvar _Set;\n/* istanbul ignore if */ // $flow-disable-line\nif (typeof Set !== 'undefined' && isNative(Set)) {\n  // use native Set when available.\n  _Set = Set;\n} else {\n  // a non-standard Set polyfill that only works with primitive keys.\n  _Set = /*@__PURE__*/(function () {\n    function Set () {\n      this.set = Object.create(null);\n    }\n    Set.prototype.has = function has (key) {\n      return this.set[key] === true\n    };\n    Set.prototype.add = function add (key) {\n      this.set[key] = true;\n    };\n    Set.prototype.clear = function clear () {\n      this.set = Object.create(null);\n    };\n\n    return Set;\n  }());\n}\n\n/*  */\n\nvar warn = noop;\nvar tip = noop;\nvar generateComponentTrace = (noop); // work around flow check\nvar formatComponentName = (noop);\n\nif (true) {\n  var hasConsole = typeof console !== 'undefined';\n  var classifyRE = /(?:^|[-_])(\\w)/g;\n  var classify = function (str) { return str\n    .replace(classifyRE, function (c) { return c.toUpperCase(); })\n    .replace(/[-_]/g, ''); };\n\n  warn = function (msg, vm) {\n    var trace = vm ? generateComponentTrace(vm) : '';\n\n    if (config.warnHandler) {\n      config.warnHandler.call(null, msg, vm, trace);\n    } else if (hasConsole && (!config.silent)) {\n      console.error((\"[Vue warn]: \" + msg + trace));\n    }\n  };\n\n  tip = function (msg, vm) {\n    if (hasConsole && (!config.silent)) {\n      console.warn(\"[Vue tip]: \" + msg + (\n        vm ? generateComponentTrace(vm) : ''\n      ));\n    }\n  };\n\n  formatComponentName = function (vm, includeFile) {\n    if (vm.$root === vm) {\n      return '<Root>'\n    }\n    var options = typeof vm === 'function' && vm.cid != null\n      ? vm.options\n      : vm._isVue\n        ? vm.$options || vm.constructor.options\n        : vm;\n    var name = options.name || options._componentTag;\n    var file = options.__file;\n    if (!name && file) {\n      var match = file.match(/([^/\\\\]+)\\.vue$/);\n      name = match && match[1];\n    }\n\n    return (\n      (name ? (\"<\" + (classify(name)) + \">\") : \"<Anonymous>\") +\n      (file && includeFile !== false ? (\" at \" + file) : '')\n    )\n  };\n\n  var repeat = function (str, n) {\n    var res = '';\n    while (n) {\n      if (n % 2 === 1) { res += str; }\n      if (n > 1) { str += str; }\n      n >>= 1;\n    }\n    return res\n  };\n\n  generateComponentTrace = function (vm) {\n    if (vm._isVue && vm.$parent) {\n      var tree = [];\n      var currentRecursiveSequence = 0;\n      while (vm) {\n        if (tree.length > 0) {\n          var last = tree[tree.length - 1];\n          if (last.constructor === vm.constructor) {\n            currentRecursiveSequence++;\n            vm = vm.$parent;\n            continue\n          } else if (currentRecursiveSequence > 0) {\n            tree[tree.length - 1] = [last, currentRecursiveSequence];\n            currentRecursiveSequence = 0;\n          }\n        }\n        tree.push(vm);\n        vm = vm.$parent;\n      }\n      return '\\n\\nfound in\\n\\n' + tree\n        .map(function (vm, i) { return (\"\" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n            ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n            : formatComponentName(vm))); })\n        .join('\\n')\n    } else {\n      return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n    }\n  };\n}\n\n/*  */\n\nvar uid = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\nvar Dep = function Dep () {\n  this.id = uid++;\n  this.subs = [];\n};\n\nDep.prototype.addSub = function addSub (sub) {\n  this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub (sub) {\n  remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend () {\n  if (Dep.target) {\n    Dep.target.addDep(this);\n  }\n};\n\nDep.prototype.notify = function notify () {\n  // stabilize the subscriber list first\n  var subs = this.subs.slice();\n  if ( true && !config.async) {\n    // subs aren't sorted in scheduler if not running async\n    // we need to sort them now to make sure they fire in correct\n    // order\n    subs.sort(function (a, b) { return a.id - b.id; });\n  }\n  for (var i = 0, l = subs.length; i < l; i++) {\n    subs[i].update();\n  }\n};\n\n// The current target watcher being evaluated.\n// This is globally unique because only one watcher\n// can be evaluated at a time.\nDep.target = null;\nvar targetStack = [];\n\nfunction pushTarget (target) {\n  targetStack.push(target);\n  Dep.target = target;\n}\n\nfunction popTarget () {\n  targetStack.pop();\n  Dep.target = targetStack[targetStack.length - 1];\n}\n\n/*  */\n\nvar VNode = function VNode (\n  tag,\n  data,\n  children,\n  text,\n  elm,\n  context,\n  componentOptions,\n  asyncFactory\n) {\n  this.tag = tag;\n  this.data = data;\n  this.children = children;\n  this.text = text;\n  this.elm = elm;\n  this.ns = undefined;\n  this.context = context;\n  this.fnContext = undefined;\n  this.fnOptions = undefined;\n  this.fnScopeId = undefined;\n  this.key = data && data.key;\n  this.componentOptions = componentOptions;\n  this.componentInstance = undefined;\n  this.parent = undefined;\n  this.raw = false;\n  this.isStatic = false;\n  this.isRootInsert = true;\n  this.isComment = false;\n  this.isCloned = false;\n  this.isOnce = false;\n  this.asyncFactory = asyncFactory;\n  this.asyncMeta = undefined;\n  this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = { child: { configurable: true } };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n/* istanbul ignore next */\nprototypeAccessors.child.get = function () {\n  return this.componentInstance\n};\n\nObject.defineProperties( VNode.prototype, prototypeAccessors );\n\nvar createEmptyVNode = function (text) {\n  if ( text === void 0 ) text = '';\n\n  var node = new VNode();\n  node.text = text;\n  node.isComment = true;\n  return node\n};\n\nfunction createTextVNode (val) {\n  return new VNode(undefined, undefined, undefined, String(val))\n}\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\nfunction cloneVNode (vnode) {\n  var cloned = new VNode(\n    vnode.tag,\n    vnode.data,\n    // #7975\n    // clone children array to avoid mutating original in case of cloning\n    // a child.\n    vnode.children && vnode.children.slice(),\n    vnode.text,\n    vnode.elm,\n    vnode.context,\n    vnode.componentOptions,\n    vnode.asyncFactory\n  );\n  cloned.ns = vnode.ns;\n  cloned.isStatic = vnode.isStatic;\n  cloned.key = vnode.key;\n  cloned.isComment = vnode.isComment;\n  cloned.fnContext = vnode.fnContext;\n  cloned.fnOptions = vnode.fnOptions;\n  cloned.fnScopeId = vnode.fnScopeId;\n  cloned.asyncMeta = vnode.asyncMeta;\n  cloned.isCloned = true;\n  return cloned\n}\n\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\n\nvar methodsToPatch = [\n  'push',\n  'pop',\n  'shift',\n  'unshift',\n  'splice',\n  'sort',\n  'reverse'\n];\n\n/**\n * Intercept mutating methods and emit events\n */\nmethodsToPatch.forEach(function (method) {\n  // cache original method\n  var original = arrayProto[method];\n  def(arrayMethods, method, function mutator () {\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n\n    var result = original.apply(this, args);\n    var ob = this.__ob__;\n    var inserted;\n    switch (method) {\n      case 'push':\n      case 'unshift':\n        inserted = args;\n        break\n      case 'splice':\n        inserted = args.slice(2);\n        break\n    }\n    if (inserted) { ob.observeArray(inserted); }\n    // notify change\n    ob.dep.notify();\n    return result\n  });\n});\n\n/*  */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\nvar shouldObserve = true;\n\nfunction toggleObserving (value) {\n  shouldObserve = value;\n}\n\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\nvar Observer = function Observer (value) {\n  this.value = value;\n  this.dep = new Dep();\n  this.vmCount = 0;\n  def(value, '__ob__', this);\n  if (Array.isArray(value)) {\n    if (hasProto) {\n      protoAugment(value, arrayMethods);\n    } else {\n      copyAugment(value, arrayMethods, arrayKeys);\n    }\n    this.observeArray(value);\n  } else {\n    this.walk(value);\n  }\n};\n\n/**\n * Walk through all properties and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\nObserver.prototype.walk = function walk (obj) {\n  var keys = Object.keys(obj);\n  for (var i = 0; i < keys.length; i++) {\n    defineReactive$$1(obj, keys[i]);\n  }\n};\n\n/**\n * Observe a list of Array items.\n */\nObserver.prototype.observeArray = function observeArray (items) {\n  for (var i = 0, l = items.length; i < l; i++) {\n    observe(items[i]);\n  }\n};\n\n// helpers\n\n/**\n * Augment a target Object or Array by intercepting\n * the prototype chain using __proto__\n */\nfunction protoAugment (target, src) {\n  /* eslint-disable no-proto */\n  target.__proto__ = src;\n  /* eslint-enable no-proto */\n}\n\n/**\n * Augment a target Object or Array by defining\n * hidden properties.\n */\n/* istanbul ignore next */\nfunction copyAugment (target, src, keys) {\n  for (var i = 0, l = keys.length; i < l; i++) {\n    var key = keys[i];\n    def(target, key, src[key]);\n  }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\nfunction observe (value, asRootData) {\n  if (!isObject(value) || value instanceof VNode) {\n    return\n  }\n  var ob;\n  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n    ob = value.__ob__;\n  } else if (\n    shouldObserve &&\n    !isServerRendering() &&\n    (Array.isArray(value) || isPlainObject(value)) &&\n    Object.isExtensible(value) &&\n    !value._isVue\n  ) {\n    ob = new Observer(value);\n  }\n  if (asRootData && ob) {\n    ob.vmCount++;\n  }\n  return ob\n}\n\n/**\n * Define a reactive property on an Object.\n */\nfunction defineReactive$$1 (\n  obj,\n  key,\n  val,\n  customSetter,\n  shallow\n) {\n  var dep = new Dep();\n\n  var property = Object.getOwnPropertyDescriptor(obj, key);\n  if (property && property.configurable === false) {\n    return\n  }\n\n  // cater for pre-defined getter/setters\n  var getter = property && property.get;\n  var setter = property && property.set;\n  if ((!getter || setter) && arguments.length === 2) {\n    val = obj[key];\n  }\n\n  var childOb = !shallow && observe(val);\n  Object.defineProperty(obj, key, {\n    enumerable: true,\n    configurable: true,\n    get: function reactiveGetter () {\n      var value = getter ? getter.call(obj) : val;\n      if (Dep.target) {\n        dep.depend();\n        if (childOb) {\n          childOb.dep.depend();\n          if (Array.isArray(value)) {\n            dependArray(value);\n          }\n        }\n      }\n      return value\n    },\n    set: function reactiveSetter (newVal) {\n      var value = getter ? getter.call(obj) : val;\n      /* eslint-disable no-self-compare */\n      if (newVal === value || (newVal !== newVal && value !== value)) {\n        return\n      }\n      /* eslint-enable no-self-compare */\n      if ( true && customSetter) {\n        customSetter();\n      }\n      // #7981: for accessor properties without setter\n      if (getter && !setter) { return }\n      if (setter) {\n        setter.call(obj, newVal);\n      } else {\n        val = newVal;\n      }\n      childOb = !shallow && observe(newVal);\n      dep.notify();\n    }\n  });\n}\n\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\nfunction set (target, key, val) {\n  if ( true &&\n    (isUndef(target) || isPrimitive(target))\n  ) {\n    warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n  }\n  if (Array.isArray(target) && isValidArrayIndex(key)) {\n    target.length = Math.max(target.length, key);\n    target.splice(key, 1, val);\n    return val\n  }\n  if (key in target && !(key in Object.prototype)) {\n    target[key] = val;\n    return val\n  }\n  var ob = (target).__ob__;\n  if (target._isVue || (ob && ob.vmCount)) {\n     true && warn(\n      'Avoid adding reactive properties to a Vue instance or its root $data ' +\n      'at runtime - declare it upfront in the data option.'\n    );\n    return val\n  }\n  if (!ob) {\n    target[key] = val;\n    return val\n  }\n  defineReactive$$1(ob.value, key, val);\n  ob.dep.notify();\n  return val\n}\n\n/**\n * Delete a property and trigger change if necessary.\n */\nfunction del (target, key) {\n  if ( true &&\n    (isUndef(target) || isPrimitive(target))\n  ) {\n    warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n  }\n  if (Array.isArray(target) && isValidArrayIndex(key)) {\n    target.splice(key, 1);\n    return\n  }\n  var ob = (target).__ob__;\n  if (target._isVue || (ob && ob.vmCount)) {\n     true && warn(\n      'Avoid deleting properties on a Vue instance or its root $data ' +\n      '- just set it to null.'\n    );\n    return\n  }\n  if (!hasOwn(target, key)) {\n    return\n  }\n  delete target[key];\n  if (!ob) {\n    return\n  }\n  ob.dep.notify();\n}\n\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\nfunction dependArray (value) {\n  for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n    e = value[i];\n    e && e.__ob__ && e.__ob__.dep.depend();\n    if (Array.isArray(e)) {\n      dependArray(e);\n    }\n  }\n}\n\n/*  */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\nvar strats = config.optionMergeStrategies;\n\n/**\n * Options with restrictions\n */\nif (true) {\n  strats.el = strats.propsData = function (parent, child, vm, key) {\n    if (!vm) {\n      warn(\n        \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n        'creation with the `new` keyword.'\n      );\n    }\n    return defaultStrat(parent, child)\n  };\n}\n\n/**\n * Helper that recursively merges two data objects together.\n */\nfunction mergeData (to, from) {\n  if (!from) { return to }\n  var key, toVal, fromVal;\n\n  var keys = hasSymbol\n    ? Reflect.ownKeys(from)\n    : Object.keys(from);\n\n  for (var i = 0; i < keys.length; i++) {\n    key = keys[i];\n    // in case the object is already observed...\n    if (key === '__ob__') { continue }\n    toVal = to[key];\n    fromVal = from[key];\n    if (!hasOwn(to, key)) {\n      set(to, key, fromVal);\n    } else if (\n      toVal !== fromVal &&\n      isPlainObject(toVal) &&\n      isPlainObject(fromVal)\n    ) {\n      mergeData(toVal, fromVal);\n    }\n  }\n  return to\n}\n\n/**\n * Data\n */\nfunction mergeDataOrFn (\n  parentVal,\n  childVal,\n  vm\n) {\n  if (!vm) {\n    // in a Vue.extend merge, both should be functions\n    if (!childVal) {\n      return parentVal\n    }\n    if (!parentVal) {\n      return childVal\n    }\n    // when parentVal & childVal are both present,\n    // we need to return a function that returns the\n    // merged result of both functions... no need to\n    // check if parentVal is a function here because\n    // it has to be a function to pass previous merges.\n    return function mergedDataFn () {\n      return mergeData(\n        typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n        typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n      )\n    }\n  } else {\n    return function mergedInstanceDataFn () {\n      // instance merge\n      var instanceData = typeof childVal === 'function'\n        ? childVal.call(vm, vm)\n        : childVal;\n      var defaultData = typeof parentVal === 'function'\n        ? parentVal.call(vm, vm)\n        : parentVal;\n      if (instanceData) {\n        return mergeData(instanceData, defaultData)\n      } else {\n        return defaultData\n      }\n    }\n  }\n}\n\nstrats.data = function (\n  parentVal,\n  childVal,\n  vm\n) {\n  if (!vm) {\n    if (childVal && typeof childVal !== 'function') {\n       true && warn(\n        'The \"data\" option should be a function ' +\n        'that returns a per-instance value in component ' +\n        'definitions.',\n        vm\n      );\n\n      return parentVal\n    }\n    return mergeDataOrFn(parentVal, childVal)\n  }\n\n  return mergeDataOrFn(parentVal, childVal, vm)\n};\n\n/**\n * Hooks and props are merged as arrays.\n */\nfunction mergeHook (\n  parentVal,\n  childVal\n) {\n  var res = childVal\n    ? parentVal\n      ? parentVal.concat(childVal)\n      : Array.isArray(childVal)\n        ? childVal\n        : [childVal]\n    : parentVal;\n  return res\n    ? dedupeHooks(res)\n    : res\n}\n\nfunction dedupeHooks (hooks) {\n  var res = [];\n  for (var i = 0; i < hooks.length; i++) {\n    if (res.indexOf(hooks[i]) === -1) {\n      res.push(hooks[i]);\n    }\n  }\n  return res\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n  strats[hook] = mergeHook;\n});\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\nfunction mergeAssets (\n  parentVal,\n  childVal,\n  vm,\n  key\n) {\n  var res = Object.create(parentVal || null);\n  if (childVal) {\n     true && assertObjectType(key, childVal, vm);\n    return extend(res, childVal)\n  } else {\n    return res\n  }\n}\n\nASSET_TYPES.forEach(function (type) {\n  strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\nstrats.watch = function (\n  parentVal,\n  childVal,\n  vm,\n  key\n) {\n  // work around Firefox's Object.prototype.watch...\n  if (parentVal === nativeWatch) { parentVal = undefined; }\n  if (childVal === nativeWatch) { childVal = undefined; }\n  /* istanbul ignore if */\n  if (!childVal) { return Object.create(parentVal || null) }\n  if (true) {\n    assertObjectType(key, childVal, vm);\n  }\n  if (!parentVal) { return childVal }\n  var ret = {};\n  extend(ret, parentVal);\n  for (var key$1 in childVal) {\n    var parent = ret[key$1];\n    var child = childVal[key$1];\n    if (parent && !Array.isArray(parent)) {\n      parent = [parent];\n    }\n    ret[key$1] = parent\n      ? parent.concat(child)\n      : Array.isArray(child) ? child : [child];\n  }\n  return ret\n};\n\n/**\n * Other object hashes.\n */\nstrats.props =\nstrats.methods =\nstrats.inject =\nstrats.computed = function (\n  parentVal,\n  childVal,\n  vm,\n  key\n) {\n  if (childVal && \"sandbox\" !== 'production') {\n    assertObjectType(key, childVal, vm);\n  }\n  if (!parentVal) { return childVal }\n  var ret = Object.create(null);\n  extend(ret, parentVal);\n  if (childVal) { extend(ret, childVal); }\n  return ret\n};\nstrats.provide = mergeDataOrFn;\n\n/**\n * Default strategy.\n */\nvar defaultStrat = function (parentVal, childVal) {\n  return childVal === undefined\n    ? parentVal\n    : childVal\n};\n\n/**\n * Validate component names\n */\nfunction checkComponents (options) {\n  for (var key in options.components) {\n    validateComponentName(key);\n  }\n}\n\nfunction validateComponentName (name) {\n  if (!new RegExp((\"^[a-zA-Z][\\\\-\\\\.0-9_\" + (unicodeRegExp.source) + \"]*$\")).test(name)) {\n    warn(\n      'Invalid component name: \"' + name + '\". Component names ' +\n      'should conform to valid custom element name in html5 specification.'\n    );\n  }\n  if (isBuiltInTag(name) || config.isReservedTag(name)) {\n    warn(\n      'Do not use built-in or reserved HTML elements as component ' +\n      'id: ' + name\n    );\n  }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\nfunction normalizeProps (options, vm) {\n  var props = options.props;\n  if (!props) { return }\n  var res = {};\n  var i, val, name;\n  if (Array.isArray(props)) {\n    i = props.length;\n    while (i--) {\n      val = props[i];\n      if (typeof val === 'string') {\n        name = camelize(val);\n        res[name] = { type: null };\n      } else if (true) {\n        warn('props must be strings when using array syntax.');\n      }\n    }\n  } else if (isPlainObject(props)) {\n    for (var key in props) {\n      val = props[key];\n      name = camelize(key);\n      res[name] = isPlainObject(val)\n        ? val\n        : { type: val };\n    }\n  } else if (true) {\n    warn(\n      \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n      \"but got \" + (toRawType(props)) + \".\",\n      vm\n    );\n  }\n  options.props = res;\n}\n\n/**\n * Normalize all injections into Object-based format\n */\nfunction normalizeInject (options, vm) {\n  var inject = options.inject;\n  if (!inject) { return }\n  var normalized = options.inject = {};\n  if (Array.isArray(inject)) {\n    for (var i = 0; i < inject.length; i++) {\n      normalized[inject[i]] = { from: inject[i] };\n    }\n  } else if (isPlainObject(inject)) {\n    for (var key in inject) {\n      var val = inject[key];\n      normalized[key] = isPlainObject(val)\n        ? extend({ from: key }, val)\n        : { from: val };\n    }\n  } else if (true) {\n    warn(\n      \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n      \"but got \" + (toRawType(inject)) + \".\",\n      vm\n    );\n  }\n}\n\n/**\n * Normalize raw function directives into object format.\n */\nfunction normalizeDirectives (options) {\n  var dirs = options.directives;\n  if (dirs) {\n    for (var key in dirs) {\n      var def$$1 = dirs[key];\n      if (typeof def$$1 === 'function') {\n        dirs[key] = { bind: def$$1, update: def$$1 };\n      }\n    }\n  }\n}\n\nfunction assertObjectType (name, value, vm) {\n  if (!isPlainObject(value)) {\n    warn(\n      \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n      \"but got \" + (toRawType(value)) + \".\",\n      vm\n    );\n  }\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\nfunction mergeOptions (\n  parent,\n  child,\n  vm\n) {\n  if (true) {\n    checkComponents(child);\n  }\n\n  if (typeof child === 'function') {\n    child = child.options;\n  }\n\n  normalizeProps(child, vm);\n  normalizeInject(child, vm);\n  normalizeDirectives(child);\n\n  // Apply extends and mixins on the child options,\n  // but only if it is a raw options object that isn't\n  // the result of another mergeOptions call.\n  // Only merged options has the _base property.\n  if (!child._base) {\n    if (child.extends) {\n      parent = mergeOptions(parent, child.extends, vm);\n    }\n    if (child.mixins) {\n      for (var i = 0, l = child.mixins.length; i < l; i++) {\n        parent = mergeOptions(parent, child.mixins[i], vm);\n      }\n    }\n  }\n\n  var options = {};\n  var key;\n  for (key in parent) {\n    mergeField(key);\n  }\n  for (key in child) {\n    if (!hasOwn(parent, key)) {\n      mergeField(key);\n    }\n  }\n  function mergeField (key) {\n    var strat = strats[key] || defaultStrat;\n    options[key] = strat(parent[key], child[key], vm, key);\n  }\n  return options\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\nfunction resolveAsset (\n  options,\n  type,\n  id,\n  warnMissing\n) {\n  /* istanbul ignore if */\n  if (typeof id !== 'string') {\n    return\n  }\n  var assets = options[type];\n  // check local registration variations first\n  if (hasOwn(assets, id)) { return assets[id] }\n  var camelizedId = camelize(id);\n  if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n  var PascalCaseId = capitalize(camelizedId);\n  if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n  // fallback to prototype chain\n  var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n  if ( true && warnMissing && !res) {\n    warn(\n      'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n      options\n    );\n  }\n  return res\n}\n\n/*  */\n\n\n\nfunction validateProp (\n  key,\n  propOptions,\n  propsData,\n  vm\n) {\n  var prop = propOptions[key];\n  var absent = !hasOwn(propsData, key);\n  var value = propsData[key];\n  // boolean casting\n  var booleanIndex = getTypeIndex(Boolean, prop.type);\n  if (booleanIndex > -1) {\n    if (absent && !hasOwn(prop, 'default')) {\n      value = false;\n    } else if (value === '' || value === hyphenate(key)) {\n      // only cast empty string / same name to boolean if\n      // boolean has higher priority\n      var stringIndex = getTypeIndex(String, prop.type);\n      if (stringIndex < 0 || booleanIndex < stringIndex) {\n        value = true;\n      }\n    }\n  }\n  // check default value\n  if (value === undefined) {\n    value = getPropDefaultValue(vm, prop, key);\n    // since the default value is a fresh copy,\n    // make sure to observe it.\n    var prevShouldObserve = shouldObserve;\n    toggleObserving(true);\n    observe(value);\n    toggleObserving(prevShouldObserve);\n  }\n  if (\n    true\n  ) {\n    assertProp(prop, key, value, vm, absent);\n  }\n  return value\n}\n\n/**\n * Get the default value of a prop.\n */\nfunction getPropDefaultValue (vm, prop, key) {\n  // no default, return undefined\n  if (!hasOwn(prop, 'default')) {\n    return undefined\n  }\n  var def = prop.default;\n  // warn against non-factory defaults for Object & Array\n  if ( true && isObject(def)) {\n    warn(\n      'Invalid default value for prop \"' + key + '\": ' +\n      'Props with type Object/Array must use a factory function ' +\n      'to return the default value.',\n      vm\n    );\n  }\n  // the raw prop value was also undefined from previous render,\n  // return previous default value to avoid unnecessary watcher trigger\n  if (vm && vm.$options.propsData &&\n    vm.$options.propsData[key] === undefined &&\n    vm._props[key] !== undefined\n  ) {\n    return vm._props[key]\n  }\n  // call factory function for non-Function types\n  // a value is Function if its prototype is function even across different execution context\n  return typeof def === 'function' && getType(prop.type) !== 'Function'\n    ? def.call(vm)\n    : def\n}\n\n/**\n * Assert whether a prop is valid.\n */\nfunction assertProp (\n  prop,\n  name,\n  value,\n  vm,\n  absent\n) {\n  if (prop.required && absent) {\n    warn(\n      'Missing required prop: \"' + name + '\"',\n      vm\n    );\n    return\n  }\n  if (value == null && !prop.required) {\n    return\n  }\n  var type = prop.type;\n  var valid = !type || type === true;\n  var expectedTypes = [];\n  if (type) {\n    if (!Array.isArray(type)) {\n      type = [type];\n    }\n    for (var i = 0; i < type.length && !valid; i++) {\n      var assertedType = assertType(value, type[i]);\n      expectedTypes.push(assertedType.expectedType || '');\n      valid = assertedType.valid;\n    }\n  }\n\n  if (!valid) {\n    warn(\n      getInvalidTypeMessage(name, value, expectedTypes),\n      vm\n    );\n    return\n  }\n  var validator = prop.validator;\n  if (validator) {\n    if (!validator(value)) {\n      warn(\n        'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n        vm\n      );\n    }\n  }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;\n\nfunction assertType (value, type) {\n  var valid;\n  var expectedType = getType(type);\n  if (simpleCheckRE.test(expectedType)) {\n    var t = typeof value;\n    valid = t === expectedType.toLowerCase();\n    // for primitive wrapper objects\n    if (!valid && t === 'object') {\n      valid = value instanceof type;\n    }\n  } else if (expectedType === 'Object') {\n    valid = isPlainObject(value);\n  } else if (expectedType === 'Array') {\n    valid = Array.isArray(value);\n  } else {\n    valid = value instanceof type;\n  }\n  return {\n    valid: valid,\n    expectedType: expectedType\n  }\n}\n\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\nfunction getType (fn) {\n  var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n  return match ? match[1] : ''\n}\n\nfunction isSameType (a, b) {\n  return getType(a) === getType(b)\n}\n\nfunction getTypeIndex (type, expectedTypes) {\n  if (!Array.isArray(expectedTypes)) {\n    return isSameType(expectedTypes, type) ? 0 : -1\n  }\n  for (var i = 0, len = expectedTypes.length; i < len; i++) {\n    if (isSameType(expectedTypes[i], type)) {\n      return i\n    }\n  }\n  return -1\n}\n\nfunction getInvalidTypeMessage (name, value, expectedTypes) {\n  var message = \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n    \" Expected \" + (expectedTypes.map(capitalize).join(', '));\n  var expectedType = expectedTypes[0];\n  var receivedType = toRawType(value);\n  var expectedValue = styleValue(value, expectedType);\n  var receivedValue = styleValue(value, receivedType);\n  // check if we need to specify expected value\n  if (expectedTypes.length === 1 &&\n      isExplicable(expectedType) &&\n      !isBoolean(expectedType, receivedType)) {\n    message += \" with value \" + expectedValue;\n  }\n  message += \", got \" + receivedType + \" \";\n  // check if we need to specify received value\n  if (isExplicable(receivedType)) {\n    message += \"with value \" + receivedValue + \".\";\n  }\n  return message\n}\n\nfunction styleValue (value, type) {\n  if (type === 'String') {\n    return (\"\\\"\" + value + \"\\\"\")\n  } else if (type === 'Number') {\n    return (\"\" + (Number(value)))\n  } else {\n    return (\"\" + value)\n  }\n}\n\nfunction isExplicable (value) {\n  var explicitTypes = ['string', 'number', 'boolean'];\n  return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })\n}\n\nfunction isBoolean () {\n  var args = [], len = arguments.length;\n  while ( len-- ) args[ len ] = arguments[ len ];\n\n  return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })\n}\n\n/*  */\n\nfunction handleError (err, vm, info) {\n  // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.\n  // See: https://github.com/vuejs/vuex/issues/1505\n  pushTarget();\n  try {\n    if (vm) {\n      var cur = vm;\n      while ((cur = cur.$parent)) {\n        var hooks = cur.$options.errorCaptured;\n        if (hooks) {\n          for (var i = 0; i < hooks.length; i++) {\n            try {\n              var capture = hooks[i].call(cur, err, vm, info) === false;\n              if (capture) { return }\n            } catch (e) {\n              globalHandleError(e, cur, 'errorCaptured hook');\n            }\n          }\n        }\n      }\n    }\n    globalHandleError(err, vm, info);\n  } finally {\n    popTarget();\n  }\n}\n\nfunction invokeWithErrorHandling (\n  handler,\n  context,\n  args,\n  vm,\n  info\n) {\n  var res;\n  try {\n    res = args ? handler.apply(context, args) : handler.call(context);\n    if (res && !res._isVue && isPromise(res) && !res._handled) {\n      res.catch(function (e) { return handleError(e, vm, info + \" (Promise/async)\"); });\n      // issue #9511\n      // avoid catch triggering multiple times when nested calls\n      res._handled = true;\n    }\n  } catch (e) {\n    handleError(e, vm, info);\n  }\n  return res\n}\n\nfunction globalHandleError (err, vm, info) {\n  if (config.errorHandler) {\n    try {\n      return config.errorHandler.call(null, err, vm, info)\n    } catch (e) {\n      // if the user intentionally throws the original error in the handler,\n      // do not log it twice\n      if (e !== err) {\n        logError(e, null, 'config.errorHandler');\n      }\n    }\n  }\n  logError(err, vm, info);\n}\n\nfunction logError (err, vm, info) {\n  if (true) {\n    warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n  }\n  /* istanbul ignore else */\n  if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n    console.error(err);\n  } else {\n    throw err\n  }\n}\n\n/*  */\n\nvar isUsingMicroTask = false;\n\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks () {\n  pending = false;\n  var copies = callbacks.slice(0);\n  callbacks.length = 0;\n  for (var i = 0; i < copies.length; i++) {\n    copies[i]();\n  }\n}\n\n// Here we have async deferring wrappers using microtasks.\n// In 2.5 we used (macro) tasks (in combination with microtasks).\n// However, it has subtle problems when state is changed right before repaint\n// (e.g. #6813, out-in transitions).\n// Also, using (macro) tasks in event handler would cause some weird behaviors\n// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).\n// So we now use microtasks everywhere, again.\n// A major drawback of this tradeoff is that there are some scenarios\n// where microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690, which have workarounds)\n// or even between bubbling of the same event (#6566).\nvar timerFunc;\n\n// The nextTick behavior leverages the microtask queue, which can be accessed\n// via either native Promise.then or MutationObserver.\n// MutationObserver has wider support, however it is seriously bugged in\n// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n// completely stops working after triggering a few times... so, if native\n// Promise is available, we will use it:\n/* istanbul ignore next, $flow-disable-line */\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n  var p = Promise.resolve();\n  timerFunc = function () {\n    p.then(flushCallbacks);\n    // In problematic UIWebViews, Promise.then doesn't completely break, but\n    // it can get stuck in a weird state where callbacks are pushed into the\n    // microtask queue but the queue isn't being flushed, until the browser\n    // needs to do some other work, e.g. handle a timer. Therefore we can\n    // \"force\" the microtask queue to be flushed by adding an empty timer.\n    if (isIOS) { setTimeout(noop); }\n  };\n  isUsingMicroTask = true;\n} else if (!isIE && typeof MutationObserver !== 'undefined' && (\n  isNative(MutationObserver) ||\n  // PhantomJS and iOS 7.x\n  MutationObserver.toString() === '[object MutationObserverConstructor]'\n)) {\n  // Use MutationObserver where native Promise is not available,\n  // e.g. PhantomJS, iOS7, Android 4.4\n  // (#6466 MutationObserver is unreliable in IE11)\n  var counter = 1;\n  var observer = new MutationObserver(flushCallbacks);\n  var textNode = document.createTextNode(String(counter));\n  observer.observe(textNode, {\n    characterData: true\n  });\n  timerFunc = function () {\n    counter = (counter + 1) % 2;\n    textNode.data = String(counter);\n  };\n  isUsingMicroTask = true;\n} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n  // Fallback to setImmediate.\n  // Techinically it leverages the (macro) task queue,\n  // but it is still a better choice than setTimeout.\n  timerFunc = function () {\n    setImmediate(flushCallbacks);\n  };\n} else {\n  // Fallback to setTimeout.\n  timerFunc = function () {\n    setTimeout(flushCallbacks, 0);\n  };\n}\n\nfunction nextTick (cb, ctx) {\n  var _resolve;\n  callbacks.push(function () {\n    if (cb) {\n      try {\n        cb.call(ctx);\n      } catch (e) {\n        handleError(e, ctx, 'nextTick');\n      }\n    } else if (_resolve) {\n      _resolve(ctx);\n    }\n  });\n  if (!pending) {\n    pending = true;\n    timerFunc();\n  }\n  // $flow-disable-line\n  if (!cb && typeof Promise !== 'undefined') {\n    return new Promise(function (resolve) {\n      _resolve = resolve;\n    })\n  }\n}\n\n/*  */\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\nvar initProxy;\n\nif (true) {\n  var allowedGlobals = makeMap(\n    'Infinity,undefined,NaN,isFinite,isNaN,' +\n    'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n    'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n    'require' // for Webpack/Browserify\n  );\n\n  var warnNonPresent = function (target, key) {\n    warn(\n      \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n      'referenced during render. Make sure that this property is reactive, ' +\n      'either in the data option, or for class-based components, by ' +\n      'initializing the property. ' +\n      'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n      target\n    );\n  };\n\n  var warnReservedPrefix = function (target, key) {\n    warn(\n      \"Property \\\"\" + key + \"\\\" must be accessed with \\\"$data.\" + key + \"\\\" because \" +\n      'properties starting with \"$\" or \"_\" are not proxied in the Vue instance to ' +\n      'prevent conflicts with Vue internals' +\n      'See: https://vuejs.org/v2/api/#data',\n      target\n    );\n  };\n\n  var hasProxy =\n    typeof Proxy !== 'undefined' && isNative(Proxy);\n\n  if (hasProxy) {\n    var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n    config.keyCodes = new Proxy(config.keyCodes, {\n      set: function set (target, key, value) {\n        if (isBuiltInModifier(key)) {\n          warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n          return false\n        } else {\n          target[key] = value;\n          return true\n        }\n      }\n    });\n  }\n\n  var hasHandler = {\n    has: function has (target, key) {\n      var has = key in target;\n      var isAllowed = allowedGlobals(key) ||\n        (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));\n      if (!has && !isAllowed) {\n        if (key in target.$data) { warnReservedPrefix(target, key); }\n        else { warnNonPresent(target, key); }\n      }\n      return has || !isAllowed\n    }\n  };\n\n  var getHandler = {\n    get: function get (target, key) {\n      if (typeof key === 'string' && !(key in target)) {\n        if (key in target.$data) { warnReservedPrefix(target, key); }\n        else { warnNonPresent(target, key); }\n      }\n      return target[key]\n    }\n  };\n\n  initProxy = function initProxy (vm) {\n    if (hasProxy) {\n      // determine which proxy handler to use\n      var options = vm.$options;\n      var handlers = options.render && options.render._withStripped\n        ? getHandler\n        : hasHandler;\n      vm._renderProxy = new Proxy(vm, handlers);\n    } else {\n      vm._renderProxy = vm;\n    }\n  };\n}\n\n/*  */\n\nvar seenObjects = new _Set();\n\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\nfunction traverse (val) {\n  _traverse(val, seenObjects);\n  seenObjects.clear();\n}\n\nfunction _traverse (val, seen) {\n  var i, keys;\n  var isA = Array.isArray(val);\n  if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n    return\n  }\n  if (val.__ob__) {\n    var depId = val.__ob__.dep.id;\n    if (seen.has(depId)) {\n      return\n    }\n    seen.add(depId);\n  }\n  if (isA) {\n    i = val.length;\n    while (i--) { _traverse(val[i], seen); }\n  } else {\n    keys = Object.keys(val);\n    i = keys.length;\n    while (i--) { _traverse(val[keys[i]], seen); }\n  }\n}\n\nvar mark;\nvar measure;\n\nif (true) {\n  var perf = inBrowser && window.performance;\n  /* istanbul ignore if */\n  if (\n    perf &&\n    perf.mark &&\n    perf.measure &&\n    perf.clearMarks &&\n    perf.clearMeasures\n  ) {\n    mark = function (tag) { return perf.mark(tag); };\n    measure = function (name, startTag, endTag) {\n      perf.measure(name, startTag, endTag);\n      perf.clearMarks(startTag);\n      perf.clearMarks(endTag);\n      // perf.clearMeasures(name)\n    };\n  }\n}\n\n/*  */\n\nvar normalizeEvent = cached(function (name) {\n  var passive = name.charAt(0) === '&';\n  name = passive ? name.slice(1) : name;\n  var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n  name = once$$1 ? name.slice(1) : name;\n  var capture = name.charAt(0) === '!';\n  name = capture ? name.slice(1) : name;\n  return {\n    name: name,\n    once: once$$1,\n    capture: capture,\n    passive: passive\n  }\n});\n\nfunction createFnInvoker (fns, vm) {\n  function invoker () {\n    var arguments$1 = arguments;\n\n    var fns = invoker.fns;\n    if (Array.isArray(fns)) {\n      var cloned = fns.slice();\n      for (var i = 0; i < cloned.length; i++) {\n        invokeWithErrorHandling(cloned[i], null, arguments$1, vm, \"v-on handler\");\n      }\n    } else {\n      // return handler return value for single handlers\n      return invokeWithErrorHandling(fns, null, arguments, vm, \"v-on handler\")\n    }\n  }\n  invoker.fns = fns;\n  return invoker\n}\n\nfunction updateListeners (\n  on,\n  oldOn,\n  add,\n  remove$$1,\n  createOnceHandler,\n  vm\n) {\n  var name, def$$1, cur, old, event;\n  for (name in on) {\n    def$$1 = cur = on[name];\n    old = oldOn[name];\n    event = normalizeEvent(name);\n    if (isUndef(cur)) {\n       true && warn(\n        \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n        vm\n      );\n    } else if (isUndef(old)) {\n      if (isUndef(cur.fns)) {\n        cur = on[name] = createFnInvoker(cur, vm);\n      }\n      if (isTrue(event.once)) {\n        cur = on[name] = createOnceHandler(event.name, cur, event.capture);\n      }\n      add(event.name, cur, event.capture, event.passive, event.params);\n    } else if (cur !== old) {\n      old.fns = cur;\n      on[name] = old;\n    }\n  }\n  for (name in oldOn) {\n    if (isUndef(on[name])) {\n      event = normalizeEvent(name);\n      remove$$1(event.name, oldOn[name], event.capture);\n    }\n  }\n}\n\n/*  */\n\nfunction mergeVNodeHook (def, hookKey, hook) {\n  if (def instanceof VNode) {\n    def = def.data.hook || (def.data.hook = {});\n  }\n  var invoker;\n  var oldHook = def[hookKey];\n\n  function wrappedHook () {\n    hook.apply(this, arguments);\n    // important: remove merged hook to ensure it's called only once\n    // and prevent memory leak\n    remove(invoker.fns, wrappedHook);\n  }\n\n  if (isUndef(oldHook)) {\n    // no existing hook\n    invoker = createFnInvoker([wrappedHook]);\n  } else {\n    /* istanbul ignore if */\n    if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n      // already a merged invoker\n      invoker = oldHook;\n      invoker.fns.push(wrappedHook);\n    } else {\n      // existing plain hook\n      invoker = createFnInvoker([oldHook, wrappedHook]);\n    }\n  }\n\n  invoker.merged = true;\n  def[hookKey] = invoker;\n}\n\n/*  */\n\nfunction extractPropsFromVNodeData (\n  data,\n  Ctor,\n  tag\n) {\n  // we are only extracting raw values here.\n  // validation and default values are handled in the child\n  // component itself.\n  var propOptions = Ctor.options.props;\n  if (isUndef(propOptions)) {\n    return\n  }\n  var res = {};\n  var attrs = data.attrs;\n  var props = data.props;\n  if (isDef(attrs) || isDef(props)) {\n    for (var key in propOptions) {\n      var altKey = hyphenate(key);\n      if (true) {\n        var keyInLowerCase = key.toLowerCase();\n        if (\n          key !== keyInLowerCase &&\n          attrs && hasOwn(attrs, keyInLowerCase)\n        ) {\n          tip(\n            \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n            (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n            \" \\\"\" + key + \"\\\". \" +\n            \"Note that HTML attributes are case-insensitive and camelCased \" +\n            \"props need to use their kebab-case equivalents when using in-DOM \" +\n            \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n          );\n        }\n      }\n      checkProp(res, props, key, altKey, true) ||\n      checkProp(res, attrs, key, altKey, false);\n    }\n  }\n  return res\n}\n\nfunction checkProp (\n  res,\n  hash,\n  key,\n  altKey,\n  preserve\n) {\n  if (isDef(hash)) {\n    if (hasOwn(hash, key)) {\n      res[key] = hash[key];\n      if (!preserve) {\n        delete hash[key];\n      }\n      return true\n    } else if (hasOwn(hash, altKey)) {\n      res[key] = hash[altKey];\n      if (!preserve) {\n        delete hash[altKey];\n      }\n      return true\n    }\n  }\n  return false\n}\n\n/*  */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array<VNode>. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\nfunction simpleNormalizeChildren (children) {\n  for (var i = 0; i < children.length; i++) {\n    if (Array.isArray(children[i])) {\n      return Array.prototype.concat.apply([], children)\n    }\n  }\n  return children\n}\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g. <template>, <slot>, v-for, or when the children is provided by user\n// with hand-written render functions / JSX. In such cases a full normalization\n// is needed to cater to all possible types of children values.\nfunction normalizeChildren (children) {\n  return isPrimitive(children)\n    ? [createTextVNode(children)]\n    : Array.isArray(children)\n      ? normalizeArrayChildren(children)\n      : undefined\n}\n\nfunction isTextNode (node) {\n  return isDef(node) && isDef(node.text) && isFalse(node.isComment)\n}\n\nfunction normalizeArrayChildren (children, nestedIndex) {\n  var res = [];\n  var i, c, lastIndex, last;\n  for (i = 0; i < children.length; i++) {\n    c = children[i];\n    if (isUndef(c) || typeof c === 'boolean') { continue }\n    lastIndex = res.length - 1;\n    last = res[lastIndex];\n    //  nested\n    if (Array.isArray(c)) {\n      if (c.length > 0) {\n        c = normalizeArrayChildren(c, ((nestedIndex || '') + \"_\" + i));\n        // merge adjacent text nodes\n        if (isTextNode(c[0]) && isTextNode(last)) {\n          res[lastIndex] = createTextVNode(last.text + (c[0]).text);\n          c.shift();\n        }\n        res.push.apply(res, c);\n      }\n    } else if (isPrimitive(c)) {\n      if (isTextNode(last)) {\n        // merge adjacent text nodes\n        // this is necessary for SSR hydration because text nodes are\n        // essentially merged when rendered to HTML strings\n        res[lastIndex] = createTextVNode(last.text + c);\n      } else if (c !== '') {\n        // convert primitive to vnode\n        res.push(createTextVNode(c));\n      }\n    } else {\n      if (isTextNode(c) && isTextNode(last)) {\n        // merge adjacent text nodes\n        res[lastIndex] = createTextVNode(last.text + c.text);\n      } else {\n        // default key for nested array children (likely generated by v-for)\n        if (isTrue(children._isVList) &&\n          isDef(c.tag) &&\n          isUndef(c.key) &&\n          isDef(nestedIndex)) {\n          c.key = \"__vlist\" + nestedIndex + \"_\" + i + \"__\";\n        }\n        res.push(c);\n      }\n    }\n  }\n  return res\n}\n\n/*  */\n\nfunction initProvide (vm) {\n  var provide = vm.$options.provide;\n  if (provide) {\n    vm._provided = typeof provide === 'function'\n      ? provide.call(vm)\n      : provide;\n  }\n}\n\nfunction initInjections (vm) {\n  var result = resolveInject(vm.$options.inject, vm);\n  if (result) {\n    toggleObserving(false);\n    Object.keys(result).forEach(function (key) {\n      /* istanbul ignore else */\n      if (true) {\n        defineReactive$$1(vm, key, result[key], function () {\n          warn(\n            \"Avoid mutating an injected value directly since the changes will be \" +\n            \"overwritten whenever the provided component re-renders. \" +\n            \"injection being mutated: \\\"\" + key + \"\\\"\",\n            vm\n          );\n        });\n      } else {}\n    });\n    toggleObserving(true);\n  }\n}\n\nfunction resolveInject (inject, vm) {\n  if (inject) {\n    // inject is :any because flow is not smart enough to figure out cached\n    var result = Object.create(null);\n    var keys = hasSymbol\n      ? Reflect.ownKeys(inject)\n      : Object.keys(inject);\n\n    for (var i = 0; i < keys.length; i++) {\n      var key = keys[i];\n      // #6574 in case the inject object is observed...\n      if (key === '__ob__') { continue }\n      var provideKey = inject[key].from;\n      var source = vm;\n      while (source) {\n        if (source._provided && hasOwn(source._provided, provideKey)) {\n          result[key] = source._provided[provideKey];\n          break\n        }\n        source = source.$parent;\n      }\n      if (!source) {\n        if ('default' in inject[key]) {\n          var provideDefault = inject[key].default;\n          result[key] = typeof provideDefault === 'function'\n            ? provideDefault.call(vm)\n            : provideDefault;\n        } else if (true) {\n          warn((\"Injection \\\"\" + key + \"\\\" not found\"), vm);\n        }\n      }\n    }\n    return result\n  }\n}\n\n/*  */\n\n\n\n/**\n * Runtime helper for resolving raw children VNodes into a slot object.\n */\nfunction resolveSlots (\n  children,\n  context\n) {\n  if (!children || !children.length) {\n    return {}\n  }\n  var slots = {};\n  for (var i = 0, l = children.length; i < l; i++) {\n    var child = children[i];\n    var data = child.data;\n    // remove slot attribute if the node is resolved as a Vue slot node\n    if (data && data.attrs && data.attrs.slot) {\n      delete data.attrs.slot;\n    }\n    // named slots should only be respected if the vnode was rendered in the\n    // same context.\n    if ((child.context === context || child.fnContext === context) &&\n      data && data.slot != null\n    ) {\n      var name = data.slot;\n      var slot = (slots[name] || (slots[name] = []));\n      if (child.tag === 'template') {\n        slot.push.apply(slot, child.children || []);\n      } else {\n        slot.push(child);\n      }\n    } else {\n      (slots.default || (slots.default = [])).push(child);\n    }\n  }\n  // ignore slots that contains only whitespace\n  for (var name$1 in slots) {\n    if (slots[name$1].every(isWhitespace)) {\n      delete slots[name$1];\n    }\n  }\n  return slots\n}\n\nfunction isWhitespace (node) {\n  return (node.isComment && !node.asyncFactory) || node.text === ' '\n}\n\n/*  */\n\nfunction normalizeScopedSlots (\n  slots,\n  normalSlots,\n  prevSlots\n) {\n  var res;\n  var hasNormalSlots = Object.keys(normalSlots).length > 0;\n  var isStable = slots ? !!slots.$stable : !hasNormalSlots;\n  var key = slots && slots.$key;\n  if (!slots) {\n    res = {};\n  } else if (slots._normalized) {\n    // fast path 1: child component re-render only, parent did not change\n    return slots._normalized\n  } else if (\n    isStable &&\n    prevSlots &&\n    prevSlots !== emptyObject &&\n    key === prevSlots.$key &&\n    !hasNormalSlots &&\n    !prevSlots.$hasNormal\n  ) {\n    // fast path 2: stable scoped slots w/ no normal slots to proxy,\n    // only need to normalize once\n    return prevSlots\n  } else {\n    res = {};\n    for (var key$1 in slots) {\n      if (slots[key$1] && key$1[0] !== '$') {\n        res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);\n      }\n    }\n  }\n  // expose normal slots on scopedSlots\n  for (var key$2 in normalSlots) {\n    if (!(key$2 in res)) {\n      res[key$2] = proxyNormalSlot(normalSlots, key$2);\n    }\n  }\n  // avoriaz seems to mock a non-extensible $scopedSlots object\n  // and when that is passed down this would cause an error\n  if (slots && Object.isExtensible(slots)) {\n    (slots)._normalized = res;\n  }\n  def(res, '$stable', isStable);\n  def(res, '$key', key);\n  def(res, '$hasNormal', hasNormalSlots);\n  return res\n}\n\nfunction normalizeScopedSlot(normalSlots, key, fn) {\n  var normalized = function () {\n    var res = arguments.length ? fn.apply(null, arguments) : fn({});\n    res = res && typeof res === 'object' && !Array.isArray(res)\n      ? [res] // single vnode\n      : normalizeChildren(res);\n    return res && (\n      res.length === 0 ||\n      (res.length === 1 && res[0].isComment) // #9658\n    ) ? undefined\n      : res\n  };\n  // this is a slot using the new v-slot syntax without scope. although it is\n  // compiled as a scoped slot, render fn users would expect it to be present\n  // on this.$slots because the usage is semantically a normal slot.\n  if (fn.proxy) {\n    Object.defineProperty(normalSlots, key, {\n      get: normalized,\n      enumerable: true,\n      configurable: true\n    });\n  }\n  return normalized\n}\n\nfunction proxyNormalSlot(slots, key) {\n  return function () { return slots[key]; }\n}\n\n/*  */\n\n/**\n * Runtime helper for rendering v-for lists.\n */\nfunction renderList (\n  val,\n  render\n) {\n  var ret, i, l, keys, key;\n  if (Array.isArray(val) || typeof val === 'string') {\n    ret = new Array(val.length);\n    for (i = 0, l = val.length; i < l; i++) {\n      ret[i] = render(val[i], i);\n    }\n  } else if (typeof val === 'number') {\n    ret = new Array(val);\n    for (i = 0; i < val; i++) {\n      ret[i] = render(i + 1, i);\n    }\n  } else if (isObject(val)) {\n    if (hasSymbol && val[Symbol.iterator]) {\n      ret = [];\n      var iterator = val[Symbol.iterator]();\n      var result = iterator.next();\n      while (!result.done) {\n        ret.push(render(result.value, ret.length));\n        result = iterator.next();\n      }\n    } else {\n      keys = Object.keys(val);\n      ret = new Array(keys.length);\n      for (i = 0, l = keys.length; i < l; i++) {\n        key = keys[i];\n        ret[i] = render(val[key], key, i);\n      }\n    }\n  }\n  if (!isDef(ret)) {\n    ret = [];\n  }\n  (ret)._isVList = true;\n  return ret\n}\n\n/*  */\n\n/**\n * Runtime helper for rendering <slot>\n */\nfunction renderSlot (\n  name,\n  fallback,\n  props,\n  bindObject\n) {\n  var scopedSlotFn = this.$scopedSlots[name];\n  var nodes;\n  if (scopedSlotFn) { // scoped slot\n    props = props || {};\n    if (bindObject) {\n      if ( true && !isObject(bindObject)) {\n        warn(\n          'slot v-bind without argument expects an Object',\n          this\n        );\n      }\n      props = extend(extend({}, bindObject), props);\n    }\n    nodes = scopedSlotFn(props) || fallback;\n  } else {\n    nodes = this.$slots[name] || fallback;\n  }\n\n  var target = props && props.slot;\n  if (target) {\n    return this.$createElement('template', { slot: target }, nodes)\n  } else {\n    return nodes\n  }\n}\n\n/*  */\n\n/**\n * Runtime helper for resolving filters\n */\nfunction resolveFilter (id) {\n  return resolveAsset(this.$options, 'filters', id, true) || identity\n}\n\n/*  */\n\nfunction isKeyNotMatch (expect, actual) {\n  if (Array.isArray(expect)) {\n    return expect.indexOf(actual) === -1\n  } else {\n    return expect !== actual\n  }\n}\n\n/**\n * Runtime helper for checking keyCodes from config.\n * exposed as Vue.prototype._k\n * passing in eventKeyName as last argument separately for backwards compat\n */\nfunction checkKeyCodes (\n  eventKeyCode,\n  key,\n  builtInKeyCode,\n  eventKeyName,\n  builtInKeyName\n) {\n  var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;\n  if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {\n    return isKeyNotMatch(builtInKeyName, eventKeyName)\n  } else if (mappedKeyCode) {\n    return isKeyNotMatch(mappedKeyCode, eventKeyCode)\n  } else if (eventKeyName) {\n    return hyphenate(eventKeyName) !== key\n  }\n}\n\n/*  */\n\n/**\n * Runtime helper for merging v-bind=\"object\" into a VNode's data.\n */\nfunction bindObjectProps (\n  data,\n  tag,\n  value,\n  asProp,\n  isSync\n) {\n  if (value) {\n    if (!isObject(value)) {\n       true && warn(\n        'v-bind without argument expects an Object or Array value',\n        this\n      );\n    } else {\n      if (Array.isArray(value)) {\n        value = toObject(value);\n      }\n      var hash;\n      var loop = function ( key ) {\n        if (\n          key === 'class' ||\n          key === 'style' ||\n          isReservedAttribute(key)\n        ) {\n          hash = data;\n        } else {\n          var type = data.attrs && data.attrs.type;\n          hash = asProp || config.mustUseProp(tag, type, key)\n            ? data.domProps || (data.domProps = {})\n            : data.attrs || (data.attrs = {});\n        }\n        var camelizedKey = camelize(key);\n        var hyphenatedKey = hyphenate(key);\n        if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {\n          hash[key] = value[key];\n\n          if (isSync) {\n            var on = data.on || (data.on = {});\n            on[(\"update:\" + key)] = function ($event) {\n              value[key] = $event;\n            };\n          }\n        }\n      };\n\n      for (var key in value) loop( key );\n    }\n  }\n  return data\n}\n\n/*  */\n\n/**\n * Runtime helper for rendering static trees.\n */\nfunction renderStatic (\n  index,\n  isInFor\n) {\n  var cached = this._staticTrees || (this._staticTrees = []);\n  var tree = cached[index];\n  // if has already-rendered static tree and not inside v-for,\n  // we can reuse the same tree.\n  if (tree && !isInFor) {\n    return tree\n  }\n  // otherwise, render a fresh tree.\n  tree = cached[index] = this.$options.staticRenderFns[index].call(\n    this._renderProxy,\n    null,\n    this // for render fns generated for functional component templates\n  );\n  markStatic(tree, (\"__static__\" + index), false);\n  return tree\n}\n\n/**\n * Runtime helper for v-once.\n * Effectively it means marking the node as static with a unique key.\n */\nfunction markOnce (\n  tree,\n  index,\n  key\n) {\n  markStatic(tree, (\"__once__\" + index + (key ? (\"_\" + key) : \"\")), true);\n  return tree\n}\n\nfunction markStatic (\n  tree,\n  key,\n  isOnce\n) {\n  if (Array.isArray(tree)) {\n    for (var i = 0; i < tree.length; i++) {\n      if (tree[i] && typeof tree[i] !== 'string') {\n        markStaticNode(tree[i], (key + \"_\" + i), isOnce);\n      }\n    }\n  } else {\n    markStaticNode(tree, key, isOnce);\n  }\n}\n\nfunction markStaticNode (node, key, isOnce) {\n  node.isStatic = true;\n  node.key = key;\n  node.isOnce = isOnce;\n}\n\n/*  */\n\nfunction bindObjectListeners (data, value) {\n  if (value) {\n    if (!isPlainObject(value)) {\n       true && warn(\n        'v-on without argument expects an Object value',\n        this\n      );\n    } else {\n      var on = data.on = data.on ? extend({}, data.on) : {};\n      for (var key in value) {\n        var existing = on[key];\n        var ours = value[key];\n        on[key] = existing ? [].concat(existing, ours) : ours;\n      }\n    }\n  }\n  return data\n}\n\n/*  */\n\nfunction resolveScopedSlots (\n  fns, // see flow/vnode\n  res,\n  // the following are added in 2.6\n  hasDynamicKeys,\n  contentHashKey\n) {\n  res = res || { $stable: !hasDynamicKeys };\n  for (var i = 0; i < fns.length; i++) {\n    var slot = fns[i];\n    if (Array.isArray(slot)) {\n      resolveScopedSlots(slot, res, hasDynamicKeys);\n    } else if (slot) {\n      // marker for reverse proxying v-slot without scope on this.$slots\n      if (slot.proxy) {\n        slot.fn.proxy = true;\n      }\n      res[slot.key] = slot.fn;\n    }\n  }\n  if (contentHashKey) {\n    (res).$key = contentHashKey;\n  }\n  return res\n}\n\n/*  */\n\nfunction bindDynamicKeys (baseObj, values) {\n  for (var i = 0; i < values.length; i += 2) {\n    var key = values[i];\n    if (typeof key === 'string' && key) {\n      baseObj[values[i]] = values[i + 1];\n    } else if ( true && key !== '' && key !== null) {\n      // null is a speical value for explicitly removing a binding\n      warn(\n        (\"Invalid value for dynamic directive argument (expected string or null): \" + key),\n        this\n      );\n    }\n  }\n  return baseObj\n}\n\n// helper to dynamically append modifier runtime markers to event names.\n// ensure only append when value is already string, otherwise it will be cast\n// to string and cause the type check to miss.\nfunction prependModifier (value, symbol) {\n  return typeof value === 'string' ? symbol + value : value\n}\n\n/*  */\n\nfunction installRenderHelpers (target) {\n  target._o = markOnce;\n  target._n = toNumber;\n  target._s = toString;\n  target._l = renderList;\n  target._t = renderSlot;\n  target._q = looseEqual;\n  target._i = looseIndexOf;\n  target._m = renderStatic;\n  target._f = resolveFilter;\n  target._k = checkKeyCodes;\n  target._b = bindObjectProps;\n  target._v = createTextVNode;\n  target._e = createEmptyVNode;\n  target._u = resolveScopedSlots;\n  target._g = bindObjectListeners;\n  target._d = bindDynamicKeys;\n  target._p = prependModifier;\n}\n\n/*  */\n\nfunction FunctionalRenderContext (\n  data,\n  props,\n  children,\n  parent,\n  Ctor\n) {\n  var this$1 = this;\n\n  var options = Ctor.options;\n  // ensure the createElement function in functional components\n  // gets a unique context - this is necessary for correct named slot check\n  var contextVm;\n  if (hasOwn(parent, '_uid')) {\n    contextVm = Object.create(parent);\n    // $flow-disable-line\n    contextVm._original = parent;\n  } else {\n    // the context vm passed in is a functional context as well.\n    // in this case we want to make sure we are able to get a hold to the\n    // real context instance.\n    contextVm = parent;\n    // $flow-disable-line\n    parent = parent._original;\n  }\n  var isCompiled = isTrue(options._compiled);\n  var needNormalization = !isCompiled;\n\n  this.data = data;\n  this.props = props;\n  this.children = children;\n  this.parent = parent;\n  this.listeners = data.on || emptyObject;\n  this.injections = resolveInject(options.inject, parent);\n  this.slots = function () {\n    if (!this$1.$slots) {\n      normalizeScopedSlots(\n        data.scopedSlots,\n        this$1.$slots = resolveSlots(children, parent)\n      );\n    }\n    return this$1.$slots\n  };\n\n  Object.defineProperty(this, 'scopedSlots', ({\n    enumerable: true,\n    get: function get () {\n      return normalizeScopedSlots(data.scopedSlots, this.slots())\n    }\n  }));\n\n  // support for compiled functional template\n  if (isCompiled) {\n    // exposing $options for renderStatic()\n    this.$options = options;\n    // pre-resolve slots for renderSlot()\n    this.$slots = this.slots();\n    this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);\n  }\n\n  if (options._scopeId) {\n    this._c = function (a, b, c, d) {\n      var vnode = createElement(contextVm, a, b, c, d, needNormalization);\n      if (vnode && !Array.isArray(vnode)) {\n        vnode.fnScopeId = options._scopeId;\n        vnode.fnContext = parent;\n      }\n      return vnode\n    };\n  } else {\n    this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };\n  }\n}\n\ninstallRenderHelpers(FunctionalRenderContext.prototype);\n\nfunction createFunctionalComponent (\n  Ctor,\n  propsData,\n  data,\n  contextVm,\n  children\n) {\n  var options = Ctor.options;\n  var props = {};\n  var propOptions = options.props;\n  if (isDef(propOptions)) {\n    for (var key in propOptions) {\n      props[key] = validateProp(key, propOptions, propsData || emptyObject);\n    }\n  } else {\n    if (isDef(data.attrs)) { mergeProps(props, data.attrs); }\n    if (isDef(data.props)) { mergeProps(props, data.props); }\n  }\n\n  var renderContext = new FunctionalRenderContext(\n    data,\n    props,\n    children,\n    contextVm,\n    Ctor\n  );\n\n  var vnode = options.render.call(null, renderContext._c, renderContext);\n\n  if (vnode instanceof VNode) {\n    return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)\n  } else if (Array.isArray(vnode)) {\n    var vnodes = normalizeChildren(vnode) || [];\n    var res = new Array(vnodes.length);\n    for (var i = 0; i < vnodes.length; i++) {\n      res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);\n    }\n    return res\n  }\n}\n\nfunction cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {\n  // #7817 clone node before setting fnContext, otherwise if the node is reused\n  // (e.g. it was from a cached normal slot) the fnContext causes named slots\n  // that should not be matched to match.\n  var clone = cloneVNode(vnode);\n  clone.fnContext = contextVm;\n  clone.fnOptions = options;\n  if (true) {\n    (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;\n  }\n  if (data.slot) {\n    (clone.data || (clone.data = {})).slot = data.slot;\n  }\n  return clone\n}\n\nfunction mergeProps (to, from) {\n  for (var key in from) {\n    to[camelize(key)] = from[key];\n  }\n}\n\n/*  */\n\n/*  */\n\n/*  */\n\n/*  */\n\n// inline hooks to be invoked on component VNodes during patch\nvar componentVNodeHooks = {\n  init: function init (vnode, hydrating) {\n    if (\n      vnode.componentInstance &&\n      !vnode.componentInstance._isDestroyed &&\n      vnode.data.keepAlive\n    ) {\n      // kept-alive components, treat as a patch\n      var mountedNode = vnode; // work around flow\n      componentVNodeHooks.prepatch(mountedNode, mountedNode);\n    } else {\n      var child = vnode.componentInstance = createComponentInstanceForVnode(\n        vnode,\n        activeInstance\n      );\n      child.$mount(hydrating ? vnode.elm : undefined, hydrating);\n    }\n  },\n\n  prepatch: function prepatch (oldVnode, vnode) {\n    var options = vnode.componentOptions;\n    var child = vnode.componentInstance = oldVnode.componentInstance;\n    updateChildComponent(\n      child,\n      options.propsData, // updated props\n      options.listeners, // updated listeners\n      vnode, // new parent vnode\n      options.children // new children\n    );\n  },\n\n  insert: function insert (vnode) {\n    var context = vnode.context;\n    var componentInstance = vnode.componentInstance;\n    if (!componentInstance._isMounted) {\n      componentInstance._isMounted = true;\n      callHook(componentInstance, 'mounted');\n    }\n    if (vnode.data.keepAlive) {\n      if (context._isMounted) {\n        // vue-router#1212\n        // During updates, a kept-alive component's child components may\n        // change, so directly walking the tree here may call activated hooks\n        // on incorrect children. Instead we push them into a queue which will\n        // be processed after the whole patch process ended.\n        queueActivatedComponent(componentInstance);\n      } else {\n        activateChildComponent(componentInstance, true /* direct */);\n      }\n    }\n  },\n\n  destroy: function destroy (vnode) {\n    var componentInstance = vnode.componentInstance;\n    if (!componentInstance._isDestroyed) {\n      if (!vnode.data.keepAlive) {\n        componentInstance.$destroy();\n      } else {\n        deactivateChildComponent(componentInstance, true /* direct */);\n      }\n    }\n  }\n};\n\nvar hooksToMerge = Object.keys(componentVNodeHooks);\n\nfunction createComponent (\n  Ctor,\n  data,\n  context,\n  children,\n  tag\n) {\n  if (isUndef(Ctor)) {\n    return\n  }\n\n  var baseCtor = context.$options._base;\n\n  // plain options object: turn it into a constructor\n  if (isObject(Ctor)) {\n    Ctor = baseCtor.extend(Ctor);\n  }\n\n  // if at this stage it's not a constructor or an async component factory,\n  // reject.\n  if (typeof Ctor !== 'function') {\n    if (true) {\n      warn((\"Invalid Component definition: \" + (String(Ctor))), context);\n    }\n    return\n  }\n\n  // async component\n  var asyncFactory;\n  if (isUndef(Ctor.cid)) {\n    asyncFactory = Ctor;\n    Ctor = resolveAsyncComponent(asyncFactory, baseCtor);\n    if (Ctor === undefined) {\n      // return a placeholder node for async component, which is rendered\n      // as a comment node but preserves all the raw information for the node.\n      // the information will be used for async server-rendering and hydration.\n      return createAsyncPlaceholder(\n        asyncFactory,\n        data,\n        context,\n        children,\n        tag\n      )\n    }\n  }\n\n  data = data || {};\n\n  // resolve constructor options in case global mixins are applied after\n  // component constructor creation\n  resolveConstructorOptions(Ctor);\n\n  // transform component v-model data into props & events\n  if (isDef(data.model)) {\n    transformModel(Ctor.options, data);\n  }\n\n  // extract props\n  var propsData = extractPropsFromVNodeData(data, Ctor, tag);\n\n  // functional component\n  if (isTrue(Ctor.options.functional)) {\n    return createFunctionalComponent(Ctor, propsData, data, context, children)\n  }\n\n  // extract listeners, since these needs to be treated as\n  // child component listeners instead of DOM listeners\n  var listeners = data.on;\n  // replace with listeners with .native modifier\n  // so it gets processed during parent component patch.\n  data.on = data.nativeOn;\n\n  if (isTrue(Ctor.options.abstract)) {\n    // abstract components do not keep anything\n    // other than props & listeners & slot\n\n    // work around flow\n    var slot = data.slot;\n    data = {};\n    if (slot) {\n      data.slot = slot;\n    }\n  }\n\n  // install component management hooks onto the placeholder node\n  installComponentHooks(data);\n\n  // return a placeholder vnode\n  var name = Ctor.options.name || tag;\n  var vnode = new VNode(\n    (\"vue-component-\" + (Ctor.cid) + (name ? (\"-\" + name) : '')),\n    data, undefined, undefined, undefined, context,\n    { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },\n    asyncFactory\n  );\n\n  return vnode\n}\n\nfunction createComponentInstanceForVnode (\n  vnode, // we know it's MountedComponentVNode but flow doesn't\n  parent // activeInstance in lifecycle state\n) {\n  var options = {\n    _isComponent: true,\n    _parentVnode: vnode,\n    parent: parent\n  };\n  // check inline-template render functions\n  var inlineTemplate = vnode.data.inlineTemplate;\n  if (isDef(inlineTemplate)) {\n    options.render = inlineTemplate.render;\n    options.staticRenderFns = inlineTemplate.staticRenderFns;\n  }\n  return new vnode.componentOptions.Ctor(options)\n}\n\nfunction installComponentHooks (data) {\n  var hooks = data.hook || (data.hook = {});\n  for (var i = 0; i < hooksToMerge.length; i++) {\n    var key = hooksToMerge[i];\n    var existing = hooks[key];\n    var toMerge = componentVNodeHooks[key];\n    if (existing !== toMerge && !(existing && existing._merged)) {\n      hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;\n    }\n  }\n}\n\nfunction mergeHook$1 (f1, f2) {\n  var merged = function (a, b) {\n    // flow complains about extra args which is why we use any\n    f1(a, b);\n    f2(a, b);\n  };\n  merged._merged = true;\n  return merged\n}\n\n// transform component v-model info (value and callback) into\n// prop and event handler respectively.\nfunction transformModel (options, data) {\n  var prop = (options.model && options.model.prop) || 'value';\n  var event = (options.model && options.model.event) || 'input'\n  ;(data.attrs || (data.attrs = {}))[prop] = data.model.value;\n  var on = data.on || (data.on = {});\n  var existing = on[event];\n  var callback = data.model.callback;\n  if (isDef(existing)) {\n    if (\n      Array.isArray(existing)\n        ? existing.indexOf(callback) === -1\n        : existing !== callback\n    ) {\n      on[event] = [callback].concat(existing);\n    }\n  } else {\n    on[event] = callback;\n  }\n}\n\n/*  */\n\nvar SIMPLE_NORMALIZE = 1;\nvar ALWAYS_NORMALIZE = 2;\n\n// wrapper function for providing a more flexible interface\n// without getting yelled at by flow\nfunction createElement (\n  context,\n  tag,\n  data,\n  children,\n  normalizationType,\n  alwaysNormalize\n) {\n  if (Array.isArray(data) || isPrimitive(data)) {\n    normalizationType = children;\n    children = data;\n    data = undefined;\n  }\n  if (isTrue(alwaysNormalize)) {\n    normalizationType = ALWAYS_NORMALIZE;\n  }\n  return _createElement(context, tag, data, children, normalizationType)\n}\n\nfunction _createElement (\n  context,\n  tag,\n  data,\n  children,\n  normalizationType\n) {\n  if (isDef(data) && isDef((data).__ob__)) {\n     true && warn(\n      \"Avoid using observed data object as vnode data: \" + (JSON.stringify(data)) + \"\\n\" +\n      'Always create fresh vnode data objects in each render!',\n      context\n    );\n    return createEmptyVNode()\n  }\n  // object syntax in v-bind\n  if (isDef(data) && isDef(data.is)) {\n    tag = data.is;\n  }\n  if (!tag) {\n    // in case of component :is set to falsy value\n    return createEmptyVNode()\n  }\n  // warn against non-primitive key\n  if ( true &&\n    isDef(data) && isDef(data.key) && !isPrimitive(data.key)\n  ) {\n    {\n      warn(\n        'Avoid using non-primitive value as key, ' +\n        'use string/number value instead.',\n        context\n      );\n    }\n  }\n  // support single function children as default scoped slot\n  if (Array.isArray(children) &&\n    typeof children[0] === 'function'\n  ) {\n    data = data || {};\n    data.scopedSlots = { default: children[0] };\n    children.length = 0;\n  }\n  if (normalizationType === ALWAYS_NORMALIZE) {\n    children = normalizeChildren(children);\n  } else if (normalizationType === SIMPLE_NORMALIZE) {\n    children = simpleNormalizeChildren(children);\n  }\n  var vnode, ns;\n  if (typeof tag === 'string') {\n    var Ctor;\n    ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);\n    if (config.isReservedTag(tag)) {\n      // platform built-in elements\n      vnode = new VNode(\n        config.parsePlatformTagName(tag), data, children,\n        undefined, undefined, context\n      );\n    } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {\n      // component\n      vnode = createComponent(Ctor, data, context, children, tag);\n    } else {\n      // unknown or unlisted namespaced elements\n      // check at runtime because it may get assigned a namespace when its\n      // parent normalizes children\n      vnode = new VNode(\n        tag, data, children,\n        undefined, undefined, context\n      );\n    }\n  } else {\n    // direct component options / constructor\n    vnode = createComponent(tag, data, context, children);\n  }\n  if (Array.isArray(vnode)) {\n    return vnode\n  } else if (isDef(vnode)) {\n    if (isDef(ns)) { applyNS(vnode, ns); }\n    if (isDef(data)) { registerDeepBindings(data); }\n    return vnode\n  } else {\n    return createEmptyVNode()\n  }\n}\n\nfunction applyNS (vnode, ns, force) {\n  vnode.ns = ns;\n  if (vnode.tag === 'foreignObject') {\n    // use default namespace inside foreignObject\n    ns = undefined;\n    force = true;\n  }\n  if (isDef(vnode.children)) {\n    for (var i = 0, l = vnode.children.length; i < l; i++) {\n      var child = vnode.children[i];\n      if (isDef(child.tag) && (\n        isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {\n        applyNS(child, ns, force);\n      }\n    }\n  }\n}\n\n// ref #5318\n// necessary to ensure parent re-render when deep bindings like :style and\n// :class are used on slot nodes\nfunction registerDeepBindings (data) {\n  if (isObject(data.style)) {\n    traverse(data.style);\n  }\n  if (isObject(data.class)) {\n    traverse(data.class);\n  }\n}\n\n/*  */\n\nfunction initRender (vm) {\n  vm._vnode = null; // the root of the child tree\n  vm._staticTrees = null; // v-once cached trees\n  var options = vm.$options;\n  var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree\n  var renderContext = parentVnode && parentVnode.context;\n  vm.$slots = resolveSlots(options._renderChildren, renderContext);\n  vm.$scopedSlots = emptyObject;\n  // bind the createElement fn to this instance\n  // so that we get proper render context inside it.\n  // args order: tag, data, children, normalizationType, alwaysNormalize\n  // internal version is used by render functions compiled from templates\n  vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };\n  // normalization is always applied for the public version, used in\n  // user-written render functions.\n  vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };\n\n  // $attrs & $listeners are exposed for easier HOC creation.\n  // they need to be reactive so that HOCs using them are always updated\n  var parentData = parentVnode && parentVnode.data;\n\n  /* istanbul ignore else */\n  if (true) {\n    defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {\n      !isUpdatingChildComponent && warn(\"$attrs is readonly.\", vm);\n    }, true);\n    defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {\n      !isUpdatingChildComponent && warn(\"$listeners is readonly.\", vm);\n    }, true);\n  } else {}\n}\n\nvar currentRenderingInstance = null;\n\nfunction renderMixin (Vue) {\n  // install runtime convenience helpers\n  installRenderHelpers(Vue.prototype);\n\n  Vue.prototype.$nextTick = function (fn) {\n    return nextTick(fn, this)\n  };\n\n  Vue.prototype._render = function () {\n    var vm = this;\n    var ref = vm.$options;\n    var render = ref.render;\n    var _parentVnode = ref._parentVnode;\n\n    if (_parentVnode) {\n      vm.$scopedSlots = normalizeScopedSlots(\n        _parentVnode.data.scopedSlots,\n        vm.$slots,\n        vm.$scopedSlots\n      );\n    }\n\n    // set parent vnode. this allows render functions to have access\n    // to the data on the placeholder node.\n    vm.$vnode = _parentVnode;\n    // render self\n    var vnode;\n    try {\n      // There's no need to maintain a stack becaues all render fns are called\n      // separately from one another. Nested component's render fns are called\n      // when parent component is patched.\n      currentRenderingInstance = vm;\n      vnode = render.call(vm._renderProxy, vm.$createElement);\n    } catch (e) {\n      handleError(e, vm, \"render\");\n      // return error render result,\n      // or previous vnode to prevent render error causing blank component\n      /* istanbul ignore else */\n      if ( true && vm.$options.renderError) {\n        try {\n          vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);\n        } catch (e) {\n          handleError(e, vm, \"renderError\");\n          vnode = vm._vnode;\n        }\n      } else {\n        vnode = vm._vnode;\n      }\n    } finally {\n      currentRenderingInstance = null;\n    }\n    // if the returned array contains only a single node, allow it\n    if (Array.isArray(vnode) && vnode.length === 1) {\n      vnode = vnode[0];\n    }\n    // return empty vnode in case the render function errored out\n    if (!(vnode instanceof VNode)) {\n      if ( true && Array.isArray(vnode)) {\n        warn(\n          'Multiple root nodes returned from render function. Render function ' +\n          'should return a single root node.',\n          vm\n        );\n      }\n      vnode = createEmptyVNode();\n    }\n    // set parent\n    vnode.parent = _parentVnode;\n    return vnode\n  };\n}\n\n/*  */\n\nfunction ensureCtor (comp, base) {\n  if (\n    comp.__esModule ||\n    (hasSymbol && comp[Symbol.toStringTag] === 'Module')\n  ) {\n    comp = comp.default;\n  }\n  return isObject(comp)\n    ? base.extend(comp)\n    : comp\n}\n\nfunction createAsyncPlaceholder (\n  factory,\n  data,\n  context,\n  children,\n  tag\n) {\n  var node = createEmptyVNode();\n  node.asyncFactory = factory;\n  node.asyncMeta = { data: data, context: context, children: children, tag: tag };\n  return node\n}\n\nfunction resolveAsyncComponent (\n  factory,\n  baseCtor\n) {\n  if (isTrue(factory.error) && isDef(factory.errorComp)) {\n    return factory.errorComp\n  }\n\n  if (isDef(factory.resolved)) {\n    return factory.resolved\n  }\n\n  var owner = currentRenderingInstance;\n  if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {\n    // already pending\n    factory.owners.push(owner);\n  }\n\n  if (isTrue(factory.loading) && isDef(factory.loadingComp)) {\n    return factory.loadingComp\n  }\n\n  if (owner && !isDef(factory.owners)) {\n    var owners = factory.owners = [owner];\n    var sync = true;\n    var timerLoading = null;\n    var timerTimeout = null\n\n    ;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });\n\n    var forceRender = function (renderCompleted) {\n      for (var i = 0, l = owners.length; i < l; i++) {\n        (owners[i]).$forceUpdate();\n      }\n\n      if (renderCompleted) {\n        owners.length = 0;\n        if (timerLoading !== null) {\n          clearTimeout(timerLoading);\n          timerLoading = null;\n        }\n        if (timerTimeout !== null) {\n          clearTimeout(timerTimeout);\n          timerTimeout = null;\n        }\n      }\n    };\n\n    var resolve = once(function (res) {\n      // cache resolved\n      factory.resolved = ensureCtor(res, baseCtor);\n      // invoke callbacks only if this is not a synchronous resolve\n      // (async resolves are shimmed as synchronous during SSR)\n      if (!sync) {\n        forceRender(true);\n      } else {\n        owners.length = 0;\n      }\n    });\n\n    var reject = once(function (reason) {\n       true && warn(\n        \"Failed to resolve async component: \" + (String(factory)) +\n        (reason ? (\"\\nReason: \" + reason) : '')\n      );\n      if (isDef(factory.errorComp)) {\n        factory.error = true;\n        forceRender(true);\n      }\n    });\n\n    var res = factory(resolve, reject);\n\n    if (isObject(res)) {\n      if (isPromise(res)) {\n        // () => Promise\n        if (isUndef(factory.resolved)) {\n          res.then(resolve, reject);\n        }\n      } else if (isPromise(res.component)) {\n        res.component.then(resolve, reject);\n\n        if (isDef(res.error)) {\n          factory.errorComp = ensureCtor(res.error, baseCtor);\n        }\n\n        if (isDef(res.loading)) {\n          factory.loadingComp = ensureCtor(res.loading, baseCtor);\n          if (res.delay === 0) {\n            factory.loading = true;\n          } else {\n            timerLoading = setTimeout(function () {\n              timerLoading = null;\n              if (isUndef(factory.resolved) && isUndef(factory.error)) {\n                factory.loading = true;\n                forceRender(false);\n              }\n            }, res.delay || 200);\n          }\n        }\n\n        if (isDef(res.timeout)) {\n          timerTimeout = setTimeout(function () {\n            timerTimeout = null;\n            if (isUndef(factory.resolved)) {\n              reject(\n                 true\n                  ? (\"timeout (\" + (res.timeout) + \"ms)\")\n                  : undefined\n              );\n            }\n          }, res.timeout);\n        }\n      }\n    }\n\n    sync = false;\n    // return in case resolved synchronously\n    return factory.loading\n      ? factory.loadingComp\n      : factory.resolved\n  }\n}\n\n/*  */\n\nfunction isAsyncPlaceholder (node) {\n  return node.isComment && node.asyncFactory\n}\n\n/*  */\n\nfunction getFirstComponentChild (children) {\n  if (Array.isArray(children)) {\n    for (var i = 0; i < children.length; i++) {\n      var c = children[i];\n      if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {\n        return c\n      }\n    }\n  }\n}\n\n/*  */\n\n/*  */\n\nfunction initEvents (vm) {\n  vm._events = Object.create(null);\n  vm._hasHookEvent = false;\n  // init parent attached events\n  var listeners = vm.$options._parentListeners;\n  if (listeners) {\n    updateComponentListeners(vm, listeners);\n  }\n}\n\nvar target;\n\nfunction add (event, fn) {\n  target.$on(event, fn);\n}\n\nfunction remove$1 (event, fn) {\n  target.$off(event, fn);\n}\n\nfunction createOnceHandler (event, fn) {\n  var _target = target;\n  return function onceHandler () {\n    var res = fn.apply(null, arguments);\n    if (res !== null) {\n      _target.$off(event, onceHandler);\n    }\n  }\n}\n\nfunction updateComponentListeners (\n  vm,\n  listeners,\n  oldListeners\n) {\n  target = vm;\n  updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);\n  target = undefined;\n}\n\nfunction eventsMixin (Vue) {\n  var hookRE = /^hook:/;\n  Vue.prototype.$on = function (event, fn) {\n    var vm = this;\n    if (Array.isArray(event)) {\n      for (var i = 0, l = event.length; i < l; i++) {\n        vm.$on(event[i], fn);\n      }\n    } else {\n      (vm._events[event] || (vm._events[event] = [])).push(fn);\n      // optimize hook:event cost by using a boolean flag marked at registration\n      // instead of a hash lookup\n      if (hookRE.test(event)) {\n        vm._hasHookEvent = true;\n      }\n    }\n    return vm\n  };\n\n  Vue.prototype.$once = function (event, fn) {\n    var vm = this;\n    function on () {\n      vm.$off(event, on);\n      fn.apply(vm, arguments);\n    }\n    on.fn = fn;\n    vm.$on(event, on);\n    return vm\n  };\n\n  Vue.prototype.$off = function (event, fn) {\n    var vm = this;\n    // all\n    if (!arguments.length) {\n      vm._events = Object.create(null);\n      return vm\n    }\n    // array of events\n    if (Array.isArray(event)) {\n      for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {\n        vm.$off(event[i$1], fn);\n      }\n      return vm\n    }\n    // specific event\n    var cbs = vm._events[event];\n    if (!cbs) {\n      return vm\n    }\n    if (!fn) {\n      vm._events[event] = null;\n      return vm\n    }\n    // specific handler\n    var cb;\n    var i = cbs.length;\n    while (i--) {\n      cb = cbs[i];\n      if (cb === fn || cb.fn === fn) {\n        cbs.splice(i, 1);\n        break\n      }\n    }\n    return vm\n  };\n\n  Vue.prototype.$emit = function (event) {\n    var vm = this;\n    if (true) {\n      var lowerCaseEvent = event.toLowerCase();\n      if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {\n        tip(\n          \"Event \\\"\" + lowerCaseEvent + \"\\\" is emitted in component \" +\n          (formatComponentName(vm)) + \" but the handler is registered for \\\"\" + event + \"\\\". \" +\n          \"Note that HTML attributes are case-insensitive and you cannot use \" +\n          \"v-on to listen to camelCase events when using in-DOM templates. \" +\n          \"You should probably use \\\"\" + (hyphenate(event)) + \"\\\" instead of \\\"\" + event + \"\\\".\"\n        );\n      }\n    }\n    var cbs = vm._events[event];\n    if (cbs) {\n      cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n      var args = toArray(arguments, 1);\n      var info = \"event handler for \\\"\" + event + \"\\\"\";\n      for (var i = 0, l = cbs.length; i < l; i++) {\n        invokeWithErrorHandling(cbs[i], vm, args, vm, info);\n      }\n    }\n    return vm\n  };\n}\n\n/*  */\n\nvar activeInstance = null;\nvar isUpdatingChildComponent = false;\n\nfunction setActiveInstance(vm) {\n  var prevActiveInstance = activeInstance;\n  activeInstance = vm;\n  return function () {\n    activeInstance = prevActiveInstance;\n  }\n}\n\nfunction initLifecycle (vm) {\n  var options = vm.$options;\n\n  // locate first non-abstract parent\n  var parent = options.parent;\n  if (parent && !options.abstract) {\n    while (parent.$options.abstract && parent.$parent) {\n      parent = parent.$parent;\n    }\n    parent.$children.push(vm);\n  }\n\n  vm.$parent = parent;\n  vm.$root = parent ? parent.$root : vm;\n\n  vm.$children = [];\n  vm.$refs = {};\n\n  vm._watcher = null;\n  vm._inactive = null;\n  vm._directInactive = false;\n  vm._isMounted = false;\n  vm._isDestroyed = false;\n  vm._isBeingDestroyed = false;\n}\n\nfunction lifecycleMixin (Vue) {\n  Vue.prototype._update = function (vnode, hydrating) {\n    var vm = this;\n    var prevEl = vm.$el;\n    var prevVnode = vm._vnode;\n    var restoreActiveInstance = setActiveInstance(vm);\n    vm._vnode = vnode;\n    // Vue.prototype.__patch__ is injected in entry points\n    // based on the rendering backend used.\n    if (!prevVnode) {\n      // initial render\n      vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);\n    } else {\n      // updates\n      vm.$el = vm.__patch__(prevVnode, vnode);\n    }\n    restoreActiveInstance();\n    // update __vue__ reference\n    if (prevEl) {\n      prevEl.__vue__ = null;\n    }\n    if (vm.$el) {\n      vm.$el.__vue__ = vm;\n    }\n    // if parent is an HOC, update its $el as well\n    if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\n      vm.$parent.$el = vm.$el;\n    }\n    // updated hook is called by the scheduler to ensure that children are\n    // updated in a parent's updated hook.\n  };\n\n  Vue.prototype.$forceUpdate = function () {\n    var vm = this;\n    if (vm._watcher) {\n      vm._watcher.update();\n    }\n  };\n\n  Vue.prototype.$destroy = function () {\n    var vm = this;\n    if (vm._isBeingDestroyed) {\n      return\n    }\n    callHook(vm, 'beforeDestroy');\n    vm._isBeingDestroyed = true;\n    // remove self from parent\n    var parent = vm.$parent;\n    if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\n      remove(parent.$children, vm);\n    }\n    // teardown watchers\n    if (vm._watcher) {\n      vm._watcher.teardown();\n    }\n    var i = vm._watchers.length;\n    while (i--) {\n      vm._watchers[i].teardown();\n    }\n    // remove reference from data ob\n    // frozen object may not have observer.\n    if (vm._data.__ob__) {\n      vm._data.__ob__.vmCount--;\n    }\n    // call the last hook...\n    vm._isDestroyed = true;\n    // invoke destroy hooks on current rendered tree\n    vm.__patch__(vm._vnode, null);\n    // fire destroyed hook\n    callHook(vm, 'destroyed');\n    // turn off all instance listeners.\n    vm.$off();\n    // remove __vue__ reference\n    if (vm.$el) {\n      vm.$el.__vue__ = null;\n    }\n    // release circular reference (#6759)\n    if (vm.$vnode) {\n      vm.$vnode.parent = null;\n    }\n  };\n}\n\nfunction mountComponent (\n  vm,\n  el,\n  hydrating\n) {\n  vm.$el = el;\n  if (!vm.$options.render) {\n    vm.$options.render = createEmptyVNode;\n    if (true) {\n      /* istanbul ignore if */\n      if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||\n        vm.$options.el || el) {\n        warn(\n          'You are using the runtime-only build of Vue where the template ' +\n          'compiler is not available. Either pre-compile the templates into ' +\n          'render functions, or use the compiler-included build.',\n          vm\n        );\n      } else {\n        warn(\n          'Failed to mount component: template or render function not defined.',\n          vm\n        );\n      }\n    }\n  }\n  callHook(vm, 'beforeMount');\n\n  var updateComponent;\n  /* istanbul ignore if */\n  if ( true && config.performance && mark) {\n    updateComponent = function () {\n      var name = vm._name;\n      var id = vm._uid;\n      var startTag = \"vue-perf-start:\" + id;\n      var endTag = \"vue-perf-end:\" + id;\n\n      mark(startTag);\n      var vnode = vm._render();\n      mark(endTag);\n      measure((\"vue \" + name + \" render\"), startTag, endTag);\n\n      mark(startTag);\n      vm._update(vnode, hydrating);\n      mark(endTag);\n      measure((\"vue \" + name + \" patch\"), startTag, endTag);\n    };\n  } else {\n    updateComponent = function () {\n      vm._update(vm._render(), hydrating);\n    };\n  }\n\n  // we set this to vm._watcher inside the watcher's constructor\n  // since the watcher's initial patch may call $forceUpdate (e.g. inside child\n  // component's mounted hook), which relies on vm._watcher being already defined\n  new Watcher(vm, updateComponent, noop, {\n    before: function before () {\n      if (vm._isMounted && !vm._isDestroyed) {\n        callHook(vm, 'beforeUpdate');\n      }\n    }\n  }, true /* isRenderWatcher */);\n  hydrating = false;\n\n  // manually mounted instance, call mounted on self\n  // mounted is called for render-created child components in its inserted hook\n  if (vm.$vnode == null) {\n    vm._isMounted = true;\n    callHook(vm, 'mounted');\n  }\n  return vm\n}\n\nfunction updateChildComponent (\n  vm,\n  propsData,\n  listeners,\n  parentVnode,\n  renderChildren\n) {\n  if (true) {\n    isUpdatingChildComponent = true;\n  }\n\n  // determine whether component has slot children\n  // we need to do this before overwriting $options._renderChildren.\n\n  // check if there are dynamic scopedSlots (hand-written or compiled but with\n  // dynamic slot names). Static scoped slots compiled from template has the\n  // \"$stable\" marker.\n  var newScopedSlots = parentVnode.data.scopedSlots;\n  var oldScopedSlots = vm.$scopedSlots;\n  var hasDynamicScopedSlot = !!(\n    (newScopedSlots && !newScopedSlots.$stable) ||\n    (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||\n    (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)\n  );\n\n  // Any static slot children from the parent may have changed during parent's\n  // update. Dynamic scoped slots may also have changed. In such cases, a forced\n  // update is necessary to ensure correctness.\n  var needsForceUpdate = !!(\n    renderChildren ||               // has new static slots\n    vm.$options._renderChildren ||  // has old static slots\n    hasDynamicScopedSlot\n  );\n\n  vm.$options._parentVnode = parentVnode;\n  vm.$vnode = parentVnode; // update vm's placeholder node without re-render\n\n  if (vm._vnode) { // update child tree's parent\n    vm._vnode.parent = parentVnode;\n  }\n  vm.$options._renderChildren = renderChildren;\n\n  // update $attrs and $listeners hash\n  // these are also reactive so they may trigger child update if the child\n  // used them during render\n  vm.$attrs = parentVnode.data.attrs || emptyObject;\n  vm.$listeners = listeners || emptyObject;\n\n  // update props\n  if (propsData && vm.$options.props) {\n    toggleObserving(false);\n    var props = vm._props;\n    var propKeys = vm.$options._propKeys || [];\n    for (var i = 0; i < propKeys.length; i++) {\n      var key = propKeys[i];\n      var propOptions = vm.$options.props; // wtf flow?\n      props[key] = validateProp(key, propOptions, propsData, vm);\n    }\n    toggleObserving(true);\n    // keep a copy of raw propsData\n    vm.$options.propsData = propsData;\n  }\n\n  // update listeners\n  listeners = listeners || emptyObject;\n  var oldListeners = vm.$options._parentListeners;\n  vm.$options._parentListeners = listeners;\n  updateComponentListeners(vm, listeners, oldListeners);\n\n  // resolve slots + force update if has children\n  if (needsForceUpdate) {\n    vm.$slots = resolveSlots(renderChildren, parentVnode.context);\n    vm.$forceUpdate();\n  }\n\n  if (true) {\n    isUpdatingChildComponent = false;\n  }\n}\n\nfunction isInInactiveTree (vm) {\n  while (vm && (vm = vm.$parent)) {\n    if (vm._inactive) { return true }\n  }\n  return false\n}\n\nfunction activateChildComponent (vm, direct) {\n  if (direct) {\n    vm._directInactive = false;\n    if (isInInactiveTree(vm)) {\n      return\n    }\n  } else if (vm._directInactive) {\n    return\n  }\n  if (vm._inactive || vm._inactive === null) {\n    vm._inactive = false;\n    for (var i = 0; i < vm.$children.length; i++) {\n      activateChildComponent(vm.$children[i]);\n    }\n    callHook(vm, 'activated');\n  }\n}\n\nfunction deactivateChildComponent (vm, direct) {\n  if (direct) {\n    vm._directInactive = true;\n    if (isInInactiveTree(vm)) {\n      return\n    }\n  }\n  if (!vm._inactive) {\n    vm._inactive = true;\n    for (var i = 0; i < vm.$children.length; i++) {\n      deactivateChildComponent(vm.$children[i]);\n    }\n    callHook(vm, 'deactivated');\n  }\n}\n\nfunction callHook (vm, hook) {\n  // #7573 disable dep collection when invoking lifecycle hooks\n  pushTarget();\n  var handlers = vm.$options[hook];\n  var info = hook + \" hook\";\n  if (handlers) {\n    for (var i = 0, j = handlers.length; i < j; i++) {\n      invokeWithErrorHandling(handlers[i], vm, null, vm, info);\n    }\n  }\n  if (vm._hasHookEvent) {\n    vm.$emit('hook:' + hook);\n  }\n  popTarget();\n}\n\n/*  */\n\nvar MAX_UPDATE_COUNT = 100;\n\nvar queue = [];\nvar activatedChildren = [];\nvar has = {};\nvar circular = {};\nvar waiting = false;\nvar flushing = false;\nvar index = 0;\n\n/**\n * Reset the scheduler's state.\n */\nfunction resetSchedulerState () {\n  index = queue.length = activatedChildren.length = 0;\n  has = {};\n  if (true) {\n    circular = {};\n  }\n  waiting = flushing = false;\n}\n\n// Async edge case #6566 requires saving the timestamp when event listeners are\n// attached. However, calling performance.now() has a perf overhead especially\n// if the page has thousands of event listeners. Instead, we take a timestamp\n// every time the scheduler flushes and use that for all event listeners\n// attached during that flush.\nvar currentFlushTimestamp = 0;\n\n// Async edge case fix requires storing an event listener's attach timestamp.\nvar getNow = Date.now;\n\n// Determine what event timestamp the browser is using. Annoyingly, the\n// timestamp can either be hi-res (relative to page load) or low-res\n// (relative to UNIX epoch), so in order to compare time we have to use the\n// same timestamp type when saving the flush timestamp.\n// All IE versions use low-res event timestamps, and have problematic clock\n// implementations (#9632)\nif (inBrowser && !isIE) {\n  var performance = window.performance;\n  if (\n    performance &&\n    typeof performance.now === 'function' &&\n    getNow() > document.createEvent('Event').timeStamp\n  ) {\n    // if the event timestamp, although evaluated AFTER the Date.now(), is\n    // smaller than it, it means the event is using a hi-res timestamp,\n    // and we need to use the hi-res version for event listener timestamps as\n    // well.\n    getNow = function () { return performance.now(); };\n  }\n}\n\n/**\n * Flush both queues and run the watchers.\n */\nfunction flushSchedulerQueue () {\n  currentFlushTimestamp = getNow();\n  flushing = true;\n  var watcher, id;\n\n  // Sort queue before flush.\n  // This ensures that:\n  // 1. Components are updated from parent to child. (because parent is always\n  //    created before the child)\n  // 2. A component's user watchers are run before its render watcher (because\n  //    user watchers are created before the render watcher)\n  // 3. If a component is destroyed during a parent component's watcher run,\n  //    its watchers can be skipped.\n  queue.sort(function (a, b) { return a.id - b.id; });\n\n  // do not cache length because more watchers might be pushed\n  // as we run existing watchers\n  for (index = 0; index < queue.length; index++) {\n    watcher = queue[index];\n    if (watcher.before) {\n      watcher.before();\n    }\n    id = watcher.id;\n    has[id] = null;\n    watcher.run();\n    // in dev build, check and stop circular updates.\n    if ( true && has[id] != null) {\n      circular[id] = (circular[id] || 0) + 1;\n      if (circular[id] > MAX_UPDATE_COUNT) {\n        warn(\n          'You may have an infinite update loop ' + (\n            watcher.user\n              ? (\"in watcher with expression \\\"\" + (watcher.expression) + \"\\\"\")\n              : \"in a component render function.\"\n          ),\n          watcher.vm\n        );\n        break\n      }\n    }\n  }\n\n  // keep copies of post queues before resetting state\n  var activatedQueue = activatedChildren.slice();\n  var updatedQueue = queue.slice();\n\n  resetSchedulerState();\n\n  // call component updated and activated hooks\n  callActivatedHooks(activatedQueue);\n  callUpdatedHooks(updatedQueue);\n\n  // devtool hook\n  /* istanbul ignore if */\n  if (devtools && config.devtools) {\n    devtools.emit('flush');\n  }\n}\n\nfunction callUpdatedHooks (queue) {\n  var i = queue.length;\n  while (i--) {\n    var watcher = queue[i];\n    var vm = watcher.vm;\n    if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {\n      callHook(vm, 'updated');\n    }\n  }\n}\n\n/**\n * Queue a kept-alive component that was activated during patch.\n * The queue will be processed after the entire tree has been patched.\n */\nfunction queueActivatedComponent (vm) {\n  // setting _inactive to false here so that a render function can\n  // rely on checking whether it's in an inactive tree (e.g. router-view)\n  vm._inactive = false;\n  activatedChildren.push(vm);\n}\n\nfunction callActivatedHooks (queue) {\n  for (var i = 0; i < queue.length; i++) {\n    queue[i]._inactive = true;\n    activateChildComponent(queue[i], true /* true */);\n  }\n}\n\n/**\n * Push a watcher into the watcher queue.\n * Jobs with duplicate IDs will be skipped unless it's\n * pushed when the queue is being flushed.\n */\nfunction queueWatcher (watcher) {\n  var id = watcher.id;\n  if (has[id] == null) {\n    has[id] = true;\n    if (!flushing) {\n      queue.push(watcher);\n    } else {\n      // if already flushing, splice the watcher based on its id\n      // if already past its id, it will be run next immediately.\n      var i = queue.length - 1;\n      while (i > index && queue[i].id > watcher.id) {\n        i--;\n      }\n      queue.splice(i + 1, 0, watcher);\n    }\n    // queue the flush\n    if (!waiting) {\n      waiting = true;\n\n      if ( true && !config.async) {\n        flushSchedulerQueue();\n        return\n      }\n      nextTick(flushSchedulerQueue);\n    }\n  }\n}\n\n/*  */\n\n\n\nvar uid$2 = 0;\n\n/**\n * A watcher parses an expression, collects dependencies,\n * and fires callback when the expression value changes.\n * This is used for both the $watch() api and directives.\n */\nvar Watcher = function Watcher (\n  vm,\n  expOrFn,\n  cb,\n  options,\n  isRenderWatcher\n) {\n  this.vm = vm;\n  if (isRenderWatcher) {\n    vm._watcher = this;\n  }\n  vm._watchers.push(this);\n  // options\n  if (options) {\n    this.deep = !!options.deep;\n    this.user = !!options.user;\n    this.lazy = !!options.lazy;\n    this.sync = !!options.sync;\n    this.before = options.before;\n  } else {\n    this.deep = this.user = this.lazy = this.sync = false;\n  }\n  this.cb = cb;\n  this.id = ++uid$2; // uid for batching\n  this.active = true;\n  this.dirty = this.lazy; // for lazy watchers\n  this.deps = [];\n  this.newDeps = [];\n  this.depIds = new _Set();\n  this.newDepIds = new _Set();\n  this.expression =  true\n    ? expOrFn.toString()\n    : undefined;\n  // parse expression for getter\n  if (typeof expOrFn === 'function') {\n    this.getter = expOrFn;\n  } else {\n    this.getter = parsePath(expOrFn);\n    if (!this.getter) {\n      this.getter = noop;\n       true && warn(\n        \"Failed watching path: \\\"\" + expOrFn + \"\\\" \" +\n        'Watcher only accepts simple dot-delimited paths. ' +\n        'For full control, use a function instead.',\n        vm\n      );\n    }\n  }\n  this.value = this.lazy\n    ? undefined\n    : this.get();\n};\n\n/**\n * Evaluate the getter, and re-collect dependencies.\n */\nWatcher.prototype.get = function get () {\n  pushTarget(this);\n  var value;\n  var vm = this.vm;\n  try {\n    value = this.getter.call(vm, vm);\n  } catch (e) {\n    if (this.user) {\n      handleError(e, vm, (\"getter for watcher \\\"\" + (this.expression) + \"\\\"\"));\n    } else {\n      throw e\n    }\n  } finally {\n    // \"touch\" every property so they are all tracked as\n    // dependencies for deep watching\n    if (this.deep) {\n      traverse(value);\n    }\n    popTarget();\n    this.cleanupDeps();\n  }\n  return value\n};\n\n/**\n * Add a dependency to this directive.\n */\nWatcher.prototype.addDep = function addDep (dep) {\n  var id = dep.id;\n  if (!this.newDepIds.has(id)) {\n    this.newDepIds.add(id);\n    this.newDeps.push(dep);\n    if (!this.depIds.has(id)) {\n      dep.addSub(this);\n    }\n  }\n};\n\n/**\n * Clean up for dependency collection.\n */\nWatcher.prototype.cleanupDeps = function cleanupDeps () {\n  var i = this.deps.length;\n  while (i--) {\n    var dep = this.deps[i];\n    if (!this.newDepIds.has(dep.id)) {\n      dep.removeSub(this);\n    }\n  }\n  var tmp = this.depIds;\n  this.depIds = this.newDepIds;\n  this.newDepIds = tmp;\n  this.newDepIds.clear();\n  tmp = this.deps;\n  this.deps = this.newDeps;\n  this.newDeps = tmp;\n  this.newDeps.length = 0;\n};\n\n/**\n * Subscriber interface.\n * Will be called when a dependency changes.\n */\nWatcher.prototype.update = function update () {\n  /* istanbul ignore else */\n  if (this.lazy) {\n    this.dirty = true;\n  } else if (this.sync) {\n    this.run();\n  } else {\n    queueWatcher(this);\n  }\n};\n\n/**\n * Scheduler job interface.\n * Will be called by the scheduler.\n */\nWatcher.prototype.run = function run () {\n  if (this.active) {\n    var value = this.get();\n    if (\n      value !== this.value ||\n      // Deep watchers and watchers on Object/Arrays should fire even\n      // when the value is the same, because the value may\n      // have mutated.\n      isObject(value) ||\n      this.deep\n    ) {\n      // set new value\n      var oldValue = this.value;\n      this.value = value;\n      if (this.user) {\n        try {\n          this.cb.call(this.vm, value, oldValue);\n        } catch (e) {\n          handleError(e, this.vm, (\"callback for watcher \\\"\" + (this.expression) + \"\\\"\"));\n        }\n      } else {\n        this.cb.call(this.vm, value, oldValue);\n      }\n    }\n  }\n};\n\n/**\n * Evaluate the value of the watcher.\n * This only gets called for lazy watchers.\n */\nWatcher.prototype.evaluate = function evaluate () {\n  this.value = this.get();\n  this.dirty = false;\n};\n\n/**\n * Depend on all deps collected by this watcher.\n */\nWatcher.prototype.depend = function depend () {\n  var i = this.deps.length;\n  while (i--) {\n    this.deps[i].depend();\n  }\n};\n\n/**\n * Remove self from all dependencies' subscriber list.\n */\nWatcher.prototype.teardown = function teardown () {\n  if (this.active) {\n    // remove self from vm's watcher list\n    // this is a somewhat expensive operation so we skip it\n    // if the vm is being destroyed.\n    if (!this.vm._isBeingDestroyed) {\n      remove(this.vm._watchers, this);\n    }\n    var i = this.deps.length;\n    while (i--) {\n      this.deps[i].removeSub(this);\n    }\n    this.active = false;\n  }\n};\n\n/*  */\n\nvar sharedPropertyDefinition = {\n  enumerable: true,\n  configurable: true,\n  get: noop,\n  set: noop\n};\n\nfunction proxy (target, sourceKey, key) {\n  sharedPropertyDefinition.get = function proxyGetter () {\n    return this[sourceKey][key]\n  };\n  sharedPropertyDefinition.set = function proxySetter (val) {\n    this[sourceKey][key] = val;\n  };\n  Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction initState (vm) {\n  vm._watchers = [];\n  var opts = vm.$options;\n  if (opts.props) { initProps(vm, opts.props); }\n  if (opts.methods) { initMethods(vm, opts.methods); }\n  if (opts.data) {\n    initData(vm);\n  } else {\n    observe(vm._data = {}, true /* asRootData */);\n  }\n  if (opts.computed) { initComputed(vm, opts.computed); }\n  if (opts.watch && opts.watch !== nativeWatch) {\n    initWatch(vm, opts.watch);\n  }\n}\n\nfunction initProps (vm, propsOptions) {\n  var propsData = vm.$options.propsData || {};\n  var props = vm._props = {};\n  // cache prop keys so that future props updates can iterate using Array\n  // instead of dynamic object key enumeration.\n  var keys = vm.$options._propKeys = [];\n  var isRoot = !vm.$parent;\n  // root instance props should be converted\n  if (!isRoot) {\n    toggleObserving(false);\n  }\n  var loop = function ( key ) {\n    keys.push(key);\n    var value = validateProp(key, propsOptions, propsData, vm);\n    /* istanbul ignore else */\n    if (true) {\n      var hyphenatedKey = hyphenate(key);\n      if (isReservedAttribute(hyphenatedKey) ||\n          config.isReservedAttr(hyphenatedKey)) {\n        warn(\n          (\"\\\"\" + hyphenatedKey + \"\\\" is a reserved attribute and cannot be used as component prop.\"),\n          vm\n        );\n      }\n      defineReactive$$1(props, key, value, function () {\n        if (!isRoot && !isUpdatingChildComponent) {\n          warn(\n            \"Avoid mutating a prop directly since the value will be \" +\n            \"overwritten whenever the parent component re-renders. \" +\n            \"Instead, use a data or computed property based on the prop's \" +\n            \"value. Prop being mutated: \\\"\" + key + \"\\\"\",\n            vm\n          );\n        }\n      });\n    } else {}\n    // static props are already proxied on the component's prototype\n    // during Vue.extend(). We only need to proxy props defined at\n    // instantiation here.\n    if (!(key in vm)) {\n      proxy(vm, \"_props\", key);\n    }\n  };\n\n  for (var key in propsOptions) loop( key );\n  toggleObserving(true);\n}\n\nfunction initData (vm) {\n  var data = vm.$options.data;\n  data = vm._data = typeof data === 'function'\n    ? getData(data, vm)\n    : data || {};\n  if (!isPlainObject(data)) {\n    data = {};\n     true && warn(\n      'data functions should return an object:\\n' +\n      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\n      vm\n    );\n  }\n  // proxy data on instance\n  var keys = Object.keys(data);\n  var props = vm.$options.props;\n  var methods = vm.$options.methods;\n  var i = keys.length;\n  while (i--) {\n    var key = keys[i];\n    if (true) {\n      if (methods && hasOwn(methods, key)) {\n        warn(\n          (\"Method \\\"\" + key + \"\\\" has already been defined as a data property.\"),\n          vm\n        );\n      }\n    }\n    if (props && hasOwn(props, key)) {\n       true && warn(\n        \"The data property \\\"\" + key + \"\\\" is already declared as a prop. \" +\n        \"Use prop default value instead.\",\n        vm\n      );\n    } else if (!isReserved(key)) {\n      proxy(vm, \"_data\", key);\n    }\n  }\n  // observe data\n  observe(data, true /* asRootData */);\n}\n\nfunction getData (data, vm) {\n  // #7573 disable dep collection when invoking data getters\n  pushTarget();\n  try {\n    return data.call(vm, vm)\n  } catch (e) {\n    handleError(e, vm, \"data()\");\n    return {}\n  } finally {\n    popTarget();\n  }\n}\n\nvar computedWatcherOptions = { lazy: true };\n\nfunction initComputed (vm, computed) {\n  // $flow-disable-line\n  var watchers = vm._computedWatchers = Object.create(null);\n  // computed properties are just getters during SSR\n  var isSSR = isServerRendering();\n\n  for (var key in computed) {\n    var userDef = computed[key];\n    var getter = typeof userDef === 'function' ? userDef : userDef.get;\n    if ( true && getter == null) {\n      warn(\n        (\"Getter is missing for computed property \\\"\" + key + \"\\\".\"),\n        vm\n      );\n    }\n\n    if (!isSSR) {\n      // create internal watcher for the computed property.\n      watchers[key] = new Watcher(\n        vm,\n        getter || noop,\n        noop,\n        computedWatcherOptions\n      );\n    }\n\n    // component-defined computed properties are already defined on the\n    // component prototype. We only need to define computed properties defined\n    // at instantiation here.\n    if (!(key in vm)) {\n      defineComputed(vm, key, userDef);\n    } else if (true) {\n      if (key in vm.$data) {\n        warn((\"The computed property \\\"\" + key + \"\\\" is already defined in data.\"), vm);\n      } else if (vm.$options.props && key in vm.$options.props) {\n        warn((\"The computed property \\\"\" + key + \"\\\" is already defined as a prop.\"), vm);\n      }\n    }\n  }\n}\n\nfunction defineComputed (\n  target,\n  key,\n  userDef\n) {\n  var shouldCache = !isServerRendering();\n  if (typeof userDef === 'function') {\n    sharedPropertyDefinition.get = shouldCache\n      ? createComputedGetter(key)\n      : createGetterInvoker(userDef);\n    sharedPropertyDefinition.set = noop;\n  } else {\n    sharedPropertyDefinition.get = userDef.get\n      ? shouldCache && userDef.cache !== false\n        ? createComputedGetter(key)\n        : createGetterInvoker(userDef.get)\n      : noop;\n    sharedPropertyDefinition.set = userDef.set || noop;\n  }\n  if ( true &&\n      sharedPropertyDefinition.set === noop) {\n    sharedPropertyDefinition.set = function () {\n      warn(\n        (\"Computed property \\\"\" + key + \"\\\" was assigned to but it has no setter.\"),\n        this\n      );\n    };\n  }\n  Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction createComputedGetter (key) {\n  return function computedGetter () {\n    var watcher = this._computedWatchers && this._computedWatchers[key];\n    if (watcher) {\n      if (watcher.dirty) {\n        watcher.evaluate();\n      }\n      if (Dep.target) {\n        watcher.depend();\n      }\n      return watcher.value\n    }\n  }\n}\n\nfunction createGetterInvoker(fn) {\n  return function computedGetter () {\n    return fn.call(this, this)\n  }\n}\n\nfunction initMethods (vm, methods) {\n  var props = vm.$options.props;\n  for (var key in methods) {\n    if (true) {\n      if (typeof methods[key] !== 'function') {\n        warn(\n          \"Method \\\"\" + key + \"\\\" has type \\\"\" + (typeof methods[key]) + \"\\\" in the component definition. \" +\n          \"Did you reference the function correctly?\",\n          vm\n        );\n      }\n      if (props && hasOwn(props, key)) {\n        warn(\n          (\"Method \\\"\" + key + \"\\\" has already been defined as a prop.\"),\n          vm\n        );\n      }\n      if ((key in vm) && isReserved(key)) {\n        warn(\n          \"Method \\\"\" + key + \"\\\" conflicts with an existing Vue instance method. \" +\n          \"Avoid defining component methods that start with _ or $.\"\n        );\n      }\n    }\n    vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);\n  }\n}\n\nfunction initWatch (vm, watch) {\n  for (var key in watch) {\n    var handler = watch[key];\n    if (Array.isArray(handler)) {\n      for (var i = 0; i < handler.length; i++) {\n        createWatcher(vm, key, handler[i]);\n      }\n    } else {\n      createWatcher(vm, key, handler);\n    }\n  }\n}\n\nfunction createWatcher (\n  vm,\n  expOrFn,\n  handler,\n  options\n) {\n  if (isPlainObject(handler)) {\n    options = handler;\n    handler = handler.handler;\n  }\n  if (typeof handler === 'string') {\n    handler = vm[handler];\n  }\n  return vm.$watch(expOrFn, handler, options)\n}\n\nfunction stateMixin (Vue) {\n  // flow somehow has problems with directly declared definition object\n  // when using Object.defineProperty, so we have to procedurally build up\n  // the object here.\n  var dataDef = {};\n  dataDef.get = function () { return this._data };\n  var propsDef = {};\n  propsDef.get = function () { return this._props };\n  if (true) {\n    dataDef.set = function () {\n      warn(\n        'Avoid replacing instance root $data. ' +\n        'Use nested data properties instead.',\n        this\n      );\n    };\n    propsDef.set = function () {\n      warn(\"$props is readonly.\", this);\n    };\n  }\n  Object.defineProperty(Vue.prototype, '$data', dataDef);\n  Object.defineProperty(Vue.prototype, '$props', propsDef);\n\n  Vue.prototype.$set = set;\n  Vue.prototype.$delete = del;\n\n  Vue.prototype.$watch = function (\n    expOrFn,\n    cb,\n    options\n  ) {\n    var vm = this;\n    if (isPlainObject(cb)) {\n      return createWatcher(vm, expOrFn, cb, options)\n    }\n    options = options || {};\n    options.user = true;\n    var watcher = new Watcher(vm, expOrFn, cb, options);\n    if (options.immediate) {\n      try {\n        cb.call(vm, watcher.value);\n      } catch (error) {\n        handleError(error, vm, (\"callback for immediate watcher \\\"\" + (watcher.expression) + \"\\\"\"));\n      }\n    }\n    return function unwatchFn () {\n      watcher.teardown();\n    }\n  };\n}\n\n/*  */\n\nvar uid$3 = 0;\n\nfunction initMixin (Vue) {\n  Vue.prototype._init = function (options) {\n    var vm = this;\n    // a uid\n    vm._uid = uid$3++;\n\n    var startTag, endTag;\n    /* istanbul ignore if */\n    if ( true && config.performance && mark) {\n      startTag = \"vue-perf-start:\" + (vm._uid);\n      endTag = \"vue-perf-end:\" + (vm._uid);\n      mark(startTag);\n    }\n\n    // a flag to avoid this being observed\n    vm._isVue = true;\n    // merge options\n    if (options && options._isComponent) {\n      // optimize internal component instantiation\n      // since dynamic options merging is pretty slow, and none of the\n      // internal component options needs special treatment.\n      initInternalComponent(vm, options);\n    } else {\n      vm.$options = mergeOptions(\n        resolveConstructorOptions(vm.constructor),\n        options || {},\n        vm\n      );\n    }\n    /* istanbul ignore else */\n    if (true) {\n      initProxy(vm);\n    } else {}\n    // expose real self\n    vm._self = vm;\n    initLifecycle(vm);\n    initEvents(vm);\n    initRender(vm);\n    callHook(vm, 'beforeCreate');\n    initInjections(vm); // resolve injections before data/props\n    initState(vm);\n    initProvide(vm); // resolve provide after data/props\n    callHook(vm, 'created');\n\n    /* istanbul ignore if */\n    if ( true && config.performance && mark) {\n      vm._name = formatComponentName(vm, false);\n      mark(endTag);\n      measure((\"vue \" + (vm._name) + \" init\"), startTag, endTag);\n    }\n\n    if (vm.$options.el) {\n      vm.$mount(vm.$options.el);\n    }\n  };\n}\n\nfunction initInternalComponent (vm, options) {\n  var opts = vm.$options = Object.create(vm.constructor.options);\n  // doing this because it's faster than dynamic enumeration.\n  var parentVnode = options._parentVnode;\n  opts.parent = options.parent;\n  opts._parentVnode = parentVnode;\n\n  var vnodeComponentOptions = parentVnode.componentOptions;\n  opts.propsData = vnodeComponentOptions.propsData;\n  opts._parentListeners = vnodeComponentOptions.listeners;\n  opts._renderChildren = vnodeComponentOptions.children;\n  opts._componentTag = vnodeComponentOptions.tag;\n\n  if (options.render) {\n    opts.render = options.render;\n    opts.staticRenderFns = options.staticRenderFns;\n  }\n}\n\nfunction resolveConstructorOptions (Ctor) {\n  var options = Ctor.options;\n  if (Ctor.super) {\n    var superOptions = resolveConstructorOptions(Ctor.super);\n    var cachedSuperOptions = Ctor.superOptions;\n    if (superOptions !== cachedSuperOptions) {\n      // super option changed,\n      // need to resolve new options.\n      Ctor.superOptions = superOptions;\n      // check if there are any late-modified/attached options (#4976)\n      var modifiedOptions = resolveModifiedOptions(Ctor);\n      // update base extend options\n      if (modifiedOptions) {\n        extend(Ctor.extendOptions, modifiedOptions);\n      }\n      options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);\n      if (options.name) {\n        options.components[options.name] = Ctor;\n      }\n    }\n  }\n  return options\n}\n\nfunction resolveModifiedOptions (Ctor) {\n  var modified;\n  var latest = Ctor.options;\n  var sealed = Ctor.sealedOptions;\n  for (var key in latest) {\n    if (latest[key] !== sealed[key]) {\n      if (!modified) { modified = {}; }\n      modified[key] = latest[key];\n    }\n  }\n  return modified\n}\n\nfunction Vue (options) {\n  if ( true &&\n    !(this instanceof Vue)\n  ) {\n    warn('Vue is a constructor and should be called with the `new` keyword');\n  }\n  this._init(options);\n}\n\ninitMixin(Vue);\nstateMixin(Vue);\neventsMixin(Vue);\nlifecycleMixin(Vue);\nrenderMixin(Vue);\n\n/*  */\n\nfunction initUse (Vue) {\n  Vue.use = function (plugin) {\n    var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));\n    if (installedPlugins.indexOf(plugin) > -1) {\n      return this\n    }\n\n    // additional parameters\n    var args = toArray(arguments, 1);\n    args.unshift(this);\n    if (typeof plugin.install === 'function') {\n      plugin.install.apply(plugin, args);\n    } else if (typeof plugin === 'function') {\n      plugin.apply(null, args);\n    }\n    installedPlugins.push(plugin);\n    return this\n  };\n}\n\n/*  */\n\nfunction initMixin$1 (Vue) {\n  Vue.mixin = function (mixin) {\n    this.options = mergeOptions(this.options, mixin);\n    return this\n  };\n}\n\n/*  */\n\nfunction initExtend (Vue) {\n  /**\n   * Each instance constructor, including Vue, has a unique\n   * cid. This enables us to create wrapped \"child\n   * constructors\" for prototypal inheritance and cache them.\n   */\n  Vue.cid = 0;\n  var cid = 1;\n\n  /**\n   * Class inheritance\n   */\n  Vue.extend = function (extendOptions) {\n    extendOptions = extendOptions || {};\n    var Super = this;\n    var SuperId = Super.cid;\n    var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\n    if (cachedCtors[SuperId]) {\n      return cachedCtors[SuperId]\n    }\n\n    var name = extendOptions.name || Super.options.name;\n    if ( true && name) {\n      validateComponentName(name);\n    }\n\n    var Sub = function VueComponent (options) {\n      this._init(options);\n    };\n    Sub.prototype = Object.create(Super.prototype);\n    Sub.prototype.constructor = Sub;\n    Sub.cid = cid++;\n    Sub.options = mergeOptions(\n      Super.options,\n      extendOptions\n    );\n    Sub['super'] = Super;\n\n    // For props and computed properties, we define the proxy getters on\n    // the Vue instances at extension time, on the extended prototype. This\n    // avoids Object.defineProperty calls for each instance created.\n    if (Sub.options.props) {\n      initProps$1(Sub);\n    }\n    if (Sub.options.computed) {\n      initComputed$1(Sub);\n    }\n\n    // allow further extension/mixin/plugin usage\n    Sub.extend = Super.extend;\n    Sub.mixin = Super.mixin;\n    Sub.use = Super.use;\n\n    // create asset registers, so extended classes\n    // can have their private assets too.\n    ASSET_TYPES.forEach(function (type) {\n      Sub[type] = Super[type];\n    });\n    // enable recursive self-lookup\n    if (name) {\n      Sub.options.components[name] = Sub;\n    }\n\n    // keep a reference to the super options at extension time.\n    // later at instantiation we can check if Super's options have\n    // been updated.\n    Sub.superOptions = Super.options;\n    Sub.extendOptions = extendOptions;\n    Sub.sealedOptions = extend({}, Sub.options);\n\n    // cache constructor\n    cachedCtors[SuperId] = Sub;\n    return Sub\n  };\n}\n\nfunction initProps$1 (Comp) {\n  var props = Comp.options.props;\n  for (var key in props) {\n    proxy(Comp.prototype, \"_props\", key);\n  }\n}\n\nfunction initComputed$1 (Comp) {\n  var computed = Comp.options.computed;\n  for (var key in computed) {\n    defineComputed(Comp.prototype, key, computed[key]);\n  }\n}\n\n/*  */\n\nfunction initAssetRegisters (Vue) {\n  /**\n   * Create asset registration methods.\n   */\n  ASSET_TYPES.forEach(function (type) {\n    Vue[type] = function (\n      id,\n      definition\n    ) {\n      if (!definition) {\n        return this.options[type + 's'][id]\n      } else {\n        /* istanbul ignore if */\n        if ( true && type === 'component') {\n          validateComponentName(id);\n        }\n        if (type === 'component' && isPlainObject(definition)) {\n          definition.name = definition.name || id;\n          definition = this.options._base.extend(definition);\n        }\n        if (type === 'directive' && typeof definition === 'function') {\n          definition = { bind: definition, update: definition };\n        }\n        this.options[type + 's'][id] = definition;\n        return definition\n      }\n    };\n  });\n}\n\n/*  */\n\n\n\nfunction getComponentName (opts) {\n  return opts && (opts.Ctor.options.name || opts.tag)\n}\n\nfunction matches (pattern, name) {\n  if (Array.isArray(pattern)) {\n    return pattern.indexOf(name) > -1\n  } else if (typeof pattern === 'string') {\n    return pattern.split(',').indexOf(name) > -1\n  } else if (isRegExp(pattern)) {\n    return pattern.test(name)\n  }\n  /* istanbul ignore next */\n  return false\n}\n\nfunction pruneCache (keepAliveInstance, filter) {\n  var cache = keepAliveInstance.cache;\n  var keys = keepAliveInstance.keys;\n  var _vnode = keepAliveInstance._vnode;\n  for (var key in cache) {\n    var cachedNode = cache[key];\n    if (cachedNode) {\n      var name = getComponentName(cachedNode.componentOptions);\n      if (name && !filter(name)) {\n        pruneCacheEntry(cache, key, keys, _vnode);\n      }\n    }\n  }\n}\n\nfunction pruneCacheEntry (\n  cache,\n  key,\n  keys,\n  current\n) {\n  var cached$$1 = cache[key];\n  if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {\n    cached$$1.componentInstance.$destroy();\n  }\n  cache[key] = null;\n  remove(keys, key);\n}\n\nvar patternTypes = [String, RegExp, Array];\n\nvar KeepAlive = {\n  name: 'keep-alive',\n  abstract: true,\n\n  props: {\n    include: patternTypes,\n    exclude: patternTypes,\n    max: [String, Number]\n  },\n\n  created: function created () {\n    this.cache = Object.create(null);\n    this.keys = [];\n  },\n\n  destroyed: function destroyed () {\n    for (var key in this.cache) {\n      pruneCacheEntry(this.cache, key, this.keys);\n    }\n  },\n\n  mounted: function mounted () {\n    var this$1 = this;\n\n    this.$watch('include', function (val) {\n      pruneCache(this$1, function (name) { return matches(val, name); });\n    });\n    this.$watch('exclude', function (val) {\n      pruneCache(this$1, function (name) { return !matches(val, name); });\n    });\n  },\n\n  render: function render () {\n    var slot = this.$slots.default;\n    var vnode = getFirstComponentChild(slot);\n    var componentOptions = vnode && vnode.componentOptions;\n    if (componentOptions) {\n      // check pattern\n      var name = getComponentName(componentOptions);\n      var ref = this;\n      var include = ref.include;\n      var exclude = ref.exclude;\n      if (\n        // not included\n        (include && (!name || !matches(include, name))) ||\n        // excluded\n        (exclude && name && matches(exclude, name))\n      ) {\n        return vnode\n      }\n\n      var ref$1 = this;\n      var cache = ref$1.cache;\n      var keys = ref$1.keys;\n      var key = vnode.key == null\n        // same constructor may get registered as different local components\n        // so cid alone is not enough (#3269)\n        ? componentOptions.Ctor.cid + (componentOptions.tag ? (\"::\" + (componentOptions.tag)) : '')\n        : vnode.key;\n      if (cache[key]) {\n        vnode.componentInstance = cache[key].componentInstance;\n        // make current key freshest\n        remove(keys, key);\n        keys.push(key);\n      } else {\n        cache[key] = vnode;\n        keys.push(key);\n        // prune oldest entry\n        if (this.max && keys.length > parseInt(this.max)) {\n          pruneCacheEntry(cache, keys[0], keys, this._vnode);\n        }\n      }\n\n      vnode.data.keepAlive = true;\n    }\n    return vnode || (slot && slot[0])\n  }\n};\n\nvar builtInComponents = {\n  KeepAlive: KeepAlive\n};\n\n/*  */\n\nfunction initGlobalAPI (Vue) {\n  // config\n  var configDef = {};\n  configDef.get = function () { return config; };\n  if (true) {\n    configDef.set = function () {\n      warn(\n        'Do not replace the Vue.config object, set individual fields instead.'\n      );\n    };\n  }\n  Object.defineProperty(Vue, 'config', configDef);\n\n  // exposed util methods.\n  // NOTE: these are not considered part of the public API - avoid relying on\n  // them unless you are aware of the risk.\n  Vue.util = {\n    warn: warn,\n    extend: extend,\n    mergeOptions: mergeOptions,\n    defineReactive: defineReactive$$1\n  };\n\n  Vue.set = set;\n  Vue.delete = del;\n  Vue.nextTick = nextTick;\n\n  // 2.6 explicit observable API\n  Vue.observable = function (obj) {\n    observe(obj);\n    return obj\n  };\n\n  Vue.options = Object.create(null);\n  ASSET_TYPES.forEach(function (type) {\n    Vue.options[type + 's'] = Object.create(null);\n  });\n\n  // this is used to identify the \"base\" constructor to extend all plain-object\n  // components with in Weex's multi-instance scenarios.\n  Vue.options._base = Vue;\n\n  extend(Vue.options.components, builtInComponents);\n\n  initUse(Vue);\n  initMixin$1(Vue);\n  initExtend(Vue);\n  initAssetRegisters(Vue);\n}\n\ninitGlobalAPI(Vue);\n\nObject.defineProperty(Vue.prototype, '$isServer', {\n  get: isServerRendering\n});\n\nObject.defineProperty(Vue.prototype, '$ssrContext', {\n  get: function get () {\n    /* istanbul ignore next */\n    return this.$vnode && this.$vnode.ssrContext\n  }\n});\n\n// expose FunctionalRenderContext for ssr runtime helper installation\nObject.defineProperty(Vue, 'FunctionalRenderContext', {\n  value: FunctionalRenderContext\n});\n\nVue.version = '2.6.10';\n\n/*  */\n\n// these are reserved for web because they are directly compiled away\n// during template compilation\nvar isReservedAttr = makeMap('style,class');\n\n// attributes that should be using props for binding\nvar acceptValue = makeMap('input,textarea,option,select,progress');\nvar mustUseProp = function (tag, type, attr) {\n  return (\n    (attr === 'value' && acceptValue(tag)) && type !== 'button' ||\n    (attr === 'selected' && tag === 'option') ||\n    (attr === 'checked' && tag === 'input') ||\n    (attr === 'muted' && tag === 'video')\n  )\n};\n\nvar isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');\n\nvar isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only');\n\nvar convertEnumeratedValue = function (key, value) {\n  return isFalsyAttrValue(value) || value === 'false'\n    ? 'false'\n    // allow arbitrary string value for contenteditable\n    : key === 'contenteditable' && isValidContentEditableValue(value)\n      ? value\n      : 'true'\n};\n\nvar isBooleanAttr = makeMap(\n  'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +\n  'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +\n  'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +\n  'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +\n  'required,reversed,scoped,seamless,selected,sortable,translate,' +\n  'truespeed,typemustmatch,visible'\n);\n\nvar xlinkNS = 'http://www.w3.org/1999/xlink';\n\nvar isXlink = function (name) {\n  return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'\n};\n\nvar getXlinkProp = function (name) {\n  return isXlink(name) ? name.slice(6, name.length) : ''\n};\n\nvar isFalsyAttrValue = function (val) {\n  return val == null || val === false\n};\n\n/*  */\n\nfunction genClassForVnode (vnode) {\n  var data = vnode.data;\n  var parentNode = vnode;\n  var childNode = vnode;\n  while (isDef(childNode.componentInstance)) {\n    childNode = childNode.componentInstance._vnode;\n    if (childNode && childNode.data) {\n      data = mergeClassData(childNode.data, data);\n    }\n  }\n  while (isDef(parentNode = parentNode.parent)) {\n    if (parentNode && parentNode.data) {\n      data = mergeClassData(data, parentNode.data);\n    }\n  }\n  return renderClass(data.staticClass, data.class)\n}\n\nfunction mergeClassData (child, parent) {\n  return {\n    staticClass: concat(child.staticClass, parent.staticClass),\n    class: isDef(child.class)\n      ? [child.class, parent.class]\n      : parent.class\n  }\n}\n\nfunction renderClass (\n  staticClass,\n  dynamicClass\n) {\n  if (isDef(staticClass) || isDef(dynamicClass)) {\n    return concat(staticClass, stringifyClass(dynamicClass))\n  }\n  /* istanbul ignore next */\n  return ''\n}\n\nfunction concat (a, b) {\n  return a ? b ? (a + ' ' + b) : a : (b || '')\n}\n\nfunction stringifyClass (value) {\n  if (Array.isArray(value)) {\n    return stringifyArray(value)\n  }\n  if (isObject(value)) {\n    return stringifyObject(value)\n  }\n  if (typeof value === 'string') {\n    return value\n  }\n  /* istanbul ignore next */\n  return ''\n}\n\nfunction stringifyArray (value) {\n  var res = '';\n  var stringified;\n  for (var i = 0, l = value.length; i < l; i++) {\n    if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {\n      if (res) { res += ' '; }\n      res += stringified;\n    }\n  }\n  return res\n}\n\nfunction stringifyObject (value) {\n  var res = '';\n  for (var key in value) {\n    if (value[key]) {\n      if (res) { res += ' '; }\n      res += key;\n    }\n  }\n  return res\n}\n\n/*  */\n\nvar namespaceMap = {\n  svg: 'http://www.w3.org/2000/svg',\n  math: 'http://www.w3.org/1998/Math/MathML'\n};\n\nvar isHTMLTag = makeMap(\n  'html,body,base,head,link,meta,style,title,' +\n  'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +\n  'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +\n  'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +\n  's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +\n  'embed,object,param,source,canvas,script,noscript,del,ins,' +\n  'caption,col,colgroup,table,thead,tbody,td,th,tr,' +\n  'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +\n  'output,progress,select,textarea,' +\n  'details,dialog,menu,menuitem,summary,' +\n  'content,element,shadow,template,blockquote,iframe,tfoot'\n);\n\n// this map is intentionally selective, only covering SVG elements that may\n// contain child elements.\nvar isSVG = makeMap(\n  'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +\n  'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +\n  'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',\n  true\n);\n\nvar isReservedTag = function (tag) {\n  return isHTMLTag(tag) || isSVG(tag)\n};\n\nfunction getTagNamespace (tag) {\n  if (isSVG(tag)) {\n    return 'svg'\n  }\n  // basic support for MathML\n  // note it doesn't support other MathML elements being component roots\n  if (tag === 'math') {\n    return 'math'\n  }\n}\n\nvar unknownElementCache = Object.create(null);\nfunction isUnknownElement (tag) {\n  /* istanbul ignore if */\n  if (!inBrowser) {\n    return true\n  }\n  if (isReservedTag(tag)) {\n    return false\n  }\n  tag = tag.toLowerCase();\n  /* istanbul ignore if */\n  if (unknownElementCache[tag] != null) {\n    return unknownElementCache[tag]\n  }\n  var el = document.createElement(tag);\n  if (tag.indexOf('-') > -1) {\n    // http://stackoverflow.com/a/28210364/1070244\n    return (unknownElementCache[tag] = (\n      el.constructor === window.HTMLUnknownElement ||\n      el.constructor === window.HTMLElement\n    ))\n  } else {\n    return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))\n  }\n}\n\nvar isTextInputType = makeMap('text,number,password,search,email,tel,url');\n\n/*  */\n\n/**\n * Query an element selector if it's not an element already.\n */\nfunction query (el) {\n  if (typeof el === 'string') {\n    var selected = document.querySelector(el);\n    if (!selected) {\n       true && warn(\n        'Cannot find element: ' + el\n      );\n      return document.createElement('div')\n    }\n    return selected\n  } else {\n    return el\n  }\n}\n\n/*  */\n\nfunction createElement$1 (tagName, vnode) {\n  var elm = document.createElement(tagName);\n  if (tagName !== 'select') {\n    return elm\n  }\n  // false or null will remove the attribute but undefined will not\n  if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {\n    elm.setAttribute('multiple', 'multiple');\n  }\n  return elm\n}\n\nfunction createElementNS (namespace, tagName) {\n  return document.createElementNS(namespaceMap[namespace], tagName)\n}\n\nfunction createTextNode (text) {\n  return document.createTextNode(text)\n}\n\nfunction createComment (text) {\n  return document.createComment(text)\n}\n\nfunction insertBefore (parentNode, newNode, referenceNode) {\n  parentNode.insertBefore(newNode, referenceNode);\n}\n\nfunction removeChild (node, child) {\n  node.removeChild(child);\n}\n\nfunction appendChild (node, child) {\n  node.appendChild(child);\n}\n\nfunction parentNode (node) {\n  return node.parentNode\n}\n\nfunction nextSibling (node) {\n  return node.nextSibling\n}\n\nfunction tagName (node) {\n  return node.tagName\n}\n\nfunction setTextContent (node, text) {\n  node.textContent = text;\n}\n\nfunction setStyleScope (node, scopeId) {\n  node.setAttribute(scopeId, '');\n}\n\nvar nodeOps = /*#__PURE__*/Object.freeze({\n  createElement: createElement$1,\n  createElementNS: createElementNS,\n  createTextNode: createTextNode,\n  createComment: createComment,\n  insertBefore: insertBefore,\n  removeChild: removeChild,\n  appendChild: appendChild,\n  parentNode: parentNode,\n  nextSibling: nextSibling,\n  tagName: tagName,\n  setTextContent: setTextContent,\n  setStyleScope: setStyleScope\n});\n\n/*  */\n\nvar ref = {\n  create: function create (_, vnode) {\n    registerRef(vnode);\n  },\n  update: function update (oldVnode, vnode) {\n    if (oldVnode.data.ref !== vnode.data.ref) {\n      registerRef(oldVnode, true);\n      registerRef(vnode);\n    }\n  },\n  destroy: function destroy (vnode) {\n    registerRef(vnode, true);\n  }\n};\n\nfunction registerRef (vnode, isRemoval) {\n  var key = vnode.data.ref;\n  if (!isDef(key)) { return }\n\n  var vm = vnode.context;\n  var ref = vnode.componentInstance || vnode.elm;\n  var refs = vm.$refs;\n  if (isRemoval) {\n    if (Array.isArray(refs[key])) {\n      remove(refs[key], ref);\n    } else if (refs[key] === ref) {\n      refs[key] = undefined;\n    }\n  } else {\n    if (vnode.data.refInFor) {\n      if (!Array.isArray(refs[key])) {\n        refs[key] = [ref];\n      } else if (refs[key].indexOf(ref) < 0) {\n        // $flow-disable-line\n        refs[key].push(ref);\n      }\n    } else {\n      refs[key] = ref;\n    }\n  }\n}\n\n/**\n * Virtual DOM patching algorithm based on Snabbdom by\n * Simon Friis Vindum (@paldepind)\n * Licensed under the MIT License\n * https://github.com/paldepind/snabbdom/blob/master/LICENSE\n *\n * modified by Evan You (@yyx990803)\n *\n * Not type-checking this because this file is perf-critical and the cost\n * of making flow understand it is not worth it.\n */\n\nvar emptyNode = new VNode('', {}, []);\n\nvar hooks = ['create', 'activate', 'update', 'remove', 'destroy'];\n\nfunction sameVnode (a, b) {\n  return (\n    a.key === b.key && (\n      (\n        a.tag === b.tag &&\n        a.isComment === b.isComment &&\n        isDef(a.data) === isDef(b.data) &&\n        sameInputType(a, b)\n      ) || (\n        isTrue(a.isAsyncPlaceholder) &&\n        a.asyncFactory === b.asyncFactory &&\n        isUndef(b.asyncFactory.error)\n      )\n    )\n  )\n}\n\nfunction sameInputType (a, b) {\n  if (a.tag !== 'input') { return true }\n  var i;\n  var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;\n  var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;\n  return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)\n}\n\nfunction createKeyToOldIdx (children, beginIdx, endIdx) {\n  var i, key;\n  var map = {};\n  for (i = beginIdx; i <= endIdx; ++i) {\n    key = children[i].key;\n    if (isDef(key)) { map[key] = i; }\n  }\n  return map\n}\n\nfunction createPatchFunction (backend) {\n  var i, j;\n  var cbs = {};\n\n  var modules = backend.modules;\n  var nodeOps = backend.nodeOps;\n\n  for (i = 0; i < hooks.length; ++i) {\n    cbs[hooks[i]] = [];\n    for (j = 0; j < modules.length; ++j) {\n      if (isDef(modules[j][hooks[i]])) {\n        cbs[hooks[i]].push(modules[j][hooks[i]]);\n      }\n    }\n  }\n\n  function emptyNodeAt (elm) {\n    return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)\n  }\n\n  function createRmCb (childElm, listeners) {\n    function remove$$1 () {\n      if (--remove$$1.listeners === 0) {\n        removeNode(childElm);\n      }\n    }\n    remove$$1.listeners = listeners;\n    return remove$$1\n  }\n\n  function removeNode (el) {\n    var parent = nodeOps.parentNode(el);\n    // element may have already been removed due to v-html / v-text\n    if (isDef(parent)) {\n      nodeOps.removeChild(parent, el);\n    }\n  }\n\n  function isUnknownElement$$1 (vnode, inVPre) {\n    return (\n      !inVPre &&\n      !vnode.ns &&\n      !(\n        config.ignoredElements.length &&\n        config.ignoredElements.some(function (ignore) {\n          return isRegExp(ignore)\n            ? ignore.test(vnode.tag)\n            : ignore === vnode.tag\n        })\n      ) &&\n      config.isUnknownElement(vnode.tag)\n    )\n  }\n\n  var creatingElmInVPre = 0;\n\n  function createElm (\n    vnode,\n    insertedVnodeQueue,\n    parentElm,\n    refElm,\n    nested,\n    ownerArray,\n    index\n  ) {\n    if (isDef(vnode.elm) && isDef(ownerArray)) {\n      // This vnode was used in a previous render!\n      // now it's used as a new node, overwriting its elm would cause\n      // potential patch errors down the road when it's used as an insertion\n      // reference node. Instead, we clone the node on-demand before creating\n      // associated DOM element for it.\n      vnode = ownerArray[index] = cloneVNode(vnode);\n    }\n\n    vnode.isRootInsert = !nested; // for transition enter check\n    if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {\n      return\n    }\n\n    var data = vnode.data;\n    var children = vnode.children;\n    var tag = vnode.tag;\n    if (isDef(tag)) {\n      if (true) {\n        if (data && data.pre) {\n          creatingElmInVPre++;\n        }\n        if (isUnknownElement$$1(vnode, creatingElmInVPre)) {\n          warn(\n            'Unknown custom element: <' + tag + '> - did you ' +\n            'register the component correctly? For recursive components, ' +\n            'make sure to provide the \"name\" option.',\n            vnode.context\n          );\n        }\n      }\n\n      vnode.elm = vnode.ns\n        ? nodeOps.createElementNS(vnode.ns, tag)\n        : nodeOps.createElement(tag, vnode);\n      setScope(vnode);\n\n      /* istanbul ignore if */\n      {\n        createChildren(vnode, children, insertedVnodeQueue);\n        if (isDef(data)) {\n          invokeCreateHooks(vnode, insertedVnodeQueue);\n        }\n        insert(parentElm, vnode.elm, refElm);\n      }\n\n      if ( true && data && data.pre) {\n        creatingElmInVPre--;\n      }\n    } else if (isTrue(vnode.isComment)) {\n      vnode.elm = nodeOps.createComment(vnode.text);\n      insert(parentElm, vnode.elm, refElm);\n    } else {\n      vnode.elm = nodeOps.createTextNode(vnode.text);\n      insert(parentElm, vnode.elm, refElm);\n    }\n  }\n\n  function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n    var i = vnode.data;\n    if (isDef(i)) {\n      var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;\n      if (isDef(i = i.hook) && isDef(i = i.init)) {\n        i(vnode, false /* hydrating */);\n      }\n      // after calling the init hook, if the vnode is a child component\n      // it should've created a child instance and mounted it. the child\n      // component also has set the placeholder vnode's elm.\n      // in that case we can just return the element and be done.\n      if (isDef(vnode.componentInstance)) {\n        initComponent(vnode, insertedVnodeQueue);\n        insert(parentElm, vnode.elm, refElm);\n        if (isTrue(isReactivated)) {\n          reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);\n        }\n        return true\n      }\n    }\n  }\n\n  function initComponent (vnode, insertedVnodeQueue) {\n    if (isDef(vnode.data.pendingInsert)) {\n      insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);\n      vnode.data.pendingInsert = null;\n    }\n    vnode.elm = vnode.componentInstance.$el;\n    if (isPatchable(vnode)) {\n      invokeCreateHooks(vnode, insertedVnodeQueue);\n      setScope(vnode);\n    } else {\n      // empty component root.\n      // skip all element-related modules except for ref (#3455)\n      registerRef(vnode);\n      // make sure to invoke the insert hook\n      insertedVnodeQueue.push(vnode);\n    }\n  }\n\n  function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n    var i;\n    // hack for #4339: a reactivated component with inner transition\n    // does not trigger because the inner node's created hooks are not called\n    // again. It's not ideal to involve module-specific logic in here but\n    // there doesn't seem to be a better way to do it.\n    var innerNode = vnode;\n    while (innerNode.componentInstance) {\n      innerNode = innerNode.componentInstance._vnode;\n      if (isDef(i = innerNode.data) && isDef(i = i.transition)) {\n        for (i = 0; i < cbs.activate.length; ++i) {\n          cbs.activate[i](emptyNode, innerNode);\n        }\n        insertedVnodeQueue.push(innerNode);\n        break\n      }\n    }\n    // unlike a newly created component,\n    // a reactivated keep-alive component doesn't insert itself\n    insert(parentElm, vnode.elm, refElm);\n  }\n\n  function insert (parent, elm, ref$$1) {\n    if (isDef(parent)) {\n      if (isDef(ref$$1)) {\n        if (nodeOps.parentNode(ref$$1) === parent) {\n          nodeOps.insertBefore(parent, elm, ref$$1);\n        }\n      } else {\n        nodeOps.appendChild(parent, elm);\n      }\n    }\n  }\n\n  function createChildren (vnode, children, insertedVnodeQueue) {\n    if (Array.isArray(children)) {\n      if (true) {\n        checkDuplicateKeys(children);\n      }\n      for (var i = 0; i < children.length; ++i) {\n        createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);\n      }\n    } else if (isPrimitive(vnode.text)) {\n      nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));\n    }\n  }\n\n  function isPatchable (vnode) {\n    while (vnode.componentInstance) {\n      vnode = vnode.componentInstance._vnode;\n    }\n    return isDef(vnode.tag)\n  }\n\n  function invokeCreateHooks (vnode, insertedVnodeQueue) {\n    for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n      cbs.create[i$1](emptyNode, vnode);\n    }\n    i = vnode.data.hook; // Reuse variable\n    if (isDef(i)) {\n      if (isDef(i.create)) { i.create(emptyNode, vnode); }\n      if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }\n    }\n  }\n\n  // set scope id attribute for scoped CSS.\n  // this is implemented as a special case to avoid the overhead\n  // of going through the normal attribute patching process.\n  function setScope (vnode) {\n    var i;\n    if (isDef(i = vnode.fnScopeId)) {\n      nodeOps.setStyleScope(vnode.elm, i);\n    } else {\n      var ancestor = vnode;\n      while (ancestor) {\n        if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {\n          nodeOps.setStyleScope(vnode.elm, i);\n        }\n        ancestor = ancestor.parent;\n      }\n    }\n    // for slot content they should also get the scopeId from the host instance.\n    if (isDef(i = activeInstance) &&\n      i !== vnode.context &&\n      i !== vnode.fnContext &&\n      isDef(i = i.$options._scopeId)\n    ) {\n      nodeOps.setStyleScope(vnode.elm, i);\n    }\n  }\n\n  function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n    for (; startIdx <= endIdx; ++startIdx) {\n      createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);\n    }\n  }\n\n  function invokeDestroyHook (vnode) {\n    var i, j;\n    var data = vnode.data;\n    if (isDef(data)) {\n      if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }\n      for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }\n    }\n    if (isDef(i = vnode.children)) {\n      for (j = 0; j < vnode.children.length; ++j) {\n        invokeDestroyHook(vnode.children[j]);\n      }\n    }\n  }\n\n  function removeVnodes (parentElm, vnodes, startIdx, endIdx) {\n    for (; startIdx <= endIdx; ++startIdx) {\n      var ch = vnodes[startIdx];\n      if (isDef(ch)) {\n        if (isDef(ch.tag)) {\n          removeAndInvokeRemoveHook(ch);\n          invokeDestroyHook(ch);\n        } else { // Text node\n          removeNode(ch.elm);\n        }\n      }\n    }\n  }\n\n  function removeAndInvokeRemoveHook (vnode, rm) {\n    if (isDef(rm) || isDef(vnode.data)) {\n      var i;\n      var listeners = cbs.remove.length + 1;\n      if (isDef(rm)) {\n        // we have a recursively passed down rm callback\n        // increase the listeners count\n        rm.listeners += listeners;\n      } else {\n        // directly removing\n        rm = createRmCb(vnode.elm, listeners);\n      }\n      // recursively invoke hooks on child component root node\n      if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {\n        removeAndInvokeRemoveHook(i, rm);\n      }\n      for (i = 0; i < cbs.remove.length; ++i) {\n        cbs.remove[i](vnode, rm);\n      }\n      if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {\n        i(vnode, rm);\n      } else {\n        rm();\n      }\n    } else {\n      removeNode(vnode.elm);\n    }\n  }\n\n  function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {\n    var oldStartIdx = 0;\n    var newStartIdx = 0;\n    var oldEndIdx = oldCh.length - 1;\n    var oldStartVnode = oldCh[0];\n    var oldEndVnode = oldCh[oldEndIdx];\n    var newEndIdx = newCh.length - 1;\n    var newStartVnode = newCh[0];\n    var newEndVnode = newCh[newEndIdx];\n    var oldKeyToIdx, idxInOld, vnodeToMove, refElm;\n\n    // removeOnly is a special flag used only by <transition-group>\n    // to ensure removed elements stay in correct relative positions\n    // during leaving transitions\n    var canMove = !removeOnly;\n\n    if (true) {\n      checkDuplicateKeys(newCh);\n    }\n\n    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n      if (isUndef(oldStartVnode)) {\n        oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\n      } else if (isUndef(oldEndVnode)) {\n        oldEndVnode = oldCh[--oldEndIdx];\n      } else if (sameVnode(oldStartVnode, newStartVnode)) {\n        patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n        oldStartVnode = oldCh[++oldStartIdx];\n        newStartVnode = newCh[++newStartIdx];\n      } else if (sameVnode(oldEndVnode, newEndVnode)) {\n        patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n        oldEndVnode = oldCh[--oldEndIdx];\n        newEndVnode = newCh[--newEndIdx];\n      } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right\n        patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n        canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));\n        oldStartVnode = oldCh[++oldStartIdx];\n        newEndVnode = newCh[--newEndIdx];\n      } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left\n        patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n        canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n        oldEndVnode = oldCh[--oldEndIdx];\n        newStartVnode = newCh[++newStartIdx];\n      } else {\n        if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }\n        idxInOld = isDef(newStartVnode.key)\n          ? oldKeyToIdx[newStartVnode.key]\n          : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);\n        if (isUndef(idxInOld)) { // New element\n          createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n        } else {\n          vnodeToMove = oldCh[idxInOld];\n          if (sameVnode(vnodeToMove, newStartVnode)) {\n            patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n            oldCh[idxInOld] = undefined;\n            canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);\n          } else {\n            // same key but different element. treat as new element\n            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n          }\n        }\n        newStartVnode = newCh[++newStartIdx];\n      }\n    }\n    if (oldStartIdx > oldEndIdx) {\n      refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;\n      addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n    } else if (newStartIdx > newEndIdx) {\n      removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n    }\n  }\n\n  function checkDuplicateKeys (children) {\n    var seenKeys = {};\n    for (var i = 0; i < children.length; i++) {\n      var vnode = children[i];\n      var key = vnode.key;\n      if (isDef(key)) {\n        if (seenKeys[key]) {\n          warn(\n            (\"Duplicate keys detected: '\" + key + \"'. This may cause an update error.\"),\n            vnode.context\n          );\n        } else {\n          seenKeys[key] = true;\n        }\n      }\n    }\n  }\n\n  function findIdxInOld (node, oldCh, start, end) {\n    for (var i = start; i < end; i++) {\n      var c = oldCh[i];\n      if (isDef(c) && sameVnode(node, c)) { return i }\n    }\n  }\n\n  function patchVnode (\n    oldVnode,\n    vnode,\n    insertedVnodeQueue,\n    ownerArray,\n    index,\n    removeOnly\n  ) {\n    if (oldVnode === vnode) {\n      return\n    }\n\n    if (isDef(vnode.elm) && isDef(ownerArray)) {\n      // clone reused vnode\n      vnode = ownerArray[index] = cloneVNode(vnode);\n    }\n\n    var elm = vnode.elm = oldVnode.elm;\n\n    if (isTrue(oldVnode.isAsyncPlaceholder)) {\n      if (isDef(vnode.asyncFactory.resolved)) {\n        hydrate(oldVnode.elm, vnode, insertedVnodeQueue);\n      } else {\n        vnode.isAsyncPlaceholder = true;\n      }\n      return\n    }\n\n    // reuse element for static trees.\n    // note we only do this if the vnode is cloned -\n    // if the new node is not cloned it means the render functions have been\n    // reset by the hot-reload-api and we need to do a proper re-render.\n    if (isTrue(vnode.isStatic) &&\n      isTrue(oldVnode.isStatic) &&\n      vnode.key === oldVnode.key &&\n      (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))\n    ) {\n      vnode.componentInstance = oldVnode.componentInstance;\n      return\n    }\n\n    var i;\n    var data = vnode.data;\n    if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {\n      i(oldVnode, vnode);\n    }\n\n    var oldCh = oldVnode.children;\n    var ch = vnode.children;\n    if (isDef(data) && isPatchable(vnode)) {\n      for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }\n      if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }\n    }\n    if (isUndef(vnode.text)) {\n      if (isDef(oldCh) && isDef(ch)) {\n        if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }\n      } else if (isDef(ch)) {\n        if (true) {\n          checkDuplicateKeys(ch);\n        }\n        if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }\n        addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n      } else if (isDef(oldCh)) {\n        removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n      } else if (isDef(oldVnode.text)) {\n        nodeOps.setTextContent(elm, '');\n      }\n    } else if (oldVnode.text !== vnode.text) {\n      nodeOps.setTextContent(elm, vnode.text);\n    }\n    if (isDef(data)) {\n      if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }\n    }\n  }\n\n  function invokeInsertHook (vnode, queue, initial) {\n    // delay insert hooks for component root nodes, invoke them after the\n    // element is really inserted\n    if (isTrue(initial) && isDef(vnode.parent)) {\n      vnode.parent.data.pendingInsert = queue;\n    } else {\n      for (var i = 0; i < queue.length; ++i) {\n        queue[i].data.hook.insert(queue[i]);\n      }\n    }\n  }\n\n  var hydrationBailed = false;\n  // list of modules that can skip create hook during hydration because they\n  // are already rendered on the client or has no need for initialization\n  // Note: style is excluded because it relies on initial clone for future\n  // deep updates (#7063).\n  var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');\n\n  // Note: this is a browser-only function so we can assume elms are DOM nodes.\n  function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {\n    var i;\n    var tag = vnode.tag;\n    var data = vnode.data;\n    var children = vnode.children;\n    inVPre = inVPre || (data && data.pre);\n    vnode.elm = elm;\n\n    if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {\n      vnode.isAsyncPlaceholder = true;\n      return true\n    }\n    // assert node match\n    if (true) {\n      if (!assertNodeMatch(elm, vnode, inVPre)) {\n        return false\n      }\n    }\n    if (isDef(data)) {\n      if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }\n      if (isDef(i = vnode.componentInstance)) {\n        // child component. it should have hydrated its own tree.\n        initComponent(vnode, insertedVnodeQueue);\n        return true\n      }\n    }\n    if (isDef(tag)) {\n      if (isDef(children)) {\n        // empty element, allow client to pick up and populate children\n        if (!elm.hasChildNodes()) {\n          createChildren(vnode, children, insertedVnodeQueue);\n        } else {\n          // v-html and domProps: innerHTML\n          if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {\n            if (i !== elm.innerHTML) {\n              /* istanbul ignore if */\n              if ( true &&\n                typeof console !== 'undefined' &&\n                !hydrationBailed\n              ) {\n                hydrationBailed = true;\n                console.warn('Parent: ', elm);\n                console.warn('server innerHTML: ', i);\n                console.warn('client innerHTML: ', elm.innerHTML);\n              }\n              return false\n            }\n          } else {\n            // iterate and compare children lists\n            var childrenMatch = true;\n            var childNode = elm.firstChild;\n            for (var i$1 = 0; i$1 < children.length; i$1++) {\n              if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {\n                childrenMatch = false;\n                break\n              }\n              childNode = childNode.nextSibling;\n            }\n            // if childNode is not null, it means the actual childNodes list is\n            // longer than the virtual children list.\n            if (!childrenMatch || childNode) {\n              /* istanbul ignore if */\n              if ( true &&\n                typeof console !== 'undefined' &&\n                !hydrationBailed\n              ) {\n                hydrationBailed = true;\n                console.warn('Parent: ', elm);\n                console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);\n              }\n              return false\n            }\n          }\n        }\n      }\n      if (isDef(data)) {\n        var fullInvoke = false;\n        for (var key in data) {\n          if (!isRenderedModule(key)) {\n            fullInvoke = true;\n            invokeCreateHooks(vnode, insertedVnodeQueue);\n            break\n          }\n        }\n        if (!fullInvoke && data['class']) {\n          // ensure collecting deps for deep class bindings for future updates\n          traverse(data['class']);\n        }\n      }\n    } else if (elm.data !== vnode.text) {\n      elm.data = vnode.text;\n    }\n    return true\n  }\n\n  function assertNodeMatch (node, vnode, inVPre) {\n    if (isDef(vnode.tag)) {\n      return vnode.tag.indexOf('vue-component') === 0 || (\n        !isUnknownElement$$1(vnode, inVPre) &&\n        vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())\n      )\n    } else {\n      return node.nodeType === (vnode.isComment ? 8 : 3)\n    }\n  }\n\n  return function patch (oldVnode, vnode, hydrating, removeOnly) {\n    if (isUndef(vnode)) {\n      if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }\n      return\n    }\n\n    var isInitialPatch = false;\n    var insertedVnodeQueue = [];\n\n    if (isUndef(oldVnode)) {\n      // empty mount (likely as component), create new root element\n      isInitialPatch = true;\n      createElm(vnode, insertedVnodeQueue);\n    } else {\n      var isRealElement = isDef(oldVnode.nodeType);\n      if (!isRealElement && sameVnode(oldVnode, vnode)) {\n        // patch existing root node\n        patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly);\n      } else {\n        if (isRealElement) {\n          // mounting to a real element\n          // check if this is server-rendered content and if we can perform\n          // a successful hydration.\n          if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {\n            oldVnode.removeAttribute(SSR_ATTR);\n            hydrating = true;\n          }\n          if (isTrue(hydrating)) {\n            if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {\n              invokeInsertHook(vnode, insertedVnodeQueue, true);\n              return oldVnode\n            } else if (true) {\n              warn(\n                'The client-side rendered virtual DOM tree is not matching ' +\n                'server-rendered content. This is likely caused by incorrect ' +\n                'HTML markup, for example nesting block-level elements inside ' +\n                '<p>, or missing <tbody>. Bailing hydration and performing ' +\n                'full client-side render.'\n              );\n            }\n          }\n          // either not server-rendered, or hydration failed.\n          // create an empty node and replace it\n          oldVnode = emptyNodeAt(oldVnode);\n        }\n\n        // replacing existing element\n        var oldElm = oldVnode.elm;\n        var parentElm = nodeOps.parentNode(oldElm);\n\n        // create new node\n        createElm(\n          vnode,\n          insertedVnodeQueue,\n          // extremely rare edge case: do not insert if old element is in a\n          // leaving transition. Only happens when combining transition +\n          // keep-alive + HOCs. (#4590)\n          oldElm._leaveCb ? null : parentElm,\n          nodeOps.nextSibling(oldElm)\n        );\n\n        // update parent placeholder node element, recursively\n        if (isDef(vnode.parent)) {\n          var ancestor = vnode.parent;\n          var patchable = isPatchable(vnode);\n          while (ancestor) {\n            for (var i = 0; i < cbs.destroy.length; ++i) {\n              cbs.destroy[i](ancestor);\n            }\n            ancestor.elm = vnode.elm;\n            if (patchable) {\n              for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n                cbs.create[i$1](emptyNode, ancestor);\n              }\n              // #6513\n              // invoke insert hooks that may have been merged by create hooks.\n              // e.g. for directives that uses the \"inserted\" hook.\n              var insert = ancestor.data.hook.insert;\n              if (insert.merged) {\n                // start at index 1 to avoid re-invoking component mounted hook\n                for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n                  insert.fns[i$2]();\n                }\n              }\n            } else {\n              registerRef(ancestor);\n            }\n            ancestor = ancestor.parent;\n          }\n        }\n\n        // destroy old node\n        if (isDef(parentElm)) {\n          removeVnodes(parentElm, [oldVnode], 0, 0);\n        } else if (isDef(oldVnode.tag)) {\n          invokeDestroyHook(oldVnode);\n        }\n      }\n    }\n\n    invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n    return vnode.elm\n  }\n}\n\n/*  */\n\nvar directives = {\n  create: updateDirectives,\n  update: updateDirectives,\n  destroy: function unbindDirectives (vnode) {\n    updateDirectives(vnode, emptyNode);\n  }\n};\n\nfunction updateDirectives (oldVnode, vnode) {\n  if (oldVnode.data.directives || vnode.data.directives) {\n    _update(oldVnode, vnode);\n  }\n}\n\nfunction _update (oldVnode, vnode) {\n  var isCreate = oldVnode === emptyNode;\n  var isDestroy = vnode === emptyNode;\n  var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n  var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n  var dirsWithInsert = [];\n  var dirsWithPostpatch = [];\n\n  var key, oldDir, dir;\n  for (key in newDirs) {\n    oldDir = oldDirs[key];\n    dir = newDirs[key];\n    if (!oldDir) {\n      // new directive, bind\n      callHook$1(dir, 'bind', vnode, oldVnode);\n      if (dir.def && dir.def.inserted) {\n        dirsWithInsert.push(dir);\n      }\n    } else {\n      // existing directive, update\n      dir.oldValue = oldDir.value;\n      dir.oldArg = oldDir.arg;\n      callHook$1(dir, 'update', vnode, oldVnode);\n      if (dir.def && dir.def.componentUpdated) {\n        dirsWithPostpatch.push(dir);\n      }\n    }\n  }\n\n  if (dirsWithInsert.length) {\n    var callInsert = function () {\n      for (var i = 0; i < dirsWithInsert.length; i++) {\n        callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n      }\n    };\n    if (isCreate) {\n      mergeVNodeHook(vnode, 'insert', callInsert);\n    } else {\n      callInsert();\n    }\n  }\n\n  if (dirsWithPostpatch.length) {\n    mergeVNodeHook(vnode, 'postpatch', function () {\n      for (var i = 0; i < dirsWithPostpatch.length; i++) {\n        callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n      }\n    });\n  }\n\n  if (!isCreate) {\n    for (key in oldDirs) {\n      if (!newDirs[key]) {\n        // no longer present, unbind\n        callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n      }\n    }\n  }\n}\n\nvar emptyModifiers = Object.create(null);\n\nfunction normalizeDirectives$1 (\n  dirs,\n  vm\n) {\n  var res = Object.create(null);\n  if (!dirs) {\n    // $flow-disable-line\n    return res\n  }\n  var i, dir;\n  for (i = 0; i < dirs.length; i++) {\n    dir = dirs[i];\n    if (!dir.modifiers) {\n      // $flow-disable-line\n      dir.modifiers = emptyModifiers;\n    }\n    res[getRawDirName(dir)] = dir;\n    dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n  }\n  // $flow-disable-line\n  return res\n}\n\nfunction getRawDirName (dir) {\n  return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n}\n\nfunction callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n  var fn = dir.def && dir.def[hook];\n  if (fn) {\n    try {\n      fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n    } catch (e) {\n      handleError(e, vnode.context, (\"directive \" + (dir.name) + \" \" + hook + \" hook\"));\n    }\n  }\n}\n\nvar baseModules = [\n  ref,\n  directives\n];\n\n/*  */\n\nfunction updateAttrs (oldVnode, vnode) {\n  var opts = vnode.componentOptions;\n  if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n    return\n  }\n  if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n    return\n  }\n  var key, cur, old;\n  var elm = vnode.elm;\n  var oldAttrs = oldVnode.data.attrs || {};\n  var attrs = vnode.data.attrs || {};\n  // clone observed objects, as the user probably wants to mutate it\n  if (isDef(attrs.__ob__)) {\n    attrs = vnode.data.attrs = extend({}, attrs);\n  }\n\n  for (key in attrs) {\n    cur = attrs[key];\n    old = oldAttrs[key];\n    if (old !== cur) {\n      setAttr(elm, key, cur);\n    }\n  }\n  // #4391: in IE9, setting type can reset value for input[type=radio]\n  // #6666: IE/Edge forces progress value down to 1 before setting a max\n  /* istanbul ignore if */\n  if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n    setAttr(elm, 'value', attrs.value);\n  }\n  for (key in oldAttrs) {\n    if (isUndef(attrs[key])) {\n      if (isXlink(key)) {\n        elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n      } else if (!isEnumeratedAttr(key)) {\n        elm.removeAttribute(key);\n      }\n    }\n  }\n}\n\nfunction setAttr (el, key, value) {\n  if (el.tagName.indexOf('-') > -1) {\n    baseSetAttr(el, key, value);\n  } else if (isBooleanAttr(key)) {\n    // set attribute for blank value\n    // e.g. <option disabled>Select one</option>\n    if (isFalsyAttrValue(value)) {\n      el.removeAttribute(key);\n    } else {\n      // technically allowfullscreen is a boolean attribute for <iframe>,\n      // but Flash expects a value of \"true\" when used on <embed> tag\n      value = key === 'allowfullscreen' && el.tagName === 'EMBED'\n        ? 'true'\n        : key;\n      el.setAttribute(key, value);\n    }\n  } else if (isEnumeratedAttr(key)) {\n    el.setAttribute(key, convertEnumeratedValue(key, value));\n  } else if (isXlink(key)) {\n    if (isFalsyAttrValue(value)) {\n      el.removeAttributeNS(xlinkNS, getXlinkProp(key));\n    } else {\n      el.setAttributeNS(xlinkNS, key, value);\n    }\n  } else {\n    baseSetAttr(el, key, value);\n  }\n}\n\nfunction baseSetAttr (el, key, value) {\n  if (isFalsyAttrValue(value)) {\n    el.removeAttribute(key);\n  } else {\n    // #7138: IE10 & 11 fires input event when setting placeholder on\n    // <textarea>... block the first input event and remove the blocker\n    // immediately.\n    /* istanbul ignore if */\n    if (\n      isIE && !isIE9 &&\n      el.tagName === 'TEXTAREA' &&\n      key === 'placeholder' && value !== '' && !el.__ieph\n    ) {\n      var blocker = function (e) {\n        e.stopImmediatePropagation();\n        el.removeEventListener('input', blocker);\n      };\n      el.addEventListener('input', blocker);\n      // $flow-disable-line\n      el.__ieph = true; /* IE placeholder patched */\n    }\n    el.setAttribute(key, value);\n  }\n}\n\nvar attrs = {\n  create: updateAttrs,\n  update: updateAttrs\n};\n\n/*  */\n\nfunction updateClass (oldVnode, vnode) {\n  var el = vnode.elm;\n  var data = vnode.data;\n  var oldData = oldVnode.data;\n  if (\n    isUndef(data.staticClass) &&\n    isUndef(data.class) && (\n      isUndef(oldData) || (\n        isUndef(oldData.staticClass) &&\n        isUndef(oldData.class)\n      )\n    )\n  ) {\n    return\n  }\n\n  var cls = genClassForVnode(vnode);\n\n  // handle transition classes\n  var transitionClass = el._transitionClasses;\n  if (isDef(transitionClass)) {\n    cls = concat(cls, stringifyClass(transitionClass));\n  }\n\n  // set the class\n  if (cls !== el._prevClass) {\n    el.setAttribute('class', cls);\n    el._prevClass = cls;\n  }\n}\n\nvar klass = {\n  create: updateClass,\n  update: updateClass\n};\n\n/*  */\n\n/*  */\n\n/*  */\n\n/*  */\n\n// in some cases, the event used has to be determined at runtime\n// so we used some reserved tokens during compile.\nvar RANGE_TOKEN = '__r';\nvar CHECKBOX_RADIO_TOKEN = '__c';\n\n/*  */\n\n// normalize v-model event tokens that can only be determined at runtime.\n// it's important to place the event as the first in the array because\n// the whole point is ensuring the v-model callback gets called before\n// user-attached handlers.\nfunction normalizeEvents (on) {\n  /* istanbul ignore if */\n  if (isDef(on[RANGE_TOKEN])) {\n    // IE input[type=range] only supports `change` event\n    var event = isIE ? 'change' : 'input';\n    on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);\n    delete on[RANGE_TOKEN];\n  }\n  // This was originally intended to fix #4521 but no longer necessary\n  // after 2.5. Keeping it for backwards compat with generated code from < 2.4\n  /* istanbul ignore if */\n  if (isDef(on[CHECKBOX_RADIO_TOKEN])) {\n    on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);\n    delete on[CHECKBOX_RADIO_TOKEN];\n  }\n}\n\nvar target$1;\n\nfunction createOnceHandler$1 (event, handler, capture) {\n  var _target = target$1; // save current target element in closure\n  return function onceHandler () {\n    var res = handler.apply(null, arguments);\n    if (res !== null) {\n      remove$2(event, onceHandler, capture, _target);\n    }\n  }\n}\n\n// #9446: Firefox <= 53 (in particular, ESR 52) has incorrect Event.timeStamp\n// implementation and does not fire microtasks in between event propagation, so\n// safe to exclude.\nvar useMicrotaskFix = isUsingMicroTask && !(isFF && Number(isFF[1]) <= 53);\n\nfunction add$1 (\n  name,\n  handler,\n  capture,\n  passive\n) {\n  // async edge case #6566: inner click event triggers patch, event handler\n  // attached to outer element during patch, and triggered again. This\n  // happens because browsers fire microtask ticks between event propagation.\n  // the solution is simple: we save the timestamp when a handler is attached,\n  // and the handler would only fire if the event passed to it was fired\n  // AFTER it was attached.\n  if (useMicrotaskFix) {\n    var attachedTimestamp = currentFlushTimestamp;\n    var original = handler;\n    handler = original._wrapper = function (e) {\n      if (\n        // no bubbling, should always fire.\n        // this is just a safety net in case event.timeStamp is unreliable in\n        // certain weird environments...\n        e.target === e.currentTarget ||\n        // event is fired after handler attachment\n        e.timeStamp >= attachedTimestamp ||\n        // bail for environments that have buggy event.timeStamp implementations\n        // #9462 iOS 9 bug: event.timeStamp is 0 after history.pushState\n        // #9681 QtWebEngine event.timeStamp is negative value\n        e.timeStamp <= 0 ||\n        // #9448 bail if event is fired in another document in a multi-page\n        // electron/nw.js app, since event.timeStamp will be using a different\n        // starting reference\n        e.target.ownerDocument !== document\n      ) {\n        return original.apply(this, arguments)\n      }\n    };\n  }\n  target$1.addEventListener(\n    name,\n    handler,\n    supportsPassive\n      ? { capture: capture, passive: passive }\n      : capture\n  );\n}\n\nfunction remove$2 (\n  name,\n  handler,\n  capture,\n  _target\n) {\n  (_target || target$1).removeEventListener(\n    name,\n    handler._wrapper || handler,\n    capture\n  );\n}\n\nfunction updateDOMListeners (oldVnode, vnode) {\n  if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {\n    return\n  }\n  var on = vnode.data.on || {};\n  var oldOn = oldVnode.data.on || {};\n  target$1 = vnode.elm;\n  normalizeEvents(on);\n  updateListeners(on, oldOn, add$1, remove$2, createOnceHandler$1, vnode.context);\n  target$1 = undefined;\n}\n\nvar events = {\n  create: updateDOMListeners,\n  update: updateDOMListeners\n};\n\n/*  */\n\nvar svgContainer;\n\nfunction updateDOMProps (oldVnode, vnode) {\n  if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {\n    return\n  }\n  var key, cur;\n  var elm = vnode.elm;\n  var oldProps = oldVnode.data.domProps || {};\n  var props = vnode.data.domProps || {};\n  // clone observed objects, as the user probably wants to mutate it\n  if (isDef(props.__ob__)) {\n    props = vnode.data.domProps = extend({}, props);\n  }\n\n  for (key in oldProps) {\n    if (!(key in props)) {\n      elm[key] = '';\n    }\n  }\n\n  for (key in props) {\n    cur = props[key];\n    // ignore children if the node has textContent or innerHTML,\n    // as these will throw away existing DOM nodes and cause removal errors\n    // on subsequent patches (#3360)\n    if (key === 'textContent' || key === 'innerHTML') {\n      if (vnode.children) { vnode.children.length = 0; }\n      if (cur === oldProps[key]) { continue }\n      // #6601 work around Chrome version <= 55 bug where single textNode\n      // replaced by innerHTML/textContent retains its parentNode property\n      if (elm.childNodes.length === 1) {\n        elm.removeChild(elm.childNodes[0]);\n      }\n    }\n\n    if (key === 'value' && elm.tagName !== 'PROGRESS') {\n      // store value as _value as well since\n      // non-string values will be stringified\n      elm._value = cur;\n      // avoid resetting cursor position when value is the same\n      var strCur = isUndef(cur) ? '' : String(cur);\n      if (shouldUpdateValue(elm, strCur)) {\n        elm.value = strCur;\n      }\n    } else if (key === 'innerHTML' && isSVG(elm.tagName) && isUndef(elm.innerHTML)) {\n      // IE doesn't support innerHTML for SVG elements\n      svgContainer = svgContainer || document.createElement('div');\n      svgContainer.innerHTML = \"<svg>\" + cur + \"</svg>\";\n      var svg = svgContainer.firstChild;\n      while (elm.firstChild) {\n        elm.removeChild(elm.firstChild);\n      }\n      while (svg.firstChild) {\n        elm.appendChild(svg.firstChild);\n      }\n    } else if (\n      // skip the update if old and new VDOM state is the same.\n      // `value` is handled separately because the DOM value may be temporarily\n      // out of sync with VDOM state due to focus, composition and modifiers.\n      // This  #4521 by skipping the unnecesarry `checked` update.\n      cur !== oldProps[key]\n    ) {\n      // some property updates can throw\n      // e.g. `value` on <progress> w/ non-finite value\n      try {\n        elm[key] = cur;\n      } catch (e) {}\n    }\n  }\n}\n\n// check platforms/web/util/attrs.js acceptValue\n\n\nfunction shouldUpdateValue (elm, checkVal) {\n  return (!elm.composing && (\n    elm.tagName === 'OPTION' ||\n    isNotInFocusAndDirty(elm, checkVal) ||\n    isDirtyWithModifiers(elm, checkVal)\n  ))\n}\n\nfunction isNotInFocusAndDirty (elm, checkVal) {\n  // return true when textbox (.number and .trim) loses focus and its value is\n  // not equal to the updated value\n  var notInFocus = true;\n  // #6157\n  // work around IE bug when accessing document.activeElement in an iframe\n  try { notInFocus = document.activeElement !== elm; } catch (e) {}\n  return notInFocus && elm.value !== checkVal\n}\n\nfunction isDirtyWithModifiers (elm, newVal) {\n  var value = elm.value;\n  var modifiers = elm._vModifiers; // injected by v-model runtime\n  if (isDef(modifiers)) {\n    if (modifiers.number) {\n      return toNumber(value) !== toNumber(newVal)\n    }\n    if (modifiers.trim) {\n      return value.trim() !== newVal.trim()\n    }\n  }\n  return value !== newVal\n}\n\nvar domProps = {\n  create: updateDOMProps,\n  update: updateDOMProps\n};\n\n/*  */\n\nvar parseStyleText = cached(function (cssText) {\n  var res = {};\n  var listDelimiter = /;(?![^(]*\\))/g;\n  var propertyDelimiter = /:(.+)/;\n  cssText.split(listDelimiter).forEach(function (item) {\n    if (item) {\n      var tmp = item.split(propertyDelimiter);\n      tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\n    }\n  });\n  return res\n});\n\n// merge static and dynamic style data on the same vnode\nfunction normalizeStyleData (data) {\n  var style = normalizeStyleBinding(data.style);\n  // static style is pre-processed into an object during compilation\n  // and is always a fresh object, so it's safe to merge into it\n  return data.staticStyle\n    ? extend(data.staticStyle, style)\n    : style\n}\n\n// normalize possible array / string values into Object\nfunction normalizeStyleBinding (bindingStyle) {\n  if (Array.isArray(bindingStyle)) {\n    return toObject(bindingStyle)\n  }\n  if (typeof bindingStyle === 'string') {\n    return parseStyleText(bindingStyle)\n  }\n  return bindingStyle\n}\n\n/**\n * parent component style should be after child's\n * so that parent component's style could override it\n */\nfunction getStyle (vnode, checkChild) {\n  var res = {};\n  var styleData;\n\n  if (checkChild) {\n    var childNode = vnode;\n    while (childNode.componentInstance) {\n      childNode = childNode.componentInstance._vnode;\n      if (\n        childNode && childNode.data &&\n        (styleData = normalizeStyleData(childNode.data))\n      ) {\n        extend(res, styleData);\n      }\n    }\n  }\n\n  if ((styleData = normalizeStyleData(vnode.data))) {\n    extend(res, styleData);\n  }\n\n  var parentNode = vnode;\n  while ((parentNode = parentNode.parent)) {\n    if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {\n      extend(res, styleData);\n    }\n  }\n  return res\n}\n\n/*  */\n\nvar cssVarRE = /^--/;\nvar importantRE = /\\s*!important$/;\nvar setProp = function (el, name, val) {\n  /* istanbul ignore if */\n  if (cssVarRE.test(name)) {\n    el.style.setProperty(name, val);\n  } else if (importantRE.test(val)) {\n    el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');\n  } else {\n    var normalizedName = normalize(name);\n    if (Array.isArray(val)) {\n      // Support values array created by autoprefixer, e.g.\n      // {display: [\"-webkit-box\", \"-ms-flexbox\", \"flex\"]}\n      // Set them one by one, and the browser will only set those it can recognize\n      for (var i = 0, len = val.length; i < len; i++) {\n        el.style[normalizedName] = val[i];\n      }\n    } else {\n      el.style[normalizedName] = val;\n    }\n  }\n};\n\nvar vendorNames = ['Webkit', 'Moz', 'ms'];\n\nvar emptyStyle;\nvar normalize = cached(function (prop) {\n  emptyStyle = emptyStyle || document.createElement('div').style;\n  prop = camelize(prop);\n  if (prop !== 'filter' && (prop in emptyStyle)) {\n    return prop\n  }\n  var capName = prop.charAt(0).toUpperCase() + prop.slice(1);\n  for (var i = 0; i < vendorNames.length; i++) {\n    var name = vendorNames[i] + capName;\n    if (name in emptyStyle) {\n      return name\n    }\n  }\n});\n\nfunction updateStyle (oldVnode, vnode) {\n  var data = vnode.data;\n  var oldData = oldVnode.data;\n\n  if (isUndef(data.staticStyle) && isUndef(data.style) &&\n    isUndef(oldData.staticStyle) && isUndef(oldData.style)\n  ) {\n    return\n  }\n\n  var cur, name;\n  var el = vnode.elm;\n  var oldStaticStyle = oldData.staticStyle;\n  var oldStyleBinding = oldData.normalizedStyle || oldData.style || {};\n\n  // if static style exists, stylebinding already merged into it when doing normalizeStyleData\n  var oldStyle = oldStaticStyle || oldStyleBinding;\n\n  var style = normalizeStyleBinding(vnode.data.style) || {};\n\n  // store normalized style under a different key for next diff\n  // make sure to clone it if it's reactive, since the user likely wants\n  // to mutate it.\n  vnode.data.normalizedStyle = isDef(style.__ob__)\n    ? extend({}, style)\n    : style;\n\n  var newStyle = getStyle(vnode, true);\n\n  for (name in oldStyle) {\n    if (isUndef(newStyle[name])) {\n      setProp(el, name, '');\n    }\n  }\n  for (name in newStyle) {\n    cur = newStyle[name];\n    if (cur !== oldStyle[name]) {\n      // ie9 setting to null has no effect, must use empty string\n      setProp(el, name, cur == null ? '' : cur);\n    }\n  }\n}\n\nvar style = {\n  create: updateStyle,\n  update: updateStyle\n};\n\n/*  */\n\nvar whitespaceRE = /\\s+/;\n\n/**\n * Add class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction addClass (el, cls) {\n  /* istanbul ignore if */\n  if (!cls || !(cls = cls.trim())) {\n    return\n  }\n\n  /* istanbul ignore else */\n  if (el.classList) {\n    if (cls.indexOf(' ') > -1) {\n      cls.split(whitespaceRE).forEach(function (c) { return el.classList.add(c); });\n    } else {\n      el.classList.add(cls);\n    }\n  } else {\n    var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n    if (cur.indexOf(' ' + cls + ' ') < 0) {\n      el.setAttribute('class', (cur + cls).trim());\n    }\n  }\n}\n\n/**\n * Remove class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction removeClass (el, cls) {\n  /* istanbul ignore if */\n  if (!cls || !(cls = cls.trim())) {\n    return\n  }\n\n  /* istanbul ignore else */\n  if (el.classList) {\n    if (cls.indexOf(' ') > -1) {\n      cls.split(whitespaceRE).forEach(function (c) { return el.classList.remove(c); });\n    } else {\n      el.classList.remove(cls);\n    }\n    if (!el.classList.length) {\n      el.removeAttribute('class');\n    }\n  } else {\n    var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n    var tar = ' ' + cls + ' ';\n    while (cur.indexOf(tar) >= 0) {\n      cur = cur.replace(tar, ' ');\n    }\n    cur = cur.trim();\n    if (cur) {\n      el.setAttribute('class', cur);\n    } else {\n      el.removeAttribute('class');\n    }\n  }\n}\n\n/*  */\n\nfunction resolveTransition (def$$1) {\n  if (!def$$1) {\n    return\n  }\n  /* istanbul ignore else */\n  if (typeof def$$1 === 'object') {\n    var res = {};\n    if (def$$1.css !== false) {\n      extend(res, autoCssTransition(def$$1.name || 'v'));\n    }\n    extend(res, def$$1);\n    return res\n  } else if (typeof def$$1 === 'string') {\n    return autoCssTransition(def$$1)\n  }\n}\n\nvar autoCssTransition = cached(function (name) {\n  return {\n    enterClass: (name + \"-enter\"),\n    enterToClass: (name + \"-enter-to\"),\n    enterActiveClass: (name + \"-enter-active\"),\n    leaveClass: (name + \"-leave\"),\n    leaveToClass: (name + \"-leave-to\"),\n    leaveActiveClass: (name + \"-leave-active\")\n  }\n});\n\nvar hasTransition = inBrowser && !isIE9;\nvar TRANSITION = 'transition';\nvar ANIMATION = 'animation';\n\n// Transition property/event sniffing\nvar transitionProp = 'transition';\nvar transitionEndEvent = 'transitionend';\nvar animationProp = 'animation';\nvar animationEndEvent = 'animationend';\nif (hasTransition) {\n  /* istanbul ignore if */\n  if (window.ontransitionend === undefined &&\n    window.onwebkittransitionend !== undefined\n  ) {\n    transitionProp = 'WebkitTransition';\n    transitionEndEvent = 'webkitTransitionEnd';\n  }\n  if (window.onanimationend === undefined &&\n    window.onwebkitanimationend !== undefined\n  ) {\n    animationProp = 'WebkitAnimation';\n    animationEndEvent = 'webkitAnimationEnd';\n  }\n}\n\n// binding to window is necessary to make hot reload work in IE in strict mode\nvar raf = inBrowser\n  ? window.requestAnimationFrame\n    ? window.requestAnimationFrame.bind(window)\n    : setTimeout\n  : /* istanbul ignore next */ function (fn) { return fn(); };\n\nfunction nextFrame (fn) {\n  raf(function () {\n    raf(fn);\n  });\n}\n\nfunction addTransitionClass (el, cls) {\n  var transitionClasses = el._transitionClasses || (el._transitionClasses = []);\n  if (transitionClasses.indexOf(cls) < 0) {\n    transitionClasses.push(cls);\n    addClass(el, cls);\n  }\n}\n\nfunction removeTransitionClass (el, cls) {\n  if (el._transitionClasses) {\n    remove(el._transitionClasses, cls);\n  }\n  removeClass(el, cls);\n}\n\nfunction whenTransitionEnds (\n  el,\n  expectedType,\n  cb\n) {\n  var ref = getTransitionInfo(el, expectedType);\n  var type = ref.type;\n  var timeout = ref.timeout;\n  var propCount = ref.propCount;\n  if (!type) { return cb() }\n  var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;\n  var ended = 0;\n  var end = function () {\n    el.removeEventListener(event, onEnd);\n    cb();\n  };\n  var onEnd = function (e) {\n    if (e.target === el) {\n      if (++ended >= propCount) {\n        end();\n      }\n    }\n  };\n  setTimeout(function () {\n    if (ended < propCount) {\n      end();\n    }\n  }, timeout + 1);\n  el.addEventListener(event, onEnd);\n}\n\nvar transformRE = /\\b(transform|all)(,|$)/;\n\nfunction getTransitionInfo (el, expectedType) {\n  var styles = window.getComputedStyle(el);\n  // JSDOM may return undefined for transition properties\n  var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ');\n  var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ');\n  var transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n  var animationDelays = (styles[animationProp + 'Delay'] || '').split(', ');\n  var animationDurations = (styles[animationProp + 'Duration'] || '').split(', ');\n  var animationTimeout = getTimeout(animationDelays, animationDurations);\n\n  var type;\n  var timeout = 0;\n  var propCount = 0;\n  /* istanbul ignore if */\n  if (expectedType === TRANSITION) {\n    if (transitionTimeout > 0) {\n      type = TRANSITION;\n      timeout = transitionTimeout;\n      propCount = transitionDurations.length;\n    }\n  } else if (expectedType === ANIMATION) {\n    if (animationTimeout > 0) {\n      type = ANIMATION;\n      timeout = animationTimeout;\n      propCount = animationDurations.length;\n    }\n  } else {\n    timeout = Math.max(transitionTimeout, animationTimeout);\n    type = timeout > 0\n      ? transitionTimeout > animationTimeout\n        ? TRANSITION\n        : ANIMATION\n      : null;\n    propCount = type\n      ? type === TRANSITION\n        ? transitionDurations.length\n        : animationDurations.length\n      : 0;\n  }\n  var hasTransform =\n    type === TRANSITION &&\n    transformRE.test(styles[transitionProp + 'Property']);\n  return {\n    type: type,\n    timeout: timeout,\n    propCount: propCount,\n    hasTransform: hasTransform\n  }\n}\n\nfunction getTimeout (delays, durations) {\n  /* istanbul ignore next */\n  while (delays.length < durations.length) {\n    delays = delays.concat(delays);\n  }\n\n  return Math.max.apply(null, durations.map(function (d, i) {\n    return toMs(d) + toMs(delays[i])\n  }))\n}\n\n// Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers\n// in a locale-dependent way, using a comma instead of a dot.\n// If comma is not replaced with a dot, the input will be rounded down (i.e. acting\n// as a floor function) causing unexpected behaviors\nfunction toMs (s) {\n  return Number(s.slice(0, -1).replace(',', '.')) * 1000\n}\n\n/*  */\n\nfunction enter (vnode, toggleDisplay) {\n  var el = vnode.elm;\n\n  // call leave callback now\n  if (isDef(el._leaveCb)) {\n    el._leaveCb.cancelled = true;\n    el._leaveCb();\n  }\n\n  var data = resolveTransition(vnode.data.transition);\n  if (isUndef(data)) {\n    return\n  }\n\n  /* istanbul ignore if */\n  if (isDef(el._enterCb) || el.nodeType !== 1) {\n    return\n  }\n\n  var css = data.css;\n  var type = data.type;\n  var enterClass = data.enterClass;\n  var enterToClass = data.enterToClass;\n  var enterActiveClass = data.enterActiveClass;\n  var appearClass = data.appearClass;\n  var appearToClass = data.appearToClass;\n  var appearActiveClass = data.appearActiveClass;\n  var beforeEnter = data.beforeEnter;\n  var enter = data.enter;\n  var afterEnter = data.afterEnter;\n  var enterCancelled = data.enterCancelled;\n  var beforeAppear = data.beforeAppear;\n  var appear = data.appear;\n  var afterAppear = data.afterAppear;\n  var appearCancelled = data.appearCancelled;\n  var duration = data.duration;\n\n  // activeInstance will always be the <transition> component managing this\n  // transition. One edge case to check is when the <transition> is placed\n  // as the root node of a child component. In that case we need to check\n  // <transition>'s parent for appear check.\n  var context = activeInstance;\n  var transitionNode = activeInstance.$vnode;\n  while (transitionNode && transitionNode.parent) {\n    context = transitionNode.context;\n    transitionNode = transitionNode.parent;\n  }\n\n  var isAppear = !context._isMounted || !vnode.isRootInsert;\n\n  if (isAppear && !appear && appear !== '') {\n    return\n  }\n\n  var startClass = isAppear && appearClass\n    ? appearClass\n    : enterClass;\n  var activeClass = isAppear && appearActiveClass\n    ? appearActiveClass\n    : enterActiveClass;\n  var toClass = isAppear && appearToClass\n    ? appearToClass\n    : enterToClass;\n\n  var beforeEnterHook = isAppear\n    ? (beforeAppear || beforeEnter)\n    : beforeEnter;\n  var enterHook = isAppear\n    ? (typeof appear === 'function' ? appear : enter)\n    : enter;\n  var afterEnterHook = isAppear\n    ? (afterAppear || afterEnter)\n    : afterEnter;\n  var enterCancelledHook = isAppear\n    ? (appearCancelled || enterCancelled)\n    : enterCancelled;\n\n  var explicitEnterDuration = toNumber(\n    isObject(duration)\n      ? duration.enter\n      : duration\n  );\n\n  if ( true && explicitEnterDuration != null) {\n    checkDuration(explicitEnterDuration, 'enter', vnode);\n  }\n\n  var expectsCSS = css !== false && !isIE9;\n  var userWantsControl = getHookArgumentsLength(enterHook);\n\n  var cb = el._enterCb = once(function () {\n    if (expectsCSS) {\n      removeTransitionClass(el, toClass);\n      removeTransitionClass(el, activeClass);\n    }\n    if (cb.cancelled) {\n      if (expectsCSS) {\n        removeTransitionClass(el, startClass);\n      }\n      enterCancelledHook && enterCancelledHook(el);\n    } else {\n      afterEnterHook && afterEnterHook(el);\n    }\n    el._enterCb = null;\n  });\n\n  if (!vnode.data.show) {\n    // remove pending leave element on enter by injecting an insert hook\n    mergeVNodeHook(vnode, 'insert', function () {\n      var parent = el.parentNode;\n      var pendingNode = parent && parent._pending && parent._pending[vnode.key];\n      if (pendingNode &&\n        pendingNode.tag === vnode.tag &&\n        pendingNode.elm._leaveCb\n      ) {\n        pendingNode.elm._leaveCb();\n      }\n      enterHook && enterHook(el, cb);\n    });\n  }\n\n  // start enter transition\n  beforeEnterHook && beforeEnterHook(el);\n  if (expectsCSS) {\n    addTransitionClass(el, startClass);\n    addTransitionClass(el, activeClass);\n    nextFrame(function () {\n      removeTransitionClass(el, startClass);\n      if (!cb.cancelled) {\n        addTransitionClass(el, toClass);\n        if (!userWantsControl) {\n          if (isValidDuration(explicitEnterDuration)) {\n            setTimeout(cb, explicitEnterDuration);\n          } else {\n            whenTransitionEnds(el, type, cb);\n          }\n        }\n      }\n    });\n  }\n\n  if (vnode.data.show) {\n    toggleDisplay && toggleDisplay();\n    enterHook && enterHook(el, cb);\n  }\n\n  if (!expectsCSS && !userWantsControl) {\n    cb();\n  }\n}\n\nfunction leave (vnode, rm) {\n  var el = vnode.elm;\n\n  // call enter callback now\n  if (isDef(el._enterCb)) {\n    el._enterCb.cancelled = true;\n    el._enterCb();\n  }\n\n  var data = resolveTransition(vnode.data.transition);\n  if (isUndef(data) || el.nodeType !== 1) {\n    return rm()\n  }\n\n  /* istanbul ignore if */\n  if (isDef(el._leaveCb)) {\n    return\n  }\n\n  var css = data.css;\n  var type = data.type;\n  var leaveClass = data.leaveClass;\n  var leaveToClass = data.leaveToClass;\n  var leaveActiveClass = data.leaveActiveClass;\n  var beforeLeave = data.beforeLeave;\n  var leave = data.leave;\n  var afterLeave = data.afterLeave;\n  var leaveCancelled = data.leaveCancelled;\n  var delayLeave = data.delayLeave;\n  var duration = data.duration;\n\n  var expectsCSS = css !== false && !isIE9;\n  var userWantsControl = getHookArgumentsLength(leave);\n\n  var explicitLeaveDuration = toNumber(\n    isObject(duration)\n      ? duration.leave\n      : duration\n  );\n\n  if ( true && isDef(explicitLeaveDuration)) {\n    checkDuration(explicitLeaveDuration, 'leave', vnode);\n  }\n\n  var cb = el._leaveCb = once(function () {\n    if (el.parentNode && el.parentNode._pending) {\n      el.parentNode._pending[vnode.key] = null;\n    }\n    if (expectsCSS) {\n      removeTransitionClass(el, leaveToClass);\n      removeTransitionClass(el, leaveActiveClass);\n    }\n    if (cb.cancelled) {\n      if (expectsCSS) {\n        removeTransitionClass(el, leaveClass);\n      }\n      leaveCancelled && leaveCancelled(el);\n    } else {\n      rm();\n      afterLeave && afterLeave(el);\n    }\n    el._leaveCb = null;\n  });\n\n  if (delayLeave) {\n    delayLeave(performLeave);\n  } else {\n    performLeave();\n  }\n\n  function performLeave () {\n    // the delayed leave may have already been cancelled\n    if (cb.cancelled) {\n      return\n    }\n    // record leaving element\n    if (!vnode.data.show && el.parentNode) {\n      (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;\n    }\n    beforeLeave && beforeLeave(el);\n    if (expectsCSS) {\n      addTransitionClass(el, leaveClass);\n      addTransitionClass(el, leaveActiveClass);\n      nextFrame(function () {\n        removeTransitionClass(el, leaveClass);\n        if (!cb.cancelled) {\n          addTransitionClass(el, leaveToClass);\n          if (!userWantsControl) {\n            if (isValidDuration(explicitLeaveDuration)) {\n              setTimeout(cb, explicitLeaveDuration);\n            } else {\n              whenTransitionEnds(el, type, cb);\n            }\n          }\n        }\n      });\n    }\n    leave && leave(el, cb);\n    if (!expectsCSS && !userWantsControl) {\n      cb();\n    }\n  }\n}\n\n// only used in dev mode\nfunction checkDuration (val, name, vnode) {\n  if (typeof val !== 'number') {\n    warn(\n      \"<transition> explicit \" + name + \" duration is not a valid number - \" +\n      \"got \" + (JSON.stringify(val)) + \".\",\n      vnode.context\n    );\n  } else if (isNaN(val)) {\n    warn(\n      \"<transition> explicit \" + name + \" duration is NaN - \" +\n      'the duration expression might be incorrect.',\n      vnode.context\n    );\n  }\n}\n\nfunction isValidDuration (val) {\n  return typeof val === 'number' && !isNaN(val)\n}\n\n/**\n * Normalize a transition hook's argument length. The hook may be:\n * - a merged hook (invoker) with the original in .fns\n * - a wrapped component method (check ._length)\n * - a plain function (.length)\n */\nfunction getHookArgumentsLength (fn) {\n  if (isUndef(fn)) {\n    return false\n  }\n  var invokerFns = fn.fns;\n  if (isDef(invokerFns)) {\n    // invoker\n    return getHookArgumentsLength(\n      Array.isArray(invokerFns)\n        ? invokerFns[0]\n        : invokerFns\n    )\n  } else {\n    return (fn._length || fn.length) > 1\n  }\n}\n\nfunction _enter (_, vnode) {\n  if (vnode.data.show !== true) {\n    enter(vnode);\n  }\n}\n\nvar transition = inBrowser ? {\n  create: _enter,\n  activate: _enter,\n  remove: function remove$$1 (vnode, rm) {\n    /* istanbul ignore else */\n    if (vnode.data.show !== true) {\n      leave(vnode, rm);\n    } else {\n      rm();\n    }\n  }\n} : {};\n\nvar platformModules = [\n  attrs,\n  klass,\n  events,\n  domProps,\n  style,\n  transition\n];\n\n/*  */\n\n// the directive module should be applied last, after all\n// built-in modules have been applied.\nvar modules = platformModules.concat(baseModules);\n\nvar patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });\n\n/**\n * Not type checking this file because flow doesn't like attaching\n * properties to Elements.\n */\n\n/* istanbul ignore if */\nif (isIE9) {\n  // http://www.matts411.com/post/internet-explorer-9-oninput/\n  document.addEventListener('selectionchange', function () {\n    var el = document.activeElement;\n    if (el && el.vmodel) {\n      trigger(el, 'input');\n    }\n  });\n}\n\nvar directive = {\n  inserted: function inserted (el, binding, vnode, oldVnode) {\n    if (vnode.tag === 'select') {\n      // #6903\n      if (oldVnode.elm && !oldVnode.elm._vOptions) {\n        mergeVNodeHook(vnode, 'postpatch', function () {\n          directive.componentUpdated(el, binding, vnode);\n        });\n      } else {\n        setSelected(el, binding, vnode.context);\n      }\n      el._vOptions = [].map.call(el.options, getValue);\n    } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {\n      el._vModifiers = binding.modifiers;\n      if (!binding.modifiers.lazy) {\n        el.addEventListener('compositionstart', onCompositionStart);\n        el.addEventListener('compositionend', onCompositionEnd);\n        // Safari < 10.2 & UIWebView doesn't fire compositionend when\n        // switching focus before confirming composition choice\n        // this also fixes the issue where some browsers e.g. iOS Chrome\n        // fires \"change\" instead of \"input\" on autocomplete.\n        el.addEventListener('change', onCompositionEnd);\n        /* istanbul ignore if */\n        if (isIE9) {\n          el.vmodel = true;\n        }\n      }\n    }\n  },\n\n  componentUpdated: function componentUpdated (el, binding, vnode) {\n    if (vnode.tag === 'select') {\n      setSelected(el, binding, vnode.context);\n      // in case the options rendered by v-for have changed,\n      // it's possible that the value is out-of-sync with the rendered options.\n      // detect such cases and filter out values that no longer has a matching\n      // option in the DOM.\n      var prevOptions = el._vOptions;\n      var curOptions = el._vOptions = [].map.call(el.options, getValue);\n      if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {\n        // trigger change event if\n        // no matching option found for at least one value\n        var needReset = el.multiple\n          ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })\n          : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);\n        if (needReset) {\n          trigger(el, 'change');\n        }\n      }\n    }\n  }\n};\n\nfunction setSelected (el, binding, vm) {\n  actuallySetSelected(el, binding, vm);\n  /* istanbul ignore if */\n  if (isIE || isEdge) {\n    setTimeout(function () {\n      actuallySetSelected(el, binding, vm);\n    }, 0);\n  }\n}\n\nfunction actuallySetSelected (el, binding, vm) {\n  var value = binding.value;\n  var isMultiple = el.multiple;\n  if (isMultiple && !Array.isArray(value)) {\n     true && warn(\n      \"<select multiple v-model=\\\"\" + (binding.expression) + \"\\\"> \" +\n      \"expects an Array value for its binding, but got \" + (Object.prototype.toString.call(value).slice(8, -1)),\n      vm\n    );\n    return\n  }\n  var selected, option;\n  for (var i = 0, l = el.options.length; i < l; i++) {\n    option = el.options[i];\n    if (isMultiple) {\n      selected = looseIndexOf(value, getValue(option)) > -1;\n      if (option.selected !== selected) {\n        option.selected = selected;\n      }\n    } else {\n      if (looseEqual(getValue(option), value)) {\n        if (el.selectedIndex !== i) {\n          el.selectedIndex = i;\n        }\n        return\n      }\n    }\n  }\n  if (!isMultiple) {\n    el.selectedIndex = -1;\n  }\n}\n\nfunction hasNoMatchingOption (value, options) {\n  return options.every(function (o) { return !looseEqual(o, value); })\n}\n\nfunction getValue (option) {\n  return '_value' in option\n    ? option._value\n    : option.value\n}\n\nfunction onCompositionStart (e) {\n  e.target.composing = true;\n}\n\nfunction onCompositionEnd (e) {\n  // prevent triggering an input event for no reason\n  if (!e.target.composing) { return }\n  e.target.composing = false;\n  trigger(e.target, 'input');\n}\n\nfunction trigger (el, type) {\n  var e = document.createEvent('HTMLEvents');\n  e.initEvent(type, true, true);\n  el.dispatchEvent(e);\n}\n\n/*  */\n\n// recursively search for possible transition defined inside the component root\nfunction locateNode (vnode) {\n  return vnode.componentInstance && (!vnode.data || !vnode.data.transition)\n    ? locateNode(vnode.componentInstance._vnode)\n    : vnode\n}\n\nvar show = {\n  bind: function bind (el, ref, vnode) {\n    var value = ref.value;\n\n    vnode = locateNode(vnode);\n    var transition$$1 = vnode.data && vnode.data.transition;\n    var originalDisplay = el.__vOriginalDisplay =\n      el.style.display === 'none' ? '' : el.style.display;\n    if (value && transition$$1) {\n      vnode.data.show = true;\n      enter(vnode, function () {\n        el.style.display = originalDisplay;\n      });\n    } else {\n      el.style.display = value ? originalDisplay : 'none';\n    }\n  },\n\n  update: function update (el, ref, vnode) {\n    var value = ref.value;\n    var oldValue = ref.oldValue;\n\n    /* istanbul ignore if */\n    if (!value === !oldValue) { return }\n    vnode = locateNode(vnode);\n    var transition$$1 = vnode.data && vnode.data.transition;\n    if (transition$$1) {\n      vnode.data.show = true;\n      if (value) {\n        enter(vnode, function () {\n          el.style.display = el.__vOriginalDisplay;\n        });\n      } else {\n        leave(vnode, function () {\n          el.style.display = 'none';\n        });\n      }\n    } else {\n      el.style.display = value ? el.__vOriginalDisplay : 'none';\n    }\n  },\n\n  unbind: function unbind (\n    el,\n    binding,\n    vnode,\n    oldVnode,\n    isDestroy\n  ) {\n    if (!isDestroy) {\n      el.style.display = el.__vOriginalDisplay;\n    }\n  }\n};\n\nvar platformDirectives = {\n  model: directive,\n  show: show\n};\n\n/*  */\n\nvar transitionProps = {\n  name: String,\n  appear: Boolean,\n  css: Boolean,\n  mode: String,\n  type: String,\n  enterClass: String,\n  leaveClass: String,\n  enterToClass: String,\n  leaveToClass: String,\n  enterActiveClass: String,\n  leaveActiveClass: String,\n  appearClass: String,\n  appearActiveClass: String,\n  appearToClass: String,\n  duration: [Number, String, Object]\n};\n\n// in case the child is also an abstract component, e.g. <keep-alive>\n// we want to recursively retrieve the real component to be rendered\nfunction getRealChild (vnode) {\n  var compOptions = vnode && vnode.componentOptions;\n  if (compOptions && compOptions.Ctor.options.abstract) {\n    return getRealChild(getFirstComponentChild(compOptions.children))\n  } else {\n    return vnode\n  }\n}\n\nfunction extractTransitionData (comp) {\n  var data = {};\n  var options = comp.$options;\n  // props\n  for (var key in options.propsData) {\n    data[key] = comp[key];\n  }\n  // events.\n  // extract listeners and pass them directly to the transition methods\n  var listeners = options._parentListeners;\n  for (var key$1 in listeners) {\n    data[camelize(key$1)] = listeners[key$1];\n  }\n  return data\n}\n\nfunction placeholder (h, rawChild) {\n  if (/\\d-keep-alive$/.test(rawChild.tag)) {\n    return h('keep-alive', {\n      props: rawChild.componentOptions.propsData\n    })\n  }\n}\n\nfunction hasParentTransition (vnode) {\n  while ((vnode = vnode.parent)) {\n    if (vnode.data.transition) {\n      return true\n    }\n  }\n}\n\nfunction isSameChild (child, oldChild) {\n  return oldChild.key === child.key && oldChild.tag === child.tag\n}\n\nvar isNotTextNode = function (c) { return c.tag || isAsyncPlaceholder(c); };\n\nvar isVShowDirective = function (d) { return d.name === 'show'; };\n\nvar Transition = {\n  name: 'transition',\n  props: transitionProps,\n  abstract: true,\n\n  render: function render (h) {\n    var this$1 = this;\n\n    var children = this.$slots.default;\n    if (!children) {\n      return\n    }\n\n    // filter out text nodes (possible whitespaces)\n    children = children.filter(isNotTextNode);\n    /* istanbul ignore if */\n    if (!children.length) {\n      return\n    }\n\n    // warn multiple elements\n    if ( true && children.length > 1) {\n      warn(\n        '<transition> can only be used on a single element. Use ' +\n        '<transition-group> for lists.',\n        this.$parent\n      );\n    }\n\n    var mode = this.mode;\n\n    // warn invalid mode\n    if ( true &&\n      mode && mode !== 'in-out' && mode !== 'out-in'\n    ) {\n      warn(\n        'invalid <transition> mode: ' + mode,\n        this.$parent\n      );\n    }\n\n    var rawChild = children[0];\n\n    // if this is a component root node and the component's\n    // parent container node also has transition, skip.\n    if (hasParentTransition(this.$vnode)) {\n      return rawChild\n    }\n\n    // apply transition data to child\n    // use getRealChild() to ignore abstract components e.g. keep-alive\n    var child = getRealChild(rawChild);\n    /* istanbul ignore if */\n    if (!child) {\n      return rawChild\n    }\n\n    if (this._leaving) {\n      return placeholder(h, rawChild)\n    }\n\n    // ensure a key that is unique to the vnode type and to this transition\n    // component instance. This key will be used to remove pending leaving nodes\n    // during entering.\n    var id = \"__transition-\" + (this._uid) + \"-\";\n    child.key = child.key == null\n      ? child.isComment\n        ? id + 'comment'\n        : id + child.tag\n      : isPrimitive(child.key)\n        ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)\n        : child.key;\n\n    var data = (child.data || (child.data = {})).transition = extractTransitionData(this);\n    var oldRawChild = this._vnode;\n    var oldChild = getRealChild(oldRawChild);\n\n    // mark v-show\n    // so that the transition module can hand over the control to the directive\n    if (child.data.directives && child.data.directives.some(isVShowDirective)) {\n      child.data.show = true;\n    }\n\n    if (\n      oldChild &&\n      oldChild.data &&\n      !isSameChild(child, oldChild) &&\n      !isAsyncPlaceholder(oldChild) &&\n      // #6687 component root is a comment node\n      !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)\n    ) {\n      // replace old child transition data with fresh one\n      // important for dynamic transitions!\n      var oldData = oldChild.data.transition = extend({}, data);\n      // handle transition mode\n      if (mode === 'out-in') {\n        // return placeholder node and queue update when leave finishes\n        this._leaving = true;\n        mergeVNodeHook(oldData, 'afterLeave', function () {\n          this$1._leaving = false;\n          this$1.$forceUpdate();\n        });\n        return placeholder(h, rawChild)\n      } else if (mode === 'in-out') {\n        if (isAsyncPlaceholder(child)) {\n          return oldRawChild\n        }\n        var delayedLeave;\n        var performLeave = function () { delayedLeave(); };\n        mergeVNodeHook(data, 'afterEnter', performLeave);\n        mergeVNodeHook(data, 'enterCancelled', performLeave);\n        mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });\n      }\n    }\n\n    return rawChild\n  }\n};\n\n/*  */\n\nvar props = extend({\n  tag: String,\n  moveClass: String\n}, transitionProps);\n\ndelete props.mode;\n\nvar TransitionGroup = {\n  props: props,\n\n  beforeMount: function beforeMount () {\n    var this$1 = this;\n\n    var update = this._update;\n    this._update = function (vnode, hydrating) {\n      var restoreActiveInstance = setActiveInstance(this$1);\n      // force removing pass\n      this$1.__patch__(\n        this$1._vnode,\n        this$1.kept,\n        false, // hydrating\n        true // removeOnly (!important, avoids unnecessary moves)\n      );\n      this$1._vnode = this$1.kept;\n      restoreActiveInstance();\n      update.call(this$1, vnode, hydrating);\n    };\n  },\n\n  render: function render (h) {\n    var tag = this.tag || this.$vnode.data.tag || 'span';\n    var map = Object.create(null);\n    var prevChildren = this.prevChildren = this.children;\n    var rawChildren = this.$slots.default || [];\n    var children = this.children = [];\n    var transitionData = extractTransitionData(this);\n\n    for (var i = 0; i < rawChildren.length; i++) {\n      var c = rawChildren[i];\n      if (c.tag) {\n        if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {\n          children.push(c);\n          map[c.key] = c\n          ;(c.data || (c.data = {})).transition = transitionData;\n        } else if (true) {\n          var opts = c.componentOptions;\n          var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;\n          warn((\"<transition-group> children must be keyed: <\" + name + \">\"));\n        }\n      }\n    }\n\n    if (prevChildren) {\n      var kept = [];\n      var removed = [];\n      for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {\n        var c$1 = prevChildren[i$1];\n        c$1.data.transition = transitionData;\n        c$1.data.pos = c$1.elm.getBoundingClientRect();\n        if (map[c$1.key]) {\n          kept.push(c$1);\n        } else {\n          removed.push(c$1);\n        }\n      }\n      this.kept = h(tag, null, kept);\n      this.removed = removed;\n    }\n\n    return h(tag, null, children)\n  },\n\n  updated: function updated () {\n    var children = this.prevChildren;\n    var moveClass = this.moveClass || ((this.name || 'v') + '-move');\n    if (!children.length || !this.hasMove(children[0].elm, moveClass)) {\n      return\n    }\n\n    // we divide the work into three loops to avoid mixing DOM reads and writes\n    // in each iteration - which helps prevent layout thrashing.\n    children.forEach(callPendingCbs);\n    children.forEach(recordPosition);\n    children.forEach(applyTranslation);\n\n    // force reflow to put everything in position\n    // assign to this to avoid being removed in tree-shaking\n    // $flow-disable-line\n    this._reflow = document.body.offsetHeight;\n\n    children.forEach(function (c) {\n      if (c.data.moved) {\n        var el = c.elm;\n        var s = el.style;\n        addTransitionClass(el, moveClass);\n        s.transform = s.WebkitTransform = s.transitionDuration = '';\n        el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {\n          if (e && e.target !== el) {\n            return\n          }\n          if (!e || /transform$/.test(e.propertyName)) {\n            el.removeEventListener(transitionEndEvent, cb);\n            el._moveCb = null;\n            removeTransitionClass(el, moveClass);\n          }\n        });\n      }\n    });\n  },\n\n  methods: {\n    hasMove: function hasMove (el, moveClass) {\n      /* istanbul ignore if */\n      if (!hasTransition) {\n        return false\n      }\n      /* istanbul ignore if */\n      if (this._hasMove) {\n        return this._hasMove\n      }\n      // Detect whether an element with the move class applied has\n      // CSS transitions. Since the element may be inside an entering\n      // transition at this very moment, we make a clone of it and remove\n      // all other transition classes applied to ensure only the move class\n      // is applied.\n      var clone = el.cloneNode();\n      if (el._transitionClasses) {\n        el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });\n      }\n      addClass(clone, moveClass);\n      clone.style.display = 'none';\n      this.$el.appendChild(clone);\n      var info = getTransitionInfo(clone);\n      this.$el.removeChild(clone);\n      return (this._hasMove = info.hasTransform)\n    }\n  }\n};\n\nfunction callPendingCbs (c) {\n  /* istanbul ignore if */\n  if (c.elm._moveCb) {\n    c.elm._moveCb();\n  }\n  /* istanbul ignore if */\n  if (c.elm._enterCb) {\n    c.elm._enterCb();\n  }\n}\n\nfunction recordPosition (c) {\n  c.data.newPos = c.elm.getBoundingClientRect();\n}\n\nfunction applyTranslation (c) {\n  var oldPos = c.data.pos;\n  var newPos = c.data.newPos;\n  var dx = oldPos.left - newPos.left;\n  var dy = oldPos.top - newPos.top;\n  if (dx || dy) {\n    c.data.moved = true;\n    var s = c.elm.style;\n    s.transform = s.WebkitTransform = \"translate(\" + dx + \"px,\" + dy + \"px)\";\n    s.transitionDuration = '0s';\n  }\n}\n\nvar platformComponents = {\n  Transition: Transition,\n  TransitionGroup: TransitionGroup\n};\n\n/*  */\n\n// install platform specific utils\nVue.config.mustUseProp = mustUseProp;\nVue.config.isReservedTag = isReservedTag;\nVue.config.isReservedAttr = isReservedAttr;\nVue.config.getTagNamespace = getTagNamespace;\nVue.config.isUnknownElement = isUnknownElement;\n\n// install platform runtime directives & components\nextend(Vue.options.directives, platformDirectives);\nextend(Vue.options.components, platformComponents);\n\n// install platform patch function\nVue.prototype.__patch__ = inBrowser ? patch : noop;\n\n// public mount method\nVue.prototype.$mount = function (\n  el,\n  hydrating\n) {\n  el = el && inBrowser ? query(el) : undefined;\n  return mountComponent(this, el, hydrating)\n};\n\n// devtools global hook\n/* istanbul ignore next */\nif (inBrowser) {\n  setTimeout(function () {\n    if (config.devtools) {\n      if (devtools) {\n        devtools.emit('init', Vue);\n      } else if (\n        true\n      ) {\n        console[console.info ? 'info' : 'log'](\n          'Download the Vue Devtools extension for a better development experience:\\n' +\n          'https://github.com/vuejs/vue-devtools'\n        );\n      }\n    }\n    if ( true &&\n      config.productionTip !== false &&\n      typeof console !== 'undefined'\n    ) {\n      console[console.info ? 'info' : 'log'](\n        \"You are running Vue in development mode.\\n\" +\n        \"Make sure to turn on production mode when deploying for production.\\n\" +\n        \"See more tips at https://vuejs.org/guide/deployment.html\"\n      );\n    }\n  }, 0);\n}\n\n/*  */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Vue);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZUAyLjYuMTBAdnVlL2Rpc3QvdnVlLnJ1bnRpbWUuZXNtLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWVAMi42LjEwQHZ1ZS9kaXN0L3Z1ZS5ydW50aW1lLmVzbS5qcz82ZTZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogVnVlLmpzIHYyLjYuMTBcbiAqIChjKSAyMDE0LTIwMTkgRXZhbiBZb3VcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuLyogICovXG5cbnZhciBlbXB0eU9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG4vLyBUaGVzZSBoZWxwZXJzIHByb2R1Y2UgYmV0dGVyIFZNIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXJcbi8vIGV4cGxpY2l0bmVzcyBhbmQgZnVuY3Rpb24gaW5saW5pbmcuXG5mdW5jdGlvbiBpc1VuZGVmICh2KSB7XG4gIHJldHVybiB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0RlZiAodikge1xuICByZXR1cm4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNUcnVlICh2KSB7XG4gIHJldHVybiB2ID09PSB0cnVlXG59XG5cbmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHtcbiAgcmV0dXJuIHYgPT09IGZhbHNlXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdmFsdWUgaXMgcHJpbWl0aXZlLlxuICovXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJ1xuICApXG59XG5cbi8qKlxuICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsXG4gKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlXG4gKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0J1xufVxuXG4vKipcbiAqIEdldCB0aGUgcmF3IHR5cGUgc3RyaW5nIG9mIGEgdmFsdWUsIGUuZy4sIFtvYmplY3QgT2JqZWN0XS5cbiAqL1xudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHRvUmF3VHlwZSAodmFsdWUpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSlcbn1cblxuLyoqXG4gKiBTdHJpY3Qgb2JqZWN0IHR5cGUgY2hlY2suIE9ubHkgcmV0dXJucyB0cnVlXG4gKiBmb3IgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nXG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwICh2KSB7XG4gIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWwgaXMgYSB2YWxpZCBhcnJheSBpbmRleC5cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkge1xuICB2YXIgbiA9IHBhcnNlRmxvYXQoU3RyaW5nKHZhbCkpO1xuICByZXR1cm4gbiA+PSAwICYmIE1hdGguZmxvb3IobikgPT09IG4gJiYgaXNGaW5pdGUodmFsKVxufVxuXG5mdW5jdGlvbiBpc1Byb21pc2UgKHZhbCkge1xuICByZXR1cm4gKFxuICAgIGlzRGVmKHZhbCkgJiZcbiAgICB0eXBlb2YgdmFsLnRoZW4gPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgdG8gYSBzdHJpbmcgdGhhdCBpcyBhY3R1YWxseSByZW5kZXJlZC5cbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkge1xuICByZXR1cm4gdmFsID09IG51bGxcbiAgICA/ICcnXG4gICAgOiBBcnJheS5pc0FycmF5KHZhbCkgfHwgKGlzUGxhaW5PYmplY3QodmFsKSAmJiB2YWwudG9TdHJpbmcgPT09IF90b1N0cmluZylcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsLCBudWxsLCAyKVxuICAgICAgOiBTdHJpbmcodmFsKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gaW5wdXQgdmFsdWUgdG8gYSBudW1iZXIgZm9yIHBlcnNpc3RlbmNlLlxuICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyICh2YWwpIHtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG5cbn1cblxuLyoqXG4gKiBNYWtlIGEgbWFwIGFuZCByZXR1cm4gYSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYSBrZXlcbiAqIGlzIGluIHRoYXQgbWFwLlxuICovXG5mdW5jdGlvbiBtYWtlTWFwIChcbiAgc3RyLFxuICBleHBlY3RzTG93ZXJDYXNlXG4pIHtcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBsaXN0ID0gc3RyLnNwbGl0KCcsJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2VcbiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH1cbiAgICA6IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWxdOyB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB0YWcgaXMgYSBidWlsdC1pbiB0YWcuXG4gKi9cbnZhciBpc0J1aWx0SW5UYWcgPSBtYWtlTWFwKCdzbG90LGNvbXBvbmVudCcsIHRydWUpO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZS5cbiAqL1xudmFyIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUgPSBtYWtlTWFwKCdrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcycpO1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZSAoYXJyLCBpdGVtKSB7XG4gIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJldHVybiBhcnIuc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkuXG4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBoYXNPd24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICB2YXIgaGl0ID0gY2FjaGVbc3RyXTtcbiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxpbWl0ZWQgc3RyaW5nLlxuICovXG52YXIgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykgeyByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnOyB9KVxufSk7XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBhIHN0cmluZy5cbiAqL1xudmFyIGNhcGl0YWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpXG59KTtcblxuLyoqXG4gKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLlxuICovXG52YXIgaHlwaGVuYXRlUkUgPSAvXFxCKFtBLVpdKS9nO1xudmFyIGh5cGhlbmF0ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShoeXBoZW5hdGVSRSwgJy0kMScpLnRvTG93ZXJDYXNlKClcbn0pO1xuXG4vKipcbiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdCxcbiAqIGUuZy4sIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5LCB3ZSBkb24ndCBuZWVkIHRoaXMgYW55bW9yZVxuICogc2luY2UgbmF0aXZlIGJpbmQgaXMgbm93IHBlcmZvcm1hbnQgZW5vdWdoIGluIG1vc3QgYnJvd3NlcnMuXG4gKiBCdXQgcmVtb3ZpbmcgaXQgd291bGQgbWVhbiBicmVha2luZyBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluXG4gKiBQaGFudG9tSlMgMS54LCBzbyB0aGlzIG11c3QgYmUga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gcG9seWZpbGxCaW5kIChmbiwgY3R4KSB7XG4gIGZ1bmN0aW9uIGJvdW5kRm4gKGEpIHtcbiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cblxuICBib3VuZEZuLl9sZW5ndGggPSBmbi5sZW5ndGg7XG4gIHJldHVybiBib3VuZEZuXG59XG5cbmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY3R4KVxufVxuXG52YXIgYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gID8gbmF0aXZlQmluZFxuICA6IHBvbHlmaWxsQmluZDtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS5cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSAobGlzdCwgc3RhcnQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICB2YXIgaSA9IGxpc3QubGVuZ3RoIC0gc3RhcnQ7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0pIHtcbiAgICByZXRbaV0gPSBsaXN0W2kgKyBzdGFydF07XG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG4vKipcbiAqIE1peCBwcm9wZXJ0aWVzIGludG8gdGFyZ2V0IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIF9mcm9tKSB7XG4gICAgdG9ba2V5XSA9IF9mcm9tW2tleV07XG4gIH1cbiAgcmV0dXJuIHRvXG59XG5cbi8qKlxuICogTWVyZ2UgYW4gQXJyYXkgb2YgT2JqZWN0cyBpbnRvIGEgc2luZ2xlIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gdG9PYmplY3QgKGFycikge1xuICB2YXIgcmVzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFycltpXSkge1xuICAgICAgZXh0ZW5kKHJlcywgYXJyW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4vKipcbiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLlxuICogU3R1YmJpbmcgYXJncyB0byBtYWtlIEZsb3cgaGFwcHkgd2l0aG91dCBsZWF2aW5nIHVzZWxlc3MgdHJhbnNwaWxlZCBjb2RlXG4gKiB3aXRoIC4uLnJlc3QgKGh0dHBzOi8vZmxvdy5vcmcvYmxvZy8yMDE3LzA1LzA3L1N0cmljdC1GdW5jdGlvbi1DYWxsLUFyaXR5LykuXG4gKi9cbmZ1bmN0aW9uIG5vb3AgKGEsIGIsIGMpIHt9XG5cbi8qKlxuICogQWx3YXlzIHJldHVybiBmYWxzZS5cbiAqL1xudmFyIG5vID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsgcmV0dXJuIGZhbHNlOyB9O1xuXG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbi8qKlxuICogUmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiAoXykgeyByZXR1cm4gXzsgfTtcblxuLyoqXG4gKiBDaGVjayBpZiB0d28gdmFsdWVzIGFyZSBsb29zZWx5IGVxdWFsIC0gdGhhdCBpcyxcbiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT9cbiAqL1xuZnVuY3Rpb24gbG9vc2VFcXVhbCAoYSwgYikge1xuICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9XG4gIHZhciBpc09iamVjdEEgPSBpc09iamVjdChhKTtcbiAgdmFyIGlzT2JqZWN0QiA9IGlzT2JqZWN0KGIpO1xuICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0Qikge1xuICAgIHRyeSB7XG4gICAgICB2YXIgaXNBcnJheUEgPSBBcnJheS5pc0FycmF5KGEpO1xuICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTtcbiAgICAgIGlmIChpc0FycmF5QSAmJiBpc0FycmF5Qikge1xuICAgICAgICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpXG4gICAgICB9IGVsc2UgaWYgKCFpc0FycmF5QSAmJiAhaXNBcnJheUIpIHtcbiAgICAgICAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga2V5c0EubGVuZ3RoID09PSBrZXlzQi5sZW5ndGggJiYga2V5c0EuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBsb29zZWx5IGVxdWFsIHZhbHVlIGNhbiBiZVxuICogZm91bmQgaW4gdGhlIGFycmF5IChpZiB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdCwgdGhlIGFycmF5IG11c3RcbiAqIGNvbnRhaW4gYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHNoYXBlKSwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobG9vc2VFcXVhbChhcnJbaV0sIHZhbCkpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIEVuc3VyZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UuXG4gKi9cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBTU1JfQVRUUiA9ICdkYXRhLXNlcnZlci1yZW5kZXJlZCc7XG5cbnZhciBBU1NFVF9UWVBFUyA9IFtcbiAgJ2NvbXBvbmVudCcsXG4gICdkaXJlY3RpdmUnLFxuICAnZmlsdGVyJ1xuXTtcblxudmFyIExJRkVDWUNMRV9IT09LUyA9IFtcbiAgJ2JlZm9yZUNyZWF0ZScsXG4gICdjcmVhdGVkJyxcbiAgJ2JlZm9yZU1vdW50JyxcbiAgJ21vdW50ZWQnLFxuICAnYmVmb3JlVXBkYXRlJyxcbiAgJ3VwZGF0ZWQnLFxuICAnYmVmb3JlRGVzdHJveScsXG4gICdkZXN0cm95ZWQnLFxuICAnYWN0aXZhdGVkJyxcbiAgJ2RlYWN0aXZhdGVkJyxcbiAgJ2Vycm9yQ2FwdHVyZWQnLFxuICAnc2VydmVyUHJlZmV0Y2gnXG5dO1xuXG4vKiAgKi9cblxuXG5cbnZhciBjb25maWcgPSAoe1xuICAvKipcbiAgICogT3B0aW9uIG1lcmdlIHN0cmF0ZWdpZXMgKHVzZWQgaW4gY29yZS91dGlsL29wdGlvbnMpXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN1cHByZXNzIHdhcm5pbmdzLlxuICAgKi9cbiAgc2lsZW50OiBmYWxzZSxcblxuICAvKipcbiAgICogU2hvdyBwcm9kdWN0aW9uIG1vZGUgdGlwIG1lc3NhZ2Ugb24gYm9vdD9cbiAgICovXG4gIHByb2R1Y3Rpb25UaXA6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGRldnRvb2xzXG4gICAqL1xuICBkZXZ0b29sczogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byByZWNvcmQgcGVyZlxuICAgKi9cbiAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9yc1xuICAgKi9cbiAgZXJyb3JIYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBXYXJuIGhhbmRsZXIgZm9yIHdhdGNoZXIgd2FybnNcbiAgICovXG4gIHdhcm5IYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBJZ25vcmUgY2VydGFpbiBjdXN0b20gZWxlbWVudHNcbiAgICovXG4gIGlnbm9yZWRFbGVtZW50czogW10sXG5cbiAgLyoqXG4gICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYVxuICAgKiBjb21wb25lbnQuIFRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50IGFuZCBtYXkgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBpc1Jlc2VydmVkVGFnOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnRcbiAgICogcHJvcC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIGlzUmVzZXJ2ZWRBdHRyOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LlxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBpc1Vua25vd25FbGVtZW50OiBubyxcblxuICAvKipcbiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudFxuICAgKi9cbiAgZ2V0VGFnTmFtZXNwYWNlOiBub29wLFxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgcmVhbCB0YWcgbmFtZSBmb3IgdGhlIHNwZWNpZmljIHBsYXRmb3JtLlxuICAgKi9cbiAgcGFyc2VQbGF0Zm9ybVRhZ05hbWU6IGlkZW50aXR5LFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbXVzdCBiZSBib3VuZCB1c2luZyBwcm9wZXJ0eSwgZS5nLiB2YWx1ZVxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBtdXN0VXNlUHJvcDogbm8sXG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdXBkYXRlcyBhc3luY2hyb25vdXNseS4gSW50ZW5kZWQgdG8gYmUgdXNlZCBieSBWdWUgVGVzdCBVdGlsc1xuICAgKiBUaGlzIHdpbGwgc2lnbmlmaWNhbnRseSByZWR1Y2UgcGVyZm9ybWFuY2UgaWYgc2V0IHRvIGZhbHNlLlxuICAgKi9cbiAgYXN5bmM6IHRydWUsXG5cbiAgLyoqXG4gICAqIEV4cG9zZWQgZm9yIGxlZ2FjeSByZWFzb25zXG4gICAqL1xuICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LU1xufSk7XG5cbi8qICAqL1xuXG4vKipcbiAqIHVuaWNvZGUgbGV0dGVycyB1c2VkIGZvciBwYXJzaW5nIGh0bWwgdGFncywgY29tcG9uZW50IG5hbWVzIGFuZCBwcm9wZXJ0eSBwYXRocy5cbiAqIHVzaW5nIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTMvc2VtYW50aWNzLXNjcmlwdGluZy5odG1sI3BvdGVudGlhbGN1c3RvbWVsZW1lbnRuYW1lXG4gKiBza2lwcGluZyBcXHUxMDAwMC1cXHVFRkZGRiBkdWUgdG8gaXQgZnJlZXppbmcgdXAgUGhhbnRvbUpTXG4gKi9cbnZhciB1bmljb2RlUmVnRXhwID0gL2EtekEtWlxcdTAwQjdcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDNGLVxcdTIwNDBcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQvO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICQgb3IgX1xuICovXG5mdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHtcbiAgdmFyIGMgPSAoc3RyICsgJycpLmNoYXJDb2RlQXQoMCk7XG4gIHJldHVybiBjID09PSAweDI0IHx8IGMgPT09IDB4NUZcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZGVmIChvYmosIGtleSwgdmFsLCBlbnVtZXJhYmxlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIHZhbHVlOiB2YWwsXG4gICAgZW51bWVyYWJsZTogISFlbnVtZXJhYmxlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBzaW1wbGUgcGF0aC5cbiAqL1xudmFyIGJhaWxSRSA9IG5ldyBSZWdFeHAoKFwiW15cIiArICh1bmljb2RlUmVnRXhwLnNvdXJjZSkgKyBcIi4kX1xcXFxkXVwiKSk7XG5mdW5jdGlvbiBwYXJzZVBhdGggKHBhdGgpIHtcbiAgaWYgKGJhaWxSRS50ZXN0KHBhdGgpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghb2JqKSB7IHJldHVybiB9XG4gICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cbn1cblxuLyogICovXG5cbi8vIGNhbiB3ZSB1c2UgX19wcm90b19fP1xudmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307XG5cbi8vIEJyb3dzZXIgZW52aXJvbm1lbnQgc25pZmZpbmdcbnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbnZhciBpbldlZXggPSB0eXBlb2YgV1hFbnZpcm9ubWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgISFXWEVudmlyb25tZW50LnBsYXRmb3JtO1xudmFyIHdlZXhQbGF0Zm9ybSA9IGluV2VleCAmJiBXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7XG52YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbnZhciBpc0lFID0gVUEgJiYgL21zaWV8dHJpZGVudC8udGVzdChVQSk7XG52YXIgaXNJRTkgPSBVQSAmJiBVQS5pbmRleE9mKCdtc2llIDkuMCcpID4gMDtcbnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDtcbnZhciBpc0FuZHJvaWQgPSAoVUEgJiYgVUEuaW5kZXhPZignYW5kcm9pZCcpID4gMCkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKTtcbnZhciBpc0lPUyA9IChVQSAmJiAvaXBob25lfGlwYWR8aXBvZHxpb3MvLnRlc3QoVUEpKSB8fCAod2VleFBsYXRmb3JtID09PSAnaW9zJyk7XG52YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXFwvXFxkKy8udGVzdChVQSkgJiYgIWlzRWRnZTtcbnZhciBpc1BoYW50b21KUyA9IFVBICYmIC9waGFudG9tanMvLnRlc3QoVUEpO1xudmFyIGlzRkYgPSBVQSAmJiBVQS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pO1xuXG4vLyBGaXJlZm94IGhhcyBhIFwid2F0Y2hcIiBmdW5jdGlvbiBvbiBPYmplY3QucHJvdG90eXBlLi4uXG52YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoO1xuXG52YXIgc3VwcG9ydHNQYXNzaXZlID0gZmFsc2U7XG5pZiAoaW5Ccm93c2VyKSB7XG4gIHRyeSB7XG4gICAgdmFyIG9wdHMgPSB7fTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoe1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzI4NVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuLy8gdGhpcyBuZWVkcyB0byBiZSBsYXp5LWV2YWxlZCBiZWNhdXNlIHZ1ZSBtYXkgYmUgcmVxdWlyZWQgYmVmb3JlXG4vLyB2dWUtc2VydmVyLXJlbmRlcmVyIGNhbiBzZXQgVlVFX0VOVlxudmFyIF9pc1NlcnZlcjtcbnZhciBpc1NlcnZlclJlbmRlcmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKF9pc1NlcnZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFpbkJyb3dzZXIgJiYgIWluV2VleCAmJiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gZGV0ZWN0IHByZXNlbmNlIG9mIHZ1ZS1zZXJ2ZXItcmVuZGVyZXIgYW5kIGF2b2lkXG4gICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzXG4gICAgICBfaXNTZXJ2ZXIgPSBnbG9iYWxbJ3Byb2Nlc3MnXSAmJiBnbG9iYWxbJ3Byb2Nlc3MnXS5lbnYuVlVFX0VOViA9PT0gJ3NlcnZlcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9pc1NlcnZlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2lzU2VydmVyXG59O1xuXG4vLyBkZXRlY3QgZGV2dG9vbHNcbnZhciBkZXZ0b29scyA9IGluQnJvd3NlciAmJiB3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGlzTmF0aXZlIChDdG9yKSB7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoQ3Rvci50b1N0cmluZygpKVxufVxuXG52YXIgaGFzU3ltYm9sID1cbiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJlxuICB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUmVmbGVjdC5vd25LZXlzKTtcblxudmFyIF9TZXQ7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8gLy8gJGZsb3ctZGlzYWJsZS1saW5lXG5pZiAodHlwZW9mIFNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU2V0KSkge1xuICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS5cbiAgX1NldCA9IFNldDtcbn0gZWxzZSB7XG4gIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy5cbiAgX1NldCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNldCAoKSB7XG4gICAgICB0aGlzLnNldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldFtrZXldID09PSB0cnVlXG4gICAgfTtcbiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7XG4gICAgICB0aGlzLnNldFtrZXldID0gdHJ1ZTtcbiAgICB9O1xuICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7XG4gICAgICB0aGlzLnNldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfTtcblxuICAgIHJldHVybiBTZXQ7XG4gIH0oKSk7XG59XG5cbi8qICAqL1xuXG52YXIgd2FybiA9IG5vb3A7XG52YXIgdGlwID0gbm9vcDtcbnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrXG52YXIgZm9ybWF0Q29tcG9uZW50TmFtZSA9IChub29wKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGhhc0NvbnNvbGUgPSB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCc7XG4gIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXFx3KS9nO1xuICB2YXIgY2xhc3NpZnkgPSBmdW5jdGlvbiAoc3RyKSB7IHJldHVybiBzdHJcbiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KVxuICAgIC5yZXBsYWNlKC9bLV9dL2csICcnKTsgfTtcblxuICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHtcbiAgICB2YXIgdHJhY2UgPSB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJyc7XG5cbiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7XG4gICAgICBjb25maWcud2FybkhhbmRsZXIuY2FsbChudWxsLCBtc2csIHZtLCB0cmFjZSk7XG4gICAgfSBlbHNlIGlmIChoYXNDb25zb2xlICYmICghY29uZmlnLnNpbGVudCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW1Z1ZSB3YXJuXTogXCIgKyBtc2cgKyB0cmFjZSkpO1xuICAgIH1cbiAgfTtcblxuICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkge1xuICAgIGlmIChoYXNDb25zb2xlICYmICghY29uZmlnLnNpbGVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIltWdWUgdGlwXTogXCIgKyBtc2cgKyAoXG4gICAgICAgIHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJ1xuICAgICAgKSk7XG4gICAgfVxuICB9O1xuXG4gIGZvcm1hdENvbXBvbmVudE5hbWUgPSBmdW5jdGlvbiAodm0sIGluY2x1ZGVGaWxlKSB7XG4gICAgaWYgKHZtLiRyb290ID09PSB2bSkge1xuICAgICAgcmV0dXJuICc8Um9vdD4nXG4gICAgfVxuICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHZtID09PSAnZnVuY3Rpb24nICYmIHZtLmNpZCAhPSBudWxsXG4gICAgICA/IHZtLm9wdGlvbnNcbiAgICAgIDogdm0uX2lzVnVlXG4gICAgICAgID8gdm0uJG9wdGlvbnMgfHwgdm0uY29uc3RydWN0b3Iub3B0aW9uc1xuICAgICAgICA6IHZtO1xuICAgIHZhciBuYW1lID0gb3B0aW9ucy5uYW1lIHx8IG9wdGlvbnMuX2NvbXBvbmVudFRhZztcbiAgICB2YXIgZmlsZSA9IG9wdGlvbnMuX19maWxlO1xuICAgIGlmICghbmFtZSAmJiBmaWxlKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBmaWxlLm1hdGNoKC8oW14vXFxcXF0rKVxcLnZ1ZSQvKTtcbiAgICAgIG5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgKG5hbWUgPyAoXCI8XCIgKyAoY2xhc3NpZnkobmFtZSkpICsgXCI+XCIpIDogXCI8QW5vbnltb3VzPlwiKSArXG4gICAgICAoZmlsZSAmJiBpbmNsdWRlRmlsZSAhPT0gZmFsc2UgPyAoXCIgYXQgXCIgKyBmaWxlKSA6ICcnKVxuICAgIClcbiAgfTtcblxuICB2YXIgcmVwZWF0ID0gZnVuY3Rpb24gKHN0ciwgbikge1xuICAgIHZhciByZXMgPSAnJztcbiAgICB3aGlsZSAobikge1xuICAgICAgaWYgKG4gJSAyID09PSAxKSB7IHJlcyArPSBzdHI7IH1cbiAgICAgIGlmIChuID4gMSkgeyBzdHIgKz0gc3RyOyB9XG4gICAgICBuID4+PSAxO1xuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH07XG5cbiAgZ2VuZXJhdGVDb21wb25lbnRUcmFjZSA9IGZ1bmN0aW9uICh2bSkge1xuICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkge1xuICAgICAgdmFyIHRyZWUgPSBbXTtcbiAgICAgIHZhciBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPSAwO1xuICAgICAgd2hpbGUgKHZtKSB7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgbGFzdCA9IHRyZWVbdHJlZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSsrO1xuICAgICAgICAgICAgdm0gPSB2bS4kcGFyZW50O1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA+IDApIHtcbiAgICAgICAgICAgIHRyZWVbdHJlZS5sZW5ndGggLSAxXSA9IFtsYXN0LCBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2VdO1xuICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJlZS5wdXNoKHZtKTtcbiAgICAgICAgdm0gPSB2bS4kcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuICdcXG5cXG5mb3VuZCBpblxcblxcbicgKyB0cmVlXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHZtLCBpKSB7IHJldHVybiAoXCJcIiArIChpID09PSAwID8gJy0tLT4gJyA6IHJlcGVhdCgnICcsIDUgKyBpICogMikpICsgKEFycmF5LmlzQXJyYXkodm0pXG4gICAgICAgICAgICA/ICgoZm9ybWF0Q29tcG9uZW50TmFtZSh2bVswXSkpICsgXCIuLi4gKFwiICsgKHZtWzFdKSArIFwiIHJlY3Vyc2l2ZSBjYWxscylcIilcbiAgICAgICAgICAgIDogZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpKTsgfSlcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoXCJcXG5cXG4oZm91bmQgaW4gXCIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgXCIpXCIpXG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIHVpZCA9IDA7XG5cbi8qKlxuICogQSBkZXAgaXMgYW4gb2JzZXJ2YWJsZSB0aGF0IGNhbiBoYXZlIG11bHRpcGxlXG4gKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LlxuICovXG52YXIgRGVwID0gZnVuY3Rpb24gRGVwICgpIHtcbiAgdGhpcy5pZCA9IHVpZCsrO1xuICB0aGlzLnN1YnMgPSBbXTtcbn07XG5cbkRlcC5wcm90b3R5cGUuYWRkU3ViID0gZnVuY3Rpb24gYWRkU3ViIChzdWIpIHtcbiAgdGhpcy5zdWJzLnB1c2goc3ViKTtcbn07XG5cbkRlcC5wcm90b3R5cGUucmVtb3ZlU3ViID0gZnVuY3Rpb24gcmVtb3ZlU3ViIChzdWIpIHtcbiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTtcbn07XG5cbkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgaWYgKERlcC50YXJnZXQpIHtcbiAgICBEZXAudGFyZ2V0LmFkZERlcCh0aGlzKTtcbiAgfVxufTtcblxuRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkge1xuICAvLyBzdGFiaWxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICB2YXIgc3VicyA9IHRoaXMuc3Vicy5zbGljZSgpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhY29uZmlnLmFzeW5jKSB7XG4gICAgLy8gc3VicyBhcmVuJ3Qgc29ydGVkIGluIHNjaGVkdWxlciBpZiBub3QgcnVubmluZyBhc3luY1xuICAgIC8vIHdlIG5lZWQgdG8gc29ydCB0aGVtIG5vdyB0byBtYWtlIHN1cmUgdGhleSBmaXJlIGluIGNvcnJlY3RcbiAgICAvLyBvcmRlclxuICAgIHN1YnMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5pZCAtIGIuaWQ7IH0pO1xuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsID0gc3Vicy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBzdWJzW2ldLnVwZGF0ZSgpO1xuICB9XG59O1xuXG4vLyBUaGUgY3VycmVudCB0YXJnZXQgd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQuXG4vLyBUaGlzIGlzIGdsb2JhbGx5IHVuaXF1ZSBiZWNhdXNlIG9ubHkgb25lIHdhdGNoZXJcbi8vIGNhbiBiZSBldmFsdWF0ZWQgYXQgYSB0aW1lLlxuRGVwLnRhcmdldCA9IG51bGw7XG52YXIgdGFyZ2V0U3RhY2sgPSBbXTtcblxuZnVuY3Rpb24gcHVzaFRhcmdldCAodGFyZ2V0KSB7XG4gIHRhcmdldFN0YWNrLnB1c2godGFyZ2V0KTtcbiAgRGVwLnRhcmdldCA9IHRhcmdldDtcbn1cblxuZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHtcbiAgdGFyZ2V0U3RhY2sucG9wKCk7XG4gIERlcC50YXJnZXQgPSB0YXJnZXRTdGFja1t0YXJnZXRTdGFjay5sZW5ndGggLSAxXTtcbn1cblxuLyogICovXG5cbnZhciBWTm9kZSA9IGZ1bmN0aW9uIFZOb2RlIChcbiAgdGFnLFxuICBkYXRhLFxuICBjaGlsZHJlbixcbiAgdGV4dCxcbiAgZWxtLFxuICBjb250ZXh0LFxuICBjb21wb25lbnRPcHRpb25zLFxuICBhc3luY0ZhY3Rvcnlcbikge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB0aGlzLnRleHQgPSB0ZXh0O1xuICB0aGlzLmVsbSA9IGVsbTtcbiAgdGhpcy5ucyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7XG4gIHRoaXMuZm5PcHRpb25zID0gdW5kZWZpbmVkO1xuICB0aGlzLmZuU2NvcGVJZCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5O1xuICB0aGlzLmNvbXBvbmVudE9wdGlvbnMgPSBjb21wb25lbnRPcHRpb25zO1xuICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5yYXcgPSBmYWxzZTtcbiAgdGhpcy5pc1N0YXRpYyA9IGZhbHNlO1xuICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7XG4gIHRoaXMuaXNDb21tZW50ID0gZmFsc2U7XG4gIHRoaXMuaXNDbG9uZWQgPSBmYWxzZTtcbiAgdGhpcy5pc09uY2UgPSBmYWxzZTtcbiAgdGhpcy5hc3luY0ZhY3RvcnkgPSBhc3luY0ZhY3Rvcnk7XG4gIHRoaXMuYXN5bmNNZXRhID0gdW5kZWZpbmVkO1xuICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlO1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLy8gREVQUkVDQVRFRDogYWxpYXMgZm9yIGNvbXBvbmVudEluc3RhbmNlIGZvciBiYWNrd2FyZHMgY29tcGF0LlxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5jaGlsZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlXG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVk5vZGUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxudmFyIGNyZWF0ZUVtcHR5Vk5vZGUgPSBmdW5jdGlvbiAodGV4dCkge1xuICBpZiAoIHRleHQgPT09IHZvaWQgMCApIHRleHQgPSAnJztcblxuICB2YXIgbm9kZSA9IG5ldyBWTm9kZSgpO1xuICBub2RlLnRleHQgPSB0ZXh0O1xuICBub2RlLmlzQ29tbWVudCA9IHRydWU7XG4gIHJldHVybiBub2RlXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUZXh0Vk5vZGUgKHZhbCkge1xuICByZXR1cm4gbmV3IFZOb2RlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFN0cmluZyh2YWwpKVxufVxuXG4vLyBvcHRpbWl6ZWQgc2hhbGxvdyBjbG9uZVxuLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zc1xuLy8gbXVsdGlwbGUgcmVuZGVycywgY2xvbmluZyB0aGVtIGF2b2lkcyBlcnJvcnMgd2hlbiBET00gbWFuaXB1bGF0aW9ucyByZWx5XG4vLyBvbiB0aGVpciBlbG0gcmVmZXJlbmNlLlxuZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHtcbiAgdmFyIGNsb25lZCA9IG5ldyBWTm9kZShcbiAgICB2bm9kZS50YWcsXG4gICAgdm5vZGUuZGF0YSxcbiAgICAvLyAjNzk3NVxuICAgIC8vIGNsb25lIGNoaWxkcmVuIGFycmF5IHRvIGF2b2lkIG11dGF0aW5nIG9yaWdpbmFsIGluIGNhc2Ugb2YgY2xvbmluZ1xuICAgIC8vIGEgY2hpbGQuXG4gICAgdm5vZGUuY2hpbGRyZW4gJiYgdm5vZGUuY2hpbGRyZW4uc2xpY2UoKSxcbiAgICB2bm9kZS50ZXh0LFxuICAgIHZub2RlLmVsbSxcbiAgICB2bm9kZS5jb250ZXh0LFxuICAgIHZub2RlLmNvbXBvbmVudE9wdGlvbnMsXG4gICAgdm5vZGUuYXN5bmNGYWN0b3J5XG4gICk7XG4gIGNsb25lZC5ucyA9IHZub2RlLm5zO1xuICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYztcbiAgY2xvbmVkLmtleSA9IHZub2RlLmtleTtcbiAgY2xvbmVkLmlzQ29tbWVudCA9IHZub2RlLmlzQ29tbWVudDtcbiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDtcbiAgY2xvbmVkLmZuT3B0aW9ucyA9IHZub2RlLmZuT3B0aW9ucztcbiAgY2xvbmVkLmZuU2NvcGVJZCA9IHZub2RlLmZuU2NvcGVJZDtcbiAgY2xvbmVkLmFzeW5jTWV0YSA9IHZub2RlLmFzeW5jTWV0YTtcbiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTtcbiAgcmV0dXJuIGNsb25lZFxufVxuXG4vKlxuICogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoXG4gKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGVcbiAqL1xuXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcbnZhciBhcnJheU1ldGhvZHMgPSBPYmplY3QuY3JlYXRlKGFycmF5UHJvdG8pO1xuXG52YXIgbWV0aG9kc1RvUGF0Y2ggPSBbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnXG5dO1xuXG4vKipcbiAqIEludGVyY2VwdCBtdXRhdGluZyBtZXRob2RzIGFuZCBlbWl0IGV2ZW50c1xuICovXG5tZXRob2RzVG9QYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgLy8gY2FjaGUgb3JpZ2luYWwgbWV0aG9kXG4gIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTtcbiAgZGVmKGFycmF5TWV0aG9kcywgbWV0aG9kLCBmdW5jdGlvbiBtdXRhdG9yICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICB2YXIgcmVzdWx0ID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgdmFyIG9iID0gdGhpcy5fX29iX187XG4gICAgdmFyIGluc2VydGVkO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdwdXNoJzpcbiAgICAgIGNhc2UgJ3Vuc2hpZnQnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3M7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdzcGxpY2UnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3Muc2xpY2UoMik7XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIGlmIChpbnNlcnRlZCkgeyBvYi5vYnNlcnZlQXJyYXkoaW5zZXJ0ZWQpOyB9XG4gICAgLy8gbm90aWZ5IGNoYW5nZVxuICAgIG9iLmRlcC5ub3RpZnkoKTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pO1xufSk7XG5cbi8qICAqL1xuXG52YXIgYXJyYXlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJyYXlNZXRob2RzKTtcblxuLyoqXG4gKiBJbiBzb21lIGNhc2VzIHdlIG1heSB3YW50IHRvIGRpc2FibGUgb2JzZXJ2YXRpb24gaW5zaWRlIGEgY29tcG9uZW50J3NcbiAqIHVwZGF0ZSBjb21wdXRhdGlvbi5cbiAqL1xudmFyIHNob3VsZE9ic2VydmUgPSB0cnVlO1xuXG5mdW5jdGlvbiB0b2dnbGVPYnNlcnZpbmcgKHZhbHVlKSB7XG4gIHNob3VsZE9ic2VydmUgPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRoZSB0YXJnZXRcbiAqIG9iamVjdCdzIHByb3BlcnR5IGtleXMgaW50byBnZXR0ZXIvc2V0dGVycyB0aGF0XG4gKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy5cbiAqL1xudmFyIE9ic2VydmVyID0gZnVuY3Rpb24gT2JzZXJ2ZXIgKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgdGhpcy5kZXAgPSBuZXcgRGVwKCk7XG4gIHRoaXMudm1Db3VudCA9IDA7XG4gIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAoaGFzUHJvdG8pIHtcbiAgICAgIHByb3RvQXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29weUF1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcywgYXJyYXlLZXlzKTtcbiAgICB9XG4gICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMud2Fsayh2YWx1ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FsayB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGFuZCBjb252ZXJ0IHRoZW0gaW50b1xuICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuXG4gKiB2YWx1ZSB0eXBlIGlzIE9iamVjdC5cbiAqL1xuT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMShvYmosIGtleXNbaV0pO1xuICB9XG59O1xuXG4vKipcbiAqIE9ic2VydmUgYSBsaXN0IG9mIEFycmF5IGl0ZW1zLlxuICovXG5PYnNlcnZlci5wcm90b3R5cGUub2JzZXJ2ZUFycmF5ID0gZnVuY3Rpb24gb2JzZXJ2ZUFycmF5IChpdGVtcykge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG9ic2VydmUoaXRlbXNbaV0pO1xuICB9XG59O1xuXG4vLyBoZWxwZXJzXG5cbi8qKlxuICogQXVnbWVudCBhIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nXG4gKiB0aGUgcHJvdG90eXBlIGNoYWluIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG4gIHRhcmdldC5fX3Byb3RvX18gPSBzcmM7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGEgdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZ1xuICogaGlkZGVuIHByb3BlcnRpZXMuXG4gKi9cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBjb3B5QXVnbWVudCAodGFyZ2V0LCBzcmMsIGtleXMpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGRlZih0YXJnZXQsIGtleSwgc3JjW2tleV0pO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgaWYgc3VjY2Vzc2Z1bGx5IG9ic2VydmVkLFxuICogb3IgdGhlIGV4aXN0aW5nIG9ic2VydmVyIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGhhcyBvbmUuXG4gKi9cbmZ1bmN0aW9uIG9ic2VydmUgKHZhbHVlLCBhc1Jvb3REYXRhKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgb2I7XG4gIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikge1xuICAgIG9iID0gdmFsdWUuX19vYl9fO1xuICB9IGVsc2UgaWYgKFxuICAgIHNob3VsZE9ic2VydmUgJiZcbiAgICAhaXNTZXJ2ZXJSZW5kZXJpbmcoKSAmJlxuICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSkgJiZcbiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJlxuICAgICF2YWx1ZS5faXNWdWVcbiAgKSB7XG4gICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpO1xuICB9XG4gIGlmIChhc1Jvb3REYXRhICYmIG9iKSB7XG4gICAgb2Iudm1Db3VudCsrO1xuICB9XG4gIHJldHVybiBvYlxufVxuXG4vKipcbiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUkJDEgKFxuICBvYmosXG4gIGtleSxcbiAgdmFsLFxuICBjdXN0b21TZXR0ZXIsXG4gIHNoYWxsb3dcbikge1xuICB2YXIgZGVwID0gbmV3IERlcCgpO1xuXG4gIHZhciBwcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpO1xuICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzXG4gIHZhciBnZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5nZXQ7XG4gIHZhciBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXQ7XG4gIGlmICgoIWdldHRlciB8fCBzZXR0ZXIpICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICB2YWwgPSBvYmpba2V5XTtcbiAgfVxuXG4gIHZhciBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZSh2YWwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7XG4gICAgICBpZiAoRGVwLnRhcmdldCkge1xuICAgICAgICBkZXAuZGVwZW5kKCk7XG4gICAgICAgIGlmIChjaGlsZE9iKSB7XG4gICAgICAgICAgY2hpbGRPYi5kZXAuZGVwZW5kKCk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBkZXBlbmRBcnJheSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gcmVhY3RpdmVTZXR0ZXIgKG5ld1ZhbCkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUgfHwgKG5ld1ZhbCAhPT0gbmV3VmFsICYmIHZhbHVlICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7XG4gICAgICAgIGN1c3RvbVNldHRlcigpO1xuICAgICAgfVxuICAgICAgLy8gIzc5ODE6IGZvciBhY2Nlc3NvciBwcm9wZXJ0aWVzIHdpdGhvdXQgc2V0dGVyXG4gICAgICBpZiAoZ2V0dGVyICYmICFzZXR0ZXIpIHsgcmV0dXJuIH1cbiAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgc2V0dGVyLmNhbGwob2JqLCBuZXdWYWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gbmV3VmFsO1xuICAgICAgfVxuICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTtcbiAgICAgIGRlcC5ub3RpZnkoKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFNldCBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gQWRkcyB0aGUgbmV3IHByb3BlcnR5IGFuZFxuICogdHJpZ2dlcnMgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiB0aGUgcHJvcGVydHkgZG9lc24ndFxuICogYWxyZWFkeSBleGlzdC5cbiAqL1xuZnVuY3Rpb24gc2V0ICh0YXJnZXQsIGtleSwgdmFsKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgKGlzVW5kZWYodGFyZ2V0KSB8fCBpc1ByaW1pdGl2ZSh0YXJnZXQpKVxuICApIHtcbiAgICB3YXJuKChcIkNhbm5vdCBzZXQgcmVhY3RpdmUgcHJvcGVydHkgb24gdW5kZWZpbmVkLCBudWxsLCBvciBwcmltaXRpdmUgdmFsdWU6IFwiICsgKCh0YXJnZXQpKSkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkgJiYgaXNWYWxpZEFycmF5SW5kZXgoa2V5KSkge1xuICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpO1xuICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxLCB2YWwpO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICBpZiAoa2V5IGluIHRhcmdldCAmJiAhKGtleSBpbiBPYmplY3QucHJvdG90eXBlKSkge1xuICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187XG4gIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICtcbiAgICAgICdhdCBydW50aW1lIC0gZGVjbGFyZSBpdCB1cGZyb250IGluIHRoZSBkYXRhIG9wdGlvbi4nXG4gICAgKTtcbiAgICByZXR1cm4gdmFsXG4gIH1cbiAgaWYgKCFvYikge1xuICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICBkZWZpbmVSZWFjdGl2ZSQkMShvYi52YWx1ZSwga2V5LCB2YWwpO1xuICBvYi5kZXAubm90aWZ5KCk7XG4gIHJldHVybiB2YWxcbn1cblxuLyoqXG4gKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LlxuICovXG5mdW5jdGlvbiBkZWwgKHRhcmdldCwga2V5KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgKGlzVW5kZWYodGFyZ2V0KSB8fCBpc1ByaW1pdGl2ZSh0YXJnZXQpKVxuICApIHtcbiAgICB3YXJuKChcIkNhbm5vdCBkZWxldGUgcmVhY3RpdmUgcHJvcGVydHkgb24gdW5kZWZpbmVkLCBudWxsLCBvciBwcmltaXRpdmUgdmFsdWU6IFwiICsgKCh0YXJnZXQpKSkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkgJiYgaXNWYWxpZEFycmF5SW5kZXgoa2V5KSkge1xuICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187XG4gIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICdBdm9pZCBkZWxldGluZyBwcm9wZXJ0aWVzIG9uIGEgVnVlIGluc3RhbmNlIG9yIGl0cyByb290ICRkYXRhICcgK1xuICAgICAgJy0ganVzdCBzZXQgaXQgdG8gbnVsbC4nXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBkZWxldGUgdGFyZ2V0W2tleV07XG4gIGlmICghb2IpIHtcbiAgICByZXR1cm5cbiAgfVxuICBvYi5kZXAubm90aWZ5KCk7XG59XG5cbi8qKlxuICogQ29sbGVjdCBkZXBlbmRlbmNpZXMgb24gYXJyYXkgZWxlbWVudHMgd2hlbiB0aGUgYXJyYXkgaXMgdG91Y2hlZCwgc2luY2VcbiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLlxuICovXG5mdW5jdGlvbiBkZXBlbmRBcnJheSAodmFsdWUpIHtcbiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGUgPSB2YWx1ZVtpXTtcbiAgICBlICYmIGUuX19vYl9fICYmIGUuX19vYl9fLmRlcC5kZXBlbmQoKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgZGVwZW5kQXJyYXkoZSk7XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGVcbiAqIGhvdyB0byBtZXJnZSBhIHBhcmVudCBvcHRpb24gdmFsdWUgYW5kIGEgY2hpbGQgb3B0aW9uXG4gKiB2YWx1ZSBpbnRvIHRoZSBmaW5hbCB2YWx1ZS5cbiAqL1xudmFyIHN0cmF0cyA9IGNvbmZpZy5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7XG5cbi8qKlxuICogT3B0aW9ucyB3aXRoIHJlc3RyaWN0aW9uc1xuICovXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBzdHJhdHMuZWwgPSBzdHJhdHMucHJvcHNEYXRhID0gZnVuY3Rpb24gKHBhcmVudCwgY2hpbGQsIHZtLCBrZXkpIHtcbiAgICBpZiAoIXZtKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBcIm9wdGlvbiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgXCIgK1xuICAgICAgICAnY3JlYXRpb24gd2l0aCB0aGUgYG5ld2Aga2V5d29yZC4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFN0cmF0KHBhcmVudCwgY2hpbGQpXG4gIH07XG59XG5cbi8qKlxuICogSGVscGVyIHRoYXQgcmVjdXJzaXZlbHkgbWVyZ2VzIHR3byBkYXRhIG9iamVjdHMgdG9nZXRoZXIuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHtcbiAgaWYgKCFmcm9tKSB7IHJldHVybiB0byB9XG4gIHZhciBrZXksIHRvVmFsLCBmcm9tVmFsO1xuXG4gIHZhciBrZXlzID0gaGFzU3ltYm9sXG4gICAgPyBSZWZsZWN0Lm93bktleXMoZnJvbSlcbiAgICA6IE9iamVjdC5rZXlzKGZyb20pO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgLy8gaW4gY2FzZSB0aGUgb2JqZWN0IGlzIGFscmVhZHkgb2JzZXJ2ZWQuLi5cbiAgICBpZiAoa2V5ID09PSAnX19vYl9fJykgeyBjb250aW51ZSB9XG4gICAgdG9WYWwgPSB0b1trZXldO1xuICAgIGZyb21WYWwgPSBmcm9tW2tleV07XG4gICAgaWYgKCFoYXNPd24odG8sIGtleSkpIHtcbiAgICAgIHNldCh0bywga2V5LCBmcm9tVmFsKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdG9WYWwgIT09IGZyb21WYWwgJiZcbiAgICAgIGlzUGxhaW5PYmplY3QodG9WYWwpICYmXG4gICAgICBpc1BsYWluT2JqZWN0KGZyb21WYWwpXG4gICAgKSB7XG4gICAgICBtZXJnZURhdGEodG9WYWwsIGZyb21WYWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG9cbn1cblxuLyoqXG4gKiBEYXRhXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRGF0YU9yRm4gKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bVxuKSB7XG4gIGlmICghdm0pIHtcbiAgICAvLyBpbiBhIFZ1ZS5leHRlbmQgbWVyZ2UsIGJvdGggc2hvdWxkIGJlIGZ1bmN0aW9uc1xuICAgIGlmICghY2hpbGRWYWwpIHtcbiAgICAgIHJldHVybiBwYXJlbnRWYWxcbiAgICB9XG4gICAgaWYgKCFwYXJlbnRWYWwpIHtcbiAgICAgIHJldHVybiBjaGlsZFZhbFxuICAgIH1cbiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsXG4gICAgLy8gd2UgbmVlZCB0byByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gICAgLy8gbWVyZ2VkIHJlc3VsdCBvZiBib3RoIGZ1bmN0aW9ucy4uLiBubyBuZWVkIHRvXG4gICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlXG4gICAgLy8gaXQgaGFzIHRvIGJlIGEgZnVuY3Rpb24gdG8gcGFzcyBwcmV2aW91cyBtZXJnZXMuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZERhdGFGbiAoKSB7XG4gICAgICByZXR1cm4gbWVyZ2VEYXRhKFxuICAgICAgICB0eXBlb2YgY2hpbGRWYWwgPT09ICdmdW5jdGlvbicgPyBjaGlsZFZhbC5jYWxsKHRoaXMsIHRoaXMpIDogY2hpbGRWYWwsXG4gICAgICAgIHR5cGVvZiBwYXJlbnRWYWwgPT09ICdmdW5jdGlvbicgPyBwYXJlbnRWYWwuY2FsbCh0aGlzLCB0aGlzKSA6IHBhcmVudFZhbFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkge1xuICAgICAgLy8gaW5zdGFuY2UgbWVyZ2VcbiAgICAgIHZhciBpbnN0YW5jZURhdGEgPSB0eXBlb2YgY2hpbGRWYWwgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSlcbiAgICAgICAgOiBjaGlsZFZhbDtcbiAgICAgIHZhciBkZWZhdWx0RGF0YSA9IHR5cGVvZiBwYXJlbnRWYWwgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pXG4gICAgICAgIDogcGFyZW50VmFsO1xuICAgICAgaWYgKGluc3RhbmNlRGF0YSkge1xuICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVmYXVsdERhdGFcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuc3RyYXRzLmRhdGEgPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtXG4pIHtcbiAgaWYgKCF2bSkge1xuICAgIGlmIChjaGlsZFZhbCAmJiB0eXBlb2YgY2hpbGRWYWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ1RoZSBcImRhdGFcIiBvcHRpb24gc2hvdWxkIGJlIGEgZnVuY3Rpb24gJyArXG4gICAgICAgICd0aGF0IHJldHVybnMgYSBwZXItaW5zdGFuY2UgdmFsdWUgaW4gY29tcG9uZW50ICcgK1xuICAgICAgICAnZGVmaW5pdGlvbnMuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBwYXJlbnRWYWxcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbClcbiAgfVxuXG4gIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKVxufTtcblxuLyoqXG4gKiBIb29rcyBhbmQgcHJvcHMgYXJlIG1lcmdlZCBhcyBhcnJheXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlSG9vayAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWxcbikge1xuICB2YXIgcmVzID0gY2hpbGRWYWxcbiAgICA/IHBhcmVudFZhbFxuICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKVxuICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkVmFsKVxuICAgICAgICA/IGNoaWxkVmFsXG4gICAgICAgIDogW2NoaWxkVmFsXVxuICAgIDogcGFyZW50VmFsO1xuICByZXR1cm4gcmVzXG4gICAgPyBkZWR1cGVIb29rcyhyZXMpXG4gICAgOiByZXNcbn1cblxuZnVuY3Rpb24gZGVkdXBlSG9va3MgKGhvb2tzKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZXMuaW5kZXhPZihob29rc1tpXSkgPT09IC0xKSB7XG4gICAgICByZXMucHVzaChob29rc1tpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgc3RyYXRzW2hvb2tdID0gbWVyZ2VIb29rO1xufSk7XG5cbi8qKlxuICogQXNzZXRzXG4gKlxuICogV2hlbiBhIHZtIGlzIHByZXNlbnQgKGluc3RhbmNlIGNyZWF0aW9uKSwgd2UgbmVlZCB0byBkb1xuICogYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiBjb25zdHJ1Y3RvciBvcHRpb25zLCBpbnN0YW5jZVxuICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQXNzZXRzIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm0sXG4gIGtleVxuKSB7XG4gIHZhciByZXMgPSBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKTtcbiAgaWYgKGNoaWxkVmFsKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBhc3NlcnRPYmplY3RUeXBlKGtleSwgY2hpbGRWYWwsIHZtKTtcbiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlc1xuICB9XG59XG5cbkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgc3RyYXRzW3R5cGUgKyAncyddID0gbWVyZ2VBc3NldHM7XG59KTtcblxuLyoqXG4gKiBXYXRjaGVycy5cbiAqXG4gKiBXYXRjaGVycyBoYXNoZXMgc2hvdWxkIG5vdCBvdmVyd3JpdGUgb25lXG4gKiBhbm90aGVyLCBzbyB3ZSBtZXJnZSB0aGVtIGFzIGFycmF5cy5cbiAqL1xuc3RyYXRzLndhdGNoID0gZnVuY3Rpb24gKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bSxcbiAga2V5XG4pIHtcbiAgLy8gd29yayBhcm91bmQgRmlyZWZveCdzIE9iamVjdC5wcm90b3R5cGUud2F0Y2guLi5cbiAgaWYgKHBhcmVudFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgcGFyZW50VmFsID0gdW5kZWZpbmVkOyB9XG4gIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghY2hpbGRWYWwpIHsgcmV0dXJuIE9iamVjdC5jcmVhdGUocGFyZW50VmFsIHx8IG51bGwpIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBhc3NlcnRPYmplY3RUeXBlKGtleSwgY2hpbGRWYWwsIHZtKTtcbiAgfVxuICBpZiAoIXBhcmVudFZhbCkgeyByZXR1cm4gY2hpbGRWYWwgfVxuICB2YXIgcmV0ID0ge307XG4gIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7XG4gIGZvciAodmFyIGtleSQxIGluIGNoaWxkVmFsKSB7XG4gICAgdmFyIHBhcmVudCA9IHJldFtrZXkkMV07XG4gICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdO1xuICAgIGlmIChwYXJlbnQgJiYgIUFycmF5LmlzQXJyYXkocGFyZW50KSkge1xuICAgICAgcGFyZW50ID0gW3BhcmVudF07XG4gICAgfVxuICAgIHJldFtrZXkkMV0gPSBwYXJlbnRcbiAgICAgID8gcGFyZW50LmNvbmNhdChjaGlsZClcbiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07XG4gIH1cbiAgcmV0dXJuIHJldFxufTtcblxuLyoqXG4gKiBPdGhlciBvYmplY3QgaGFzaGVzLlxuICovXG5zdHJhdHMucHJvcHMgPVxuc3RyYXRzLm1ldGhvZHMgPVxuc3RyYXRzLmluamVjdCA9XG5zdHJhdHMuY29tcHV0ZWQgPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtLFxuICBrZXlcbikge1xuICBpZiAoY2hpbGRWYWwgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICB9XG4gIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9XG4gIHZhciByZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBleHRlbmQocmV0LCBwYXJlbnRWYWwpO1xuICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9XG4gIHJldHVybiByZXRcbn07XG5zdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47XG5cbi8qKlxuICogRGVmYXVsdCBzdHJhdGVneS5cbiAqL1xudmFyIGRlZmF1bHRTdHJhdCA9IGZ1bmN0aW9uIChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XG4gIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkXG4gICAgPyBwYXJlbnRWYWxcbiAgICA6IGNoaWxkVmFsXG59O1xuXG4vKipcbiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lc1xuICovXG5mdW5jdGlvbiBjaGVja0NvbXBvbmVudHMgKG9wdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykge1xuICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcG9uZW50TmFtZSAobmFtZSkge1xuICBpZiAoIW5ldyBSZWdFeHAoKFwiXlthLXpBLVpdW1xcXFwtXFxcXC4wLTlfXCIgKyAodW5pY29kZVJlZ0V4cC5zb3VyY2UpICsgXCJdKiRcIikpLnRlc3QobmFtZSkpIHtcbiAgICB3YXJuKFxuICAgICAgJ0ludmFsaWQgY29tcG9uZW50IG5hbWU6IFwiJyArIG5hbWUgKyAnXCIuIENvbXBvbmVudCBuYW1lcyAnICtcbiAgICAgICdzaG91bGQgY29uZm9ybSB0byB2YWxpZCBjdXN0b20gZWxlbWVudCBuYW1lIGluIGh0bWw1IHNwZWNpZmljYXRpb24uJ1xuICAgICk7XG4gIH1cbiAgaWYgKGlzQnVpbHRJblRhZyhuYW1lKSB8fCBjb25maWcuaXNSZXNlcnZlZFRhZyhuYW1lKSkge1xuICAgIHdhcm4oXG4gICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICtcbiAgICAgICdpZDogJyArIG5hbWVcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogRW5zdXJlIGFsbCBwcm9wcyBvcHRpb24gc3ludGF4IGFyZSBub3JtYWxpemVkIGludG8gdGhlXG4gKiBPYmplY3QtYmFzZWQgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQcm9wcyAob3B0aW9ucywgdm0pIHtcbiAgdmFyIHByb3BzID0gb3B0aW9ucy5wcm9wcztcbiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfVxuICB2YXIgcmVzID0ge307XG4gIHZhciBpLCB2YWwsIG5hbWU7XG4gIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkge1xuICAgIGkgPSBwcm9wcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdmFsID0gcHJvcHNbaV07XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmFtZSA9IGNhbWVsaXplKHZhbCk7XG4gICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9O1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhbCA9IHByb3BzW2tleV07XG4gICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTtcbiAgICAgIHJlc1tuYW1lXSA9IGlzUGxhaW5PYmplY3QodmFsKVxuICAgICAgICA/IHZhbFxuICAgICAgICA6IHsgdHlwZTogdmFsIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKFxuICAgICAgXCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXFxcInByb3BzXFxcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCBcIiArXG4gICAgICBcImJ1dCBnb3QgXCIgKyAodG9SYXdUeXBlKHByb3BzKSkgKyBcIi5cIixcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICBvcHRpb25zLnByb3BzID0gcmVzO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSW5qZWN0IChvcHRpb25zLCB2bSkge1xuICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7XG4gIGlmICghaW5qZWN0KSB7IHJldHVybiB9XG4gIHZhciBub3JtYWxpemVkID0gb3B0aW9ucy5pbmplY3QgPSB7fTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5qZWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBub3JtYWxpemVkW2luamVjdFtpXV0gPSB7IGZyb206IGluamVjdFtpXSB9O1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGluamVjdCkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gaW5qZWN0KSB7XG4gICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07XG4gICAgICBub3JtYWxpemVkW2tleV0gPSBpc1BsYWluT2JqZWN0KHZhbClcbiAgICAgICAgPyBleHRlbmQoeyBmcm9tOiBrZXkgfSwgdmFsKVxuICAgICAgICA6IHsgZnJvbTogdmFsIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKFxuICAgICAgXCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXFxcImluamVjdFxcXCI6IGV4cGVjdGVkIGFuIEFycmF5IG9yIGFuIE9iamVjdCwgXCIgK1xuICAgICAgXCJidXQgZ290IFwiICsgKHRvUmF3VHlwZShpbmplY3QpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHJhdyBmdW5jdGlvbiBkaXJlY3RpdmVzIGludG8gb2JqZWN0IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRGlyZWN0aXZlcyAob3B0aW9ucykge1xuICB2YXIgZGlycyA9IG9wdGlvbnMuZGlyZWN0aXZlcztcbiAgaWYgKGRpcnMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGlycykge1xuICAgICAgdmFyIGRlZiQkMSA9IGRpcnNba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgZGVmJCQxID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGRpcnNba2V5XSA9IHsgYmluZDogZGVmJCQxLCB1cGRhdGU6IGRlZiQkMSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRPYmplY3RUeXBlIChuYW1lLCB2YWx1ZSwgdm0pIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiOiBleHBlY3RlZCBhbiBPYmplY3QsIFwiICtcbiAgICAgIFwiYnV0IGdvdCBcIiArICh0b1Jhd1R5cGUodmFsdWUpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLlxuICogQ29yZSB1dGlsaXR5IHVzZWQgaW4gYm90aCBpbnN0YW50aWF0aW9uIGFuZCBpbmhlcml0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPcHRpb25zIChcbiAgcGFyZW50LFxuICBjaGlsZCxcbiAgdm1cbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNoZWNrQ29tcG9uZW50cyhjaGlsZCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGNoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2hpbGQgPSBjaGlsZC5vcHRpb25zO1xuICB9XG5cbiAgbm9ybWFsaXplUHJvcHMoY2hpbGQsIHZtKTtcbiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7XG4gIG5vcm1hbGl6ZURpcmVjdGl2ZXMoY2hpbGQpO1xuXG4gIC8vIEFwcGx5IGV4dGVuZHMgYW5kIG1peGlucyBvbiB0aGUgY2hpbGQgb3B0aW9ucyxcbiAgLy8gYnV0IG9ubHkgaWYgaXQgaXMgYSByYXcgb3B0aW9ucyBvYmplY3QgdGhhdCBpc24ndFxuICAvLyB0aGUgcmVzdWx0IG9mIGFub3RoZXIgbWVyZ2VPcHRpb25zIGNhbGwuXG4gIC8vIE9ubHkgbWVyZ2VkIG9wdGlvbnMgaGFzIHRoZSBfYmFzZSBwcm9wZXJ0eS5cbiAgaWYgKCFjaGlsZC5fYmFzZSkge1xuICAgIGlmIChjaGlsZC5leHRlbmRzKSB7XG4gICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5leHRlbmRzLCB2bSk7XG4gICAgfVxuICAgIGlmIChjaGlsZC5taXhpbnMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgb3B0aW9ucyA9IHt9O1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBwYXJlbnQpIHtcbiAgICBtZXJnZUZpZWxkKGtleSk7XG4gIH1cbiAgZm9yIChrZXkgaW4gY2hpbGQpIHtcbiAgICBpZiAoIWhhc093bihwYXJlbnQsIGtleSkpIHtcbiAgICAgIG1lcmdlRmllbGQoa2V5KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7XG4gICAgdmFyIHN0cmF0ID0gc3RyYXRzW2tleV0gfHwgZGVmYXVsdFN0cmF0O1xuICAgIG9wdGlvbnNba2V5XSA9IHN0cmF0KHBhcmVudFtrZXldLCBjaGlsZFtrZXldLCB2bSwga2V5KTtcbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gYXNzZXQuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3NcbiAqIHRvIGFzc2V0cyBkZWZpbmVkIGluIGl0cyBhbmNlc3RvciBjaGFpbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFzc2V0IChcbiAgb3B0aW9ucyxcbiAgdHlwZSxcbiAgaWQsXG4gIHdhcm5NaXNzaW5nXG4pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIGFzc2V0cyA9IG9wdGlvbnNbdHlwZV07XG4gIC8vIGNoZWNrIGxvY2FsIHJlZ2lzdHJhdGlvbiB2YXJpYXRpb25zIGZpcnN0XG4gIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfVxuICB2YXIgY2FtZWxpemVkSWQgPSBjYW1lbGl6ZShpZCk7XG4gIGlmIChoYXNPd24oYXNzZXRzLCBjYW1lbGl6ZWRJZCkpIHsgcmV0dXJuIGFzc2V0c1tjYW1lbGl6ZWRJZF0gfVxuICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7XG4gIGlmIChoYXNPd24oYXNzZXRzLCBQYXNjYWxDYXNlSWQpKSB7IHJldHVybiBhc3NldHNbUGFzY2FsQ2FzZUlkXSB9XG4gIC8vIGZhbGxiYWNrIHRvIHByb3RvdHlwZSBjaGFpblxuICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuTWlzc2luZyAmJiAhcmVzKSB7XG4gICAgd2FybihcbiAgICAgICdGYWlsZWQgdG8gcmVzb2x2ZSAnICsgdHlwZS5zbGljZSgwLCAtMSkgKyAnOiAnICsgaWQsXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wIChcbiAga2V5LFxuICBwcm9wT3B0aW9ucyxcbiAgcHJvcHNEYXRhLFxuICB2bVxuKSB7XG4gIHZhciBwcm9wID0gcHJvcE9wdGlvbnNba2V5XTtcbiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpO1xuICB2YXIgdmFsdWUgPSBwcm9wc0RhdGFba2V5XTtcbiAgLy8gYm9vbGVhbiBjYXN0aW5nXG4gIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTtcbiAgaWYgKGJvb2xlYW5JbmRleCA+IC0xKSB7XG4gICAgaWYgKGFic2VudCAmJiAhaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHtcbiAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IGh5cGhlbmF0ZShrZXkpKSB7XG4gICAgICAvLyBvbmx5IGNhc3QgZW1wdHkgc3RyaW5nIC8gc2FtZSBuYW1lIHRvIGJvb2xlYW4gaWZcbiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eVxuICAgICAgdmFyIHN0cmluZ0luZGV4ID0gZ2V0VHlwZUluZGV4KFN0cmluZywgcHJvcC50eXBlKTtcbiAgICAgIGlmIChzdHJpbmdJbmRleCA8IDAgfHwgYm9vbGVhbkluZGV4IDwgc3RyaW5nSW5kZXgpIHtcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBjaGVjayBkZWZhdWx0IHZhbHVlXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpO1xuICAgIC8vIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGEgZnJlc2ggY29weSxcbiAgICAvLyBtYWtlIHN1cmUgdG8gb2JzZXJ2ZSBpdC5cbiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlO1xuICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTtcbiAgICBvYnNlcnZlKHZhbHVlKTtcbiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpO1xuICB9XG4gIGlmIChcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgLy8gc2tpcCB2YWxpZGF0aW9uIGZvciB3ZWV4IHJlY3ljbGUtbGlzdCBjaGlsZCBjb21wb25lbnQgcHJvcHNcbiAgICAhKGZhbHNlKVxuICApIHtcbiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpO1xuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuXG4gKi9cbmZ1bmN0aW9uIGdldFByb3BEZWZhdWx0VmFsdWUgKHZtLCBwcm9wLCBrZXkpIHtcbiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAoIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIHZhciBkZWYgPSBwcm9wLmRlZmF1bHQ7XG4gIC8vIHdhcm4gYWdhaW5zdCBub24tZmFjdG9yeSBkZWZhdWx0cyBmb3IgT2JqZWN0ICYgQXJyYXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNPYmplY3QoZGVmKSkge1xuICAgIHdhcm4oXG4gICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wIFwiJyArIGtleSArICdcIjogJyArXG4gICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArXG4gICAgICAndG8gcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLicsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbiAgLy8gdGhlIHJhdyBwcm9wIHZhbHVlIHdhcyBhbHNvIHVuZGVmaW5lZCBmcm9tIHByZXZpb3VzIHJlbmRlcixcbiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyXG4gIGlmICh2bSAmJiB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgJiZcbiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGFba2V5XSA9PT0gdW5kZWZpbmVkICYmXG4gICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICByZXR1cm4gdm0uX3Byb3BzW2tleV1cbiAgfVxuICAvLyBjYWxsIGZhY3RvcnkgZnVuY3Rpb24gZm9yIG5vbi1GdW5jdGlvbiB0eXBlc1xuICAvLyBhIHZhbHVlIGlzIEZ1bmN0aW9uIGlmIGl0cyBwcm90b3R5cGUgaXMgZnVuY3Rpb24gZXZlbiBhY3Jvc3MgZGlmZmVyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJ1xuICAgID8gZGVmLmNhbGwodm0pXG4gICAgOiBkZWZcbn1cblxuLyoqXG4gKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFByb3AgKFxuICBwcm9wLFxuICBuYW1lLFxuICB2YWx1ZSxcbiAgdm0sXG4gIGFic2VudFxuKSB7XG4gIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkge1xuICAgIHdhcm4oXG4gICAgICAnTWlzc2luZyByZXF1aXJlZCBwcm9wOiBcIicgKyBuYW1lICsgJ1wiJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciB0eXBlID0gcHJvcC50eXBlO1xuICB2YXIgdmFsaWQgPSAhdHlwZSB8fCB0eXBlID09PSB0cnVlO1xuICB2YXIgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICBpZiAodHlwZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZSA9IFt0eXBlXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aCAmJiAhdmFsaWQ7IGkrKykge1xuICAgICAgdmFyIGFzc2VydGVkVHlwZSA9IGFzc2VydFR5cGUodmFsdWUsIHR5cGVbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpO1xuICAgICAgdmFsaWQgPSBhc3NlcnRlZFR5cGUudmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF2YWxpZCkge1xuICAgIHdhcm4oXG4gICAgICBnZXRJbnZhbGlkVHlwZU1lc3NhZ2UobmFtZSwgdmFsdWUsIGV4cGVjdGVkVHlwZXMpLFxuICAgICAgdm1cbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjtcbiAgaWYgKHZhbGlkYXRvcikge1xuICAgIGlmICghdmFsaWRhdG9yKHZhbHVlKSkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0ludmFsaWQgcHJvcDogY3VzdG9tIHZhbGlkYXRvciBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCInICsgbmFtZSArICdcIi4nLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHNpbXBsZUNoZWNrUkUgPSAvXihTdHJpbmd8TnVtYmVyfEJvb2xlYW58RnVuY3Rpb258U3ltYm9sKSQvO1xuXG5mdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkge1xuICB2YXIgdmFsaWQ7XG4gIHZhciBleHBlY3RlZFR5cGUgPSBnZXRUeXBlKHR5cGUpO1xuICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHtcbiAgICB2YXIgdCA9IHR5cGVvZiB2YWx1ZTtcbiAgICB2YWxpZCA9IHQgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzXG4gICAgaWYgKCF2YWxpZCAmJiB0ID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICB2YWxpZCA9IGlzUGxhaW5PYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2YWxpZDogdmFsaWQsXG4gICAgZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGVcbiAgfVxufVxuXG4vKipcbiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcyxcbiAqIGJlY2F1c2UgYSBzaW1wbGUgZXF1YWxpdHkgY2hlY2sgd2lsbCBmYWlsIHdoZW4gcnVubmluZ1xuICogYWNyb3NzIGRpZmZlcmVudCB2bXMgLyBpZnJhbWVzLlxuICovXG5mdW5jdGlvbiBnZXRUeXBlIChmbikge1xuICB2YXIgbWF0Y2ggPSBmbiAmJiBmbi50b1N0cmluZygpLm1hdGNoKC9eXFxzKmZ1bmN0aW9uIChcXHcrKS8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnXG59XG5cbmZ1bmN0aW9uIGlzU2FtZVR5cGUgKGEsIGIpIHtcbiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYilcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFR5cGVzKSkge1xuICAgIHJldHVybiBpc1NhbWVUeXBlKGV4cGVjdGVkVHlwZXMsIHR5cGUpID8gMCA6IC0xXG4gIH1cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV4cGVjdGVkVHlwZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzW2ldLCB0eXBlKSkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xXG59XG5cbmZ1bmN0aW9uIGdldEludmFsaWRUeXBlTWVzc2FnZSAobmFtZSwgdmFsdWUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgdmFyIG1lc3NhZ2UgPSBcIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXFxcIlwiICsgbmFtZSArIFwiXFxcIi5cIiArXG4gICAgXCIgRXhwZWN0ZWQgXCIgKyAoZXhwZWN0ZWRUeXBlcy5tYXAoY2FwaXRhbGl6ZSkuam9pbignLCAnKSk7XG4gIHZhciBleHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGVzWzBdO1xuICB2YXIgcmVjZWl2ZWRUeXBlID0gdG9SYXdUeXBlKHZhbHVlKTtcbiAgdmFyIGV4cGVjdGVkVmFsdWUgPSBzdHlsZVZhbHVlKHZhbHVlLCBleHBlY3RlZFR5cGUpO1xuICB2YXIgcmVjZWl2ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIHJlY2VpdmVkVHlwZSk7XG4gIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3BlY2lmeSBleHBlY3RlZCB2YWx1ZVxuICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDEgJiZcbiAgICAgIGlzRXhwbGljYWJsZShleHBlY3RlZFR5cGUpICYmXG4gICAgICAhaXNCb29sZWFuKGV4cGVjdGVkVHlwZSwgcmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gXCIgd2l0aCB2YWx1ZSBcIiArIGV4cGVjdGVkVmFsdWU7XG4gIH1cbiAgbWVzc2FnZSArPSBcIiwgZ290IFwiICsgcmVjZWl2ZWRUeXBlICsgXCIgXCI7XG4gIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3BlY2lmeSByZWNlaXZlZCB2YWx1ZVxuICBpZiAoaXNFeHBsaWNhYmxlKHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IFwid2l0aCB2YWx1ZSBcIiArIHJlY2VpdmVkVmFsdWUgKyBcIi5cIjtcbiAgfVxuICByZXR1cm4gbWVzc2FnZVxufVxuXG5mdW5jdGlvbiBzdHlsZVZhbHVlICh2YWx1ZSwgdHlwZSkge1xuICBpZiAodHlwZSA9PT0gJ1N0cmluZycpIHtcbiAgICByZXR1cm4gKFwiXFxcIlwiICsgdmFsdWUgKyBcIlxcXCJcIilcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnTnVtYmVyJykge1xuICAgIHJldHVybiAoXCJcIiArIChOdW1iZXIodmFsdWUpKSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKFwiXCIgKyB2YWx1ZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0V4cGxpY2FibGUgKHZhbHVlKSB7XG4gIHZhciBleHBsaWNpdFR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXTtcbiAgcmV0dXJuIGV4cGxpY2l0VHlwZXMuc29tZShmdW5jdGlvbiAoZWxlbSkgeyByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gZWxlbTsgfSlcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuICgpIHtcbiAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICByZXR1cm4gYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtKSB7IHJldHVybiBlbGVtLnRvTG93ZXJDYXNlKCkgPT09ICdib29sZWFuJzsgfSlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yIChlcnIsIHZtLCBpbmZvKSB7XG4gIC8vIERlYWN0aXZhdGUgZGVwcyB0cmFja2luZyB3aGlsZSBwcm9jZXNzaW5nIGVycm9yIGhhbmRsZXIgdG8gYXZvaWQgcG9zc2libGUgaW5maW5pdGUgcmVuZGVyaW5nLlxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWV4L2lzc3Vlcy8xNTA1XG4gIHB1c2hUYXJnZXQoKTtcbiAgdHJ5IHtcbiAgICBpZiAodm0pIHtcbiAgICAgIHZhciBjdXIgPSB2bTtcbiAgICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7XG4gICAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkO1xuICAgICAgICBpZiAoaG9va3MpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7XG4gICAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwb3BUYXJnZXQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VXaXRoRXJyb3JIYW5kbGluZyAoXG4gIGhhbmRsZXIsXG4gIGNvbnRleHQsXG4gIGFyZ3MsXG4gIHZtLFxuICBpbmZvXG4pIHtcbiAgdmFyIHJlcztcbiAgdHJ5IHtcbiAgICByZXMgPSBhcmdzID8gaGFuZGxlci5hcHBseShjb250ZXh0LCBhcmdzKSA6IGhhbmRsZXIuY2FsbChjb250ZXh0KTtcbiAgICBpZiAocmVzICYmICFyZXMuX2lzVnVlICYmIGlzUHJvbWlzZShyZXMpICYmICFyZXMuX2hhbmRsZWQpIHtcbiAgICAgIHJlcy5jYXRjaChmdW5jdGlvbiAoZSkgeyByZXR1cm4gaGFuZGxlRXJyb3IoZSwgdm0sIGluZm8gKyBcIiAoUHJvbWlzZS9hc3luYylcIik7IH0pO1xuICAgICAgLy8gaXNzdWUgIzk1MTFcbiAgICAgIC8vIGF2b2lkIGNhdGNoIHRyaWdnZXJpbmcgbXVsdGlwbGUgdGltZXMgd2hlbiBuZXN0ZWQgY2FsbHNcbiAgICAgIHJlcy5faGFuZGxlZCA9IHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaGFuZGxlRXJyb3IoZSwgdm0sIGluZm8pO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgaWYgKGNvbmZpZy5lcnJvckhhbmRsZXIpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlmIHRoZSB1c2VyIGludGVudGlvbmFsbHkgdGhyb3dzIHRoZSBvcmlnaW5hbCBlcnJvciBpbiB0aGUgaGFuZGxlcixcbiAgICAgIC8vIGRvIG5vdCBsb2cgaXQgdHdpY2VcbiAgICAgIGlmIChlICE9PSBlcnIpIHtcbiAgICAgICAgbG9nRXJyb3IoZSwgbnVsbCwgJ2NvbmZpZy5lcnJvckhhbmRsZXInKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbG9nRXJyb3IoZXJyLCB2bSwgaW5mbyk7XG59XG5cbmZ1bmN0aW9uIGxvZ0Vycm9yIChlcnIsIHZtLCBpbmZvKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybigoXCJFcnJvciBpbiBcIiArIGluZm8gKyBcIjogXFxcIlwiICsgKGVyci50b1N0cmluZygpKSArIFwiXFxcIlwiKSwgdm0pO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICgoaW5Ccm93c2VyIHx8IGluV2VleCkgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8qICAqL1xuXG52YXIgaXNVc2luZ01pY3JvVGFzayA9IGZhbHNlO1xuXG52YXIgY2FsbGJhY2tzID0gW107XG52YXIgcGVuZGluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7XG4gIHBlbmRpbmcgPSBmYWxzZTtcbiAgdmFyIGNvcGllcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29waWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29waWVzW2ldKCk7XG4gIH1cbn1cblxuLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBtaWNyb3Rhc2tzLlxuLy8gSW4gMi41IHdlIHVzZWQgKG1hY3JvKSB0YXNrcyAoaW4gY29tYmluYXRpb24gd2l0aCBtaWNyb3Rhc2tzKS5cbi8vIEhvd2V2ZXIsIGl0IGhhcyBzdWJ0bGUgcHJvYmxlbXMgd2hlbiBzdGF0ZSBpcyBjaGFuZ2VkIHJpZ2h0IGJlZm9yZSByZXBhaW50XG4vLyAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS5cbi8vIEFsc28sIHVzaW5nIChtYWNybykgdGFza3MgaW4gZXZlbnQgaGFuZGxlciB3b3VsZCBjYXVzZSBzb21lIHdlaXJkIGJlaGF2aW9yc1xuLy8gdGhhdCBjYW5ub3QgYmUgY2lyY3VtdmVudGVkIChlLmcuICM3MTA5LCAjNzE1MywgIzc1NDYsICM3ODM0LCAjODEwOSkuXG4vLyBTbyB3ZSBub3cgdXNlIG1pY3JvdGFza3MgZXZlcnl3aGVyZSwgYWdhaW4uXG4vLyBBIG1ham9yIGRyYXdiYWNrIG9mIHRoaXMgdHJhZGVvZmYgaXMgdGhhdCB0aGVyZSBhcmUgc29tZSBzY2VuYXJpb3Ncbi8vIHdoZXJlIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseVxuLy8gc2VxdWVudGlhbCBldmVudHMgKGUuZy4gIzQ1MjEsICM2NjkwLCB3aGljaCBoYXZlIHdvcmthcm91bmRzKVxuLy8gb3IgZXZlbiBiZXR3ZWVuIGJ1YmJsaW5nIG9mIHRoZSBzYW1lIGV2ZW50ICgjNjU2NikuXG52YXIgdGltZXJGdW5jO1xuXG4vLyBUaGUgbmV4dFRpY2sgYmVoYXZpb3IgbGV2ZXJhZ2VzIHRoZSBtaWNyb3Rhc2sgcXVldWUsIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZFxuLy8gdmlhIGVpdGhlciBuYXRpdmUgUHJvbWlzZS50aGVuIG9yIE11dGF0aW9uT2JzZXJ2ZXIuXG4vLyBNdXRhdGlvbk9ic2VydmVyIGhhcyB3aWRlciBzdXBwb3J0LCBob3dldmVyIGl0IGlzIHNlcmlvdXNseSBidWdnZWQgaW5cbi8vIFVJV2ViVmlldyBpbiBpT1MgPj0gOS4zLjMgd2hlbiB0cmlnZ2VyZWQgaW4gdG91Y2ggZXZlbnQgaGFuZGxlcnMuIEl0XG4vLyBjb21wbGV0ZWx5IHN0b3BzIHdvcmtpbmcgYWZ0ZXIgdHJpZ2dlcmluZyBhIGZldyB0aW1lcy4uLiBzbywgaWYgbmF0aXZlXG4vLyBQcm9taXNlIGlzIGF2YWlsYWJsZSwgd2Ugd2lsbCB1c2UgaXQ6XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovXG5pZiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFByb21pc2UpKSB7XG4gIHZhciBwID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwLnRoZW4oZmx1c2hDYWxsYmFja3MpO1xuICAgIC8vIEluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dFxuICAgIC8vIGl0IGNhbiBnZXQgc3R1Y2sgaW4gYSB3ZWlyZCBzdGF0ZSB3aGVyZSBjYWxsYmFja3MgYXJlIHB1c2hlZCBpbnRvIHRoZVxuICAgIC8vIG1pY3JvdGFzayBxdWV1ZSBidXQgdGhlIHF1ZXVlIGlzbid0IGJlaW5nIGZsdXNoZWQsIHVudGlsIHRoZSBicm93c2VyXG4gICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuXG4gICAgLy8gXCJmb3JjZVwiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuXG4gICAgaWYgKGlzSU9TKSB7IHNldFRpbWVvdXQobm9vcCk7IH1cbiAgfTtcbiAgaXNVc2luZ01pY3JvVGFzayA9IHRydWU7XG59IGVsc2UgaWYgKCFpc0lFICYmIHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiAoXG4gIGlzTmF0aXZlKE11dGF0aW9uT2JzZXJ2ZXIpIHx8XG4gIC8vIFBoYW50b21KUyBhbmQgaU9TIDcueFxuICBNdXRhdGlvbk9ic2VydmVyLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IE11dGF0aW9uT2JzZXJ2ZXJDb25zdHJ1Y3Rvcl0nXG4pKSB7XG4gIC8vIFVzZSBNdXRhdGlvbk9ic2VydmVyIHdoZXJlIG5hdGl2ZSBQcm9taXNlIGlzIG5vdCBhdmFpbGFibGUsXG4gIC8vIGUuZy4gUGhhbnRvbUpTLCBpT1M3LCBBbmRyb2lkIDQuNFxuICAvLyAoIzY0NjYgTXV0YXRpb25PYnNlcnZlciBpcyB1bnJlbGlhYmxlIGluIElFMTEpXG4gIHZhciBjb3VudGVyID0gMTtcbiAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2hDYWxsYmFja3MpO1xuICB2YXIgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoY291bnRlcikpO1xuICBvYnNlcnZlci5vYnNlcnZlKHRleHROb2RlLCB7XG4gICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICB9KTtcbiAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIGNvdW50ZXIgPSAoY291bnRlciArIDEpICUgMjtcbiAgICB0ZXh0Tm9kZS5kYXRhID0gU3RyaW5nKGNvdW50ZXIpO1xuICB9O1xuICBpc1VzaW5nTWljcm9UYXNrID0gdHJ1ZTtcbn0gZWxzZSBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoc2V0SW1tZWRpYXRlKSkge1xuICAvLyBGYWxsYmFjayB0byBzZXRJbW1lZGlhdGUuXG4gIC8vIFRlY2hpbmljYWxseSBpdCBsZXZlcmFnZXMgdGhlIChtYWNybykgdGFzayBxdWV1ZSxcbiAgLy8gYnV0IGl0IGlzIHN0aWxsIGEgYmV0dGVyIGNob2ljZSB0aGFuIHNldFRpbWVvdXQuXG4gIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dC5cbiAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHNldFRpbWVvdXQoZmx1c2hDYWxsYmFja3MsIDApO1xuICB9O1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkge1xuICB2YXIgX3Jlc29sdmU7XG4gIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNiLmNhbGwoY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZSwgY3R4LCAnbmV4dFRpY2snKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7XG4gICAgICBfcmVzb2x2ZShjdHgpO1xuICAgIH1cbiAgfSk7XG4gIGlmICghcGVuZGluZykge1xuICAgIHBlbmRpbmcgPSB0cnVlO1xuICAgIHRpbWVyRnVuYygpO1xuICB9XG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICBpZiAoIWNiICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgIH0pXG4gIH1cbn1cblxuLyogICovXG5cbi8qIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aCBQcm94eSAqL1xuXG52YXIgaW5pdFByb3h5O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgYWxsb3dlZEdsb2JhbHMgPSBtYWtlTWFwKFxuICAgICdJbmZpbml0eSx1bmRlZmluZWQsTmFOLGlzRmluaXRlLGlzTmFOLCcgK1xuICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICtcbiAgICAnTWF0aCxOdW1iZXIsRGF0ZSxBcnJheSxPYmplY3QsQm9vbGVhbixTdHJpbmcsUmVnRXhwLE1hcCxTZXQsSlNPTixJbnRsLCcgK1xuICAgICdyZXF1aXJlJyAvLyBmb3IgV2VicGFjay9Ccm93c2VyaWZ5XG4gICk7XG5cbiAgdmFyIHdhcm5Ob25QcmVzZW50ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgd2FybihcbiAgICAgIFwiUHJvcGVydHkgb3IgbWV0aG9kIFxcXCJcIiArIGtleSArIFwiXFxcIiBpcyBub3QgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UgYnV0IFwiICtcbiAgICAgICdyZWZlcmVuY2VkIGR1cmluZyByZW5kZXIuIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcHJvcGVydHkgaXMgcmVhY3RpdmUsICcgK1xuICAgICAgJ2VpdGhlciBpbiB0aGUgZGF0YSBvcHRpb24sIG9yIGZvciBjbGFzcy1iYXNlZCBjb21wb25lbnRzLCBieSAnICtcbiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICtcbiAgICAgICdTZWU6IGh0dHBzOi8vdnVlanMub3JnL3YyL2d1aWRlL3JlYWN0aXZpdHkuaHRtbCNEZWNsYXJpbmctUmVhY3RpdmUtUHJvcGVydGllcy4nLFxuICAgICAgdGFyZ2V0XG4gICAgKTtcbiAgfTtcblxuICB2YXIgd2FyblJlc2VydmVkUHJlZml4ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgd2FybihcbiAgICAgIFwiUHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIG11c3QgYmUgYWNjZXNzZWQgd2l0aCBcXFwiJGRhdGEuXCIgKyBrZXkgKyBcIlxcXCIgYmVjYXVzZSBcIiArXG4gICAgICAncHJvcGVydGllcyBzdGFydGluZyB3aXRoIFwiJFwiIG9yIFwiX1wiIGFyZSBub3QgcHJveGllZCBpbiB0aGUgVnVlIGluc3RhbmNlIHRvICcgK1xuICAgICAgJ3ByZXZlbnQgY29uZmxpY3RzIHdpdGggVnVlIGludGVybmFscycgK1xuICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvYXBpLyNkYXRhJyxcbiAgICAgIHRhcmdldFxuICAgICk7XG4gIH07XG5cbiAgdmFyIGhhc1Byb3h5ID1cbiAgICB0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFByb3h5KTtcblxuICBpZiAoaGFzUHJveHkpIHtcbiAgICB2YXIgaXNCdWlsdEluTW9kaWZpZXIgPSBtYWtlTWFwKCdzdG9wLHByZXZlbnQsc2VsZixjdHJsLHNoaWZ0LGFsdCxtZXRhLGV4YWN0Jyk7XG4gICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2Rlcywge1xuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQgKHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoaXNCdWlsdEluTW9kaWZpZXIoa2V5KSkge1xuICAgICAgICAgIHdhcm4oKFwiQXZvaWQgb3ZlcndyaXRpbmcgYnVpbHQtaW4gbW9kaWZpZXIgaW4gY29uZmlnLmtleUNvZGVzOiAuXCIgKyBrZXkpKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZhciBoYXNIYW5kbGVyID0ge1xuICAgIGhhczogZnVuY3Rpb24gaGFzICh0YXJnZXQsIGtleSkge1xuICAgICAgdmFyIGhhcyA9IGtleSBpbiB0YXJnZXQ7XG4gICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fFxuICAgICAgICAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LmNoYXJBdCgwKSA9PT0gJ18nICYmICEoa2V5IGluIHRhcmdldC4kZGF0YSkpO1xuICAgICAgaWYgKCFoYXMgJiYgIWlzQWxsb3dlZCkge1xuICAgICAgICBpZiAoa2V5IGluIHRhcmdldC4kZGF0YSkgeyB3YXJuUmVzZXJ2ZWRQcmVmaXgodGFyZ2V0LCBrZXkpOyB9XG4gICAgICAgIGVsc2UgeyB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXMgfHwgIWlzQWxsb3dlZFxuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0SGFuZGxlciA9IHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiAhKGtleSBpbiB0YXJnZXQpKSB7XG4gICAgICAgIGlmIChrZXkgaW4gdGFyZ2V0LiRkYXRhKSB7IHdhcm5SZXNlcnZlZFByZWZpeCh0YXJnZXQsIGtleSk7IH1cbiAgICAgICAgZWxzZSB7IHdhcm5Ob25QcmVzZW50KHRhcmdldCwga2V5KTsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgfVxuICB9O1xuXG4gIGluaXRQcm94eSA9IGZ1bmN0aW9uIGluaXRQcm94eSAodm0pIHtcbiAgICBpZiAoaGFzUHJveHkpIHtcbiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZVxuICAgICAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcbiAgICAgIHZhciBoYW5kbGVycyA9IG9wdGlvbnMucmVuZGVyICYmIG9wdGlvbnMucmVuZGVyLl93aXRoU3RyaXBwZWRcbiAgICAgICAgPyBnZXRIYW5kbGVyXG4gICAgICAgIDogaGFzSGFuZGxlcjtcbiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IG5ldyBQcm94eSh2bSwgaGFuZGxlcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSB2bTtcbiAgICB9XG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgc2Vlbk9iamVjdHMgPSBuZXcgX1NldCgpO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFuIG9iamVjdCB0byBldm9rZSBhbGwgY29udmVydGVkXG4gKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdFxuICogaXMgY29sbGVjdGVkIGFzIGEgXCJkZWVwXCIgZGVwZW5kZW5jeS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2UgKHZhbCkge1xuICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7XG4gIHNlZW5PYmplY3RzLmNsZWFyKCk7XG59XG5cbmZ1bmN0aW9uIF90cmF2ZXJzZSAodmFsLCBzZWVuKSB7XG4gIHZhciBpLCBrZXlzO1xuICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpO1xuICBpZiAoKCFpc0EgJiYgIWlzT2JqZWN0KHZhbCkpIHx8IE9iamVjdC5pc0Zyb3plbih2YWwpIHx8IHZhbCBpbnN0YW5jZW9mIFZOb2RlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHZhbC5fX29iX18pIHtcbiAgICB2YXIgZGVwSWQgPSB2YWwuX19vYl9fLmRlcC5pZDtcbiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2Vlbi5hZGQoZGVwSWQpO1xuICB9XG4gIGlmIChpc0EpIHtcbiAgICBpID0gdmFsLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxbaV0sIHNlZW4pOyB9XG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgaSA9IGtleXMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtrZXlzW2ldXSwgc2Vlbik7IH1cbiAgfVxufVxuXG52YXIgbWFyaztcbnZhciBtZWFzdXJlO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgcGVyZiA9IGluQnJvd3NlciAmJiB3aW5kb3cucGVyZm9ybWFuY2U7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoXG4gICAgcGVyZiAmJlxuICAgIHBlcmYubWFyayAmJlxuICAgIHBlcmYubWVhc3VyZSAmJlxuICAgIHBlcmYuY2xlYXJNYXJrcyAmJlxuICAgIHBlcmYuY2xlYXJNZWFzdXJlc1xuICApIHtcbiAgICBtYXJrID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gcGVyZi5tYXJrKHRhZyk7IH07XG4gICAgbWVhc3VyZSA9IGZ1bmN0aW9uIChuYW1lLCBzdGFydFRhZywgZW5kVGFnKSB7XG4gICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7XG4gICAgICBwZXJmLmNsZWFyTWFya3Moc3RhcnRUYWcpO1xuICAgICAgcGVyZi5jbGVhck1hcmtzKGVuZFRhZyk7XG4gICAgICAvLyBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSlcbiAgICB9O1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgbm9ybWFsaXplRXZlbnQgPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIHBhc3NpdmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyYnO1xuICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICB2YXIgb25jZSQkMSA9IG5hbWUuY2hhckF0KDApID09PSAnfic7IC8vIFByZWZpeGVkIGxhc3QsIGNoZWNrZWQgZmlyc3RcbiAgbmFtZSA9IG9uY2UkJDEgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnO1xuICBuYW1lID0gY2FwdHVyZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgb25jZTogb25jZSQkMSxcbiAgICBjYXB0dXJlOiBjYXB0dXJlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZuSW52b2tlciAoZm5zLCB2bSkge1xuICBmdW5jdGlvbiBpbnZva2VyICgpIHtcbiAgICB2YXIgYXJndW1lbnRzJDEgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm5zKSkge1xuICAgICAgdmFyIGNsb25lZCA9IGZucy5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW52b2tlV2l0aEVycm9ySGFuZGxpbmcoY2xvbmVkW2ldLCBudWxsLCBhcmd1bWVudHMkMSwgdm0sIFwidi1vbiBoYW5kbGVyXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVyc1xuICAgICAgcmV0dXJuIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGZucywgbnVsbCwgYXJndW1lbnRzLCB2bSwgXCJ2LW9uIGhhbmRsZXJcIilcbiAgICB9XG4gIH1cbiAgaW52b2tlci5mbnMgPSBmbnM7XG4gIHJldHVybiBpbnZva2VyXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpc3RlbmVycyAoXG4gIG9uLFxuICBvbGRPbixcbiAgYWRkLFxuICByZW1vdmUkJDEsXG4gIGNyZWF0ZU9uY2VIYW5kbGVyLFxuICB2bVxuKSB7XG4gIHZhciBuYW1lLCBkZWYkJDEsIGN1ciwgb2xkLCBldmVudDtcbiAgZm9yIChuYW1lIGluIG9uKSB7XG4gICAgZGVmJCQxID0gY3VyID0gb25bbmFtZV07XG4gICAgb2xkID0gb2xkT25bbmFtZV07XG4gICAgZXZlbnQgPSBub3JtYWxpemVFdmVudChuYW1lKTtcbiAgICBpZiAoaXNVbmRlZihjdXIpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgIFwiSW52YWxpZCBoYW5kbGVyIGZvciBldmVudCBcXFwiXCIgKyAoZXZlbnQubmFtZSkgKyBcIlxcXCI6IGdvdCBcIiArIFN0cmluZyhjdXIpLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzVW5kZWYob2xkKSkge1xuICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHtcbiAgICAgICAgY3VyID0gb25bbmFtZV0gPSBjcmVhdGVGbkludm9rZXIoY3VyLCB2bSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNUcnVlKGV2ZW50Lm9uY2UpKSB7XG4gICAgICAgIGN1ciA9IG9uW25hbWVdID0gY3JlYXRlT25jZUhhbmRsZXIoZXZlbnQubmFtZSwgY3VyLCBldmVudC5jYXB0dXJlKTtcbiAgICAgIH1cbiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7XG4gICAgfSBlbHNlIGlmIChjdXIgIT09IG9sZCkge1xuICAgICAgb2xkLmZucyA9IGN1cjtcbiAgICAgIG9uW25hbWVdID0gb2xkO1xuICAgIH1cbiAgfVxuICBmb3IgKG5hbWUgaW4gb2xkT24pIHtcbiAgICBpZiAoaXNVbmRlZihvbltuYW1lXSkpIHtcbiAgICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQobmFtZSk7XG4gICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gbWVyZ2VWTm9kZUhvb2sgKGRlZiwgaG9va0tleSwgaG9vaykge1xuICBpZiAoZGVmIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pO1xuICB9XG4gIHZhciBpbnZva2VyO1xuICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTtcblxuICBmdW5jdGlvbiB3cmFwcGVkSG9vayAoKSB7XG4gICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIC8vIGltcG9ydGFudDogcmVtb3ZlIG1lcmdlZCBob29rIHRvIGVuc3VyZSBpdCdzIGNhbGxlZCBvbmx5IG9uY2VcbiAgICAvLyBhbmQgcHJldmVudCBtZW1vcnkgbGVha1xuICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spO1xuICB9XG5cbiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHtcbiAgICAvLyBubyBleGlzdGluZyBob29rXG4gICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbd3JhcHBlZEhvb2tdKTtcbiAgfSBlbHNlIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNEZWYob2xkSG9vay5mbnMpICYmIGlzVHJ1ZShvbGRIb29rLm1lcmdlZCkpIHtcbiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlclxuICAgICAgaW52b2tlciA9IG9sZEhvb2s7XG4gICAgICBpbnZva2VyLmZucy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXhpc3RpbmcgcGxhaW4gaG9va1xuICAgICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbb2xkSG9vaywgd3JhcHBlZEhvb2tdKTtcbiAgICB9XG4gIH1cblxuICBpbnZva2VyLm1lcmdlZCA9IHRydWU7XG4gIGRlZltob29rS2V5XSA9IGludm9rZXI7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhIChcbiAgZGF0YSxcbiAgQ3RvcixcbiAgdGFnXG4pIHtcbiAgLy8gd2UgYXJlIG9ubHkgZXh0cmFjdGluZyByYXcgdmFsdWVzIGhlcmUuXG4gIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZFxuICAvLyBjb21wb25lbnQgaXRzZWxmLlxuICB2YXIgcHJvcE9wdGlvbnMgPSBDdG9yLm9wdGlvbnMucHJvcHM7XG4gIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGF0dHJzID0gZGF0YS5hdHRycztcbiAgdmFyIHByb3BzID0gZGF0YS5wcm9wcztcbiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHZhciBhbHRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhciBrZXlJbkxvd2VyQ2FzZSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ICE9PSBrZXlJbkxvd2VyQ2FzZSAmJlxuICAgICAgICAgIGF0dHJzICYmIGhhc093bihhdHRycywga2V5SW5Mb3dlckNhc2UpXG4gICAgICAgICkge1xuICAgICAgICAgIHRpcChcbiAgICAgICAgICAgIFwiUHJvcCBcXFwiXCIgKyBrZXlJbkxvd2VyQ2FzZSArIFwiXFxcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50IFwiICtcbiAgICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHRhZyB8fCBDdG9yKSkgKyBcIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXNcIiArXG4gICAgICAgICAgICBcIiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICAgIFwiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCBcIiArXG4gICAgICAgICAgICBcInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gXCIgK1xuICAgICAgICAgICAgXCJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFxcXCJcIiArIGFsdEtleSArIFwiXFxcIiBpbnN0ZWFkIG9mIFxcXCJcIiArIGtleSArIFwiXFxcIi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNoZWNrUHJvcChyZXMsIHByb3BzLCBrZXksIGFsdEtleSwgdHJ1ZSkgfHxcbiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcCAoXG4gIHJlcyxcbiAgaGFzaCxcbiAga2V5LFxuICBhbHRLZXksXG4gIHByZXNlcnZlXG4pIHtcbiAgaWYgKGlzRGVmKGhhc2gpKSB7XG4gICAgaWYgKGhhc093bihoYXNoLCBrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IGhhc2hba2V5XTtcbiAgICAgIGlmICghcHJlc2VydmUpIHtcbiAgICAgICAgZGVsZXRlIGhhc2hba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChoYXNPd24oaGFzaCwgYWx0S2V5KSkge1xuICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07XG4gICAgICBpZiAoIXByZXNlcnZlKSB7XG4gICAgICAgIGRlbGV0ZSBoYXNoW2FsdEtleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyogICovXG5cbi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieVxuLy8gc3RhdGljYWxseSBhbmFseXppbmcgdGhlIHRlbXBsYXRlIGF0IGNvbXBpbGUgdGltZS5cbi8vXG4vLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZVxuLy8gZ2VuZXJhdGVkIHJlbmRlciBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBBcnJheTxWTm9kZT4uIFRoZXJlIGFyZVxuLy8gdHdvIGNhc2VzIHdoZXJlIGV4dHJhIG5vcm1hbGl6YXRpb24gaXMgbmVlZGVkOlxuXG4vLyAxLiBXaGVuIHRoZSBjaGlsZHJlbiBjb250YWlucyBjb21wb25lbnRzIC0gYmVjYXVzZSBhIGZ1bmN0aW9uYWwgY29tcG9uZW50XG4vLyBtYXkgcmV0dXJuIGFuIEFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBqdXN0IGEgc2ltcGxlXG4vLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGVcbi8vIHRoaW5nIHdpdGggQXJyYXkucHJvdG90eXBlLmNvbmNhdC4gSXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvbmx5IDEtbGV2ZWwgZGVlcFxuLy8gYmVjYXVzZSBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYWxyZWFkeSBub3JtYWxpemUgdGhlaXIgb3duIGNoaWxkcmVuLlxuZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbltpXSkpIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuXG59XG5cbi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsXG4vLyBlLmcuIDx0ZW1wbGF0ZT4sIDxzbG90Piwgdi1mb3IsIG9yIHdoZW4gdGhlIGNoaWxkcmVuIGlzIHByb3ZpZGVkIGJ5IHVzZXJcbi8vIHdpdGggaGFuZC13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMgLyBKU1guIEluIHN1Y2ggY2FzZXMgYSBmdWxsIG5vcm1hbGl6YXRpb25cbi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLlxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIHJldHVybiBpc1ByaW1pdGl2ZShjaGlsZHJlbilcbiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXVxuICAgIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgID8gbm9ybWFsaXplQXJyYXlDaGlsZHJlbihjaGlsZHJlbilcbiAgICAgIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHtcbiAgcmV0dXJuIGlzRGVmKG5vZGUpICYmIGlzRGVmKG5vZGUudGV4dCkgJiYgaXNGYWxzZShub2RlLmlzQ29tbWVudClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXlDaGlsZHJlbiAoY2hpbGRyZW4sIG5lc3RlZEluZGV4KSB7XG4gIHZhciByZXMgPSBbXTtcbiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDtcbiAgZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgYyA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfVxuICAgIGxhc3RJbmRleCA9IHJlcy5sZW5ndGggLSAxO1xuICAgIGxhc3QgPSByZXNbbGFzdEluZGV4XTtcbiAgICAvLyAgbmVzdGVkXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgIGlmIChjLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyBcIl9cIiArIGkpKTtcbiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICBpZiAoaXNUZXh0Tm9kZShjWzBdKSAmJiBpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgKGNbMF0pLnRleHQpO1xuICAgICAgICAgIGMuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaC5hcHBseShyZXMsIGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUoYykpIHtcbiAgICAgIGlmIChpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgLy8gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIFNTUiBoeWRyYXRpb24gYmVjYXVzZSB0ZXh0IG5vZGVzIGFyZVxuICAgICAgICAvLyBlc3NlbnRpYWxseSBtZXJnZWQgd2hlbiByZW5kZXJlZCB0byBIVE1MIHN0cmluZ3NcbiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7XG4gICAgICB9IGVsc2UgaWYgKGMgIT09ICcnKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgcHJpbWl0aXZlIHRvIHZub2RlXG4gICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHtcbiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICByZXNbbGFzdEluZGV4XSA9IGNyZWF0ZVRleHRWTm9kZShsYXN0LnRleHQgKyBjLnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZGVmYXVsdCBrZXkgZm9yIG5lc3RlZCBhcnJheSBjaGlsZHJlbiAobGlrZWx5IGdlbmVyYXRlZCBieSB2LWZvcilcbiAgICAgICAgaWYgKGlzVHJ1ZShjaGlsZHJlbi5faXNWTGlzdCkgJiZcbiAgICAgICAgICBpc0RlZihjLnRhZykgJiZcbiAgICAgICAgICBpc1VuZGVmKGMua2V5KSAmJlxuICAgICAgICAgIGlzRGVmKG5lc3RlZEluZGV4KSkge1xuICAgICAgICAgIGMua2V5ID0gXCJfX3ZsaXN0XCIgKyBuZXN0ZWRJbmRleCArIFwiX1wiICsgaSArIFwiX19cIjtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaChjKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFByb3ZpZGUgKHZtKSB7XG4gIHZhciBwcm92aWRlID0gdm0uJG9wdGlvbnMucHJvdmlkZTtcbiAgaWYgKHByb3ZpZGUpIHtcbiAgICB2bS5fcHJvdmlkZWQgPSB0eXBlb2YgcHJvdmlkZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBwcm92aWRlLmNhbGwodm0pXG4gICAgICA6IHByb3ZpZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdEluamVjdGlvbnMgKHZtKSB7XG4gIHZhciByZXN1bHQgPSByZXNvbHZlSW5qZWN0KHZtLiRvcHRpb25zLmluamVjdCwgdm0pO1xuICBpZiAocmVzdWx0KSB7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKGZhbHNlKTtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSBcIiArXG4gICAgICAgICAgICBcIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXFxcIlwiICsga2V5ICsgXCJcXFwiXCIsXG4gICAgICAgICAgICB2bVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sIGtleSwgcmVzdWx0W2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlSW5qZWN0IChpbmplY3QsIHZtKSB7XG4gIGlmIChpbmplY3QpIHtcbiAgICAvLyBpbmplY3QgaXMgOmFueSBiZWNhdXNlIGZsb3cgaXMgbm90IHNtYXJ0IGVub3VnaCB0byBmaWd1cmUgb3V0IGNhY2hlZFxuICAgIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXlzID0gaGFzU3ltYm9sXG4gICAgICA/IFJlZmxlY3Qub3duS2V5cyhpbmplY3QpXG4gICAgICA6IE9iamVjdC5rZXlzKGluamVjdCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgLy8gIzY1NzQgaW4gY2FzZSB0aGUgaW5qZWN0IG9iamVjdCBpcyBvYnNlcnZlZC4uLlxuICAgICAgaWYgKGtleSA9PT0gJ19fb2JfXycpIHsgY29udGludWUgfVxuICAgICAgdmFyIHByb3ZpZGVLZXkgPSBpbmplY3Rba2V5XS5mcm9tO1xuICAgICAgdmFyIHNvdXJjZSA9IHZtO1xuICAgICAgd2hpbGUgKHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLl9wcm92aWRlZCAmJiBoYXNPd24oc291cmNlLl9wcm92aWRlZCwgcHJvdmlkZUtleSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHtcbiAgICAgICAgICB2YXIgcHJvdmlkZURlZmF1bHQgPSBpbmplY3Rba2V5XS5kZWZhdWx0O1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdHlwZW9mIHByb3ZpZGVEZWZhdWx0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pXG4gICAgICAgICAgICA6IHByb3ZpZGVEZWZhdWx0O1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuKChcIkluamVjdGlvbiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgbm90IGZvdW5kXCIpLCB2bSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbi8qICAqL1xuXG5cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVzb2x2aW5nIHJhdyBjaGlsZHJlbiBWTm9kZXMgaW50byBhIHNsb3Qgb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZXNvbHZlU2xvdHMgKFxuICBjaGlsZHJlbixcbiAgY29udGV4dFxuKSB7XG4gIGlmICghY2hpbGRyZW4gfHwgIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgIHJldHVybiB7fVxuICB9XG4gIHZhciBzbG90cyA9IHt9O1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIHZhciBkYXRhID0gY2hpbGQuZGF0YTtcbiAgICAvLyByZW1vdmUgc2xvdCBhdHRyaWJ1dGUgaWYgdGhlIG5vZGUgaXMgcmVzb2x2ZWQgYXMgYSBWdWUgc2xvdCBub2RlXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHtcbiAgICAgIGRlbGV0ZSBkYXRhLmF0dHJzLnNsb3Q7XG4gICAgfVxuICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZVxuICAgIC8vIHNhbWUgY29udGV4dC5cbiAgICBpZiAoKGNoaWxkLmNvbnRleHQgPT09IGNvbnRleHQgfHwgY2hpbGQuZm5Db250ZXh0ID09PSBjb250ZXh0KSAmJlxuICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbFxuICAgICkge1xuICAgICAgdmFyIG5hbWUgPSBkYXRhLnNsb3Q7XG4gICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpO1xuICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICBzbG90LnB1c2guYXBwbHkoc2xvdCwgY2hpbGQuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2xvdC5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgKHNsb3RzLmRlZmF1bHQgfHwgKHNsb3RzLmRlZmF1bHQgPSBbXSkpLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuICAvLyBpZ25vcmUgc2xvdHMgdGhhdCBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VcbiAgZm9yICh2YXIgbmFtZSQxIGluIHNsb3RzKSB7XG4gICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkge1xuICAgICAgZGVsZXRlIHNsb3RzW25hbWUkMV07XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90c1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UgKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLmlzQ29tbWVudCAmJiAhbm9kZS5hc3luY0ZhY3RvcnkpIHx8IG5vZGUudGV4dCA9PT0gJyAnXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVTY29wZWRTbG90cyAoXG4gIHNsb3RzLFxuICBub3JtYWxTbG90cyxcbiAgcHJldlNsb3RzXG4pIHtcbiAgdmFyIHJlcztcbiAgdmFyIGhhc05vcm1hbFNsb3RzID0gT2JqZWN0LmtleXMobm9ybWFsU2xvdHMpLmxlbmd0aCA+IDA7XG4gIHZhciBpc1N0YWJsZSA9IHNsb3RzID8gISFzbG90cy4kc3RhYmxlIDogIWhhc05vcm1hbFNsb3RzO1xuICB2YXIga2V5ID0gc2xvdHMgJiYgc2xvdHMuJGtleTtcbiAgaWYgKCFzbG90cykge1xuICAgIHJlcyA9IHt9O1xuICB9IGVsc2UgaWYgKHNsb3RzLl9ub3JtYWxpemVkKSB7XG4gICAgLy8gZmFzdCBwYXRoIDE6IGNoaWxkIGNvbXBvbmVudCByZS1yZW5kZXIgb25seSwgcGFyZW50IGRpZCBub3QgY2hhbmdlXG4gICAgcmV0dXJuIHNsb3RzLl9ub3JtYWxpemVkXG4gIH0gZWxzZSBpZiAoXG4gICAgaXNTdGFibGUgJiZcbiAgICBwcmV2U2xvdHMgJiZcbiAgICBwcmV2U2xvdHMgIT09IGVtcHR5T2JqZWN0ICYmXG4gICAga2V5ID09PSBwcmV2U2xvdHMuJGtleSAmJlxuICAgICFoYXNOb3JtYWxTbG90cyAmJlxuICAgICFwcmV2U2xvdHMuJGhhc05vcm1hbFxuICApIHtcbiAgICAvLyBmYXN0IHBhdGggMjogc3RhYmxlIHNjb3BlZCBzbG90cyB3LyBubyBub3JtYWwgc2xvdHMgdG8gcHJveHksXG4gICAgLy8gb25seSBuZWVkIHRvIG5vcm1hbGl6ZSBvbmNlXG4gICAgcmV0dXJuIHByZXZTbG90c1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IHt9O1xuICAgIGZvciAodmFyIGtleSQxIGluIHNsb3RzKSB7XG4gICAgICBpZiAoc2xvdHNba2V5JDFdICYmIGtleSQxWzBdICE9PSAnJCcpIHtcbiAgICAgICAgcmVzW2tleSQxXSA9IG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSQxLCBzbG90c1trZXkkMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBleHBvc2Ugbm9ybWFsIHNsb3RzIG9uIHNjb3BlZFNsb3RzXG4gIGZvciAodmFyIGtleSQyIGluIG5vcm1hbFNsb3RzKSB7XG4gICAgaWYgKCEoa2V5JDIgaW4gcmVzKSkge1xuICAgICAgcmVzW2tleSQyXSA9IHByb3h5Tm9ybWFsU2xvdChub3JtYWxTbG90cywga2V5JDIpO1xuICAgIH1cbiAgfVxuICAvLyBhdm9yaWF6IHNlZW1zIHRvIG1vY2sgYSBub24tZXh0ZW5zaWJsZSAkc2NvcGVkU2xvdHMgb2JqZWN0XG4gIC8vIGFuZCB3aGVuIHRoYXQgaXMgcGFzc2VkIGRvd24gdGhpcyB3b3VsZCBjYXVzZSBhbiBlcnJvclxuICBpZiAoc2xvdHMgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShzbG90cykpIHtcbiAgICAoc2xvdHMpLl9ub3JtYWxpemVkID0gcmVzO1xuICB9XG4gIGRlZihyZXMsICckc3RhYmxlJywgaXNTdGFibGUpO1xuICBkZWYocmVzLCAnJGtleScsIGtleSk7XG4gIGRlZihyZXMsICckaGFzTm9ybWFsJywgaGFzTm9ybWFsU2xvdHMpO1xuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSwgZm4pIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlcyA9IGFyZ3VtZW50cy5sZW5ndGggPyBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpIDogZm4oe30pO1xuICAgIHJlcyA9IHJlcyAmJiB0eXBlb2YgcmVzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXMpXG4gICAgICA/IFtyZXNdIC8vIHNpbmdsZSB2bm9kZVxuICAgICAgOiBub3JtYWxpemVDaGlsZHJlbihyZXMpO1xuICAgIHJldHVybiByZXMgJiYgKFxuICAgICAgcmVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKHJlcy5sZW5ndGggPT09IDEgJiYgcmVzWzBdLmlzQ29tbWVudCkgLy8gIzk2NThcbiAgICApID8gdW5kZWZpbmVkXG4gICAgICA6IHJlc1xuICB9O1xuICAvLyB0aGlzIGlzIGEgc2xvdCB1c2luZyB0aGUgbmV3IHYtc2xvdCBzeW50YXggd2l0aG91dCBzY29wZS4gYWx0aG91Z2ggaXQgaXNcbiAgLy8gY29tcGlsZWQgYXMgYSBzY29wZWQgc2xvdCwgcmVuZGVyIGZuIHVzZXJzIHdvdWxkIGV4cGVjdCBpdCB0byBiZSBwcmVzZW50XG4gIC8vIG9uIHRoaXMuJHNsb3RzIGJlY2F1c2UgdGhlIHVzYWdlIGlzIHNlbWFudGljYWxseSBhIG5vcm1hbCBzbG90LlxuICBpZiAoZm4ucHJveHkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9ybWFsU2xvdHMsIGtleSwge1xuICAgICAgZ2V0OiBub3JtYWxpemVkLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbmZ1bmN0aW9uIHByb3h5Tm9ybWFsU2xvdChzbG90cywga2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBzbG90c1trZXldOyB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgdi1mb3IgbGlzdHMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckxpc3QgKFxuICB2YWwsXG4gIHJlbmRlclxuKSB7XG4gIHZhciByZXQsIGksIGwsIGtleXMsIGtleTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBsID0gdmFsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHZhbDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXIoaSArIDEsIGkpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgaWYgKGhhc1N5bWJvbCAmJiB2YWxbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0ID0gW107XG4gICAgICB2YXIgaXRlcmF0b3IgPSB2YWxbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgcmV0LnB1c2gocmVuZGVyKHJlc3VsdC52YWx1ZSwgcmV0Lmxlbmd0aCkpO1xuICAgICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghaXNEZWYocmV0KSkge1xuICAgIHJldCA9IFtdO1xuICB9XG4gIChyZXQpLl9pc1ZMaXN0ID0gdHJ1ZTtcbiAgcmV0dXJuIHJldFxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIDxzbG90PlxuICovXG5mdW5jdGlvbiByZW5kZXJTbG90IChcbiAgbmFtZSxcbiAgZmFsbGJhY2ssXG4gIHByb3BzLFxuICBiaW5kT2JqZWN0XG4pIHtcbiAgdmFyIHNjb3BlZFNsb3RGbiA9IHRoaXMuJHNjb3BlZFNsb3RzW25hbWVdO1xuICB2YXIgbm9kZXM7XG4gIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3RcbiAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChiaW5kT2JqZWN0KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNPYmplY3QoYmluZE9iamVjdCkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcHJvcHMgPSBleHRlbmQoZXh0ZW5kKHt9LCBiaW5kT2JqZWN0KSwgcHJvcHMpO1xuICAgIH1cbiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgbm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXSB8fCBmYWxsYmFjaztcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSBwcm9wcyAmJiBwcm9wcy5zbG90O1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5vZGVzXG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWx0ZXIgKGlkKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzS2V5Tm90TWF0Y2ggKGV4cGVjdCwgYWN0dWFsKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHtcbiAgICByZXR1cm4gZXhwZWN0LmluZGV4T2YoYWN0dWFsKSA9PT0gLTFcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWxcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBjaGVja2luZyBrZXlDb2RlcyBmcm9tIGNvbmZpZy5cbiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fa1xuICogcGFzc2luZyBpbiBldmVudEtleU5hbWUgYXMgbGFzdCBhcmd1bWVudCBzZXBhcmF0ZWx5IGZvciBiYWNrd2FyZHMgY29tcGF0XG4gKi9cbmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKFxuICBldmVudEtleUNvZGUsXG4gIGtleSxcbiAgYnVpbHRJbktleUNvZGUsXG4gIGV2ZW50S2V5TmFtZSxcbiAgYnVpbHRJbktleU5hbWVcbikge1xuICB2YXIgbWFwcGVkS2V5Q29kZSA9IGNvbmZpZy5rZXlDb2Rlc1trZXldIHx8IGJ1aWx0SW5LZXlDb2RlO1xuICBpZiAoYnVpbHRJbktleU5hbWUgJiYgZXZlbnRLZXlOYW1lICYmICFjb25maWcua2V5Q29kZXNba2V5XSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpXG4gIH0gZWxzZSBpZiAobWFwcGVkS2V5Q29kZSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKG1hcHBlZEtleUNvZGUsIGV2ZW50S2V5Q29kZSlcbiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHtcbiAgICByZXR1cm4gaHlwaGVuYXRlKGV2ZW50S2V5TmFtZSkgIT09IGtleVxuICB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBtZXJnaW5nIHYtYmluZD1cIm9iamVjdFwiIGludG8gYSBWTm9kZSdzIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoXG4gIGRhdGEsXG4gIHRhZyxcbiAgdmFsdWUsXG4gIGFzUHJvcCxcbiAgaXNTeW5jXG4pIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ3YtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IG9yIEFycmF5IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdG9PYmplY3QodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIGhhc2g7XG4gICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8XG4gICAgICAgICAga2V5ID09PSAnc3R5bGUnIHx8XG4gICAgICAgICAgaXNSZXNlcnZlZEF0dHJpYnV0ZShrZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGhhc2ggPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7XG4gICAgICAgICAgaGFzaCA9IGFzUHJvcCB8fCBjb25maWcubXVzdFVzZVByb3AodGFnLCB0eXBlLCBrZXkpXG4gICAgICAgICAgICA/IGRhdGEuZG9tUHJvcHMgfHwgKGRhdGEuZG9tUHJvcHMgPSB7fSlcbiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FtZWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgICAgdmFyIGh5cGhlbmF0ZWRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgICAgaWYgKCEoY2FtZWxpemVkS2V5IGluIGhhc2gpICYmICEoaHlwaGVuYXRlZEtleSBpbiBoYXNoKSkge1xuICAgICAgICAgIGhhc2hba2V5XSA9IHZhbHVlW2tleV07XG5cbiAgICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgICB2YXIgb24gPSBkYXRhLm9uIHx8IChkYXRhLm9uID0ge30pO1xuICAgICAgICAgICAgb25bKFwidXBkYXRlOlwiICsga2V5KV0gPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0YXRpYyAoXG4gIGluZGV4LFxuICBpc0luRm9yXG4pIHtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTtcbiAgdmFyIHRyZWUgPSBjYWNoZWRbaW5kZXhdO1xuICAvLyBpZiBoYXMgYWxyZWFkeS1yZW5kZXJlZCBzdGF0aWMgdHJlZSBhbmQgbm90IGluc2lkZSB2LWZvcixcbiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuXG4gIGlmICh0cmVlICYmICFpc0luRm9yKSB7XG4gICAgcmV0dXJuIHRyZWVcbiAgfVxuICAvLyBvdGhlcndpc2UsIHJlbmRlciBhIGZyZXNoIHRyZWUuXG4gIHRyZWUgPSBjYWNoZWRbaW5kZXhdID0gdGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbaW5kZXhdLmNhbGwoXG4gICAgdGhpcy5fcmVuZGVyUHJveHksXG4gICAgbnVsbCxcbiAgICB0aGlzIC8vIGZvciByZW5kZXIgZm5zIGdlbmVyYXRlZCBmb3IgZnVuY3Rpb25hbCBjb21wb25lbnQgdGVtcGxhdGVzXG4gICk7XG4gIG1hcmtTdGF0aWModHJlZSwgKFwiX19zdGF0aWNfX1wiICsgaW5kZXgpLCBmYWxzZSk7XG4gIHJldHVybiB0cmVlXG59XG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHYtb25jZS5cbiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LlxuICovXG5mdW5jdGlvbiBtYXJrT25jZSAoXG4gIHRyZWUsXG4gIGluZGV4LFxuICBrZXlcbikge1xuICBtYXJrU3RhdGljKHRyZWUsIChcIl9fb25jZV9fXCIgKyBpbmRleCArIChrZXkgPyAoXCJfXCIgKyBrZXkpIDogXCJcIikpLCB0cnVlKTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuZnVuY3Rpb24gbWFya1N0YXRpYyAoXG4gIHRyZWUsXG4gIGtleSxcbiAgaXNPbmNlXG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJlZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICBtYXJrU3RhdGljTm9kZSh0cmVlW2ldLCAoa2V5ICsgXCJfXCIgKyBpKSwgaXNPbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWFya1N0YXRpY05vZGUodHJlZSwga2V5LCBpc09uY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGF0aWNOb2RlIChub2RlLCBrZXksIGlzT25jZSkge1xuICBub2RlLmlzU3RhdGljID0gdHJ1ZTtcbiAgbm9kZS5rZXkgPSBrZXk7XG4gIG5vZGUuaXNPbmNlID0gaXNPbmNlO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gYmluZE9iamVjdExpc3RlbmVycyAoZGF0YSwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9uID0gZGF0YS5vbiA9IGRhdGEub24gPyBleHRlbmQoe30sIGRhdGEub24pIDoge307XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTtcbiAgICAgICAgdmFyIG91cnMgPSB2YWx1ZVtrZXldO1xuICAgICAgICBvbltrZXldID0gZXhpc3RpbmcgPyBbXS5jb25jYXQoZXhpc3RpbmcsIG91cnMpIDogb3VycztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRTbG90cyAoXG4gIGZucywgLy8gc2VlIGZsb3cvdm5vZGVcbiAgcmVzLFxuICAvLyB0aGUgZm9sbG93aW5nIGFyZSBhZGRlZCBpbiAyLjZcbiAgaGFzRHluYW1pY0tleXMsXG4gIGNvbnRlbnRIYXNoS2V5XG4pIHtcbiAgcmVzID0gcmVzIHx8IHsgJHN0YWJsZTogIWhhc0R5bmFtaWNLZXlzIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNsb3QgPSBmbnNbaV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2xvdCkpIHtcbiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhzbG90LCByZXMsIGhhc0R5bmFtaWNLZXlzKTtcbiAgICB9IGVsc2UgaWYgKHNsb3QpIHtcbiAgICAgIC8vIG1hcmtlciBmb3IgcmV2ZXJzZSBwcm94eWluZyB2LXNsb3Qgd2l0aG91dCBzY29wZSBvbiB0aGlzLiRzbG90c1xuICAgICAgaWYgKHNsb3QucHJveHkpIHtcbiAgICAgICAgc2xvdC5mbi5wcm94eSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXNbc2xvdC5rZXldID0gc2xvdC5mbjtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbnRlbnRIYXNoS2V5KSB7XG4gICAgKHJlcykuJGtleSA9IGNvbnRlbnRIYXNoS2V5O1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGJpbmREeW5hbWljS2V5cyAoYmFzZU9iaiwgdmFsdWVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGtleSA9IHZhbHVlc1tpXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5KSB7XG4gICAgICBiYXNlT2JqW3ZhbHVlc1tpXV0gPSB2YWx1ZXNbaSArIDFdO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBrZXkgIT09ICcnICYmIGtleSAhPT0gbnVsbCkge1xuICAgICAgLy8gbnVsbCBpcyBhIHNwZWljYWwgdmFsdWUgZm9yIGV4cGxpY2l0bHkgcmVtb3ZpbmcgYSBiaW5kaW5nXG4gICAgICB3YXJuKFxuICAgICAgICAoXCJJbnZhbGlkIHZhbHVlIGZvciBkeW5hbWljIGRpcmVjdGl2ZSBhcmd1bWVudCAoZXhwZWN0ZWQgc3RyaW5nIG9yIG51bGwpOiBcIiArIGtleSksXG4gICAgICAgIHRoaXNcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiYXNlT2JqXG59XG5cbi8vIGhlbHBlciB0byBkeW5hbWljYWxseSBhcHBlbmQgbW9kaWZpZXIgcnVudGltZSBtYXJrZXJzIHRvIGV2ZW50IG5hbWVzLlxuLy8gZW5zdXJlIG9ubHkgYXBwZW5kIHdoZW4gdmFsdWUgaXMgYWxyZWFkeSBzdHJpbmcsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGNhc3Rcbi8vIHRvIHN0cmluZyBhbmQgY2F1c2UgdGhlIHR5cGUgY2hlY2sgdG8gbWlzcy5cbmZ1bmN0aW9uIHByZXBlbmRNb2RpZmllciAodmFsdWUsIHN5bWJvbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHN5bWJvbCArIHZhbHVlIDogdmFsdWVcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluc3RhbGxSZW5kZXJIZWxwZXJzICh0YXJnZXQpIHtcbiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7XG4gIHRhcmdldC5fbiA9IHRvTnVtYmVyO1xuICB0YXJnZXQuX3MgPSB0b1N0cmluZztcbiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDtcbiAgdGFyZ2V0Ll90ID0gcmVuZGVyU2xvdDtcbiAgdGFyZ2V0Ll9xID0gbG9vc2VFcXVhbDtcbiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mO1xuICB0YXJnZXQuX20gPSByZW5kZXJTdGF0aWM7XG4gIHRhcmdldC5fZiA9IHJlc29sdmVGaWx0ZXI7XG4gIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7XG4gIHRhcmdldC5fYiA9IGJpbmRPYmplY3RQcm9wcztcbiAgdGFyZ2V0Ll92ID0gY3JlYXRlVGV4dFZOb2RlO1xuICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICB0YXJnZXQuX3UgPSByZXNvbHZlU2NvcGVkU2xvdHM7XG4gIHRhcmdldC5fZyA9IGJpbmRPYmplY3RMaXN0ZW5lcnM7XG4gIHRhcmdldC5fZCA9IGJpbmREeW5hbWljS2V5cztcbiAgdGFyZ2V0Ll9wID0gcHJlcGVuZE1vZGlmaWVyO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgKFxuICBkYXRhLFxuICBwcm9wcyxcbiAgY2hpbGRyZW4sXG4gIHBhcmVudCxcbiAgQ3RvclxuKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zO1xuICAvLyBlbnN1cmUgdGhlIGNyZWF0ZUVsZW1lbnQgZnVuY3Rpb24gaW4gZnVuY3Rpb25hbCBjb21wb25lbnRzXG4gIC8vIGdldHMgYSB1bmlxdWUgY29udGV4dCAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0IG5hbWVkIHNsb3QgY2hlY2tcbiAgdmFyIGNvbnRleHRWbTtcbiAgaWYgKGhhc093bihwYXJlbnQsICdfdWlkJykpIHtcbiAgICBjb250ZXh0Vm0gPSBPYmplY3QuY3JlYXRlKHBhcmVudCk7XG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgY29udGV4dFZtLl9vcmlnaW5hbCA9IHBhcmVudDtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC5cbiAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgYXJlIGFibGUgdG8gZ2V0IGEgaG9sZCB0byB0aGVcbiAgICAvLyByZWFsIGNvbnRleHQgaW5zdGFuY2UuXG4gICAgY29udGV4dFZtID0gcGFyZW50O1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHBhcmVudCA9IHBhcmVudC5fb3JpZ2luYWw7XG4gIH1cbiAgdmFyIGlzQ29tcGlsZWQgPSBpc1RydWUob3B0aW9ucy5fY29tcGlsZWQpO1xuICB2YXIgbmVlZE5vcm1hbGl6YXRpb24gPSAhaXNDb21waWxlZDtcblxuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMubGlzdGVuZXJzID0gZGF0YS5vbiB8fCBlbXB0eU9iamVjdDtcbiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTtcbiAgdGhpcy5zbG90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMkMS4kc2xvdHMpIHtcbiAgICAgIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBkYXRhLnNjb3BlZFNsb3RzLFxuICAgICAgICB0aGlzJDEuJHNsb3RzID0gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcyQxLiRzbG90c1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2NvcGVkU2xvdHMnLCAoe1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKGRhdGEuc2NvcGVkU2xvdHMsIHRoaXMuc2xvdHMoKSlcbiAgICB9XG4gIH0pKTtcblxuICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChpc0NvbXBpbGVkKSB7XG4gICAgLy8gZXhwb3NpbmcgJG9wdGlvbnMgZm9yIHJlbmRlclN0YXRpYygpXG4gICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgLy8gcHJlLXJlc29sdmUgc2xvdHMgZm9yIHJlbmRlclNsb3QoKVxuICAgIHRoaXMuJHNsb3RzID0gdGhpcy5zbG90cygpO1xuICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gbm9ybWFsaXplU2NvcGVkU2xvdHMoZGF0YS5zY29wZWRTbG90cywgdGhpcy4kc2xvdHMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuX3Njb3BlSWQpIHtcbiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHtcbiAgICAgIHZhciB2bm9kZSA9IGNyZWF0ZUVsZW1lbnQoY29udGV4dFZtLCBhLCBiLCBjLCBkLCBuZWVkTm9ybWFsaXphdGlvbik7XG4gICAgICBpZiAodm5vZGUgJiYgIUFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7XG4gICAgICAgIHZub2RlLmZuQ29udGV4dCA9IHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2bm9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9O1xuICB9XG59XG5cbmluc3RhbGxSZW5kZXJIZWxwZXJzKEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0LnByb3RvdHlwZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKFxuICBDdG9yLFxuICBwcm9wc0RhdGEsXG4gIGRhdGEsXG4gIGNvbnRleHRWbSxcbiAgY2hpbGRyZW5cbikge1xuICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9ucztcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7XG4gIGlmIChpc0RlZihwcm9wT3B0aW9ucykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9XG4gICAgaWYgKGlzRGVmKGRhdGEucHJvcHMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEucHJvcHMpOyB9XG4gIH1cblxuICB2YXIgcmVuZGVyQ29udGV4dCA9IG5ldyBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dChcbiAgICBkYXRhLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbnRleHRWbSxcbiAgICBDdG9yXG4gICk7XG5cbiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTtcblxuICBpZiAodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucywgcmVuZGVyQ29udGV4dClcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkge1xuICAgIHZhciB2bm9kZXMgPSBub3JtYWxpemVDaGlsZHJlbih2bm9kZSkgfHwgW107XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW2ldID0gY2xvbmVBbmRNYXJrRnVuY3Rpb25hbFJlc3VsdCh2bm9kZXNbaV0sIGRhdGEsIHJlbmRlckNvbnRleHQucGFyZW50LCBvcHRpb25zLCByZW5kZXJDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQgKHZub2RlLCBkYXRhLCBjb250ZXh0Vm0sIG9wdGlvbnMsIHJlbmRlckNvbnRleHQpIHtcbiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWRcbiAgLy8gKGUuZy4gaXQgd2FzIGZyb20gYSBjYWNoZWQgbm9ybWFsIHNsb3QpIHRoZSBmbkNvbnRleHQgY2F1c2VzIG5hbWVkIHNsb3RzXG4gIC8vIHRoYXQgc2hvdWxkIG5vdCBiZSBtYXRjaGVkIHRvIG1hdGNoLlxuICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgY2xvbmUuZm5Db250ZXh0ID0gY29udGV4dFZtO1xuICBjbG9uZS5mbk9wdGlvbnMgPSBvcHRpb25zO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIChjbG9uZS5kZXZ0b29sc01ldGEgPSBjbG9uZS5kZXZ0b29sc01ldGEgfHwge30pLnJlbmRlckNvbnRleHQgPSByZW5kZXJDb250ZXh0O1xuICB9XG4gIGlmIChkYXRhLnNsb3QpIHtcbiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDtcbiAgfVxuICByZXR1cm4gY2xvbmVcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm9wcyAodG8sIGZyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICB0b1tjYW1lbGl6ZShrZXkpXSA9IGZyb21ba2V5XTtcbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbi8qICAqL1xuXG4vKiAgKi9cblxuLy8gaW5saW5lIGhvb2tzIHRvIGJlIGludm9rZWQgb24gY29tcG9uZW50IFZOb2RlcyBkdXJpbmcgcGF0Y2hcbnZhciBjb21wb25lbnRWTm9kZUhvb2tzID0ge1xuICBpbml0OiBmdW5jdGlvbiBpbml0ICh2bm9kZSwgaHlkcmF0aW5nKSB7XG4gICAgaWYgKFxuICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgJiZcbiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiZcbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlXG4gICAgKSB7XG4gICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2hcbiAgICAgIHZhciBtb3VudGVkTm9kZSA9IHZub2RlOyAvLyB3b3JrIGFyb3VuZCBmbG93XG4gICAgICBjb21wb25lbnRWTm9kZUhvb2tzLnByZXBhdGNoKG1vdW50ZWROb2RlLCBtb3VudGVkTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGb3JWbm9kZShcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGFjdGl2ZUluc3RhbmNlXG4gICAgICApO1xuICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTtcbiAgICB9XG4gIH0sXG5cbiAgcHJlcGF0Y2g6IGZ1bmN0aW9uIHByZXBhdGNoIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICB1cGRhdGVDaGlsZENvbXBvbmVudChcbiAgICAgIGNoaWxkLFxuICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHNcbiAgICAgIG9wdGlvbnMubGlzdGVuZXJzLCAvLyB1cGRhdGVkIGxpc3RlbmVyc1xuICAgICAgdm5vZGUsIC8vIG5ldyBwYXJlbnQgdm5vZGVcbiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuXG4gICAgKTtcbiAgfSxcblxuICBpbnNlcnQ6IGZ1bmN0aW9uIGluc2VydCAodm5vZGUpIHtcbiAgICB2YXIgY29udGV4dCA9IHZub2RlLmNvbnRleHQ7XG4gICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNNb3VudGVkKSB7XG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5faXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpO1xuICAgIH1cbiAgICBpZiAodm5vZGUuZGF0YS5rZWVwQWxpdmUpIHtcbiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHtcbiAgICAgICAgLy8gdnVlLXJvdXRlciMxMjEyXG4gICAgICAgIC8vIER1cmluZyB1cGRhdGVzLCBhIGtlcHQtYWxpdmUgY29tcG9uZW50J3MgY2hpbGQgY29tcG9uZW50cyBtYXlcbiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzXG4gICAgICAgIC8vIG9uIGluY29ycmVjdCBjaGlsZHJlbi4gSW5zdGVhZCB3ZSBwdXNoIHRoZW0gaW50byBhIHF1ZXVlIHdoaWNoIHdpbGxcbiAgICAgICAgLy8gYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSB3aG9sZSBwYXRjaCBwcm9jZXNzIGVuZGVkLlxuICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3kgKHZub2RlKSB7XG4gICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHtcbiAgICAgIGlmICghdm5vZGUuZGF0YS5rZWVwQWxpdmUpIHtcbiAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxudmFyIGhvb2tzVG9NZXJnZSA9IE9iamVjdC5rZXlzKGNvbXBvbmVudFZOb2RlSG9va3MpO1xuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKFxuICBDdG9yLFxuICBkYXRhLFxuICBjb250ZXh0LFxuICBjaGlsZHJlbixcbiAgdGFnXG4pIHtcbiAgaWYgKGlzVW5kZWYoQ3RvcikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBiYXNlQ3RvciA9IGNvbnRleHQuJG9wdGlvbnMuX2Jhc2U7XG5cbiAgLy8gcGxhaW4gb3B0aW9ucyBvYmplY3Q6IHR1cm4gaXQgaW50byBhIGNvbnN0cnVjdG9yXG4gIGlmIChpc09iamVjdChDdG9yKSkge1xuICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7XG4gIH1cblxuICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksXG4gIC8vIHJlamVjdC5cbiAgaWYgKHR5cGVvZiBDdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oKFwiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogXCIgKyAoU3RyaW5nKEN0b3IpKSksIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIGFzeW5jIGNvbXBvbmVudFxuICB2YXIgYXN5bmNGYWN0b3J5O1xuICBpZiAoaXNVbmRlZihDdG9yLmNpZCkpIHtcbiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yO1xuICAgIEN0b3IgPSByZXNvbHZlQXN5bmNDb21wb25lbnQoYXN5bmNGYWN0b3J5LCBiYXNlQ3Rvcik7XG4gICAgaWYgKEN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZFxuICAgICAgLy8gYXMgYSBjb21tZW50IG5vZGUgYnV0IHByZXNlcnZlcyBhbGwgdGhlIHJhdyBpbmZvcm1hdGlvbiBmb3IgdGhlIG5vZGUuXG4gICAgICAvLyB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGZvciBhc3luYyBzZXJ2ZXItcmVuZGVyaW5nIGFuZCBoeWRyYXRpb24uXG4gICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcihcbiAgICAgICAgYXN5bmNGYWN0b3J5LFxuICAgICAgICBkYXRhLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgdGFnXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgZGF0YSA9IGRhdGEgfHwge307XG5cbiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlclxuICAvLyBjb21wb25lbnQgY29uc3RydWN0b3IgY3JlYXRpb25cbiAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyhDdG9yKTtcblxuICAvLyB0cmFuc2Zvcm0gY29tcG9uZW50IHYtbW9kZWwgZGF0YSBpbnRvIHByb3BzICYgZXZlbnRzXG4gIGlmIChpc0RlZihkYXRhLm1vZGVsKSkge1xuICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7XG4gIH1cblxuICAvLyBleHRyYWN0IHByb3BzXG4gIHZhciBwcm9wc0RhdGEgPSBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhKGRhdGEsIEN0b3IsIHRhZyk7XG5cbiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnRcbiAgaWYgKGlzVHJ1ZShDdG9yLm9wdGlvbnMuZnVuY3Rpb25hbCkpIHtcbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb25hbENvbXBvbmVudChDdG9yLCBwcm9wc0RhdGEsIGRhdGEsIGNvbnRleHQsIGNoaWxkcmVuKVxuICB9XG5cbiAgLy8gZXh0cmFjdCBsaXN0ZW5lcnMsIHNpbmNlIHRoZXNlIG5lZWRzIHRvIGJlIHRyZWF0ZWQgYXNcbiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnNcbiAgdmFyIGxpc3RlbmVycyA9IGRhdGEub247XG4gIC8vIHJlcGxhY2Ugd2l0aCBsaXN0ZW5lcnMgd2l0aCAubmF0aXZlIG1vZGlmaWVyXG4gIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLlxuICBkYXRhLm9uID0gZGF0YS5uYXRpdmVPbjtcblxuICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHtcbiAgICAvLyBhYnN0cmFjdCBjb21wb25lbnRzIGRvIG5vdCBrZWVwIGFueXRoaW5nXG4gICAgLy8gb3RoZXIgdGhhbiBwcm9wcyAmIGxpc3RlbmVycyAmIHNsb3RcblxuICAgIC8vIHdvcmsgYXJvdW5kIGZsb3dcbiAgICB2YXIgc2xvdCA9IGRhdGEuc2xvdDtcbiAgICBkYXRhID0ge307XG4gICAgaWYgKHNsb3QpIHtcbiAgICAgIGRhdGEuc2xvdCA9IHNsb3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlXG4gIGluc3RhbGxDb21wb25lbnRIb29rcyhkYXRhKTtcblxuICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZVxuICB2YXIgbmFtZSA9IEN0b3Iub3B0aW9ucy5uYW1lIHx8IHRhZztcbiAgdmFyIHZub2RlID0gbmV3IFZOb2RlKFxuICAgIChcInZ1ZS1jb21wb25lbnQtXCIgKyAoQ3Rvci5jaWQpICsgKG5hbWUgPyAoXCItXCIgKyBuYW1lKSA6ICcnKSksXG4gICAgZGF0YSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dCxcbiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LFxuICAgIGFzeW5jRmFjdG9yeVxuICApO1xuXG4gIHJldHVybiB2bm9kZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlIChcbiAgdm5vZGUsIC8vIHdlIGtub3cgaXQncyBNb3VudGVkQ29tcG9uZW50Vk5vZGUgYnV0IGZsb3cgZG9lc24ndFxuICBwYXJlbnQgLy8gYWN0aXZlSW5zdGFuY2UgaW4gbGlmZWN5Y2xlIHN0YXRlXG4pIHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgX2lzQ29tcG9uZW50OiB0cnVlLFxuICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRcbiAgfTtcbiAgLy8gY2hlY2sgaW5saW5lLXRlbXBsYXRlIHJlbmRlciBmdW5jdGlvbnNcbiAgdmFyIGlubGluZVRlbXBsYXRlID0gdm5vZGUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtcbiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkge1xuICAgIG9wdGlvbnMucmVuZGVyID0gaW5saW5lVGVtcGxhdGUucmVuZGVyO1xuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gaW5saW5lVGVtcGxhdGUuc3RhdGljUmVuZGVyRm5zO1xuICB9XG4gIHJldHVybiBuZXcgdm5vZGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGluc3RhbGxDb21wb25lbnRIb29rcyAoZGF0YSkge1xuICB2YXIgaG9va3MgPSBkYXRhLmhvb2sgfHwgKGRhdGEuaG9vayA9IHt9KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gaG9va3NUb01lcmdlW2ldO1xuICAgIHZhciBleGlzdGluZyA9IGhvb2tzW2tleV07XG4gICAgdmFyIHRvTWVyZ2UgPSBjb21wb25lbnRWTm9kZUhvb2tzW2tleV07XG4gICAgaWYgKGV4aXN0aW5nICE9PSB0b01lcmdlICYmICEoZXhpc3RpbmcgJiYgZXhpc3RpbmcuX21lcmdlZCkpIHtcbiAgICAgIGhvb2tzW2tleV0gPSBleGlzdGluZyA/IG1lcmdlSG9vayQxKHRvTWVyZ2UsIGV4aXN0aW5nKSA6IHRvTWVyZ2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlSG9vayQxIChmMSwgZjIpIHtcbiAgdmFyIG1lcmdlZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgLy8gZmxvdyBjb21wbGFpbnMgYWJvdXQgZXh0cmEgYXJncyB3aGljaCBpcyB3aHkgd2UgdXNlIGFueVxuICAgIGYxKGEsIGIpO1xuICAgIGYyKGEsIGIpO1xuICB9O1xuICBtZXJnZWQuX21lcmdlZCA9IHRydWU7XG4gIHJldHVybiBtZXJnZWRcbn1cblxuLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50b1xuLy8gcHJvcCBhbmQgZXZlbnQgaGFuZGxlciByZXNwZWN0aXZlbHkuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Nb2RlbCAob3B0aW9ucywgZGF0YSkge1xuICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJztcbiAgdmFyIGV2ZW50ID0gKG9wdGlvbnMubW9kZWwgJiYgb3B0aW9ucy5tb2RlbC5ldmVudCkgfHwgJ2lucHV0J1xuICA7KGRhdGEuYXR0cnMgfHwgKGRhdGEuYXR0cnMgPSB7fSkpW3Byb3BdID0gZGF0YS5tb2RlbC52YWx1ZTtcbiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTtcbiAgdmFyIGV4aXN0aW5nID0gb25bZXZlbnRdO1xuICB2YXIgY2FsbGJhY2sgPSBkYXRhLm1vZGVsLmNhbGxiYWNrO1xuICBpZiAoaXNEZWYoZXhpc3RpbmcpKSB7XG4gICAgaWYgKFxuICAgICAgQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyBleGlzdGluZy5pbmRleE9mKGNhbGxiYWNrKSA9PT0gLTFcbiAgICAgICAgOiBleGlzdGluZyAhPT0gY2FsbGJhY2tcbiAgICApIHtcbiAgICAgIG9uW2V2ZW50XSA9IFtjYWxsYmFja10uY29uY2F0KGV4aXN0aW5nKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb25bZXZlbnRdID0gY2FsbGJhY2s7XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBTSU1QTEVfTk9STUFMSVpFID0gMTtcbnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjtcblxuLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgcHJvdmlkaW5nIGEgbW9yZSBmbGV4aWJsZSBpbnRlcmZhY2Vcbi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvd1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCAoXG4gIGNvbnRleHQsXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIG5vcm1hbGl6YXRpb25UeXBlLFxuICBhbHdheXNOb3JtYWxpemVcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIG5vcm1hbGl6YXRpb25UeXBlID0gY2hpbGRyZW47XG4gICAgY2hpbGRyZW4gPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGlzVHJ1ZShhbHdheXNOb3JtYWxpemUpKSB7XG4gICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFO1xuICB9XG4gIHJldHVybiBfY3JlYXRlRWxlbWVudChjb250ZXh0LCB0YWcsIGRhdGEsIGNoaWxkcmVuLCBub3JtYWxpemF0aW9uVHlwZSlcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnQgKFxuICBjb250ZXh0LFxuICB0YWcsXG4gIGRhdGEsXG4gIGNoaWxkcmVuLFxuICBub3JtYWxpemF0aW9uVHlwZVxuKSB7XG4gIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiQXZvaWQgdXNpbmcgb2JzZXJ2ZWQgZGF0YSBvYmplY3QgYXMgdm5vZGUgZGF0YTogXCIgKyAoSlNPTi5zdHJpbmdpZnkoZGF0YSkpICsgXCJcXG5cIiArXG4gICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyBvYmplY3Qgc3ludGF4IGluIHYtYmluZFxuICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHtcbiAgICB0YWcgPSBkYXRhLmlzO1xuICB9XG4gIGlmICghdGFnKSB7XG4gICAgLy8gaW4gY2FzZSBvZiBjb21wb25lbnQgOmlzIHNldCB0byBmYWxzeSB2YWx1ZVxuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyB3YXJuIGFnYWluc3Qgbm9uLXByaW1pdGl2ZSBrZXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICBpc0RlZihkYXRhKSAmJiBpc0RlZihkYXRhLmtleSkgJiYgIWlzUHJpbWl0aXZlKGRhdGEua2V5KVxuICApIHtcbiAgICB7XG4gICAgICB3YXJuKFxuICAgICAgICAnQXZvaWQgdXNpbmcgbm9uLXByaW1pdGl2ZSB2YWx1ZSBhcyBrZXksICcgK1xuICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLFxuICAgICAgICBjb250ZXh0XG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvLyBzdXBwb3J0IHNpbmdsZSBmdW5jdGlvbiBjaGlsZHJlbiBhcyBkZWZhdWx0IHNjb3BlZCBzbG90XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJlxuICAgIHR5cGVvZiBjaGlsZHJlblswXSA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnNjb3BlZFNsb3RzID0geyBkZWZhdWx0OiBjaGlsZHJlblswXSB9O1xuICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6YXRpb25UeXBlID09PSBBTFdBWVNfTk9STUFMSVpFKSB7XG4gICAgY2hpbGRyZW4gPSBub3JtYWxpemVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHtcbiAgICBjaGlsZHJlbiA9IHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfVxuICB2YXIgdm5vZGUsIG5zO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgQ3RvcjtcbiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpO1xuICAgIGlmIChjb25maWcuaXNSZXNlcnZlZFRhZyh0YWcpKSB7XG4gICAgICAvLyBwbGF0Zm9ybSBidWlsdC1pbiBlbGVtZW50c1xuICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoXG4gICAgICAgIGNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0YWcpLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICgoIWRhdGEgfHwgIWRhdGEucHJlKSAmJiBpc0RlZihDdG9yID0gcmVzb2x2ZUFzc2V0KGNvbnRleHQuJG9wdGlvbnMsICdjb21wb25lbnRzJywgdGFnKSkpIHtcbiAgICAgIC8vIGNvbXBvbmVudFxuICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVua25vd24gb3IgdW5saXN0ZWQgbmFtZXNwYWNlZCBlbGVtZW50c1xuICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHNcbiAgICAgIC8vIHBhcmVudCBub3JtYWxpemVzIGNoaWxkcmVuXG4gICAgICB2bm9kZSA9IG5ldyBWTm9kZShcbiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGRpcmVjdCBjb21wb25lbnQgb3B0aW9ucyAvIGNvbnN0cnVjdG9yXG4gICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgcmV0dXJuIHZub2RlXG4gIH0gZWxzZSBpZiAoaXNEZWYodm5vZGUpKSB7XG4gICAgaWYgKGlzRGVmKG5zKSkgeyBhcHBseU5TKHZub2RlLCBucyk7IH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH1cbiAgICByZXR1cm4gdm5vZGVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOUyAodm5vZGUsIG5zLCBmb3JjZSkge1xuICB2bm9kZS5ucyA9IG5zO1xuICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyB1c2UgZGVmYXVsdCBuYW1lc3BhY2UgaW5zaWRlIGZvcmVpZ25PYmplY3RcbiAgICBucyA9IHVuZGVmaW5lZDtcbiAgICBmb3JjZSA9IHRydWU7XG4gIH1cbiAgaWYgKGlzRGVmKHZub2RlLmNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSB2bm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc0RlZihjaGlsZC50YWcpICYmIChcbiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7XG4gICAgICAgIGFwcGx5TlMoY2hpbGQsIG5zLCBmb3JjZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIHJlZiAjNTMxOFxuLy8gbmVjZXNzYXJ5IHRvIGVuc3VyZSBwYXJlbnQgcmUtcmVuZGVyIHdoZW4gZGVlcCBiaW5kaW5ncyBsaWtlIDpzdHlsZSBhbmRcbi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzXG5mdW5jdGlvbiByZWdpc3RlckRlZXBCaW5kaW5ncyAoZGF0YSkge1xuICBpZiAoaXNPYmplY3QoZGF0YS5zdHlsZSkpIHtcbiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTtcbiAgfVxuICBpZiAoaXNPYmplY3QoZGF0YS5jbGFzcykpIHtcbiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHtcbiAgdm0uX3Zub2RlID0gbnVsbDsgLy8gdGhlIHJvb3Qgb2YgdGhlIGNoaWxkIHRyZWVcbiAgdm0uX3N0YXRpY1RyZWVzID0gbnVsbDsgLy8gdi1vbmNlIGNhY2hlZCB0cmVlc1xuICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zO1xuICB2YXIgcGFyZW50Vm5vZGUgPSB2bS4kdm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcbiAgdmFyIHJlbmRlckNvbnRleHQgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5jb250ZXh0O1xuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpO1xuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdDtcbiAgLy8gYmluZCB0aGUgY3JlYXRlRWxlbWVudCBmbiB0byB0aGlzIGluc3RhbmNlXG4gIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuXG4gIC8vIGFyZ3Mgb3JkZXI6IHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8gaW50ZXJuYWwgdmVyc2lvbiBpcyB1c2VkIGJ5IHJlbmRlciBmdW5jdGlvbnMgY29tcGlsZWQgZnJvbSB0ZW1wbGF0ZXNcbiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9O1xuICAvLyBub3JtYWxpemF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGZvciB0aGUgcHVibGljIHZlcnNpb24sIHVzZWQgaW5cbiAgLy8gdXNlci13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMuXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9O1xuXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMgYXJlIGV4cG9zZWQgZm9yIGVhc2llciBIT0MgY3JlYXRpb24uXG4gIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWRcbiAgdmFyIHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5kYXRhO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJiYgd2FybihcIiRhdHRycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGxpc3RlbmVycycsIG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyB8fCBlbXB0eU9iamVjdCwgZnVuY3Rpb24gKCkge1xuICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKFwiJGxpc3RlbmVycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLmF0dHJzIHx8IGVtcHR5T2JqZWN0LCBudWxsLCB0cnVlKTtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpO1xuICB9XG59XG5cbnZhciBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBudWxsO1xuXG5mdW5jdGlvbiByZW5kZXJNaXhpbiAoVnVlKSB7XG4gIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzXG4gIGluc3RhbGxSZW5kZXJIZWxwZXJzKFZ1ZS5wcm90b3R5cGUpO1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgcmV0dXJuIG5leHRUaWNrKGZuLCB0aGlzKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIHZhciByZWYgPSB2bS4kb3B0aW9ucztcbiAgICB2YXIgcmVuZGVyID0gcmVmLnJlbmRlcjtcbiAgICB2YXIgX3BhcmVudFZub2RlID0gcmVmLl9wYXJlbnRWbm9kZTtcblxuICAgIGlmIChfcGFyZW50Vm5vZGUpIHtcbiAgICAgIHZtLiRzY29wZWRTbG90cyA9IG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBfcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyxcbiAgICAgICAgdm0uJHNsb3RzLFxuICAgICAgICB2bS4kc2NvcGVkU2xvdHNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2Vzc1xuICAgIC8vIHRvIHRoZSBkYXRhIG9uIHRoZSBwbGFjZWhvbGRlciBub2RlLlxuICAgIHZtLiR2bm9kZSA9IF9wYXJlbnRWbm9kZTtcbiAgICAvLyByZW5kZXIgc2VsZlxuICAgIHZhciB2bm9kZTtcbiAgICB0cnkge1xuICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIG1haW50YWluIGEgc3RhY2sgYmVjYXVlcyBhbGwgcmVuZGVyIGZucyBhcmUgY2FsbGVkXG4gICAgICAvLyBzZXBhcmF0ZWx5IGZyb20gb25lIGFub3RoZXIuIE5lc3RlZCBjb21wb25lbnQncyByZW5kZXIgZm5zIGFyZSBjYWxsZWRcbiAgICAgIC8vIHdoZW4gcGFyZW50IGNvbXBvbmVudCBpcyBwYXRjaGVkLlxuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gdm07XG4gICAgICB2bm9kZSA9IHJlbmRlci5jYWxsKHZtLl9yZW5kZXJQcm94eSwgdm0uJGNyZWF0ZUVsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlclwiKTtcbiAgICAgIC8vIHJldHVybiBlcnJvciByZW5kZXIgcmVzdWx0LFxuICAgICAgLy8gb3IgcHJldmlvdXMgdm5vZGUgdG8gcHJldmVudCByZW5kZXIgZXJyb3IgY2F1c2luZyBibGFuayBjb21wb25lbnRcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB2bS4kb3B0aW9ucy5yZW5kZXJFcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlckVycm9yXCIpO1xuICAgICAgICAgIHZub2RlID0gdm0uX3Zub2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gICAgLy8gaWYgdGhlIHJldHVybmVkIGFycmF5IGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgbm9kZSwgYWxsb3cgaXRcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2bm9kZSkgJiYgdm5vZGUubGVuZ3RoID09PSAxKSB7XG4gICAgICB2bm9kZSA9IHZub2RlWzBdO1xuICAgIH1cbiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0XG4gICAgaWYgKCEodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ011bHRpcGxlIHJvb3Qgbm9kZXMgcmV0dXJuZWQgZnJvbSByZW5kZXIgZnVuY3Rpb24uIFJlbmRlciBmdW5jdGlvbiAnICtcbiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBjcmVhdGVFbXB0eVZOb2RlKCk7XG4gICAgfVxuICAgIC8vIHNldCBwYXJlbnRcbiAgICB2bm9kZS5wYXJlbnQgPSBfcGFyZW50Vm5vZGU7XG4gICAgcmV0dXJuIHZub2RlXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBlbnN1cmVDdG9yIChjb21wLCBiYXNlKSB7XG4gIGlmIChcbiAgICBjb21wLl9fZXNNb2R1bGUgfHxcbiAgICAoaGFzU3ltYm9sICYmIGNvbXBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ01vZHVsZScpXG4gICkge1xuICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KGNvbXApXG4gICAgPyBiYXNlLmV4dGVuZChjb21wKVxuICAgIDogY29tcFxufVxuXG5mdW5jdGlvbiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyIChcbiAgZmFjdG9yeSxcbiAgZGF0YSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHRhZ1xuKSB7XG4gIHZhciBub2RlID0gY3JlYXRlRW1wdHlWTm9kZSgpO1xuICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7XG4gIG5vZGUuYXN5bmNNZXRhID0geyBkYXRhOiBkYXRhLCBjb250ZXh0OiBjb250ZXh0LCBjaGlsZHJlbjogY2hpbGRyZW4sIHRhZzogdGFnIH07XG4gIHJldHVybiBub2RlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBc3luY0NvbXBvbmVudCAoXG4gIGZhY3RvcnksXG4gIGJhc2VDdG9yXG4pIHtcbiAgaWYgKGlzVHJ1ZShmYWN0b3J5LmVycm9yKSAmJiBpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5lcnJvckNvbXBcbiAgfVxuXG4gIGlmIChpc0RlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cblxuICB2YXIgb3duZXIgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gIGlmIChvd25lciAmJiBpc0RlZihmYWN0b3J5Lm93bmVycykgJiYgZmFjdG9yeS5vd25lcnMuaW5kZXhPZihvd25lcikgPT09IC0xKSB7XG4gICAgLy8gYWxyZWFkeSBwZW5kaW5nXG4gICAgZmFjdG9yeS5vd25lcnMucHVzaChvd25lcik7XG4gIH1cblxuICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICB9XG5cbiAgaWYgKG93bmVyICYmICFpc0RlZihmYWN0b3J5Lm93bmVycykpIHtcbiAgICB2YXIgb3duZXJzID0gZmFjdG9yeS5vd25lcnMgPSBbb3duZXJdO1xuICAgIHZhciBzeW5jID0gdHJ1ZTtcbiAgICB2YXIgdGltZXJMb2FkaW5nID0gbnVsbDtcbiAgICB2YXIgdGltZXJUaW1lb3V0ID0gbnVsbFxuXG4gICAgOyhvd25lcikuJG9uKCdob29rOmRlc3Ryb3llZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlbW92ZShvd25lcnMsIG93bmVyKTsgfSk7XG5cbiAgICB2YXIgZm9yY2VSZW5kZXIgPSBmdW5jdGlvbiAocmVuZGVyQ29tcGxldGVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG93bmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgKG93bmVyc1tpXSkuJGZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW5kZXJDb21wbGV0ZWQpIHtcbiAgICAgICAgb3duZXJzLmxlbmd0aCA9IDA7XG4gICAgICAgIGlmICh0aW1lckxvYWRpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJMb2FkaW5nKTtcbiAgICAgICAgICB0aW1lckxvYWRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lclRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJUaW1lb3V0KTtcbiAgICAgICAgICB0aW1lclRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciByZXNvbHZlID0gb25jZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAvLyBjYWNoZSByZXNvbHZlZFxuICAgICAgZmFjdG9yeS5yZXNvbHZlZCA9IGVuc3VyZUN0b3IocmVzLCBiYXNlQ3Rvcik7XG4gICAgICAvLyBpbnZva2UgY2FsbGJhY2tzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBzeW5jaHJvbm91cyByZXNvbHZlXG4gICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUilcbiAgICAgIGlmICghc3luYykge1xuICAgICAgICBmb3JjZVJlbmRlcih0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG93bmVycy5sZW5ndGggPSAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB0byByZXNvbHZlIGFzeW5jIGNvbXBvbmVudDogXCIgKyAoU3RyaW5nKGZhY3RvcnkpKSArXG4gICAgICAgIChyZWFzb24gPyAoXCJcXG5SZWFzb246IFwiICsgcmVhc29uKSA6ICcnKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZvcmNlUmVuZGVyKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgIGlmIChpc09iamVjdChyZXMpKSB7XG4gICAgICBpZiAoaXNQcm9taXNlKHJlcykpIHtcbiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZVxuICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgICAgICAgIHJlcy50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNQcm9taXNlKHJlcy5jb21wb25lbnQpKSB7XG4gICAgICAgIHJlcy5jb21wb25lbnQudGhlbihyZXNvbHZlLCByZWplY3QpO1xuXG4gICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7XG4gICAgICAgICAgZmFjdG9yeS5lcnJvckNvbXAgPSBlbnN1cmVDdG9yKHJlcy5lcnJvciwgYmFzZUN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy5sb2FkaW5nKSkge1xuICAgICAgICAgIGZhY3RvcnkubG9hZGluZ0NvbXAgPSBlbnN1cmVDdG9yKHJlcy5sb2FkaW5nLCBiYXNlQ3Rvcik7XG4gICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkge1xuICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGltZXJMb2FkaW5nID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRpbWVyTG9hZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpICYmIGlzVW5kZWYoZmFjdG9yeS5lcnJvcikpIHtcbiAgICAgICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVzLmRlbGF5IHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy50aW1lb3V0KSkge1xuICAgICAgICAgIHRpbWVyVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGltZXJUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICAgICAgICAgICA/IChcInRpbWVvdXQgKFwiICsgKHJlcy50aW1lb3V0KSArIFwibXMpXCIpXG4gICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCByZXMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzeW5jID0gZmFsc2U7XG4gICAgLy8gcmV0dXJuIGluIGNhc2UgcmVzb2x2ZWQgc3luY2hyb25vdXNseVxuICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdcbiAgICAgID8gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICAgICAgOiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzQXN5bmNQbGFjZWhvbGRlciAobm9kZSkge1xuICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3Rvcnlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGdldEZpcnN0Q29tcG9uZW50Q2hpbGQgKGNoaWxkcmVuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkge1xuICAgICAgICByZXR1cm4gY1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRFdmVudHMgKHZtKSB7XG4gIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2bS5faGFzSG9va0V2ZW50ID0gZmFsc2U7XG4gIC8vIGluaXQgcGFyZW50IGF0dGFjaGVkIGV2ZW50c1xuICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztcbiAgaWYgKGxpc3RlbmVycykge1xuICAgIHVwZGF0ZUNvbXBvbmVudExpc3RlbmVycyh2bSwgbGlzdGVuZXJzKTtcbiAgfVxufVxuXG52YXIgdGFyZ2V0O1xuXG5mdW5jdGlvbiBhZGQgKGV2ZW50LCBmbikge1xuICB0YXJnZXQuJG9uKGV2ZW50LCBmbik7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHtcbiAgdGFyZ2V0LiRvZmYoZXZlbnQsIGZuKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT25jZUhhbmRsZXIgKGV2ZW50LCBmbikge1xuICB2YXIgX3RhcmdldCA9IHRhcmdldDtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHtcbiAgICB2YXIgcmVzID0gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICBfdGFyZ2V0LiRvZmYoZXZlbnQsIG9uY2VIYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzIChcbiAgdm0sXG4gIGxpc3RlbmVycyxcbiAgb2xkTGlzdGVuZXJzXG4pIHtcbiAgdGFyZ2V0ID0gdm07XG4gIHVwZGF0ZUxpc3RlbmVycyhsaXN0ZW5lcnMsIG9sZExpc3RlbmVycyB8fCB7fSwgYWRkLCByZW1vdmUkMSwgY3JlYXRlT25jZUhhbmRsZXIsIHZtKTtcbiAgdGFyZ2V0ID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7XG4gIHZhciBob29rUkUgPSAvXmhvb2s6LztcbiAgVnVlLnByb3RvdHlwZS4kb24gPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZtLiRvbihldmVudFtpXSwgZm4pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAodm0uX2V2ZW50c1tldmVudF0gfHwgKHZtLl9ldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGZuKTtcbiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBpbnN0ZWFkIG9mIGEgaGFzaCBsb29rdXBcbiAgICAgIGlmIChob29rUkUudGVzdChldmVudCkpIHtcbiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2bVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBmdW5jdGlvbiBvbiAoKSB7XG4gICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7XG4gICAgICBmbi5hcHBseSh2bSwgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgb24uZm4gPSBmbjtcbiAgICB2bS4kb24oZXZlbnQsIG9uKTtcbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRvZmYgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhbGxcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgcmV0dXJuIHZtXG4gICAgfVxuICAgIC8vIGFycmF5IG9mIGV2ZW50c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuICAgICAgZm9yICh2YXIgaSQxID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSQxIDwgbDsgaSQxKyspIHtcbiAgICAgICAgdm0uJG9mZihldmVudFtpJDFdLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFjYnMpIHtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICBpZiAoIWZuKSB7XG4gICAgICB2bS5fZXZlbnRzW2V2ZW50XSA9IG51bGw7XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgaGFuZGxlclxuICAgIHZhciBjYjtcbiAgICB2YXIgaSA9IGNicy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY2IgPSBjYnNbaV07XG4gICAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgICBjYnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChsb3dlckNhc2VFdmVudCAhPT0gZXZlbnQgJiYgdm0uX2V2ZW50c1tsb3dlckNhc2VFdmVudF0pIHtcbiAgICAgICAgdGlwKFxuICAgICAgICAgIFwiRXZlbnQgXFxcIlwiICsgbG93ZXJDYXNlRXZlbnQgKyBcIlxcXCIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgXCIgK1xuICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHZtKSkgKyBcIiBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgXFxcIlwiICsgZXZlbnQgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICBcIk5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIFwiICtcbiAgICAgICAgICBcInYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBcIiArXG4gICAgICAgICAgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcXFwiXCIgKyAoaHlwaGVuYXRlKGV2ZW50KSkgKyBcIlxcXCIgaW5zdGVhZCBvZiBcXFwiXCIgKyBldmVudCArIFwiXFxcIi5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKGNicykge1xuICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7XG4gICAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICAgIHZhciBpbmZvID0gXCJldmVudCBoYW5kbGVyIGZvciBcXFwiXCIgKyBldmVudCArIFwiXFxcIlwiO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGNic1tpXSwgdm0sIGFyZ3MsIHZtLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xudmFyIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBzZXRBY3RpdmVJbnN0YW5jZSh2bSkge1xuICB2YXIgcHJldkFjdGl2ZUluc3RhbmNlID0gYWN0aXZlSW5zdGFuY2U7XG4gIGFjdGl2ZUluc3RhbmNlID0gdm07XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgYWN0aXZlSW5zdGFuY2UgPSBwcmV2QWN0aXZlSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdExpZmVjeWNsZSAodm0pIHtcbiAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcblxuICAvLyBsb2NhdGUgZmlyc3Qgbm9uLWFic3RyYWN0IHBhcmVudFxuICB2YXIgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICB3aGlsZSAocGFyZW50LiRvcHRpb25zLmFic3RyYWN0ICYmIHBhcmVudC4kcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50LiRjaGlsZHJlbi5wdXNoKHZtKTtcbiAgfVxuXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnQ7XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm07XG5cbiAgdm0uJGNoaWxkcmVuID0gW107XG4gIHZtLiRyZWZzID0ge307XG5cbiAgdm0uX3dhdGNoZXIgPSBudWxsO1xuICB2bS5faW5hY3RpdmUgPSBudWxsO1xuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgdm0uX2lzTW91bnRlZCA9IGZhbHNlO1xuICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAodm5vZGUsIGh5ZHJhdGluZykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgdmFyIHByZXZFbCA9IHZtLiRlbDtcbiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlO1xuICAgIHZhciByZXN0b3JlQWN0aXZlSW5zdGFuY2UgPSBzZXRBY3RpdmVJbnN0YW5jZSh2bSk7XG4gICAgdm0uX3Zub2RlID0gdm5vZGU7XG4gICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzXG4gICAgLy8gYmFzZWQgb24gdGhlIHJlbmRlcmluZyBiYWNrZW5kIHVzZWQuXG4gICAgaWYgKCFwcmV2Vm5vZGUpIHtcbiAgICAgIC8vIGluaXRpYWwgcmVuZGVyXG4gICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18odm0uJGVsLCB2bm9kZSwgaHlkcmF0aW5nLCBmYWxzZSAvKiByZW1vdmVPbmx5ICovKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXBkYXRlc1xuICAgICAgdm0uJGVsID0gdm0uX19wYXRjaF9fKHByZXZWbm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICByZXN0b3JlQWN0aXZlSW5zdGFuY2UoKTtcbiAgICAvLyB1cGRhdGUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAocHJldkVsKSB7XG4gICAgICBwcmV2RWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIGlmICh2bS4kZWwpIHtcbiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gdm07XG4gICAgfVxuICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGxcbiAgICBpZiAodm0uJHZub2RlICYmIHZtLiRwYXJlbnQgJiYgdm0uJHZub2RlID09PSB2bS4kcGFyZW50Ll92bm9kZSkge1xuICAgICAgdm0uJHBhcmVudC4kZWwgPSB2bS4kZWw7XG4gICAgfVxuICAgIC8vIHVwZGF0ZWQgaG9vayBpcyBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlciB0byBlbnN1cmUgdGhhdCBjaGlsZHJlbiBhcmVcbiAgICAvLyB1cGRhdGVkIGluIGEgcGFyZW50J3MgdXBkYXRlZCBob29rLlxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci51cGRhdGUoKTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmICh2bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlRGVzdHJveScpO1xuICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyByZW1vdmUgc2VsZiBmcm9tIHBhcmVudFxuICAgIHZhciBwYXJlbnQgPSB2bS4kcGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICAgIHJlbW92ZShwYXJlbnQuJGNoaWxkcmVuLCB2bSk7XG4gICAgfVxuICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzXG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci50ZWFyZG93bigpO1xuICAgIH1cbiAgICB2YXIgaSA9IHZtLl93YXRjaGVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgZnJvbSBkYXRhIG9iXG4gICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuXG4gICAgaWYgKHZtLl9kYXRhLl9fb2JfXykge1xuICAgICAgdm0uX2RhdGEuX19vYl9fLnZtQ291bnQtLTtcbiAgICB9XG4gICAgLy8gY2FsbCB0aGUgbGFzdCBob29rLi4uXG4gICAgdm0uX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWVcbiAgICB2bS5fX3BhdGNoX18odm0uX3Zub2RlLCBudWxsKTtcbiAgICAvLyBmaXJlIGRlc3Ryb3llZCBob29rXG4gICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTtcbiAgICAvLyB0dXJuIG9mZiBhbGwgaW5zdGFuY2UgbGlzdGVuZXJzLlxuICAgIHZtLiRvZmYoKTtcbiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAodm0uJGVsKSB7XG4gICAgICB2bS4kZWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIC8vIHJlbGVhc2UgY2lyY3VsYXIgcmVmZXJlbmNlICgjNjc1OSlcbiAgICBpZiAodm0uJHZub2RlKSB7XG4gICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vdW50Q29tcG9uZW50IChcbiAgdm0sXG4gIGVsLFxuICBoeWRyYXRpbmdcbikge1xuICB2bS4kZWwgPSBlbDtcbiAgaWYgKCF2bS4kb3B0aW9ucy5yZW5kZXIpIHtcbiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICgodm0uJG9wdGlvbnMudGVtcGxhdGUgJiYgdm0uJG9wdGlvbnMudGVtcGxhdGUuY2hhckF0KDApICE9PSAnIycpIHx8XG4gICAgICAgIHZtLiRvcHRpb25zLmVsIHx8IGVsKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ1lvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCBvZiBWdWUgd2hlcmUgdGhlIHRlbXBsYXRlICcgK1xuICAgICAgICAgICdjb21waWxlciBpcyBub3QgYXZhaWxhYmxlLiBFaXRoZXIgcHJlLWNvbXBpbGUgdGhlIHRlbXBsYXRlcyBpbnRvICcgK1xuICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ0ZhaWxlZCB0byBtb3VudCBjb21wb25lbnQ6IHRlbXBsYXRlIG9yIHJlbmRlciBmdW5jdGlvbiBub3QgZGVmaW5lZC4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNhbGxIb29rKHZtLCAnYmVmb3JlTW91bnQnKTtcblxuICB2YXIgdXBkYXRlQ29tcG9uZW50O1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICB1cGRhdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lO1xuICAgICAgdmFyIGlkID0gdm0uX3VpZDtcbiAgICAgIHZhciBzdGFydFRhZyA9IFwidnVlLXBlcmYtc3RhcnQ6XCIgKyBpZDtcbiAgICAgIHZhciBlbmRUYWcgPSBcInZ1ZS1wZXJmLWVuZDpcIiArIGlkO1xuXG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICAgIHZhciB2bm9kZSA9IHZtLl9yZW5kZXIoKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgbmFtZSArIFwiIHJlbmRlclwiKSwgc3RhcnRUYWcsIGVuZFRhZyk7XG5cbiAgICAgIG1hcmsoc3RhcnRUYWcpO1xuICAgICAgdm0uX3VwZGF0ZSh2bm9kZSwgaHlkcmF0aW5nKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgbmFtZSArIFwiIHBhdGNoXCIpLCBzdGFydFRhZywgZW5kVGFnKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZUNvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZtLl91cGRhdGUodm0uX3JlbmRlcigpLCBoeWRyYXRpbmcpO1xuICAgIH07XG4gIH1cblxuICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvclxuICAvLyBzaW5jZSB0aGUgd2F0Y2hlcidzIGluaXRpYWwgcGF0Y2ggbWF5IGNhbGwgJGZvcmNlVXBkYXRlIChlLmcuIGluc2lkZSBjaGlsZFxuICAvLyBjb21wb25lbnQncyBtb3VudGVkIGhvb2spLCB3aGljaCByZWxpZXMgb24gdm0uX3dhdGNoZXIgYmVpbmcgYWxyZWFkeSBkZWZpbmVkXG4gIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIHtcbiAgICBiZWZvcmU6IGZ1bmN0aW9uIGJlZm9yZSAoKSB7XG4gICAgICBpZiAodm0uX2lzTW91bnRlZCAmJiAhdm0uX2lzRGVzdHJveWVkKSB7XG4gICAgICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlVXBkYXRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB0cnVlIC8qIGlzUmVuZGVyV2F0Y2hlciAqLyk7XG4gIGh5ZHJhdGluZyA9IGZhbHNlO1xuXG4gIC8vIG1hbnVhbGx5IG1vdW50ZWQgaW5zdGFuY2UsIGNhbGwgbW91bnRlZCBvbiBzZWxmXG4gIC8vIG1vdW50ZWQgaXMgY2FsbGVkIGZvciByZW5kZXItY3JlYXRlZCBjaGlsZCBjb21wb25lbnRzIGluIGl0cyBpbnNlcnRlZCBob29rXG4gIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkge1xuICAgIHZtLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgIGNhbGxIb29rKHZtLCAnbW91bnRlZCcpO1xuICB9XG4gIHJldHVybiB2bVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGlsZENvbXBvbmVudCAoXG4gIHZtLFxuICBwcm9wc0RhdGEsXG4gIGxpc3RlbmVycyxcbiAgcGFyZW50Vm5vZGUsXG4gIHJlbmRlckNoaWxkcmVuXG4pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSB0cnVlO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgY29tcG9uZW50IGhhcyBzbG90IGNoaWxkcmVuXG4gIC8vIHdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgb3ZlcndyaXRpbmcgJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuLlxuXG4gIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBkeW5hbWljIHNjb3BlZFNsb3RzIChoYW5kLXdyaXR0ZW4gb3IgY29tcGlsZWQgYnV0IHdpdGhcbiAgLy8gZHluYW1pYyBzbG90IG5hbWVzKS4gU3RhdGljIHNjb3BlZCBzbG90cyBjb21waWxlZCBmcm9tIHRlbXBsYXRlIGhhcyB0aGVcbiAgLy8gXCIkc3RhYmxlXCIgbWFya2VyLlxuICB2YXIgbmV3U2NvcGVkU2xvdHMgPSBwYXJlbnRWbm9kZS5kYXRhLnNjb3BlZFNsb3RzO1xuICB2YXIgb2xkU2NvcGVkU2xvdHMgPSB2bS4kc2NvcGVkU2xvdHM7XG4gIHZhciBoYXNEeW5hbWljU2NvcGVkU2xvdCA9ICEhKFxuICAgIChuZXdTY29wZWRTbG90cyAmJiAhbmV3U2NvcGVkU2xvdHMuJHN0YWJsZSkgfHxcbiAgICAob2xkU2NvcGVkU2xvdHMgIT09IGVtcHR5T2JqZWN0ICYmICFvbGRTY29wZWRTbG90cy4kc3RhYmxlKSB8fFxuICAgIChuZXdTY29wZWRTbG90cyAmJiB2bS4kc2NvcGVkU2xvdHMuJGtleSAhPT0gbmV3U2NvcGVkU2xvdHMuJGtleSlcbiAgKTtcblxuICAvLyBBbnkgc3RhdGljIHNsb3QgY2hpbGRyZW4gZnJvbSB0aGUgcGFyZW50IG1heSBoYXZlIGNoYW5nZWQgZHVyaW5nIHBhcmVudCdzXG4gIC8vIHVwZGF0ZS4gRHluYW1pYyBzY29wZWQgc2xvdHMgbWF5IGFsc28gaGF2ZSBjaGFuZ2VkLiBJbiBzdWNoIGNhc2VzLCBhIGZvcmNlZFxuICAvLyB1cGRhdGUgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBjb3JyZWN0bmVzcy5cbiAgdmFyIG5lZWRzRm9yY2VVcGRhdGUgPSAhIShcbiAgICByZW5kZXJDaGlsZHJlbiB8fCAgICAgICAgICAgICAgIC8vIGhhcyBuZXcgc3RhdGljIHNsb3RzXG4gICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90c1xuICAgIGhhc0R5bmFtaWNTY29wZWRTbG90XG4gICk7XG5cbiAgdm0uJG9wdGlvbnMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7XG4gIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyXG5cbiAgaWYgKHZtLl92bm9kZSkgeyAvLyB1cGRhdGUgY2hpbGQgdHJlZSdzIHBhcmVudFxuICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTtcbiAgfVxuICB2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4gPSByZW5kZXJDaGlsZHJlbjtcblxuICAvLyB1cGRhdGUgJGF0dHJzIGFuZCAkbGlzdGVuZXJzIGhhc2hcbiAgLy8gdGhlc2UgYXJlIGFsc28gcmVhY3RpdmUgc28gdGhleSBtYXkgdHJpZ2dlciBjaGlsZCB1cGRhdGUgaWYgdGhlIGNoaWxkXG4gIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyXG4gIHZtLiRhdHRycyA9IHBhcmVudFZub2RlLmRhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3Q7XG4gIHZtLiRsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7XG5cbiAgLy8gdXBkYXRlIHByb3BzXG4gIGlmIChwcm9wc0RhdGEgJiYgdm0uJG9wdGlvbnMucHJvcHMpIHtcbiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpO1xuICAgIHZhciBwcm9wcyA9IHZtLl9wcm9wcztcbiAgICB2YXIgcHJvcEtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHByb3BLZXlzW2ldO1xuICAgICAgdmFyIHByb3BPcHRpb25zID0gdm0uJG9wdGlvbnMucHJvcHM7IC8vIHd0ZiBmbG93P1xuICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTtcbiAgICB9XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpO1xuICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGFcbiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgPSBwcm9wc0RhdGE7XG4gIH1cblxuICAvLyB1cGRhdGUgbGlzdGVuZXJzXG4gIGxpc3RlbmVycyA9IGxpc3RlbmVycyB8fCBlbXB0eU9iamVjdDtcbiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7XG4gIHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG4gIHVwZGF0ZUNvbXBvbmVudExpc3RlbmVycyh2bSwgbGlzdGVuZXJzLCBvbGRMaXN0ZW5lcnMpO1xuXG4gIC8vIHJlc29sdmUgc2xvdHMgKyBmb3JjZSB1cGRhdGUgaWYgaGFzIGNoaWxkcmVuXG4gIGlmIChuZWVkc0ZvcmNlVXBkYXRlKSB7XG4gICAgdm0uJHNsb3RzID0gcmVzb2x2ZVNsb3RzKHJlbmRlckNoaWxkcmVuLCBwYXJlbnRWbm9kZS5jb250ZXh0KTtcbiAgICB2bS4kZm9yY2VVcGRhdGUoKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHtcbiAgd2hpbGUgKHZtICYmICh2bSA9IHZtLiRwYXJlbnQpKSB7XG4gICAgaWYgKHZtLl9pbmFjdGl2ZSkgeyByZXR1cm4gdHJ1ZSB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQgKHZtLCBkaXJlY3QpIHtcbiAgaWYgKGRpcmVjdCkge1xuICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlO1xuICAgIGlmIChpc0luSW5hY3RpdmVUcmVlKHZtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICB9IGVsc2UgaWYgKHZtLl9kaXJlY3RJbmFjdGl2ZSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICh2bS5faW5hY3RpdmUgfHwgdm0uX2luYWN0aXZlID09PSBudWxsKSB7XG4gICAgdm0uX2luYWN0aXZlID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQodm0uJGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWFjdGl2YXRlQ2hpbGRDb21wb25lbnQgKHZtLCBkaXJlY3QpIHtcbiAgaWYgKGRpcmVjdCkge1xuICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7XG4gICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cbiAgaWYgKCF2bS5faW5hY3RpdmUpIHtcbiAgICB2bS5faW5hY3RpdmUgPSB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm0uJGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWFjdGl2YXRlQ2hpbGRDb21wb25lbnQodm0uJGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgY2FsbEhvb2sodm0sICdkZWFjdGl2YXRlZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxIb29rICh2bSwgaG9vaykge1xuICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzXG4gIHB1c2hUYXJnZXQoKTtcbiAgdmFyIGhhbmRsZXJzID0gdm0uJG9wdGlvbnNbaG9va107XG4gIHZhciBpbmZvID0gaG9vayArIFwiIGhvb2tcIjtcbiAgaWYgKGhhbmRsZXJzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGhhbmRsZXJzW2ldLCB2bSwgbnVsbCwgdm0sIGluZm8pO1xuICAgIH1cbiAgfVxuICBpZiAodm0uX2hhc0hvb2tFdmVudCkge1xuICAgIHZtLiRlbWl0KCdob29rOicgKyBob29rKTtcbiAgfVxuICBwb3BUYXJnZXQoKTtcbn1cblxuLyogICovXG5cbnZhciBNQVhfVVBEQVRFX0NPVU5UID0gMTAwO1xuXG52YXIgcXVldWUgPSBbXTtcbnZhciBhY3RpdmF0ZWRDaGlsZHJlbiA9IFtdO1xudmFyIGhhcyA9IHt9O1xudmFyIGNpcmN1bGFyID0ge307XG52YXIgd2FpdGluZyA9IGZhbHNlO1xudmFyIGZsdXNoaW5nID0gZmFsc2U7XG52YXIgaW5kZXggPSAwO1xuXG4vKipcbiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzZXRTY2hlZHVsZXJTdGF0ZSAoKSB7XG4gIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDtcbiAgaGFzID0ge307XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY2lyY3VsYXIgPSB7fTtcbiAgfVxuICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTtcbn1cblxuLy8gQXN5bmMgZWRnZSBjYXNlICM2NTY2IHJlcXVpcmVzIHNhdmluZyB0aGUgdGltZXN0YW1wIHdoZW4gZXZlbnQgbGlzdGVuZXJzIGFyZVxuLy8gYXR0YWNoZWQuIEhvd2V2ZXIsIGNhbGxpbmcgcGVyZm9ybWFuY2Uubm93KCkgaGFzIGEgcGVyZiBvdmVyaGVhZCBlc3BlY2lhbGx5XG4vLyBpZiB0aGUgcGFnZSBoYXMgdGhvdXNhbmRzIG9mIGV2ZW50IGxpc3RlbmVycy4gSW5zdGVhZCwgd2UgdGFrZSBhIHRpbWVzdGFtcFxuLy8gZXZlcnkgdGltZSB0aGUgc2NoZWR1bGVyIGZsdXNoZXMgYW5kIHVzZSB0aGF0IGZvciBhbGwgZXZlbnQgbGlzdGVuZXJzXG4vLyBhdHRhY2hlZCBkdXJpbmcgdGhhdCBmbHVzaC5cbnZhciBjdXJyZW50Rmx1c2hUaW1lc3RhbXAgPSAwO1xuXG4vLyBBc3luYyBlZGdlIGNhc2UgZml4IHJlcXVpcmVzIHN0b3JpbmcgYW4gZXZlbnQgbGlzdGVuZXIncyBhdHRhY2ggdGltZXN0YW1wLlxudmFyIGdldE5vdyA9IERhdGUubm93O1xuXG4vLyBEZXRlcm1pbmUgd2hhdCBldmVudCB0aW1lc3RhbXAgdGhlIGJyb3dzZXIgaXMgdXNpbmcuIEFubm95aW5nbHksIHRoZVxuLy8gdGltZXN0YW1wIGNhbiBlaXRoZXIgYmUgaGktcmVzIChyZWxhdGl2ZSB0byBwYWdlIGxvYWQpIG9yIGxvdy1yZXNcbi8vIChyZWxhdGl2ZSB0byBVTklYIGVwb2NoKSwgc28gaW4gb3JkZXIgdG8gY29tcGFyZSB0aW1lIHdlIGhhdmUgdG8gdXNlIHRoZVxuLy8gc2FtZSB0aW1lc3RhbXAgdHlwZSB3aGVuIHNhdmluZyB0aGUgZmx1c2ggdGltZXN0YW1wLlxuLy8gQWxsIElFIHZlcnNpb25zIHVzZSBsb3ctcmVzIGV2ZW50IHRpbWVzdGFtcHMsIGFuZCBoYXZlIHByb2JsZW1hdGljIGNsb2NrXG4vLyBpbXBsZW1lbnRhdGlvbnMgKCM5NjMyKVxuaWYgKGluQnJvd3NlciAmJiAhaXNJRSkge1xuICB2YXIgcGVyZm9ybWFuY2UgPSB3aW5kb3cucGVyZm9ybWFuY2U7XG4gIGlmIChcbiAgICBwZXJmb3JtYW5jZSAmJlxuICAgIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbicgJiZcbiAgICBnZXROb3coKSA+IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpLnRpbWVTdGFtcFxuICApIHtcbiAgICAvLyBpZiB0aGUgZXZlbnQgdGltZXN0YW1wLCBhbHRob3VnaCBldmFsdWF0ZWQgQUZURVIgdGhlIERhdGUubm93KCksIGlzXG4gICAgLy8gc21hbGxlciB0aGFuIGl0LCBpdCBtZWFucyB0aGUgZXZlbnQgaXMgdXNpbmcgYSBoaS1yZXMgdGltZXN0YW1wLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHVzZSB0aGUgaGktcmVzIHZlcnNpb24gZm9yIGV2ZW50IGxpc3RlbmVyIHRpbWVzdGFtcHMgYXNcbiAgICAvLyB3ZWxsLlxuICAgIGdldE5vdyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOyB9O1xuICB9XG59XG5cbi8qKlxuICogRmx1c2ggYm90aCBxdWV1ZXMgYW5kIHJ1biB0aGUgd2F0Y2hlcnMuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoU2NoZWR1bGVyUXVldWUgKCkge1xuICBjdXJyZW50Rmx1c2hUaW1lc3RhbXAgPSBnZXROb3coKTtcbiAgZmx1c2hpbmcgPSB0cnVlO1xuICB2YXIgd2F0Y2hlciwgaWQ7XG5cbiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGF0OlxuICAvLyAxLiBDb21wb25lbnRzIGFyZSB1cGRhdGVkIGZyb20gcGFyZW50IHRvIGNoaWxkLiAoYmVjYXVzZSBwYXJlbnQgaXMgYWx3YXlzXG4gIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZClcbiAgLy8gMi4gQSBjb21wb25lbnQncyB1c2VyIHdhdGNoZXJzIGFyZSBydW4gYmVmb3JlIGl0cyByZW5kZXIgd2F0Y2hlciAoYmVjYXVzZVxuICAvLyAgICB1c2VyIHdhdGNoZXJzIGFyZSBjcmVhdGVkIGJlZm9yZSB0aGUgcmVuZGVyIHdhdGNoZXIpXG4gIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sXG4gIC8vICAgIGl0cyB3YXRjaGVycyBjYW4gYmUgc2tpcHBlZC5cbiAgcXVldWUuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5pZCAtIGIuaWQ7IH0pO1xuXG4gIC8vIGRvIG5vdCBjYWNoZSBsZW5ndGggYmVjYXVzZSBtb3JlIHdhdGNoZXJzIG1pZ2h0IGJlIHB1c2hlZFxuICAvLyBhcyB3ZSBydW4gZXhpc3Rpbmcgd2F0Y2hlcnNcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgd2F0Y2hlciA9IHF1ZXVlW2luZGV4XTtcbiAgICBpZiAod2F0Y2hlci5iZWZvcmUpIHtcbiAgICAgIHdhdGNoZXIuYmVmb3JlKCk7XG4gICAgfVxuICAgIGlkID0gd2F0Y2hlci5pZDtcbiAgICBoYXNbaWRdID0gbnVsbDtcbiAgICB3YXRjaGVyLnJ1bigpO1xuICAgIC8vIGluIGRldiBidWlsZCwgY2hlY2sgYW5kIHN0b3AgY2lyY3VsYXIgdXBkYXRlcy5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHtcbiAgICAgIGNpcmN1bGFyW2lkXSA9IChjaXJjdWxhcltpZF0gfHwgMCkgKyAxO1xuICAgICAgaWYgKGNpcmN1bGFyW2lkXSA+IE1BWF9VUERBVEVfQ09VTlQpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnWW91IG1heSBoYXZlIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wICcgKyAoXG4gICAgICAgICAgICB3YXRjaGVyLnVzZXJcbiAgICAgICAgICAgICAgPyAoXCJpbiB3YXRjaGVyIHdpdGggZXhwcmVzc2lvbiBcXFwiXCIgKyAod2F0Y2hlci5leHByZXNzaW9uKSArIFwiXFxcIlwiKVxuICAgICAgICAgICAgICA6IFwiaW4gYSBjb21wb25lbnQgcmVuZGVyIGZ1bmN0aW9uLlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3YXRjaGVyLnZtXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8ga2VlcCBjb3BpZXMgb2YgcG9zdCBxdWV1ZXMgYmVmb3JlIHJlc2V0dGluZyBzdGF0ZVxuICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpO1xuICB2YXIgdXBkYXRlZFF1ZXVlID0gcXVldWUuc2xpY2UoKTtcblxuICByZXNldFNjaGVkdWxlclN0YXRlKCk7XG5cbiAgLy8gY2FsbCBjb21wb25lbnQgdXBkYXRlZCBhbmQgYWN0aXZhdGVkIGhvb2tzXG4gIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7XG4gIGNhbGxVcGRhdGVkSG9va3ModXBkYXRlZFF1ZXVlKTtcblxuICAvLyBkZXZ0b29sIGhvb2tcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChkZXZ0b29scyAmJiBjb25maWcuZGV2dG9vbHMpIHtcbiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxVcGRhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIHZhciBpID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgdmFyIHdhdGNoZXIgPSBxdWV1ZVtpXTtcbiAgICB2YXIgdm0gPSB3YXRjaGVyLnZtO1xuICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkICYmICF2bS5faXNEZXN0cm95ZWQpIHtcbiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC5cbiAqIFRoZSBxdWV1ZSB3aWxsIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgZW50aXJlIHRyZWUgaGFzIGJlZW4gcGF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7XG4gIC8vIHNldHRpbmcgX2luYWN0aXZlIHRvIGZhbHNlIGhlcmUgc28gdGhhdCBhIHJlbmRlciBmdW5jdGlvbiBjYW5cbiAgLy8gcmVseSBvbiBjaGVja2luZyB3aGV0aGVyIGl0J3MgaW4gYW4gaW5hY3RpdmUgdHJlZSAoZS5nLiByb3V0ZXItdmlldylcbiAgdm0uX2luYWN0aXZlID0gZmFsc2U7XG4gIGFjdGl2YXRlZENoaWxkcmVuLnB1c2godm0pO1xufVxuXG5mdW5jdGlvbiBjYWxsQWN0aXZhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlO1xuICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQocXVldWVbaV0sIHRydWUgLyogdHJ1ZSAqLyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLlxuICogSm9icyB3aXRoIGR1cGxpY2F0ZSBJRHMgd2lsbCBiZSBza2lwcGVkIHVubGVzcyBpdCdzXG4gKiBwdXNoZWQgd2hlbiB0aGUgcXVldWUgaXMgYmVpbmcgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gcXVldWVXYXRjaGVyICh3YXRjaGVyKSB7XG4gIHZhciBpZCA9IHdhdGNoZXIuaWQ7XG4gIGlmIChoYXNbaWRdID09IG51bGwpIHtcbiAgICBoYXNbaWRdID0gdHJ1ZTtcbiAgICBpZiAoIWZsdXNoaW5nKSB7XG4gICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBhbHJlYWR5IGZsdXNoaW5nLCBzcGxpY2UgdGhlIHdhdGNoZXIgYmFzZWQgb24gaXRzIGlkXG4gICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LlxuICAgICAgdmFyIGkgPSBxdWV1ZS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkgPiBpbmRleCAmJiBxdWV1ZVtpXS5pZCA+IHdhdGNoZXIuaWQpIHtcbiAgICAgICAgaS0tO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGkgKyAxLCAwLCB3YXRjaGVyKTtcbiAgICB9XG4gICAgLy8gcXVldWUgdGhlIGZsdXNoXG4gICAgaWYgKCF3YWl0aW5nKSB7XG4gICAgICB3YWl0aW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbmZpZy5hc3luYykge1xuICAgICAgICBmbHVzaFNjaGVkdWxlclF1ZXVlKCk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG5cblxudmFyIHVpZCQyID0gMDtcblxuLyoqXG4gKiBBIHdhdGNoZXIgcGFyc2VzIGFuIGV4cHJlc3Npb24sIGNvbGxlY3RzIGRlcGVuZGVuY2llcyxcbiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuXG4gKiBUaGlzIGlzIHVzZWQgZm9yIGJvdGggdGhlICR3YXRjaCgpIGFwaSBhbmQgZGlyZWN0aXZlcy5cbiAqL1xudmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGNiLFxuICBvcHRpb25zLFxuICBpc1JlbmRlcldhdGNoZXJcbikge1xuICB0aGlzLnZtID0gdm07XG4gIGlmIChpc1JlbmRlcldhdGNoZXIpIHtcbiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7XG4gIH1cbiAgdm0uX3dhdGNoZXJzLnB1c2godGhpcyk7XG4gIC8vIG9wdGlvbnNcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlZXAgPSAhIW9wdGlvbnMuZGVlcDtcbiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjtcbiAgICB0aGlzLmxhenkgPSAhIW9wdGlvbnMubGF6eTtcbiAgICB0aGlzLnN5bmMgPSAhIW9wdGlvbnMuc3luYztcbiAgICB0aGlzLmJlZm9yZSA9IG9wdGlvbnMuYmVmb3JlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlO1xuICB9XG4gIHRoaXMuY2IgPSBjYjtcbiAgdGhpcy5pZCA9ICsrdWlkJDI7IC8vIHVpZCBmb3IgYmF0Y2hpbmdcbiAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICB0aGlzLmRpcnR5ID0gdGhpcy5sYXp5OyAvLyBmb3IgbGF6eSB3YXRjaGVyc1xuICB0aGlzLmRlcHMgPSBbXTtcbiAgdGhpcy5uZXdEZXBzID0gW107XG4gIHRoaXMuZGVwSWRzID0gbmV3IF9TZXQoKTtcbiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpO1xuICB0aGlzLmV4cHJlc3Npb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgPyBleHBPckZuLnRvU3RyaW5nKClcbiAgICA6ICcnO1xuICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXJcbiAgaWYgKHR5cGVvZiBleHBPckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5nZXR0ZXIgPSBleHBPckZuO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZ2V0dGVyID0gcGFyc2VQYXRoKGV4cE9yRm4pO1xuICAgIGlmICghdGhpcy5nZXR0ZXIpIHtcbiAgICAgIHRoaXMuZ2V0dGVyID0gbm9vcDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXFxcIlwiICsgZXhwT3JGbiArIFwiXFxcIiBcIiArXG4gICAgICAgICdXYXRjaGVyIG9ubHkgYWNjZXB0cyBzaW1wbGUgZG90LWRlbGltaXRlZCBwYXRocy4gJyArXG4gICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgfVxuICB0aGlzLnZhbHVlID0gdGhpcy5sYXp5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHRoaXMuZ2V0KCk7XG59O1xuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSBnZXR0ZXIsIGFuZCByZS1jb2xsZWN0IGRlcGVuZGVuY2llcy5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0ICgpIHtcbiAgcHVzaFRhcmdldCh0aGlzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgdm0gPSB0aGlzLnZtO1xuICB0cnkge1xuICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHRoaXMudXNlcikge1xuICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sIChcImdldHRlciBmb3Igd2F0Y2hlciBcXFwiXCIgKyAodGhpcy5leHByZXNzaW9uKSArIFwiXFxcIlwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgLy8gXCJ0b3VjaFwiIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzXG4gICAgLy8gZGVwZW5kZW5jaWVzIGZvciBkZWVwIHdhdGNoaW5nXG4gICAgaWYgKHRoaXMuZGVlcCkge1xuICAgICAgdHJhdmVyc2UodmFsdWUpO1xuICAgIH1cbiAgICBwb3BUYXJnZXQoKTtcbiAgICB0aGlzLmNsZWFudXBEZXBzKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59O1xuXG4vKipcbiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmFkZERlcCA9IGZ1bmN0aW9uIGFkZERlcCAoZGVwKSB7XG4gIHZhciBpZCA9IGRlcC5pZDtcbiAgaWYgKCF0aGlzLm5ld0RlcElkcy5oYXMoaWQpKSB7XG4gICAgdGhpcy5uZXdEZXBJZHMuYWRkKGlkKTtcbiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApO1xuICAgIGlmICghdGhpcy5kZXBJZHMuaGFzKGlkKSkge1xuICAgICAgZGVwLmFkZFN1Yih0aGlzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQ2xlYW4gdXAgZm9yIGRlcGVuZGVuY3kgY29sbGVjdGlvbi5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuY2xlYW51cERlcHMgPSBmdW5jdGlvbiBjbGVhbnVwRGVwcyAoKSB7XG4gIHZhciBpID0gdGhpcy5kZXBzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBkZXAgPSB0aGlzLmRlcHNbaV07XG4gICAgaWYgKCF0aGlzLm5ld0RlcElkcy5oYXMoZGVwLmlkKSkge1xuICAgICAgZGVwLnJlbW92ZVN1Yih0aGlzKTtcbiAgICB9XG4gIH1cbiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzO1xuICB0aGlzLmRlcElkcyA9IHRoaXMubmV3RGVwSWRzO1xuICB0aGlzLm5ld0RlcElkcyA9IHRtcDtcbiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTtcbiAgdG1wID0gdGhpcy5kZXBzO1xuICB0aGlzLmRlcHMgPSB0aGlzLm5ld0RlcHM7XG4gIHRoaXMubmV3RGVwcyA9IHRtcDtcbiAgdGhpcy5uZXdEZXBzLmxlbmd0aCA9IDA7XG59O1xuXG4vKipcbiAqIFN1YnNjcmliZXIgaW50ZXJmYWNlLlxuICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlICgpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHRoaXMubGF6eSkge1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHRoaXMuc3luYykge1xuICAgIHRoaXMucnVuKCk7XG4gIH0gZWxzZSB7XG4gICAgcXVldWVXYXRjaGVyKHRoaXMpO1xuICB9XG59O1xuXG4vKipcbiAqIFNjaGVkdWxlciBqb2IgaW50ZXJmYWNlLlxuICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gcnVuICgpIHtcbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5nZXQoKTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fFxuICAgICAgLy8gRGVlcCB3YXRjaGVycyBhbmQgd2F0Y2hlcnMgb24gT2JqZWN0L0FycmF5cyBzaG91bGQgZmlyZSBldmVuXG4gICAgICAvLyB3aGVuIHRoZSB2YWx1ZSBpcyB0aGUgc2FtZSwgYmVjYXVzZSB0aGUgdmFsdWUgbWF5XG4gICAgICAvLyBoYXZlIG11dGF0ZWQuXG4gICAgICBpc09iamVjdCh2YWx1ZSkgfHxcbiAgICAgIHRoaXMuZGVlcFxuICAgICkge1xuICAgICAgLy8gc2V0IG5ldyB2YWx1ZVxuICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHRoaXMudm0sIChcImNhbGxiYWNrIGZvciB3YXRjaGVyIFxcXCJcIiArICh0aGlzLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMudm0sIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSB2YWx1ZSBvZiB0aGUgd2F0Y2hlci5cbiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZXZhbHVhdGUgPSBmdW5jdGlvbiBldmFsdWF0ZSAoKSB7XG4gIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpO1xuICB0aGlzLmRpcnR5ID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIERlcGVuZCBvbiBhbGwgZGVwcyBjb2xsZWN0ZWQgYnkgdGhpcyB3YXRjaGVyLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5kZXBlbmQgPSBmdW5jdGlvbiBkZXBlbmQgKCkge1xuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB0aGlzLmRlcHNbaV0uZGVwZW5kKCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVtb3ZlIHNlbGYgZnJvbSBhbGwgZGVwZW5kZW5jaWVzJyBzdWJzY3JpYmVyIGxpc3QuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkge1xuICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAvLyByZW1vdmUgc2VsZiBmcm9tIHZtJ3Mgd2F0Y2hlciBsaXN0XG4gICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdFxuICAgIC8vIGlmIHRoZSB2bSBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgaWYgKCF0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkKSB7XG4gICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpO1xuICAgIH1cbiAgICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5kZXBzW2ldLnJlbW92ZVN1Yih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgfVxufTtcblxuLyogICovXG5cbnZhciBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24gPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBub29wLFxuICBzZXQ6IG5vb3Bcbn07XG5cbmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7XG4gIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5nZXQgPSBmdW5jdGlvbiBwcm94eUdldHRlciAoKSB7XG4gICAgcmV0dXJuIHRoaXNbc291cmNlS2V5XVtrZXldXG4gIH07XG4gIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBmdW5jdGlvbiBwcm94eVNldHRlciAodmFsKSB7XG4gICAgdGhpc1tzb3VyY2VLZXldW2tleV0gPSB2YWw7XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gaW5pdFN0YXRlICh2bSkge1xuICB2bS5fd2F0Y2hlcnMgPSBbXTtcbiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucztcbiAgaWYgKG9wdHMucHJvcHMpIHsgaW5pdFByb3BzKHZtLCBvcHRzLnByb3BzKTsgfVxuICBpZiAob3B0cy5tZXRob2RzKSB7IGluaXRNZXRob2RzKHZtLCBvcHRzLm1ldGhvZHMpOyB9XG4gIGlmIChvcHRzLmRhdGEpIHtcbiAgICBpbml0RGF0YSh2bSk7XG4gIH0gZWxzZSB7XG4gICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pO1xuICB9XG4gIGlmIChvcHRzLmNvbXB1dGVkKSB7IGluaXRDb21wdXRlZCh2bSwgb3B0cy5jb21wdXRlZCk7IH1cbiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHtcbiAgICBpbml0V2F0Y2godm0sIG9wdHMud2F0Y2gpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRQcm9wcyAodm0sIHByb3BzT3B0aW9ucykge1xuICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9O1xuICB2YXIgcHJvcHMgPSB2bS5fcHJvcHMgPSB7fTtcbiAgLy8gY2FjaGUgcHJvcCBrZXlzIHNvIHRoYXQgZnV0dXJlIHByb3BzIHVwZGF0ZXMgY2FuIGl0ZXJhdGUgdXNpbmcgQXJyYXlcbiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uXG4gIHZhciBrZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzID0gW107XG4gIHZhciBpc1Jvb3QgPSAhdm0uJHBhcmVudDtcbiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkXG4gIGlmICghaXNSb290KSB7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKGZhbHNlKTtcbiAgfVxuICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgIGtleXMucHVzaChrZXkpO1xuICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGh5cGhlbmF0ZWRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChpc1Jlc2VydmVkQXR0cmlidXRlKGh5cGhlbmF0ZWRLZXkpIHx8XG4gICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgKFwiXFxcIlwiICsgaHlwaGVuYXRlZEtleSArIFwiXFxcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkZWZpbmVSZWFjdGl2ZSQkMShwcm9wcywga2V5LCB2YWx1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzUm9vdCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlIFwiICtcbiAgICAgICAgICAgIFwib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgXCIgK1xuICAgICAgICAgICAgXCJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIixcbiAgICAgICAgICAgIHZtXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHByb3BzLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZVxuICAgIC8vIGR1cmluZyBWdWUuZXh0ZW5kKCkuIFdlIG9ubHkgbmVlZCB0byBwcm94eSBwcm9wcyBkZWZpbmVkIGF0XG4gICAgLy8gaW5zdGFudGlhdGlvbiBoZXJlLlxuICAgIGlmICghKGtleSBpbiB2bSkpIHtcbiAgICAgIHByb3h5KHZtLCBcIl9wcm9wc1wiLCBrZXkpO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKHZhciBrZXkgaW4gcHJvcHNPcHRpb25zKSBsb29wKCBrZXkgKTtcbiAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpO1xufVxuXG5mdW5jdGlvbiBpbml0RGF0YSAodm0pIHtcbiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhO1xuICBkYXRhID0gdm0uX2RhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZ2V0RGF0YShkYXRhLCB2bSlcbiAgICA6IGRhdGEgfHwge307XG4gIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgIGRhdGEgPSB7fTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAnZGF0YSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhbiBvYmplY3Q6XFxuJyArXG4gICAgICAnaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvY29tcG9uZW50cy5odG1sI2RhdGEtTXVzdC1CZS1hLUZ1bmN0aW9uJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICAvLyBwcm94eSBkYXRhIG9uIGluc3RhbmNlXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIHZhciBwcm9wcyA9IHZtLiRvcHRpb25zLnByb3BzO1xuICB2YXIgbWV0aG9kcyA9IHZtLiRvcHRpb25zLm1ldGhvZHM7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKG1ldGhvZHMgJiYgaGFzT3duKG1ldGhvZHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIGRhdGEgcHJvcGVydHkuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJUaGUgZGF0YSBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuIFwiICtcbiAgICAgICAgXCJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXCIsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQoa2V5KSkge1xuICAgICAgcHJveHkodm0sIFwiX2RhdGFcIiwga2V5KTtcbiAgICB9XG4gIH1cbiAgLy8gb2JzZXJ2ZSBkYXRhXG4gIG9ic2VydmUoZGF0YSwgdHJ1ZSAvKiBhc1Jvb3REYXRhICovKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YSAoZGF0YSwgdm0pIHtcbiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVyc1xuICBwdXNoVGFyZ2V0KCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYW5kbGVFcnJvcihlLCB2bSwgXCJkYXRhKClcIik7XG4gICAgcmV0dXJuIHt9XG4gIH0gZmluYWxseSB7XG4gICAgcG9wVGFyZ2V0KCk7XG4gIH1cbn1cblxudmFyIGNvbXB1dGVkV2F0Y2hlck9wdGlvbnMgPSB7IGxhenk6IHRydWUgfTtcblxuZnVuY3Rpb24gaW5pdENvbXB1dGVkICh2bSwgY29tcHV0ZWQpIHtcbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gY29tcHV0ZWQgcHJvcGVydGllcyBhcmUganVzdCBnZXR0ZXJzIGR1cmluZyBTU1JcbiAgdmFyIGlzU1NSID0gaXNTZXJ2ZXJSZW5kZXJpbmcoKTtcblxuICBmb3IgKHZhciBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICB2YXIgdXNlckRlZiA9IGNvbXB1dGVkW2tleV07XG4gICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGdldHRlciA9PSBudWxsKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJHZXR0ZXIgaXMgbWlzc2luZyBmb3IgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiLlwiKSxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1NTUikge1xuICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS5cbiAgICAgIHdhdGNoZXJzW2tleV0gPSBuZXcgV2F0Y2hlcihcbiAgICAgICAgdm0sXG4gICAgICAgIGdldHRlciB8fCBub29wLFxuICAgICAgICBub29wLFxuICAgICAgICBjb21wdXRlZFdhdGNoZXJPcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGVcbiAgICAvLyBjb21wb25lbnQgcHJvdG90eXBlLiBXZSBvbmx5IG5lZWQgdG8gZGVmaW5lIGNvbXB1dGVkIHByb3BlcnRpZXMgZGVmaW5lZFxuICAgIC8vIGF0IGluc3RhbnRpYXRpb24gaGVyZS5cbiAgICBpZiAoIShrZXkgaW4gdm0pKSB7XG4gICAgICBkZWZpbmVDb21wdXRlZCh2bSwga2V5LCB1c2VyRGVmKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChrZXkgaW4gdm0uJGRhdGEpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLlwiKSwgdm0pO1xuICAgICAgfSBlbHNlIGlmICh2bS4kb3B0aW9ucy5wcm9wcyAmJiBrZXkgaW4gdm0uJG9wdGlvbnMucHJvcHMpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIHByb3AuXCIpLCB2bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZUNvbXB1dGVkIChcbiAgdGFyZ2V0LFxuICBrZXksXG4gIHVzZXJEZWZcbikge1xuICB2YXIgc2hvdWxkQ2FjaGUgPSAhaXNTZXJ2ZXJSZW5kZXJpbmcoKTtcbiAgaWYgKHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlXG4gICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSlcbiAgICAgIDogY3JlYXRlR2V0dGVySW52b2tlcih1c2VyRGVmKTtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDtcbiAgfSBlbHNlIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gdXNlckRlZi5nZXRcbiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2VcbiAgICAgICAgPyBjcmVhdGVDb21wdXRlZEdldHRlcihrZXkpXG4gICAgICAgIDogY3JlYXRlR2V0dGVySW52b2tlcih1c2VyRGVmLmdldClcbiAgICAgIDogbm9vcDtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gdXNlckRlZi5zZXQgfHwgbm9vcDtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9PT0gbm9vcCkge1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJDb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgd2FzIGFzc2lnbmVkIHRvIGJ1dCBpdCBoYXMgbm8gc2V0dGVyLlwiKSxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIgKGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkge1xuICAgIHZhciB3YXRjaGVyID0gdGhpcy5fY29tcHV0ZWRXYXRjaGVycyAmJiB0aGlzLl9jb21wdXRlZFdhdGNoZXJzW2tleV07XG4gICAgaWYgKHdhdGNoZXIpIHtcbiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7XG4gICAgICAgIHdhdGNoZXIuZXZhbHVhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICAgIHdhdGNoZXIuZGVwZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVHZXR0ZXJJbnZva2VyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb21wdXRlZEdldHRlciAoKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwodGhpcywgdGhpcylcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0TWV0aG9kcyAodm0sIG1ldGhvZHMpIHtcbiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBtZXRob2RzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0aG9kc1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyB0eXBlIFxcXCJcIiArICh0eXBlb2YgbWV0aG9kc1trZXldKSArIFwiXFxcIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIFwiICtcbiAgICAgICAgICBcIkRpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/XCIsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuIFwiICtcbiAgICAgICAgICBcIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdm1ba2V5XSA9IHR5cGVvZiBtZXRob2RzW2tleV0gIT09ICdmdW5jdGlvbicgPyBub29wIDogYmluZChtZXRob2RzW2tleV0sIHZtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0V2F0Y2ggKHZtLCB3YXRjaCkge1xuICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHtcbiAgICB2YXIgaGFuZGxlciA9IHdhdGNoW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXJbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGhhbmRsZXIsXG4gIG9wdGlvbnNcbikge1xuICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkge1xuICAgIG9wdGlvbnMgPSBoYW5kbGVyO1xuICAgIGhhbmRsZXIgPSBoYW5kbGVyLmhhbmRsZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJykge1xuICAgIGhhbmRsZXIgPSB2bVtoYW5kbGVyXTtcbiAgfVxuICByZXR1cm4gdm0uJHdhdGNoKGV4cE9yRm4sIGhhbmRsZXIsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIHN0YXRlTWl4aW4gKFZ1ZSkge1xuICAvLyBmbG93IHNvbWVob3cgaGFzIHByb2JsZW1zIHdpdGggZGlyZWN0bHkgZGVjbGFyZWQgZGVmaW5pdGlvbiBvYmplY3RcbiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwXG4gIC8vIHRoZSBvYmplY3QgaGVyZS5cbiAgdmFyIGRhdGFEZWYgPSB7fTtcbiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07XG4gIHZhciBwcm9wc0RlZiA9IHt9O1xuICBwcm9wc0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wcm9wcyB9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRhdGFEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICtcbiAgICAgICAgJ1VzZSBuZXN0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluc3RlYWQuJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICAgIHByb3BzRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXCIkcHJvcHMgaXMgcmVhZG9ubHkuXCIsIHRoaXMpO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTtcblxuICBWdWUucHJvdG90eXBlLiRzZXQgPSBzZXQ7XG4gIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDtcblxuICBWdWUucHJvdG90eXBlLiR3YXRjaCA9IGZ1bmN0aW9uIChcbiAgICBleHBPckZuLFxuICAgIGNiLFxuICAgIG9wdGlvbnNcbiAgKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoaXNQbGFpbk9iamVjdChjYikpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucylcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy51c2VyID0gdHJ1ZTtcbiAgICB2YXIgd2F0Y2hlciA9IG5ldyBXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuaW1tZWRpYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCB2bSwgKFwiY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyIFxcXCJcIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVud2F0Y2hGbiAoKSB7XG4gICAgICB3YXRjaGVyLnRlYXJkb3duKCk7XG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIHVpZCQzID0gMDtcblxuZnVuY3Rpb24gaW5pdE1peGluIChWdWUpIHtcbiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhIHVpZFxuICAgIHZtLl91aWQgPSB1aWQkMysrO1xuXG4gICAgdmFyIHN0YXJ0VGFnLCBlbmRUYWc7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHN0YXJ0VGFnID0gXCJ2dWUtcGVyZi1zdGFydDpcIiArICh2bS5fdWlkKTtcbiAgICAgIGVuZFRhZyA9IFwidnVlLXBlcmYtZW5kOlwiICsgKHZtLl91aWQpO1xuICAgICAgbWFyayhzdGFydFRhZyk7XG4gICAgfVxuXG4gICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWRcbiAgICB2bS5faXNWdWUgPSB0cnVlO1xuICAgIC8vIG1lcmdlIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkge1xuICAgICAgLy8gb3B0aW1pemUgaW50ZXJuYWwgY29tcG9uZW50IGluc3RhbnRpYXRpb25cbiAgICAgIC8vIHNpbmNlIGR5bmFtaWMgb3B0aW9ucyBtZXJnaW5nIGlzIHByZXR0eSBzbG93LCBhbmQgbm9uZSBvZiB0aGVcbiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LlxuICAgICAgaW5pdEludGVybmFsQ29tcG9uZW50KHZtLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoXG4gICAgICAgIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnModm0uY29uc3RydWN0b3IpLFxuICAgICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaW5pdFByb3h5KHZtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uX3JlbmRlclByb3h5ID0gdm07XG4gICAgfVxuICAgIC8vIGV4cG9zZSByZWFsIHNlbGZcbiAgICB2bS5fc2VsZiA9IHZtO1xuICAgIGluaXRMaWZlY3ljbGUodm0pO1xuICAgIGluaXRFdmVudHModm0pO1xuICAgIGluaXRSZW5kZXIodm0pO1xuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlQ3JlYXRlJyk7XG4gICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHNcbiAgICBpbml0U3RhdGUodm0pO1xuICAgIGluaXRQcm92aWRlKHZtKTsgLy8gcmVzb2x2ZSBwcm92aWRlIGFmdGVyIGRhdGEvcHJvcHNcbiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7XG4gICAgICB2bS5fbmFtZSA9IGZvcm1hdENvbXBvbmVudE5hbWUodm0sIGZhbHNlKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKFwidnVlIFwiICsgKHZtLl9uYW1lKSArIFwiIGluaXRcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIH1cblxuICAgIGlmICh2bS4kb3B0aW9ucy5lbCkge1xuICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGluaXRJbnRlcm5hbENvbXBvbmVudCAodm0sIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7XG4gIC8vIGRvaW5nIHRoaXMgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuIGR5bmFtaWMgZW51bWVyYXRpb24uXG4gIHZhciBwYXJlbnRWbm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlO1xuICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuICBvcHRzLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlO1xuXG4gIHZhciB2bm9kZUNvbXBvbmVudE9wdGlvbnMgPSBwYXJlbnRWbm9kZS5jb21wb25lbnRPcHRpb25zO1xuICBvcHRzLnByb3BzRGF0YSA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGE7XG4gIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7XG4gIG9wdHMuX3JlbmRlckNoaWxkcmVuID0gdm5vZGVDb21wb25lbnRPcHRpb25zLmNoaWxkcmVuO1xuICBvcHRzLl9jb21wb25lbnRUYWcgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMudGFnO1xuXG4gIGlmIChvcHRpb25zLnJlbmRlcikge1xuICAgIG9wdHMucmVuZGVyID0gb3B0aW9ucy5yZW5kZXI7XG4gICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZucztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zIChDdG9yKSB7XG4gIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zO1xuICBpZiAoQ3Rvci5zdXBlcikge1xuICAgIHZhciBzdXBlck9wdGlvbnMgPSByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKEN0b3Iuc3VwZXIpO1xuICAgIHZhciBjYWNoZWRTdXBlck9wdGlvbnMgPSBDdG9yLnN1cGVyT3B0aW9ucztcbiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHtcbiAgICAgIC8vIHN1cGVyIG9wdGlvbiBjaGFuZ2VkLFxuICAgICAgLy8gbmVlZCB0byByZXNvbHZlIG5ldyBvcHRpb25zLlxuICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7XG4gICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGxhdGUtbW9kaWZpZWQvYXR0YWNoZWQgb3B0aW9ucyAoIzQ5NzYpXG4gICAgICB2YXIgbW9kaWZpZWRPcHRpb25zID0gcmVzb2x2ZU1vZGlmaWVkT3B0aW9ucyhDdG9yKTtcbiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zXG4gICAgICBpZiAobW9kaWZpZWRPcHRpb25zKSB7XG4gICAgICAgIGV4dGVuZChDdG9yLmV4dGVuZE9wdGlvbnMsIG1vZGlmaWVkT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBvcHRpb25zID0gQ3Rvci5vcHRpb25zID0gbWVyZ2VPcHRpb25zKHN1cGVyT3B0aW9ucywgQ3Rvci5leHRlbmRPcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLm5hbWUpIHtcbiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTW9kaWZpZWRPcHRpb25zIChDdG9yKSB7XG4gIHZhciBtb2RpZmllZDtcbiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9ucztcbiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9ucztcbiAgZm9yICh2YXIga2V5IGluIGxhdGVzdCkge1xuICAgIGlmIChsYXRlc3Rba2V5XSAhPT0gc2VhbGVkW2tleV0pIHtcbiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfVxuICAgICAgbW9kaWZpZWRba2V5XSA9IGxhdGVzdFtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbW9kaWZpZWRcbn1cblxuZnVuY3Rpb24gVnVlIChvcHRpb25zKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgISh0aGlzIGluc3RhbmNlb2YgVnVlKVxuICApIHtcbiAgICB3YXJuKCdWdWUgaXMgYSBjb25zdHJ1Y3RvciBhbmQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkJyk7XG4gIH1cbiAgdGhpcy5faW5pdChvcHRpb25zKTtcbn1cblxuaW5pdE1peGluKFZ1ZSk7XG5zdGF0ZU1peGluKFZ1ZSk7XG5ldmVudHNNaXhpbihWdWUpO1xubGlmZWN5Y2xlTWl4aW4oVnVlKTtcbnJlbmRlck1peGluKFZ1ZSk7XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0VXNlIChWdWUpIHtcbiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICB2YXIgaW5zdGFsbGVkUGx1Z2lucyA9ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zIHx8ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zID0gW10pKTtcbiAgICBpZiAoaW5zdGFsbGVkUGx1Z2lucy5pbmRleE9mKHBsdWdpbikgPiAtMSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG4gICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGx1Z2luLmluc3RhbGwuYXBwbHkocGx1Z2luLCBhcmdzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9XG4gICAgaW5zdGFsbGVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgcmV0dXJuIHRoaXNcbiAgfTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHtcbiAgVnVlLm1peGluID0gZnVuY3Rpb24gKG1peGluKSB7XG4gICAgdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucywgbWl4aW4pO1xuICAgIHJldHVybiB0aGlzXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHtcbiAgLyoqXG4gICAqIEVhY2ggaW5zdGFuY2UgY29uc3RydWN0b3IsIGluY2x1ZGluZyBWdWUsIGhhcyBhIHVuaXF1ZVxuICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCBcImNoaWxkXG4gICAqIGNvbnN0cnVjdG9yc1wiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLlxuICAgKi9cbiAgVnVlLmNpZCA9IDA7XG4gIHZhciBjaWQgPSAxO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgVnVlLmV4dGVuZCA9IGZ1bmN0aW9uIChleHRlbmRPcHRpb25zKSB7XG4gICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307XG4gICAgdmFyIFN1cGVyID0gdGhpcztcbiAgICB2YXIgU3VwZXJJZCA9IFN1cGVyLmNpZDtcbiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pO1xuICAgIGlmIChjYWNoZWRDdG9yc1tTdXBlcklkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlZEN0b3JzW1N1cGVySWRdXG4gICAgfVxuXG4gICAgdmFyIG5hbWUgPSBleHRlbmRPcHRpb25zLm5hbWUgfHwgU3VwZXIub3B0aW9ucy5uYW1lO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIG5hbWUpIHtcbiAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgU3ViID0gZnVuY3Rpb24gVnVlQ29tcG9uZW50IChvcHRpb25zKSB7XG4gICAgICB0aGlzLl9pbml0KG9wdGlvbnMpO1xuICAgIH07XG4gICAgU3ViLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3VwZXIucHJvdG90eXBlKTtcbiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViO1xuICAgIFN1Yi5jaWQgPSBjaWQrKztcbiAgICBTdWIub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhcbiAgICAgIFN1cGVyLm9wdGlvbnMsXG4gICAgICBleHRlbmRPcHRpb25zXG4gICAgKTtcbiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjtcblxuICAgIC8vIEZvciBwcm9wcyBhbmQgY29tcHV0ZWQgcHJvcGVydGllcywgd2UgZGVmaW5lIHRoZSBwcm94eSBnZXR0ZXJzIG9uXG4gICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXNcbiAgICAvLyBhdm9pZHMgT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxzIGZvciBlYWNoIGluc3RhbmNlIGNyZWF0ZWQuXG4gICAgaWYgKFN1Yi5vcHRpb25zLnByb3BzKSB7XG4gICAgICBpbml0UHJvcHMkMShTdWIpO1xuICAgIH1cbiAgICBpZiAoU3ViLm9wdGlvbnMuY29tcHV0ZWQpIHtcbiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7XG4gICAgfVxuXG4gICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlXG4gICAgU3ViLmV4dGVuZCA9IFN1cGVyLmV4dGVuZDtcbiAgICBTdWIubWl4aW4gPSBTdXBlci5taXhpbjtcbiAgICBTdWIudXNlID0gU3VwZXIudXNlO1xuXG4gICAgLy8gY3JlYXRlIGFzc2V0IHJlZ2lzdGVycywgc28gZXh0ZW5kZWQgY2xhc3Nlc1xuICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby5cbiAgICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICBTdWJbdHlwZV0gPSBTdXBlclt0eXBlXTtcbiAgICB9KTtcbiAgICAvLyBlbmFibGUgcmVjdXJzaXZlIHNlbGYtbG9va3VwXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7XG4gICAgfVxuXG4gICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS5cbiAgICAvLyBsYXRlciBhdCBpbnN0YW50aWF0aW9uIHdlIGNhbiBjaGVjayBpZiBTdXBlcidzIG9wdGlvbnMgaGF2ZVxuICAgIC8vIGJlZW4gdXBkYXRlZC5cbiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9ucztcbiAgICBTdWIuZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnM7XG4gICAgU3ViLnNlYWxlZE9wdGlvbnMgPSBleHRlbmQoe30sIFN1Yi5vcHRpb25zKTtcblxuICAgIC8vIGNhY2hlIGNvbnN0cnVjdG9yXG4gICAgY2FjaGVkQ3RvcnNbU3VwZXJJZF0gPSBTdWI7XG4gICAgcmV0dXJuIFN1YlxuICB9O1xufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMkMSAoQ29tcCkge1xuICB2YXIgcHJvcHMgPSBDb21wLm9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgIHByb3h5KENvbXAucHJvdG90eXBlLCBcIl9wcm9wc1wiLCBrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRDb21wdXRlZCQxIChDb21wKSB7XG4gIHZhciBjb21wdXRlZCA9IENvbXAub3B0aW9ucy5jb21wdXRlZDtcbiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7XG4gICAgZGVmaW5lQ29tcHV0ZWQoQ29tcC5wcm90b3R5cGUsIGtleSwgY29tcHV0ZWRba2V5XSk7XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRBc3NldFJlZ2lzdGVycyAoVnVlKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKFxuICAgICAgaWQsXG4gICAgICBkZWZpbml0aW9uXG4gICAgKSB7XG4gICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1t0eXBlICsgJ3MnXVtpZF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50Jykge1xuICAgICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBkZWZpbml0aW9uLm5hbWUgPSBkZWZpbml0aW9uLm5hbWUgfHwgaWQ7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQoZGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdkaXJlY3RpdmUnICYmIHR5cGVvZiBkZWZpbml0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHsgYmluZDogZGVmaW5pdGlvbiwgdXBkYXRlOiBkZWZpbml0aW9uIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zW3R5cGUgKyAncyddW2lkXSA9IGRlZmluaXRpb247XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qICAqL1xuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSAob3B0cykge1xuICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZylcbn1cblxuZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLmluZGV4T2YobmFtZSkgPiAtMVxuICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KCcsJykuaW5kZXhPZihuYW1lKSA+IC0xXG4gIH0gZWxzZSBpZiAoaXNSZWdFeHAocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHtcbiAgdmFyIGNhY2hlID0ga2VlcEFsaXZlSW5zdGFuY2UuY2FjaGU7XG4gIHZhciBrZXlzID0ga2VlcEFsaXZlSW5zdGFuY2Uua2V5cztcbiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTtcbiAgZm9yICh2YXIga2V5IGluIGNhY2hlKSB7XG4gICAgdmFyIGNhY2hlZE5vZGUgPSBjYWNoZVtrZXldO1xuICAgIGlmIChjYWNoZWROb2RlKSB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY2FjaGVkTm9kZS5jb21wb25lbnRPcHRpb25zKTtcbiAgICAgIGlmIChuYW1lICYmICFmaWx0ZXIobmFtZSkpIHtcbiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoXG4gIGNhY2hlLFxuICBrZXksXG4gIGtleXMsXG4gIGN1cnJlbnRcbikge1xuICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTtcbiAgaWYgKGNhY2hlZCQkMSAmJiAoIWN1cnJlbnQgfHwgY2FjaGVkJCQxLnRhZyAhPT0gY3VycmVudC50YWcpKSB7XG4gICAgY2FjaGVkJCQxLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7XG4gIH1cbiAgY2FjaGVba2V5XSA9IG51bGw7XG4gIHJlbW92ZShrZXlzLCBrZXkpO1xufVxuXG52YXIgcGF0dGVyblR5cGVzID0gW1N0cmluZywgUmVnRXhwLCBBcnJheV07XG5cbnZhciBLZWVwQWxpdmUgPSB7XG4gIG5hbWU6ICdrZWVwLWFsaXZlJyxcbiAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgcHJvcHM6IHtcbiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsXG4gICAgZXhjbHVkZTogcGF0dGVyblR5cGVzLFxuICAgIG1heDogW1N0cmluZywgTnVtYmVyXVxuICB9LFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQgKCkge1xuICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMua2V5cyA9IFtdO1xuICB9LFxuXG4gIGRlc3Ryb3llZDogZnVuY3Rpb24gZGVzdHJveWVkICgpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jYWNoZSkge1xuICAgICAgcHJ1bmVDYWNoZUVudHJ5KHRoaXMuY2FjaGUsIGtleSwgdGhpcy5rZXlzKTtcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB0aGlzLiR3YXRjaCgnaW5jbHVkZScsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcyQxLCBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gbWF0Y2hlcyh2YWwsIG5hbWUpOyB9KTtcbiAgICB9KTtcbiAgICB0aGlzLiR3YXRjaCgnZXhjbHVkZScsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcyQxLCBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gIW1hdGNoZXModmFsLCBuYW1lKTsgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkge1xuICAgIHZhciBzbG90ID0gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICB2YXIgdm5vZGUgPSBnZXRGaXJzdENvbXBvbmVudENoaWxkKHNsb3QpO1xuICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgICBpZiAoY29tcG9uZW50T3B0aW9ucykge1xuICAgICAgLy8gY2hlY2sgcGF0dGVyblxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpO1xuICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICB2YXIgaW5jbHVkZSA9IHJlZi5pbmNsdWRlO1xuICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gbm90IGluY2x1ZGVkXG4gICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8XG4gICAgICAgIC8vIGV4Y2x1ZGVkXG4gICAgICAgIChleGNsdWRlICYmIG5hbWUgJiYgbWF0Y2hlcyhleGNsdWRlLCBuYW1lKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdm5vZGVcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiQxID0gdGhpcztcbiAgICAgIHZhciBjYWNoZSA9IHJlZiQxLmNhY2hlO1xuICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzO1xuICAgICAgdmFyIGtleSA9IHZub2RlLmtleSA9PSBudWxsXG4gICAgICAgIC8vIHNhbWUgY29uc3RydWN0b3IgbWF5IGdldCByZWdpc3RlcmVkIGFzIGRpZmZlcmVudCBsb2NhbCBjb21wb25lbnRzXG4gICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSlcbiAgICAgICAgPyBjb21wb25lbnRPcHRpb25zLkN0b3IuY2lkICsgKGNvbXBvbmVudE9wdGlvbnMudGFnID8gKFwiOjpcIiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpXG4gICAgICAgIDogdm5vZGUua2V5O1xuICAgICAgaWYgKGNhY2hlW2tleV0pIHtcbiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgICAvLyBtYWtlIGN1cnJlbnQga2V5IGZyZXNoZXN0XG4gICAgICAgIHJlbW92ZShrZXlzLCBrZXkpO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlW2tleV0gPSB2bm9kZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgIC8vIHBydW5lIG9sZGVzdCBlbnRyeVxuICAgICAgICBpZiAodGhpcy5tYXggJiYga2V5cy5sZW5ndGggPiBwYXJzZUludCh0aGlzLm1heCkpIHtcbiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2bm9kZS5kYXRhLmtlZXBBbGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKVxuICB9XG59O1xuXG52YXIgYnVpbHRJbkNvbXBvbmVudHMgPSB7XG4gIEtlZXBBbGl2ZTogS2VlcEFsaXZlXG59O1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7XG4gIC8vIGNvbmZpZ1xuICB2YXIgY29uZmlnRGVmID0ge307XG4gIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdEbyBub3QgcmVwbGFjZSB0aGUgVnVlLmNvbmZpZyBvYmplY3QsIHNldCBpbmRpdmlkdWFsIGZpZWxkcyBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTtcblxuICAvLyBleHBvc2VkIHV0aWwgbWV0aG9kcy5cbiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uXG4gIC8vIHRoZW0gdW5sZXNzIHlvdSBhcmUgYXdhcmUgb2YgdGhlIHJpc2suXG4gIFZ1ZS51dGlsID0ge1xuICAgIHdhcm46IHdhcm4sXG4gICAgZXh0ZW5kOiBleHRlbmQsXG4gICAgbWVyZ2VPcHRpb25zOiBtZXJnZU9wdGlvbnMsXG4gICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlJCQxXG4gIH07XG5cbiAgVnVlLnNldCA9IHNldDtcbiAgVnVlLmRlbGV0ZSA9IGRlbDtcbiAgVnVlLm5leHRUaWNrID0gbmV4dFRpY2s7XG5cbiAgLy8gMi42IGV4cGxpY2l0IG9ic2VydmFibGUgQVBJXG4gIFZ1ZS5vYnNlcnZhYmxlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIG9ic2VydmUob2JqKTtcbiAgICByZXR1cm4gb2JqXG4gIH07XG5cbiAgVnVlLm9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9KTtcblxuICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIFwiYmFzZVwiIGNvbnN0cnVjdG9yIHRvIGV4dGVuZCBhbGwgcGxhaW4tb2JqZWN0XG4gIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLlxuICBWdWUub3B0aW9ucy5fYmFzZSA9IFZ1ZTtcblxuICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpO1xuXG4gIGluaXRVc2UoVnVlKTtcbiAgaW5pdE1peGluJDEoVnVlKTtcbiAgaW5pdEV4dGVuZChWdWUpO1xuICBpbml0QXNzZXRSZWdpc3RlcnMoVnVlKTtcbn1cblxuaW5pdEdsb2JhbEFQSShWdWUpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRpc1NlcnZlcicsIHtcbiAgZ2V0OiBpc1NlcnZlclJlbmRlcmluZ1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJHNzckNvbnRleHQnLCB7XG4gIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0XG4gIH1cbn0pO1xuXG4vLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb25cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUsICdGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCcsIHtcbiAgdmFsdWU6IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0XG59KTtcblxuVnVlLnZlcnNpb24gPSAnMi42LjEwJztcblxuLyogICovXG5cbi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheVxuLy8gZHVyaW5nIHRlbXBsYXRlIGNvbXBpbGF0aW9uXG52YXIgaXNSZXNlcnZlZEF0dHIgPSBtYWtlTWFwKCdzdHlsZSxjbGFzcycpO1xuXG4vLyBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHVzaW5nIHByb3BzIGZvciBiaW5kaW5nXG52YXIgYWNjZXB0VmFsdWUgPSBtYWtlTWFwKCdpbnB1dCx0ZXh0YXJlYSxvcHRpb24sc2VsZWN0LHByb2dyZXNzJyk7XG52YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7XG4gIHJldHVybiAoXG4gICAgKGF0dHIgPT09ICd2YWx1ZScgJiYgYWNjZXB0VmFsdWUodGFnKSkgJiYgdHlwZSAhPT0gJ2J1dHRvbicgfHxcbiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fFxuICAgIChhdHRyID09PSAnY2hlY2tlZCcgJiYgdGFnID09PSAnaW5wdXQnKSB8fFxuICAgIChhdHRyID09PSAnbXV0ZWQnICYmIHRhZyA9PT0gJ3ZpZGVvJylcbiAgKVxufTtcblxudmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTtcblxudmFyIGlzVmFsaWRDb250ZW50RWRpdGFibGVWYWx1ZSA9IG1ha2VNYXAoJ2V2ZW50cyxjYXJldCx0eXBpbmcscGxhaW50ZXh0LW9ubHknKTtcblxudmFyIGNvbnZlcnRFbnVtZXJhdGVkVmFsdWUgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZSdcbiAgICA/ICdmYWxzZSdcbiAgICAvLyBhbGxvdyBhcmJpdHJhcnkgc3RyaW5nIHZhbHVlIGZvciBjb250ZW50ZWRpdGFibGVcbiAgICA6IGtleSA9PT0gJ2NvbnRlbnRlZGl0YWJsZScgJiYgaXNWYWxpZENvbnRlbnRFZGl0YWJsZVZhbHVlKHZhbHVlKVxuICAgICAgPyB2YWx1ZVxuICAgICAgOiAndHJ1ZSdcbn07XG5cbnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcChcbiAgJ2FsbG93ZnVsbHNjcmVlbixhc3luYyxhdXRvZm9jdXMsYXV0b3BsYXksY2hlY2tlZCxjb21wYWN0LGNvbnRyb2xzLGRlY2xhcmUsJyArXG4gICdkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsJyArXG4gICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgK1xuICAnbXV0ZWQsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm92YWxpZGF0ZSxub3dyYXAsb3BlbixwYXVzZW9uZXhpdCxyZWFkb25seSwnICtcbiAgJ3JlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cmFuc2xhdGUsJyArXG4gICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJ1xuKTtcblxudmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7XG5cbnZhciBpc1hsaW5rID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJ1xufTtcblxudmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBpc1hsaW5rKG5hbWUpID8gbmFtZS5zbGljZSg2LCBuYW1lLmxlbmd0aCkgOiAnJ1xufTtcblxudmFyIGlzRmFsc3lBdHRyVmFsdWUgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCB2YWwgPT09IGZhbHNlXG59O1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gZ2VuQ2xhc3NGb3JWbm9kZSAodm5vZGUpIHtcbiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlO1xuICB2YXIgY2hpbGROb2RlID0gdm5vZGU7XG4gIHdoaWxlIChpc0RlZihjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UpKSB7XG4gICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtcbiAgICBpZiAoY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhKSB7XG4gICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoY2hpbGROb2RlLmRhdGEsIGRhdGEpO1xuICAgIH1cbiAgfVxuICB3aGlsZSAoaXNEZWYocGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50KSkge1xuICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkge1xuICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGRhdGEsIHBhcmVudE5vZGUuZGF0YSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZW5kZXJDbGFzcyhkYXRhLnN0YXRpY0NsYXNzLCBkYXRhLmNsYXNzKVxufVxuXG5mdW5jdGlvbiBtZXJnZUNsYXNzRGF0YSAoY2hpbGQsIHBhcmVudCkge1xuICByZXR1cm4ge1xuICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksXG4gICAgY2xhc3M6IGlzRGVmKGNoaWxkLmNsYXNzKVxuICAgICAgPyBbY2hpbGQuY2xhc3MsIHBhcmVudC5jbGFzc11cbiAgICAgIDogcGFyZW50LmNsYXNzXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyQ2xhc3MgKFxuICBzdGF0aWNDbGFzcyxcbiAgZHluYW1pY0NsYXNzXG4pIHtcbiAgaWYgKGlzRGVmKHN0YXRpY0NsYXNzKSB8fCBpc0RlZihkeW5hbWljQ2xhc3MpKSB7XG4gICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIHJldHVybiBhID8gYiA/IChhICsgJyAnICsgYikgOiBhIDogKGIgfHwgJycpXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNsYXNzICh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpXG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7XG4gIHZhciByZXMgPSAnJztcbiAgdmFyIHN0cmluZ2lmaWVkO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmIChpc0RlZihzdHJpbmdpZmllZCA9IHN0cmluZ2lmeUNsYXNzKHZhbHVlW2ldKSkgJiYgc3RyaW5naWZpZWQgIT09ICcnKSB7XG4gICAgICBpZiAocmVzKSB7IHJlcyArPSAnICc7IH1cbiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlW2tleV0pIHtcbiAgICAgIGlmIChyZXMpIHsgcmVzICs9ICcgJzsgfVxuICAgICAgcmVzICs9IGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxudmFyIG5hbWVzcGFjZU1hcCA9IHtcbiAgc3ZnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCdcbn07XG5cbnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKFxuICAnaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsJyArXG4gICdhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sJyArXG4gICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICtcbiAgJ2EsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSwnICtcbiAgJ3Msc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLCcgK1xuICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArXG4gICdjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0ciwnICtcbiAgJ2J1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sJyArXG4gICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgK1xuICAnZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LCcgK1xuICAnY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCdcbik7XG5cbi8vIHRoaXMgbWFwIGlzIGludGVudGlvbmFsbHkgc2VsZWN0aXZlLCBvbmx5IGNvdmVyaW5nIFNWRyBlbGVtZW50cyB0aGF0IG1heVxuLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy5cbnZhciBpc1NWRyA9IG1ha2VNYXAoXG4gICdzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsJyArXG4gICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICtcbiAgJ3BvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXcnLFxuICB0cnVlXG4pO1xuXG52YXIgaXNSZXNlcnZlZFRhZyA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgcmV0dXJuIGlzSFRNTFRhZyh0YWcpIHx8IGlzU1ZHKHRhZylcbn07XG5cbmZ1bmN0aW9uIGdldFRhZ05hbWVzcGFjZSAodGFnKSB7XG4gIGlmIChpc1NWRyh0YWcpKSB7XG4gICAgcmV0dXJuICdzdmcnXG4gIH1cbiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MXG4gIC8vIG5vdGUgaXQgZG9lc24ndCBzdXBwb3J0IG90aGVyIE1hdGhNTCBlbGVtZW50cyBiZWluZyBjb21wb25lbnQgcm9vdHNcbiAgaWYgKHRhZyA9PT0gJ21hdGgnKSB7XG4gICAgcmV0dXJuICdtYXRoJ1xuICB9XG59XG5cbnZhciB1bmtub3duRWxlbWVudENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQgKHRhZykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFpbkJyb3dzZXIpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmIChpc1Jlc2VydmVkVGFnKHRhZykpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICB0YWcgPSB0YWcudG9Mb3dlckNhc2UoKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkge1xuICAgIHJldHVybiB1bmtub3duRWxlbWVudENhY2hlW3RhZ11cbiAgfVxuICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGlmICh0YWcuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yODIxMDM2NC8xMDcwMjQ0XG4gICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoXG4gICAgICBlbC5jb25zdHJ1Y3RvciA9PT0gd2luZG93LkhUTUxVbmtub3duRWxlbWVudCB8fFxuICAgICAgZWwuY29uc3RydWN0b3IgPT09IHdpbmRvdy5IVE1MRWxlbWVudFxuICAgICkpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAvSFRNTFVua25vd25FbGVtZW50Ly50ZXN0KGVsLnRvU3RyaW5nKCkpKVxuICB9XG59XG5cbnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpO1xuXG4vKiAgKi9cblxuLyoqXG4gKiBRdWVyeSBhbiBlbGVtZW50IHNlbGVjdG9yIGlmIGl0J3Mgbm90IGFuIGVsZW1lbnQgYWxyZWFkeS5cbiAqL1xuZnVuY3Rpb24gcXVlcnkgKGVsKSB7XG4gIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7XG4gICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAnQ2Fubm90IGZpbmQgZWxlbWVudDogJyArIGVsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RlZFxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbFxuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50JDEgKHRhZ05hbWUsIHZub2RlKSB7XG4gIHZhciBlbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICByZXR1cm4gZWxtXG4gIH1cbiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3RcbiAgaWYgKHZub2RlLmRhdGEgJiYgdm5vZGUuZGF0YS5hdHRycyAmJiB2bm9kZS5kYXRhLmF0dHJzLm11bHRpcGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbG0uc2V0QXR0cmlidXRlKCdtdWx0aXBsZScsICdtdWx0aXBsZScpO1xuICB9XG4gIHJldHVybiBlbG1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TIChuYW1lc3BhY2UsIHRhZ05hbWUpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VNYXBbbmFtZXNwYWNlXSwgdGFnTmFtZSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUgKHRleHQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQodGV4dClcbn1cblxuZnVuY3Rpb24gaW5zZXJ0QmVmb3JlIChwYXJlbnROb2RlLCBuZXdOb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZCAobm9kZSwgY2hpbGQpIHtcbiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkge1xuICBub2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gcGFyZW50Tm9kZSAobm9kZSkge1xuICByZXR1cm4gbm9kZS5wYXJlbnROb2RlXG59XG5cbmZ1bmN0aW9uIG5leHRTaWJsaW5nIChub2RlKSB7XG4gIHJldHVybiBub2RlLm5leHRTaWJsaW5nXG59XG5cbmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGFnTmFtZVxufVxuXG5mdW5jdGlvbiBzZXRUZXh0Q29udGVudCAobm9kZSwgdGV4dCkge1xuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn1cblxuZnVuY3Rpb24gc2V0U3R5bGVTY29wZSAobm9kZSwgc2NvcGVJZCkge1xuICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7XG59XG5cbnZhciBub2RlT3BzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50JDEsXG4gIGNyZWF0ZUVsZW1lbnROUzogY3JlYXRlRWxlbWVudE5TLFxuICBjcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsXG4gIGNyZWF0ZUNvbW1lbnQ6IGNyZWF0ZUNvbW1lbnQsXG4gIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICByZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsXG4gIGFwcGVuZENoaWxkOiBhcHBlbmRDaGlsZCxcbiAgcGFyZW50Tm9kZTogcGFyZW50Tm9kZSxcbiAgbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLFxuICB0YWdOYW1lOiB0YWdOYW1lLFxuICBzZXRUZXh0Q29udGVudDogc2V0VGV4dENvbnRlbnQsXG4gIHNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGVcbn0pO1xuXG4vKiAgKi9cblxudmFyIHJlZiA9IHtcbiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7XG4gICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgaWYgKG9sZFZub2RlLmRhdGEucmVmICE9PSB2bm9kZS5kYXRhLnJlZikge1xuICAgICAgcmVnaXN0ZXJSZWYob2xkVm5vZGUsIHRydWUpO1xuICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICAgIH1cbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICByZWdpc3RlclJlZih2bm9kZSwgdHJ1ZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7XG4gIHZhciBrZXkgPSB2bm9kZS5kYXRhLnJlZjtcbiAgaWYgKCFpc0RlZihrZXkpKSB7IHJldHVybiB9XG5cbiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDtcbiAgdmFyIHJlZiA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlIHx8IHZub2RlLmVsbTtcbiAgdmFyIHJlZnMgPSB2bS4kcmVmcztcbiAgaWYgKGlzUmVtb3ZhbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHtcbiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7XG4gICAgfSBlbHNlIGlmIChyZWZzW2tleV0gPT09IHJlZikge1xuICAgICAgcmVmc1trZXldID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodm5vZGUuZGF0YS5yZWZJbkZvcikge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHtcbiAgICAgICAgcmVmc1trZXldID0gW3JlZl07XG4gICAgICB9IGVsc2UgaWYgKHJlZnNba2V5XS5pbmRleE9mKHJlZikgPCAwKSB7XG4gICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgICAgICByZWZzW2tleV0ucHVzaChyZWYpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWZzW2tleV0gPSByZWY7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmlydHVhbCBET00gcGF0Y2hpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIFNuYWJiZG9tIGJ5XG4gKiBTaW1vbiBGcmlpcyBWaW5kdW0gKEBwYWxkZXBpbmQpXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxkZXBpbmQvc25hYmJkb20vYmxvYi9tYXN0ZXIvTElDRU5TRVxuICpcbiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKVxuICpcbiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgYmVjYXVzZSB0aGlzIGZpbGUgaXMgcGVyZi1jcml0aWNhbCBhbmQgdGhlIGNvc3RcbiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LlxuICovXG5cbnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7XG5cbnZhciBob29rcyA9IFsnY3JlYXRlJywgJ2FjdGl2YXRlJywgJ3VwZGF0ZScsICdyZW1vdmUnLCAnZGVzdHJveSddO1xuXG5mdW5jdGlvbiBzYW1lVm5vZGUgKGEsIGIpIHtcbiAgcmV0dXJuIChcbiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKFxuICAgICAgKFxuICAgICAgICBhLnRhZyA9PT0gYi50YWcgJiZcbiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmXG4gICAgICAgIGlzRGVmKGEuZGF0YSkgPT09IGlzRGVmKGIuZGF0YSkgJiZcbiAgICAgICAgc2FtZUlucHV0VHlwZShhLCBiKVxuICAgICAgKSB8fCAoXG4gICAgICAgIGlzVHJ1ZShhLmlzQXN5bmNQbGFjZWhvbGRlcikgJiZcbiAgICAgICAgYS5hc3luY0ZhY3RvcnkgPT09IGIuYXN5bmNGYWN0b3J5ICYmXG4gICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHtcbiAgaWYgKGEudGFnICE9PSAnaW5wdXQnKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGk7XG4gIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHZhciB0eXBlQiA9IGlzRGVmKGkgPSBiLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHJldHVybiB0eXBlQSA9PT0gdHlwZUIgfHwgaXNUZXh0SW5wdXRUeXBlKHR5cGVBKSAmJiBpc1RleHRJbnB1dFR5cGUodHlwZUIpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVRvT2xkSWR4IChjaGlsZHJlbiwgYmVnaW5JZHgsIGVuZElkeCkge1xuICB2YXIgaSwga2V5O1xuICB2YXIgbWFwID0ge307XG4gIGZvciAoaSA9IGJlZ2luSWR4OyBpIDw9IGVuZElkeDsgKytpKSB7XG4gICAga2V5ID0gY2hpbGRyZW5baV0ua2V5O1xuICAgIGlmIChpc0RlZihrZXkpKSB7IG1hcFtrZXldID0gaTsgfVxuICB9XG4gIHJldHVybiBtYXBcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkge1xuICB2YXIgaSwgajtcbiAgdmFyIGNicyA9IHt9O1xuXG4gIHZhciBtb2R1bGVzID0gYmFja2VuZC5tb2R1bGVzO1xuICB2YXIgbm9kZU9wcyA9IGJhY2tlbmQubm9kZU9wcztcblxuICBmb3IgKGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyArK2kpIHtcbiAgICBjYnNbaG9va3NbaV1dID0gW107XG4gICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmIChpc0RlZihtb2R1bGVzW2pdW2hvb2tzW2ldXSkpIHtcbiAgICAgICAgY2JzW2hvb2tzW2ldXS5wdXNoKG1vZHVsZXNbal1baG9va3NbaV1dKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbXB0eU5vZGVBdCAoZWxtKSB7XG4gICAgcmV0dXJuIG5ldyBWTm9kZShub2RlT3BzLnRhZ05hbWUoZWxtKS50b0xvd2VyQ2FzZSgpLCB7fSwgW10sIHVuZGVmaW5lZCwgZWxtKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUm1DYiAoY2hpbGRFbG0sIGxpc3RlbmVycykge1xuICAgIGZ1bmN0aW9uIHJlbW92ZSQkMSAoKSB7XG4gICAgICBpZiAoLS1yZW1vdmUkJDEubGlzdGVuZXJzID09PSAwKSB7XG4gICAgICAgIHJlbW92ZU5vZGUoY2hpbGRFbG0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZW1vdmUkJDEubGlzdGVuZXJzID0gbGlzdGVuZXJzO1xuICAgIHJldHVybiByZW1vdmUkJDFcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7XG4gICAgdmFyIHBhcmVudCA9IG5vZGVPcHMucGFyZW50Tm9kZShlbCk7XG4gICAgLy8gZWxlbWVudCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBkdWUgdG8gdi1odG1sIC8gdi10ZXh0XG4gICAgaWYgKGlzRGVmKHBhcmVudCkpIHtcbiAgICAgIG5vZGVPcHMucmVtb3ZlQ2hpbGQocGFyZW50LCBlbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNVbmtub3duRWxlbWVudCQkMSAodm5vZGUsIGluVlByZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhaW5WUHJlICYmXG4gICAgICAhdm5vZGUubnMgJiZcbiAgICAgICEoXG4gICAgICAgIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMubGVuZ3RoICYmXG4gICAgICAgIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMuc29tZShmdW5jdGlvbiAoaWdub3JlKSB7XG4gICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSlcbiAgICAgICAgICAgID8gaWdub3JlLnRlc3Qodm5vZGUudGFnKVxuICAgICAgICAgICAgOiBpZ25vcmUgPT09IHZub2RlLnRhZ1xuICAgICAgICB9KVxuICAgICAgKSAmJlxuICAgICAgY29uZmlnLmlzVW5rbm93bkVsZW1lbnQodm5vZGUudGFnKVxuICAgIClcbiAgfVxuXG4gIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxtIChcbiAgICB2bm9kZSxcbiAgICBpbnNlcnRlZFZub2RlUXVldWUsXG4gICAgcGFyZW50RWxtLFxuICAgIHJlZkVsbSxcbiAgICBuZXN0ZWQsXG4gICAgb3duZXJBcnJheSxcbiAgICBpbmRleFxuICApIHtcbiAgICBpZiAoaXNEZWYodm5vZGUuZWxtKSAmJiBpc0RlZihvd25lckFycmF5KSkge1xuICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciFcbiAgICAgIC8vIG5vdyBpdCdzIHVzZWQgYXMgYSBuZXcgbm9kZSwgb3ZlcndyaXRpbmcgaXRzIGVsbSB3b3VsZCBjYXVzZVxuICAgICAgLy8gcG90ZW50aWFsIHBhdGNoIGVycm9ycyBkb3duIHRoZSByb2FkIHdoZW4gaXQncyB1c2VkIGFzIGFuIGluc2VydGlvblxuICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmdcbiAgICAgIC8vIGFzc29jaWF0ZWQgRE9NIGVsZW1lbnQgZm9yIGl0LlxuICAgICAgdm5vZGUgPSBvd25lckFycmF5W2luZGV4XSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIH1cblxuICAgIHZub2RlLmlzUm9vdEluc2VydCA9ICFuZXN0ZWQ7IC8vIGZvciB0cmFuc2l0aW9uIGVudGVyIGNoZWNrXG4gICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgdGFnID0gdm5vZGUudGFnO1xuICAgIGlmIChpc0RlZih0YWcpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnByZSkge1xuICAgICAgICAgIGNyZWF0aW5nRWxtSW5WUHJlKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5rbm93bkVsZW1lbnQkJDEodm5vZGUsIGNyZWF0aW5nRWxtSW5WUHJlKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArXG4gICAgICAgICAgICAncmVnaXN0ZXIgdGhlIGNvbXBvbmVudCBjb3JyZWN0bHk/IEZvciByZWN1cnNpdmUgY29tcG9uZW50cywgJyArXG4gICAgICAgICAgICAnbWFrZSBzdXJlIHRvIHByb3ZpZGUgdGhlIFwibmFtZVwiIG9wdGlvbi4nLFxuICAgICAgICAgICAgdm5vZGUuY29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdm5vZGUuZWxtID0gdm5vZGUubnNcbiAgICAgICAgPyBub2RlT3BzLmNyZWF0ZUVsZW1lbnROUyh2bm9kZS5ucywgdGFnKVxuICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTtcbiAgICAgIHNldFNjb3BlKHZub2RlKTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICB7XG4gICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkYXRhICYmIGRhdGEucHJlKSB7XG4gICAgICAgIGNyZWF0aW5nRWxtSW5WUHJlLS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1RydWUodm5vZGUuaXNDb21tZW50KSkge1xuICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVDb21tZW50KHZub2RlLnRleHQpO1xuICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bm9kZS5lbG0gPSBub2RlT3BzLmNyZWF0ZVRleHROb2RlKHZub2RlLnRleHQpO1xuICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHtcbiAgICB2YXIgaSA9IHZub2RlLmRhdGE7XG4gICAgaWYgKGlzRGVmKGkpKSB7XG4gICAgICB2YXIgaXNSZWFjdGl2YXRlZCA9IGlzRGVmKHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpLmtlZXBBbGl2ZTtcbiAgICAgIGlmIChpc0RlZihpID0gaS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkge1xuICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8pO1xuICAgICAgfVxuICAgICAgLy8gYWZ0ZXIgY2FsbGluZyB0aGUgaW5pdCBob29rLCBpZiB0aGUgdm5vZGUgaXMgYSBjaGlsZCBjb21wb25lbnRcbiAgICAgIC8vIGl0IHNob3VsZCd2ZSBjcmVhdGVkIGEgY2hpbGQgaW5zdGFuY2UgYW5kIG1vdW50ZWQgaXQuIHRoZSBjaGlsZFxuICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uXG4gICAgICAvLyBpbiB0aGF0IGNhc2Ugd2UgY2FuIGp1c3QgcmV0dXJuIHRoZSBlbGVtZW50IGFuZCBiZSBkb25lLlxuICAgICAgaWYgKGlzRGVmKHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSkge1xuICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7XG4gICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHtcbiAgICAgICAgICByZWFjdGl2YXRlQ29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkge1xuICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2guYXBwbHkoaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB2bm9kZS5kYXRhLnBlbmRpbmdJbnNlcnQpO1xuICAgICAgdm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gbnVsbDtcbiAgICB9XG4gICAgdm5vZGUuZWxtID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UuJGVsO1xuICAgIGlmIChpc1BhdGNoYWJsZSh2bm9kZSkpIHtcbiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgc2V0U2NvcGUodm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC5cbiAgICAgIC8vIHNraXAgYWxsIGVsZW1lbnQtcmVsYXRlZCBtb2R1bGVzIGV4Y2VwdCBmb3IgcmVmICgjMzQ1NSlcbiAgICAgIHJlZ2lzdGVyUmVmKHZub2RlKTtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rXG4gICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhY3RpdmF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHtcbiAgICB2YXIgaTtcbiAgICAvLyBoYWNrIGZvciAjNDMzOTogYSByZWFjdGl2YXRlZCBjb21wb25lbnQgd2l0aCBpbm5lciB0cmFuc2l0aW9uXG4gICAgLy8gZG9lcyBub3QgdHJpZ2dlciBiZWNhdXNlIHRoZSBpbm5lciBub2RlJ3MgY3JlYXRlZCBob29rcyBhcmUgbm90IGNhbGxlZFxuICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dFxuICAgIC8vIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gaXQuXG4gICAgdmFyIGlubmVyTm9kZSA9IHZub2RlO1xuICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIGlubmVyTm9kZSA9IGlubmVyTm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgICBpZiAoaXNEZWYoaSA9IGlubmVyTm9kZS5kYXRhKSAmJiBpc0RlZihpID0gaS50cmFuc2l0aW9uKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY2JzLmFjdGl2YXRlW2ldKGVtcHR5Tm9kZSwgaW5uZXJOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB1bmxpa2UgYSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudCxcbiAgICAvLyBhIHJlYWN0aXZhdGVkIGtlZXAtYWxpdmUgY29tcG9uZW50IGRvZXNuJ3QgaW5zZXJ0IGl0c2VsZlxuICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkge1xuICAgIGlmIChpc0RlZihwYXJlbnQpKSB7XG4gICAgICBpZiAoaXNEZWYocmVmJCQxKSkge1xuICAgICAgICBpZiAobm9kZU9wcy5wYXJlbnROb2RlKHJlZiQkMSkgPT09IHBhcmVudCkge1xuICAgICAgICAgIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudCwgZWxtLCByZWYkJDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlT3BzLmFwcGVuZENoaWxkKHBhcmVudCwgZWxtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhjaGlsZHJlbik7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNyZWF0ZUVsbShjaGlsZHJlbltpXSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB2bm9kZS5lbG0sIG51bGwsIHRydWUsIGNoaWxkcmVuLCBpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7XG4gICAgICBub2RlT3BzLmFwcGVuZENoaWxkKHZub2RlLmVsbSwgbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZShTdHJpbmcodm5vZGUudGV4dCkpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1BhdGNoYWJsZSAodm5vZGUpIHtcbiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIHZub2RlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO1xuICAgIH1cbiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKVxuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBjYnMuY3JlYXRlLmxlbmd0aDsgKytpJDEpIHtcbiAgICAgIGNicy5jcmVhdGVbaSQxXShlbXB0eU5vZGUsIHZub2RlKTtcbiAgICB9XG4gICAgaSA9IHZub2RlLmRhdGEuaG9vazsgLy8gUmV1c2UgdmFyaWFibGVcbiAgICBpZiAoaXNEZWYoaSkpIHtcbiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH1cbiAgICAgIGlmIChpc0RlZihpLmluc2VydCkpIHsgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2godm5vZGUpOyB9XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0IHNjb3BlIGlkIGF0dHJpYnV0ZSBmb3Igc2NvcGVkIENTUy5cbiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWRcbiAgLy8gb2YgZ29pbmcgdGhyb3VnaCB0aGUgbm9ybWFsIGF0dHJpYnV0ZSBwYXRjaGluZyBwcm9jZXNzLlxuICBmdW5jdGlvbiBzZXRTY29wZSAodm5vZGUpIHtcbiAgICB2YXIgaTtcbiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmZuU2NvcGVJZCkpIHtcbiAgICAgIG5vZGVPcHMuc2V0U3R5bGVTY29wZSh2bm9kZS5lbG0sIGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYW5jZXN0b3IgPSB2bm9kZTtcbiAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkge1xuICAgICAgICAgIG5vZGVPcHMuc2V0U3R5bGVTY29wZSh2bm9kZS5lbG0sIGkpO1xuICAgICAgICB9XG4gICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuXG4gICAgaWYgKGlzRGVmKGkgPSBhY3RpdmVJbnN0YW5jZSkgJiZcbiAgICAgIGkgIT09IHZub2RlLmNvbnRleHQgJiZcbiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJlxuICAgICAgaXNEZWYoaSA9IGkuJG9wdGlvbnMuX3Njb3BlSWQpXG4gICAgKSB7XG4gICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRWbm9kZXMgKHBhcmVudEVsbSwgcmVmRWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHtcbiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRGVzdHJveUhvb2sgKHZub2RlKSB7XG4gICAgdmFyIGksIGo7XG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIGlmIChpc0RlZihkYXRhKSkge1xuICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmRlc3Ryb3kpKSB7IGkodm5vZGUpOyB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9XG4gICAgfVxuICAgIGlmIChpc0RlZihpID0gdm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHtcbiAgICAgICAgaW52b2tlRGVzdHJveUhvb2sodm5vZGUuY2hpbGRyZW5bal0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHtcbiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICB2YXIgY2ggPSB2bm9kZXNbc3RhcnRJZHhdO1xuICAgICAgaWYgKGlzRGVmKGNoKSkge1xuICAgICAgICBpZiAoaXNEZWYoY2gudGFnKSkge1xuICAgICAgICAgIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2soY2gpO1xuICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgcmVtb3ZlTm9kZShjaC5lbG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQW5kSW52b2tlUmVtb3ZlSG9vayAodm5vZGUsIHJtKSB7XG4gICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkge1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gY2JzLnJlbW92ZS5sZW5ndGggKyAxO1xuICAgICAgaWYgKGlzRGVmKHJtKSkge1xuICAgICAgICAvLyB3ZSBoYXZlIGEgcmVjdXJzaXZlbHkgcGFzc2VkIGRvd24gcm0gY2FsbGJhY2tcbiAgICAgICAgLy8gaW5jcmVhc2UgdGhlIGxpc3RlbmVycyBjb3VudFxuICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZGlyZWN0bHkgcmVtb3ZpbmdcbiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTtcbiAgICAgIH1cbiAgICAgIC8vIHJlY3Vyc2l2ZWx5IGludm9rZSBob29rcyBvbiBjaGlsZCBjb21wb25lbnQgcm9vdCBub2RlXG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHtcbiAgICAgICAgcmVtb3ZlQW5kSW52b2tlUmVtb3ZlSG9vayhpLCBybSk7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYnMucmVtb3ZlW2ldKHZub2RlLCBybSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkge1xuICAgICAgICBpKHZub2RlLCBybSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBybSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4gKHBhcmVudEVsbSwgb2xkQ2gsIG5ld0NoLCBpbnNlcnRlZFZub2RlUXVldWUsIHJlbW92ZU9ubHkpIHtcbiAgICB2YXIgb2xkU3RhcnRJZHggPSAwO1xuICAgIHZhciBuZXdTdGFydElkeCA9IDA7XG4gICAgdmFyIG9sZEVuZElkeCA9IG9sZENoLmxlbmd0aCAtIDE7XG4gICAgdmFyIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFswXTtcbiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdO1xuICAgIHZhciBuZXdFbmRJZHggPSBuZXdDaC5sZW5ndGggLSAxO1xuICAgIHZhciBuZXdTdGFydFZub2RlID0gbmV3Q2hbMF07XG4gICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTtcbiAgICB2YXIgb2xkS2V5VG9JZHgsIGlkeEluT2xkLCB2bm9kZVRvTW92ZSwgcmVmRWxtO1xuXG4gICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+XG4gICAgLy8gdG8gZW5zdXJlIHJlbW92ZWQgZWxlbWVudHMgc3RheSBpbiBjb3JyZWN0IHJlbGF0aXZlIHBvc2l0aW9uc1xuICAgIC8vIGR1cmluZyBsZWF2aW5nIHRyYW5zaXRpb25zXG4gICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjaGVja0R1cGxpY2F0ZUtleXMobmV3Q2gpO1xuICAgIH1cblxuICAgIHdoaWxlIChvbGRTdGFydElkeCA8PSBvbGRFbmRJZHggJiYgbmV3U3RhcnRJZHggPD0gbmV3RW5kSWR4KSB7XG4gICAgICBpZiAoaXNVbmRlZihvbGRTdGFydFZub2RlKSkge1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnRcbiAgICAgIH0gZWxzZSBpZiAoaXNVbmRlZihvbGRFbmRWbm9kZSkpIHtcbiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICBwYXRjaFZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTtcbiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7XG4gICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIG5ld0NoLCBuZXdFbmRJZHgpO1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSkpIHsgLy8gVm5vZGUgbW92ZWQgcmlnaHRcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBuZXdDaCwgbmV3RW5kSWR4KTtcbiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpO1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07XG4gICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnRcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBuZXdDaCwgbmV3U3RhcnRJZHgpO1xuICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgb2xkRW5kVm5vZGUuZWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNVbmRlZihvbGRLZXlUb0lkeCkpIHsgb2xkS2V5VG9JZHggPSBjcmVhdGVLZXlUb09sZElkeChvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7IH1cbiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSlcbiAgICAgICAgICA/IG9sZEtleVRvSWR4W25ld1N0YXJ0Vm5vZGUua2V5XVxuICAgICAgICAgIDogZmluZElkeEluT2xkKG5ld1N0YXJ0Vm5vZGUsIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50XG4gICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07XG4gICAgICAgICAgaWYgKHNhbWVWbm9kZSh2bm9kZVRvTW92ZSwgbmV3U3RhcnRWbm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGNoVm5vZGUodm5vZGVUb01vdmUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTtcbiAgICAgICAgICAgIG9sZENoW2lkeEluT2xkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2FtZSBrZXkgYnV0IGRpZmZlcmVudCBlbGVtZW50LiB0cmVhdCBhcyBuZXcgZWxlbWVudFxuICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7XG4gICAgICByZWZFbG0gPSBpc1VuZGVmKG5ld0NoW25ld0VuZElkeCArIDFdKSA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07XG4gICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCByZWZFbG0sIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHtcbiAgICAgIHJlbW92ZVZub2RlcyhwYXJlbnRFbG0sIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0R1cGxpY2F0ZUtleXMgKGNoaWxkcmVuKSB7XG4gICAgdmFyIHNlZW5LZXlzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZub2RlID0gY2hpbGRyZW5baV07XG4gICAgICB2YXIga2V5ID0gdm5vZGUua2V5O1xuICAgICAgaWYgKGlzRGVmKGtleSkpIHtcbiAgICAgICAgaWYgKHNlZW5LZXlzW2tleV0pIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgKFwiRHVwbGljYXRlIGtleXMgZGV0ZWN0ZWQ6ICdcIiArIGtleSArIFwiJy4gVGhpcyBtYXkgY2F1c2UgYW4gdXBkYXRlIGVycm9yLlwiKSxcbiAgICAgICAgICAgIHZub2RlLmNvbnRleHRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkge1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IG9sZENoW2ldO1xuICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGF0Y2hWbm9kZSAoXG4gICAgb2xkVm5vZGUsXG4gICAgdm5vZGUsXG4gICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLFxuICAgIG93bmVyQXJyYXksXG4gICAgaW5kZXgsXG4gICAgcmVtb3ZlT25seVxuICApIHtcbiAgICBpZiAob2xkVm5vZGUgPT09IHZub2RlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNEZWYodm5vZGUuZWxtKSAmJiBpc0RlZihvd25lckFycmF5KSkge1xuICAgICAgLy8gY2xvbmUgcmV1c2VkIHZub2RlXG4gICAgICB2bm9kZSA9IG93bmVyQXJyYXlbaW5kZXhdID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgfVxuXG4gICAgdmFyIGVsbSA9IHZub2RlLmVsbSA9IG9sZFZub2RlLmVsbTtcblxuICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgaHlkcmF0ZShvbGRWbm9kZS5lbG0sIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy5cbiAgICAvLyBub3RlIHdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgdm5vZGUgaXMgY2xvbmVkIC1cbiAgICAvLyBpZiB0aGUgbmV3IG5vZGUgaXMgbm90IGNsb25lZCBpdCBtZWFucyB0aGUgcmVuZGVyIGZ1bmN0aW9ucyBoYXZlIGJlZW5cbiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLlxuICAgIGlmIChpc1RydWUodm5vZGUuaXNTdGF0aWMpICYmXG4gICAgICBpc1RydWUob2xkVm5vZGUuaXNTdGF0aWMpICYmXG4gICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJlxuICAgICAgKGlzVHJ1ZSh2bm9kZS5pc0Nsb25lZCkgfHwgaXNUcnVlKHZub2RlLmlzT25jZSkpXG4gICAgKSB7XG4gICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGk7XG4gICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHtcbiAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICB9XG5cbiAgICB2YXIgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgY2ggPSB2bm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnVwZGF0ZS5sZW5ndGg7ICsraSkgeyBjYnMudXBkYXRlW2ldKG9sZFZub2RlLCB2bm9kZSk7IH1cbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS51cGRhdGUpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgIH1cbiAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkge1xuICAgICAgaWYgKGlzRGVmKG9sZENoKSAmJiBpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfVxuICAgICAgfSBlbHNlIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBjaGVja0R1cGxpY2F0ZUtleXMoY2gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9XG4gICAgICAgIGFkZFZub2RlcyhlbG0sIG51bGwsIGNoLCAwLCBjaC5sZW5ndGggLSAxLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRDaCkpIHtcbiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkge1xuICAgICAgICBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob2xkVm5vZGUudGV4dCAhPT0gdm5vZGUudGV4dCkge1xuICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgIH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wb3N0cGF0Y2gpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkge1xuICAgIC8vIGRlbGF5IGluc2VydCBob29rcyBmb3IgY29tcG9uZW50IHJvb3Qgbm9kZXMsIGludm9rZSB0aGVtIGFmdGVyIHRoZVxuICAgIC8vIGVsZW1lbnQgaXMgcmVhbGx5IGluc2VydGVkXG4gICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7XG4gICAgICB2bm9kZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gcXVldWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcXVldWVbaV0uZGF0YS5ob29rLmluc2VydChxdWV1ZVtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlO1xuICAvLyBsaXN0IG9mIG1vZHVsZXMgdGhhdCBjYW4gc2tpcCBjcmVhdGUgaG9vayBkdXJpbmcgaHlkcmF0aW9uIGJlY2F1c2UgdGhleVxuICAvLyBhcmUgYWxyZWFkeSByZW5kZXJlZCBvbiB0aGUgY2xpZW50IG9yIGhhcyBubyBuZWVkIGZvciBpbml0aWFsaXphdGlvblxuICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmVcbiAgLy8gZGVlcCB1cGRhdGVzICgjNzA2MykuXG4gIHZhciBpc1JlbmRlcmVkTW9kdWxlID0gbWFrZU1hcCgnYXR0cnMsY2xhc3Msc3RhdGljQ2xhc3Msc3RhdGljU3R5bGUsa2V5Jyk7XG5cbiAgLy8gTm90ZTogdGhpcyBpcyBhIGJyb3dzZXItb25seSBmdW5jdGlvbiBzbyB3ZSBjYW4gYXNzdW1lIGVsbXMgYXJlIERPTSBub2Rlcy5cbiAgZnVuY3Rpb24gaHlkcmF0ZSAoZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBpblZQcmUpIHtcbiAgICB2YXIgaTtcbiAgICB2YXIgdGFnID0gdm5vZGUudGFnO1xuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjtcbiAgICBpblZQcmUgPSBpblZQcmUgfHwgKGRhdGEgJiYgZGF0YS5wcmUpO1xuICAgIHZub2RlLmVsbSA9IGVsbTtcblxuICAgIGlmIChpc1RydWUodm5vZGUuaXNDb21tZW50KSAmJiBpc0RlZih2bm9kZS5hc3luY0ZhY3RvcnkpKSB7XG4gICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gYXNzZXJ0IG5vZGUgbWF0Y2hcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFhc3NlcnROb2RlTWF0Y2goZWxtLCB2bm9kZSwgaW5WUHJlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsgaSh2bm9kZSwgdHJ1ZSAvKiBoeWRyYXRpbmcgKi8pOyB9XG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSkge1xuICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS5cbiAgICAgICAgaW5pdENvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRGVmKHRhZykpIHtcbiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHtcbiAgICAgICAgLy8gZW1wdHkgZWxlbWVudCwgYWxsb3cgY2xpZW50IHRvIHBpY2sgdXAgYW5kIHBvcHVsYXRlIGNoaWxkcmVuXG4gICAgICAgIGlmICghZWxtLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB2LWh0bWwgYW5kIGRvbVByb3BzOiBpbm5lckhUTUxcbiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7XG4gICAgICAgICAgICBpZiAoaSAhPT0gZWxtLmlubmVySFRNTCkge1xuICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkJhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdzZXJ2ZXIgaW5uZXJIVE1MOiAnLCBpKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2NsaWVudCBpbm5lckhUTUw6ICcsIGVsbS5pbm5lckhUTUwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpdGVyYXRlIGFuZCBjb21wYXJlIGNoaWxkcmVuIGxpc3RzXG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5NYXRjaCA9IHRydWU7XG4gICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBjaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7XG4gICAgICAgICAgICAgIGlmICghY2hpbGROb2RlIHx8ICFoeWRyYXRlKGNoaWxkTm9kZSwgY2hpbGRyZW5baSQxXSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBpblZQcmUpKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgY2hpbGROb2RlIGlzIG5vdCBudWxsLCBpdCBtZWFucyB0aGUgYWN0dWFsIGNoaWxkTm9kZXMgbGlzdCBpc1xuICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC5cbiAgICAgICAgICAgIGlmICghY2hpbGRyZW5NYXRjaCB8fCBjaGlsZE5vZGUpIHtcbiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWlzbWF0Y2hpbmcgY2hpbGROb2RlcyB2cy4gVk5vZGVzOiAnLCBlbG0uY2hpbGROb2RlcywgY2hpbGRyZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgaWYgKCFpc1JlbmRlcmVkTW9kdWxlKGtleSkpIHtcbiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlO1xuICAgICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bGxJbnZva2UgJiYgZGF0YVsnY2xhc3MnXSkge1xuICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzXG4gICAgICAgICAgdHJhdmVyc2UoZGF0YVsnY2xhc3MnXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVsbS5kYXRhICE9PSB2bm9kZS50ZXh0KSB7XG4gICAgICBlbG0uZGF0YSA9IHZub2RlLnRleHQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnROb2RlTWF0Y2ggKG5vZGUsIHZub2RlLCBpblZQcmUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUudGFnKSkge1xuICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKFxuICAgICAgICAhaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgaW5WUHJlKSAmJlxuICAgICAgICB2bm9kZS50YWcudG9Mb3dlckNhc2UoKSA9PT0gKG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09ICh2bm9kZS5pc0NvbW1lbnQgPyA4IDogMylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5KSB7XG4gICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7XG4gICAgICBpZiAoaXNEZWYob2xkVm5vZGUpKSB7IGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTsgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGlzSW5pdGlhbFBhdGNoID0gZmFsc2U7XG4gICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdO1xuXG4gICAgaWYgKGlzVW5kZWYob2xkVm5vZGUpKSB7XG4gICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50XG4gICAgICBpc0luaXRpYWxQYXRjaCA9IHRydWU7XG4gICAgICBjcmVhdGVFbG0odm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpO1xuICAgICAgaWYgKCFpc1JlYWxFbGVtZW50ICYmIHNhbWVWbm9kZShvbGRWbm9kZSwgdm5vZGUpKSB7XG4gICAgICAgIC8vIHBhdGNoIGV4aXN0aW5nIHJvb3Qgbm9kZVxuICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBudWxsLCBudWxsLCByZW1vdmVPbmx5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1JlYWxFbGVtZW50KSB7XG4gICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnRcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHNlcnZlci1yZW5kZXJlZCBjb250ZW50IGFuZCBpZiB3ZSBjYW4gcGVyZm9ybVxuICAgICAgICAgIC8vIGEgc3VjY2Vzc2Z1bCBoeWRyYXRpb24uXG4gICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHtcbiAgICAgICAgICAgIG9sZFZub2RlLnJlbW92ZUF0dHJpYnV0ZShTU1JfQVRUUik7XG4gICAgICAgICAgICBoeWRyYXRpbmcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNUcnVlKGh5ZHJhdGluZykpIHtcbiAgICAgICAgICAgIGlmIChoeWRyYXRlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSkge1xuICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpO1xuICAgICAgICAgICAgICByZXR1cm4gb2xkVm5vZGVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICdUaGUgY2xpZW50LXNpZGUgcmVuZGVyZWQgdmlydHVhbCBET00gdHJlZSBpcyBub3QgbWF0Y2hpbmcgJyArXG4gICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgK1xuICAgICAgICAgICAgICAgICdIVE1MIG1hcmt1cCwgZm9yIGV4YW1wbGUgbmVzdGluZyBibG9jay1sZXZlbCBlbGVtZW50cyBpbnNpZGUgJyArXG4gICAgICAgICAgICAgICAgJzxwPiwgb3IgbWlzc2luZyA8dGJvZHk+LiBCYWlsaW5nIGh5ZHJhdGlvbiBhbmQgcGVyZm9ybWluZyAnICtcbiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBlaXRoZXIgbm90IHNlcnZlci1yZW5kZXJlZCwgb3IgaHlkcmF0aW9uIGZhaWxlZC5cbiAgICAgICAgICAvLyBjcmVhdGUgYW4gZW1wdHkgbm9kZSBhbmQgcmVwbGFjZSBpdFxuICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnRcbiAgICAgICAgdmFyIG9sZEVsbSA9IG9sZFZub2RlLmVsbTtcbiAgICAgICAgdmFyIHBhcmVudEVsbSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgbm9kZVxuICAgICAgICBjcmVhdGVFbG0oXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLFxuICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhXG4gICAgICAgICAgLy8gbGVhdmluZyB0cmFuc2l0aW9uLiBPbmx5IGhhcHBlbnMgd2hlbiBjb21iaW5pbmcgdHJhbnNpdGlvbiArXG4gICAgICAgICAgLy8ga2VlcC1hbGl2ZSArIEhPQ3MuICgjNDU5MClcbiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtLFxuICAgICAgICAgIG5vZGVPcHMubmV4dFNpYmxpbmcob2xkRWxtKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBwYXJlbnQgcGxhY2Vob2xkZXIgbm9kZSBlbGVtZW50LCByZWN1cnNpdmVseVxuICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkge1xuICAgICAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlLnBhcmVudDtcbiAgICAgICAgICB2YXIgcGF0Y2hhYmxlID0gaXNQYXRjaGFibGUodm5vZGUpO1xuICAgICAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYnMuZGVzdHJveS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICBjYnMuZGVzdHJveVtpXShhbmNlc3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbmNlc3Rvci5lbG0gPSB2bm9kZS5lbG07XG4gICAgICAgICAgICBpZiAocGF0Y2hhYmxlKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkge1xuICAgICAgICAgICAgICAgIGNicy5jcmVhdGVbaSQxXShlbXB0eU5vZGUsIGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyAjNjUxM1xuICAgICAgICAgICAgICAvLyBpbnZva2UgaW5zZXJ0IGhvb2tzIHRoYXQgbWF5IGhhdmUgYmVlbiBtZXJnZWQgYnkgY3JlYXRlIGhvb2tzLlxuICAgICAgICAgICAgICAvLyBlLmcuIGZvciBkaXJlY3RpdmVzIHRoYXQgdXNlcyB0aGUgXCJpbnNlcnRlZFwiIGhvb2suXG4gICAgICAgICAgICAgIHZhciBpbnNlcnQgPSBhbmNlc3Rvci5kYXRhLmhvb2suaW5zZXJ0O1xuICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkge1xuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGF0IGluZGV4IDEgdG8gYXZvaWQgcmUtaW52b2tpbmcgY29tcG9uZW50IG1vdW50ZWQgaG9va1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkkMiA9IDE7IGkkMiA8IGluc2VydC5mbnMubGVuZ3RoOyBpJDIrKykge1xuICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWdpc3RlclJlZihhbmNlc3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZXN0cm95IG9sZCBub2RlXG4gICAgICAgIGlmIChpc0RlZihwYXJlbnRFbG0pKSB7XG4gICAgICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgW29sZFZub2RlXSwgMCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkge1xuICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpO1xuICAgIHJldHVybiB2bm9kZS5lbG1cbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIGRpcmVjdGl2ZXMgPSB7XG4gIGNyZWF0ZTogdXBkYXRlRGlyZWN0aXZlcyxcbiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLFxuICBkZXN0cm95OiBmdW5jdGlvbiB1bmJpbmREaXJlY3RpdmVzICh2bm9kZSkge1xuICAgIHVwZGF0ZURpcmVjdGl2ZXModm5vZGUsIGVtcHR5Tm9kZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHVwZGF0ZURpcmVjdGl2ZXMgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzIHx8IHZub2RlLmRhdGEuZGlyZWN0aXZlcykge1xuICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfdXBkYXRlIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGlzQ3JlYXRlID0gb2xkVm5vZGUgPT09IGVtcHR5Tm9kZTtcbiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7XG4gIHZhciBvbGREaXJzID0gbm9ybWFsaXplRGlyZWN0aXZlcyQxKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcywgb2xkVm5vZGUuY29udGV4dCk7XG4gIHZhciBuZXdEaXJzID0gbm9ybWFsaXplRGlyZWN0aXZlcyQxKHZub2RlLmRhdGEuZGlyZWN0aXZlcywgdm5vZGUuY29udGV4dCk7XG5cbiAgdmFyIGRpcnNXaXRoSW5zZXJ0ID0gW107XG4gIHZhciBkaXJzV2l0aFBvc3RwYXRjaCA9IFtdO1xuXG4gIHZhciBrZXksIG9sZERpciwgZGlyO1xuICBmb3IgKGtleSBpbiBuZXdEaXJzKSB7XG4gICAgb2xkRGlyID0gb2xkRGlyc1trZXldO1xuICAgIGRpciA9IG5ld0RpcnNba2V5XTtcbiAgICBpZiAoIW9sZERpcikge1xuICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZFxuICAgICAgY2FsbEhvb2skMShkaXIsICdiaW5kJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIGlmIChkaXIuZGVmICYmIGRpci5kZWYuaW5zZXJ0ZWQpIHtcbiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZVxuICAgICAgZGlyLm9sZFZhbHVlID0gb2xkRGlyLnZhbHVlO1xuICAgICAgZGlyLm9sZEFyZyA9IG9sZERpci5hcmc7XG4gICAgICBjYWxsSG9vayQxKGRpciwgJ3VwZGF0ZScsIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmNvbXBvbmVudFVwZGF0ZWQpIHtcbiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aEluc2VydC5sZW5ndGgpIHtcbiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhJbnNlcnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aEluc2VydFtpXSwgJ2luc2VydGVkJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpc0NyZWF0ZSkge1xuICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbEluc2VydCgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHtcbiAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhQb3N0cGF0Y2gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFpc0NyZWF0ZSkge1xuICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHtcbiAgICAgIGlmICghbmV3RGlyc1trZXldKSB7XG4gICAgICAgIC8vIG5vIGxvbmdlciBwcmVzZW50LCB1bmJpbmRcbiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSAoXG4gIGRpcnMsXG4gIHZtXG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGlmICghZGlycykge1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHJldHVybiByZXNcbiAgfVxuICB2YXIgaSwgZGlyO1xuICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykge1xuICAgIGRpciA9IGRpcnNbaV07XG4gICAgaWYgKCFkaXIubW9kaWZpZXJzKSB7XG4gICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICAgIGRpci5tb2RpZmllcnMgPSBlbXB0eU1vZGlmaWVycztcbiAgICB9XG4gICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7XG4gICAgZGlyLmRlZiA9IHJlc29sdmVBc3NldCh2bS4kb3B0aW9ucywgJ2RpcmVjdGl2ZXMnLCBkaXIubmFtZSwgdHJ1ZSk7XG4gIH1cbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGlyTmFtZSAoZGlyKSB7XG4gIHJldHVybiBkaXIucmF3TmFtZSB8fCAoKGRpci5uYW1lKSArIFwiLlwiICsgKE9iamVjdC5rZXlzKGRpci5tb2RpZmllcnMgfHwge30pLmpvaW4oJy4nKSkpXG59XG5cbmZ1bmN0aW9uIGNhbGxIb29rJDEgKGRpciwgaG9vaywgdm5vZGUsIG9sZFZub2RlLCBpc0Rlc3Ryb3kpIHtcbiAgdmFyIGZuID0gZGlyLmRlZiAmJiBkaXIuZGVmW2hvb2tdO1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgZm4odm5vZGUuZWxtLCBkaXIsIHZub2RlLCBvbGRWbm9kZSwgaXNEZXN0cm95KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bm9kZS5jb250ZXh0LCAoXCJkaXJlY3RpdmUgXCIgKyAoZGlyLm5hbWUpICsgXCIgXCIgKyBob29rICsgXCIgaG9va1wiKSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBiYXNlTW9kdWxlcyA9IFtcbiAgcmVmLFxuICBkaXJlY3RpdmVzXG5dO1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gdXBkYXRlQXR0cnMgKG9sZFZub2RlLCB2bm9kZSkge1xuICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIGlmIChpc0RlZihvcHRzKSAmJiBvcHRzLkN0b3Iub3B0aW9ucy5pbmhlcml0QXR0cnMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGlzVW5kZWYob2xkVm5vZGUuZGF0YS5hdHRycykgJiYgaXNVbmRlZih2bm9kZS5kYXRhLmF0dHJzKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBrZXksIGN1ciwgb2xkO1xuICB2YXIgZWxtID0gdm5vZGUuZWxtO1xuICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9O1xuICB2YXIgYXR0cnMgPSB2bm9kZS5kYXRhLmF0dHJzIHx8IHt9O1xuICAvLyBjbG9uZSBvYnNlcnZlZCBvYmplY3RzLCBhcyB0aGUgdXNlciBwcm9iYWJseSB3YW50cyB0byBtdXRhdGUgaXRcbiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHtcbiAgICBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgPSBleHRlbmQoe30sIGF0dHJzKTtcbiAgfVxuXG4gIGZvciAoa2V5IGluIGF0dHJzKSB7XG4gICAgY3VyID0gYXR0cnNba2V5XTtcbiAgICBvbGQgPSBvbGRBdHRyc1trZXldO1xuICAgIGlmIChvbGQgIT09IGN1cikge1xuICAgICAgc2V0QXR0cihlbG0sIGtleSwgY3VyKTtcbiAgICB9XG4gIH1cbiAgLy8gIzQzOTE6IGluIElFOSwgc2V0dGluZyB0eXBlIGNhbiByZXNldCB2YWx1ZSBmb3IgaW5wdXRbdHlwZT1yYWRpb11cbiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKChpc0lFIHx8IGlzRWRnZSkgJiYgYXR0cnMudmFsdWUgIT09IG9sZEF0dHJzLnZhbHVlKSB7XG4gICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTtcbiAgfVxuICBmb3IgKGtleSBpbiBvbGRBdHRycykge1xuICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7XG4gICAgICBpZiAoaXNYbGluayhrZXkpKSB7XG4gICAgICAgIGVsbS5yZW1vdmVBdHRyaWJ1dGVOUyh4bGlua05TLCBnZXRYbGlua1Byb3Aoa2V5KSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHtcbiAgICAgICAgZWxtLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRBdHRyIChlbCwga2V5LCB2YWx1ZSkge1xuICBpZiAoZWwudGFnTmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BdHRyKGtleSkpIHtcbiAgICAvLyBzZXQgYXR0cmlidXRlIGZvciBibGFuayB2YWx1ZVxuICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+XG4gICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGVjaG5pY2FsbHkgYWxsb3dmdWxsc2NyZWVuIGlzIGEgYm9vbGVhbiBhdHRyaWJ1dGUgZm9yIDxpZnJhbWU+LFxuICAgICAgLy8gYnV0IEZsYXNoIGV4cGVjdHMgYSB2YWx1ZSBvZiBcInRydWVcIiB3aGVuIHVzZWQgb24gPGVtYmVkPiB0YWdcbiAgICAgIHZhbHVlID0ga2V5ID09PSAnYWxsb3dmdWxsc2NyZWVuJyAmJiBlbC50YWdOYW1lID09PSAnRU1CRUQnXG4gICAgICAgID8gJ3RydWUnXG4gICAgICAgIDoga2V5O1xuICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCBjb252ZXJ0RW51bWVyYXRlZFZhbHVlKGtleSwgdmFsdWUpKTtcbiAgfSBlbHNlIGlmIChpc1hsaW5rKGtleSkpIHtcbiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlTlMoeGxpbmtOUywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7XG4gICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gIzcxMzg6IElFMTAgJiAxMSBmaXJlcyBpbnB1dCBldmVudCB3aGVuIHNldHRpbmcgcGxhY2Vob2xkZXIgb25cbiAgICAvLyA8dGV4dGFyZWE+Li4uIGJsb2NrIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhbmQgcmVtb3ZlIHRoZSBibG9ja2VyXG4gICAgLy8gaW1tZWRpYXRlbHkuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKFxuICAgICAgaXNJRSAmJiAhaXNJRTkgJiZcbiAgICAgIGVsLnRhZ05hbWUgPT09ICdURVhUQVJFQScgJiZcbiAgICAgIGtleSA9PT0gJ3BsYWNlaG9sZGVyJyAmJiB2YWx1ZSAhPT0gJycgJiYgIWVsLl9faWVwaFxuICAgICkge1xuICAgICAgdmFyIGJsb2NrZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIGJsb2NrZXIpO1xuICAgICAgfTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7XG4gICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICAgIGVsLl9faWVwaCA9IHRydWU7IC8qIElFIHBsYWNlaG9sZGVyIHBhdGNoZWQgKi9cbiAgICB9XG4gICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICB9XG59XG5cbnZhciBhdHRycyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVBdHRycyxcbiAgdXBkYXRlOiB1cGRhdGVBdHRyc1xufTtcblxuLyogICovXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGVsID0gdm5vZGUuZWxtO1xuICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTtcbiAgaWYgKFxuICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiZcbiAgICBpc1VuZGVmKGRhdGEuY2xhc3MpICYmIChcbiAgICAgIGlzVW5kZWYob2xkRGF0YSkgfHwgKFxuICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmXG4gICAgICAgIGlzVW5kZWYob2xkRGF0YS5jbGFzcylcbiAgICAgIClcbiAgICApXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGNscyA9IGdlbkNsYXNzRm9yVm5vZGUodm5vZGUpO1xuXG4gIC8vIGhhbmRsZSB0cmFuc2l0aW9uIGNsYXNzZXNcbiAgdmFyIHRyYW5zaXRpb25DbGFzcyA9IGVsLl90cmFuc2l0aW9uQ2xhc3NlcztcbiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHtcbiAgICBjbHMgPSBjb25jYXQoY2xzLCBzdHJpbmdpZnlDbGFzcyh0cmFuc2l0aW9uQ2xhc3MpKTtcbiAgfVxuXG4gIC8vIHNldCB0aGUgY2xhc3NcbiAgaWYgKGNscyAhPT0gZWwuX3ByZXZDbGFzcykge1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpO1xuICAgIGVsLl9wcmV2Q2xhc3MgPSBjbHM7XG4gIH1cbn1cblxudmFyIGtsYXNzID0ge1xuICBjcmVhdGU6IHVwZGF0ZUNsYXNzLFxuICB1cGRhdGU6IHVwZGF0ZUNsYXNzXG59O1xuXG4vKiAgKi9cblxuLyogICovXG5cbi8qICAqL1xuXG4vKiAgKi9cblxuLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZVxuLy8gc28gd2UgdXNlZCBzb21lIHJlc2VydmVkIHRva2VucyBkdXJpbmcgY29tcGlsZS5cbnZhciBSQU5HRV9UT0tFTiA9ICdfX3InO1xudmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7XG5cbi8qICAqL1xuXG4vLyBub3JtYWxpemUgdi1tb2RlbCBldmVudCB0b2tlbnMgdGhhdCBjYW4gb25seSBiZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUuXG4vLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlXG4vLyB0aGUgd2hvbGUgcG9pbnQgaXMgZW5zdXJpbmcgdGhlIHYtbW9kZWwgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgYmVmb3JlXG4vLyB1c2VyLWF0dGFjaGVkIGhhbmRsZXJzLlxuZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzRGVmKG9uW1JBTkdFX1RPS0VOXSkpIHtcbiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50XG4gICAgdmFyIGV2ZW50ID0gaXNJRSA/ICdjaGFuZ2UnIDogJ2lucHV0JztcbiAgICBvbltldmVudF0gPSBbXS5jb25jYXQob25bUkFOR0VfVE9LRU5dLCBvbltldmVudF0gfHwgW10pO1xuICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07XG4gIH1cbiAgLy8gVGhpcyB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBmaXggIzQ1MjEgYnV0IG5vIGxvbmdlciBuZWNlc3NhcnlcbiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzRGVmKG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXSkpIHtcbiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pO1xuICAgIGRlbGV0ZSBvbltDSEVDS0JPWF9SQURJT19UT0tFTl07XG4gIH1cbn1cblxudmFyIHRhcmdldCQxO1xuXG5mdW5jdGlvbiBjcmVhdGVPbmNlSGFuZGxlciQxIChldmVudCwgaGFuZGxlciwgY2FwdHVyZSkge1xuICB2YXIgX3RhcmdldCA9IHRhcmdldCQxOyAvLyBzYXZlIGN1cnJlbnQgdGFyZ2V0IGVsZW1lbnQgaW4gY2xvc3VyZVxuICByZXR1cm4gZnVuY3Rpb24gb25jZUhhbmRsZXIgKCkge1xuICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHJlcyAhPT0gbnVsbCkge1xuICAgICAgcmVtb3ZlJDIoZXZlbnQsIG9uY2VIYW5kbGVyLCBjYXB0dXJlLCBfdGFyZ2V0KTtcbiAgICB9XG4gIH1cbn1cblxuLy8gIzk0NDY6IEZpcmVmb3ggPD0gNTMgKGluIHBhcnRpY3VsYXIsIEVTUiA1MikgaGFzIGluY29ycmVjdCBFdmVudC50aW1lU3RhbXBcbi8vIGltcGxlbWVudGF0aW9uIGFuZCBkb2VzIG5vdCBmaXJlIG1pY3JvdGFza3MgaW4gYmV0d2VlbiBldmVudCBwcm9wYWdhdGlvbiwgc29cbi8vIHNhZmUgdG8gZXhjbHVkZS5cbnZhciB1c2VNaWNyb3Rhc2tGaXggPSBpc1VzaW5nTWljcm9UYXNrICYmICEoaXNGRiAmJiBOdW1iZXIoaXNGRlsxXSkgPD0gNTMpO1xuXG5mdW5jdGlvbiBhZGQkMSAoXG4gIG5hbWUsXG4gIGhhbmRsZXIsXG4gIGNhcHR1cmUsXG4gIHBhc3NpdmVcbikge1xuICAvLyBhc3luYyBlZGdlIGNhc2UgIzY1NjY6IGlubmVyIGNsaWNrIGV2ZW50IHRyaWdnZXJzIHBhdGNoLCBldmVudCBoYW5kbGVyXG4gIC8vIGF0dGFjaGVkIHRvIG91dGVyIGVsZW1lbnQgZHVyaW5nIHBhdGNoLCBhbmQgdHJpZ2dlcmVkIGFnYWluLiBUaGlzXG4gIC8vIGhhcHBlbnMgYmVjYXVzZSBicm93c2VycyBmaXJlIG1pY3JvdGFzayB0aWNrcyBiZXR3ZWVuIGV2ZW50IHByb3BhZ2F0aW9uLlxuICAvLyB0aGUgc29sdXRpb24gaXMgc2ltcGxlOiB3ZSBzYXZlIHRoZSB0aW1lc3RhbXAgd2hlbiBhIGhhbmRsZXIgaXMgYXR0YWNoZWQsXG4gIC8vIGFuZCB0aGUgaGFuZGxlciB3b3VsZCBvbmx5IGZpcmUgaWYgdGhlIGV2ZW50IHBhc3NlZCB0byBpdCB3YXMgZmlyZWRcbiAgLy8gQUZURVIgaXQgd2FzIGF0dGFjaGVkLlxuICBpZiAodXNlTWljcm90YXNrRml4KSB7XG4gICAgdmFyIGF0dGFjaGVkVGltZXN0YW1wID0gY3VycmVudEZsdXNoVGltZXN0YW1wO1xuICAgIHZhciBvcmlnaW5hbCA9IGhhbmRsZXI7XG4gICAgaGFuZGxlciA9IG9yaWdpbmFsLl93cmFwcGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gbm8gYnViYmxpbmcsIHNob3VsZCBhbHdheXMgZmlyZS5cbiAgICAgICAgLy8gdGhpcyBpcyBqdXN0IGEgc2FmZXR5IG5ldCBpbiBjYXNlIGV2ZW50LnRpbWVTdGFtcCBpcyB1bnJlbGlhYmxlIGluXG4gICAgICAgIC8vIGNlcnRhaW4gd2VpcmQgZW52aXJvbm1lbnRzLi4uXG4gICAgICAgIGUudGFyZ2V0ID09PSBlLmN1cnJlbnRUYXJnZXQgfHxcbiAgICAgICAgLy8gZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgaGFuZGxlciBhdHRhY2htZW50XG4gICAgICAgIGUudGltZVN0YW1wID49IGF0dGFjaGVkVGltZXN0YW1wIHx8XG4gICAgICAgIC8vIGJhaWwgZm9yIGVudmlyb25tZW50cyB0aGF0IGhhdmUgYnVnZ3kgZXZlbnQudGltZVN0YW1wIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAvLyAjOTQ2MiBpT1MgOSBidWc6IGV2ZW50LnRpbWVTdGFtcCBpcyAwIGFmdGVyIGhpc3RvcnkucHVzaFN0YXRlXG4gICAgICAgIC8vICM5NjgxIFF0V2ViRW5naW5lIGV2ZW50LnRpbWVTdGFtcCBpcyBuZWdhdGl2ZSB2YWx1ZVxuICAgICAgICBlLnRpbWVTdGFtcCA8PSAwIHx8XG4gICAgICAgIC8vICM5NDQ4IGJhaWwgaWYgZXZlbnQgaXMgZmlyZWQgaW4gYW5vdGhlciBkb2N1bWVudCBpbiBhIG11bHRpLXBhZ2VcbiAgICAgICAgLy8gZWxlY3Ryb24vbncuanMgYXBwLCBzaW5jZSBldmVudC50aW1lU3RhbXAgd2lsbCBiZSB1c2luZyBhIGRpZmZlcmVudFxuICAgICAgICAvLyBzdGFydGluZyByZWZlcmVuY2VcbiAgICAgICAgZS50YXJnZXQub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnRcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBuYW1lLFxuICAgIGhhbmRsZXIsXG4gICAgc3VwcG9ydHNQYXNzaXZlXG4gICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9XG4gICAgICA6IGNhcHR1cmVcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlJDIgKFxuICBuYW1lLFxuICBoYW5kbGVyLFxuICBjYXB0dXJlLFxuICBfdGFyZ2V0XG4pIHtcbiAgKF90YXJnZXQgfHwgdGFyZ2V0JDEpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgbmFtZSxcbiAgICBoYW5kbGVyLl93cmFwcGVyIHx8IGhhbmRsZXIsXG4gICAgY2FwdHVyZVxuICApO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLm9uKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEub24pKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIG9uID0gdm5vZGUuZGF0YS5vbiB8fCB7fTtcbiAgdmFyIG9sZE9uID0gb2xkVm5vZGUuZGF0YS5vbiB8fCB7fTtcbiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07XG4gIG5vcm1hbGl6ZUV2ZW50cyhvbik7XG4gIHVwZGF0ZUxpc3RlbmVycyhvbiwgb2xkT24sIGFkZCQxLCByZW1vdmUkMiwgY3JlYXRlT25jZUhhbmRsZXIkMSwgdm5vZGUuY29udGV4dCk7XG4gIHRhcmdldCQxID0gdW5kZWZpbmVkO1xufVxuXG52YXIgZXZlbnRzID0ge1xuICBjcmVhdGU6IHVwZGF0ZURPTUxpc3RlbmVycyxcbiAgdXBkYXRlOiB1cGRhdGVET01MaXN0ZW5lcnNcbn07XG5cbi8qICAqL1xuXG52YXIgc3ZnQ29udGFpbmVyO1xuXG5mdW5jdGlvbiB1cGRhdGVET01Qcm9wcyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIga2V5LCBjdXI7XG4gIHZhciBlbG0gPSB2bm9kZS5lbG07XG4gIHZhciBvbGRQcm9wcyA9IG9sZFZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307XG4gIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307XG4gIC8vIGNsb25lIG9ic2VydmVkIG9iamVjdHMsIGFzIHRoZSB1c2VyIHByb2JhYmx5IHdhbnRzIHRvIG11dGF0ZSBpdFxuICBpZiAoaXNEZWYocHJvcHMuX19vYl9fKSkge1xuICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpO1xuICB9XG5cbiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvcHMpKSB7XG4gICAgICBlbG1ba2V5XSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoa2V5IGluIHByb3BzKSB7XG4gICAgY3VyID0gcHJvcHNba2V5XTtcbiAgICAvLyBpZ25vcmUgY2hpbGRyZW4gaWYgdGhlIG5vZGUgaGFzIHRleHRDb250ZW50IG9yIGlubmVySFRNTCxcbiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9yc1xuICAgIC8vIG9uIHN1YnNlcXVlbnQgcGF0Y2hlcyAoIzMzNjApXG4gICAgaWYgKGtleSA9PT0gJ3RleHRDb250ZW50JyB8fCBrZXkgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfVxuICAgICAgaWYgKGN1ciA9PT0gb2xkUHJvcHNba2V5XSkgeyBjb250aW51ZSB9XG4gICAgICAvLyAjNjYwMSB3b3JrIGFyb3VuZCBDaHJvbWUgdmVyc2lvbiA8PSA1NSBidWcgd2hlcmUgc2luZ2xlIHRleHROb2RlXG4gICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eVxuICAgICAgaWYgKGVsbS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBlbG0ucmVtb3ZlQ2hpbGQoZWxtLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICd2YWx1ZScgJiYgZWxtLnRhZ05hbWUgIT09ICdQUk9HUkVTUycpIHtcbiAgICAgIC8vIHN0b3JlIHZhbHVlIGFzIF92YWx1ZSBhcyB3ZWxsIHNpbmNlXG4gICAgICAvLyBub24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkXG4gICAgICBlbG0uX3ZhbHVlID0gY3VyO1xuICAgICAgLy8gYXZvaWQgcmVzZXR0aW5nIGN1cnNvciBwb3NpdGlvbiB3aGVuIHZhbHVlIGlzIHRoZSBzYW1lXG4gICAgICB2YXIgc3RyQ3VyID0gaXNVbmRlZihjdXIpID8gJycgOiBTdHJpbmcoY3VyKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHtcbiAgICAgICAgZWxtLnZhbHVlID0gc3RyQ3VyO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaW5uZXJIVE1MJyAmJiBpc1NWRyhlbG0udGFnTmFtZSkgJiYgaXNVbmRlZihlbG0uaW5uZXJIVE1MKSkge1xuICAgICAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IGlubmVySFRNTCBmb3IgU1ZHIGVsZW1lbnRzXG4gICAgICBzdmdDb250YWluZXIgPSBzdmdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzdmdDb250YWluZXIuaW5uZXJIVE1MID0gXCI8c3ZnPlwiICsgY3VyICsgXCI8L3N2Zz5cIjtcbiAgICAgIHZhciBzdmcgPSBzdmdDb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICAgIHdoaWxlIChlbG0uZmlyc3RDaGlsZCkge1xuICAgICAgICBlbG0ucmVtb3ZlQ2hpbGQoZWxtLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHN2Zy5maXJzdENoaWxkKSB7XG4gICAgICAgIGVsbS5hcHBlbmRDaGlsZChzdmcuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIHNraXAgdGhlIHVwZGF0ZSBpZiBvbGQgYW5kIG5ldyBWRE9NIHN0YXRlIGlzIHRoZSBzYW1lLlxuICAgICAgLy8gYHZhbHVlYCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYmVjYXVzZSB0aGUgRE9NIHZhbHVlIG1heSBiZSB0ZW1wb3JhcmlseVxuICAgICAgLy8gb3V0IG9mIHN5bmMgd2l0aCBWRE9NIHN0YXRlIGR1ZSB0byBmb2N1cywgY29tcG9zaXRpb24gYW5kIG1vZGlmaWVycy5cbiAgICAgIC8vIFRoaXMgICM0NTIxIGJ5IHNraXBwaW5nIHRoZSB1bm5lY2VzYXJyeSBgY2hlY2tlZGAgdXBkYXRlLlxuICAgICAgY3VyICE9PSBvbGRQcm9wc1trZXldXG4gICAgKSB7XG4gICAgICAvLyBzb21lIHByb3BlcnR5IHVwZGF0ZXMgY2FuIHRocm93XG4gICAgICAvLyBlLmcuIGB2YWx1ZWAgb24gPHByb2dyZXNzPiB3LyBub24tZmluaXRlIHZhbHVlXG4gICAgICB0cnkge1xuICAgICAgICBlbG1ba2V5XSA9IGN1cjtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG59XG5cbi8vIGNoZWNrIHBsYXRmb3Jtcy93ZWIvdXRpbC9hdHRycy5qcyBhY2NlcHRWYWx1ZVxuXG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZVZhbHVlIChlbG0sIGNoZWNrVmFsKSB7XG4gIHJldHVybiAoIWVsbS5jb21wb3NpbmcgJiYgKFxuICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fFxuICAgIGlzTm90SW5Gb2N1c0FuZERpcnR5KGVsbSwgY2hlY2tWYWwpIHx8XG4gICAgaXNEaXJ0eVdpdGhNb2RpZmllcnMoZWxtLCBjaGVja1ZhbClcbiAgKSlcbn1cblxuZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHtcbiAgLy8gcmV0dXJuIHRydWUgd2hlbiB0ZXh0Ym94ICgubnVtYmVyIGFuZCAudHJpbSkgbG9zZXMgZm9jdXMgYW5kIGl0cyB2YWx1ZSBpc1xuICAvLyBub3QgZXF1YWwgdG8gdGhlIHVwZGF0ZWQgdmFsdWVcbiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlO1xuICAvLyAjNjE1N1xuICAvLyB3b3JrIGFyb3VuZCBJRSBidWcgd2hlbiBhY2Nlc3NpbmcgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbiBhbiBpZnJhbWVcbiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIG5vdEluRm9jdXMgJiYgZWxtLnZhbHVlICE9PSBjaGVja1ZhbFxufVxuXG5mdW5jdGlvbiBpc0RpcnR5V2l0aE1vZGlmaWVycyAoZWxtLCBuZXdWYWwpIHtcbiAgdmFyIHZhbHVlID0gZWxtLnZhbHVlO1xuICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWVcbiAgaWYgKGlzRGVmKG1vZGlmaWVycykpIHtcbiAgICBpZiAobW9kaWZpZXJzLm51bWJlcikge1xuICAgICAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlKSAhPT0gdG9OdW1iZXIobmV3VmFsKVxuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLnRyaW0pIHtcbiAgICAgIHJldHVybiB2YWx1ZS50cmltKCkgIT09IG5ld1ZhbC50cmltKClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlICE9PSBuZXdWYWxcbn1cblxudmFyIGRvbVByb3BzID0ge1xuICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLFxuICB1cGRhdGU6IHVwZGF0ZURPTVByb3BzXG59O1xuXG4vKiAgKi9cblxudmFyIHBhcnNlU3R5bGVUZXh0ID0gY2FjaGVkKGZ1bmN0aW9uIChjc3NUZXh0KSB7XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXFwpKS9nO1xuICB2YXIgcHJvcGVydHlEZWxpbWl0ZXIgPSAvOiguKykvO1xuICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdmFyIHRtcCA9IGl0ZW0uc3BsaXQocHJvcGVydHlEZWxpbWl0ZXIpO1xuICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZVxuZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVEYXRhIChkYXRhKSB7XG4gIHZhciBzdHlsZSA9IG5vcm1hbGl6ZVN0eWxlQmluZGluZyhkYXRhLnN0eWxlKTtcbiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uXG4gIC8vIGFuZCBpcyBhbHdheXMgYSBmcmVzaCBvYmplY3QsIHNvIGl0J3Mgc2FmZSB0byBtZXJnZSBpbnRvIGl0XG4gIHJldHVybiBkYXRhLnN0YXRpY1N0eWxlXG4gICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpXG4gICAgOiBzdHlsZVxufVxuXG4vLyBub3JtYWxpemUgcG9zc2libGUgYXJyYXkgLyBzdHJpbmcgdmFsdWVzIGludG8gT2JqZWN0XG5mdW5jdGlvbiBub3JtYWxpemVTdHlsZUJpbmRpbmcgKGJpbmRpbmdTdHlsZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7XG4gICAgcmV0dXJuIHRvT2JqZWN0KGJpbmRpbmdTdHlsZSlcbiAgfVxuICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFyc2VTdHlsZVRleHQoYmluZGluZ1N0eWxlKVxuICB9XG4gIHJldHVybiBiaW5kaW5nU3R5bGVcbn1cblxuLyoqXG4gKiBwYXJlbnQgY29tcG9uZW50IHN0eWxlIHNob3VsZCBiZSBhZnRlciBjaGlsZCdzXG4gKiBzbyB0aGF0IHBhcmVudCBjb21wb25lbnQncyBzdHlsZSBjb3VsZCBvdmVycmlkZSBpdFxuICovXG5mdW5jdGlvbiBnZXRTdHlsZSAodm5vZGUsIGNoZWNrQ2hpbGQpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICB2YXIgc3R5bGVEYXRhO1xuXG4gIGlmIChjaGVja0NoaWxkKSB7XG4gICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlO1xuICAgIHdoaWxlIChjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkTm9kZSAmJiBjaGlsZE5vZGUuZGF0YSAmJlxuICAgICAgICAoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKGNoaWxkTm9kZS5kYXRhKSlcbiAgICAgICkge1xuICAgICAgICBleHRlbmQocmVzLCBzdHlsZURhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkge1xuICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7XG4gIH1cblxuICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlO1xuICB3aGlsZSAoKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHtcbiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHtcbiAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbnZhciBjc3NWYXJSRSA9IC9eLS0vO1xudmFyIGltcG9ydGFudFJFID0gL1xccyohaW1wb3J0YW50JC87XG52YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoY3NzVmFyUkUudGVzdChuYW1lKSkge1xuICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7XG4gIH0gZWxzZSBpZiAoaW1wb3J0YW50UkUudGVzdCh2YWwpKSB7XG4gICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoaHlwaGVuYXRlKG5hbWUpLCB2YWwucmVwbGFjZShpbXBvcnRhbnRSRSwgJycpLCAnaW1wb3J0YW50Jyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIC8vIFN1cHBvcnQgdmFsdWVzIGFycmF5IGNyZWF0ZWQgYnkgYXV0b3ByZWZpeGVyLCBlLmcuXG4gICAgICAvLyB7ZGlzcGxheTogW1wiLXdlYmtpdC1ib3hcIiwgXCItbXMtZmxleGJveFwiLCBcImZsZXhcIl19XG4gICAgICAvLyBTZXQgdGhlbSBvbmUgYnkgb25lLCBhbmQgdGhlIGJyb3dzZXIgd2lsbCBvbmx5IHNldCB0aG9zZSBpdCBjYW4gcmVjb2duaXplXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdmFsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsO1xuICAgIH1cbiAgfVxufTtcblxudmFyIHZlbmRvck5hbWVzID0gWydXZWJraXQnLCAnTW96JywgJ21zJ107XG5cbnZhciBlbXB0eVN0eWxlO1xudmFyIG5vcm1hbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAocHJvcCkge1xuICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTtcbiAgcHJvcCA9IGNhbWVsaXplKHByb3ApO1xuICBpZiAocHJvcCAhPT0gJ2ZpbHRlcicgJiYgKHByb3AgaW4gZW1wdHlTdHlsZSkpIHtcbiAgICByZXR1cm4gcHJvcFxuICB9XG4gIHZhciBjYXBOYW1lID0gcHJvcC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHByb3Auc2xpY2UoMSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbmFtZSA9IHZlbmRvck5hbWVzW2ldICsgY2FwTmFtZTtcbiAgICBpZiAobmFtZSBpbiBlbXB0eVN0eWxlKSB7XG4gICAgICByZXR1cm4gbmFtZVxuICAgIH1cbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0eWxlIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhO1xuICB2YXIgb2xkRGF0YSA9IG9sZFZub2RlLmRhdGE7XG5cbiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJlxuICAgIGlzVW5kZWYob2xkRGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihvbGREYXRhLnN0eWxlKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBjdXIsIG5hbWU7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcbiAgdmFyIG9sZFN0YXRpY1N0eWxlID0gb2xkRGF0YS5zdGF0aWNTdHlsZTtcbiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307XG5cbiAgLy8gaWYgc3RhdGljIHN0eWxlIGV4aXN0cywgc3R5bGViaW5kaW5nIGFscmVhZHkgbWVyZ2VkIGludG8gaXQgd2hlbiBkb2luZyBub3JtYWxpemVTdHlsZURhdGFcbiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nO1xuXG4gIHZhciBzdHlsZSA9IG5vcm1hbGl6ZVN0eWxlQmluZGluZyh2bm9kZS5kYXRhLnN0eWxlKSB8fCB7fTtcblxuICAvLyBzdG9yZSBub3JtYWxpemVkIHN0eWxlIHVuZGVyIGEgZGlmZmVyZW50IGtleSBmb3IgbmV4dCBkaWZmXG4gIC8vIG1ha2Ugc3VyZSB0byBjbG9uZSBpdCBpZiBpdCdzIHJlYWN0aXZlLCBzaW5jZSB0aGUgdXNlciBsaWtlbHkgd2FudHNcbiAgLy8gdG8gbXV0YXRlIGl0LlxuICB2bm9kZS5kYXRhLm5vcm1hbGl6ZWRTdHlsZSA9IGlzRGVmKHN0eWxlLl9fb2JfXylcbiAgICA/IGV4dGVuZCh7fSwgc3R5bGUpXG4gICAgOiBzdHlsZTtcblxuICB2YXIgbmV3U3R5bGUgPSBnZXRTdHlsZSh2bm9kZSwgdHJ1ZSk7XG5cbiAgZm9yIChuYW1lIGluIG9sZFN0eWxlKSB7XG4gICAgaWYgKGlzVW5kZWYobmV3U3R5bGVbbmFtZV0pKSB7XG4gICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7XG4gICAgfVxuICB9XG4gIGZvciAobmFtZSBpbiBuZXdTdHlsZSkge1xuICAgIGN1ciA9IG5ld1N0eWxlW25hbWVdO1xuICAgIGlmIChjdXIgIT09IG9sZFN0eWxlW25hbWVdKSB7XG4gICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZ1xuICAgICAgc2V0UHJvcChlbCwgbmFtZSwgY3VyID09IG51bGwgPyAnJyA6IGN1cik7XG4gICAgfVxuICB9XG59XG5cbnZhciBzdHlsZSA9IHtcbiAgY3JlYXRlOiB1cGRhdGVTdHlsZSxcbiAgdXBkYXRlOiB1cGRhdGVTdHlsZVxufTtcblxuLyogICovXG5cbnZhciB3aGl0ZXNwYWNlUkUgPSAvXFxzKy87XG5cbi8qKlxuICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uXG4gKiBTVkcgZWxlbWVudHMgaW4gSUVcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghY2xzIHx8ICEoY2xzID0gY2xzLnRyaW0oKSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICBpZiAoY2xzLmluZGV4T2YoJyAnKSA+IC0xKSB7XG4gICAgICBjbHMuc3BsaXQod2hpdGVzcGFjZVJFKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IHJldHVybiBlbC5jbGFzc0xpc3QuYWRkKGMpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgY3VyID0gXCIgXCIgKyAoZWwuZ2V0QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnKSArIFwiIFwiO1xuICAgIGlmIChjdXIuaW5kZXhPZignICcgKyBjbHMgKyAnICcpIDwgMCkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uXG4gKiBTVkcgZWxlbWVudHMgaW4gSUVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICghY2xzIHx8ICEoY2xzID0gY2xzLnRyaW0oKSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICBpZiAoY2xzLmluZGV4T2YoJyAnKSA+IC0xKSB7XG4gICAgICBjbHMuc3BsaXQod2hpdGVzcGFjZVJFKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IHJldHVybiBlbC5jbGFzc0xpc3QucmVtb3ZlKGMpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICAgIH1cbiAgICBpZiAoIWVsLmNsYXNzTGlzdC5sZW5ndGgpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGN1ciA9IFwiIFwiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyBcIiBcIjtcbiAgICB2YXIgdGFyID0gJyAnICsgY2xzICsgJyAnO1xuICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHtcbiAgICAgIGN1ciA9IGN1ci5yZXBsYWNlKHRhciwgJyAnKTtcbiAgICB9XG4gICAgY3VyID0gY3VyLnRyaW0oKTtcbiAgICBpZiAoY3VyKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY3VyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb24gKGRlZiQkMSkge1xuICBpZiAoIWRlZiQkMSkge1xuICAgIHJldHVyblxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgZGVmJCQxID09PSAnb2JqZWN0Jykge1xuICAgIHZhciByZXMgPSB7fTtcbiAgICBpZiAoZGVmJCQxLmNzcyAhPT0gZmFsc2UpIHtcbiAgICAgIGV4dGVuZChyZXMsIGF1dG9Dc3NUcmFuc2l0aW9uKGRlZiQkMS5uYW1lIHx8ICd2JykpO1xuICAgIH1cbiAgICBleHRlbmQocmVzLCBkZWYkJDEpO1xuICAgIHJldHVybiByZXNcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmJCQxID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYkJDEpXG4gIH1cbn1cblxudmFyIGF1dG9Dc3NUcmFuc2l0aW9uID0gY2FjaGVkKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB7XG4gICAgZW50ZXJDbGFzczogKG5hbWUgKyBcIi1lbnRlclwiKSxcbiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgXCItZW50ZXItdG9cIiksXG4gICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyBcIi1lbnRlci1hY3RpdmVcIiksXG4gICAgbGVhdmVDbGFzczogKG5hbWUgKyBcIi1sZWF2ZVwiKSxcbiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgXCItbGVhdmUtdG9cIiksXG4gICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyBcIi1sZWF2ZS1hY3RpdmVcIilcbiAgfVxufSk7XG5cbnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTtcbnZhciBUUkFOU0lUSU9OID0gJ3RyYW5zaXRpb24nO1xudmFyIEFOSU1BVElPTiA9ICdhbmltYXRpb24nO1xuXG4vLyBUcmFuc2l0aW9uIHByb3BlcnR5L2V2ZW50IHNuaWZmaW5nXG52YXIgdHJhbnNpdGlvblByb3AgPSAndHJhbnNpdGlvbic7XG52YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnO1xudmFyIGFuaW1hdGlvblByb3AgPSAnYW5pbWF0aW9uJztcbnZhciBhbmltYXRpb25FbmRFdmVudCA9ICdhbmltYXRpb25lbmQnO1xuaWYgKGhhc1RyYW5zaXRpb24pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh3aW5kb3cub250cmFuc2l0aW9uZW5kID09PSB1bmRlZmluZWQgJiZcbiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgdHJhbnNpdGlvblByb3AgPSAnV2Via2l0VHJhbnNpdGlvbic7XG4gICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnO1xuICB9XG4gIGlmICh3aW5kb3cub25hbmltYXRpb25lbmQgPT09IHVuZGVmaW5lZCAmJlxuICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGFuaW1hdGlvblByb3AgPSAnV2Via2l0QW5pbWF0aW9uJztcbiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnO1xuICB9XG59XG5cbi8vIGJpbmRpbmcgdG8gd2luZG93IGlzIG5lY2Vzc2FyeSB0byBtYWtlIGhvdCByZWxvYWQgd29yayBpbiBJRSBpbiBzdHJpY3QgbW9kZVxudmFyIHJhZiA9IGluQnJvd3NlclxuICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpXG4gICAgOiBzZXRUaW1lb3V0XG4gIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9O1xuXG5mdW5jdGlvbiBuZXh0RnJhbWUgKGZuKSB7XG4gIHJhZihmdW5jdGlvbiAoKSB7XG4gICAgcmFmKGZuKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFRyYW5zaXRpb25DbGFzcyAoZWwsIGNscykge1xuICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTtcbiAgaWYgKHRyYW5zaXRpb25DbGFzc2VzLmluZGV4T2YoY2xzKSA8IDApIHtcbiAgICB0cmFuc2l0aW9uQ2xhc3Nlcy5wdXNoKGNscyk7XG4gICAgYWRkQ2xhc3MoZWwsIGNscyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlVHJhbnNpdGlvbkNsYXNzIChlbCwgY2xzKSB7XG4gIGlmIChlbC5fdHJhbnNpdGlvbkNsYXNzZXMpIHtcbiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpO1xuICB9XG4gIHJlbW92ZUNsYXNzKGVsLCBjbHMpO1xufVxuXG5mdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMgKFxuICBlbCxcbiAgZXhwZWN0ZWRUeXBlLFxuICBjYlxuKSB7XG4gIHZhciByZWYgPSBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKTtcbiAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDtcbiAgdmFyIHByb3BDb3VudCA9IHJlZi5wcm9wQ291bnQ7XG4gIGlmICghdHlwZSkgeyByZXR1cm4gY2IoKSB9XG4gIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDtcbiAgdmFyIGVuZGVkID0gMDtcbiAgdmFyIGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7XG4gICAgY2IoKTtcbiAgfTtcbiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IGVsKSB7XG4gICAgICBpZiAoKytlbmRlZCA+PSBwcm9wQ291bnQpIHtcbiAgICAgICAgZW5kKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZW5kZWQgPCBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfSwgdGltZW91dCArIDEpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7XG59XG5cbnZhciB0cmFuc2Zvcm1SRSA9IC9cXGIodHJhbnNmb3JtfGFsbCkoLHwkKS87XG5cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7XG4gIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gIC8vIEpTRE9NIG1heSByZXR1cm4gdW5kZWZpbmVkIGZvciB0cmFuc2l0aW9uIHByb3BlcnRpZXNcbiAgdmFyIHRyYW5zaXRpb25EZWxheXMgPSAoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0RlbGF5J10gfHwgJycpLnNwbGl0KCcsICcpO1xuICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9ucyA9IChzdHlsZXNbdHJhbnNpdGlvblByb3AgKyAnRHVyYXRpb24nXSB8fCAnJykuc3BsaXQoJywgJyk7XG4gIHZhciB0cmFuc2l0aW9uVGltZW91dCA9IGdldFRpbWVvdXQodHJhbnNpdGlvbkRlbGF5cywgdHJhbnNpdGlvbkR1cmF0aW9ucyk7XG4gIHZhciBhbmltYXRpb25EZWxheXMgPSAoc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXSB8fCAnJykuc3BsaXQoJywgJyk7XG4gIHZhciBhbmltYXRpb25EdXJhdGlvbnMgPSAoc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXSB8fCAnJykuc3BsaXQoJywgJyk7XG4gIHZhciBhbmltYXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dChhbmltYXRpb25EZWxheXMsIGFuaW1hdGlvbkR1cmF0aW9ucyk7XG5cbiAgdmFyIHR5cGU7XG4gIHZhciB0aW1lb3V0ID0gMDtcbiAgdmFyIHByb3BDb3VudCA9IDA7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoZXhwZWN0ZWRUeXBlID09PSBUUkFOU0lUSU9OKSB7XG4gICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IFRSQU5TSVRJT047XG4gICAgICB0aW1lb3V0ID0gdHJhbnNpdGlvblRpbWVvdXQ7XG4gICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBBTklNQVRJT04pIHtcbiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHtcbiAgICAgIHR5cGUgPSBBTklNQVRJT047XG4gICAgICB0aW1lb3V0ID0gYW5pbWF0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7XG4gICAgdHlwZSA9IHRpbWVvdXQgPiAwXG4gICAgICA/IHRyYW5zaXRpb25UaW1lb3V0ID4gYW5pbWF0aW9uVGltZW91dFxuICAgICAgICA/IFRSQU5TSVRJT05cbiAgICAgICAgOiBBTklNQVRJT05cbiAgICAgIDogbnVsbDtcbiAgICBwcm9wQ291bnQgPSB0eXBlXG4gICAgICA/IHR5cGUgPT09IFRSQU5TSVRJT05cbiAgICAgICAgPyB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aFxuICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGhcbiAgICAgIDogMDtcbiAgfVxuICB2YXIgaGFzVHJhbnNmb3JtID1cbiAgICB0eXBlID09PSBUUkFOU0lUSU9OICYmXG4gICAgdHJhbnNmb3JtUkUudGVzdChzdHlsZXNbdHJhbnNpdGlvblByb3AgKyAnUHJvcGVydHknXSk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgIHByb3BDb3VudDogcHJvcENvdW50LFxuICAgIGhhc1RyYW5zZm9ybTogaGFzVHJhbnNmb3JtXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGltZW91dCAoZGVsYXlzLCBkdXJhdGlvbnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgZGVsYXlzID0gZGVsYXlzLmNvbmNhdChkZWxheXMpO1xuICB9XG5cbiAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsIGR1cmF0aW9ucy5tYXAoZnVuY3Rpb24gKGQsIGkpIHtcbiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKVxuICB9KSlcbn1cblxuLy8gT2xkIHZlcnNpb25zIG9mIENocm9taXVtIChiZWxvdyA2MS4wLjMxNjMuMTAwKSBmb3JtYXRzIGZsb2F0aW5nIHBvaW50ZXIgbnVtYmVyc1xuLy8gaW4gYSBsb2NhbGUtZGVwZW5kZW50IHdheSwgdXNpbmcgYSBjb21tYSBpbnN0ZWFkIG9mIGEgZG90LlxuLy8gSWYgY29tbWEgaXMgbm90IHJlcGxhY2VkIHdpdGggYSBkb3QsIHRoZSBpbnB1dCB3aWxsIGJlIHJvdW5kZWQgZG93biAoaS5lLiBhY3Rpbmdcbi8vIGFzIGEgZmxvb3IgZnVuY3Rpb24pIGNhdXNpbmcgdW5leHBlY3RlZCBiZWhhdmlvcnNcbmZ1bmN0aW9uIHRvTXMgKHMpIHtcbiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKS5yZXBsYWNlKCcsJywgJy4nKSkgKiAxMDAwXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBlbnRlciAodm5vZGUsIHRvZ2dsZURpc3BsYXkpIHtcbiAgdmFyIGVsID0gdm5vZGUuZWxtO1xuXG4gIC8vIGNhbGwgbGVhdmUgY2FsbGJhY2sgbm93XG4gIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHtcbiAgICBlbC5fbGVhdmVDYi5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIGVsLl9sZWF2ZUNiKCk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHJlc29sdmVUcmFuc2l0aW9uKHZub2RlLmRhdGEudHJhbnNpdGlvbik7XG4gIGlmIChpc1VuZGVmKGRhdGEpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzRGVmKGVsLl9lbnRlckNiKSB8fCBlbC5ub2RlVHlwZSAhPT0gMSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGNzcyA9IGRhdGEuY3NzO1xuICB2YXIgdHlwZSA9IGRhdGEudHlwZTtcbiAgdmFyIGVudGVyQ2xhc3MgPSBkYXRhLmVudGVyQ2xhc3M7XG4gIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzcztcbiAgdmFyIGVudGVyQWN0aXZlQ2xhc3MgPSBkYXRhLmVudGVyQWN0aXZlQ2xhc3M7XG4gIHZhciBhcHBlYXJDbGFzcyA9IGRhdGEuYXBwZWFyQ2xhc3M7XG4gIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzO1xuICB2YXIgYXBwZWFyQWN0aXZlQ2xhc3MgPSBkYXRhLmFwcGVhckFjdGl2ZUNsYXNzO1xuICB2YXIgYmVmb3JlRW50ZXIgPSBkYXRhLmJlZm9yZUVudGVyO1xuICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyO1xuICB2YXIgYWZ0ZXJFbnRlciA9IGRhdGEuYWZ0ZXJFbnRlcjtcbiAgdmFyIGVudGVyQ2FuY2VsbGVkID0gZGF0YS5lbnRlckNhbmNlbGxlZDtcbiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyO1xuICB2YXIgYXBwZWFyID0gZGF0YS5hcHBlYXI7XG4gIHZhciBhZnRlckFwcGVhciA9IGRhdGEuYWZ0ZXJBcHBlYXI7XG4gIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDtcbiAgdmFyIGR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbjtcblxuICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzXG4gIC8vIHRyYW5zaXRpb24uIE9uZSBlZGdlIGNhc2UgdG8gY2hlY2sgaXMgd2hlbiB0aGUgPHRyYW5zaXRpb24+IGlzIHBsYWNlZFxuICAvLyBhcyB0aGUgcm9vdCBub2RlIG9mIGEgY2hpbGQgY29tcG9uZW50LiBJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byBjaGVja1xuICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay5cbiAgdmFyIGNvbnRleHQgPSBhY3RpdmVJbnN0YW5jZTtcbiAgdmFyIHRyYW5zaXRpb25Ob2RlID0gYWN0aXZlSW5zdGFuY2UuJHZub2RlO1xuICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7XG4gICAgY29udGV4dCA9IHRyYW5zaXRpb25Ob2RlLmNvbnRleHQ7XG4gICAgdHJhbnNpdGlvbk5vZGUgPSB0cmFuc2l0aW9uTm9kZS5wYXJlbnQ7XG4gIH1cblxuICB2YXIgaXNBcHBlYXIgPSAhY29udGV4dC5faXNNb3VudGVkIHx8ICF2bm9kZS5pc1Jvb3RJbnNlcnQ7XG5cbiAgaWYgKGlzQXBwZWFyICYmICFhcHBlYXIgJiYgYXBwZWFyICE9PSAnJykge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIHN0YXJ0Q2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJDbGFzc1xuICAgID8gYXBwZWFyQ2xhc3NcbiAgICA6IGVudGVyQ2xhc3M7XG4gIHZhciBhY3RpdmVDbGFzcyA9IGlzQXBwZWFyICYmIGFwcGVhckFjdGl2ZUNsYXNzXG4gICAgPyBhcHBlYXJBY3RpdmVDbGFzc1xuICAgIDogZW50ZXJBY3RpdmVDbGFzcztcbiAgdmFyIHRvQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJUb0NsYXNzXG4gICAgPyBhcHBlYXJUb0NsYXNzXG4gICAgOiBlbnRlclRvQ2xhc3M7XG5cbiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyXG4gICAgPyAoYmVmb3JlQXBwZWFyIHx8IGJlZm9yZUVudGVyKVxuICAgIDogYmVmb3JlRW50ZXI7XG4gIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhclxuICAgID8gKHR5cGVvZiBhcHBlYXIgPT09ICdmdW5jdGlvbicgPyBhcHBlYXIgOiBlbnRlcilcbiAgICA6IGVudGVyO1xuICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhclxuICAgID8gKGFmdGVyQXBwZWFyIHx8IGFmdGVyRW50ZXIpXG4gICAgOiBhZnRlckVudGVyO1xuICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXJcbiAgICA/IChhcHBlYXJDYW5jZWxsZWQgfHwgZW50ZXJDYW5jZWxsZWQpXG4gICAgOiBlbnRlckNhbmNlbGxlZDtcblxuICB2YXIgZXhwbGljaXRFbnRlckR1cmF0aW9uID0gdG9OdW1iZXIoXG4gICAgaXNPYmplY3QoZHVyYXRpb24pXG4gICAgICA/IGR1cmF0aW9uLmVudGVyXG4gICAgICA6IGR1cmF0aW9uXG4gICk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZXhwbGljaXRFbnRlckR1cmF0aW9uICE9IG51bGwpIHtcbiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpO1xuICB9XG5cbiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTtcbiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGVudGVySG9vayk7XG5cbiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZXhwZWN0c0NTUykge1xuICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCB0b0NsYXNzKTtcbiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICBpZiAoZXhwZWN0c0NTUykge1xuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIHN0YXJ0Q2xhc3MpO1xuICAgICAgfVxuICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyRW50ZXJIb29rICYmIGFmdGVyRW50ZXJIb29rKGVsKTtcbiAgICB9XG4gICAgZWwuX2VudGVyQ2IgPSBudWxsO1xuICB9KTtcblxuICBpZiAoIXZub2RlLmRhdGEuc2hvdykge1xuICAgIC8vIHJlbW92ZSBwZW5kaW5nIGxlYXZlIGVsZW1lbnQgb24gZW50ZXIgYnkgaW5qZWN0aW5nIGFuIGluc2VydCBob29rXG4gICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGFyZW50ID0gZWwucGFyZW50Tm9kZTtcbiAgICAgIHZhciBwZW5kaW5nTm9kZSA9IHBhcmVudCAmJiBwYXJlbnQuX3BlbmRpbmcgJiYgcGFyZW50Ll9wZW5kaW5nW3Zub2RlLmtleV07XG4gICAgICBpZiAocGVuZGluZ05vZGUgJiZcbiAgICAgICAgcGVuZGluZ05vZGUudGFnID09PSB2bm9kZS50YWcgJiZcbiAgICAgICAgcGVuZGluZ05vZGUuZWxtLl9sZWF2ZUNiXG4gICAgICApIHtcbiAgICAgICAgcGVuZGluZ05vZGUuZWxtLl9sZWF2ZUNiKCk7XG4gICAgICB9XG4gICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7XG4gICAgfSk7XG4gIH1cblxuICAvLyBzdGFydCBlbnRlciB0cmFuc2l0aW9uXG4gIGJlZm9yZUVudGVySG9vayAmJiBiZWZvcmVFbnRlckhvb2soZWwpO1xuICBpZiAoZXhwZWN0c0NTUykge1xuICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7XG4gICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBhY3RpdmVDbGFzcyk7XG4gICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7XG4gICAgICBpZiAoIWNiLmNhbmNlbGxlZCkge1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpO1xuICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZER1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbikpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgY2IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHZub2RlLmRhdGEuc2hvdykge1xuICAgIHRvZ2dsZURpc3BsYXkgJiYgdG9nZ2xlRGlzcGxheSgpO1xuICAgIGVudGVySG9vayAmJiBlbnRlckhvb2soZWwsIGNiKTtcbiAgfVxuXG4gIGlmICghZXhwZWN0c0NTUyAmJiAhdXNlcldhbnRzQ29udHJvbCkge1xuICAgIGNiKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGVhdmUgKHZub2RlLCBybSkge1xuICB2YXIgZWwgPSB2bm9kZS5lbG07XG5cbiAgLy8gY2FsbCBlbnRlciBjYWxsYmFjayBub3dcbiAgaWYgKGlzRGVmKGVsLl9lbnRlckNiKSkge1xuICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgZWwuX2VudGVyQ2IoKTtcbiAgfVxuXG4gIHZhciBkYXRhID0gcmVzb2x2ZVRyYW5zaXRpb24odm5vZGUuZGF0YS50cmFuc2l0aW9uKTtcbiAgaWYgKGlzVW5kZWYoZGF0YSkgfHwgZWwubm9kZVR5cGUgIT09IDEpIHtcbiAgICByZXR1cm4gcm0oKVxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBjc3MgPSBkYXRhLmNzcztcbiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7XG4gIHZhciBsZWF2ZUNsYXNzID0gZGF0YS5sZWF2ZUNsYXNzO1xuICB2YXIgbGVhdmVUb0NsYXNzID0gZGF0YS5sZWF2ZVRvQ2xhc3M7XG4gIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzO1xuICB2YXIgYmVmb3JlTGVhdmUgPSBkYXRhLmJlZm9yZUxlYXZlO1xuICB2YXIgbGVhdmUgPSBkYXRhLmxlYXZlO1xuICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTtcbiAgdmFyIGxlYXZlQ2FuY2VsbGVkID0gZGF0YS5sZWF2ZUNhbmNlbGxlZDtcbiAgdmFyIGRlbGF5TGVhdmUgPSBkYXRhLmRlbGF5TGVhdmU7XG4gIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247XG5cbiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTtcbiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTtcblxuICB2YXIgZXhwbGljaXRMZWF2ZUR1cmF0aW9uID0gdG9OdW1iZXIoXG4gICAgaXNPYmplY3QoZHVyYXRpb24pXG4gICAgICA/IGR1cmF0aW9uLmxlYXZlXG4gICAgICA6IGR1cmF0aW9uXG4gICk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkge1xuICAgIGNoZWNrRHVyYXRpb24oZXhwbGljaXRMZWF2ZUR1cmF0aW9uLCAnbGVhdmUnLCB2bm9kZSk7XG4gIH1cblxuICB2YXIgY2IgPSBlbC5fbGVhdmVDYiA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICAgIGlmIChlbC5wYXJlbnROb2RlICYmIGVsLnBhcmVudE5vZGUuX3BlbmRpbmcpIHtcbiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChleHBlY3RzQ1NTKSB7XG4gICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICBpZiAoZXhwZWN0c0NTUykge1xuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpO1xuICAgICAgfVxuICAgICAgbGVhdmVDYW5jZWxsZWQgJiYgbGVhdmVDYW5jZWxsZWQoZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBybSgpO1xuICAgICAgYWZ0ZXJMZWF2ZSAmJiBhZnRlckxlYXZlKGVsKTtcbiAgICB9XG4gICAgZWwuX2xlYXZlQ2IgPSBudWxsO1xuICB9KTtcblxuICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgIGRlbGF5TGVhdmUocGVyZm9ybUxlYXZlKTtcbiAgfSBlbHNlIHtcbiAgICBwZXJmb3JtTGVhdmUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7XG4gICAgLy8gdGhlIGRlbGF5ZWQgbGVhdmUgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZFxuICAgIGlmIChjYi5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyByZWNvcmQgbGVhdmluZyBlbGVtZW50XG4gICAgaWYgKCF2bm9kZS5kYXRhLnNob3cgJiYgZWwucGFyZW50Tm9kZSkge1xuICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlO1xuICAgIH1cbiAgICBiZWZvcmVMZWF2ZSAmJiBiZWZvcmVMZWF2ZShlbCk7XG4gICAgaWYgKGV4cGVjdHNDU1MpIHtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVDbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTtcbiAgICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHtcbiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgICAgICAgaWYgKCF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZER1cmF0aW9uKGV4cGxpY2l0TGVhdmVEdXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgY2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGxlYXZlICYmIGxlYXZlKGVsLCBjYik7XG4gICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgICBjYigpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGVcbmZ1bmN0aW9uIGNoZWNrRHVyYXRpb24gKHZhbCwgbmFtZSwgdm5vZGUpIHtcbiAgaWYgKHR5cGVvZiB2YWwgIT09ICdudW1iZXInKSB7XG4gICAgd2FybihcbiAgICAgIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IFwiICsgbmFtZSArIFwiIGR1cmF0aW9uIGlzIG5vdCBhIHZhbGlkIG51bWJlciAtIFwiICtcbiAgICAgIFwiZ290IFwiICsgKEpTT04uc3RyaW5naWZ5KHZhbCkpICsgXCIuXCIsXG4gICAgICB2bm9kZS5jb250ZXh0XG4gICAgKTtcbiAgfSBlbHNlIGlmIChpc05hTih2YWwpKSB7XG4gICAgd2FybihcbiAgICAgIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IFwiICsgbmFtZSArIFwiIGR1cmF0aW9uIGlzIE5hTiAtIFwiICtcbiAgICAgICd0aGUgZHVyYXRpb24gZXhwcmVzc2lvbiBtaWdodCBiZSBpbmNvcnJlY3QuJyxcbiAgICAgIHZub2RlLmNvbnRleHRcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWREdXJhdGlvbiAodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHRyYW5zaXRpb24gaG9vaydzIGFyZ3VtZW50IGxlbmd0aC4gVGhlIGhvb2sgbWF5IGJlOlxuICogLSBhIG1lcmdlZCBob29rIChpbnZva2VyKSB3aXRoIHRoZSBvcmlnaW5hbCBpbiAuZm5zXG4gKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aClcbiAqIC0gYSBwbGFpbiBmdW5jdGlvbiAoLmxlbmd0aClcbiAqL1xuZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHtcbiAgaWYgKGlzVW5kZWYoZm4pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgdmFyIGludm9rZXJGbnMgPSBmbi5mbnM7XG4gIGlmIChpc0RlZihpbnZva2VyRm5zKSkge1xuICAgIC8vIGludm9rZXJcbiAgICByZXR1cm4gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aChcbiAgICAgIEFycmF5LmlzQXJyYXkoaW52b2tlckZucylcbiAgICAgICAgPyBpbnZva2VyRm5zWzBdXG4gICAgICAgIDogaW52b2tlckZuc1xuICAgIClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKGZuLl9sZW5ndGggfHwgZm4ubGVuZ3RoKSA+IDFcbiAgfVxufVxuXG5mdW5jdGlvbiBfZW50ZXIgKF8sIHZub2RlKSB7XG4gIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHtcbiAgICBlbnRlcih2bm9kZSk7XG4gIH1cbn1cblxudmFyIHRyYW5zaXRpb24gPSBpbkJyb3dzZXIgPyB7XG4gIGNyZWF0ZTogX2VudGVyLFxuICBhY3RpdmF0ZTogX2VudGVyLFxuICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSQkMSAodm5vZGUsIHJtKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodm5vZGUuZGF0YS5zaG93ICE9PSB0cnVlKSB7XG4gICAgICBsZWF2ZSh2bm9kZSwgcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBybSgpO1xuICAgIH1cbiAgfVxufSA6IHt9O1xuXG52YXIgcGxhdGZvcm1Nb2R1bGVzID0gW1xuICBhdHRycyxcbiAga2xhc3MsXG4gIGV2ZW50cyxcbiAgZG9tUHJvcHMsXG4gIHN0eWxlLFxuICB0cmFuc2l0aW9uXG5dO1xuXG4vKiAgKi9cblxuLy8gdGhlIGRpcmVjdGl2ZSBtb2R1bGUgc2hvdWxkIGJlIGFwcGxpZWQgbGFzdCwgYWZ0ZXIgYWxsXG4vLyBidWlsdC1pbiBtb2R1bGVzIGhhdmUgYmVlbiBhcHBsaWVkLlxudmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTtcblxudmFyIHBhdGNoID0gY3JlYXRlUGF0Y2hGdW5jdGlvbih7IG5vZGVPcHM6IG5vZGVPcHMsIG1vZHVsZXM6IG1vZHVsZXMgfSk7XG5cbi8qKlxuICogTm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IGxpa2UgYXR0YWNoaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLlxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKGlzSUU5KSB7XG4gIC8vIGh0dHA6Ly93d3cubWF0dHM0MTEuY29tL3Bvc3QvaW50ZXJuZXQtZXhwbG9yZXItOS1vbmlucHV0L1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBpZiAoZWwgJiYgZWwudm1vZGVsKSB7XG4gICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTtcbiAgICB9XG4gIH0pO1xufVxuXG52YXIgZGlyZWN0aXZlID0ge1xuICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHtcbiAgICBpZiAodm5vZGUudGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgLy8gIzY5MDNcbiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdwb3N0cGF0Y2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGlyZWN0aXZlLmNvbXBvbmVudFVwZGF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm5vZGUuY29udGV4dCk7XG4gICAgICB9XG4gICAgICBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2bm9kZS50YWcgPT09ICd0ZXh0YXJlYScgfHwgaXNUZXh0SW5wdXRUeXBlKGVsLnR5cGUpKSB7XG4gICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzO1xuICAgICAgaWYgKCFiaW5kaW5nLm1vZGlmaWVycy5sYXp5KSB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbXBvc2l0aW9uc3RhcnQnLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgICAgICAvLyBTYWZhcmkgPCAxMC4yICYgVUlXZWJWaWV3IGRvZXNuJ3QgZmlyZSBjb21wb3NpdGlvbmVuZCB3aGVuXG4gICAgICAgIC8vIHN3aXRjaGluZyBmb2N1cyBiZWZvcmUgY29uZmlybWluZyBjb21wb3NpdGlvbiBjaG9pY2VcbiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZVxuICAgICAgICAvLyBmaXJlcyBcImNoYW5nZVwiIGluc3RlYWQgb2YgXCJpbnB1dFwiIG9uIGF1dG9jb21wbGV0ZS5cbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXNJRTkpIHtcbiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7XG4gICAgICBzZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm5vZGUuY29udGV4dCk7XG4gICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCxcbiAgICAgIC8vIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgdmFsdWUgaXMgb3V0LW9mLXN5bmMgd2l0aCB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAgICAgIC8vIGRldGVjdCBzdWNoIGNhc2VzIGFuZCBmaWx0ZXIgb3V0IHZhbHVlcyB0aGF0IG5vIGxvbmdlciBoYXMgYSBtYXRjaGluZ1xuICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uXG4gICAgICB2YXIgcHJldk9wdGlvbnMgPSBlbC5fdk9wdGlvbnM7XG4gICAgICB2YXIgY3VyT3B0aW9ucyA9IGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTtcbiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHtcbiAgICAgICAgLy8gdHJpZ2dlciBjaGFuZ2UgZXZlbnQgaWZcbiAgICAgICAgLy8gbm8gbWF0Y2hpbmcgb3B0aW9uIGZvdW5kIGZvciBhdCBsZWFzdCBvbmUgdmFsdWVcbiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlXG4gICAgICAgICAgPyBiaW5kaW5nLnZhbHVlLnNvbWUoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIGhhc05vTWF0Y2hpbmdPcHRpb24odiwgY3VyT3B0aW9ucyk7IH0pXG4gICAgICAgICAgOiBiaW5kaW5nLnZhbHVlICE9PSBiaW5kaW5nLm9sZFZhbHVlICYmIGhhc05vTWF0Y2hpbmdPcHRpb24oYmluZGluZy52YWx1ZSwgY3VyT3B0aW9ucyk7XG4gICAgICAgIGlmIChuZWVkUmVzZXQpIHtcbiAgICAgICAgICB0cmlnZ2VyKGVsLCAnY2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNldFNlbGVjdGVkIChlbCwgYmluZGluZywgdm0pIHtcbiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzSUUgfHwgaXNFZGdlKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBhY3R1YWxseVNldFNlbGVjdGVkKGVsLCBiaW5kaW5nLCB2bSk7XG4gICAgfSwgMCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7XG4gIHZhciB2YWx1ZSA9IGJpbmRpbmcudmFsdWU7XG4gIHZhciBpc011bHRpcGxlID0gZWwubXVsdGlwbGU7XG4gIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiPHNlbGVjdCBtdWx0aXBsZSB2LW1vZGVsPVxcXCJcIiArIChiaW5kaW5nLmV4cHJlc3Npb24pICsgXCJcXFwiPiBcIiArXG4gICAgICBcImV4cGVjdHMgYW4gQXJyYXkgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBidXQgZ290IFwiICsgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpKSxcbiAgICAgIHZtXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgc2VsZWN0ZWQsIG9wdGlvbjtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBlbC5vcHRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIHNlbGVjdGVkID0gbG9vc2VJbmRleE9mKHZhbHVlLCBnZXRWYWx1ZShvcHRpb24pKSA+IC0xO1xuICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChsb29zZUVxdWFsKGdldFZhbHVlKG9wdGlvbiksIHZhbHVlKSkge1xuICAgICAgICBpZiAoZWwuc2VsZWN0ZWRJbmRleCAhPT0gaSkge1xuICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWlzTXVsdGlwbGUpIHtcbiAgICBlbC5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzTm9NYXRjaGluZ09wdGlvbiAodmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSlcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikge1xuICByZXR1cm4gJ192YWx1ZScgaW4gb3B0aW9uXG4gICAgPyBvcHRpb24uX3ZhbHVlXG4gICAgOiBvcHRpb24udmFsdWVcbn1cblxuZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7XG4gIGUudGFyZ2V0LmNvbXBvc2luZyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25FbmQgKGUpIHtcbiAgLy8gcHJldmVudCB0cmlnZ2VyaW5nIGFuIGlucHV0IGV2ZW50IGZvciBubyByZWFzb25cbiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH1cbiAgZS50YXJnZXQuY29tcG9zaW5nID0gZmFsc2U7XG4gIHRyaWdnZXIoZS50YXJnZXQsICdpbnB1dCcpO1xufVxuXG5mdW5jdGlvbiB0cmlnZ2VyIChlbCwgdHlwZSkge1xuICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XG4gIGUuaW5pdEV2ZW50KHR5cGUsIHRydWUsIHRydWUpO1xuICBlbC5kaXNwYXRjaEV2ZW50KGUpO1xufVxuXG4vKiAgKi9cblxuLy8gcmVjdXJzaXZlbHkgc2VhcmNoIGZvciBwb3NzaWJsZSB0cmFuc2l0aW9uIGRlZmluZWQgaW5zaWRlIHRoZSBjb21wb25lbnQgcm9vdFxuZnVuY3Rpb24gbG9jYXRlTm9kZSAodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKVxuICAgID8gbG9jYXRlTm9kZSh2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpXG4gICAgOiB2bm9kZVxufVxuXG52YXIgc2hvdyA9IHtcbiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHtcbiAgICB2YXIgdmFsdWUgPSByZWYudmFsdWU7XG5cbiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpO1xuICAgIHZhciB0cmFuc2l0aW9uJCQxID0gdm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLnRyYW5zaXRpb247XG4gICAgdmFyIG9yaWdpbmFsRGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheSA9XG4gICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7XG4gICAgaWYgKHZhbHVlICYmIHRyYW5zaXRpb24kJDEpIHtcbiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7XG4gICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gb3JpZ2luYWxEaXNwbGF5O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZSA/IG9yaWdpbmFsRGlzcGxheSA6ICdub25lJztcbiAgICB9XG4gIH0sXG5cbiAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUgKGVsLCByZWYsIHZub2RlKSB7XG4gICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlO1xuICAgIHZhciBvbGRWYWx1ZSA9IHJlZi5vbGRWYWx1ZTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghdmFsdWUgPT09ICFvbGRWYWx1ZSkgeyByZXR1cm4gfVxuICAgIHZub2RlID0gbG9jYXRlTm9kZSh2bm9kZSk7XG4gICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjtcbiAgICBpZiAodHJhbnNpdGlvbiQkMSkge1xuICAgICAgdm5vZGUuZGF0YS5zaG93ID0gdHJ1ZTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVhdmUodm5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gZWwuX192T3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnO1xuICAgIH1cbiAgfSxcblxuICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZCAoXG4gICAgZWwsXG4gICAgYmluZGluZyxcbiAgICB2bm9kZSxcbiAgICBvbGRWbm9kZSxcbiAgICBpc0Rlc3Ryb3lcbiAgKSB7XG4gICAgaWYgKCFpc0Rlc3Ryb3kpIHtcbiAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgcGxhdGZvcm1EaXJlY3RpdmVzID0ge1xuICBtb2RlbDogZGlyZWN0aXZlLFxuICBzaG93OiBzaG93XG59O1xuXG4vKiAgKi9cblxudmFyIHRyYW5zaXRpb25Qcm9wcyA9IHtcbiAgbmFtZTogU3RyaW5nLFxuICBhcHBlYXI6IEJvb2xlYW4sXG4gIGNzczogQm9vbGVhbixcbiAgbW9kZTogU3RyaW5nLFxuICB0eXBlOiBTdHJpbmcsXG4gIGVudGVyQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVDbGFzczogU3RyaW5nLFxuICBlbnRlclRvQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVUb0NsYXNzOiBTdHJpbmcsXG4gIGVudGVyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJDbGFzczogU3RyaW5nLFxuICBhcHBlYXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gIGR1cmF0aW9uOiBbTnVtYmVyLCBTdHJpbmcsIE9iamVjdF1cbn07XG5cbi8vIGluIGNhc2UgdGhlIGNoaWxkIGlzIGFsc28gYW4gYWJzdHJhY3QgY29tcG9uZW50LCBlLmcuIDxrZWVwLWFsaXZlPlxuLy8gd2Ugd2FudCB0byByZWN1cnNpdmVseSByZXRyaWV2ZSB0aGUgcmVhbCBjb21wb25lbnQgdG8gYmUgcmVuZGVyZWRcbmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHtcbiAgdmFyIGNvbXBPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgaWYgKGNvbXBPcHRpb25zICYmIGNvbXBPcHRpb25zLkN0b3Iub3B0aW9ucy5hYnN0cmFjdCkge1xuICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZub2RlXG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7XG4gIHZhciBkYXRhID0ge307XG4gIHZhciBvcHRpb25zID0gY29tcC4kb3B0aW9ucztcbiAgLy8gcHJvcHNcbiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMucHJvcHNEYXRhKSB7XG4gICAgZGF0YVtrZXldID0gY29tcFtrZXldO1xuICB9XG4gIC8vIGV2ZW50cy5cbiAgLy8gZXh0cmFjdCBsaXN0ZW5lcnMgYW5kIHBhc3MgdGhlbSBkaXJlY3RseSB0byB0aGUgdHJhbnNpdGlvbiBtZXRob2RzXG4gIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7XG4gIGZvciAodmFyIGtleSQxIGluIGxpc3RlbmVycykge1xuICAgIGRhdGFbY2FtZWxpemUoa2V5JDEpXSA9IGxpc3RlbmVyc1trZXkkMV07XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuZnVuY3Rpb24gcGxhY2Vob2xkZXIgKGgsIHJhd0NoaWxkKSB7XG4gIGlmICgvXFxkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHtcbiAgICByZXR1cm4gaCgna2VlcC1hbGl2ZScsIHtcbiAgICAgIHByb3BzOiByYXdDaGlsZC5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzUGFyZW50VHJhbnNpdGlvbiAodm5vZGUpIHtcbiAgd2hpbGUgKCh2bm9kZSA9IHZub2RlLnBhcmVudCkpIHtcbiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7XG4gIHJldHVybiBvbGRDaGlsZC5rZXkgPT09IGNoaWxkLmtleSAmJiBvbGRDaGlsZC50YWcgPT09IGNoaWxkLnRhZ1xufVxuXG52YXIgaXNOb3RUZXh0Tm9kZSA9IGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH07XG5cbnZhciBpc1ZTaG93RGlyZWN0aXZlID0gZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQubmFtZSA9PT0gJ3Nob3cnOyB9O1xuXG52YXIgVHJhbnNpdGlvbiA9IHtcbiAgbmFtZTogJ3RyYW5zaXRpb24nLFxuICBwcm9wczogdHJhbnNpdGlvblByb3BzLFxuICBhYnN0cmFjdDogdHJ1ZSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHRleHQgbm9kZXMgKHBvc3NpYmxlIHdoaXRlc3BhY2VzKVxuICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGlzTm90VGV4dE5vZGUpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgd2FybihcbiAgICAgICAgJzx0cmFuc2l0aW9uPiBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGVsZW1lbnQuIFVzZSAnICtcbiAgICAgICAgJzx0cmFuc2l0aW9uLWdyb3VwPiBmb3IgbGlzdHMuJyxcbiAgICAgICAgdGhpcy4kcGFyZW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBtb2RlID0gdGhpcy5tb2RlO1xuXG4gICAgLy8gd2FybiBpbnZhbGlkIG1vZGVcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJ1xuICAgICkge1xuICAgICAgd2FybihcbiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLFxuICAgICAgICB0aGlzLiRwYXJlbnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIHJhd0NoaWxkID0gY2hpbGRyZW5bMF07XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgY29tcG9uZW50IHJvb3Qgbm9kZSBhbmQgdGhlIGNvbXBvbmVudCdzXG4gICAgLy8gcGFyZW50IGNvbnRhaW5lciBub2RlIGFsc28gaGFzIHRyYW5zaXRpb24sIHNraXAuXG4gICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7XG4gICAgICByZXR1cm4gcmF3Q2hpbGRcbiAgICB9XG5cbiAgICAvLyBhcHBseSB0cmFuc2l0aW9uIGRhdGEgdG8gY2hpbGRcbiAgICAvLyB1c2UgZ2V0UmVhbENoaWxkKCkgdG8gaWdub3JlIGFic3RyYWN0IGNvbXBvbmVudHMgZS5nLiBrZWVwLWFsaXZlXG4gICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNoaWxkKSB7XG4gICAgICByZXR1cm4gcmF3Q2hpbGRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGVhdmluZykge1xuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyKGgsIHJhd0NoaWxkKVxuICAgIH1cblxuICAgIC8vIGVuc3VyZSBhIGtleSB0aGF0IGlzIHVuaXF1ZSB0byB0aGUgdm5vZGUgdHlwZSBhbmQgdG8gdGhpcyB0cmFuc2l0aW9uXG4gICAgLy8gY29tcG9uZW50IGluc3RhbmNlLiBUaGlzIGtleSB3aWxsIGJlIHVzZWQgdG8gcmVtb3ZlIHBlbmRpbmcgbGVhdmluZyBub2Rlc1xuICAgIC8vIGR1cmluZyBlbnRlcmluZy5cbiAgICB2YXIgaWQgPSBcIl9fdHJhbnNpdGlvbi1cIiArICh0aGlzLl91aWQpICsgXCItXCI7XG4gICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGxcbiAgICAgID8gY2hpbGQuaXNDb21tZW50XG4gICAgICAgID8gaWQgKyAnY29tbWVudCdcbiAgICAgICAgOiBpZCArIGNoaWxkLnRhZ1xuICAgICAgOiBpc1ByaW1pdGl2ZShjaGlsZC5rZXkpXG4gICAgICAgID8gKFN0cmluZyhjaGlsZC5rZXkpLmluZGV4T2YoaWQpID09PSAwID8gY2hpbGQua2V5IDogaWQgKyBjaGlsZC5rZXkpXG4gICAgICAgIDogY2hpbGQua2V5O1xuXG4gICAgdmFyIGRhdGEgPSAoY2hpbGQuZGF0YSB8fCAoY2hpbGQuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IGV4dHJhY3RUcmFuc2l0aW9uRGF0YSh0aGlzKTtcbiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTtcbiAgICB2YXIgb2xkQ2hpbGQgPSBnZXRSZWFsQ2hpbGQob2xkUmF3Q2hpbGQpO1xuXG4gICAgLy8gbWFyayB2LXNob3dcbiAgICAvLyBzbyB0aGF0IHRoZSB0cmFuc2l0aW9uIG1vZHVsZSBjYW4gaGFuZCBvdmVyIHRoZSBjb250cm9sIHRvIHRoZSBkaXJlY3RpdmVcbiAgICBpZiAoY2hpbGQuZGF0YS5kaXJlY3RpdmVzICYmIGNoaWxkLmRhdGEuZGlyZWN0aXZlcy5zb21lKGlzVlNob3dEaXJlY3RpdmUpKSB7XG4gICAgICBjaGlsZC5kYXRhLnNob3cgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG9sZENoaWxkICYmXG4gICAgICBvbGRDaGlsZC5kYXRhICYmXG4gICAgICAhaXNTYW1lQ2hpbGQoY2hpbGQsIG9sZENoaWxkKSAmJlxuICAgICAgIWlzQXN5bmNQbGFjZWhvbGRlcihvbGRDaGlsZCkgJiZcbiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlXG4gICAgICAhKG9sZENoaWxkLmNvbXBvbmVudEluc3RhbmNlICYmIG9sZENoaWxkLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpXG4gICAgKSB7XG4gICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmVcbiAgICAgIC8vIGltcG9ydGFudCBmb3IgZHluYW1pYyB0cmFuc2l0aW9ucyFcbiAgICAgIHZhciBvbGREYXRhID0gb2xkQ2hpbGQuZGF0YS50cmFuc2l0aW9uID0gZXh0ZW5kKHt9LCBkYXRhKTtcbiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGVcbiAgICAgIGlmIChtb2RlID09PSAnb3V0LWluJykge1xuICAgICAgICAvLyByZXR1cm4gcGxhY2Vob2xkZXIgbm9kZSBhbmQgcXVldWUgdXBkYXRlIHdoZW4gbGVhdmUgZmluaXNoZXNcbiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7XG4gICAgICAgIG1lcmdlVk5vZGVIb29rKG9sZERhdGEsICdhZnRlckxlYXZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMkMS5fbGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcihoLCByYXdDaGlsZClcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHtcbiAgICAgICAgaWYgKGlzQXN5bmNQbGFjZWhvbGRlcihjaGlsZCkpIHtcbiAgICAgICAgICByZXR1cm4gb2xkUmF3Q2hpbGRcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsYXllZExlYXZlO1xuICAgICAgICB2YXIgcGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gKCkgeyBkZWxheWVkTGVhdmUoKTsgfTtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhkYXRhLCAnZW50ZXJDYW5jZWxsZWQnLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhvbGREYXRhLCAnZGVsYXlMZWF2ZScsIGZ1bmN0aW9uIChsZWF2ZSkgeyBkZWxheWVkTGVhdmUgPSBsZWF2ZTsgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0NoaWxkXG4gIH1cbn07XG5cbi8qICAqL1xuXG52YXIgcHJvcHMgPSBleHRlbmQoe1xuICB0YWc6IFN0cmluZyxcbiAgbW92ZUNsYXNzOiBTdHJpbmdcbn0sIHRyYW5zaXRpb25Qcm9wcyk7XG5cbmRlbGV0ZSBwcm9wcy5tb2RlO1xuXG52YXIgVHJhbnNpdGlvbkdyb3VwID0ge1xuICBwcm9wczogcHJvcHMsXG5cbiAgYmVmb3JlTW91bnQ6IGZ1bmN0aW9uIGJlZm9yZU1vdW50ICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciB1cGRhdGUgPSB0aGlzLl91cGRhdGU7XG4gICAgdGhpcy5fdXBkYXRlID0gZnVuY3Rpb24gKHZub2RlLCBoeWRyYXRpbmcpIHtcbiAgICAgIHZhciByZXN0b3JlQWN0aXZlSW5zdGFuY2UgPSBzZXRBY3RpdmVJbnN0YW5jZSh0aGlzJDEpO1xuICAgICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzc1xuICAgICAgdGhpcyQxLl9fcGF0Y2hfXyhcbiAgICAgICAgdGhpcyQxLl92bm9kZSxcbiAgICAgICAgdGhpcyQxLmtlcHQsXG4gICAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmdcbiAgICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpXG4gICAgICApO1xuICAgICAgdGhpcyQxLl92bm9kZSA9IHRoaXMkMS5rZXB0O1xuICAgICAgcmVzdG9yZUFjdGl2ZUluc3RhbmNlKCk7XG4gICAgICB1cGRhdGUuY2FsbCh0aGlzJDEsIHZub2RlLCBoeWRyYXRpbmcpO1xuICAgIH07XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHtcbiAgICB2YXIgdGFnID0gdGhpcy50YWcgfHwgdGhpcy4kdm5vZGUuZGF0YS50YWcgfHwgJ3NwYW4nO1xuICAgIHZhciBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG4gICAgdmFyIHJhd0NoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdCB8fCBbXTtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTtcbiAgICAgIGlmIChjLnRhZykge1xuICAgICAgICBpZiAoYy5rZXkgIT0gbnVsbCAmJiBTdHJpbmcoYy5rZXkpLmluZGV4T2YoJ19fdmxpc3QnKSAhPT0gMCkge1xuICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7XG4gICAgICAgICAgbWFwW2Mua2V5XSA9IGNcbiAgICAgICAgICA7KGMuZGF0YSB8fCAoYy5kYXRhID0ge30pKS50cmFuc2l0aW9uID0gdHJhbnNpdGlvbkRhdGE7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHZhciBvcHRzID0gYy5jb21wb25lbnRPcHRpb25zO1xuICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnO1xuICAgICAgICAgIHdhcm4oKFwiPHRyYW5zaXRpb24tZ3JvdXA+IGNoaWxkcmVuIG11c3QgYmUga2V5ZWQ6IDxcIiArIG5hbWUgKyBcIj5cIikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIGtlcHQgPSBbXTtcbiAgICAgIHZhciByZW1vdmVkID0gW107XG4gICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBwcmV2Q2hpbGRyZW4ubGVuZ3RoOyBpJDErKykge1xuICAgICAgICB2YXIgYyQxID0gcHJldkNoaWxkcmVuW2kkMV07XG4gICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTtcbiAgICAgICAgYyQxLmRhdGEucG9zID0gYyQxLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKG1hcFtjJDEua2V5XSkge1xuICAgICAgICAgIGtlcHQucHVzaChjJDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92ZWQucHVzaChjJDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtlcHQgPSBoKHRhZywgbnVsbCwga2VwdCk7XG4gICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkO1xuICAgIH1cblxuICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pXG4gIH0sXG5cbiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcmV2Q2hpbGRyZW47XG4gICAgdmFyIG1vdmVDbGFzcyA9IHRoaXMubW92ZUNsYXNzIHx8ICgodGhpcy5uYW1lIHx8ICd2JykgKyAnLW1vdmUnKTtcbiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gd2UgZGl2aWRlIHRoZSB3b3JrIGludG8gdGhyZWUgbG9vcHMgdG8gYXZvaWQgbWl4aW5nIERPTSByZWFkcyBhbmQgd3JpdGVzXG4gICAgLy8gaW4gZWFjaCBpdGVyYXRpb24gLSB3aGljaCBoZWxwcyBwcmV2ZW50IGxheW91dCB0aHJhc2hpbmcuXG4gICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChyZWNvcmRQb3NpdGlvbik7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChhcHBseVRyYW5zbGF0aW9uKTtcblxuICAgIC8vIGZvcmNlIHJlZmxvdyB0byBwdXQgZXZlcnl0aGluZyBpbiBwb3NpdGlvblxuICAgIC8vIGFzc2lnbiB0byB0aGlzIHRvIGF2b2lkIGJlaW5nIHJlbW92ZWQgaW4gdHJlZS1zaGFraW5nXG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgdGhpcy5fcmVmbG93ID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7XG5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICBpZiAoYy5kYXRhLm1vdmVkKSB7XG4gICAgICAgIHZhciBlbCA9IGMuZWxtO1xuICAgICAgICB2YXIgcyA9IGVsLnN0eWxlO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7XG4gICAgICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSBzLnRyYW5zaXRpb25EdXJhdGlvbiA9ICcnO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7XG4gICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQgIT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFlIHx8IC90cmFuc2Zvcm0kLy50ZXN0KGUucHJvcGVydHlOYW1lKSkge1xuICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kRXZlbnQsIGNiKTtcbiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsO1xuICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFoYXNUcmFuc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodGhpcy5faGFzTW92ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzTW92ZVxuICAgICAgfVxuICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzXG4gICAgICAvLyBDU1MgdHJhbnNpdGlvbnMuIFNpbmNlIHRoZSBlbGVtZW50IG1heSBiZSBpbnNpZGUgYW4gZW50ZXJpbmdcbiAgICAgIC8vIHRyYW5zaXRpb24gYXQgdGhpcyB2ZXJ5IG1vbWVudCwgd2UgbWFrZSBhIGNsb25lIG9mIGl0IGFuZCByZW1vdmVcbiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzc1xuICAgICAgLy8gaXMgYXBwbGllZC5cbiAgICAgIHZhciBjbG9uZSA9IGVsLmNsb25lTm9kZSgpO1xuICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3Nlcykge1xuICAgICAgICBlbC5fdHJhbnNpdGlvbkNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xzKSB7IHJlbW92ZUNsYXNzKGNsb25lLCBjbHMpOyB9KTtcbiAgICAgIH1cbiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpO1xuICAgICAgY2xvbmUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuJGVsLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpO1xuICAgICAgdGhpcy4kZWwucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgcmV0dXJuICh0aGlzLl9oYXNNb3ZlID0gaW5mby5oYXNUcmFuc2Zvcm0pXG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjYWxsUGVuZGluZ0NicyAoYykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGMuZWxtLl9tb3ZlQ2IpIHtcbiAgICBjLmVsbS5fbW92ZUNiKCk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChjLmVsbS5fZW50ZXJDYikge1xuICAgIGMuZWxtLl9lbnRlckNiKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkUG9zaXRpb24gKGMpIHtcbiAgYy5kYXRhLm5ld1BvcyA9IGMuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufVxuXG5mdW5jdGlvbiBhcHBseVRyYW5zbGF0aW9uIChjKSB7XG4gIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zO1xuICB2YXIgbmV3UG9zID0gYy5kYXRhLm5ld1BvcztcbiAgdmFyIGR4ID0gb2xkUG9zLmxlZnQgLSBuZXdQb3MubGVmdDtcbiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7XG4gIGlmIChkeCB8fCBkeSkge1xuICAgIGMuZGF0YS5tb3ZlZCA9IHRydWU7XG4gICAgdmFyIHMgPSBjLmVsbS5zdHlsZTtcbiAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIgKyBkeCArIFwicHgsXCIgKyBkeSArIFwicHgpXCI7XG4gICAgcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnMHMnO1xuICB9XG59XG5cbnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7XG4gIFRyYW5zaXRpb246IFRyYW5zaXRpb24sXG4gIFRyYW5zaXRpb25Hcm91cDogVHJhbnNpdGlvbkdyb3VwXG59O1xuXG4vKiAgKi9cblxuLy8gaW5zdGFsbCBwbGF0Zm9ybSBzcGVjaWZpYyB1dGlsc1xuVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wO1xuVnVlLmNvbmZpZy5pc1Jlc2VydmVkVGFnID0gaXNSZXNlcnZlZFRhZztcblZ1ZS5jb25maWcuaXNSZXNlcnZlZEF0dHIgPSBpc1Jlc2VydmVkQXR0cjtcblZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlO1xuVnVlLmNvbmZpZy5pc1Vua25vd25FbGVtZW50ID0gaXNVbmtub3duRWxlbWVudDtcblxuLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzXG5leHRlbmQoVnVlLm9wdGlvbnMuZGlyZWN0aXZlcywgcGxhdGZvcm1EaXJlY3RpdmVzKTtcbmV4dGVuZChWdWUub3B0aW9ucy5jb21wb25lbnRzLCBwbGF0Zm9ybUNvbXBvbmVudHMpO1xuXG4vLyBpbnN0YWxsIHBsYXRmb3JtIHBhdGNoIGZ1bmN0aW9uXG5WdWUucHJvdG90eXBlLl9fcGF0Y2hfXyA9IGluQnJvd3NlciA/IHBhdGNoIDogbm9vcDtcblxuLy8gcHVibGljIG1vdW50IG1ldGhvZFxuVnVlLnByb3RvdHlwZS4kbW91bnQgPSBmdW5jdGlvbiAoXG4gIGVsLFxuICBoeWRyYXRpbmdcbikge1xuICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1vdW50Q29tcG9uZW50KHRoaXMsIGVsLCBoeWRyYXRpbmcpXG59O1xuXG4vLyBkZXZ0b29scyBnbG9iYWwgaG9va1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpbkJyb3dzZXIpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNvbmZpZy5kZXZ0b29scykge1xuICAgICAgaWYgKGRldnRvb2xzKSB7XG4gICAgICAgIGRldnRvb2xzLmVtaXQoJ2luaXQnLCBWdWUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oXG4gICAgICAgICAgJ0Rvd25sb2FkIHRoZSBWdWUgRGV2dG9vbHMgZXh0ZW5zaW9uIGZvciBhIGJldHRlciBkZXZlbG9wbWVudCBleHBlcmllbmNlOlxcbicgK1xuICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyAmJlxuICAgICAgY29uZmlnLnByb2R1Y3Rpb25UaXAgIT09IGZhbHNlICYmXG4gICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICApIHtcbiAgICAgIGNvbnNvbGVbY29uc29sZS5pbmZvID8gJ2luZm8nIDogJ2xvZyddKFxuICAgICAgICBcIllvdSBhcmUgcnVubmluZyBWdWUgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cXG5cIiArXG4gICAgICAgIFwiTWFrZSBzdXJlIHRvIHR1cm4gb24gcHJvZHVjdGlvbiBtb2RlIHdoZW4gZGVwbG95aW5nIGZvciBwcm9kdWN0aW9uLlxcblwiICtcbiAgICAgICAgXCJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbFwiXG4gICAgICApO1xuICAgIH1cbiAgfSwgMCk7XG59XG5cbi8qICAqL1xuXG5leHBvcnQgZGVmYXVsdCBWdWU7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\n");

/***/ }),

/***/ "./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js":
/*!********************************************************!*\
  !*** ./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js ***!
  \********************************************************/
/*! exports provided: default, Store, install, mapState, mapMutations, mapGetters, mapActions, createNamespacedHelpers */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Store\", function() { return Store; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"install\", function() { return install; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapState\", function() { return mapState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapMutations\", function() { return mapMutations; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapGetters\", function() { return mapGetters; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapActions\", function() { return mapActions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createNamespacedHelpers\", function() { return createNamespacedHelpers; });\n/**\n * vuex v3.1.1\n * (c) 2019 Evan You\n * @license MIT\n */\nfunction applyMixin (Vue) {\n  var version = Number(Vue.version.split('.')[0]);\n\n  if (version >= 2) {\n    Vue.mixin({ beforeCreate: vuexInit });\n  } else {\n    // override init and inject vuex init procedure\n    // for 1.x backwards compatibility.\n    var _init = Vue.prototype._init;\n    Vue.prototype._init = function (options) {\n      if ( options === void 0 ) options = {};\n\n      options.init = options.init\n        ? [vuexInit].concat(options.init)\n        : vuexInit;\n      _init.call(this, options);\n    };\n  }\n\n  /**\n   * Vuex init hook, injected into each instances init hooks list.\n   */\n\n  function vuexInit () {\n    var options = this.$options;\n    // store injection\n    if (options.store) {\n      this.$store = typeof options.store === 'function'\n        ? options.store()\n        : options.store;\n    } else if (options.parent && options.parent.$store) {\n      this.$store = options.parent.$store;\n    }\n  }\n}\n\nvar target = typeof window !== 'undefined'\n  ? window\n  : typeof global !== 'undefined'\n    ? global\n    : {};\nvar devtoolHook = target.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\nfunction devtoolPlugin (store) {\n  if (!devtoolHook) { return }\n\n  store._devtoolHook = devtoolHook;\n\n  devtoolHook.emit('vuex:init', store);\n\n  devtoolHook.on('vuex:travel-to-state', function (targetState) {\n    store.replaceState(targetState);\n  });\n\n  store.subscribe(function (mutation, state) {\n    devtoolHook.emit('vuex:mutation', mutation, state);\n  });\n}\n\n/**\n * Get the first item that pass the test\n * by second argument function\n *\n * @param {Array} list\n * @param {Function} f\n * @return {*}\n */\n\n/**\n * forEach for object\n */\nfunction forEachValue (obj, fn) {\n  Object.keys(obj).forEach(function (key) { return fn(obj[key], key); });\n}\n\nfunction isObject (obj) {\n  return obj !== null && typeof obj === 'object'\n}\n\nfunction isPromise (val) {\n  return val && typeof val.then === 'function'\n}\n\nfunction assert (condition, msg) {\n  if (!condition) { throw new Error((\"[vuex] \" + msg)) }\n}\n\nfunction partial (fn, arg) {\n  return function () {\n    return fn(arg)\n  }\n}\n\n// Base data struct for store's module, package with some attribute and method\nvar Module = function Module (rawModule, runtime) {\n  this.runtime = runtime;\n  // Store some children item\n  this._children = Object.create(null);\n  // Store the origin module object which passed by programmer\n  this._rawModule = rawModule;\n  var rawState = rawModule.state;\n\n  // Store the origin module's state\n  this.state = (typeof rawState === 'function' ? rawState() : rawState) || {};\n};\n\nvar prototypeAccessors = { namespaced: { configurable: true } };\n\nprototypeAccessors.namespaced.get = function () {\n  return !!this._rawModule.namespaced\n};\n\nModule.prototype.addChild = function addChild (key, module) {\n  this._children[key] = module;\n};\n\nModule.prototype.removeChild = function removeChild (key) {\n  delete this._children[key];\n};\n\nModule.prototype.getChild = function getChild (key) {\n  return this._children[key]\n};\n\nModule.prototype.update = function update (rawModule) {\n  this._rawModule.namespaced = rawModule.namespaced;\n  if (rawModule.actions) {\n    this._rawModule.actions = rawModule.actions;\n  }\n  if (rawModule.mutations) {\n    this._rawModule.mutations = rawModule.mutations;\n  }\n  if (rawModule.getters) {\n    this._rawModule.getters = rawModule.getters;\n  }\n};\n\nModule.prototype.forEachChild = function forEachChild (fn) {\n  forEachValue(this._children, fn);\n};\n\nModule.prototype.forEachGetter = function forEachGetter (fn) {\n  if (this._rawModule.getters) {\n    forEachValue(this._rawModule.getters, fn);\n  }\n};\n\nModule.prototype.forEachAction = function forEachAction (fn) {\n  if (this._rawModule.actions) {\n    forEachValue(this._rawModule.actions, fn);\n  }\n};\n\nModule.prototype.forEachMutation = function forEachMutation (fn) {\n  if (this._rawModule.mutations) {\n    forEachValue(this._rawModule.mutations, fn);\n  }\n};\n\nObject.defineProperties( Module.prototype, prototypeAccessors );\n\nvar ModuleCollection = function ModuleCollection (rawRootModule) {\n  // register root module (Vuex.Store options)\n  this.register([], rawRootModule, false);\n};\n\nModuleCollection.prototype.get = function get (path) {\n  return path.reduce(function (module, key) {\n    return module.getChild(key)\n  }, this.root)\n};\n\nModuleCollection.prototype.getNamespace = function getNamespace (path) {\n  var module = this.root;\n  return path.reduce(function (namespace, key) {\n    module = module.getChild(key);\n    return namespace + (module.namespaced ? key + '/' : '')\n  }, '')\n};\n\nModuleCollection.prototype.update = function update$1 (rawRootModule) {\n  update([], this.root, rawRootModule);\n};\n\nModuleCollection.prototype.register = function register (path, rawModule, runtime) {\n    var this$1 = this;\n    if ( runtime === void 0 ) runtime = true;\n\n  if (true) {\n    assertRawModule(path, rawModule);\n  }\n\n  var newModule = new Module(rawModule, runtime);\n  if (path.length === 0) {\n    this.root = newModule;\n  } else {\n    var parent = this.get(path.slice(0, -1));\n    parent.addChild(path[path.length - 1], newModule);\n  }\n\n  // register nested modules\n  if (rawModule.modules) {\n    forEachValue(rawModule.modules, function (rawChildModule, key) {\n      this$1.register(path.concat(key), rawChildModule, runtime);\n    });\n  }\n};\n\nModuleCollection.prototype.unregister = function unregister (path) {\n  var parent = this.get(path.slice(0, -1));\n  var key = path[path.length - 1];\n  if (!parent.getChild(key).runtime) { return }\n\n  parent.removeChild(key);\n};\n\nfunction update (path, targetModule, newModule) {\n  if (true) {\n    assertRawModule(path, newModule);\n  }\n\n  // update target module\n  targetModule.update(newModule);\n\n  // update nested modules\n  if (newModule.modules) {\n    for (var key in newModule.modules) {\n      if (!targetModule.getChild(key)) {\n        if (true) {\n          console.warn(\n            \"[vuex] trying to add a new module '\" + key + \"' on hot reloading, \" +\n            'manual reload is needed'\n          );\n        }\n        return\n      }\n      update(\n        path.concat(key),\n        targetModule.getChild(key),\n        newModule.modules[key]\n      );\n    }\n  }\n}\n\nvar functionAssert = {\n  assert: function (value) { return typeof value === 'function'; },\n  expected: 'function'\n};\n\nvar objectAssert = {\n  assert: function (value) { return typeof value === 'function' ||\n    (typeof value === 'object' && typeof value.handler === 'function'); },\n  expected: 'function or object with \"handler\" function'\n};\n\nvar assertTypes = {\n  getters: functionAssert,\n  mutations: functionAssert,\n  actions: objectAssert\n};\n\nfunction assertRawModule (path, rawModule) {\n  Object.keys(assertTypes).forEach(function (key) {\n    if (!rawModule[key]) { return }\n\n    var assertOptions = assertTypes[key];\n\n    forEachValue(rawModule[key], function (value, type) {\n      assert(\n        assertOptions.assert(value),\n        makeAssertionMessage(path, key, type, value, assertOptions.expected)\n      );\n    });\n  });\n}\n\nfunction makeAssertionMessage (path, key, type, value, expected) {\n  var buf = key + \" should be \" + expected + \" but \\\"\" + key + \".\" + type + \"\\\"\";\n  if (path.length > 0) {\n    buf += \" in module \\\"\" + (path.join('.')) + \"\\\"\";\n  }\n  buf += \" is \" + (JSON.stringify(value)) + \".\";\n  return buf\n}\n\nvar Vue; // bind on install\n\nvar Store = function Store (options) {\n  var this$1 = this;\n  if ( options === void 0 ) options = {};\n\n  // Auto install if it is not done yet and `window` has `Vue`.\n  // To allow users to avoid auto-installation in some cases,\n  // this code should be placed here. See #731\n  if (!Vue && typeof window !== 'undefined' && window.Vue) {\n    install(window.Vue);\n  }\n\n  if (true) {\n    assert(Vue, \"must call Vue.use(Vuex) before creating a store instance.\");\n    assert(typeof Promise !== 'undefined', \"vuex requires a Promise polyfill in this browser.\");\n    assert(this instanceof Store, \"store must be called with the new operator.\");\n  }\n\n  var plugins = options.plugins; if ( plugins === void 0 ) plugins = [];\n  var strict = options.strict; if ( strict === void 0 ) strict = false;\n\n  // store internal state\n  this._committing = false;\n  this._actions = Object.create(null);\n  this._actionSubscribers = [];\n  this._mutations = Object.create(null);\n  this._wrappedGetters = Object.create(null);\n  this._modules = new ModuleCollection(options);\n  this._modulesNamespaceMap = Object.create(null);\n  this._subscribers = [];\n  this._watcherVM = new Vue();\n\n  // bind commit and dispatch to self\n  var store = this;\n  var ref = this;\n  var dispatch = ref.dispatch;\n  var commit = ref.commit;\n  this.dispatch = function boundDispatch (type, payload) {\n    return dispatch.call(store, type, payload)\n  };\n  this.commit = function boundCommit (type, payload, options) {\n    return commit.call(store, type, payload, options)\n  };\n\n  // strict mode\n  this.strict = strict;\n\n  var state = this._modules.root.state;\n\n  // init root module.\n  // this also recursively registers all sub-modules\n  // and collects all module getters inside this._wrappedGetters\n  installModule(this, state, [], this._modules.root);\n\n  // initialize the store vm, which is responsible for the reactivity\n  // (also registers _wrappedGetters as computed properties)\n  resetStoreVM(this, state);\n\n  // apply plugins\n  plugins.forEach(function (plugin) { return plugin(this$1); });\n\n  var useDevtools = options.devtools !== undefined ? options.devtools : Vue.config.devtools;\n  if (useDevtools) {\n    devtoolPlugin(this);\n  }\n};\n\nvar prototypeAccessors$1 = { state: { configurable: true } };\n\nprototypeAccessors$1.state.get = function () {\n  return this._vm._data.$$state\n};\n\nprototypeAccessors$1.state.set = function (v) {\n  if (true) {\n    assert(false, \"use store.replaceState() to explicit replace store state.\");\n  }\n};\n\nStore.prototype.commit = function commit (_type, _payload, _options) {\n    var this$1 = this;\n\n  // check object-style commit\n  var ref = unifyObjectStyle(_type, _payload, _options);\n    var type = ref.type;\n    var payload = ref.payload;\n    var options = ref.options;\n\n  var mutation = { type: type, payload: payload };\n  var entry = this._mutations[type];\n  if (!entry) {\n    if (true) {\n      console.error((\"[vuex] unknown mutation type: \" + type));\n    }\n    return\n  }\n  this._withCommit(function () {\n    entry.forEach(function commitIterator (handler) {\n      handler(payload);\n    });\n  });\n  this._subscribers.forEach(function (sub) { return sub(mutation, this$1.state); });\n\n  if (\n     true &&\n    options && options.silent\n  ) {\n    console.warn(\n      \"[vuex] mutation type: \" + type + \". Silent option has been removed. \" +\n      'Use the filter functionality in the vue-devtools'\n    );\n  }\n};\n\nStore.prototype.dispatch = function dispatch (_type, _payload) {\n    var this$1 = this;\n\n  // check object-style dispatch\n  var ref = unifyObjectStyle(_type, _payload);\n    var type = ref.type;\n    var payload = ref.payload;\n\n  var action = { type: type, payload: payload };\n  var entry = this._actions[type];\n  if (!entry) {\n    if (true) {\n      console.error((\"[vuex] unknown action type: \" + type));\n    }\n    return\n  }\n\n  try {\n    this._actionSubscribers\n      .filter(function (sub) { return sub.before; })\n      .forEach(function (sub) { return sub.before(action, this$1.state); });\n  } catch (e) {\n    if (true) {\n      console.warn(\"[vuex] error in before action subscribers: \");\n      console.error(e);\n    }\n  }\n\n  var result = entry.length > 1\n    ? Promise.all(entry.map(function (handler) { return handler(payload); }))\n    : entry[0](payload);\n\n  return result.then(function (res) {\n    try {\n      this$1._actionSubscribers\n        .filter(function (sub) { return sub.after; })\n        .forEach(function (sub) { return sub.after(action, this$1.state); });\n    } catch (e) {\n      if (true) {\n        console.warn(\"[vuex] error in after action subscribers: \");\n        console.error(e);\n      }\n    }\n    return res\n  })\n};\n\nStore.prototype.subscribe = function subscribe (fn) {\n  return genericSubscribe(fn, this._subscribers)\n};\n\nStore.prototype.subscribeAction = function subscribeAction (fn) {\n  var subs = typeof fn === 'function' ? { before: fn } : fn;\n  return genericSubscribe(subs, this._actionSubscribers)\n};\n\nStore.prototype.watch = function watch (getter, cb, options) {\n    var this$1 = this;\n\n  if (true) {\n    assert(typeof getter === 'function', \"store.watch only accepts a function.\");\n  }\n  return this._watcherVM.$watch(function () { return getter(this$1.state, this$1.getters); }, cb, options)\n};\n\nStore.prototype.replaceState = function replaceState (state) {\n    var this$1 = this;\n\n  this._withCommit(function () {\n    this$1._vm._data.$$state = state;\n  });\n};\n\nStore.prototype.registerModule = function registerModule (path, rawModule, options) {\n    if ( options === void 0 ) options = {};\n\n  if (typeof path === 'string') { path = [path]; }\n\n  if (true) {\n    assert(Array.isArray(path), \"module path must be a string or an Array.\");\n    assert(path.length > 0, 'cannot register the root module by using registerModule.');\n  }\n\n  this._modules.register(path, rawModule);\n  installModule(this, this.state, path, this._modules.get(path), options.preserveState);\n  // reset store to update getters...\n  resetStoreVM(this, this.state);\n};\n\nStore.prototype.unregisterModule = function unregisterModule (path) {\n    var this$1 = this;\n\n  if (typeof path === 'string') { path = [path]; }\n\n  if (true) {\n    assert(Array.isArray(path), \"module path must be a string or an Array.\");\n  }\n\n  this._modules.unregister(path);\n  this._withCommit(function () {\n    var parentState = getNestedState(this$1.state, path.slice(0, -1));\n    Vue.delete(parentState, path[path.length - 1]);\n  });\n  resetStore(this);\n};\n\nStore.prototype.hotUpdate = function hotUpdate (newOptions) {\n  this._modules.update(newOptions);\n  resetStore(this, true);\n};\n\nStore.prototype._withCommit = function _withCommit (fn) {\n  var committing = this._committing;\n  this._committing = true;\n  fn();\n  this._committing = committing;\n};\n\nObject.defineProperties( Store.prototype, prototypeAccessors$1 );\n\nfunction genericSubscribe (fn, subs) {\n  if (subs.indexOf(fn) < 0) {\n    subs.push(fn);\n  }\n  return function () {\n    var i = subs.indexOf(fn);\n    if (i > -1) {\n      subs.splice(i, 1);\n    }\n  }\n}\n\nfunction resetStore (store, hot) {\n  store._actions = Object.create(null);\n  store._mutations = Object.create(null);\n  store._wrappedGetters = Object.create(null);\n  store._modulesNamespaceMap = Object.create(null);\n  var state = store.state;\n  // init all modules\n  installModule(store, state, [], store._modules.root, true);\n  // reset vm\n  resetStoreVM(store, state, hot);\n}\n\nfunction resetStoreVM (store, state, hot) {\n  var oldVm = store._vm;\n\n  // bind store public getters\n  store.getters = {};\n  var wrappedGetters = store._wrappedGetters;\n  var computed = {};\n  forEachValue(wrappedGetters, function (fn, key) {\n    // use computed to leverage its lazy-caching mechanism\n    // direct inline function use will lead to closure preserving oldVm.\n    // using partial to return function with only arguments preserved in closure enviroment.\n    computed[key] = partial(fn, store);\n    Object.defineProperty(store.getters, key, {\n      get: function () { return store._vm[key]; },\n      enumerable: true // for local getters\n    });\n  });\n\n  // use a Vue instance to store the state tree\n  // suppress warnings just in case the user has added\n  // some funky global mixins\n  var silent = Vue.config.silent;\n  Vue.config.silent = true;\n  store._vm = new Vue({\n    data: {\n      $$state: state\n    },\n    computed: computed\n  });\n  Vue.config.silent = silent;\n\n  // enable strict mode for new vm\n  if (store.strict) {\n    enableStrictMode(store);\n  }\n\n  if (oldVm) {\n    if (hot) {\n      // dispatch changes in all subscribed watchers\n      // to force getter re-evaluation for hot reloading.\n      store._withCommit(function () {\n        oldVm._data.$$state = null;\n      });\n    }\n    Vue.nextTick(function () { return oldVm.$destroy(); });\n  }\n}\n\nfunction installModule (store, rootState, path, module, hot) {\n  var isRoot = !path.length;\n  var namespace = store._modules.getNamespace(path);\n\n  // register in namespace map\n  if (module.namespaced) {\n    store._modulesNamespaceMap[namespace] = module;\n  }\n\n  // set state\n  if (!isRoot && !hot) {\n    var parentState = getNestedState(rootState, path.slice(0, -1));\n    var moduleName = path[path.length - 1];\n    store._withCommit(function () {\n      Vue.set(parentState, moduleName, module.state);\n    });\n  }\n\n  var local = module.context = makeLocalContext(store, namespace, path);\n\n  module.forEachMutation(function (mutation, key) {\n    var namespacedType = namespace + key;\n    registerMutation(store, namespacedType, mutation, local);\n  });\n\n  module.forEachAction(function (action, key) {\n    var type = action.root ? key : namespace + key;\n    var handler = action.handler || action;\n    registerAction(store, type, handler, local);\n  });\n\n  module.forEachGetter(function (getter, key) {\n    var namespacedType = namespace + key;\n    registerGetter(store, namespacedType, getter, local);\n  });\n\n  module.forEachChild(function (child, key) {\n    installModule(store, rootState, path.concat(key), child, hot);\n  });\n}\n\n/**\n * make localized dispatch, commit, getters and state\n * if there is no namespace, just use root ones\n */\nfunction makeLocalContext (store, namespace, path) {\n  var noNamespace = namespace === '';\n\n  var local = {\n    dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) {\n      var args = unifyObjectStyle(_type, _payload, _options);\n      var payload = args.payload;\n      var options = args.options;\n      var type = args.type;\n\n      if (!options || !options.root) {\n        type = namespace + type;\n        if ( true && !store._actions[type]) {\n          console.error((\"[vuex] unknown local action type: \" + (args.type) + \", global type: \" + type));\n          return\n        }\n      }\n\n      return store.dispatch(type, payload)\n    },\n\n    commit: noNamespace ? store.commit : function (_type, _payload, _options) {\n      var args = unifyObjectStyle(_type, _payload, _options);\n      var payload = args.payload;\n      var options = args.options;\n      var type = args.type;\n\n      if (!options || !options.root) {\n        type = namespace + type;\n        if ( true && !store._mutations[type]) {\n          console.error((\"[vuex] unknown local mutation type: \" + (args.type) + \", global type: \" + type));\n          return\n        }\n      }\n\n      store.commit(type, payload, options);\n    }\n  };\n\n  // getters and state object must be gotten lazily\n  // because they will be changed by vm update\n  Object.defineProperties(local, {\n    getters: {\n      get: noNamespace\n        ? function () { return store.getters; }\n        : function () { return makeLocalGetters(store, namespace); }\n    },\n    state: {\n      get: function () { return getNestedState(store.state, path); }\n    }\n  });\n\n  return local\n}\n\nfunction makeLocalGetters (store, namespace) {\n  var gettersProxy = {};\n\n  var splitPos = namespace.length;\n  Object.keys(store.getters).forEach(function (type) {\n    // skip if the target getter is not match this namespace\n    if (type.slice(0, splitPos) !== namespace) { return }\n\n    // extract local getter type\n    var localType = type.slice(splitPos);\n\n    // Add a port to the getters proxy.\n    // Define as getter property because\n    // we do not want to evaluate the getters in this time.\n    Object.defineProperty(gettersProxy, localType, {\n      get: function () { return store.getters[type]; },\n      enumerable: true\n    });\n  });\n\n  return gettersProxy\n}\n\nfunction registerMutation (store, type, handler, local) {\n  var entry = store._mutations[type] || (store._mutations[type] = []);\n  entry.push(function wrappedMutationHandler (payload) {\n    handler.call(store, local.state, payload);\n  });\n}\n\nfunction registerAction (store, type, handler, local) {\n  var entry = store._actions[type] || (store._actions[type] = []);\n  entry.push(function wrappedActionHandler (payload, cb) {\n    var res = handler.call(store, {\n      dispatch: local.dispatch,\n      commit: local.commit,\n      getters: local.getters,\n      state: local.state,\n      rootGetters: store.getters,\n      rootState: store.state\n    }, payload, cb);\n    if (!isPromise(res)) {\n      res = Promise.resolve(res);\n    }\n    if (store._devtoolHook) {\n      return res.catch(function (err) {\n        store._devtoolHook.emit('vuex:error', err);\n        throw err\n      })\n    } else {\n      return res\n    }\n  });\n}\n\nfunction registerGetter (store, type, rawGetter, local) {\n  if (store._wrappedGetters[type]) {\n    if (true) {\n      console.error((\"[vuex] duplicate getter key: \" + type));\n    }\n    return\n  }\n  store._wrappedGetters[type] = function wrappedGetter (store) {\n    return rawGetter(\n      local.state, // local state\n      local.getters, // local getters\n      store.state, // root state\n      store.getters // root getters\n    )\n  };\n}\n\nfunction enableStrictMode (store) {\n  store._vm.$watch(function () { return this._data.$$state }, function () {\n    if (true) {\n      assert(store._committing, \"do not mutate vuex store state outside mutation handlers.\");\n    }\n  }, { deep: true, sync: true });\n}\n\nfunction getNestedState (state, path) {\n  return path.length\n    ? path.reduce(function (state, key) { return state[key]; }, state)\n    : state\n}\n\nfunction unifyObjectStyle (type, payload, options) {\n  if (isObject(type) && type.type) {\n    options = payload;\n    payload = type;\n    type = type.type;\n  }\n\n  if (true) {\n    assert(typeof type === 'string', (\"expects string as the type, but found \" + (typeof type) + \".\"));\n  }\n\n  return { type: type, payload: payload, options: options }\n}\n\nfunction install (_Vue) {\n  if (Vue && _Vue === Vue) {\n    if (true) {\n      console.error(\n        '[vuex] already installed. Vue.use(Vuex) should be called only once.'\n      );\n    }\n    return\n  }\n  Vue = _Vue;\n  applyMixin(Vue);\n}\n\n/**\n * Reduce the code which written in Vue.js for getting the state.\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} states # Object's item can be a function which accept state and getters for param, you can do something for state and getters in it.\n * @param {Object}\n */\nvar mapState = normalizeNamespace(function (namespace, states) {\n  var res = {};\n  normalizeMap(states).forEach(function (ref) {\n    var key = ref.key;\n    var val = ref.val;\n\n    res[key] = function mappedState () {\n      var state = this.$store.state;\n      var getters = this.$store.getters;\n      if (namespace) {\n        var module = getModuleByNamespace(this.$store, 'mapState', namespace);\n        if (!module) {\n          return\n        }\n        state = module.context.state;\n        getters = module.context.getters;\n      }\n      return typeof val === 'function'\n        ? val.call(this, state, getters)\n        : state[val]\n    };\n    // mark vuex getter for devtools\n    res[key].vuex = true;\n  });\n  return res\n});\n\n/**\n * Reduce the code which written in Vue.js for committing the mutation\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} mutations # Object's item can be a function which accept `commit` function as the first param, it can accept anthor params. You can commit mutation and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapMutations = normalizeNamespace(function (namespace, mutations) {\n  var res = {};\n  normalizeMap(mutations).forEach(function (ref) {\n    var key = ref.key;\n    var val = ref.val;\n\n    res[key] = function mappedMutation () {\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n\n      // Get the commit method from store\n      var commit = this.$store.commit;\n      if (namespace) {\n        var module = getModuleByNamespace(this.$store, 'mapMutations', namespace);\n        if (!module) {\n          return\n        }\n        commit = module.context.commit;\n      }\n      return typeof val === 'function'\n        ? val.apply(this, [commit].concat(args))\n        : commit.apply(this.$store, [val].concat(args))\n    };\n  });\n  return res\n});\n\n/**\n * Reduce the code which written in Vue.js for getting the getters\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} getters\n * @return {Object}\n */\nvar mapGetters = normalizeNamespace(function (namespace, getters) {\n  var res = {};\n  normalizeMap(getters).forEach(function (ref) {\n    var key = ref.key;\n    var val = ref.val;\n\n    // The namespace has been mutated by normalizeNamespace\n    val = namespace + val;\n    res[key] = function mappedGetter () {\n      if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) {\n        return\n      }\n      if ( true && !(val in this.$store.getters)) {\n        console.error((\"[vuex] unknown getter: \" + val));\n        return\n      }\n      return this.$store.getters[val]\n    };\n    // mark vuex getter for devtools\n    res[key].vuex = true;\n  });\n  return res\n});\n\n/**\n * Reduce the code which written in Vue.js for dispatch the action\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} actions # Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params. You can dispatch action and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapActions = normalizeNamespace(function (namespace, actions) {\n  var res = {};\n  normalizeMap(actions).forEach(function (ref) {\n    var key = ref.key;\n    var val = ref.val;\n\n    res[key] = function mappedAction () {\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n\n      // get dispatch function from store\n      var dispatch = this.$store.dispatch;\n      if (namespace) {\n        var module = getModuleByNamespace(this.$store, 'mapActions', namespace);\n        if (!module) {\n          return\n        }\n        dispatch = module.context.dispatch;\n      }\n      return typeof val === 'function'\n        ? val.apply(this, [dispatch].concat(args))\n        : dispatch.apply(this.$store, [val].concat(args))\n    };\n  });\n  return res\n});\n\n/**\n * Rebinding namespace param for mapXXX function in special scoped, and return them by simple object\n * @param {String} namespace\n * @return {Object}\n */\nvar createNamespacedHelpers = function (namespace) { return ({\n  mapState: mapState.bind(null, namespace),\n  mapGetters: mapGetters.bind(null, namespace),\n  mapMutations: mapMutations.bind(null, namespace),\n  mapActions: mapActions.bind(null, namespace)\n}); };\n\n/**\n * Normalize the map\n * normalizeMap([1, 2, 3]) => [ { key: 1, val: 1 }, { key: 2, val: 2 }, { key: 3, val: 3 } ]\n * normalizeMap({a: 1, b: 2, c: 3}) => [ { key: 'a', val: 1 }, { key: 'b', val: 2 }, { key: 'c', val: 3 } ]\n * @param {Array|Object} map\n * @return {Object}\n */\nfunction normalizeMap (map) {\n  return Array.isArray(map)\n    ? map.map(function (key) { return ({ key: key, val: key }); })\n    : Object.keys(map).map(function (key) { return ({ key: key, val: map[key] }); })\n}\n\n/**\n * Return a function expect two param contains namespace and map. it will normalize the namespace and then the param's function will handle the new namespace and the map.\n * @param {Function} fn\n * @return {Function}\n */\nfunction normalizeNamespace (fn) {\n  return function (namespace, map) {\n    if (typeof namespace !== 'string') {\n      map = namespace;\n      namespace = '';\n    } else if (namespace.charAt(namespace.length - 1) !== '/') {\n      namespace += '/';\n    }\n    return fn(namespace, map)\n  }\n}\n\n/**\n * Search a special module from store by namespace. if module not exist, print error message.\n * @param {Object} store\n * @param {String} helper\n * @param {String} namespace\n * @return {Object}\n */\nfunction getModuleByNamespace (store, helper, namespace) {\n  var module = store._modulesNamespaceMap[namespace];\n  if ( true && !module) {\n    console.error((\"[vuex] module namespace not found in \" + helper + \"(): \" + namespace));\n  }\n  return module\n}\n\nvar index_esm = {\n  Store: Store,\n  install: install,\n  version: '3.1.1',\n  mapState: mapState,\n  mapMutations: mapMutations,\n  mapGetters: mapGetters,\n  mapActions: mapActions,\n  createNamespacedHelpers: createNamespacedHelpers\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (index_esm);\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../_webpack@4.41.2@webpack/buildin/global.js */ \"./node_modules/_webpack@4.41.2@webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3Z1ZXhAMy4xLjFAdnVleC9kaXN0L3Z1ZXguZXNtLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL192dWV4QDMuMS4xQHZ1ZXgvZGlzdC92dWV4LmVzbS5qcz81OTFhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdnVleCB2My4xLjFcbiAqIChjKSAyMDE5IEV2YW4gWW91XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuZnVuY3Rpb24gYXBwbHlNaXhpbiAoVnVlKSB7XG4gIHZhciB2ZXJzaW9uID0gTnVtYmVyKFZ1ZS52ZXJzaW9uLnNwbGl0KCcuJylbMF0pO1xuXG4gIGlmICh2ZXJzaW9uID49IDIpIHtcbiAgICBWdWUubWl4aW4oeyBiZWZvcmVDcmVhdGU6IHZ1ZXhJbml0IH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG92ZXJyaWRlIGluaXQgYW5kIGluamVjdCB2dWV4IGluaXQgcHJvY2VkdXJlXG4gICAgLy8gZm9yIDEueCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICB2YXIgX2luaXQgPSBWdWUucHJvdG90eXBlLl9pbml0O1xuICAgIFZ1ZS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgICAgIG9wdGlvbnMuaW5pdCA9IG9wdGlvbnMuaW5pdFxuICAgICAgICA/IFt2dWV4SW5pdF0uY29uY2F0KG9wdGlvbnMuaW5pdClcbiAgICAgICAgOiB2dWV4SW5pdDtcbiAgICAgIF9pbml0LmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWdWV4IGluaXQgaG9vaywgaW5qZWN0ZWQgaW50byBlYWNoIGluc3RhbmNlcyBpbml0IGhvb2tzIGxpc3QuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHZ1ZXhJbml0ICgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7XG4gICAgLy8gc3RvcmUgaW5qZWN0aW9uXG4gICAgaWYgKG9wdGlvbnMuc3RvcmUpIHtcbiAgICAgIHRoaXMuJHN0b3JlID0gdHlwZW9mIG9wdGlvbnMuc3RvcmUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBvcHRpb25zLnN0b3JlKClcbiAgICAgICAgOiBvcHRpb25zLnN0b3JlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wYXJlbnQgJiYgb3B0aW9ucy5wYXJlbnQuJHN0b3JlKSB7XG4gICAgICB0aGlzLiRzdG9yZSA9IG9wdGlvbnMucGFyZW50LiRzdG9yZTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHRhcmdldCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gID8gd2luZG93XG4gIDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IGdsb2JhbFxuICAgIDoge307XG52YXIgZGV2dG9vbEhvb2sgPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuZnVuY3Rpb24gZGV2dG9vbFBsdWdpbiAoc3RvcmUpIHtcbiAgaWYgKCFkZXZ0b29sSG9vaykgeyByZXR1cm4gfVxuXG4gIHN0b3JlLl9kZXZ0b29sSG9vayA9IGRldnRvb2xIb29rO1xuXG4gIGRldnRvb2xIb29rLmVtaXQoJ3Z1ZXg6aW5pdCcsIHN0b3JlKTtcblxuICBkZXZ0b29sSG9vay5vbigndnVleDp0cmF2ZWwtdG8tc3RhdGUnLCBmdW5jdGlvbiAodGFyZ2V0U3RhdGUpIHtcbiAgICBzdG9yZS5yZXBsYWNlU3RhdGUodGFyZ2V0U3RhdGUpO1xuICB9KTtcblxuICBzdG9yZS5zdWJzY3JpYmUoZnVuY3Rpb24gKG11dGF0aW9uLCBzdGF0ZSkge1xuICAgIGRldnRvb2xIb29rLmVtaXQoJ3Z1ZXg6bXV0YXRpb24nLCBtdXRhdGlvbiwgc3RhdGUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBwYXNzIHRoZSB0ZXN0XG4gKiBieSBzZWNvbmQgYXJndW1lbnQgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmXG4gKiBAcmV0dXJuIHsqfVxuICovXG5cbi8qKlxuICogZm9yRWFjaCBmb3Igb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hWYWx1ZSAob2JqLCBmbikge1xuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gZm4ob2JqW2tleV0sIGtleSk7IH0pO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdCAob2JqKSB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAmJiB0eXBlb2YgdmFsLnRoZW4gPT09ICdmdW5jdGlvbidcbn1cblxuZnVuY3Rpb24gYXNzZXJ0IChjb25kaXRpb24sIG1zZykge1xuICBpZiAoIWNvbmRpdGlvbikgeyB0aHJvdyBuZXcgRXJyb3IoKFwiW3Z1ZXhdIFwiICsgbXNnKSkgfVxufVxuXG5mdW5jdGlvbiBwYXJ0aWFsIChmbiwgYXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZuKGFyZylcbiAgfVxufVxuXG4vLyBCYXNlIGRhdGEgc3RydWN0IGZvciBzdG9yZSdzIG1vZHVsZSwgcGFja2FnZSB3aXRoIHNvbWUgYXR0cmlidXRlIGFuZCBtZXRob2RcbnZhciBNb2R1bGUgPSBmdW5jdGlvbiBNb2R1bGUgKHJhd01vZHVsZSwgcnVudGltZSkge1xuICB0aGlzLnJ1bnRpbWUgPSBydW50aW1lO1xuICAvLyBTdG9yZSBzb21lIGNoaWxkcmVuIGl0ZW1cbiAgdGhpcy5fY2hpbGRyZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyBTdG9yZSB0aGUgb3JpZ2luIG1vZHVsZSBvYmplY3Qgd2hpY2ggcGFzc2VkIGJ5IHByb2dyYW1tZXJcbiAgdGhpcy5fcmF3TW9kdWxlID0gcmF3TW9kdWxlO1xuICB2YXIgcmF3U3RhdGUgPSByYXdNb2R1bGUuc3RhdGU7XG5cbiAgLy8gU3RvcmUgdGhlIG9yaWdpbiBtb2R1bGUncyBzdGF0ZVxuICB0aGlzLnN0YXRlID0gKHR5cGVvZiByYXdTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IHJhd1N0YXRlKCkgOiByYXdTdGF0ZSkgfHwge307XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBuYW1lc3BhY2VkOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5uYW1lc3BhY2VkLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEhdGhpcy5fcmF3TW9kdWxlLm5hbWVzcGFjZWRcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiBhZGRDaGlsZCAoa2V5LCBtb2R1bGUpIHtcbiAgdGhpcy5fY2hpbGRyZW5ba2V5XSA9IG1vZHVsZTtcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiByZW1vdmVDaGlsZCAoa2V5KSB7XG4gIGRlbGV0ZSB0aGlzLl9jaGlsZHJlbltrZXldO1xufTtcblxuTW9kdWxlLnByb3RvdHlwZS5nZXRDaGlsZCA9IGZ1bmN0aW9uIGdldENoaWxkIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuW2tleV1cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChyYXdNb2R1bGUpIHtcbiAgdGhpcy5fcmF3TW9kdWxlLm5hbWVzcGFjZWQgPSByYXdNb2R1bGUubmFtZXNwYWNlZDtcbiAgaWYgKHJhd01vZHVsZS5hY3Rpb25zKSB7XG4gICAgdGhpcy5fcmF3TW9kdWxlLmFjdGlvbnMgPSByYXdNb2R1bGUuYWN0aW9ucztcbiAgfVxuICBpZiAocmF3TW9kdWxlLm11dGF0aW9ucykge1xuICAgIHRoaXMuX3Jhd01vZHVsZS5tdXRhdGlvbnMgPSByYXdNb2R1bGUubXV0YXRpb25zO1xuICB9XG4gIGlmIChyYXdNb2R1bGUuZ2V0dGVycykge1xuICAgIHRoaXMuX3Jhd01vZHVsZS5nZXR0ZXJzID0gcmF3TW9kdWxlLmdldHRlcnM7XG4gIH1cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZm9yRWFjaENoaWxkID0gZnVuY3Rpb24gZm9yRWFjaENoaWxkIChmbikge1xuICBmb3JFYWNoVmFsdWUodGhpcy5fY2hpbGRyZW4sIGZuKTtcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZm9yRWFjaEdldHRlciA9IGZ1bmN0aW9uIGZvckVhY2hHZXR0ZXIgKGZuKSB7XG4gIGlmICh0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycykge1xuICAgIGZvckVhY2hWYWx1ZSh0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycywgZm4pO1xuICB9XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmZvckVhY2hBY3Rpb24gPSBmdW5jdGlvbiBmb3JFYWNoQWN0aW9uIChmbikge1xuICBpZiAodGhpcy5fcmF3TW9kdWxlLmFjdGlvbnMpIHtcbiAgICBmb3JFYWNoVmFsdWUodGhpcy5fcmF3TW9kdWxlLmFjdGlvbnMsIGZuKTtcbiAgfVxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5mb3JFYWNoTXV0YXRpb24gPSBmdW5jdGlvbiBmb3JFYWNoTXV0YXRpb24gKGZuKSB7XG4gIGlmICh0aGlzLl9yYXdNb2R1bGUubXV0YXRpb25zKSB7XG4gICAgZm9yRWFjaFZhbHVlKHRoaXMuX3Jhd01vZHVsZS5tdXRhdGlvbnMsIGZuKTtcbiAgfVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1vZHVsZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG52YXIgTW9kdWxlQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIE1vZHVsZUNvbGxlY3Rpb24gKHJhd1Jvb3RNb2R1bGUpIHtcbiAgLy8gcmVnaXN0ZXIgcm9vdCBtb2R1bGUgKFZ1ZXguU3RvcmUgb3B0aW9ucylcbiAgdGhpcy5yZWdpc3RlcihbXSwgcmF3Um9vdE1vZHVsZSwgZmFsc2UpO1xufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChwYXRoKSB7XG4gIHJldHVybiBwYXRoLnJlZHVjZShmdW5jdGlvbiAobW9kdWxlLCBrZXkpIHtcbiAgICByZXR1cm4gbW9kdWxlLmdldENoaWxkKGtleSlcbiAgfSwgdGhpcy5yb290KVxufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUuZ2V0TmFtZXNwYWNlID0gZnVuY3Rpb24gZ2V0TmFtZXNwYWNlIChwYXRoKSB7XG4gIHZhciBtb2R1bGUgPSB0aGlzLnJvb3Q7XG4gIHJldHVybiBwYXRoLnJlZHVjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBrZXkpIHtcbiAgICBtb2R1bGUgPSBtb2R1bGUuZ2V0Q2hpbGQoa2V5KTtcbiAgICByZXR1cm4gbmFtZXNwYWNlICsgKG1vZHVsZS5uYW1lc3BhY2VkID8ga2V5ICsgJy8nIDogJycpXG4gIH0sICcnKVxufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlJDEgKHJhd1Jvb3RNb2R1bGUpIHtcbiAgdXBkYXRlKFtdLCB0aGlzLnJvb3QsIHJhd1Jvb3RNb2R1bGUpO1xufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlciAocGF0aCwgcmF3TW9kdWxlLCBydW50aW1lKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG4gICAgaWYgKCBydW50aW1lID09PSB2b2lkIDAgKSBydW50aW1lID0gdHJ1ZTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydFJhd01vZHVsZShwYXRoLCByYXdNb2R1bGUpO1xuICB9XG5cbiAgdmFyIG5ld01vZHVsZSA9IG5ldyBNb2R1bGUocmF3TW9kdWxlLCBydW50aW1lKTtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgdGhpcy5yb290ID0gbmV3TW9kdWxlO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldChwYXRoLnNsaWNlKDAsIC0xKSk7XG4gICAgcGFyZW50LmFkZENoaWxkKHBhdGhbcGF0aC5sZW5ndGggLSAxXSwgbmV3TW9kdWxlKTtcbiAgfVxuXG4gIC8vIHJlZ2lzdGVyIG5lc3RlZCBtb2R1bGVzXG4gIGlmIChyYXdNb2R1bGUubW9kdWxlcykge1xuICAgIGZvckVhY2hWYWx1ZShyYXdNb2R1bGUubW9kdWxlcywgZnVuY3Rpb24gKHJhd0NoaWxkTW9kdWxlLCBrZXkpIHtcbiAgICAgIHRoaXMkMS5yZWdpc3RlcihwYXRoLmNvbmNhdChrZXkpLCByYXdDaGlsZE1vZHVsZSwgcnVudGltZSk7XG4gICAgfSk7XG4gIH1cbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLnVucmVnaXN0ZXIgPSBmdW5jdGlvbiB1bnJlZ2lzdGVyIChwYXRoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLmdldChwYXRoLnNsaWNlKDAsIC0xKSk7XG4gIHZhciBrZXkgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gIGlmICghcGFyZW50LmdldENoaWxkKGtleSkucnVudGltZSkgeyByZXR1cm4gfVxuXG4gIHBhcmVudC5yZW1vdmVDaGlsZChrZXkpO1xufTtcblxuZnVuY3Rpb24gdXBkYXRlIChwYXRoLCB0YXJnZXRNb2R1bGUsIG5ld01vZHVsZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydFJhd01vZHVsZShwYXRoLCBuZXdNb2R1bGUpO1xuICB9XG5cbiAgLy8gdXBkYXRlIHRhcmdldCBtb2R1bGVcbiAgdGFyZ2V0TW9kdWxlLnVwZGF0ZShuZXdNb2R1bGUpO1xuXG4gIC8vIHVwZGF0ZSBuZXN0ZWQgbW9kdWxlc1xuICBpZiAobmV3TW9kdWxlLm1vZHVsZXMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmV3TW9kdWxlLm1vZHVsZXMpIHtcbiAgICAgIGlmICghdGFyZ2V0TW9kdWxlLmdldENoaWxkKGtleSkpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIlt2dWV4XSB0cnlpbmcgdG8gYWRkIGEgbmV3IG1vZHVsZSAnXCIgKyBrZXkgKyBcIicgb24gaG90IHJlbG9hZGluZywgXCIgK1xuICAgICAgICAgICAgJ21hbnVhbCByZWxvYWQgaXMgbmVlZGVkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB1cGRhdGUoXG4gICAgICAgIHBhdGguY29uY2F0KGtleSksXG4gICAgICAgIHRhcmdldE1vZHVsZS5nZXRDaGlsZChrZXkpLFxuICAgICAgICBuZXdNb2R1bGUubW9kdWxlc1trZXldXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZnVuY3Rpb25Bc3NlcnQgPSB7XG4gIGFzc2VydDogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7IH0sXG4gIGV4cGVjdGVkOiAnZnVuY3Rpb24nXG59O1xuXG52YXIgb2JqZWN0QXNzZXJ0ID0ge1xuICBhc3NlcnQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8XG4gICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLmhhbmRsZXIgPT09ICdmdW5jdGlvbicpOyB9LFxuICBleHBlY3RlZDogJ2Z1bmN0aW9uIG9yIG9iamVjdCB3aXRoIFwiaGFuZGxlclwiIGZ1bmN0aW9uJ1xufTtcblxudmFyIGFzc2VydFR5cGVzID0ge1xuICBnZXR0ZXJzOiBmdW5jdGlvbkFzc2VydCxcbiAgbXV0YXRpb25zOiBmdW5jdGlvbkFzc2VydCxcbiAgYWN0aW9uczogb2JqZWN0QXNzZXJ0XG59O1xuXG5mdW5jdGlvbiBhc3NlcnRSYXdNb2R1bGUgKHBhdGgsIHJhd01vZHVsZSkge1xuICBPYmplY3Qua2V5cyhhc3NlcnRUeXBlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFyYXdNb2R1bGVba2V5XSkgeyByZXR1cm4gfVxuXG4gICAgdmFyIGFzc2VydE9wdGlvbnMgPSBhc3NlcnRUeXBlc1trZXldO1xuXG4gICAgZm9yRWFjaFZhbHVlKHJhd01vZHVsZVtrZXldLCBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgYXNzZXJ0T3B0aW9ucy5hc3NlcnQodmFsdWUpLFxuICAgICAgICBtYWtlQXNzZXJ0aW9uTWVzc2FnZShwYXRoLCBrZXksIHR5cGUsIHZhbHVlLCBhc3NlcnRPcHRpb25zLmV4cGVjdGVkKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1ha2VBc3NlcnRpb25NZXNzYWdlIChwYXRoLCBrZXksIHR5cGUsIHZhbHVlLCBleHBlY3RlZCkge1xuICB2YXIgYnVmID0ga2V5ICsgXCIgc2hvdWxkIGJlIFwiICsgZXhwZWN0ZWQgKyBcIiBidXQgXFxcIlwiICsga2V5ICsgXCIuXCIgKyB0eXBlICsgXCJcXFwiXCI7XG4gIGlmIChwYXRoLmxlbmd0aCA+IDApIHtcbiAgICBidWYgKz0gXCIgaW4gbW9kdWxlIFxcXCJcIiArIChwYXRoLmpvaW4oJy4nKSkgKyBcIlxcXCJcIjtcbiAgfVxuICBidWYgKz0gXCIgaXMgXCIgKyAoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSArIFwiLlwiO1xuICByZXR1cm4gYnVmXG59XG5cbnZhciBWdWU7IC8vIGJpbmQgb24gaW5zdGFsbFxuXG52YXIgU3RvcmUgPSBmdW5jdGlvbiBTdG9yZSAob3B0aW9ucykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcbiAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgLy8gQXV0byBpbnN0YWxsIGlmIGl0IGlzIG5vdCBkb25lIHlldCBhbmQgYHdpbmRvd2AgaGFzIGBWdWVgLlxuICAvLyBUbyBhbGxvdyB1c2VycyB0byBhdm9pZCBhdXRvLWluc3RhbGxhdGlvbiBpbiBzb21lIGNhc2VzLFxuICAvLyB0aGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCBoZXJlLiBTZWUgIzczMVxuICBpZiAoIVZ1ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuVnVlKSB7XG4gICAgaW5zdGFsbCh3aW5kb3cuVnVlKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0KFZ1ZSwgXCJtdXN0IGNhbGwgVnVlLnVzZShWdWV4KSBiZWZvcmUgY3JlYXRpbmcgYSBzdG9yZSBpbnN0YW5jZS5cIik7XG4gICAgYXNzZXJ0KHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJywgXCJ2dWV4IHJlcXVpcmVzIGEgUHJvbWlzZSBwb2x5ZmlsbCBpbiB0aGlzIGJyb3dzZXIuXCIpO1xuICAgIGFzc2VydCh0aGlzIGluc3RhbmNlb2YgU3RvcmUsIFwic3RvcmUgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yLlwiKTtcbiAgfVxuXG4gIHZhciBwbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zOyBpZiAoIHBsdWdpbnMgPT09IHZvaWQgMCApIHBsdWdpbnMgPSBbXTtcbiAgdmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0OyBpZiAoIHN0cmljdCA9PT0gdm9pZCAwICkgc3RyaWN0ID0gZmFsc2U7XG5cbiAgLy8gc3RvcmUgaW50ZXJuYWwgc3RhdGVcbiAgdGhpcy5fY29tbWl0dGluZyA9IGZhbHNlO1xuICB0aGlzLl9hY3Rpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMgPSBbXTtcbiAgdGhpcy5fbXV0YXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fd3JhcHBlZEdldHRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aGlzLl9tb2R1bGVzID0gbmV3IE1vZHVsZUNvbGxlY3Rpb24ob3B0aW9ucyk7XG4gIHRoaXMuX21vZHVsZXNOYW1lc3BhY2VNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdO1xuICB0aGlzLl93YXRjaGVyVk0gPSBuZXcgVnVlKCk7XG5cbiAgLy8gYmluZCBjb21taXQgYW5kIGRpc3BhdGNoIHRvIHNlbGZcbiAgdmFyIHN0b3JlID0gdGhpcztcbiAgdmFyIHJlZiA9IHRoaXM7XG4gIHZhciBkaXNwYXRjaCA9IHJlZi5kaXNwYXRjaDtcbiAgdmFyIGNvbW1pdCA9IHJlZi5jb21taXQ7XG4gIHRoaXMuZGlzcGF0Y2ggPSBmdW5jdGlvbiBib3VuZERpc3BhdGNoICh0eXBlLCBwYXlsb2FkKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoLmNhbGwoc3RvcmUsIHR5cGUsIHBheWxvYWQpXG4gIH07XG4gIHRoaXMuY29tbWl0ID0gZnVuY3Rpb24gYm91bmRDb21taXQgKHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gY29tbWl0LmNhbGwoc3RvcmUsIHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpXG4gIH07XG5cbiAgLy8gc3RyaWN0IG1vZGVcbiAgdGhpcy5zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgdmFyIHN0YXRlID0gdGhpcy5fbW9kdWxlcy5yb290LnN0YXRlO1xuXG4gIC8vIGluaXQgcm9vdCBtb2R1bGUuXG4gIC8vIHRoaXMgYWxzbyByZWN1cnNpdmVseSByZWdpc3RlcnMgYWxsIHN1Yi1tb2R1bGVzXG4gIC8vIGFuZCBjb2xsZWN0cyBhbGwgbW9kdWxlIGdldHRlcnMgaW5zaWRlIHRoaXMuX3dyYXBwZWRHZXR0ZXJzXG4gIGluc3RhbGxNb2R1bGUodGhpcywgc3RhdGUsIFtdLCB0aGlzLl9tb2R1bGVzLnJvb3QpO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHN0b3JlIHZtLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHJlYWN0aXZpdHlcbiAgLy8gKGFsc28gcmVnaXN0ZXJzIF93cmFwcGVkR2V0dGVycyBhcyBjb21wdXRlZCBwcm9wZXJ0aWVzKVxuICByZXNldFN0b3JlVk0odGhpcywgc3RhdGUpO1xuXG4gIC8vIGFwcGx5IHBsdWdpbnNcbiAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHsgcmV0dXJuIHBsdWdpbih0aGlzJDEpOyB9KTtcblxuICB2YXIgdXNlRGV2dG9vbHMgPSBvcHRpb25zLmRldnRvb2xzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRldnRvb2xzIDogVnVlLmNvbmZpZy5kZXZ0b29scztcbiAgaWYgKHVzZURldnRvb2xzKSB7XG4gICAgZGV2dG9vbFBsdWdpbih0aGlzKTtcbiAgfVxufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyQxID0geyBzdGF0ZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5zdGF0ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl92bS5fZGF0YS4kJHN0YXRlXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5zdGF0ZS5zZXQgPSBmdW5jdGlvbiAodikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydChmYWxzZSwgXCJ1c2Ugc3RvcmUucmVwbGFjZVN0YXRlKCkgdG8gZXhwbGljaXQgcmVwbGFjZSBzdG9yZSBzdGF0ZS5cIik7XG4gIH1cbn07XG5cblN0b3JlLnByb3RvdHlwZS5jb21taXQgPSBmdW5jdGlvbiBjb21taXQgKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAvLyBjaGVjayBvYmplY3Qtc3R5bGUgY29tbWl0XG4gIHZhciByZWYgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpO1xuICAgIHZhciB0eXBlID0gcmVmLnR5cGU7XG4gICAgdmFyIHBheWxvYWQgPSByZWYucGF5bG9hZDtcbiAgICB2YXIgb3B0aW9ucyA9IHJlZi5vcHRpb25zO1xuXG4gIHZhciBtdXRhdGlvbiA9IHsgdHlwZTogdHlwZSwgcGF5bG9hZDogcGF5bG9hZCB9O1xuICB2YXIgZW50cnkgPSB0aGlzLl9tdXRhdGlvbnNbdHlwZV07XG4gIGlmICghZW50cnkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBtdXRhdGlvbiB0eXBlOiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgdGhpcy5fd2l0aENvbW1pdChmdW5jdGlvbiAoKSB7XG4gICAgZW50cnkuZm9yRWFjaChmdW5jdGlvbiBjb21taXRJdGVyYXRvciAoaGFuZGxlcikge1xuICAgICAgaGFuZGxlcihwYXlsb2FkKTtcbiAgICB9KTtcbiAgfSk7XG4gIHRoaXMuX3N1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViKG11dGF0aW9uLCB0aGlzJDEuc3RhdGUpOyB9KTtcblxuICBpZiAoXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5zaWxlbnRcbiAgKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbdnVleF0gbXV0YXRpb24gdHlwZTogXCIgKyB0eXBlICsgXCIuIFNpbGVudCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4gXCIgK1xuICAgICAgJ1VzZSB0aGUgZmlsdGVyIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIHZ1ZS1kZXZ0b29scydcbiAgICApO1xuICB9XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaCAoX3R5cGUsIF9wYXlsb2FkKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgLy8gY2hlY2sgb2JqZWN0LXN0eWxlIGRpc3BhdGNoXG4gIHZhciByZWYgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCk7XG4gICAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgICB2YXIgcGF5bG9hZCA9IHJlZi5wYXlsb2FkO1xuXG4gIHZhciBhY3Rpb24gPSB7IHR5cGU6IHR5cGUsIHBheWxvYWQ6IHBheWxvYWQgfTtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fYWN0aW9uc1t0eXBlXTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGFjdGlvbiB0eXBlOiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHRoaXMuX2FjdGlvblN1YnNjcmliZXJzXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5iZWZvcmU7IH0pXG4gICAgICAuZm9yRWFjaChmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYmVmb3JlKGFjdGlvbiwgdGhpcyQxLnN0YXRlKTsgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc29sZS53YXJuKFwiW3Z1ZXhdIGVycm9yIGluIGJlZm9yZSBhY3Rpb24gc3Vic2NyaWJlcnM6IFwiKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlc3VsdCA9IGVudHJ5Lmxlbmd0aCA+IDFcbiAgICA/IFByb21pc2UuYWxsKGVudHJ5Lm1hcChmdW5jdGlvbiAoaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlcihwYXlsb2FkKTsgfSkpXG4gICAgOiBlbnRyeVswXShwYXlsb2FkKTtcblxuICByZXR1cm4gcmVzdWx0LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzJDEuX2FjdGlvblN1YnNjcmliZXJzXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViLmFmdGVyOyB9KVxuICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYWZ0ZXIoYWN0aW9uLCB0aGlzJDEuc3RhdGUpOyB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbdnVleF0gZXJyb3IgaW4gYWZ0ZXIgYWN0aW9uIHN1YnNjcmliZXJzOiBcIik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfSlcbn07XG5cblN0b3JlLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiBzdWJzY3JpYmUgKGZuKSB7XG4gIHJldHVybiBnZW5lcmljU3Vic2NyaWJlKGZuLCB0aGlzLl9zdWJzY3JpYmVycylcbn07XG5cblN0b3JlLnByb3RvdHlwZS5zdWJzY3JpYmVBY3Rpb24gPSBmdW5jdGlvbiBzdWJzY3JpYmVBY3Rpb24gKGZuKSB7XG4gIHZhciBzdWJzID0gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nID8geyBiZWZvcmU6IGZuIH0gOiBmbjtcbiAgcmV0dXJuIGdlbmVyaWNTdWJzY3JpYmUoc3VicywgdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMpXG59O1xuXG5TdG9yZS5wcm90b3R5cGUud2F0Y2ggPSBmdW5jdGlvbiB3YXRjaCAoZ2V0dGVyLCBjYiwgb3B0aW9ucykge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBnZXR0ZXIgPT09ICdmdW5jdGlvbicsIFwic3RvcmUud2F0Y2ggb25seSBhY2NlcHRzIGEgZnVuY3Rpb24uXCIpO1xuICB9XG4gIHJldHVybiB0aGlzLl93YXRjaGVyVk0uJHdhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldHRlcih0aGlzJDEuc3RhdGUsIHRoaXMkMS5nZXR0ZXJzKTsgfSwgY2IsIG9wdGlvbnMpXG59O1xuXG5TdG9yZS5wcm90b3R5cGUucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gcmVwbGFjZVN0YXRlIChzdGF0ZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHRoaXMuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgIHRoaXMkMS5fdm0uX2RhdGEuJCRzdGF0ZSA9IHN0YXRlO1xuICB9KTtcbn07XG5cblN0b3JlLnByb3RvdHlwZS5yZWdpc3Rlck1vZHVsZSA9IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlIChwYXRoLCByYXdNb2R1bGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHBhdGgpLCBcIm1vZHVsZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gQXJyYXkuXCIpO1xuICAgIGFzc2VydChwYXRoLmxlbmd0aCA+IDAsICdjYW5ub3QgcmVnaXN0ZXIgdGhlIHJvb3QgbW9kdWxlIGJ5IHVzaW5nIHJlZ2lzdGVyTW9kdWxlLicpO1xuICB9XG5cbiAgdGhpcy5fbW9kdWxlcy5yZWdpc3RlcihwYXRoLCByYXdNb2R1bGUpO1xuICBpbnN0YWxsTW9kdWxlKHRoaXMsIHRoaXMuc3RhdGUsIHBhdGgsIHRoaXMuX21vZHVsZXMuZ2V0KHBhdGgpLCBvcHRpb25zLnByZXNlcnZlU3RhdGUpO1xuICAvLyByZXNldCBzdG9yZSB0byB1cGRhdGUgZ2V0dGVycy4uLlxuICByZXNldFN0b3JlVk0odGhpcywgdGhpcy5zdGF0ZSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUudW5yZWdpc3Rlck1vZHVsZSA9IGZ1bmN0aW9uIHVucmVnaXN0ZXJNb2R1bGUgKHBhdGgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHBhdGgpLCBcIm1vZHVsZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gQXJyYXkuXCIpO1xuICB9XG5cbiAgdGhpcy5fbW9kdWxlcy51bnJlZ2lzdGVyKHBhdGgpO1xuICB0aGlzLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50U3RhdGUgPSBnZXROZXN0ZWRTdGF0ZSh0aGlzJDEuc3RhdGUsIHBhdGguc2xpY2UoMCwgLTEpKTtcbiAgICBWdWUuZGVsZXRlKHBhcmVudFN0YXRlLCBwYXRoW3BhdGgubGVuZ3RoIC0gMV0pO1xuICB9KTtcbiAgcmVzZXRTdG9yZSh0aGlzKTtcbn07XG5cblN0b3JlLnByb3RvdHlwZS5ob3RVcGRhdGUgPSBmdW5jdGlvbiBob3RVcGRhdGUgKG5ld09wdGlvbnMpIHtcbiAgdGhpcy5fbW9kdWxlcy51cGRhdGUobmV3T3B0aW9ucyk7XG4gIHJlc2V0U3RvcmUodGhpcywgdHJ1ZSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuX3dpdGhDb21taXQgPSBmdW5jdGlvbiBfd2l0aENvbW1pdCAoZm4pIHtcbiAgdmFyIGNvbW1pdHRpbmcgPSB0aGlzLl9jb21taXR0aW5nO1xuICB0aGlzLl9jb21taXR0aW5nID0gdHJ1ZTtcbiAgZm4oKTtcbiAgdGhpcy5fY29tbWl0dGluZyA9IGNvbW1pdHRpbmc7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggU3RvcmUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMkMSApO1xuXG5mdW5jdGlvbiBnZW5lcmljU3Vic2NyaWJlIChmbiwgc3Vicykge1xuICBpZiAoc3Vicy5pbmRleE9mKGZuKSA8IDApIHtcbiAgICBzdWJzLnB1c2goZm4pO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGkgPSBzdWJzLmluZGV4T2YoZm4pO1xuICAgIGlmIChpID4gLTEpIHtcbiAgICAgIHN1YnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldFN0b3JlIChzdG9yZSwgaG90KSB7XG4gIHN0b3JlLl9hY3Rpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc3RvcmUuX211dGF0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHN0b3JlLl93cmFwcGVkR2V0dGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIHN0YXRlID0gc3RvcmUuc3RhdGU7XG4gIC8vIGluaXQgYWxsIG1vZHVsZXNcbiAgaW5zdGFsbE1vZHVsZShzdG9yZSwgc3RhdGUsIFtdLCBzdG9yZS5fbW9kdWxlcy5yb290LCB0cnVlKTtcbiAgLy8gcmVzZXQgdm1cbiAgcmVzZXRTdG9yZVZNKHN0b3JlLCBzdGF0ZSwgaG90KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRTdG9yZVZNIChzdG9yZSwgc3RhdGUsIGhvdCkge1xuICB2YXIgb2xkVm0gPSBzdG9yZS5fdm07XG5cbiAgLy8gYmluZCBzdG9yZSBwdWJsaWMgZ2V0dGVyc1xuICBzdG9yZS5nZXR0ZXJzID0ge307XG4gIHZhciB3cmFwcGVkR2V0dGVycyA9IHN0b3JlLl93cmFwcGVkR2V0dGVycztcbiAgdmFyIGNvbXB1dGVkID0ge307XG4gIGZvckVhY2hWYWx1ZSh3cmFwcGVkR2V0dGVycywgZnVuY3Rpb24gKGZuLCBrZXkpIHtcbiAgICAvLyB1c2UgY29tcHV0ZWQgdG8gbGV2ZXJhZ2UgaXRzIGxhenktY2FjaGluZyBtZWNoYW5pc21cbiAgICAvLyBkaXJlY3QgaW5saW5lIGZ1bmN0aW9uIHVzZSB3aWxsIGxlYWQgdG8gY2xvc3VyZSBwcmVzZXJ2aW5nIG9sZFZtLlxuICAgIC8vIHVzaW5nIHBhcnRpYWwgdG8gcmV0dXJuIGZ1bmN0aW9uIHdpdGggb25seSBhcmd1bWVudHMgcHJlc2VydmVkIGluIGNsb3N1cmUgZW52aXJvbWVudC5cbiAgICBjb21wdXRlZFtrZXldID0gcGFydGlhbChmbiwgc3RvcmUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdG9yZS5nZXR0ZXJzLCBrZXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RvcmUuX3ZtW2tleV07IH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlIC8vIGZvciBsb2NhbCBnZXR0ZXJzXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIHVzZSBhIFZ1ZSBpbnN0YW5jZSB0byBzdG9yZSB0aGUgc3RhdGUgdHJlZVxuICAvLyBzdXBwcmVzcyB3YXJuaW5ncyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgaGFzIGFkZGVkXG4gIC8vIHNvbWUgZnVua3kgZ2xvYmFsIG1peGluc1xuICB2YXIgc2lsZW50ID0gVnVlLmNvbmZpZy5zaWxlbnQ7XG4gIFZ1ZS5jb25maWcuc2lsZW50ID0gdHJ1ZTtcbiAgc3RvcmUuX3ZtID0gbmV3IFZ1ZSh7XG4gICAgZGF0YToge1xuICAgICAgJCRzdGF0ZTogc3RhdGVcbiAgICB9LFxuICAgIGNvbXB1dGVkOiBjb21wdXRlZFxuICB9KTtcbiAgVnVlLmNvbmZpZy5zaWxlbnQgPSBzaWxlbnQ7XG5cbiAgLy8gZW5hYmxlIHN0cmljdCBtb2RlIGZvciBuZXcgdm1cbiAgaWYgKHN0b3JlLnN0cmljdCkge1xuICAgIGVuYWJsZVN0cmljdE1vZGUoc3RvcmUpO1xuICB9XG5cbiAgaWYgKG9sZFZtKSB7XG4gICAgaWYgKGhvdCkge1xuICAgICAgLy8gZGlzcGF0Y2ggY2hhbmdlcyBpbiBhbGwgc3Vic2NyaWJlZCB3YXRjaGVyc1xuICAgICAgLy8gdG8gZm9yY2UgZ2V0dGVyIHJlLWV2YWx1YXRpb24gZm9yIGhvdCByZWxvYWRpbmcuXG4gICAgICBzdG9yZS5fd2l0aENvbW1pdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9sZFZtLl9kYXRhLiQkc3RhdGUgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFZ1ZS5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJldHVybiBvbGRWbS4kZGVzdHJveSgpOyB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsTW9kdWxlIChzdG9yZSwgcm9vdFN0YXRlLCBwYXRoLCBtb2R1bGUsIGhvdCkge1xuICB2YXIgaXNSb290ID0gIXBhdGgubGVuZ3RoO1xuICB2YXIgbmFtZXNwYWNlID0gc3RvcmUuX21vZHVsZXMuZ2V0TmFtZXNwYWNlKHBhdGgpO1xuXG4gIC8vIHJlZ2lzdGVyIGluIG5hbWVzcGFjZSBtYXBcbiAgaWYgKG1vZHVsZS5uYW1lc3BhY2VkKSB7XG4gICAgc3RvcmUuX21vZHVsZXNOYW1lc3BhY2VNYXBbbmFtZXNwYWNlXSA9IG1vZHVsZTtcbiAgfVxuXG4gIC8vIHNldCBzdGF0ZVxuICBpZiAoIWlzUm9vdCAmJiAhaG90KSB7XG4gICAgdmFyIHBhcmVudFN0YXRlID0gZ2V0TmVzdGVkU3RhdGUocm9vdFN0YXRlLCBwYXRoLnNsaWNlKDAsIC0xKSk7XG4gICAgdmFyIG1vZHVsZU5hbWUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgc3RvcmUuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgICAgVnVlLnNldChwYXJlbnRTdGF0ZSwgbW9kdWxlTmFtZSwgbW9kdWxlLnN0YXRlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBsb2NhbCA9IG1vZHVsZS5jb250ZXh0ID0gbWFrZUxvY2FsQ29udGV4dChzdG9yZSwgbmFtZXNwYWNlLCBwYXRoKTtcblxuICBtb2R1bGUuZm9yRWFjaE11dGF0aW9uKGZ1bmN0aW9uIChtdXRhdGlvbiwga2V5KSB7XG4gICAgdmFyIG5hbWVzcGFjZWRUeXBlID0gbmFtZXNwYWNlICsga2V5O1xuICAgIHJlZ2lzdGVyTXV0YXRpb24oc3RvcmUsIG5hbWVzcGFjZWRUeXBlLCBtdXRhdGlvbiwgbG9jYWwpO1xuICB9KTtcblxuICBtb2R1bGUuZm9yRWFjaEFjdGlvbihmdW5jdGlvbiAoYWN0aW9uLCBrZXkpIHtcbiAgICB2YXIgdHlwZSA9IGFjdGlvbi5yb290ID8ga2V5IDogbmFtZXNwYWNlICsga2V5O1xuICAgIHZhciBoYW5kbGVyID0gYWN0aW9uLmhhbmRsZXIgfHwgYWN0aW9uO1xuICAgIHJlZ2lzdGVyQWN0aW9uKHN0b3JlLCB0eXBlLCBoYW5kbGVyLCBsb2NhbCk7XG4gIH0pO1xuXG4gIG1vZHVsZS5mb3JFYWNoR2V0dGVyKGZ1bmN0aW9uIChnZXR0ZXIsIGtleSkge1xuICAgIHZhciBuYW1lc3BhY2VkVHlwZSA9IG5hbWVzcGFjZSArIGtleTtcbiAgICByZWdpc3RlckdldHRlcihzdG9yZSwgbmFtZXNwYWNlZFR5cGUsIGdldHRlciwgbG9jYWwpO1xuICB9KTtcblxuICBtb2R1bGUuZm9yRWFjaENoaWxkKGZ1bmN0aW9uIChjaGlsZCwga2V5KSB7XG4gICAgaW5zdGFsbE1vZHVsZShzdG9yZSwgcm9vdFN0YXRlLCBwYXRoLmNvbmNhdChrZXkpLCBjaGlsZCwgaG90KTtcbiAgfSk7XG59XG5cbi8qKlxuICogbWFrZSBsb2NhbGl6ZWQgZGlzcGF0Y2gsIGNvbW1pdCwgZ2V0dGVycyBhbmQgc3RhdGVcbiAqIGlmIHRoZXJlIGlzIG5vIG5hbWVzcGFjZSwganVzdCB1c2Ugcm9vdCBvbmVzXG4gKi9cbmZ1bmN0aW9uIG1ha2VMb2NhbENvbnRleHQgKHN0b3JlLCBuYW1lc3BhY2UsIHBhdGgpIHtcbiAgdmFyIG5vTmFtZXNwYWNlID0gbmFtZXNwYWNlID09PSAnJztcblxuICB2YXIgbG9jYWwgPSB7XG4gICAgZGlzcGF0Y2g6IG5vTmFtZXNwYWNlID8gc3RvcmUuZGlzcGF0Y2ggOiBmdW5jdGlvbiAoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucykge1xuICAgICAgdmFyIGFyZ3MgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpO1xuICAgICAgdmFyIHBheWxvYWQgPSBhcmdzLnBheWxvYWQ7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3Mub3B0aW9ucztcbiAgICAgIHZhciB0eXBlID0gYXJncy50eXBlO1xuXG4gICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMucm9vdCkge1xuICAgICAgICB0eXBlID0gbmFtZXNwYWNlICsgdHlwZTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXN0b3JlLl9hY3Rpb25zW3R5cGVdKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBsb2NhbCBhY3Rpb24gdHlwZTogXCIgKyAoYXJncy50eXBlKSArIFwiLCBnbG9iYWwgdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoKHR5cGUsIHBheWxvYWQpXG4gICAgfSxcblxuICAgIGNvbW1pdDogbm9OYW1lc3BhY2UgPyBzdG9yZS5jb21taXQgOiBmdW5jdGlvbiAoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucykge1xuICAgICAgdmFyIGFyZ3MgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpO1xuICAgICAgdmFyIHBheWxvYWQgPSBhcmdzLnBheWxvYWQ7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3Mub3B0aW9ucztcbiAgICAgIHZhciB0eXBlID0gYXJncy50eXBlO1xuXG4gICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMucm9vdCkge1xuICAgICAgICB0eXBlID0gbmFtZXNwYWNlICsgdHlwZTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXN0b3JlLl9tdXRhdGlvbnNbdHlwZV0pIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGxvY2FsIG11dGF0aW9uIHR5cGU6IFwiICsgKGFyZ3MudHlwZSkgKyBcIiwgZ2xvYmFsIHR5cGU6IFwiICsgdHlwZSkpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0b3JlLmNvbW1pdCh0eXBlLCBwYXlsb2FkLCBvcHRpb25zKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gZ2V0dGVycyBhbmQgc3RhdGUgb2JqZWN0IG11c3QgYmUgZ290dGVuIGxhemlseVxuICAvLyBiZWNhdXNlIHRoZXkgd2lsbCBiZSBjaGFuZ2VkIGJ5IHZtIHVwZGF0ZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsb2NhbCwge1xuICAgIGdldHRlcnM6IHtcbiAgICAgIGdldDogbm9OYW1lc3BhY2VcbiAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBzdG9yZS5nZXR0ZXJzOyB9XG4gICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWFrZUxvY2FsR2V0dGVycyhzdG9yZSwgbmFtZXNwYWNlKTsgfVxuICAgIH0sXG4gICAgc3RhdGU6IHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0TmVzdGVkU3RhdGUoc3RvcmUuc3RhdGUsIHBhdGgpOyB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gbG9jYWxcbn1cblxuZnVuY3Rpb24gbWFrZUxvY2FsR2V0dGVycyAoc3RvcmUsIG5hbWVzcGFjZSkge1xuICB2YXIgZ2V0dGVyc1Byb3h5ID0ge307XG5cbiAgdmFyIHNwbGl0UG9zID0gbmFtZXNwYWNlLmxlbmd0aDtcbiAgT2JqZWN0LmtleXMoc3RvcmUuZ2V0dGVycykuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIC8vIHNraXAgaWYgdGhlIHRhcmdldCBnZXR0ZXIgaXMgbm90IG1hdGNoIHRoaXMgbmFtZXNwYWNlXG4gICAgaWYgKHR5cGUuc2xpY2UoMCwgc3BsaXRQb3MpICE9PSBuYW1lc3BhY2UpIHsgcmV0dXJuIH1cblxuICAgIC8vIGV4dHJhY3QgbG9jYWwgZ2V0dGVyIHR5cGVcbiAgICB2YXIgbG9jYWxUeXBlID0gdHlwZS5zbGljZShzcGxpdFBvcyk7XG5cbiAgICAvLyBBZGQgYSBwb3J0IHRvIHRoZSBnZXR0ZXJzIHByb3h5LlxuICAgIC8vIERlZmluZSBhcyBnZXR0ZXIgcHJvcGVydHkgYmVjYXVzZVxuICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIGV2YWx1YXRlIHRoZSBnZXR0ZXJzIGluIHRoaXMgdGltZS5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2V0dGVyc1Byb3h5LCBsb2NhbFR5cGUsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RvcmUuZ2V0dGVyc1t0eXBlXTsgfSxcbiAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGdldHRlcnNQcm94eVxufVxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGF0aW9uIChzdG9yZSwgdHlwZSwgaGFuZGxlciwgbG9jYWwpIHtcbiAgdmFyIGVudHJ5ID0gc3RvcmUuX211dGF0aW9uc1t0eXBlXSB8fCAoc3RvcmUuX211dGF0aW9uc1t0eXBlXSA9IFtdKTtcbiAgZW50cnkucHVzaChmdW5jdGlvbiB3cmFwcGVkTXV0YXRpb25IYW5kbGVyIChwYXlsb2FkKSB7XG4gICAgaGFuZGxlci5jYWxsKHN0b3JlLCBsb2NhbC5zdGF0ZSwgcGF5bG9hZCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckFjdGlvbiAoc3RvcmUsIHR5cGUsIGhhbmRsZXIsIGxvY2FsKSB7XG4gIHZhciBlbnRyeSA9IHN0b3JlLl9hY3Rpb25zW3R5cGVdIHx8IChzdG9yZS5fYWN0aW9uc1t0eXBlXSA9IFtdKTtcbiAgZW50cnkucHVzaChmdW5jdGlvbiB3cmFwcGVkQWN0aW9uSGFuZGxlciAocGF5bG9hZCwgY2IpIHtcbiAgICB2YXIgcmVzID0gaGFuZGxlci5jYWxsKHN0b3JlLCB7XG4gICAgICBkaXNwYXRjaDogbG9jYWwuZGlzcGF0Y2gsXG4gICAgICBjb21taXQ6IGxvY2FsLmNvbW1pdCxcbiAgICAgIGdldHRlcnM6IGxvY2FsLmdldHRlcnMsXG4gICAgICBzdGF0ZTogbG9jYWwuc3RhdGUsXG4gICAgICByb290R2V0dGVyczogc3RvcmUuZ2V0dGVycyxcbiAgICAgIHJvb3RTdGF0ZTogc3RvcmUuc3RhdGVcbiAgICB9LCBwYXlsb2FkLCBjYik7XG4gICAgaWYgKCFpc1Byb21pc2UocmVzKSkge1xuICAgICAgcmVzID0gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XG4gICAgfVxuICAgIGlmIChzdG9yZS5fZGV2dG9vbEhvb2spIHtcbiAgICAgIHJldHVybiByZXMuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBzdG9yZS5fZGV2dG9vbEhvb2suZW1pdCgndnVleDplcnJvcicsIGVycik7XG4gICAgICAgIHRocm93IGVyclxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyR2V0dGVyIChzdG9yZSwgdHlwZSwgcmF3R2V0dGVyLCBsb2NhbCkge1xuICBpZiAoc3RvcmUuX3dyYXBwZWRHZXR0ZXJzW3R5cGVdKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIGR1cGxpY2F0ZSBnZXR0ZXIga2V5OiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgc3RvcmUuX3dyYXBwZWRHZXR0ZXJzW3R5cGVdID0gZnVuY3Rpb24gd3JhcHBlZEdldHRlciAoc3RvcmUpIHtcbiAgICByZXR1cm4gcmF3R2V0dGVyKFxuICAgICAgbG9jYWwuc3RhdGUsIC8vIGxvY2FsIHN0YXRlXG4gICAgICBsb2NhbC5nZXR0ZXJzLCAvLyBsb2NhbCBnZXR0ZXJzXG4gICAgICBzdG9yZS5zdGF0ZSwgLy8gcm9vdCBzdGF0ZVxuICAgICAgc3RvcmUuZ2V0dGVycyAvLyByb290IGdldHRlcnNcbiAgICApXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuYWJsZVN0cmljdE1vZGUgKHN0b3JlKSB7XG4gIHN0b3JlLl92bS4kd2F0Y2goZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGF0YS4kJHN0YXRlIH0sIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgYXNzZXJ0KHN0b3JlLl9jb21taXR0aW5nLCBcImRvIG5vdCBtdXRhdGUgdnVleCBzdG9yZSBzdGF0ZSBvdXRzaWRlIG11dGF0aW9uIGhhbmRsZXJzLlwiKTtcbiAgICB9XG4gIH0sIHsgZGVlcDogdHJ1ZSwgc3luYzogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkU3RhdGUgKHN0YXRlLCBwYXRoKSB7XG4gIHJldHVybiBwYXRoLmxlbmd0aFxuICAgID8gcGF0aC5yZWR1Y2UoZnVuY3Rpb24gKHN0YXRlLCBrZXkpIHsgcmV0dXJuIHN0YXRlW2tleV07IH0sIHN0YXRlKVxuICAgIDogc3RhdGVcbn1cblxuZnVuY3Rpb24gdW5pZnlPYmplY3RTdHlsZSAodHlwZSwgcGF5bG9hZCwgb3B0aW9ucykge1xuICBpZiAoaXNPYmplY3QodHlwZSkgJiYgdHlwZS50eXBlKSB7XG4gICAgb3B0aW9ucyA9IHBheWxvYWQ7XG4gICAgcGF5bG9hZCA9IHR5cGU7XG4gICAgdHlwZSA9IHR5cGUudHlwZTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJywgKFwiZXhwZWN0cyBzdHJpbmcgYXMgdGhlIHR5cGUsIGJ1dCBmb3VuZCBcIiArICh0eXBlb2YgdHlwZSkgKyBcIi5cIikpO1xuICB9XG5cbiAgcmV0dXJuIHsgdHlwZTogdHlwZSwgcGF5bG9hZDogcGF5bG9hZCwgb3B0aW9uczogb3B0aW9ucyB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwgKF9WdWUpIHtcbiAgaWYgKFZ1ZSAmJiBfVnVlID09PSBWdWUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ1t2dWV4XSBhbHJlYWR5IGluc3RhbGxlZC4gVnVlLnVzZShWdWV4KSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZS4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBWdWUgPSBfVnVlO1xuICBhcHBseU1peGluKFZ1ZSk7XG59XG5cbi8qKlxuICogUmVkdWNlIHRoZSBjb2RlIHdoaWNoIHdyaXR0ZW4gaW4gVnVlLmpzIGZvciBnZXR0aW5nIHRoZSBzdGF0ZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZXNwYWNlXSAtIE1vZHVsZSdzIG5hbWVzcGFjZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IHN0YXRlcyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IHN0YXRlIGFuZCBnZXR0ZXJzIGZvciBwYXJhbSwgeW91IGNhbiBkbyBzb21ldGhpbmcgZm9yIHN0YXRlIGFuZCBnZXR0ZXJzIGluIGl0LlxuICogQHBhcmFtIHtPYmplY3R9XG4gKi9cbnZhciBtYXBTdGF0ZSA9IG5vcm1hbGl6ZU5hbWVzcGFjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBzdGF0ZXMpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICBub3JtYWxpemVNYXAoc3RhdGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICB2YXIga2V5ID0gcmVmLmtleTtcbiAgICB2YXIgdmFsID0gcmVmLnZhbDtcblxuICAgIHJlc1trZXldID0gZnVuY3Rpb24gbWFwcGVkU3RhdGUgKCkge1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy4kc3RvcmUuc3RhdGU7XG4gICAgICB2YXIgZ2V0dGVycyA9IHRoaXMuJHN0b3JlLmdldHRlcnM7XG4gICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcFN0YXRlJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzdGF0ZSA9IG1vZHVsZS5jb250ZXh0LnN0YXRlO1xuICAgICAgICBnZXR0ZXJzID0gbW9kdWxlLmNvbnRleHQuZ2V0dGVycztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdmFsLmNhbGwodGhpcywgc3RhdGUsIGdldHRlcnMpXG4gICAgICAgIDogc3RhdGVbdmFsXVxuICAgIH07XG4gICAgLy8gbWFyayB2dWV4IGdldHRlciBmb3IgZGV2dG9vbHNcbiAgICByZXNba2V5XS52dWV4ID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgY29tbWl0dGluZyB0aGUgbXV0YXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZXNwYWNlXSAtIE1vZHVsZSdzIG5hbWVzcGFjZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG11dGF0aW9ucyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IGBjb21taXRgIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBwYXJhbSwgaXQgY2FuIGFjY2VwdCBhbnRob3IgcGFyYW1zLiBZb3UgY2FuIGNvbW1pdCBtdXRhdGlvbiBhbmQgZG8gYW55IG90aGVyIHRoaW5ncyBpbiB0aGlzIGZ1bmN0aW9uLiBzcGVjaWFsbHksIFlvdSBuZWVkIHRvIHBhc3MgYW50aG9yIHBhcmFtcyBmcm9tIHRoZSBtYXBwZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBtYXBNdXRhdGlvbnMgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgbXV0YXRpb25zKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgbm9ybWFsaXplTWFwKG11dGF0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIGtleSA9IHJlZi5rZXk7XG4gICAgdmFyIHZhbCA9IHJlZi52YWw7XG5cbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZE11dGF0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICAvLyBHZXQgdGhlIGNvbW1pdCBtZXRob2QgZnJvbSBzdG9yZVxuICAgICAgdmFyIGNvbW1pdCA9IHRoaXMuJHN0b3JlLmNvbW1pdDtcbiAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgdmFyIG1vZHVsZSA9IGdldE1vZHVsZUJ5TmFtZXNwYWNlKHRoaXMuJHN0b3JlLCAnbWFwTXV0YXRpb25zJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb21taXQgPSBtb2R1bGUuY29udGV4dC5jb21taXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHZhbC5hcHBseSh0aGlzLCBbY29tbWl0XS5jb25jYXQoYXJncykpXG4gICAgICAgIDogY29tbWl0LmFwcGx5KHRoaXMuJHN0b3JlLCBbdmFsXS5jb25jYXQoYXJncykpXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZ2V0dGluZyB0aGUgZ2V0dGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZ2V0dGVyc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgbWFwR2V0dGVycyA9IG5vcm1hbGl6ZU5hbWVzcGFjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBnZXR0ZXJzKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgbm9ybWFsaXplTWFwKGdldHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgIHZhciBrZXkgPSByZWYua2V5O1xuICAgIHZhciB2YWwgPSByZWYudmFsO1xuXG4gICAgLy8gVGhlIG5hbWVzcGFjZSBoYXMgYmVlbiBtdXRhdGVkIGJ5IG5vcm1hbGl6ZU5hbWVzcGFjZVxuICAgIHZhbCA9IG5hbWVzcGFjZSArIHZhbDtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZEdldHRlciAoKSB7XG4gICAgICBpZiAobmFtZXNwYWNlICYmICFnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcEdldHRlcnMnLCBuYW1lc3BhY2UpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgISh2YWwgaW4gdGhpcy4kc3RvcmUuZ2V0dGVycykpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBnZXR0ZXI6IFwiICsgdmFsKSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnNbdmFsXVxuICAgIH07XG4gICAgLy8gbWFyayB2dWV4IGdldHRlciBmb3IgZGV2dG9vbHNcbiAgICByZXNba2V5XS52dWV4ID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZGlzcGF0Y2ggdGhlIGFjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gYWN0aW9ucyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IGBkaXNwYXRjaGAgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IHBhcmFtLCBpdCBjYW4gYWNjZXB0IGFudGhvciBwYXJhbXMuIFlvdSBjYW4gZGlzcGF0Y2ggYWN0aW9uIGFuZCBkbyBhbnkgb3RoZXIgdGhpbmdzIGluIHRoaXMgZnVuY3Rpb24uIHNwZWNpYWxseSwgWW91IG5lZWQgdG8gcGFzcyBhbnRob3IgcGFyYW1zIGZyb20gdGhlIG1hcHBlZCBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudmFyIG1hcEFjdGlvbnMgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgYWN0aW9ucykge1xuICB2YXIgcmVzID0ge307XG4gIG5vcm1hbGl6ZU1hcChhY3Rpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICB2YXIga2V5ID0gcmVmLmtleTtcbiAgICB2YXIgdmFsID0gcmVmLnZhbDtcblxuICAgIHJlc1trZXldID0gZnVuY3Rpb24gbWFwcGVkQWN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICAvLyBnZXQgZGlzcGF0Y2ggZnVuY3Rpb24gZnJvbSBzdG9yZVxuICAgICAgdmFyIGRpc3BhdGNoID0gdGhpcy4kc3RvcmUuZGlzcGF0Y2g7XG4gICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcEFjdGlvbnMnLCBuYW1lc3BhY2UpO1xuICAgICAgICBpZiAoIW1vZHVsZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoID0gbW9kdWxlLmNvbnRleHQuZGlzcGF0Y2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHZhbC5hcHBseSh0aGlzLCBbZGlzcGF0Y2hdLmNvbmNhdChhcmdzKSlcbiAgICAgICAgOiBkaXNwYXRjaC5hcHBseSh0aGlzLiRzdG9yZSwgW3ZhbF0uY29uY2F0KGFyZ3MpKVxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gcmVzXG59KTtcblxuLyoqXG4gKiBSZWJpbmRpbmcgbmFtZXNwYWNlIHBhcmFtIGZvciBtYXBYWFggZnVuY3Rpb24gaW4gc3BlY2lhbCBzY29wZWQsIGFuZCByZXR1cm4gdGhlbSBieSBzaW1wbGUgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBjcmVhdGVOYW1lc3BhY2VkSGVscGVycyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UpIHsgcmV0dXJuICh7XG4gIG1hcFN0YXRlOiBtYXBTdGF0ZS5iaW5kKG51bGwsIG5hbWVzcGFjZSksXG4gIG1hcEdldHRlcnM6IG1hcEdldHRlcnMuYmluZChudWxsLCBuYW1lc3BhY2UpLFxuICBtYXBNdXRhdGlvbnM6IG1hcE11dGF0aW9ucy5iaW5kKG51bGwsIG5hbWVzcGFjZSksXG4gIG1hcEFjdGlvbnM6IG1hcEFjdGlvbnMuYmluZChudWxsLCBuYW1lc3BhY2UpXG59KTsgfTtcblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIG1hcFxuICogbm9ybWFsaXplTWFwKFsxLCAyLCAzXSkgPT4gWyB7IGtleTogMSwgdmFsOiAxIH0sIHsga2V5OiAyLCB2YWw6IDIgfSwgeyBrZXk6IDMsIHZhbDogMyB9IF1cbiAqIG5vcm1hbGl6ZU1hcCh7YTogMSwgYjogMiwgYzogM30pID0+IFsgeyBrZXk6ICdhJywgdmFsOiAxIH0sIHsga2V5OiAnYicsIHZhbDogMiB9LCB7IGtleTogJ2MnLCB2YWw6IDMgfSBdXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gbWFwXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcCAobWFwKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG1hcClcbiAgICA/IG1hcC5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKHsga2V5OiBrZXksIHZhbDoga2V5IH0pOyB9KVxuICAgIDogT2JqZWN0LmtleXMobWFwKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKHsga2V5OiBrZXksIHZhbDogbWFwW2tleV0gfSk7IH0pXG59XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gZXhwZWN0IHR3byBwYXJhbSBjb250YWlucyBuYW1lc3BhY2UgYW5kIG1hcC4gaXQgd2lsbCBub3JtYWxpemUgdGhlIG5hbWVzcGFjZSBhbmQgdGhlbiB0aGUgcGFyYW0ncyBmdW5jdGlvbiB3aWxsIGhhbmRsZSB0aGUgbmV3IG5hbWVzcGFjZSBhbmQgdGhlIG1hcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTmFtZXNwYWNlIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWFwKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICBtYXAgPSBuYW1lc3BhY2U7XG4gICAgICBuYW1lc3BhY2UgPSAnJztcbiAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZS5jaGFyQXQobmFtZXNwYWNlLmxlbmd0aCAtIDEpICE9PSAnLycpIHtcbiAgICAgIG5hbWVzcGFjZSArPSAnLyc7XG4gICAgfVxuICAgIHJldHVybiBmbihuYW1lc3BhY2UsIG1hcClcbiAgfVxufVxuXG4vKipcbiAqIFNlYXJjaCBhIHNwZWNpYWwgbW9kdWxlIGZyb20gc3RvcmUgYnkgbmFtZXNwYWNlLiBpZiBtb2R1bGUgbm90IGV4aXN0LCBwcmludCBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3R9IHN0b3JlXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVscGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldE1vZHVsZUJ5TmFtZXNwYWNlIChzdG9yZSwgaGVscGVyLCBuYW1lc3BhY2UpIHtcbiAgdmFyIG1vZHVsZSA9IHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwW25hbWVzcGFjZV07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFtb2R1bGUpIHtcbiAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSBtb2R1bGUgbmFtZXNwYWNlIG5vdCBmb3VuZCBpbiBcIiArIGhlbHBlciArIFwiKCk6IFwiICsgbmFtZXNwYWNlKSk7XG4gIH1cbiAgcmV0dXJuIG1vZHVsZVxufVxuXG52YXIgaW5kZXhfZXNtID0ge1xuICBTdG9yZTogU3RvcmUsXG4gIGluc3RhbGw6IGluc3RhbGwsXG4gIHZlcnNpb246ICczLjEuMScsXG4gIG1hcFN0YXRlOiBtYXBTdGF0ZSxcbiAgbWFwTXV0YXRpb25zOiBtYXBNdXRhdGlvbnMsXG4gIG1hcEdldHRlcnM6IG1hcEdldHRlcnMsXG4gIG1hcEFjdGlvbnM6IG1hcEFjdGlvbnMsXG4gIGNyZWF0ZU5hbWVzcGFjZWRIZWxwZXJzOiBjcmVhdGVOYW1lc3BhY2VkSGVscGVyc1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaW5kZXhfZXNtO1xuZXhwb3J0IHsgU3RvcmUsIGluc3RhbGwsIG1hcFN0YXRlLCBtYXBNdXRhdGlvbnMsIG1hcEdldHRlcnMsIG1hcEFjdGlvbnMsIGNyZWF0ZU5hbWVzcGFjZWRIZWxwZXJzIH07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\n");

/***/ }),

/***/ "./node_modules/_webpack@4.41.2@webpack/buildin/global.js":
/*!***********************************!*\
  !*** (webpack)/buildin/global.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3dlYnBhY2tANC40MS4yQHdlYnBhY2svYnVpbGRpbi9nbG9iYWwuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/_webpack@4.41.2@webpack/buildin/global.js\n");

/***/ }),

/***/ "./node_modules/_xhr@2.4.0@xhr/index.js":
/*!**********************************************!*\
  !*** ./node_modules/_xhr@2.4.0@xhr/index.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
eval("\nvar window = __webpack_require__(/*! global/window */ \"./node_modules/_global@4.3.2@global/window.js\")\nvar isFunction = __webpack_require__(/*! is-function */ \"./node_modules/_is-function@1.0.1@is-function/index.js\")\nvar parseHeaders = __webpack_require__(/*! parse-headers */ \"./node_modules/_parse-headers@2.0.3@parse-headers/parse-headers.js\")\nvar xtend = __webpack_require__(/*! xtend */ \"./node_modules/_xtend@4.0.2@xtend/immutable.js\")\n\nmodule.exports = createXHR\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop\ncreateXHR.XDomainRequest = \"withCredentials\" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest\n\nforEachArray([\"get\", \"put\", \"post\", \"patch\", \"head\", \"delete\"], function(method) {\n    createXHR[method === \"delete\" ? \"del\" : method] = function(uri, options, callback) {\n        options = initParams(uri, options, callback)\n        options.method = method.toUpperCase()\n        return _createXHR(options)\n    }\n})\n\nfunction forEachArray(array, iterator) {\n    for (var i = 0; i < array.length; i++) {\n        iterator(array[i])\n    }\n}\n\nfunction isEmpty(obj){\n    for(var i in obj){\n        if(obj.hasOwnProperty(i)) return false\n    }\n    return true\n}\n\nfunction initParams(uri, options, callback) {\n    var params = uri\n\n    if (isFunction(options)) {\n        callback = options\n        if (typeof uri === \"string\") {\n            params = {uri:uri}\n        }\n    } else {\n        params = xtend(options, {uri: uri})\n    }\n\n    params.callback = callback\n    return params\n}\n\nfunction createXHR(uri, options, callback) {\n    options = initParams(uri, options, callback)\n    return _createXHR(options)\n}\n\nfunction _createXHR(options) {\n    if(typeof options.callback === \"undefined\"){\n        throw new Error(\"callback argument missing\")\n    }\n\n    var called = false\n    var callback = function cbOnce(err, response, body){\n        if(!called){\n            called = true\n            options.callback(err, response, body)\n        }\n    }\n\n    function readystatechange() {\n        if (xhr.readyState === 4) {\n            setTimeout(loadFunc, 0)\n        }\n    }\n\n    function getBody() {\n        // Chrome with requestType=blob throws errors arround when even testing access to responseText\n        var body = undefined\n\n        if (xhr.response) {\n            body = xhr.response\n        } else {\n            body = xhr.responseText || getXml(xhr)\n        }\n\n        if (isJson) {\n            try {\n                body = JSON.parse(body)\n            } catch (e) {}\n        }\n\n        return body\n    }\n\n    function errorFunc(evt) {\n        clearTimeout(timeoutTimer)\n        if(!(evt instanceof Error)){\n            evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\") )\n        }\n        evt.statusCode = 0\n        return callback(evt, failureResponse)\n    }\n\n    // will load the data & process the response in a special response object\n    function loadFunc() {\n        if (aborted) return\n        var status\n        clearTimeout(timeoutTimer)\n        if(options.useXDR && xhr.status===undefined) {\n            //IE8 CORS GET successful response doesn't have a status field, but body is fine\n            status = 200\n        } else {\n            status = (xhr.status === 1223 ? 204 : xhr.status)\n        }\n        var response = failureResponse\n        var err = null\n\n        if (status !== 0){\n            response = {\n                body: getBody(),\n                statusCode: status,\n                method: method,\n                headers: {},\n                url: uri,\n                rawRequest: xhr\n            }\n            if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE\n                response.headers = parseHeaders(xhr.getAllResponseHeaders())\n            }\n        } else {\n            err = new Error(\"Internal XMLHttpRequest Error\")\n        }\n        return callback(err, response, response.body)\n    }\n\n    var xhr = options.xhr || null\n\n    if (!xhr) {\n        if (options.cors || options.useXDR) {\n            xhr = new createXHR.XDomainRequest()\n        }else{\n            xhr = new createXHR.XMLHttpRequest()\n        }\n    }\n\n    var key\n    var aborted\n    var uri = xhr.url = options.uri || options.url\n    var method = xhr.method = options.method || \"GET\"\n    var body = options.body || options.data\n    var headers = xhr.headers = options.headers || {}\n    var sync = !!options.sync\n    var isJson = false\n    var timeoutTimer\n    var failureResponse = {\n        body: undefined,\n        headers: {},\n        statusCode: 0,\n        method: method,\n        url: uri,\n        rawRequest: xhr\n    }\n\n    if (\"json\" in options && options.json !== false) {\n        isJson = true\n        headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\") //Don't override existing accept header declared by user\n        if (method !== \"GET\" && method !== \"HEAD\") {\n            headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\") //Don't override existing accept header declared by user\n            body = JSON.stringify(options.json === true ? body : options.json)\n        }\n    }\n\n    xhr.onreadystatechange = readystatechange\n    xhr.onload = loadFunc\n    xhr.onerror = errorFunc\n    // IE9 must have onprogress be set to a unique function.\n    xhr.onprogress = function () {\n        // IE must die\n    }\n    xhr.onabort = function(){\n        aborted = true;\n    }\n    xhr.ontimeout = errorFunc\n    xhr.open(method, uri, !sync, options.username, options.password)\n    //has to be after open\n    if(!sync) {\n        xhr.withCredentials = !!options.withCredentials\n    }\n    // Cannot set timeout with sync request\n    // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n    // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n    if (!sync && options.timeout > 0 ) {\n        timeoutTimer = setTimeout(function(){\n            if (aborted) return\n            aborted = true//IE9 may still call readystatechange\n            xhr.abort(\"timeout\")\n            var e = new Error(\"XMLHttpRequest timeout\")\n            e.code = \"ETIMEDOUT\"\n            errorFunc(e)\n        }, options.timeout )\n    }\n\n    if (xhr.setRequestHeader) {\n        for(key in headers){\n            if(headers.hasOwnProperty(key)){\n                xhr.setRequestHeader(key, headers[key])\n            }\n        }\n    } else if (options.headers && !isEmpty(options.headers)) {\n        throw new Error(\"Headers cannot be set on an XDomainRequest object\")\n    }\n\n    if (\"responseType\" in options) {\n        xhr.responseType = options.responseType\n    }\n\n    if (\"beforeSend\" in options &&\n        typeof options.beforeSend === \"function\"\n    ) {\n        options.beforeSend(xhr)\n    }\n\n    // Microsoft Edge browser sends \"undefined\" when send is called with undefined value.\n    // XMLHttpRequest spec says to pass null as body to indicate no body\n    // See https://github.com/naugtur/xhr/issues/100.\n    xhr.send(body || null)\n\n    return xhr\n\n\n}\n\nfunction getXml(xhr) {\n    if (xhr.responseType === \"document\") {\n        return xhr.responseXML\n    }\n    var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === \"parsererror\"\n    if (xhr.responseType === \"\" && !firefoxBugTakenEffect) {\n        return xhr.responseXML\n    }\n\n    return null\n}\n\nfunction noop() {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3hockAyLjQuMEB4aHIvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvX3hockAyLjQuMEB4aHIvaW5kZXguanM/ZWFmOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciB3aW5kb3cgPSByZXF1aXJlKFwiZ2xvYmFsL3dpbmRvd1wiKVxudmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKFwiaXMtZnVuY3Rpb25cIilcbnZhciBwYXJzZUhlYWRlcnMgPSByZXF1aXJlKFwicGFyc2UtaGVhZGVyc1wiKVxudmFyIHh0ZW5kID0gcmVxdWlyZShcInh0ZW5kXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlWEhSXG5jcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgfHwgbm9vcFxuY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0ID0gXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiAobmV3IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCgpKSA/IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCA6IHdpbmRvdy5YRG9tYWluUmVxdWVzdFxuXG5mb3JFYWNoQXJyYXkoW1wiZ2V0XCIsIFwicHV0XCIsIFwicG9zdFwiLCBcInBhdGNoXCIsIFwiaGVhZFwiLCBcImRlbGV0ZVwiXSwgZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgY3JlYXRlWEhSW21ldGhvZCA9PT0gXCJkZWxldGVcIiA/IFwiZGVsXCIgOiBtZXRob2RdID0gZnVuY3Rpb24odXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBvcHRpb25zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgICBvcHRpb25zLm1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgICAgIHJldHVybiBfY3JlYXRlWEhSKG9wdGlvbnMpXG4gICAgfVxufSlcblxuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvcikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlcmF0b3IoYXJyYXlbaV0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0VtcHR5KG9iail7XG4gICAgZm9yKHZhciBpIGluIG9iail7XG4gICAgICAgIGlmKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIHZhciBwYXJhbXMgPSB1cmlcblxuICAgIGlmIChpc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuICAgICAgICBpZiAodHlwZW9mIHVyaSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcGFyYW1zID0ge3VyaTp1cml9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMgPSB4dGVuZChvcHRpb25zLCB7dXJpOiB1cml9KVxuICAgIH1cblxuICAgIHBhcmFtcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5mdW5jdGlvbiBjcmVhdGVYSFIodXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIG9wdGlvbnMgPSBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgcmV0dXJuIF9jcmVhdGVYSFIob3B0aW9ucylcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVhIUihvcHRpb25zKSB7XG4gICAgaWYodHlwZW9mIG9wdGlvbnMuY2FsbGJhY2sgPT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWxsYmFjayBhcmd1bWVudCBtaXNzaW5nXCIpXG4gICAgfVxuXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlXG4gICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2JPbmNlKGVyciwgcmVzcG9uc2UsIGJvZHkpe1xuICAgICAgICBpZighY2FsbGVkKXtcbiAgICAgICAgICAgIGNhbGxlZCA9IHRydWVcbiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2soZXJyLCByZXNwb25zZSwgYm9keSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChsb2FkRnVuYywgMClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gICAgICAgIC8vIENocm9tZSB3aXRoIHJlcXVlc3RUeXBlPWJsb2IgdGhyb3dzIGVycm9ycyBhcnJvdW5kIHdoZW4gZXZlbiB0ZXN0aW5nIGFjY2VzcyB0byByZXNwb25zZVRleHRcbiAgICAgICAgdmFyIGJvZHkgPSB1bmRlZmluZWRcblxuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlVGV4dCB8fCBnZXRYbWwoeGhyKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSnNvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBib2R5XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJyb3JGdW5jKGV2dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKVxuICAgICAgICBpZighKGV2dCBpbnN0YW5jZW9mIEVycm9yKSl7XG4gICAgICAgICAgICBldnQgPSBuZXcgRXJyb3IoXCJcIiArIChldnQgfHwgXCJVbmtub3duIFhNTEh0dHBSZXF1ZXN0IEVycm9yXCIpIClcbiAgICAgICAgfVxuICAgICAgICBldnQuc3RhdHVzQ29kZSA9IDBcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGV2dCwgZmFpbHVyZVJlc3BvbnNlKVxuICAgIH1cblxuICAgIC8vIHdpbGwgbG9hZCB0aGUgZGF0YSAmIHByb2Nlc3MgdGhlIHJlc3BvbnNlIGluIGEgc3BlY2lhbCByZXNwb25zZSBvYmplY3RcbiAgICBmdW5jdGlvbiBsb2FkRnVuYygpIHtcbiAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVyblxuICAgICAgICB2YXIgc3RhdHVzXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0VGltZXIpXG4gICAgICAgIGlmKG9wdGlvbnMudXNlWERSICYmIHhoci5zdGF0dXM9PT11bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vSUU4IENPUlMgR0VUIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZG9lc24ndCBoYXZlIGEgc3RhdHVzIGZpZWxkLCBidXQgYm9keSBpcyBmaW5lXG4gICAgICAgICAgICBzdGF0dXMgPSAyMDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cyA9ICh4aHIuc3RhdHVzID09PSAxMjIzID8gMjA0IDogeGhyLnN0YXR1cylcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBmYWlsdXJlUmVzcG9uc2VcbiAgICAgICAgdmFyIGVyciA9IG51bGxcblxuICAgICAgICBpZiAoc3RhdHVzICE9PSAwKXtcbiAgICAgICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIGJvZHk6IGdldEJvZHkoKSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiBzdGF0dXMsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICAgICAgcmF3UmVxdWVzdDogeGhyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKXsgLy9yZW1lbWJlciB4aHIgY2FuIGluIGZhY3QgYmUgWERSIGZvciBDT1JTIGluIElFXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXCJJbnRlcm5hbCBYTUxIdHRwUmVxdWVzdCBFcnJvclwiKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHJlc3BvbnNlLCByZXNwb25zZS5ib2R5KVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBvcHRpb25zLnhociB8fCBudWxsXG5cbiAgICBpZiAoIXhocikge1xuICAgICAgICBpZiAob3B0aW9ucy5jb3JzIHx8IG9wdGlvbnMudXNlWERSKSB7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0KClcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlcbiAgICB2YXIgYWJvcnRlZFxuICAgIHZhciB1cmkgPSB4aHIudXJsID0gb3B0aW9ucy51cmkgfHwgb3B0aW9ucy51cmxcbiAgICB2YXIgbWV0aG9kID0geGhyLm1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiR0VUXCJcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keSB8fCBvcHRpb25zLmRhdGFcbiAgICB2YXIgaGVhZGVycyA9IHhoci5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9XG4gICAgdmFyIHN5bmMgPSAhIW9wdGlvbnMuc3luY1xuICAgIHZhciBpc0pzb24gPSBmYWxzZVxuICAgIHZhciB0aW1lb3V0VGltZXJcbiAgICB2YXIgZmFpbHVyZVJlc3BvbnNlID0ge1xuICAgICAgICBib2R5OiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgdXJsOiB1cmksXG4gICAgICAgIHJhd1JlcXVlc3Q6IHhoclxuICAgIH1cblxuICAgIGlmIChcImpzb25cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuanNvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgaXNKc29uID0gdHJ1ZVxuICAgICAgICBoZWFkZXJzW1wiYWNjZXB0XCJdIHx8IGhlYWRlcnNbXCJBY2NlcHRcIl0gfHwgKGhlYWRlcnNbXCJBY2NlcHRcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdIHx8IGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gfHwgKGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmpzb24gPT09IHRydWUgPyBib2R5IDogb3B0aW9ucy5qc29uKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlYWR5c3RhdGVjaGFuZ2VcbiAgICB4aHIub25sb2FkID0gbG9hZEZ1bmNcbiAgICB4aHIub25lcnJvciA9IGVycm9yRnVuY1xuICAgIC8vIElFOSBtdXN0IGhhdmUgb25wcm9ncmVzcyBiZSBzZXQgdG8gYSB1bmlxdWUgZnVuY3Rpb24uXG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElFIG11c3QgZGllXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBlcnJvckZ1bmNcbiAgICB4aHIub3BlbihtZXRob2QsIHVyaSwgIXN5bmMsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQpXG4gICAgLy9oYXMgdG8gYmUgYWZ0ZXIgb3BlblxuICAgIGlmKCFzeW5jKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSAhIW9wdGlvbnMud2l0aENyZWRlbnRpYWxzXG4gICAgfVxuICAgIC8vIENhbm5vdCBzZXQgdGltZW91dCB3aXRoIHN5bmMgcmVxdWVzdFxuICAgIC8vIG5vdCBzZXR0aW5nIHRpbWVvdXQgb24gdGhlIHhociBvYmplY3QsIGJlY2F1c2Ugb2Ygb2xkIHdlYmtpdHMgZXRjLiBub3QgaGFuZGxpbmcgdGhhdCBjb3JyZWN0bHlcbiAgICAvLyBib3RoIG5wbSdzIHJlcXVlc3QgYW5kIGpxdWVyeSAxLnggdXNlIHRoaXMga2luZCBvZiB0aW1lb3V0LCBzbyB0aGlzIGlzIGJlaW5nIGNvbnNpc3RlbnRcbiAgICBpZiAoIXN5bmMgJiYgb3B0aW9ucy50aW1lb3V0ID4gMCApIHtcbiAgICAgICAgdGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVyblxuICAgICAgICAgICAgYWJvcnRlZCA9IHRydWUvL0lFOSBtYXkgc3RpbGwgY2FsbCByZWFkeXN0YXRlY2hhbmdlXG4gICAgICAgICAgICB4aHIuYWJvcnQoXCJ0aW1lb3V0XCIpXG4gICAgICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihcIlhNTEh0dHBSZXF1ZXN0IHRpbWVvdXRcIilcbiAgICAgICAgICAgIGUuY29kZSA9IFwiRVRJTUVET1VUXCJcbiAgICAgICAgICAgIGVycm9yRnVuYyhlKVxuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQgKVxuICAgIH1cblxuICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikge1xuICAgICAgICBmb3Ioa2V5IGluIGhlYWRlcnMpe1xuICAgICAgICAgICAgaWYoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5oZWFkZXJzICYmICFpc0VtcHR5KG9wdGlvbnMuaGVhZGVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVhZGVycyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEb21haW5SZXF1ZXN0IG9iamVjdFwiKVxuICAgIH1cblxuICAgIGlmIChcInJlc3BvbnNlVHlwZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IG9wdGlvbnMucmVzcG9uc2VUeXBlXG4gICAgfVxuXG4gICAgaWYgKFwiYmVmb3JlU2VuZFwiIGluIG9wdGlvbnMgJiZcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmVmb3JlU2VuZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICAgIG9wdGlvbnMuYmVmb3JlU2VuZCh4aHIpXG4gICAgfVxuXG4gICAgLy8gTWljcm9zb2Z0IEVkZ2UgYnJvd3NlciBzZW5kcyBcInVuZGVmaW5lZFwiIHdoZW4gc2VuZCBpcyBjYWxsZWQgd2l0aCB1bmRlZmluZWQgdmFsdWUuXG4gICAgLy8gWE1MSHR0cFJlcXVlc3Qgc3BlYyBzYXlzIHRvIHBhc3MgbnVsbCBhcyBib2R5IHRvIGluZGljYXRlIG5vIGJvZHlcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25hdWd0dXIveGhyL2lzc3Vlcy8xMDAuXG4gICAgeGhyLnNlbmQoYm9keSB8fCBudWxsKVxuXG4gICAgcmV0dXJuIHhoclxuXG5cbn1cblxuZnVuY3Rpb24gZ2V0WG1sKHhocikge1xuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcImRvY3VtZW50XCIpIHtcbiAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTFxuICAgIH1cbiAgICB2YXIgZmlyZWZveEJ1Z1Rha2VuRWZmZWN0ID0geGhyLnJlc3BvbnNlWE1MICYmIHhoci5yZXNwb25zZVhNTC5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgPT09IFwicGFyc2VyZXJyb3JcIlxuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcIlwiICYmICFmaXJlZm94QnVnVGFrZW5FZmZlY3QpIHtcbiAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/_xhr@2.4.0@xhr/index.js\n");

/***/ }),

/***/ "./node_modules/_xtend@4.0.2@xtend/immutable.js":
/*!******************************************************!*\
  !*** ./node_modules/_xtend@4.0.2@xtend/immutable.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n    var target = {}\n\n    for (var i = 0; i < arguments.length; i++) {\n        var source = arguments[i]\n\n        for (var key in source) {\n            if (hasOwnProperty.call(source, key)) {\n                target[key] = source[key]\n            }\n        }\n    }\n\n    return target\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvX3h0ZW5kQDQuMC4yQHh0ZW5kL2ltbXV0YWJsZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9feHRlbmRANC4wLjJAeHRlbmQvaW1tdXRhYmxlLmpzPzFlYmEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBleHRlbmRcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIHZhciB0YXJnZXQgPSB7fVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/_xtend@4.0.2@xtend/immutable.js\n");

/***/ }),

/***/ "./src/App.vue":
/*!*********************!*\
  !*** ./src/App.vue ***!
  \*********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./App.vue?vue&type=template&id=7ba5bd90& */ \"./src/App.vue?vue&type=template&id=7ba5bd90&\");\n/* harmony import */ var _App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./App.vue?vue&type=script&lang=js& */ \"./src/App.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./App.vue?vue&type=style&index=0&lang=scss& */ \"./src/App.vue?vue&type=style&index=0&lang=scss&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n  _App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n  _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n  false,\n  null,\n  null,\n  null\n  \n)\n\n/* hot reload */\nif (true) {\n  var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n  api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n  if (api.compatible) {\n    module.hot.accept()\n    if (!api.isRecorded('7ba5bd90')) {\n      api.createRecord('7ba5bd90', component.options)\n    } else {\n      api.reload('7ba5bd90', component.options)\n    }\n    module.hot.accept(/*! ./App.vue?vue&type=template&id=7ba5bd90& */ \"./src/App.vue?vue&type=template&id=7ba5bd90&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./App.vue?vue&type=template&id=7ba5bd90& */ \"./src/App.vue?vue&type=template&id=7ba5bd90&\");\n(function () {\n      api.rerender('7ba5bd90', {\n        render: _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n        staticRenderFns: _App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n      })\n    })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n  }\n}\ncomponent.options.__file = \"src/App.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvQXBwLnZ1ZS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9BcHAudnVlPzVkYzMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSBmcm9tIFwiLi9BcHAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdiYTViZDkwJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL0FwcC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL0FwcC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcIlxudmFyIGNvbXBvbmVudCA9IG5vcm1hbGl6ZXIoXG4gIHNjcmlwdCxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAobW9kdWxlLmhvdCkge1xuICB2YXIgYXBpID0gcmVxdWlyZShcIi9Vc2Vycy9qb2UvRG9jdW1lbnRzL2dpdC9waW5nYW4vaGtsaWZlL3Bpbmdhbi1saWZlLWluZGV4LXByby9ub2RlX21vZHVsZXMvX3Z1ZS1ob3QtcmVsb2FkLWFwaUAyLjMuNEB2dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qc1wiKVxuICBhcGkuaW5zdGFsbChyZXF1aXJlKCd2dWUnKSlcbiAgaWYgKGFwaS5jb21wYXRpYmxlKSB7XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICAgIGlmICghYXBpLmlzUmVjb3JkZWQoJzdiYTViZDkwJykpIHtcbiAgICAgIGFwaS5jcmVhdGVSZWNvcmQoJzdiYTViZDkwJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZWxvYWQoJzdiYTViZDkwJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfVxuICAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9BcHAudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTdiYTViZDkwJlwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhcGkucmVyZW5kZXIoJzdiYTViZDkwJywge1xuICAgICAgICByZW5kZXI6IHJlbmRlcixcbiAgICAgICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0aWNSZW5kZXJGbnNcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJzcmMvQXBwLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/App.vue\n");

/***/ }),

/***/ "./src/App.vue?vue&type=script&lang=js&":
/*!**********************************************!*\
  !*** ./src/App.vue?vue&type=script&lang=js& ***!
  \**********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../node_modules/_babel-loader@8.0.6@babel-loader/lib!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT8wYzc2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0FwcC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0FwcC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/App.vue?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./src/App.vue?vue&type=style&index=0&lang=scss&":
/*!*******************************************************!*\
  !*** ./src/App.vue?vue&type=style&index=0&lang=scss& ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=style&index=0&lang=scss&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_style_index_0_lang_scss___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT84ZjU1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTAhLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vQXBwLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmxhbmc9c2NzcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMCEuLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9BcHAudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmbGFuZz1zY3NzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/App.vue?vue&type=style&index=0&lang=scss&\n");

/***/ }),

/***/ "./src/App.vue?vue&type=template&id=7ba5bd90&":
/*!****************************************************!*\
  !*** ./src/App.vue?vue&type=template&id=7ba5bd90& ***!
  \****************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./App.vue?vue&type=template&id=7ba5bd90& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"274ecb62-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/App.vue?vue&type=template&id=7ba5bd90&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_App_vue_vue_type_template_id_7ba5bd90___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvQXBwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YmE1YmQ5MCYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQXBwLnZ1ZT9hNGQzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCItIWNhY2hlLWxvYWRlcj97XFxcImNhY2hlRGlyZWN0b3J5XFxcIjpcXFwibm9kZV9tb2R1bGVzLy5jYWNoZS92dWUtbG9hZGVyXFxcIixcXFwiY2FjaGVJZGVudGlmaWVyXFxcIjpcXFwiMjc0ZWNiNjItdnVlLWxvYWRlci10ZW1wbGF0ZVxcXCJ9IS4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vQXBwLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD03YmE1YmQ5MCZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/App.vue?vue&type=template&id=7ba5bd90&\n");

/***/ }),

/***/ "./src/api/api.js":
/*!************************!*\
  !*** ./src/api/api.js ***!
  \************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = {\n  load: \"/pingan_hklife_webapi/user/load\",\n  logout: \"/pingan_hklife_webapi/user/logout\",\n  // 基本信息\n  baseInfo: \"/pingan_hklife_webapi/user/baseInfo\",\n  // 用户身份信息\n  profile: \"/pingan_hklife_webapi/user/profile\",\n  // 是否显示图形验证码接口\n  stdIsShowImageVcode: \"/pingan_hklife_webapi/auth/stdIsShowImageVcode\",\n  // 刷新图形验证码接口\n  stdRefreshVcode: \"/pingan_hklife_webapi/auth/stdRefreshVcode\",\n  // OTP发送接口\n  stdSendOTP: \"/pingan_hklife_webapi/auth/stdSendOTP\",\n  // OTP验证与验重接口\n  stdValidateOTPandRepeat: \"/pingan_hklife_webapi/auth/stdValidateOTPandRepeat\",\n  // 注册手机号验重接口\n  gsRegCheck: \"/pingan_hklife_webapi/auth/gsRegCheck\",\n  // 账户整合登录接口\n  gsLogin: \"/pingan_hklife_webapi/auth/gsLogin\",\n  // 注册接口\n  stdRegister: \"/pingan_hklife_webapi/auth/stdRegister\",\n  // 修改密码\n  changePassword: \"/pingan_hklife_webapi/user/password/change\",\n  // 短信验证码登录\n  otpLogin: \"/pingan_hklife_webapi/user/otpLogin\",\n  // 短信验证码登录\n  otpRegisterAndLogin: \"/pingan_hklife_webapi/user/otpRegisterAndLogin\",\n  // 找回密码:定位用户信息\n  locateUserInfo: \"/pingan_hklife_webapi/reset/locateUserInfo\",\n  // 找回密码:发送验证码\n  sendOtp: \"/pingan_hklife_webapi/reset/sendOtp\",\n  // 找回密码:校验验证码\n  checkOtp: \"/pingan_hklife_webapi/reset/checkOtp\",\n  // 找回密码:重置密码\n  resetPwd: \"/pingan_hklife_webapi/reset/resetPwd\",\n  // 找回密码:重置密码\n  updateInformation: \"/pingan_hklife_webapi/user/updateInformation\",\n  // 读取联系方式\n  getContacts: \"/pingan_hklife_webapi/customService/contacts/get\",\n  // 更新联系方式\n  updateContacts: \"/pingan_hklife_webapi/customService/contacts/update\",\n  // 保存預約服務\n  saveReservation: \"/pingan_hklife_webapi/customService/reservation/save\",\n  // 保存投訴建議\n  saveComplain: \"/pingan_hklife_webapi/customService/complain/save\",\n  // 保单接口\n  policyList: \"/pingan_hklife_webapi/policy/list\",\n  // 保单接口\n  policyDetail: \"/pingan_hklife_webapi/policy/detail\",\n  // 保单聯系方式變更\n  updatePolicyContanct: \"/pingan_hklife_webapi/policy/updateContacts\",\n  // 保单客戶資料變更\n  updatePolicyInfo: \"/pingan_hklife_webapi/policy/updateInfo\",\n  // 证件上传\n  idPicUpload: \"/pingan_hklife_webapi/policy/idPicUpload\"\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXBpL2FwaS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hcGkvYXBpLmpzPzRlYzMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGxvYWQ6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3VzZXIvbG9hZFwiLFxuICBsb2dvdXQ6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3VzZXIvbG9nb3V0XCIsXG4gIC8vIOWfuuacrOS/oeaBr1xuICBiYXNlSW5mbzogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci9iYXNlSW5mb1wiLFxuICAvLyDnlKjmiLfouqvku73kv6Hmga9cbiAgcHJvZmlsZTogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci9wcm9maWxlXCIsXG4gIC8vIOaYr+WQpuaYvuekuuWbvuW9oumqjOivgeeggeaOpeWPo1xuICBzdGRJc1Nob3dJbWFnZVZjb2RlOiBcIi9waW5nYW5faGtsaWZlX3dlYmFwaS9hdXRoL3N0ZElzU2hvd0ltYWdlVmNvZGVcIixcbiAgLy8g5Yi35paw5Zu+5b2i6aqM6K+B56CB5o6l5Y+jXG4gIHN0ZFJlZnJlc2hWY29kZTogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvYXV0aC9zdGRSZWZyZXNoVmNvZGVcIixcbiAgLy8gT1RQ5Y+R6YCB5o6l5Y+jXG4gIHN0ZFNlbmRPVFA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2F1dGgvc3RkU2VuZE9UUFwiLFxuICAvLyBPVFDpqozor4HkuI7pqozph43mjqXlj6NcbiAgc3RkVmFsaWRhdGVPVFBhbmRSZXBlYXQ6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2F1dGgvc3RkVmFsaWRhdGVPVFBhbmRSZXBlYXRcIixcbiAgLy8g5rOo5YaM5omL5py65Y+36aqM6YeN5o6l5Y+jXG4gIGdzUmVnQ2hlY2s6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2F1dGgvZ3NSZWdDaGVja1wiLFxuICAvLyDotKbmiLfmlbTlkIjnmbvlvZXmjqXlj6NcbiAgZ3NMb2dpbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvYXV0aC9nc0xvZ2luXCIsXG4gIC8vIOazqOWGjOaOpeWPo1xuICBzdGRSZWdpc3RlcjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvYXV0aC9zdGRSZWdpc3RlclwiLFxuICAvLyDkv67mlLnlr4bnoIFcbiAgY2hhbmdlUGFzc3dvcmQ6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3VzZXIvcGFzc3dvcmQvY2hhbmdlXCIsXG4gIC8vIOefreS/oemqjOivgeeggeeZu+W9lVxuICBvdHBMb2dpbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci9vdHBMb2dpblwiLFxuICAvLyDnn63kv6Hpqozor4HnoIHnmbvlvZVcbiAgb3RwUmVnaXN0ZXJBbmRMb2dpbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci9vdHBSZWdpc3RlckFuZExvZ2luXCIsXG4gIC8vIOaJvuWbnuWvhuegge+8muWumuS9jeeUqOaIt+S/oeaBr1xuICBsb2NhdGVVc2VySW5mbzogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcmVzZXQvbG9jYXRlVXNlckluZm9cIixcbiAgLy8g5om+5Zue5a+G56CB77ya5Y+R6YCB6aqM6K+B56CBXG4gIHNlbmRPdHA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3Jlc2V0L3NlbmRPdHBcIixcbiAgLy8g5om+5Zue5a+G56CB77ya5qCh6aqM6aqM6K+B56CBXG4gIGNoZWNrT3RwOiBcIi9waW5nYW5faGtsaWZlX3dlYmFwaS9yZXNldC9jaGVja090cFwiLFxuICAvLyDmib7lm57lr4bnoIHvvJrph43nva7lr4bnoIFcbiAgcmVzZXRQd2Q6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3Jlc2V0L3Jlc2V0UHdkXCIsXG4gIC8vIOaJvuWbnuWvhuegge+8mumHjee9ruWvhueggVxuICB1cGRhdGVJbmZvcm1hdGlvbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvdXNlci91cGRhdGVJbmZvcm1hdGlvblwiLFxuICAvLyDor7vlj5bogZTns7vmlrnlvI9cbiAgZ2V0Q29udGFjdHM6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2N1c3RvbVNlcnZpY2UvY29udGFjdHMvZ2V0XCIsXG4gIC8vIOabtOaWsOiBlOezu+aWueW8j1xuICB1cGRhdGVDb250YWN0czogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvY3VzdG9tU2VydmljZS9jb250YWN0cy91cGRhdGVcIixcbiAgLy8g5L+d5a2Y6aCQ57SE5pyN5YuZXG4gIHNhdmVSZXNlcnZhdGlvbjogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvY3VzdG9tU2VydmljZS9yZXNlcnZhdGlvbi9zYXZlXCIsXG4gIC8vIOS/neWtmOaKleiotOW7uuitsFxuICBzYXZlQ29tcGxhaW46IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL2N1c3RvbVNlcnZpY2UvY29tcGxhaW4vc2F2ZVwiLFxuXG4gIC8vIOS/neWNleaOpeWPo1xuICBwb2xpY3lMaXN0IDogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcG9saWN5L2xpc3RcIixcbiAgLy8g5L+d5Y2V5o6l5Y+jXG4gIHBvbGljeURldGFpbCA6IFwiL3Bpbmdhbl9oa2xpZmVfd2ViYXBpL3BvbGljeS9kZXRhaWxcIixcbiAgLy8g5L+d5Y2V6IGv57O75pa55byP6K6K5pu0XG4gIHVwZGF0ZVBvbGljeUNvbnRhbmN0IDogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcG9saWN5L3VwZGF0ZUNvbnRhY3RzXCIsXG4gIC8vIOS/neWNleWuouaItuizh+aWmeiuiuabtFxuICB1cGRhdGVQb2xpY3lJbmZvIDogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcG9saWN5L3VwZGF0ZUluZm9cIixcbiAgLy8g6K+B5Lu25LiK5LygXG4gIGlkUGljVXBsb2FkIDogXCIvcGluZ2FuX2hrbGlmZV93ZWJhcGkvcG9saWN5L2lkUGljVXBsb2FkXCIsXG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXZEQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/api/api.js\n");

/***/ }),

/***/ "./src/api/fetch-api.js":
/*!******************************!*\
  !*** ./src/api/fetch-api.js ***!
  \******************************/
/*! exports provided: httpGet, httpPost, formdata */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"httpGet\", function() { return httpGet; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"httpPost\", function() { return httpPost; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formdata\", function() { return formdata; });\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.regexp.replace */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js\");\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! axios */ \"./node_modules/_axios@0.19.0@axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _store_state_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/store/state.js */ \"./src/store/state.js\");\n\n\n // import {\n//   Toast\n// } from 'vant';\n\nfunction Toast(msg) {\n  console.log(\"msg:\", msg);\n} // axios的默认url\n// axios.defaults.baseURL = \"\"\n// 服务器地址\n// let base = process.env.REQUEST_DOMAIN || \"http://localhost:9101\";\n// let base = COM.baseUrl;\n// console.log(process.env);\n\n\nvar base = \"\";\nvar axios = axios__WEBPACK_IMPORTED_MODULE_1___default.a.create({\n  baseURL: \"https://ow.go.qudone.com\",\n  timeout: 5000\n}); // 请求拦截器\n// axios.interceptors.request.use(\n//   config => {\n//     // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了\n//     // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断\n//     const token = \"token\"; //这里写入token\n//     token && (config.headers.Authorization = token);\n//     return config;\n//   },\n//   error => {\n//     return Promise.error(error);\n//   })\n// 响应拦截器\n\naxios.interceptors.response.use(function (response) {\n  if (response.status === 200) {\n    if (response.data.code === 200) {\n      return Promise.resolve(response);\n    } else {\n      // Toast(response.data.bizMsg);\n      return Promise.reject(response.data);\n    }\n  } else {\n    return Promise.reject(response.data);\n  }\n}, // 服务器状态码不是200的情况\nfunction (error) {\n  if (error.response.status) {\n    switch (error.response.status) {\n      // 401: 未登录\n      // 未登录则跳转登录页面,并携带当前页面的路径\n      // 在登录成功后返回当前页面,这一步需要在登录页操作。\n      case 401:\n        router.replace({\n          path: '/login',\n          query: {\n            redirect: router.currentRoute.fullPath\n          }\n        });\n        break;\n      // 403 token过期\n      // 登录过期对用户进行提示\n      // 清除本地token和清空vuex中token对象\n      // 跳转登录页面\n\n      case 403:\n        Toast({\n          message: '登录过期,请重新登录',\n          duration: 1000,\n          forbidClick: true\n        }); // 清除token\n\n        localStorage.removeItem('token');\n        store.commit('loginSuccess', null); // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面\n\n        setTimeout(function () {\n          router.replace({\n            path: '/login',\n            query: {\n              redirect: router.currentRoute.fullPath\n            }\n          });\n        }, 1000);\n        break;\n      // 404请求不存在\n\n      case 404:\n        Toast({\n          message: '网络请求不存在',\n          duration: 1500,\n          forbidClick: true\n        });\n        break;\n      // 其他错误,直接抛出错误提示\n\n      default:\n        Toast({\n          message: error.response.data.message,\n          duration: 1500,\n          forbidClick: true\n        });\n    }\n\n    return Promise.reject(error.response);\n  }\n}); //formDataHeaders设置\n\nvar formDataHeaders = {\n  headers: {\n    \"Content-Type\": \"multipart/form-data\"\n  }\n};\n/**\n * 封装get方法\n * @param {*} params\n */\n\nvar httpGet = function httpGet(params) {\n  var url = params.url,\n      data = params.data,\n      sid = params.sid;\n  var headers = {};\n\n  if (sid) {\n    var sessionId = _store_state_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].userInfo && _store_state_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].userInfo.sid ? _store_state_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].userInfo.sid : \"\";\n    headers = {\n      headers: {\n        sid: sessionId\n      }\n    };\n  }\n\n  return axios.get(\"\".concat(base).concat(url), {\n    params: data\n  }, headers).then(function (res) {\n    return res.data.content;\n  });\n};\n/**\n * 封装post方法\n * @param {*} params\n */\n\nvar httpPost = function httpPost(params) {\n  var url = params.url,\n      data = params.data,\n      sid = params.sid,\n      sidStr = params.sidStr;\n  var headers = {};\n\n  if (sid) {\n    var sessionId = _store_state_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].userInfo && _store_state_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].userInfo.sid ? _store_state_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].userInfo.sid : \"\";\n    headers = {\n      headers: {\n        sid: sessionId\n      }\n    };\n  }\n\n  if (sidStr) {\n    headers = {\n      headers: {\n        sid: sidStr\n      }\n    };\n  }\n\n  return axios.post(\"\".concat(base).concat(url), data, headers).then(function (res) {\n    return res.data.content;\n  });\n};\n/**\n * 封装post方法\n * @param {*} params\n * data数据是 formdata格式\n * 例如:\n *          this.file = file\n            let data = new FormData() //使用formData对象\n            data.append('path', '/pro/mzczcradmin/')\n            data.append('file', file.file)\n */\n\nvar formdata = function formdata(params) {\n  var url = params.url,\n      data = params.data,\n      sid = params.sid;\n  var headers = {\n    headers: {\n      \"Content-Type\": \"multipart/form-data\"\n    }\n  };\n  var formData = new FormData(); //使用formData对象\n\n  for (var key in data) {\n    formData.append(key, data[key]);\n  }\n\n  if (sid) {\n    var sessionId = _store_state_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].userInfo && _store_state_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].userInfo.sid ? _store_state_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].userInfo.sid : \"\";\n    headers.headers.sid = sessionId;\n  }\n\n  return axios.post(\"\".concat(base).concat(url), formData, headers).then(function (res) {\n    return res.data;\n  });\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXBpL2ZldGNoLWFwaS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hcGkvZmV0Y2gtYXBpLmpzP2VkMGIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zSW5zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBzdGF0ZSBmcm9tICdAL3N0b3JlL3N0YXRlLmpzJztcbi8vIGltcG9ydCB7XG4vLyAgIFRvYXN0XG4vLyB9IGZyb20gJ3ZhbnQnO1xuXG5mdW5jdGlvbiBUb2FzdChtc2cpIHtcblx0Y29uc29sZS5sb2coXCJtc2c6XCIsIG1zZyk7XG59XG5cbi8vIGF4aW9z55qE6buY6K6kdXJsXG4vLyBheGlvcy5kZWZhdWx0cy5iYXNlVVJMID0gXCJcIlxuXG4vLyDmnI3liqHlmajlnLDlnYBcbi8vIGxldCBiYXNlID0gcHJvY2Vzcy5lbnYuUkVRVUVTVF9ET01BSU4gfHwgXCJodHRwOi8vbG9jYWxob3N0OjkxMDFcIjtcbi8vIGxldCBiYXNlID0gQ09NLmJhc2VVcmw7XG4vLyBjb25zb2xlLmxvZyhwcm9jZXNzLmVudik7XG5sZXQgYmFzZSA9IFwiXCI7XG5jb25zdCBheGlvcyA9IGF4aW9zSW5zLmNyZWF0ZSh7XG5cdGJhc2VVUkw6IHByb2Nlc3MuZW52LlZVRV9BUFBfQkFTRV9VUkwsXG5cdHRpbWVvdXQ6IDUwMDBcbn0pXG5cbi8vIOivt+axguaLpuaIquWZqFxuLy8gYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKFxuLy8gICBjb25maWcgPT4ge1xuLy8gICAgIC8vIOavj+asoeWPkemAgeivt+axguS5i+WJjeWIpOaWreaYr+WQpuWtmOWcqHRva2Vu77yM5aaC5p6c5a2Y5Zyo77yM5YiZ57uf5LiA5ZyoaHR0cOivt+axgueahGhlYWRlcumDveWKoOS4inRva2Vu77yM5LiN55So5q+P5qyh6K+35rGC6YO95omL5Yqo5re75Yqg5LqGXG4vLyAgICAgLy8g5Y2z5L2/5pys5Zyw5a2Y5ZyodG9rZW7vvIzkuZ/mnInlj6/og710b2tlbuaYr+i/h+acn+eahO+8jOaJgOS7peWcqOWTjeW6lOaLpuaIquWZqOS4reimgeWvuei/lOWbnueKtuaAgei/m+ihjOWIpOaWrVxuLy8gICAgIGNvbnN0IHRva2VuID0gXCJ0b2tlblwiOyAvL+i/memHjOWGmeWFpXRva2VuXG4vLyAgICAgdG9rZW4gJiYgKGNvbmZpZy5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSB0b2tlbik7XG4vLyAgICAgcmV0dXJuIGNvbmZpZztcbi8vICAgfSxcbi8vICAgZXJyb3IgPT4ge1xuLy8gICAgIHJldHVybiBQcm9taXNlLmVycm9yKGVycm9yKTtcbi8vICAgfSlcblxuLy8g5ZON5bqU5oum5oiq5ZmoXG5heGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKFxuXHRyZXNwb25zZSA9PiB7XG5cdFx0aWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0XHRpZiAocmVzcG9uc2UuZGF0YS5jb2RlID09PSAyMDApIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBUb2FzdChyZXNwb25zZS5kYXRhLmJpek1zZyk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZS5kYXRhKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlLmRhdGEpO1xuXHRcdH1cblx0fSxcblx0Ly8g5pyN5Yqh5Zmo54q25oCB56CB5LiN5pivMjAw55qE5oOF5Ya1XG5cdGVycm9yID0+IHtcblx0XHRpZiAoZXJyb3IucmVzcG9uc2Uuc3RhdHVzKSB7XG5cdFx0XHRzd2l0Y2ggKGVycm9yLnJlc3BvbnNlLnN0YXR1cykge1xuXHRcdFx0XHQvLyA0MDE6IOacqueZu+W9lVxuXHRcdFx0XHQvLyDmnKrnmbvlvZXliJnot7PovaznmbvlvZXpobXpnaLvvIzlubbmkLrluKblvZPliY3pobXpnaLnmoTot6/lvoRcblx0XHRcdFx0Ly8g5Zyo55m75b2V5oiQ5Yqf5ZCO6L+U5Zue5b2T5YmN6aG16Z2i77yM6L+Z5LiA5q2l6ZyA6KaB5Zyo55m75b2V6aG15pON5L2c44CCXG5cdFx0XHRcdGNhc2UgNDAxOlxuXHRcdFx0XHRcdHJvdXRlci5yZXBsYWNlKHtcblx0XHRcdFx0XHRcdHBhdGg6ICcvbG9naW4nLFxuXHRcdFx0XHRcdFx0cXVlcnk6IHtcblx0XHRcdFx0XHRcdFx0cmVkaXJlY3Q6IHJvdXRlci5jdXJyZW50Um91dGUuZnVsbFBhdGhcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Ly8gNDAzIHRva2Vu6L+H5pyfXG5cdFx0XHRcdC8vIOeZu+W9lei/h+acn+WvueeUqOaIt+i/m+ihjOaPkOekulxuXHRcdFx0XHQvLyDmuIXpmaTmnKzlnLB0b2tlbuWSjOa4heepunZ1ZXjkuK10b2tlbuWvueixoVxuXHRcdFx0XHQvLyDot7PovaznmbvlvZXpobXpnaJcblx0XHRcdFx0Y2FzZSA0MDM6XG5cdFx0XHRcdFx0VG9hc3Qoe1xuXHRcdFx0XHRcdFx0bWVzc2FnZTogJ+eZu+W9lei/h+acn++8jOivt+mHjeaWsOeZu+W9lScsXG5cdFx0XHRcdFx0XHRkdXJhdGlvbjogMTAwMCxcblx0XHRcdFx0XHRcdGZvcmJpZENsaWNrOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Ly8g5riF6ZmkdG9rZW5cblx0XHRcdFx0XHRsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9rZW4nKTtcblx0XHRcdFx0XHRzdG9yZS5jb21taXQoJ2xvZ2luU3VjY2VzcycsIG51bGwpO1xuXHRcdFx0XHRcdC8vIOi3s+i9rOeZu+W9lemhtemdou+8jOW5tuWwhuimgea1j+iniOeahOmhtemdomZ1bGxQYXRo5Lyg6L+H5Y6777yM55m75b2V5oiQ5Yqf5ZCO6Lez6L2s6ZyA6KaB6K6/6Zeu55qE6aG16Z2iXG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRyb3V0ZXIucmVwbGFjZSh7XG5cdFx0XHRcdFx0XHRcdHBhdGg6ICcvbG9naW4nLFxuXHRcdFx0XHRcdFx0XHRxdWVyeToge1xuXHRcdFx0XHRcdFx0XHRcdHJlZGlyZWN0OiByb3V0ZXIuY3VycmVudFJvdXRlLmZ1bGxQYXRoXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0sIDEwMDApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHQvLyA0MDTor7fmsYLkuI3lrZjlnKhcblx0XHRcdFx0Y2FzZSA0MDQ6XG5cdFx0XHRcdFx0VG9hc3Qoe1xuXHRcdFx0XHRcdFx0bWVzc2FnZTogJ+e9kee7nOivt+axguS4jeWtmOWcqCcsXG5cdFx0XHRcdFx0XHRkdXJhdGlvbjogMTUwMCxcblx0XHRcdFx0XHRcdGZvcmJpZENsaWNrOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdC8vIOWFtuS7lumUmeivr++8jOebtOaOpeaKm+WHuumUmeivr+aPkOekulxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFRvYXN0KHtcblx0XHRcdFx0XHRcdG1lc3NhZ2U6IGVycm9yLnJlc3BvbnNlLmRhdGEubWVzc2FnZSxcblx0XHRcdFx0XHRcdGR1cmF0aW9uOiAxNTAwLFxuXHRcdFx0XHRcdFx0Zm9yYmlkQ2xpY2s6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5yZXNwb25zZSk7XG5cdFx0fVxuXHR9XG4pO1xuXG4vL2Zvcm1EYXRhSGVhZGVyc+iuvue9rlxubGV0IGZvcm1EYXRhSGVhZGVycyA9IHtcblx0aGVhZGVyczoge1xuXHRcdFwiQ29udGVudC1UeXBlXCI6IFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiXG5cdH1cbn1cblxuLyoqXG4gKiDlsIHoo4VnZXTmlrnms5VcbiAqIEBwYXJhbSB7Kn0gcGFyYW1zXG4gKi9cbmV4cG9ydCBjb25zdCBodHRwR2V0ID0gcGFyYW1zID0+IHtcblx0bGV0IHtcblx0XHR1cmwsXG5cdFx0ZGF0YSxcblx0XHRzaWRcblx0fSA9IHBhcmFtcztcblx0bGV0IGhlYWRlcnMgPSB7fTtcblx0aWYgKHNpZCkge1xuXHRcdGxldCBzZXNzaW9uSWQgPSBzdGF0ZS51c2VySW5mbyAmJiBzdGF0ZS51c2VySW5mby5zaWQgPyBzdGF0ZS51c2VySW5mby5zaWQgOiBcIlwiO1xuXHRcdGhlYWRlcnMgPSB7XG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdHNpZDogc2Vzc2lvbklkXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBheGlvcy5nZXQoYCR7YmFzZX0ke3VybH1gLCB7XG5cdFx0cGFyYW1zOiBkYXRhXG5cdH0sIGhlYWRlcnMpLnRoZW4ocmVzID0+IHJlcy5kYXRhLmNvbnRlbnQpO1xufVxuXG4vKipcbiAqIOWwgeijhXBvc3Tmlrnms5VcbiAqIEBwYXJhbSB7Kn0gcGFyYW1zXG4gKi9cbmV4cG9ydCBjb25zdCBodHRwUG9zdCA9IHBhcmFtcyA9PiB7XG5cdGxldCB7XG5cdFx0dXJsLFxuXHRcdGRhdGEsXG5cdFx0c2lkLFxuXHRcdHNpZFN0clxuXHR9ID0gcGFyYW1zO1xuXHRsZXQgaGVhZGVycyA9IHt9O1xuXHRpZiAoc2lkKSB7XG5cdFx0bGV0IHNlc3Npb25JZCA9IHN0YXRlLnVzZXJJbmZvICYmIHN0YXRlLnVzZXJJbmZvLnNpZCA/IHN0YXRlLnVzZXJJbmZvLnNpZCA6IFwiXCI7XG5cdFx0aGVhZGVycyA9IHtcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0c2lkOiBzZXNzaW9uSWRcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKHNpZFN0cikge1xuXHRcdGhlYWRlcnMgPSB7XG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdHNpZDogc2lkU3RyXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBheGlvcy5wb3N0KGAke2Jhc2V9JHt1cmx9YCwgZGF0YSwgaGVhZGVycykudGhlbihyZXMgPT4gcmVzLmRhdGEuY29udGVudCk7XG59XG5cbi8qKlxuICog5bCB6KOFcG9zdOaWueazlVxuICogQHBhcmFtIHsqfSBwYXJhbXNcbiAqIGRhdGHmlbDmja7mmK8gZm9ybWRhdGHmoLzlvI9cbiAqIOS+i+Wmgu+8mlxuICogICAgICAgICAgdGhpcy5maWxlID0gZmlsZVxuICAgICAgICAgICAgbGV0IGRhdGEgPSBuZXcgRm9ybURhdGEoKSAvL+S9v+eUqGZvcm1EYXRh5a+56LGhXG4gICAgICAgICAgICBkYXRhLmFwcGVuZCgncGF0aCcsICcvcHJvL216Y3pjcmFkbWluLycpXG4gICAgICAgICAgICBkYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUuZmlsZSlcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1kYXRhID0gcGFyYW1zID0+IHtcblx0bGV0IHtcblx0XHR1cmwsXG5cdFx0ZGF0YSxcblx0XHRzaWQsXG5cdH0gPSBwYXJhbXM7XG5cdGxldCBoZWFkZXJzID0ge1xuXHRcdGhlYWRlcnMgOiB7XG5cdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcIm11bHRpcGFydC9mb3JtLWRhdGFcIlxuXHRcdH1cblx0fVxuXHRsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsgLy/kvb/nlKhmb3JtRGF0YeWvueixoVxuICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBkYXRhW2tleV0pO1xuXHR9XG5cdGlmIChzaWQpIHtcblx0XHRsZXQgc2Vzc2lvbklkID0gc3RhdGUudXNlckluZm8gJiYgc3RhdGUudXNlckluZm8uc2lkID8gc3RhdGUudXNlckluZm8uc2lkIDogXCJcIjtcblx0XHRoZWFkZXJzLmhlYWRlcnMuc2lkID0gc2Vzc2lvbklkO1xuXHR9XG5cdHJldHVybiBheGlvcy5wb3N0KGAke2Jhc2V9JHt1cmx9YCwgZm9ybURhdGEsIGhlYWRlcnMpLnRoZW4ocmVzID0+IHJlcy5kYXRhKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFGQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBN0NBO0FBQ0E7QUFrREE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQURBO0FBTUE7Ozs7O0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFBQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFEQTtBQUtBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFVQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/api/fetch-api.js\n");

/***/ }),

/***/ "./src/assets/images/common/button-next.png":
/*!**************************************************!*\
  !*** ./src/assets/images/common/button-next.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAuCAMAAAAFiil6AAAAPFBMVEUAAAD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQC43r6mAAAAE3RSTlMAKcry1foyDBPhGjsjwT/rsXp75PzLkAAAAGRJREFUOMut1EsOgCAMAFHQivhF7f3v6gVGDC0s5yUkhLThljXgES0se9HlQ0abZJRokUmln6SqzCxakaGfbDY5WE6bXL/AV3Hnh/h7MnX+9NaeoUdP5zHgzkPo7wV6dWU8wv0Fq/cJL8kFDSkAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vYnV0dG9uLW5leHQucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2J1dHRvbi1uZXh0LnBuZz9iZmNkIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQXVDQU1BQUFBRmlpbDZBQUFBUEZCTVZFVUFBQUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FDNDNyNm1BQUFBRTNSU1RsTUFLY3J5MWZveURCUGhHanNqd1QvcnNYcDc1UHpMa0FBQUFHUkpSRUZVT011dDFFc09nQ0FNQUZIUWl2aEY3ZjN2NmdWR0RDMHM1eVVraExUaGxqWGdFUzBzZTlIbFEwYWJaSlJva1VtbG42U3F6Q3hha2FHZmJEWTVXRTZiWEwvQVYzSG5oL2g3TW5YKzlOYWVvVWRQNXpIZ3prUG83d1Y2ZFdVOHd2MEZxL2NKTDhrRkRTa0FBQUFBU1VWT1JLNUNZSUk9XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/common/button-next.png\n");

/***/ }),

/***/ "./src/assets/images/common/button-prev.png":
/*!**************************************************!*\
  !*** ./src/assets/images/common/button-prev.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAuCAMAAAAFiil6AAAAM1BMVEUAAAD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQD/SQADIOb6AAAAEHRSTlMAJBM8LPgaDNXH8eQz3bF3c64jtAAAAFZJREFUOMvF1MEVgCAQA1FAkICg9F+tFpAc5K24xz/njaO34+J+DAiv/kMPXXqKbxw2nh9v3Af1YufbD+5O4Trksq40u4KpkiItwbb0qVK9eOVlBXJkbrftCFHy0aPQAAAAAElFTkSuQmCC\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vYnV0dG9uLXByZXYucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvY29tbW9uL2J1dHRvbi1wcmV2LnBuZz9lYjZlIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQXVDQU1BQUFBRmlpbDZBQUFBTTFCTVZFVUFBQUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FEL1NRRC9TUUQvU1FBRElPYjZBQUFBRUhSU1RsTUFKQk04TFBnYUROWEg4ZVF6M2JGM2M2NGp0QUFBQUZaSlJFRlVPTXZGMU1FVmdDQVFBMUZBa0lDZzlGK3RGcEFjNUsyNHh6L25qYU8zNCtKK0RBaXYva01QWFhxS2J4dzJuaDl2M0FmMVl1ZmJEKzVPNFRya3NxNDB1NEtwa2lJdHdiYjBxVks5ZU9WbEJYSmticmZ0Q0ZIeTBhUFFBQUFBQUVsRlRrU3VRbUNDXCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/common/button-prev.png\n");

/***/ }),

/***/ "./src/assets/images/common/down-arrow.png":
/*!*************************************************!*\
  !*** ./src/assets/images/common/down-arrow.png ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAICAYAAADN5B7xAAAAnklEQVQYlY2PPQoCQQyFv5E9gQdaG0VncG9iZWdtYWWneJCBSWHnNSxkwcLaUnRjsTPL4A/6QYok74U8M7WTGugDd8DQ0gMUeMRq4uxaADtgxX9sjKpSObsG5j/EWx9kZlQVgMrZPTD8Ij74IIP0a2IMnD+IL8AoNZ3BB2mAkjZgQoHSB7m9GaLplF8DnA9yzDVdhpzK2SVQ+CCL190TREgyBB3ltCcAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vZG93bi1hcnJvdy5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vZG93bi1hcnJvdy5wbmc/NzI2NyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFJQ0FZQUFBRE41Qjd4QUFBQW5rbEVRVlFZbFkyUFBRb0NRUXlGdjVFOWdRZGFHMFZuY0c5aVpXZHRZV1duZUpDQlNXSG5OU3hrd2NMYVVuUmpzVFBMNEEvNlFZb2s3NFU4TTdXVEd1Z0RkOERRMGdNVWVNUnE0dXhhQUR0Z3hYOXNqS3BTT2JzRzVqL0VXeDlrWmxRVmdNclpQVEQ4SWo3NElJUDBhMklNbkQrSUw4QW9OWjNCQjJtQWtqWmdRb0hTQjdtOUdhTHBsRjhEbkE5eXpEVmRocHpLMlNWUStDQ0wxOTBUUkVneUJCM2x0Q2NBQUFBQVNVVk9SSzVDWUlJPVwiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/common/down-arrow.png\n");

/***/ }),

/***/ "./src/assets/images/common/icon-eyes-off.png":
/*!****************************************************!*\
  !*** ./src/assets/images/common/icon-eyes-off.png ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAYCAMAAAA8nnbJAAAASFBMVEUAAADc3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3d3d3c3d3c3d3c3d3c3d2MgPlJAAAAF3RSTlMAiEXazT5WARAxIWHzsAxM5XIZBJ27BlWYBu8AAACYSURBVCjP7Y/LFoMgDERF3gKKAs7//2mjSA+17abrziKHcJNMMvz1iyb74XOcj6i5f4cLcu3zGG/IQZhraEROHTEZkC1ZAf5sTc6DxQYdgorgqzVpkswj2mHj1Ueh7EMSuFQEJprLhSZmw0wBbFuYYLT7hnKYmmaihae3hKz26nVpd14la2HomQr6ZLYeQclditg37Sb16QM4Lgb/IrG3AgAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9mZi5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9mZi5wbmc/MzE0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCc0FBQUFZQ0FNQUFBQThubmJKQUFBQVNGQk1WRVVBQUFEYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzZDNkM2MzZDNjM2QzYzNkM2MzZDJNZ1BsSkFBQUFGM1JTVGxNQWlFWGF6VDVXQVJBeElXSHpzQXhNNVhJWkJKMjdCbFdZQnU4QUFBQ1lTVVJCVkNqUDdZL0xGb01nREVSRjNnS0tBczcvLzJtalNBKzE3YWJyemlLSGNKTk1NdnoxaXliNzRYT2NqNmk1ZjRjTGN1M3pHRy9JUVpocmFFUk9IVEVaa0MxWkFmNXNUYzZEeFFZZGdvcmdxelZwa3N3ajJtSGoxVWVoN0VNU3VGUUVKcHJMaFNabXcwd0JiRnVZWUxUN2huS1ltbWFpaGFlM2hLejI2blZwZDE0bGEySG9tUXI2WkxZZVFjbGRpdGczN1NiMTZRTTRMZ2IvSXJHM0FnQUFBQUJKUlU1RXJrSmdnZz09XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/common/icon-eyes-off.png\n");

/***/ }),

/***/ "./src/assets/images/common/icon-eyes-on.png":
/*!***************************************************!*\
  !*** ./src/assets/images/common/icon-eyes-on.png ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAYCAMAAAA8nnbJAAAAVFBMVEUAAADd3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3d3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3c3d3d3d3c3d3c3d3c3d3c3d0oEK0uAAAAG3RSTlMAL5qyB4ATDQM7opFkhfB34NbpS/bLGFbIbSHSfxLbAAAArElEQVQoz82RWRKDIBBEEVAEWRTQLH3/ewaYKqNW8p28D5bpmp6mYP/KqD7XO7eiEIUdLoouwn0KoTcRmI6q4vCP4jd0ZekMctqlbYGTjEkOoK/2S9mIIULXfULFlpM0cBRuJUmiMbcix60N87xdnyDIC3msfQL9qY8SJDI1MPI0r/PVkugx63fOMSBrtpM8hKb3KRshNnZAOcDzEJwAlsQuKCtyjTLpr//wS15nnwwqYeZsVQAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9jb21tb24vaWNvbi1leWVzLW9uLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2NvbW1vbi9pY29uLWV5ZXMtb24ucG5nPzE3NzgiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQnNBQUFBWUNBTUFBQUE4bm5iSkFBQUFWRkJNVkVVQUFBRGQzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNkM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNjM2QzYzNkM2MzZDNkM2QzYzNkM2MzZDNjM2QzYzNkMG9FSzB1QUFBQUczUlNUbE1BTDVxeUI0QVREUU03b3BGa2hmQjM0TmJwUy9iTEdGYkliU0hTZnhMYkFBQUFyRWxFUVZRb3o4MlJXUktESUJCRUVWQUVXUlRRTEgzL2V3YVlLcU5XOHAyOEQ1YnBtcDZtWVAvS3FEN1hPN2VpRUlVZExvb3V3bjBLb1RjUm1JNnE0dkNQNGpkMFpla01jdHFsYllHVGpFa09vSy8yUzltSUlVTFhmVUxGbHBNMGNCUnVKVW1pTWJjaXg2ME44N3hkbnlESUMzbXNmUUw5cVk4U0pESTFNUEkwci9QVmt1Z3g2M2ZPTVNCcnRwTThoS2IzS1JzaE5uWkFPY0R6RUp3QWxzUXVLQ3R5alRMcHIvL3dTMTVubnd3cVllWnNWUUFBQUFCSlJVNUVya0pnZ2c9PVwiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/common/icon-eyes-on.png\n");

/***/ }),

/***/ "./src/assets/images/home/footer-icon-1.png":
/*!**************************************************!*\
  !*** ./src/assets/images/home/footer-icon-1.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAC5klEQVRIibWVX0iTURjGf9+Yf7F0OdFRV1tRlELmpKgQDU0i09RdSH8MAu8q07uiiyBDosjoLimoVCxIKy1EsVZqZDX/1IVh7CtyGBvahW0udGt24Xbic04l2XN13ud9v+c55z3nfEeyyjJ+HAKqgEwgjv+DC/gAXAeeAaj8iRqgDchZhTj+b3OAdr8mklWWC/xEOFCoAqrDJA5QpQaMC9kf4+N0dXby6eMwDrsdj8dDgkbD5i1byMnZR3pGBpIkrcTAKFlleS4Q+Xw+mhoaePq4FZ/PF/Kr1LQ0KquqSdRql3UQBnNzc9y8UcdrsxmAiIgIPB6PolitVuP1egFITknhytVrrI2PX9IgcIro6+0V4gkaDXcbmzhWfkIUapOSaGh+QNmRowA47HZu19cvuwJh0NnRIcjfbjdDgwN8+/ZVcO7paYYHB/kqWwX3rv8tLqdzSQPRojJTKbOzs8vOSG8woDcY+OP9g9frQVKp0Ol0GDMzMWzcFFSvDgxiY2OXNJAkibz8fGxjY3R3dQXlHzY3s8No5NTpMyRoNIIXLdIbDEvOPG9/PgMWC59HRkLWDFosXDh/TtE2YXC4pDTk2V6XmIjb7ebn5CQAhYeLuXipRuRPVlRwqvIsMH+HHj5oDjZITUvj6PHyRQ22p6fz/l2/iIcGLDxvbxNxX08P5hfdIn7T1yfGYg8ASkwmABrv31MYREZGKvbHZrNhs9lE/GV0VFHv/PWvRQqDAGJiYtiXm4vL6cJhtxMdHU1ycjIOh2PRFS6E3qAPbbB+wwZu3b5D3Jo1Cl6r1a7oYgEUFReLsWphcueuXUHiAAcOFpCbl7eseInJxO49e0Ws+NmtBD2vXtHa8oix79+Dclu3pVJTW6vg1IATCJ5yCGRlZ5OVnc3kxITYE51Ox9TUFE9aW5iZmSEqKipQ7pKssvyS+WcuHDCrgLowiQPUqZh/jy+HQfwy0B44RReAIsAMTK9CdNqvUejX5C/LRP7HP0eCYAAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1pY29uLTEucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9mb290ZXItaWNvbi0xLnBuZz9kNzU0Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFDNWtsRVFWUklpYldWWDBpVFVSakdmOStZZjdGME9kRlJWMXRSbEVMbXBLZ1FEVTBpMDlSZFNIOE1BdThxMDd1aWl5QkRvc2pvTGltb1ZDeElLeTFFc1ZacVpEWC8xSVZoN0N0eUdCdmFoVzB1ZEd0MjRYYmljMDRsMlhOMTN1ZDl2K2M1NXozbmZFZXl5akorSEFLcWdFd2dqditEQy9nQVhBZWVBYWo4aVJxZ0RjaFpoVGorYjNPQWRyOG1rbFdXQy94RU9GQ29BcXJESkE1UXBRYU1DOWtmNCtOMGRYYnk2ZU13RHJzZGo4ZERna2JENWkxYnlNblpSM3BHQnBJa3JjVEFLRmxsZVM0UStYdyttaG9hZVBxNEZaL1BGL0tyMUxRMEtxdXFTZFJxbDNVUUJuTnpjOXk4VWNkcnN4bUFpSWdJUEI2UG9saXRWdVAxZWdGSVRrbmh5dFZyckkyUFg5SWdjSXJvNiswVjRna2FEWGNibXpoV2ZrSVVhcE9TYUdoK1FObVJvd0E0N0hadTE5Y3Z1d0poME5uUkljamZiamREZ3dOOCsvWlZjTzdwYVlZSEIva3FXd1gzcnY4dExxZHpTUVBSb2pKVEtiT3pzOHZPU0c4d29EY1krT1A5ZzlmclFWS3AwT2wwR0RNek1XemNGRlN2RGd4aVkyT1hOSkFraWJ6OGZHeGpZM1IzZFFYbEh6WTNzOE5vNU5UcE15Um9OSUlYTGRJYkRFdk9QRzkvUGdNV0M1OUhSa0xXREZvc1hEaC9UdEUyWVhDNHBEVGsyVjZYbUlqYjdlYm41Q1FBaFllTHVYaXBSdVJQVmxSd3F2SXNNSCtISGo1b0RqWklUVXZqNlBIeVJRMjJwNmZ6L2wyL2lJY0dMRHh2YnhOeFgwOFA1aGZkSW43VDF5ZkdZZzhBU2t3bUFCcnYzMU1ZUkVaR0t2Ykhack5oczlsRS9HVjBWRkh2L1BXdlJRcURBR0ppWXRpWG00dkw2Y0podHhNZEhVMXljaklPaDJQUkZTNkUzcUFQYmJCK3d3WnUzYjVEM0pvMUNsNnIxYTdvWWdFVUZSZUxzV3BoY3VldVhVSGlBQWNPRnBDYmw3ZXNlSW5KeE80OWUwV3MrTm10QkQydlh0SGE4b2l4NzkrRGNsdTNwVkpUVzZ2ZzFJQVRDSjV5Q0dSbFo1T1ZuYzNreElUWUU1MU94OVRVRkU5YVc1aVptU0VxS2lwUTdwS3NzdnlTK1djdUhEQ3JnTG93aVFQVXFaaC9qeStIUWZ3eTBCNDRSUmVBSXNBTVRLOUNkTnF2VWVqWDVDL0xSUDdIUDBlQ1lBQUFBQUJKUlU1RXJrSmdnZz09XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/footer-icon-1.png\n");

/***/ }),

/***/ "./src/assets/images/home/footer-icon-2.png":
/*!**************************************************!*\
  !*** ./src/assets/images/home/footer-icon-2.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABX0lEQVRIie2VMU/CUBSFvxbKgDIg/SmgM4tBI5i4GIwumpAwYjQujrLK7qAhmoiJxkTc/QGIszX0F0BBInVDHHiQNCm+KnTzbPede865777hKQ3TRCANFIAEMM/f0ANqwCnwCKAK4gR4AJJTmCO0SaAqPFEaprkmDvxARgX2fTIHKASBuNfutmVxU7nmpV7nvdOh3+8DEA7PcVWpuEniQSDixbzb7XJ0eIDVanmdByCiynuGuL+7/a05AEGvjW+G4aij0QWWUylCIQ1N06YPaFuWo04sLbKZzUp1nlf0NRg4hYo3qfQGl+UyAJ+27Tg3jNcxFwiobG3vuOqVhmkOXBmBjUxaOqWu65ydX7hynlf0E2K6PpGbTUBscoB0RSPk9nZpNZvjOrWySi6fl+pmcoP/gKkDPnz076nAs48BNRUo+RhQUhn+x0UfzItAdfTIx8A68ATYEyVy2MIjIzz5BpjIXAKSOsukAAAAAElFTkSuQmCC\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1pY29uLTIucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9mb290ZXItaWNvbi0yLnBuZz85NTQ0Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFCWDBsRVFWUklpZTJWTVUvQ1VCU0Z2eGJLZ0RJZy9TbWdNNHRCSTVpNEdJd3VtcEF3WWpRdWpyTEs3cUFobW9pSnhrVGMvUUdJc3pYMEYwQkJJblZESEhpUU5DbStLblR6YlBlZGU4NjU3NzdoS1EzVFJDQU5GSUFFTU0vZjBBTnF3Q253Q0tBSzRnUjRBSkpUbUNPMFNhQXFQRkVhcHJrbUR2eEFSZ1gyZlRJSEtBU0J1TmZ1dG1WeFU3bm1wVjdudmRPaDMrOERFQTdQY1ZXcHVFbmlRU0RpeGJ6YjdYSjBlSURWYW5tZEJ5Q2l5bnVHdUwrNy9hMDVBRUd2alcrRzRhaWowUVdXVXlsQ0lRMU4wNllQYUZ1V28wNHNMYktaelVwMW5sZjBOUmc0aFlvM3FmUUdsK1V5QUorMjdUZzNqTmN4Rndpb2JHM3Z1T3FWaG1rT1hCbUJqVXhhT3FXdTY1eWRYN2h5bmxmMEUySzZQcEdiVFVCc2NvQjBSU1BrOW5acE5admpPcld5U2k2ZmwrcG1jb1AvZ0trRFBuejA3Nm5BczQ4Qk5SVW8rUmhRVWhuK3gwVWZ6SXRBZGZUSXg4QTY4QVRZRXlWeTJNSWpJeno1QnBqSVhBS1NPc3VrQUFBQUFFbEZUa1N1UW1DQ1wiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/home/footer-icon-2.png\n");

/***/ }),

/***/ "./src/assets/images/home/footer-icon-3.png":
/*!**************************************************!*\
  !*** ./src/assets/images/home/footer-icon-3.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABqElEQVRIid2Vu0tCURzHP/cQCJKBLoYXwj8iG2oqGlLKligTWwN7GDW3BLlW0B9QNFdDD3oQBRVUNNfkRcuoxUDwOdweg7dSu2Bdu0vf6fA9v/P9nMcPjhRTFDT1AdOAB2jEmLLANbAA7AAIbWIe2AI66whHW9sJbGuZSDFF6dUMM+QXwIxJ4QDTAmg1EdAqAFu1u7e7SygQYGpinKfHx3oANqHnrq2ukM/nSN7fc7C/Vw8AXYBLlr/GLlmv5MeSYoryVm2m02nOz06x2x20d3QgSZJhQIOe+aKqeDxtABQKBaxWK8+pFKqqAmBrasJisXB7c0M2k6HF7UaW9U+qC5ifm+PuLgHAaDhMj9dX4Q0NB7m6vCARj3+u6eruZmxiEiEqb133DWppc2O9Ihzg+OiIw4P9b7WGAG+vrwRDI4xHIjgcjgpItXSvqJZ6vD4GBgdLOxSC5aUlAB6SyW+1hk5Q3sZOZ/PnuFgs/g2Asq6t1cLGAL/Q/wBkTMzPSjFFOab0zZmhEwEsmhQOsCgo/cdRE8KjwPbHI88C/cAJkKsjNKdl+LVM3gGN73henaQ7LgAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1pY29uLTMucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9mb290ZXItaWNvbi0zLnBuZz9hNTMwIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFCcUVsRVFWUklpZDJWdTB0Q1VSekhQL2NRQ0pLQkxvWVh3ajhpRzJvcUdsTEtsaWdUV3dON0dEVzNCTGxXMEI5UU5GZEREM29RQlJWVU5OZmtSY3VveFVEd09kd2VnN2RTdTJCZHUwdmY2ZkE5di9QOW5NY1BqaFJURkRUMUFkT0FCMmpFbUxMQU5iQUE3QUFJYldJZTJBSTY2d2hIVzlzSmJHdVpTREZGNmRVTU0rUVh3SXhKNFFEVEFtZzFFZEFxQUZ1MXU3ZTdTeWdRWUdwaW5LZkh4M29BTnFIbnJxMnVrTS9uU043ZmM3Qy9WdzhBWFlCTGxyL0dMbG12NU1lU1lvcnlWbTJtMDJuT3owNngyeDIwZDNRZ1NaSmhRSU9lK2FLcWVEeHRBQlFLQmF4V0s4K3BGS3FxQW1CcmFzSmlzWEI3YzBNMms2SEY3VWFXOVUrcUM1aWZtK1B1TGdIQWFEaE1qOWRYNFEwTkI3bTZ2Q0FSajMrdTZlcnVabXhpRWlFcWIxMzNEV3BwYzJPOUloemcrT2lJdzRQOWI3V0dBRyt2cndSREk0eEhJamdjamdwSXRYU3ZxSlo2dkQ0R0JnZExPeFNDNWFVbEFCNlN5VysxaGs1UTNzWk9aL1BudUZncy9nMkFzcTZ0MWNMR0FML1Evd0JrVE16UFNqRkZPYWIwelptaEV3RXNtaFFPc0Nnby9jZFJFOEtqd1BiSEk4OEMvY0FKa0tzak5LZGwrTFZNM2dHTjczaGVuYVE3TGdBQUFBQkpSVTVFcmtKZ2dnPT1cIiJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/home/footer-icon-3.png\n");

/***/ }),

/***/ "./src/assets/images/home/footer-logo.png":
/*!************************************************!*\
  !*** ./src/assets/images/home/footer-logo.png ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/footer-logo.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2Zvb3Rlci1sb2dvLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2hvbWUvZm9vdGVyLWxvZ28ucG5nP2I2ZWYiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwiYXNzZXRzL2ltZy9mb290ZXItbG9nby5wbmdcIjsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/footer-logo.png\n");

/***/ }),

/***/ "./src/assets/images/home/header-logo.png":
/*!************************************************!*\
  !*** ./src/assets/images/home/header-logo.png ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/header-logo.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2hlYWRlci1sb2dvLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2hvbWUvaGVhZGVyLWxvZ28ucG5nPzI0ZWIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwiYXNzZXRzL2ltZy9oZWFkZXItbG9nby5wbmdcIjsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/header-logo.png\n");

/***/ }),

/***/ "./src/assets/images/home/icon-head-plus-act.png":
/*!*******************************************************!*\
  !*** ./src/assets/images/home/icon-head-plus-act.png ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAkklEQVQ4je3VIQ7CUBBF0VPSYLDoIrqIGtaBKDtgQYh6DGwDwzJAE1JDBQr7g5hCANGkL/niJXduJmN+1talnswwTfoD92hg0mdEg1vymr6Bd6QfZ5QORJpjjm3AVC99iX3Ab7K2Lgucv1wuzWJYN+1wCJgKRdIvOAV8l+OKVQDtUCf9iHW06XBuOkp/n+wff9QTVy0XuVfqI/sAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1wbHVzLWFjdC5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1wbHVzLWFjdC5wbmc/NGExZCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCVUFBQUFWQ0FZQUFBQ3BGNldXQUFBQWtrbEVRVlE0amUzVklRN0NVQkJGMFZQU1lMRG9JcnFJR3RhQktEdGdRWWg2REd3RHd6SkFFMUpEQlFyN2c1aENBTkdrTC9uaUpYZHVKbU4rMXRhbG5zd3dUZm9EOTJoZzBtZEVnMXZ5bXI2QmQ2UWZaNVFPUkpwamptM0FWQzk5aVgzQWI3SzJMZ3VjdjF3dXpXSllOKzF3Q0pnS1JkSXZPQVY4bCtPS1ZRRHRVQ2Y5aUhXMDZYQnVPa3Avbit3ZmY5UVRWeTBYdVZmcUkvc0FBQUFBU1VWT1JLNUNZSUk9XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/icon-head-plus-act.png\n");

/***/ }),

/***/ "./src/assets/images/home/icon-head-plus.png":
/*!***************************************************!*\
  !*** ./src/assets/images/home/icon-head-plus.png ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAmklEQVQ4je3QIQoCURSF4U95GLSa3cYUF6Bg1aDdIEbXYphu0W1Y3IZZbE6YZDE8Bd+MYBmYAzcc+M/h3tuZTScqNEAv8iUeqUC3qhE57tHkVYE6pT+rLW1IacAQ+wSTffgxjgl+E9DH/IdFRq/5pl2zflrglGAy7+decUnwRcANiwR0wDLyZ6xSmzbnp23p/xVqMGtsI19WBZ78VxQSjvxpZgAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1wbHVzLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1oZWFkLXBsdXMucG5nPzMwZjMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQlVBQUFBVkNBWUFBQUNwRjZXV0FBQUFta2xFUVZRNGplM1FJUW9DVVJTRjRVOTVHTFNhM2NZVUY2QmcxYURkSUViWFlwaHUwVzFZM0laWmJFNllaREU4QmQrTVlCbVlBemNjK00vaDN0dVpUU2NxTkVBdjhpVWVxVUMzcWhFNTd0SGtWWUU2cFQrckxXMUlhY0FRK3dTVGZmZ3hqZ2wrRTlESC9JZEZScS81cGwyemZscmdsR0F5NytkZWNVbndSY0FOaXdSMHdETHlaNnhTbXpibnAyM3AveFZxTUd0c0kxOVdCWjc4VnhRU2p2eHBaZ0FBQUFCSlJVNUVya0pnZ2c9PVwiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/home/icon-head-plus.png\n");

/***/ }),

/***/ "./src/assets/images/home/icon-head-right-arrow.png":
/*!**********************************************************!*\
  !*** ./src/assets/images/home/icon-head-right-arrow.png ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAUCAYAAAC58NwRAAABGElEQVQokY3SPSyDURSA4afVGESwCINYxGgTNhKL34RBSCzsYu5gNUhMNoPVIBFhkEj8TIiJjcnWzaJLh0YxfOdLmupXzvaenPfec+49uY+1IRhDF679EXlM4BFX2P2P0IdccBHbfwmnOKvL7WCrlVDDarSUxj42sgSoYgn3wTkcYjlLgArm8RTchiPMZglQxgxegttxgsksAd4xjbfgDpxL/qqpAKWQSsHduMBIlkAyeKGOv/GZJQzgBv3B5bjxtZnQi1sMBlcwh+dmM/TEycPBVSziIS2oFzpxiZHgGlY0bHAqpE83HvyF9chpFAo4xlTkvrEp+eVfkZfsy0JdroiDZsWpUIpTSVZ7L6tYtHOH0ZjjrlUx/ACL+jSfgR2/WgAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1yaWdodC1hcnJvdy5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24taGVhZC1yaWdodC1hcnJvdy5wbmc/OWEwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFVQ0FZQUFBQzU4TndSQUFBQkdFbEVRVlFva1kzU1BTeURVUlNBNGFmVkdFU3dDSU5ZeEdnVE5oS0wzNFJCU0N6c1l1NWdOVWhNTm9QVklCRmhrRWo4VElpSmpjbld6YUpMaDBZeGZPZExtdXBYenZhZW5QZmVjKzQ5dVkrMUlSaERGNjc5RVhsTTRCRlgyUDJQMElkY2NCSGJmd21uT0t2TDdXQ3JsVkREYXJTVXhqNDJzZ1NvWWduM3dUa2NZamxMZ0FybThSVGNoaVBNWmdsUXhneGVndHR4Z3Nrc0FkNHhqYmZnRHB4TC9xcXBBS1dRU3NIZHVNQklsa0F5ZUtHT3YvR1pKUXpnQnYzQjVianh0Wm5RaTFzTUJsY3doK2RtTS9URXljUEJWU3ppSVMyb0Z6cHhpWkhnR2xZMGJIQXFwRTgzSHZ5RjljaHBGQW80eGxUa3ZyRXArZVZma1pmc3kwSmRyb2lEWnNXcFVJcFRTVlo3TDZ0WXRIT0gwWmpqcmxVeC9BQ0wralNmZ1IyL1dnQUFBQUJKUlU1RXJrSmdnZz09XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/icon-head-right-arrow.png\n");

/***/ }),

/***/ "./src/assets/images/home/icon-user.png":
/*!**********************************************!*\
  !*** ./src/assets/images/home/icon-user.png ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAANCAYAAACdKY9CAAAA40lEQVQokYWRPUpDQRRGjyEP3UAIaGkqUbIDQXQHkk2Ji1AQUwiKhBRaPLSQBxYuwiZNoiABUYLHwjtxjA+98MGd755vfhhUMnXVK/VdfYt+K2dyeFOdBjxQh9G/qBt1gXP1Q93OvJ3wzuoCI/V+4YqoD+pjWjf4rgmwCjQzrwjvORl5oA+sAUfAOtABjoE2cDqnsqML9cbfVcbsxxua6qE6qwnM1INgQF1S+zG8U3fVZXVF3VOrmJ2kQC+Mi7TLggr1Mph91Fv1VW3VwEltv36+JODrP+CkUp02gDFQ8X9VwNMn4rqc0xVlVWkAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tdXNlci5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tdXNlci5wbmc/Nzg1MSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFOQ0FZQUFBQ2RLWTlDQUFBQTQwbEVRVlFva1lXUlBVcERRUlJHanlFUDNVQUlhR2txVWJJRFFYUUhrazJKaTFBUVV3aUtoQlJhUExTUUJ4WXV3aVpOb2lBQlVZTEh3anR4akErOThNR2Q3NTV2ZmhoVU1uWFZLL1ZkZll0K0syZHllRk9kQmp4UWg5Ry9xQnQxZ1hQMVE5M092SjN3enVvQ0kvVis0WXFvRCtwaldqZjRyZ213Q2pRenJ3anZPUmw1b0Erc0FVZkFPdEFCam9FMmNEcW5zcU1MOWNiZlZjYnN4eHVhNnFFNnF3bk0xSU5nUUYxUyt6RzhVM2ZWWlhWRjNWT3JtSjJrUUMrTWk3VExnZ3IxTXBoOTFGdjFWVzNWd0VsdHYzNitKT0RyUCtDa1VwMDJnREZROFg5VndOTW40cnFjMHhWbFZXa0FBQUFBU1VWT1JLNUNZSUk9XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/icon-user.png\n");

/***/ }),

/***/ "./src/assets/images/home/mobile-nav-close.png":
/*!*****************************************************!*\
  !*** ./src/assets/images/home/mobile-nav-close.png ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABMElEQVRIia3Wu07DMBSA4Q83PEAH2BGPA4wUUR6ijHRBYuqKxDPQqjAw0KdCVGKCqRVDE8lEzq3hSFEutv7f9smxfPA1Pj3BI44ww7t+cYEpPjHJ8ISzvPEN13jdEz7CHIP8PQQMow4DLHD5D3AYBrtl2SQko57wDWYBK9wkJPOWkir4GKuQf1juKamDv0CIGrpKGuFlQRdJKzhkiZEt8/tzBCgkRbSCVwnqJIv8OZ55JbxOUCUpL2ktvEkQS+YJ+LYJnhrRv0eT4MpuiVL9ghbFWCco4PHfss2vIhqLsUqQgm/sdtqxDhWfSnIVvJzQqjr5k/TyDNrCW28rsaAtvJOkEHSFt5ZkON8THktI5+Q74K4HPJakZjINWPeE10nWGW5xiGM86HdsWeIH9/jA5BfK4W9xxh2j0wAAAABJRU5ErkJggg==\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL21vYmlsZS1uYXYtY2xvc2UucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tb2JpbGUtbmF2LWNsb3NlLnBuZz8zZWM1Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFCTUVsRVFWUklpYTNXdTA3RE1CU0E0UTgzUEVBSDJCR1BBNHdVVVI2aWpIUkJZdXFLeERQUXFqQXcwS2RDVkdLQ3FSVkRFOGxFenEzaFNGRXV0djdmOXNteGZQQTFQajNCSTQ0d3c3dCtjWUVwUGpISjhJU3p2UEVOMTNqZEV6N0NISVA4UFFRTW93NERMSEQ1RDNBWUJydGwyU1FrbzU3d0RXWUJLOXdrSlBPV2tpcjRHS3VRZjFqdUthbUR2MENJR3JwS0d1RmxRUmRKS3poa2laRXQ4L3R6QkNna1JiU0NWd25xSkl2OE9aNTVKYnhPVUNVcEwya3R2RWtRUytZSitMWUpuaHJSdjBlVDRNcHVpVkw5Z2hiRldDY280UEhmc3MydklocUxzVXFRZ20vc2R0cXhEaFdmU25JVnZKelFxanI1ay9UeUROckNXMjhyc2FBdHZKT2tFSFNGdDVaa09OOFRIa3RJNStRNzRLNEhQSmFrWmpJTldQZUUxMG5XR1c1eGlHTTg2SGRzV2VJSDkvakE1QmZLNFc5eHhoMmowd0FBQUFCSlJVNUVya0pnZ2c9PVwiIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assets/images/home/mobile-nav-close.png\n");

/***/ }),

/***/ "./src/assets/images/home/mobile-nav.png":
/*!***********************************************!*\
  !*** ./src/assets/images/home/mobile-nav.png ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAdCAYAAAAtt6XDAAABJUlEQVRYhe3YOUrEYBiA4Wf+iVsluGFj4QJ6AREUr2ExneAdxA0VRCw8hJcQT6CF2lkJoli6T6fgMhZxYMaxsJEvhS+kSfX8IXxfSKlaGe3GLmbRJq4rLOEkww4WAjH1RnCAwYSpYExjvRhLuImWNPSO24Q1xYC9YxWPGU4xhAm0B6Iu8QTZ141XnIVxvlWq1WrRhpZSNOCnCokqVSuj0YaWCvmkEoZxiDfUAq87zNVR25hG+c+O/rv6sIfOhPFYS1NdGE44j5Y09IyrhBUc4SPW4x7zeMnkO2cm1tNcIUfC/+77bYVEFXL31T/y2uRDtCPQci0fCzJMYh/9gSDyObmOrYRN8SDy93sDPQmDsZamyhhIOI6WNPSAiwyLcmER/iUs4+0TEg9TPrk6Z0MAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL21vYmlsZS1uYXYucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tb2JpbGUtbmF2LnBuZz81NjZiIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNVQUFBQWRDQVlBQUFBdHQ2WERBQUFCSlVsRVFWUlloZTNZT1VyRVlCaUE0V2YraVZzbHVHRmo0UUo2QVJFVXIyRXhuZUFkeEEwVlJDdzhoSmNRVDZDRjJsa0pvbGk2VDZmZ01oWnhZTWF4c0pFdmhTK2tTZlg4SVh4ZlNLbGFHZTNHTG1iUkpxNHJMT0Vrd3c0V0FqSDFSbkNBd1lTcFlFeGp2UmhMdUltV05QU08yNFExeFlDOVl4V1BHVTR4aEFtMEI2SXU4UVRaMTQxWG5JVnh2bFdxMVdyUmhwWlNOT0NuQ29rcVZTdWowWWFXQ3Zta0VvWnhpRGZVQXE4N3pOVlIyNWhHK2MrTy9ydjZzSWZPaFBGWVMxTmRHRTQ0ajVZMDlJeXJoQlVjNFNQVzR4N3plTW5rTzJjbTF0TmNJVWZDLys3N2JZVkVGWEwzMVQveTJ1UkR0Q1BRY2kwZkN6Sk1ZaC85Z1NEeU9ibU9yWVJOOFNEeTkzc0RQUW1Ec1phbXloaElPSTZXTlBTQWl3eUxjbUVSL2lVczQrMFRFZzlUUHJrNlowTUFBQUFBU1VWT1JLNUNZSUk9XCIiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/mobile-nav.png\n");

/***/ }),

/***/ "./src/assets/images/home/mobile-user.png":
/*!************************************************!*\
  !*** ./src/assets/images/home/mobile-user.png ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAfCAYAAAD0ma06AAAC3klEQVRIia3WT6hVVRTH8c+9pU+QOlnPooggOv0xHmJOXkqJ4DAMAvvnIQdSDZQgCBqJNAicOBECRUQe1klCI4hGQRRlfwgMXn+g6BCUFlEWHvVpZlmD7YX99jv3nnv1/UZ3rb3u/p6999pr7c7JjXcYQldjPTZgLW655P8ZH+Aw3s7K6mLbRJ0hgPdjP5a1xH2JzVlZHR0U1G2Z5HF8OAQMluOTusgfvlzgGryKBYn/L0zjK5xPxhbicF3kq0YFLsJUAjuN5zCOFcKKxvE8ZqK4BZiqi3zhKMCncHtk13gArySTn8nKapewG2ci/114clRgrBeEpGhUVlZf4MXEXQwLvAqTkX0SB/rBIu03e/WrhwUuFQ6/p2lcaKNlZXVeSKSeFtdFft0wwP8Su/Uyj6Im4B/4O7JXCNs8UHWRj+HeyDUjJFsr8B98HtlLsLENKCTatZH9WVZW6W71zdLXE3sX7ulHqot8AjsT98Gm2H7AKfwU2UvwKTZjLPKP1UX+LD5GFvl/EKrUHA0q3uvwbsNHncY36GACi5Pxf7E2K6sjTZMOqqXvYZNwprGuETrIZAPsAjb1g7UB4Ti+b4mJ9R1+HBTQD7gUh4TmOkxr6mkCR+oiP1gX+fXDAlcK1WXDCKBUT2C6LvLlbcBJvI+bE/8M9uIh3CQkTOdS3HrsM7uOwq34qC7ylbEzztLbcFTocbF2YztONC0lKytQF/k4duDpJOQ33JeV1S/xCjt4LYGdE7Z1Sz9YAj6RldUzwnbGxf5GUbfpAQs8GAVdxGN4sw3UAH5DeAvFZW1dXeSP9oAdbEv+twPvjAqLoG+ZW+q294BrcHc0cAwvXy4s0kv4NbIn6iKf7ApZFmu38DK7ImVldRZ7EvcjXeFxFOvQlcIipTmwuiu8sHr6E9V80bKy+trs19ydXaH19HRsvmCRjke/b+gK7aZpcL4UL+JUF1uFi/2tuddjPrRNOKbfsfV/MDyyBD9TL0IAAAAASUVORK5CYII=\"//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL21vYmlsZS11c2VyLnBuZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9hc3NldHMvaW1hZ2VzL2hvbWUvbW9iaWxlLXVzZXIucG5nPzRkNmYiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQndBQUFBZkNBWUFBQUQwbWEwNkFBQUMza2xFUVZSSWlhM1dUNmhWVlJUSDhjKzlwVStRT2xuUG9vZ2dPdjB4SG1KT1hrcUo0REFNQXZ2bklRZFNEWlFnQ0JxSk5BaWNPQkVDUlVRZTFrbENJNGhHUVJSbGZ3Z01YbitnNkJDVUZsRVdIdlZwWmxtRDdZWDk5anYzbm52MS9VWjNyYjN1L3A2OTk5cHI3YzdKalhjWVFsZGpQVFpnTFc2NTVQOFpIK0F3M3M3SzZtTGJSSjBoZ1BkalA1YTF4SDJKelZsWkhSMFUxRzJaNUhGOE9BUU1sdU9UdXNnZnZsemdHcnlLQlluL0wwempLNXhQeGhiaWNGM2txMFlGTHNKVUFqdU41ekNPRmNLS3h2RThacUs0QlppcWkzemhLTUNuY0h0azEzZ0FyeVNUbjhuS2FwZXdHMmNpLzExNGNsUmdyQmVFcEdoVVZsWmY0TVhFWFF3THZBcVRrWDBTQi9yQkl1MDNlL1dyaHdVdUZRNi9wMmxjYUtObFpYVmVTS1NlRnRkRmZ0MHd3UDhTdS9VeWo2SW00Qi80TzdKWENOczhVSFdSaitIZXlEVWpKRnNyOEI5OEh0bExzTEVOS0NUYXRaSDlXVlpXNlc3MXpkTFhFM3NYN3VsSHFvdDhBanNUOThHbTJIN0FLZndVMlV2d0tUWmpMUEtQMVVYK0xENUdGdmwvRUtyVUhBMHEzdXZ3YnNOSG5jWTM2R0FDaTVQeGY3RTJLNnNqVFpNT3FxWHZZWk53cHJHdUVUcklaQVBzQWpiMWc3VUI0VGkrYjRtSjlSMStIQlRRRDdnVWg0VG1Pa3hyNm1rQ1Irb2lQMWdYK2ZYREFsY0sxV1hEQ0tCVVQyQzZMdkxsYmNCSnZJK2JFLzhNOXVJaDNDUWtUT2RTM0hyc003dU93cTM0cUM3eWxiRXp6dExiY0ZUb2NiRjJZenRPTkMwbEt5dFFGL2s0ZHVEcEpPUTMzSmVWMVMveENqdDRMWUdkRTdaMVN6OVlBajZSbGRVenduYkd4ZjVHVWJmcEFRczhHQVZkeEdONHN3M1VBSDVEZUF2RlpXMWRYZVNQOW9BZGJFdit0d1B2akFxTG9HK1pXK3EyOTRCcmNIYzBjQXd2WHk0czBrdjROYkluNmlLZjdBcFpGbXUzOERLN0ltVmxkUlo3RXZjalhlRnhGT3ZRbGNJaXBUbXd1aXU4c0hyNkU5VjgwYkt5K3RyczE5eWRYYUgxOUhSc3ZtQ1Jqa2UvYitnSzdhWnBjTDRVTCtKVUYxdUZpLzJ0dWRkalByUk5PS2Jmc2ZWL01EeXlCRDlUTDBJQUFBQUFTVVZPUks1Q1lJST1cIiJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/home/mobile-user.png\n");

/***/ }),

/***/ "./src/assets/images/home/qrcode.png":
/*!*******************************************!*\
  !*** ./src/assets/images/home/qrcode.png ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/qrcode.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL3FyY29kZS5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9ob21lL3FyY29kZS5wbmc/NTNlMiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3FyY29kZS5wbmdcIjsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assets/images/home/qrcode.png\n");

/***/ }),

/***/ "./src/assets/images/index sync recursive ^\\.\\/banner\\-m1\\-.*\\.jpg$":
/*!****************************************************************!*\
  !*** ./src/assets/images/index sync ^\.\/banner\-m1\-.*\.jpg$ ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var map = {\n\t\"./banner-m1-en.jpg\": \"./src/assets/images/index/banner-m1-en.jpg\",\n\t\"./banner-m1-tc.jpg\": \"./src/assets/images/index/banner-m1-tc.jpg\",\n\t\"./banner-m1-zh.jpg\": \"./src/assets/images/index/banner-m1-zh.jpg\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./src/assets/images/index sync recursive ^\\\\.\\\\/banner\\\\-m1\\\\-.*\\\\.jpg$\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleCBzeW5jIHJlY3Vyc2l2ZSBeXFwuXFwvYmFubmVyXFwtbTFcXC0uKlxcLmpwZyQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleCBzeW5jIF5cXC5cXC9iYW5uZXJcXC1tMVxcLS4qXFwuanBnJD8zZmJiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBtYXAgPSB7XG5cdFwiLi9iYW5uZXItbTEtZW4uanBnXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTEtZW4uanBnXCIsXG5cdFwiLi9iYW5uZXItbTEtdGMuanBnXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTEtdGMuanBnXCIsXG5cdFwiLi9iYW5uZXItbTEtemguanBnXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTEtemguanBnXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXggc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC9iYW5uZXJcXFxcLW0xXFxcXC0uKlxcXFwuanBnJFwiOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index sync recursive ^\\.\\/banner\\-m1\\-.*\\.jpg$\n");

/***/ }),

/***/ "./src/assets/images/index sync recursive ^\\.\\/banner\\-m2\\-.*\\.jpg$":
/*!****************************************************************!*\
  !*** ./src/assets/images/index sync ^\.\/banner\-m2\-.*\.jpg$ ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var map = {\n\t\"./banner-m2-en.jpg\": \"./src/assets/images/index/banner-m2-en.jpg\",\n\t\"./banner-m2-tc.jpg\": \"./src/assets/images/index/banner-m2-tc.jpg\",\n\t\"./banner-m2-zh.jpg\": \"./src/assets/images/index/banner-m2-zh.jpg\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./src/assets/images/index sync recursive ^\\\\.\\\\/banner\\\\-m2\\\\-.*\\\\.jpg$\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleCBzeW5jIHJlY3Vyc2l2ZSBeXFwuXFwvYmFubmVyXFwtbTJcXC0uKlxcLmpwZyQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleCBzeW5jIF5cXC5cXC9iYW5uZXJcXC1tMlxcLS4qXFwuanBnJD8yODY5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBtYXAgPSB7XG5cdFwiLi9iYW5uZXItbTItZW4uanBnXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTItZW4uanBnXCIsXG5cdFwiLi9iYW5uZXItbTItdGMuanBnXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTItdGMuanBnXCIsXG5cdFwiLi9iYW5uZXItbTItemguanBnXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTItemguanBnXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXggc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC9iYW5uZXJcXFxcLW0yXFxcXC0uKlxcXFwuanBnJFwiOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index sync recursive ^\\.\\/banner\\-m2\\-.*\\.jpg$\n");

/***/ }),

/***/ "./src/assets/images/index sync recursive ^\\.\\/banner\\-p1\\-.*\\.png$":
/*!****************************************************************!*\
  !*** ./src/assets/images/index sync ^\.\/banner\-p1\-.*\.png$ ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var map = {\n\t\"./banner-p1-en.png\": \"./src/assets/images/index/banner-p1-en.png\",\n\t\"./banner-p1-tc.png\": \"./src/assets/images/index/banner-p1-tc.png\",\n\t\"./banner-p1-zh.png\": \"./src/assets/images/index/banner-p1-zh.png\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./src/assets/images/index sync recursive ^\\\\.\\\\/banner\\\\-p1\\\\-.*\\\\.png$\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleCBzeW5jIHJlY3Vyc2l2ZSBeXFwuXFwvYmFubmVyXFwtcDFcXC0uKlxcLnBuZyQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleCBzeW5jIF5cXC5cXC9iYW5uZXJcXC1wMVxcLS4qXFwucG5nJD8yY2ViIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBtYXAgPSB7XG5cdFwiLi9iYW5uZXItcDEtZW4ucG5nXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDEtZW4ucG5nXCIsXG5cdFwiLi9iYW5uZXItcDEtdGMucG5nXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDEtdGMucG5nXCIsXG5cdFwiLi9iYW5uZXItcDEtemgucG5nXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDEtemgucG5nXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXggc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC9iYW5uZXJcXFxcLXAxXFxcXC0uKlxcXFwucG5nJFwiOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index sync recursive ^\\.\\/banner\\-p1\\-.*\\.png$\n");

/***/ }),

/***/ "./src/assets/images/index sync recursive ^\\.\\/banner\\-p2\\-.*\\.png$":
/*!****************************************************************!*\
  !*** ./src/assets/images/index sync ^\.\/banner\-p2\-.*\.png$ ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("var map = {\n\t\"./banner-p2-en.png\": \"./src/assets/images/index/banner-p2-en.png\",\n\t\"./banner-p2-tc.png\": \"./src/assets/images/index/banner-p2-tc.png\",\n\t\"./banner-p2-zh.png\": \"./src/assets/images/index/banner-p2-zh.png\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./src/assets/images/index sync recursive ^\\\\.\\\\/banner\\\\-p2\\\\-.*\\\\.png$\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleCBzeW5jIHJlY3Vyc2l2ZSBeXFwuXFwvYmFubmVyXFwtcDJcXC0uKlxcLnBuZyQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleCBzeW5jIF5cXC5cXC9iYW5uZXJcXC1wMlxcLS4qXFwucG5nJD85MGZkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBtYXAgPSB7XG5cdFwiLi9iYW5uZXItcDItZW4ucG5nXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDItZW4ucG5nXCIsXG5cdFwiLi9iYW5uZXItcDItdGMucG5nXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDItdGMucG5nXCIsXG5cdFwiLi9iYW5uZXItcDItemgucG5nXCI6IFwiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDItemgucG5nXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXggc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC9iYW5uZXJcXFxcLXAyXFxcXC0uKlxcXFwucG5nJFwiOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index sync recursive ^\\.\\/banner\\-p2\\-.*\\.png$\n");

/***/ }),

/***/ "./src/assets/images/index/banner-m1-en.jpg":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-m1-en.jpg ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-m1-en.jpg\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTEtZW4uanBnLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLW0xLWVuLmpwZz85Y2E4Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLW0xLWVuLmpwZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-m1-en.jpg\n");

/***/ }),

/***/ "./src/assets/images/index/banner-m1-tc.jpg":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-m1-tc.jpg ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-m1-tc.jpg\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTEtdGMuanBnLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLW0xLXRjLmpwZz84NjhiIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLW0xLXRjLmpwZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-m1-tc.jpg\n");

/***/ }),

/***/ "./src/assets/images/index/banner-m1-zh.jpg":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-m1-zh.jpg ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-m1-zh.jpg\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTEtemguanBnLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLW0xLXpoLmpwZz9iNDNhIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLW0xLXpoLmpwZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-m1-zh.jpg\n");

/***/ }),

/***/ "./src/assets/images/index/banner-m2-en.jpg":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-m2-en.jpg ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-m2-en.jpg\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTItZW4uanBnLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLW0yLWVuLmpwZz83ZGUzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLW0yLWVuLmpwZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-m2-en.jpg\n");

/***/ }),

/***/ "./src/assets/images/index/banner-m2-tc.jpg":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-m2-tc.jpg ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-m2-tc.jpg\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTItdGMuanBnLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLW0yLXRjLmpwZz81MzE3Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLW0yLXRjLmpwZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-m2-tc.jpg\n");

/***/ }),

/***/ "./src/assets/images/index/banner-m2-zh.jpg":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-m2-zh.jpg ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-m2-zh.jpg\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItbTItemguanBnLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLW0yLXpoLmpwZz9iN2RlIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLW0yLXpoLmpwZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-m2-zh.jpg\n");

/***/ }),

/***/ "./src/assets/images/index/banner-p1-en.png":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-p1-en.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-p1-en.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDEtZW4ucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLXAxLWVuLnBuZz80YTM4Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLXAxLWVuLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-p1-en.png\n");

/***/ }),

/***/ "./src/assets/images/index/banner-p1-tc.png":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-p1-tc.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-p1-tc.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDEtdGMucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLXAxLXRjLnBuZz9mY2Y1Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLXAxLXRjLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-p1-tc.png\n");

/***/ }),

/***/ "./src/assets/images/index/banner-p1-zh.png":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-p1-zh.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-p1-zh.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDEtemgucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLXAxLXpoLnBuZz81ZTFjIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLXAxLXpoLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-p1-zh.png\n");

/***/ }),

/***/ "./src/assets/images/index/banner-p2-en.png":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-p2-en.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-p2-en.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDItZW4ucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLXAyLWVuLnBuZz9mMTdkIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLXAyLWVuLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-p2-en.png\n");

/***/ }),

/***/ "./src/assets/images/index/banner-p2-tc.png":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-p2-tc.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-p2-tc.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDItdGMucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLXAyLXRjLnBuZz8zOTQzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLXAyLXRjLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-p2-tc.png\n");

/***/ }),

/***/ "./src/assets/images/index/banner-p2-zh.png":
/*!**************************************************!*\
  !*** ./src/assets/images/index/banner-p2-zh.png ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/banner-p2-zh.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9iYW5uZXItcDItemgucG5nLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9pbWFnZXMvaW5kZXgvYmFubmVyLXAyLXpoLnBuZz82ZjIyIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWcvYmFubmVyLXAyLXpoLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/banner-p2-zh.png\n");

/***/ }),

/***/ "./src/assets/images/index/recommend-1.png":
/*!*************************************************!*\
  !*** ./src/assets/images/index/recommend-1.png ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/recommend-1.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMS5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMS5wbmc/M2E2NiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3JlY29tbWVuZC0xLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/recommend-1.png\n");

/***/ }),

/***/ "./src/assets/images/index/recommend-2.png":
/*!*************************************************!*\
  !*** ./src/assets/images/index/recommend-2.png ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/recommend-2.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMi5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMi5wbmc/YzM0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3JlY29tbWVuZC0yLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/recommend-2.png\n");

/***/ }),

/***/ "./src/assets/images/index/recommend-3.png":
/*!*************************************************!*\
  !*** ./src/assets/images/index/recommend-3.png ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/recommend-3.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMy5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtMy5wbmc/NTIzNSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3JlY29tbWVuZC0zLnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/recommend-3.png\n");

/***/ }),

/***/ "./src/assets/images/index/recommend-4.png":
/*!*************************************************!*\
  !*** ./src/assets/images/index/recommend-4.png ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

eval("module.exports = __webpack_require__.p + \"assets/img/recommend-4.png\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtNC5wbmcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ltYWdlcy9pbmRleC9yZWNvbW1lbmQtNC5wbmc/OTYyNyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1nL3JlY29tbWVuZC00LnBuZ1wiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assets/images/index/recommend-4.png\n");

/***/ }),

/***/ "./src/common/lang/en.js":
/*!*******************************!*\
  !*** ./src/common/lang/en.js ***!
  \*******************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = {\n  message: {\n    login: 'Login',\n    Username: 'Username',\n    Password: 'Password',\n    Captcha: 'Captcha',\n    Language: 'Language',\n    zh: 'Chinese',\n    en: 'English'\n  },\n  glbalTips: {\n    sessionLost: \"为了更好的体验,需要您登录后再进行此操作\"\n  },\n  form: {\n    datePicker: {\n      datePlaceholder: \"please select date\"\n    },\n    modalUploadCard: {\n      tit: \"請上傳證件資料\",\n      front: \"證件正面\",\n      back: \"證件反面\"\n    }\n  },\n  nav: {\n    loginData: {\n      name: \"login\",\n      path: \"\",\n      list: [{\n        name: \"register\",\n        path: \"/register\",\n        type: \"noAuth\",\n        value: \"\"\n      }, {\n        name: \"login\",\n        path: \"/login\",\n        type: \"noAuth\",\n        value: \"\"\n      }, {\n        name: \"modify password\",\n        path: \"/password/reset\",\n        type: \"auth\",\n        value: \"\"\n      }, {\n        name: \"profile\",\n        path: \"/infomation/improve\",\n        type: \"auth\",\n        value: \"\"\n      }, {\n        name: \"logout\",\n        path: \"\",\n        type: \"auth\",\n        value: \"logout\"\n      }]\n    },\n    navList: [{\n      name: \"Products\",\n      path: \"\",\n      list: [{\n        name: \"VHIS - Standard Plan\",\n        path: \"\",\n        value: \"gotoVHIS\"\n      }, {\n        name: \"Dividen Life Insurance\",\n        path: \"/product\"\n      }]\n    }, {\n      name: \"Customer Service\",\n      path: \"\",\n      list: [{\n        name: \"Customer Service\",\n        path: \"/custom/product\"\n      }, {\n        name: \"Contact Us\",\n        path: \"/custom/service?q=m1\"\n      }, {\n        name: \"Online Premium Payment\",\n        path: \"/custom/service?q=m2\"\n      }, {\n        name: \"Policy Inquiry\",\n        path: \"/custom/service?q=m3\"\n      }, {\n        name: \"Policy Change\",\n        path: \"/custom/service?q=m41\"\n      }, {\n        name: \"Claims\",\n        path: \"/custom/service?q=m5\"\n      }, {\n        name: \"E-reservation\",\n        path: \"/custom/service?q=m6\"\n      }, {\n        name: \"Complaints\",\n        path: \"/custom/service?q=m7\"\n      }, {\n        name: \"Useful Forms\",\n        path: \"/custom/service?q=m8\"\n      }]\n    }, {\n      name: \"About Us\",\n      path: \"\",\n      list: [{\n        name: \"Ping An (Life) HK\",\n        path: \"/profile\"\n      }, {\n        name: \"Company Events\",\n        path: \"/empty\"\n      }, {\n        name: \"News Center\",\n        path: \"/news/list\"\n      }, {\n        name: \"Corporate Social Responsibility\",\n        path: \"/empty\"\n      }, {\n        name: \"Awards\",\n        path: \"/empty\"\n      }]\n    }, {\n      name: \"Join Us\",\n      path: \"\",\n      list: [{\n        name: \"Corporate Culture\",\n        path: \"/empty\"\n      }, {\n        name: \"Career Opportunities\",\n        path: \"/empty\"\n      }]\n    }]\n  },\n  footer: {\n    hkPhone: \"HK Tel\",\n    cnPhone: \"CN Tel\",\n    aboutUs: \"About us\",\n    companyIntroduction: \"Company introduction\",\n    news: \"News\",\n    joinUs: \"Join us\",\n    helpCenter: \"Help center\",\n    privacy: \"Privacy Policy\",\n    terms: \"Terms of Use\",\n    protocol: \"Personal Data Collection Statement\",\n    map: \"Map\",\n    contactUs: \"Contact us\",\n    contactInformation: \"Contact Information\",\n    service: \"Service\",\n    qrcode: \"Official Accounts\",\n    copyright: \"版權所有 © 中國平安保險(集團)股份有限公司未經許可不得復制、轉載或摘編,違者必究!\"\n  },\n  login: {\n    title: \"PingAn One Connect Member Service\",\n    loginType1: \"Login with user name and password\",\n    loginType2: \"Dynamic password login\",\n    account: \"Account\",\n    accountPlaceholder: \"Please enter Mobile no./ One Connect User Name\",\n    password: \"Password\",\n    passwordPlaceholder: \"Please enter password\",\n    verifyPlaceholder: \"Please enter password\",\n    agree: \"Agree with \",\n    protocol: \" PingAn One Connect Member Service Agreement\",\n    login: \"Confirm\",\n    register: \"Register\",\n    forget: \"Forget password\",\n    mobile: \"Mobile no.\",\n    mobilePlaceholder: \"Please enter Mobile no\",\n    verifyCode: \"SMS verification code\",\n    verifyCodePlaceholder: \"SMS verification code\",\n    verifyCodeGet: \"Get SMS verification code\",\n    tips: {\n      e1: \"Please enter account\",\n      e2: \"Please enter the password\",\n      e3: \"Please enter the picture verification code\",\n      e4: \"Agree with PingAn One Connect Member Service Agreement\",\n      e5: \"Invalidate account or password, please re-enter\",\n      oe0: \"Invalidate mobile no. , please re-enter\",\n      oe1: \"Please get SMS verification code first\",\n      oe2: \"Please enter the picture verification code\",\n      oe3: \"Please enter the picture verification code\",\n      oe4: \"Invalidate SMS verification code, please re-enter\"\n    }\n  },\n  session: {\n    sidExpire: \"It has not been operated for a long time. For the sake of your account security, please restart\"\n  },\n  register: {\n    mobileOptions: [{\n      type: \"hk\",\n      name: \"HK No\",\n      placeHolder: \"Please enter 8-digit mobile number\",\n      areaCode: \"+852\"\n    }, {\n      type: \"zh\",\n      name: \"Mainland No.\",\n      placeHolder: \"Please enter 11-digit mobile number\",\n      areaCode: \"+86\"\n    }],\n    coutTips: \"{second}Seconds\",\n    title: \"Welcome\",\n    title2: \"Please set up new password\",\n    mobilePlaceholder: \"Please enter 8-digit mobile number\",\n    verifyCodePlaceholder: \"Please enter SMS verification code\",\n    verifyCodeGet: \"Get SMS verification code\",\n    agree: \"Agree with \",\n    protocol: \" PingAn One Connect Member Service Agreement\",\n    register: \"Click to reister\",\n    newPassword: \"Password\",\n    newPasswordPlaceholder: \"Please enter password\",\n    newPasswordSure: \"Confirm password\",\n    newPasswordSurePlaceholder: \"Please confirm password\",\n    sure: \"Confirm\",\n    tips: {\n      e1: \"Invalidate mobile no. , please re-enter\",\n      e2: \"Agree with PingAn One Connect Member Service Agreement\",\n      e3: \"Invalidate SMS verification code, please re-enter\",\n      e4: \"Please get SMS verification code first\",\n      e5: \"Your mobile no. is not register, please register before login\",\n      e6: \"Please enter the picture verification code\",\n      e7: \"Password length cannot be less than 8 bits\",\n      e8: \"Passwords must contain numbers, characters, and special numbers\",\n      e9: \"New password cannot be the same as the old one\",\n      e10: \"Verification code was Expired\",\n      e11: \"Registration failed, please contact the staff\",\n      e12: \"Success\"\n    }\n  },\n  passwordCheck: {\n    error1: \"Password length cannot be less than 8 bits\",\n    error2: \"Passwords must contain numbers, characters, and special numbers\",\n    error3: \"The passwords are inconsistent. Please confirm and re-enter\",\n    error4: \"Password modification failed. Please try again later or call 95511\",\n    error5: \"Current password is incorrect. Please re-enter\",\n    success: \"Success\"\n  },\n  passwordReset: {\n    oldPwd: \"Current password\",\n    oldPwdPlaceholde: \"Please enter current password\",\n    cidExpire: \"It has not been operated for a long time. For the sake of your account security, please restart\",\n    type1: {\n      title: \"Retrieve password\",\n      t1: \"Please enter user information\",\n      t1Placeholder: \"Mobile no./ One Connect User Name\",\n      submit: \"Confirm\",\n      error: \"Invalid mobile no./ user name, please re-enter\"\n    },\n    type2: {\n      title: \"Retrieve password\",\n      t1: \"SMS verification code\",\n      t1Placeholder: \"Please enter verification code\",\n      submit: \"Confirm\",\n      error1: \"Invalid verification code\",\n      error2: \"Verification code was Expired\",\n      error3: \"短信验证码发放时间少于1分钟,请稍后再试\"\n    },\n    type3: {\n      title: \"Retrieve password\",\n      t1: \"Please verify ID information\",\n      t1Placeholder: \"\",\n      submit: \"Confirm\"\n    },\n    type4: {\n      title: \"Please set up new password\",\n      t1: \"New password\",\n      t1Placeholder: \"Please enter new password\",\n      t2: \"Confirm password\",\n      t2Placeholder: \"Please re-enter new password\",\n      submit: \"Confirm\",\n      error1: \"Password length not less than 8 bits\",\n      error2: \"Passwords must contain numbers, characters, and special numbers\"\n    }\n  },\n  infomationImprove: {\n    title: \"Please complete all information\",\n    t1: \"姓名\",\n    t1c1: \"Surname\",\n    t1c2: \"Name\",\n    t1Placeholder: \"\",\n    t2: \"Sex\",\n    t2Placeholder: \"\",\n    t3: \"Date of birth\",\n    t3Placeholder: \"\",\n    t4: \"Type of ID\",\n    t4Placeholder: \"\",\n    t5: \"ID no.\",\n    t5Placeholder: \"\",\n    submit: \"Confirm\",\n    cancel: \"Skip\",\n    candidates: {\n      sex: [{\n        name: \"男\",\n        value: \"M\"\n      }, {\n        name: \"女\",\n        value: \"F\"\n      }],\n      idType: [{\n        name: \"身份證\",\n        value: \"1\"\n      }, {\n        name: \"護照\",\n        value: \"2\"\n      }, {\n        name: \"軍官證或士兵證\",\n        value: \"3\"\n      }, {\n        name: \"港澳通行證/回鄉證或台胞證\",\n        value: \"6\"\n      }, {\n        name: \"外國人永久居留身份證\",\n        value: \"O\"\n      }, {\n        name: \"港澳台居民居住證\",\n        value: \"V\"\n      }, {\n        name: \"台灣居民居住證\",\n        value: \"W\"\n      }, {\n        name: \"其他\",\n        value: \"0\"\n      }]\n    },\n    successMsg: \"更新成功\",\n    errorTips: {\n      e1: \"請填寫姓名信息\",\n      e2: \"請選擇性別\",\n      e3: \"請選擇生日\",\n      e4: \"請選擇證件類型\",\n      e5: \"請填寫證件號碼\",\n      e6: \"您填寫的證件號碼有誤\",\n      e7: \"您填寫的信息有誤,請核實後重新提交\"\n    }\n  },\n  index: {\n    news: \"新聞資訊\",\n    newMore: \"查看更多\",\n    recommend: {\n      t1: \"Online Quotation\",\n      t2: \"Customer Service\",\n      t3: \"Product Information\",\n      t4: \"Latest News\",\n      item1: {\n        btn: \"了解更多產品\",\n        t1: \"為自己和家人尋找壹份保障\"\n      },\n      item2: {\n        btn: \"立即預約\",\n        t1: \"在線預約 專業服務\"\n      },\n      item3: {\n        btn: \"客户服务\",\n        t1: \"專業客服為妳服務\",\n        t2: \"想了解更多,可致電\",\n        t3: \"95511\",\n        t4: \"聯絡我們,或進入\"\n      }\n    }\n  },\n  complaintAcceptance: {\n    name: \"Name\",\n    namePlaceholder: \"Name\",\n    contactType: \"Preferred Way of Contact\",\n    email: \"E-mail\",\n    question: \"Question/ Opinion\",\n    questionPlaceHolder: \"No more than 500 words\",\n    orderNo: \"Policy No\",\n    orderNoPlaceHolder: \"If you are Ping An customer, please provide the policy number\",\n    contactTime: \"Preferred Contact Date\",\n    notice1: \"The personal data collected in this form is processed in accordance with Ping An Life Insurance Company of China (HK), Ltd Personal Information Collection Statement and will only be used to contact you. However, the personal data collected will not be transferred to third-party organizations other than those specified in the \\\"Ping An Life Insurance Company of China (HK), Ltd Personal Data Collection Statement\\\" without your explicit authorization. You can choose not to provide us with the required personal information, but this may prevent us from contacting you. You can also access and correct your personal data in accordance with Ping An Life Insurance Company of China (HK), Ltd Personal Data Collection Statement。\",\n    notice2: \"I hereby confirm that I understand and agree that my personal data will be used for the above purposes in accordance with the Ping An Life Insurance Company of China (HK) Personal Data Collection Statement.\",\n    contactTypes: [{\n      name: 'Mobile',\n      value: 1\n    }, {\n      name: 'Email',\n      value: 2\n    }],\n    errorTips: {\n      e1: \"Please fill in this item\",\n      e2: \"Please fill in the correct contact information\"\n    },\n    success: \"Thank you for your comments\"\n  },\n  reservation: {\n    name: \"Name\",\n    namePlaceholder: \"Name\",\n    contactType: \"Preferred way of contact\",\n    contactTypeCadidates: [{\n      name: \"phone no\",\n      value: 1\n    }],\n    contact: \"Contact Number\",\n    contactPlaceholder: \"(HK No./ Mainland No.)\",\n    reservationType: \"Type of Reservation\",\n    reservationCandidates: [{\n      name: \"Insurance consultation\",\n      value: \"投保諮詢\"\n    }, {\n      name: \"Agent change\",\n      value: \"代办保单变更\"\n    }],\n    reservationRemark: \"Reservation Description\",\n    reservationRemarkPlaceholder: \"Optional, no more than 500 words, prompt text \\\"Please briefly explain the insurance type or business you want to consult\",\n    hkClient: \"Current Pingan HK Customer\",\n    yes: \"Yes\",\n    no: \"No\",\n    contactTime: \"Preferred Contact Date\",\n    notice1: \"The personal data collected in this form is processed in accordance with Ping An Life Insurance Company of China (HK), Ltd Personal Information Collection Statement and will only be used to contact you. However, the personal data collected will not be transferred to third-party organizations other than those specified in the \\\"Ping An Life Insurance Company of China (HK), Ltd Personal Data Collection Statement\\\" without your explicit authorization. You can choose not to provide us with the required personal information, but this may prevent us from contacting you. You can also access and correct your personal data in accordance with Ping An Life Insurance Company of China (HK), Ltd Personal Data Collection Statement。\",\n    notice2: \"I hereby confirm that I understand and agree that my personal data will be used for the above purposes in accordance with the Ping An Life Insurance Company of China (HK) Personal Data Collection Statement.\",\n    success: \"Success\",\n    submitBtn: 'Confirm',\n    errorTips: {\n      e1: \"Please fill in this item\",\n      e2: \"Please fill in the correct contact information\"\n    }\n  },\n  paymentType: {\n    menu1: \"Payment in Person at Cashier\",\n    menu2: \"Internet Banking\",\n    menu3: \"Telegrapgic Transfer\",\n    menu4: \"JETCO ATM\",\n    menu5: \"PPS\",\n    menu6: \"Hong Kong Post\"\n  },\n  product: {\n    btnPosition: \"Booking service\",\n    iconProblem: \"Common problem\",\n    iconProcess: \"Insurance process\",\n    iconProduct: \"Product details\"\n  },\n  customProduct: {\n    menu1: \"Contact us\",\n    menu2: \"Pay premium\",\n    menu3: \"Query policy\",\n    menu4: \"Change policy\",\n    menu5: \"Claim report\",\n    menu6: \"Reservation service\",\n    menu7: \"Suggestions\",\n    menu8: \"Common form\"\n  },\n  commonForm: {\n    head1: \"Type of Forms\",\n    head2: \"Forms\",\n    head3: \"Purpose\",\n    head4: \"Attachment\",\n    download: \"Download\",\n    form: [{\n      type: \"Payment\",\n      list: [{\n        name: \"「E-account Service」and Direct Debit Authorization Application for Bank Account\",\n        desc: \"For applying e-service account and direct debit authorization\",\n        download: \"\"\n      }, {\n        name: \"Credit Card Account Direct Debit Authorization\",\n        desc: \"Application for credit card direct debit\",\n        download: \"\"\n      }]\n    }, {\n      type: \"Change of Policy\",\n      list: [{\n        name: \"Policy Termination Application Form\",\n        desc: \"Policy surrender\",\n        download: \"\"\n      }, {\n        name: \"Application for Change of Policy Form(Policy Loan Repayment)\",\n        desc: \"Policy loan\",\n        download: \"\"\n      }, {\n        name: \"Application for Change of Policy Form(Change of Policy)\",\n        desc: \"Newly added premium, deducted premium\",\n        download: \"\"\n      }, {\n        name: \"Application for Change of Policy Form(Change of Customer Information)\",\n        desc: \"Basic Information Change\",\n        download: \"\"\n      }, {\n        name: \"Application for Change of Policy Form(Change of Beneficiary)\",\n        desc: \"Mode of payment, self-replacement and reissues\",\n        download: \"\"\n      }, {\n        name: \"Authorization Letter\",\n        desc: \"To authorize 3rd party to handle on behalf of policy owner\",\n        download: \"\"\n      }, {\n        name: \"Tax Statement\",\n        desc: \"CRS\",\n        download: \"\"\n      }, {\n        name: \"Health Declaration\",\n        desc: \"For underwriting purpose\",\n        download: \"\"\n      }]\n    }, {\n      type: \"Claims\",\n      list: [{\n        name: \"Claims Form\",\n        desc: \"For written claims application\",\n        download: \"\"\n      }]\n    }]\n  },\n  policyChangeGuide: {\n    notice: \"If you need to modify please\",\n    noticeLink: \"contact customer service\",\n    head1: \"Item\",\n    head2: \"Details\",\n    head3: \"Applicant\",\n    head4: \"Deadline\",\n    head5: \"Materials to be submitted\",\n    download: \"下載文檔\",\n    form: [{\n      project: \"Policy Surrender\",\n      content: \"Cancellation of contract after the cooling-off period, the company will refund the policy cash value\",\n      applicant: \"Policy Owner\",\n      receptionTime: \"Before Policy Expires\",\n      materialList: [{\n        name: \"Policy\"\n      }, {\n        name: \"Application form\",\n        type: 1\n      }, {\n        name: \"ID card of Policy Owner\"\n      }, {\n        name: \"Bank information\"\n      }]\n    }, {\n      project: \"Policy Surrender within cool off period\",\n      content: \"If the contract is cancelled within the cooling-off period, the company will refund the entire premium without interest.\",\n      applicant: \"Policy Owner\",\n      receptionTime: \"Before cool off period\",\n      materialList: [{\n        name: \"Policy\"\n      }, {\n        name: \"Application form\",\n        type: 1\n      }, {\n        name: \"ID card of Policy Owner\"\n      }, {\n        name: \"Bank information\"\n      }, {\n        name: \"First premium receipt\"\n      }]\n    }, {\n      project: \"Change of Customer Information\",\n      projectType: 1,\n      path: \"/custom/service\",\n      query: {\n        q: \"m42\"\n      },\n      content: \"Change of Policy Owner, Insured and Beneficiary informat\",\n      applicant: \"Policy Owner\",\n      receptionTime: \"Anytime\",\n      materialList: [{\n        name: \"Application form\",\n        type: 1\n      }, {\n        name: \"Other necessary proving documents\"\n      }]\n    }, {\n      project: \"Change of Contact Information\",\n      projectType: 1,\n      path: \"/custom/service\",\n      query: {\n        q: \"m43\"\n      },\n      content: \"Change of address, contact no.\",\n      applicant: \"Policy Owner\",\n      receptionTime: \"Anytime\",\n      materialList: [{\n        name: \"Application form\",\n        type: 1\n      }, {\n        name: \"ID card of Policy Owner\"\n      }]\n    }, {\n      project: \"Change of Payment Information\",\n      content: \"Change of mode of payment or payement account\",\n      applicant: \"Policy Owner\",\n      receptionTime: \"Before the expiration of policy payment\",\n      materialList: [{\n        name: \"Application form\",\n        type: 1\n      }, {\n        name: \"Policy\"\n      }]\n    }]\n  },\n  policyChangeContact: {\n    phone: \"Contact Number\",\n    address: \"Correspondence Address\",\n    email: \"E-Mail\",\n    checkTips: \"I do not agree to receive promotional information\",\n    submit: \"Save\",\n    errorTips: {\n      e1: \"Please enter the collect mobile no\",\n      e2: \"請填寫聯繫地址\",\n      e3: \"Please enter the collect E-mail\"\n    },\n    success: \"Success\"\n  },\n  policyChangeInformation: {\n    title: \"Change of Customer Information\",\n    owner: \"Policy Owner\",\n    insured: \"Insured\",\n    obj: \"Select for change\",\n    name: \"Name\",\n    sex: \"Sex\",\n    birth: \"Date of Birth\",\n    type: \"Type of Identification Document\",\n    NO: \"ID No.\",\n    validityPeriod: \"ID Validation Date\",\n    nationality: \"Nationality\",\n    employer: \"Employer\",\n    maritalStatus: \"Marital Status\",\n    submit: \"Save\",\n    upload: \"Upload Attachment\",\n    modifyTips1: \"If you need to modify please\",\n    modifyTips2: \"contact customer service\",\n    success: \"Success\"\n  },\n  contactUs: {\n    service: {\n      center: {\n        title: \"Customer Service Center\",\n        address: \"Address: Unit 3501 - 7 & 14, Floor 35, The Gateway Tower 5, Tsim Sha Tsui, Hong Kong\",\n        time: \"Service Hour:9 a.m.  - 6 p.m. , Monday to Friday\"\n      },\n      hotline: {\n        title: \"Customer Service Hotline\",\n        hk: \"Hong Kong:(852)  2983 8866\",\n        cn: \"Mainland:(86) 40078 95511\",\n        time: \"Service Hour:9 a.m.  - 6 p.m. , Monday to Friday\"\n      },\n      mail: {\n        title: \"Customer Service Email\",\n        mail: \"cs@pingan.com.hk\"\n      }\n    },\n    pulbic: {\n      title: \"Official WeChat Account\",\n      m1: \"Login to the \\\"WeChat\\\" APP, press the \\\"+\\\" button in the upper right corner and select \\\"Add Friend\\\", select \\\"Public Account\\\" Enter and search \\\"Ping An Life Hong Kong\\\"\",\n      m2: \"Log in to the WeChat APP, press the \\\"+\\\" button in the upper right corner and select \\\"Scan\\\" to scan the QR code below(QR Code here)\"\n    },\n    qrcode: {\n      title: \"Official WeChat Account\"\n    }\n  },\n  customService: {\n    name: \"Customer service\",\n    menu1: \"Contact Us\",\n    menu2: \"Online Premium Payment\",\n    menu3: \"Policy Inquiry\",\n    menu4: \"Policy Change\",\n    menu41: \"Policy Change Guideline\",\n    menu42: \"Change of Contact Information\",\n    menu43: \"Change of Customer Information\",\n    menu5: \"Claims\",\n    menu6: \"E-reservation\",\n    menu7: \"Complaints\",\n    menu8: \"Useful Forms\",\n    insuranceQuery: {\n      modify: \"modify\",\n      InsurantNumber: \"Policy Number\",\n      Insurant: \"Insured\",\n      InsurantName: \"Policy Type\",\n      InsurantAmount: \"Sum Insured\",\n      effectiveDate: \"Premium Due Date\",\n      period: \"Protection Duration\",\n      t2Title: \"Policy Information\",\n      t2n1: \"Policy Type\",\n      t2n2: \"Sum Insured\",\n      t2n3: \"Effective Date\",\n      t2n4: \"Protection Duration\",\n      t2n5: \"Name of Insured(Chinese)\",\n      t2n6: \"Name of Insured (English) \",\n      t2n7: \"Date of Birth\",\n      t2n8: \"ID No\",\n      t3Title: \"Customer Information\",\n      t3n1: \"Name of Policy Owner(Chinese)\",\n      t3n2: \"Name of Policy Owner(English)\",\n      t3n3: \"Date of Birth\",\n      t3n4: \"ID No\",\n      t3n5: \"Postal Address\",\n      t3n6: \"Residential Address\",\n      t3n7: \"Mobile No.\",\n      t3n8: \"Email\",\n      t4Title: \"Beneficiary information\",\n      t4NameCn: \"Name(Chinese)\",\n      t4NameEn: \"Name (English)\",\n      t4Relation: \"Relationship with Insured\",\n      t4Allocation: \"Distribution ratio\",\n      t5Title: \"Payment information\",\n      t5PaymentPeriod: \"Payment period\",\n      t5PaymentMethod: \"Mode of Payment\",\n      t5PaymentCurrency: \"Currency\",\n      t5CurrentPremium: \"Current premium\",\n      t5PaymentBank: \"Bank\",\n      t5PaymentAccount: \"Payment Account\",\n      t6Title: \"Payment History\",\n      t6PaymentPeriod: \"Installment\",\n      t6PaymentMethod: \"Mode of Payment\",\n      t6ClosingDate: \"Received Date\",\n      t6PaymentAmount: \"Amount\",\n      showMore: \"Show All Policies\",\n      noPolicy: \"You haven't bought any policy, if you have any questions please\",\n      customService: \" contact customer service\"\n    },\n    unauth: {\n      tips: \"If you have a ping an all in one account account, it can help us provide better services for you\",\n      or: \"or\",\n      login: \" login\",\n      register: \" register\",\n      baseInfoTip: \"Your complete information can help us to provide you with complete services\",\n      infoBtn: \" Go to perfection\"\n    }\n  },\n  pagination: {\n    firstPage: \"first\",\n    nextPage: \"next\",\n    goto: \"Go to\",\n    per: \"page\",\n    page: \"\"\n  }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tbW9uL2xhbmcvZW4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL2xhbmcvZW4uanM/MWUwNiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcblx0bWVzc2FnZToge1xuXHRcdGxvZ2luOiAnTG9naW4nLFxuXHRcdFVzZXJuYW1lOiAnVXNlcm5hbWUnLFxuXHRcdFBhc3N3b3JkOiAnUGFzc3dvcmQnLFxuXHRcdENhcHRjaGE6ICdDYXB0Y2hhJyxcblx0XHRMYW5ndWFnZTogJ0xhbmd1YWdlJyxcblx0XHR6aDogJ0NoaW5lc2UnLFxuXHRcdGVuOiAnRW5nbGlzaCdcblx0fSxcblx0Z2xiYWxUaXBzOiB7XG5cdFx0c2Vzc2lvbkxvc3Q6IFwi5Li65LqG5pu05aW955qE5L2T6aqM77yM6ZyA6KaB5oKo55m75b2V5ZCO5YaN6L+b6KGM5q2k5pON5L2cXCJcblx0fSxcblx0Zm9ybToge1xuXHRcdGRhdGVQaWNrZXI6IHtcblx0XHRcdGRhdGVQbGFjZWhvbGRlcjogXCJwbGVhc2Ugc2VsZWN0IGRhdGVcIlxuXHRcdH0sXG5cdFx0bW9kYWxVcGxvYWRDYXJkOiB7XG5cdFx0XHR0aXQ6IFwi6KuL5LiK5YKz6K2J5Lu26LOH5paZXCIsXG5cdFx0XHRmcm9udDogXCLorYnku7bmraPpnaJcIixcblx0XHRcdGJhY2s6IFwi6K2J5Lu25Y+N6Z2iXCIsXG5cdFx0fVxuXHR9LFxuXHRuYXY6IHtcblx0XHRsb2dpbkRhdGE6IHtcblx0XHRcdG5hbWU6IFwibG9naW5cIixcblx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcInJlZ2lzdGVyXCIsXG5cdFx0XHRcdHBhdGg6IFwiL3JlZ2lzdGVyXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9BdXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBcIlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwibG9naW5cIixcblx0XHRcdFx0cGF0aDogXCIvbG9naW5cIixcblx0XHRcdFx0dHlwZTogXCJub0F1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwibW9kaWZ5IHBhc3N3b3JkXCIsXG5cdFx0XHRcdHBhdGg6IFwiL3Bhc3N3b3JkL3Jlc2V0XCIsXG5cdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJwcm9maWxlXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2luZm9tYXRpb24vaW1wcm92ZVwiLFxuXHRcdFx0XHR0eXBlOiBcImF1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwibG9nb3V0XCIsXG5cdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJsb2dvdXRcIlxuXHRcdFx0fSxcblx0XHRcdF1cblx0XHR9LFxuXHRcdG5hdkxpc3Q6IFt7XG5cdFx0XHRuYW1lOiBcIlByb2R1Y3RzXCIsXG5cdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCJWSElTIC0gU3RhbmRhcmQgUGxhblwiLFxuXHRcdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0XHR2YWx1ZTogXCJnb3RvVkhJU1wiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkRpdmlkZW4gTGlmZSBJbnN1cmFuY2VcIixcblx0XHRcdFx0cGF0aDogXCIvcHJvZHVjdFwiXG5cdFx0XHR9XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bmFtZTogXCJDdXN0b21lciBTZXJ2aWNlXCIsXG5cdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCJDdXN0b21lciBTZXJ2aWNlXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3Byb2R1Y3RcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCJDb250YWN0IFVzXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tMVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIk9ubGluZSBQcmVtaXVtIFBheW1lbnRcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW0yXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6IFwiUG9saWN5IElucXVpcnlcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW0zXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6IFwiUG9saWN5IENoYW5nZVwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTQxXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6IFwiQ2xhaW1zXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tNVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIkUtcmVzZXJ2YXRpb25cIixcblx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW02XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6IFwiQ29tcGxhaW50c1wiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTdcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCJVc2VmdWwgRm9ybXNcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW04XCJcblx0XHRcdFx0fSxcblx0XHRcdF1cblx0XHR9LFxuXHRcdHtcblx0XHRcdG5hbWU6IFwiQWJvdXQgVXNcIixcblx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIlBpbmcgQW4gKExpZmUpIEhLXCIsXG5cdFx0XHRcdHBhdGg6IFwiL3Byb2ZpbGVcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJDb21wYW55IEV2ZW50c1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwiTmV3cyBDZW50ZXJcIixcblx0XHRcdFx0cGF0aDogXCIvbmV3cy9saXN0XCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiQ29ycG9yYXRlIFNvY2lhbCBSZXNwb25zaWJpbGl0eVwiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkF3YXJkc1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bmFtZTogXCJKb2luIFVzXCIsXG5cdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCJDb3Jwb3JhdGUgQ3VsdHVyZVwiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkNhcmVlciBPcHBvcnR1bml0aWVzXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2VtcHR5XCJcblx0XHRcdH0sXG5cdFx0XHRdXG5cdFx0fV1cblx0fSxcblx0Zm9vdGVyOiB7XG5cdFx0aGtQaG9uZTogXCJISyBUZWxcIixcblx0XHRjblBob25lOiBcIkNOIFRlbFwiLFxuXHRcdGFib3V0VXM6IFwiQWJvdXQgdXNcIixcblx0XHRjb21wYW55SW50cm9kdWN0aW9uOiBcIkNvbXBhbnkgaW50cm9kdWN0aW9uXCIsXG5cdFx0bmV3czogXCJOZXdzXCIsXG5cdFx0am9pblVzOiBcIkpvaW4gdXNcIixcblx0XHRoZWxwQ2VudGVyOiBcIkhlbHAgY2VudGVyXCIsXG5cdFx0cHJpdmFjeTogXCJQcml2YWN5IFBvbGljeVwiLFxuXHRcdHRlcm1zOiBcIlRlcm1zIG9mIFVzZVwiLFxuXHRcdHByb3RvY29sOiBcIlBlcnNvbmFsIERhdGEgQ29sbGVjdGlvbiBTdGF0ZW1lbnRcIixcblx0XHRtYXA6IFwiTWFwXCIsXG5cdFx0Y29udGFjdFVzOiBcIkNvbnRhY3QgdXNcIixcblx0XHRjb250YWN0SW5mb3JtYXRpb246IFwiQ29udGFjdCBJbmZvcm1hdGlvblwiLFxuXHRcdHNlcnZpY2U6IFwiU2VydmljZVwiLFxuXHRcdHFyY29kZTogXCJPZmZpY2lhbCBBY2NvdW50c1wiLFxuXHRcdGNvcHlyaWdodDogXCLniYjmrIrmiYDmnIkgwqkg5Lit5ZyL5bmz5a6J5L+d6Zqq77yI6ZuG5ZyY77yJ6IKh5Lu95pyJ6ZmQ5YWs5Y+45pyq57aT6Kix5Y+v5LiN5b6X5b6p5Yi244CB6L2J6LyJ5oiW5pGY57eo77yM6YGV6ICF5b+F56m2IVwiXG5cdH0sXG5cdGxvZ2luOiB7XG5cdFx0dGl0bGU6IFwiUGluZ0FuIE9uZSBDb25uZWN0IE1lbWJlciBTZXJ2aWNlXCIsXG5cdFx0bG9naW5UeXBlMTogXCJMb2dpbiB3aXRoIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmRcIixcblx0XHRsb2dpblR5cGUyOiBcIkR5bmFtaWMgcGFzc3dvcmQgbG9naW5cIixcblx0XHRhY2NvdW50OiBcIkFjY291bnRcIixcblx0XHRhY2NvdW50UGxhY2Vob2xkZXI6IFwiUGxlYXNlIGVudGVyIE1vYmlsZSBuby4vIE9uZSBDb25uZWN0IFVzZXIgTmFtZVwiLFxuXHRcdHBhc3N3b3JkOiBcIlBhc3N3b3JkXCIsXG5cdFx0cGFzc3dvcmRQbGFjZWhvbGRlcjogXCJQbGVhc2UgZW50ZXIgcGFzc3dvcmRcIixcblx0XHR2ZXJpZnlQbGFjZWhvbGRlcjogXCJQbGVhc2UgZW50ZXIgcGFzc3dvcmRcIixcblx0XHRhZ3JlZTogXCJBZ3JlZSB3aXRoIFwiLFxuXHRcdHByb3RvY29sOiBcIiBQaW5nQW4gT25lIENvbm5lY3QgTWVtYmVyIFNlcnZpY2UgQWdyZWVtZW50XCIsXG5cdFx0bG9naW46IFwiQ29uZmlybVwiLFxuXHRcdHJlZ2lzdGVyOiBcIlJlZ2lzdGVyXCIsXG5cdFx0Zm9yZ2V0OiBcIkZvcmdldCBwYXNzd29yZFwiLFxuXHRcdG1vYmlsZTogXCJNb2JpbGUgbm8uXCIsXG5cdFx0bW9iaWxlUGxhY2Vob2xkZXI6IFwiUGxlYXNlIGVudGVyIE1vYmlsZSBub1wiLFxuXHRcdHZlcmlmeUNvZGU6IFwiU01TIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG5cdFx0dmVyaWZ5Q29kZVBsYWNlaG9sZGVyOiBcIlNNUyB2ZXJpZmljYXRpb24gY29kZVwiLFxuXHRcdHZlcmlmeUNvZGVHZXQ6IFwiR2V0IFNNUyB2ZXJpZmljYXRpb24gY29kZVwiLFxuXHRcdHRpcHM6IHtcblx0XHRcdGUxOiBcIlBsZWFzZSBlbnRlciBhY2NvdW50XCIsXG5cdFx0XHRlMjogXCJQbGVhc2UgZW50ZXIgdGhlIHBhc3N3b3JkXCIsXG5cdFx0XHRlMzogXCJQbGVhc2UgZW50ZXIgdGhlIHBpY3R1cmUgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHRcdGU0OiBcIkFncmVlIHdpdGggUGluZ0FuIE9uZSBDb25uZWN0IE1lbWJlciBTZXJ2aWNlIEFncmVlbWVudFwiLFxuXHRcdFx0ZTU6IFwiSW52YWxpZGF0ZSBhY2NvdW50IG9yIHBhc3N3b3JkLCBwbGVhc2UgcmUtZW50ZXJcIixcblx0XHRcdG9lMDogXCJJbnZhbGlkYXRlIG1vYmlsZSBuby4gLCBwbGVhc2UgcmUtZW50ZXJcIixcblx0XHRcdG9lMTogXCJQbGVhc2UgZ2V0IFNNUyB2ZXJpZmljYXRpb24gY29kZSBmaXJzdFwiLFxuXHRcdFx0b2UyOiBcIlBsZWFzZSBlbnRlciB0aGUgcGljdHVyZSB2ZXJpZmljYXRpb24gY29kZVwiLFxuXHRcdFx0b2UzOiBcIlBsZWFzZSBlbnRlciB0aGUgcGljdHVyZSB2ZXJpZmljYXRpb24gY29kZVwiLFxuXHRcdFx0b2U0OiBcIkludmFsaWRhdGUgU01TIHZlcmlmaWNhdGlvbiBjb2RlLCBwbGVhc2UgcmUtZW50ZXJcIixcblx0XHR9XG5cdH0sXG5cdHNlc3Npb246IHtcblx0XHRzaWRFeHBpcmU6IFwiSXQgaGFzIG5vdCBiZWVuIG9wZXJhdGVkIGZvciBhIGxvbmcgdGltZS4gRm9yIHRoZSBzYWtlIG9mIHlvdXIgYWNjb3VudCBzZWN1cml0eSwgcGxlYXNlIHJlc3RhcnRcIixcblx0fSxcblx0cmVnaXN0ZXI6IHtcblx0XHRtb2JpbGVPcHRpb25zOiBbe1xuXHRcdFx0dHlwZTogXCJoa1wiLFxuXHRcdFx0bmFtZTogXCJISyBOb1wiLFxuXHRcdFx0cGxhY2VIb2xkZXI6IFwiUGxlYXNlIGVudGVyIDgtZGlnaXQgbW9iaWxlIG51bWJlclwiLFxuXHRcdFx0YXJlYUNvZGU6IFwiKzg1MlwiXG5cdFx0fSwge1xuXHRcdFx0dHlwZTogXCJ6aFwiLFxuXHRcdFx0bmFtZTogXCJNYWlubGFuZCBOby5cIixcblx0XHRcdHBsYWNlSG9sZGVyOiBcIlBsZWFzZSBlbnRlciAxMS1kaWdpdCBtb2JpbGUgbnVtYmVyXCIsXG5cdFx0XHRhcmVhQ29kZTogXCIrODZcIlxuXHRcdH1dLFxuXHRcdGNvdXRUaXBzOiBcIntzZWNvbmR9U2Vjb25kc1wiLFxuXHRcdHRpdGxlOiBcIldlbGNvbWVcIixcblx0XHR0aXRsZTI6IFwiUGxlYXNlIHNldCB1cCBuZXcgcGFzc3dvcmRcIixcblx0XHRtb2JpbGVQbGFjZWhvbGRlcjogXCJQbGVhc2UgZW50ZXIgOC1kaWdpdCBtb2JpbGUgbnVtYmVyXCIsXG5cdFx0dmVyaWZ5Q29kZVBsYWNlaG9sZGVyOiBcIlBsZWFzZSBlbnRlciBTTVMgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHR2ZXJpZnlDb2RlR2V0OiBcIkdldCBTTVMgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHRhZ3JlZTogXCJBZ3JlZSB3aXRoIFwiLFxuXHRcdHByb3RvY29sOiBcIiBQaW5nQW4gT25lIENvbm5lY3QgTWVtYmVyIFNlcnZpY2UgQWdyZWVtZW50XCIsXG5cdFx0cmVnaXN0ZXI6IFwiQ2xpY2sgdG8gcmVpc3RlclwiLFxuXHRcdG5ld1Bhc3N3b3JkOiBcIlBhc3N3b3JkXCIsXG5cdFx0bmV3UGFzc3dvcmRQbGFjZWhvbGRlcjogXCJQbGVhc2UgZW50ZXIgcGFzc3dvcmRcIixcblx0XHRuZXdQYXNzd29yZFN1cmU6IFwiQ29uZmlybSBwYXNzd29yZFwiLFxuXHRcdG5ld1Bhc3N3b3JkU3VyZVBsYWNlaG9sZGVyOiBcIlBsZWFzZSBjb25maXJtIHBhc3N3b3JkXCIsXG5cdFx0c3VyZTogXCJDb25maXJtXCIsXG5cdFx0dGlwczoge1xuXHRcdFx0ZTE6IFwiSW52YWxpZGF0ZSBtb2JpbGUgbm8uICwgcGxlYXNlIHJlLWVudGVyXCIsXG5cdFx0XHRlMjogXCJBZ3JlZSB3aXRoIFBpbmdBbiBPbmUgQ29ubmVjdCBNZW1iZXIgU2VydmljZSBBZ3JlZW1lbnRcIixcblx0XHRcdGUzOiBcIkludmFsaWRhdGUgU01TIHZlcmlmaWNhdGlvbiBjb2RlLCBwbGVhc2UgcmUtZW50ZXJcIixcblx0XHRcdGU0OiBcIlBsZWFzZSBnZXQgU01TIHZlcmlmaWNhdGlvbiBjb2RlIGZpcnN0XCIsXG5cdFx0XHRlNTogXCJZb3VyIG1vYmlsZSBuby4gaXMgbm90IHJlZ2lzdGVyLCBwbGVhc2UgcmVnaXN0ZXIgYmVmb3JlIGxvZ2luXCIsXG5cdFx0XHRlNjogXCJQbGVhc2UgZW50ZXIgdGhlIHBpY3R1cmUgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHRcdGU3OiBcIlBhc3N3b3JkIGxlbmd0aCBjYW5ub3QgYmUgbGVzcyB0aGFuIDggYml0c1wiLFxuXHRcdFx0ZTg6IFwiUGFzc3dvcmRzIG11c3QgY29udGFpbiBudW1iZXJzLCBjaGFyYWN0ZXJzLCBhbmQgc3BlY2lhbCBudW1iZXJzXCIsXG5cdFx0XHRlOTogXCJOZXcgcGFzc3dvcmQgY2Fubm90IGJlIHRoZSBzYW1lIGFzIHRoZSBvbGQgb25lXCIsXG5cdFx0XHRlMTA6IFwiVmVyaWZpY2F0aW9uIGNvZGUgd2FzIEV4cGlyZWRcIixcblx0XHRcdGUxMTogXCJSZWdpc3RyYXRpb24gZmFpbGVkLCBwbGVhc2UgY29udGFjdCB0aGUgc3RhZmZcIixcblx0XHRcdGUxMjogXCJTdWNjZXNzXCIsXG5cdFx0fVxuXHR9LFxuXHRwYXNzd29yZENoZWNrOiB7XG5cdFx0ZXJyb3IxOiBcIlBhc3N3b3JkIGxlbmd0aCBjYW5ub3QgYmUgbGVzcyB0aGFuIDggYml0c1wiLFxuXHRcdGVycm9yMjogXCJQYXNzd29yZHMgbXVzdCBjb250YWluIG51bWJlcnMsIGNoYXJhY3RlcnMsIGFuZCBzcGVjaWFsIG51bWJlcnNcIixcblx0XHRlcnJvcjM6IFwiVGhlIHBhc3N3b3JkcyBhcmUgaW5jb25zaXN0ZW50LiBQbGVhc2UgY29uZmlybSBhbmQgcmUtZW50ZXJcIixcblx0XHRlcnJvcjQ6IFwiUGFzc3dvcmQgbW9kaWZpY2F0aW9uIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlciBvciBjYWxsIDk1NTExXCIsXG5cdFx0ZXJyb3I1OiBcIkN1cnJlbnQgcGFzc3dvcmQgaXMgaW5jb3JyZWN0LiBQbGVhc2UgcmUtZW50ZXJcIixcblx0XHRzdWNjZXNzOiBcIlN1Y2Nlc3NcIlxuXHR9LFxuXHRwYXNzd29yZFJlc2V0OiB7XG5cdFx0b2xkUHdkOiBcIkN1cnJlbnQgcGFzc3dvcmRcIixcblx0XHRvbGRQd2RQbGFjZWhvbGRlOiBcIlBsZWFzZSBlbnRlciBjdXJyZW50IHBhc3N3b3JkXCIsXG5cdFx0Y2lkRXhwaXJlOiBcIkl0IGhhcyBub3QgYmVlbiBvcGVyYXRlZCBmb3IgYSBsb25nIHRpbWUuIEZvciB0aGUgc2FrZSBvZiB5b3VyIGFjY291bnQgc2VjdXJpdHksIHBsZWFzZSByZXN0YXJ0XCIsXG5cdFx0dHlwZTE6IHtcblx0XHRcdHRpdGxlOiBcIlJldHJpZXZlIHBhc3N3b3JkXCIsXG5cdFx0XHR0MTogXCJQbGVhc2UgZW50ZXIgdXNlciBpbmZvcm1hdGlvblwiLFxuXHRcdFx0dDFQbGFjZWhvbGRlcjogXCJNb2JpbGUgbm8uLyBPbmUgQ29ubmVjdCBVc2VyIE5hbWVcIixcblx0XHRcdHN1Ym1pdDogXCJDb25maXJtXCIsXG5cdFx0XHRlcnJvcjogXCJJbnZhbGlkIG1vYmlsZSBuby4vIHVzZXIgbmFtZSwgcGxlYXNlIHJlLWVudGVyXCIsXG5cdFx0fSxcblx0XHR0eXBlMjoge1xuXHRcdFx0dGl0bGU6IFwiUmV0cmlldmUgcGFzc3dvcmRcIixcblx0XHRcdHQxOiBcIlNNUyB2ZXJpZmljYXRpb24gY29kZVwiLFxuXHRcdFx0dDFQbGFjZWhvbGRlcjogXCJQbGVhc2UgZW50ZXIgdmVyaWZpY2F0aW9uIGNvZGVcIixcblx0XHRcdHN1Ym1pdDogXCJDb25maXJtXCIsXG5cdFx0XHRlcnJvcjE6IFwiSW52YWxpZCB2ZXJpZmljYXRpb24gY29kZVwiLFxuXHRcdFx0ZXJyb3IyOiBcIlZlcmlmaWNhdGlvbiBjb2RlIHdhcyBFeHBpcmVkXCIsXG5cdFx0XHRlcnJvcjM6IFwi55+t5L+h6aqM6K+B56CB5Y+R5pS+5pe26Ze05bCR5LqOMeWIhumSn++8jOivt+eojeWQjuWGjeivlVwiLFxuXHRcdH0sXG5cdFx0dHlwZTM6IHtcblx0XHRcdHRpdGxlOiBcIlJldHJpZXZlIHBhc3N3b3JkXCIsXG5cdFx0XHR0MTogXCJQbGVhc2UgdmVyaWZ5IElEIGluZm9ybWF0aW9uXCIsXG5cdFx0XHR0MVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdFx0c3VibWl0OiBcIkNvbmZpcm1cIixcblx0XHR9LFxuXHRcdHR5cGU0OiB7XG5cdFx0XHR0aXRsZTogXCJQbGVhc2Ugc2V0IHVwIG5ldyBwYXNzd29yZFwiLFxuXHRcdFx0dDE6IFwiTmV3IHBhc3N3b3JkXCIsXG5cdFx0XHR0MVBsYWNlaG9sZGVyOiBcIlBsZWFzZSBlbnRlciBuZXcgcGFzc3dvcmRcIixcblx0XHRcdHQyOiBcIkNvbmZpcm0gcGFzc3dvcmRcIixcblx0XHRcdHQyUGxhY2Vob2xkZXI6IFwiUGxlYXNlIHJlLWVudGVyIG5ldyBwYXNzd29yZFwiLFxuXHRcdFx0c3VibWl0OiBcIkNvbmZpcm1cIixcblx0XHRcdGVycm9yMTogXCJQYXNzd29yZCBsZW5ndGggbm90IGxlc3MgdGhhbiA4IGJpdHNcIixcblx0XHRcdGVycm9yMjogXCJQYXNzd29yZHMgbXVzdCBjb250YWluIG51bWJlcnMsIGNoYXJhY3RlcnMsIGFuZCBzcGVjaWFsIG51bWJlcnNcIixcblx0XHR9XG5cdH0sXG5cdGluZm9tYXRpb25JbXByb3ZlOiB7XG5cdFx0dGl0bGU6IFwiUGxlYXNlIGNvbXBsZXRlIGFsbCBpbmZvcm1hdGlvblwiLFxuXHRcdHQxOiBcIuWnk+WQjVwiLFxuXHRcdHQxYzE6IFwiU3VybmFtZVwiLFxuXHRcdHQxYzI6IFwiTmFtZVwiLFxuXHRcdHQxUGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0dDI6IFwiU2V4XCIsXG5cdFx0dDJQbGFjZWhvbGRlcjogXCJcIixcblx0XHR0MzogXCJEYXRlIG9mIGJpcnRoXCIsXG5cdFx0dDNQbGFjZWhvbGRlcjogXCJcIixcblx0XHR0NDogXCJUeXBlIG9mIElEXCIsXG5cdFx0dDRQbGFjZWhvbGRlcjogXCJcIixcblx0XHR0NTogXCJJRCBuby5cIixcblx0XHR0NVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHN1Ym1pdDogXCJDb25maXJtXCIsXG5cdFx0Y2FuY2VsOiBcIlNraXBcIixcblx0XHRjYW5kaWRhdGVzOiB7XG5cdFx0XHRzZXg6IFt7XG5cdFx0XHRcdG5hbWU6IFwi55S3XCIsXG5cdFx0XHRcdHZhbHVlOiBcIk1cIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWls1wiLFxuXHRcdFx0XHR2YWx1ZTogXCJGXCJcblx0XHRcdH1dLFxuXHRcdFx0aWRUeXBlOiBbe1xuXHRcdFx0XHRuYW1lOiBcIui6q+S7veitiVwiLFxuXHRcdFx0XHR2YWx1ZTogXCIxXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLorbfnhadcIixcblx0XHRcdFx0dmFsdWU6IFwiMlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi6LuN5a6Y6K2J5oiW5aOr5YW16K2JXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjNcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIua4r+a+s+mAmuihjOitiS/lm57phInorYnmiJblj7Dog57orYlcIixcblx0XHRcdFx0dmFsdWU6IFwiNlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5aSW5ZyL5Lq65rC45LmF5bGF55WZ6Lqr5Lu96K2JXCIsXG5cdFx0XHRcdHZhbHVlOiBcIk9cIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIua4r+a+s+WPsOWxheawkeWxheS9j+itiVwiLFxuXHRcdFx0XHR2YWx1ZTogXCJWXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLlj7DngaPlsYXmsJHlsYXkvY/orYlcIixcblx0XHRcdFx0dmFsdWU6IFwiV1wiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5YW25LuWXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjBcIlxuXHRcdFx0fV1cblx0XHR9LFxuXHRcdHN1Y2Nlc3NNc2c6IFwi5pu05paw5oiQ5YqfXCIsXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCLoq4vloavlr6vlp5PlkI3kv6Hmga9cIixcblx0XHRcdGUyOiBcIuiri+mBuOaTh+aAp+WIpVwiLFxuXHRcdFx0ZTM6IFwi6KuL6YG45pOH55Sf5pelXCIsXG5cdFx0XHRlNDogXCLoq4vpgbjmk4forYnku7bpoZ7lnotcIixcblx0XHRcdGU1OiBcIuiri+Whq+Wvq+itieS7tuiZn+eivFwiLFxuXHRcdFx0ZTY6IFwi5oKo5aGr5a+r55qE6K2J5Lu26Jmf56K85pyJ6KqkXCIsXG5cdFx0XHRlNzogXCLmgqjloavlr6vnmoTkv6Hmga/mnInoqqTvvIzoq4vmoLjlr6blvozph43mlrDmj5DkuqRcIixcblx0XHR9XG5cdH0sXG5cdGluZGV4OiB7XG5cdFx0bmV3czogXCLmlrDogZ7os4foqIpcIixcblx0XHRuZXdNb3JlOiBcIuafpeeci+abtOWkmlwiLFxuXHRcdHJlY29tbWVuZDoge1xuXHRcdFx0dDE6IFwiT25saW5lIFF1b3RhdGlvblwiLFxuXHRcdFx0dDI6IFwiQ3VzdG9tZXIgU2VydmljZVwiLFxuXHRcdFx0dDM6IFwiUHJvZHVjdCBJbmZvcm1hdGlvblwiLFxuXHRcdFx0dDQ6IFwiTGF0ZXN0IE5ld3NcIixcblx0XHRcdGl0ZW0xOiB7XG5cdFx0XHRcdGJ0bjogXCLkuobop6Pmm7TlpJrnlKLlk4FcIixcblx0XHRcdFx0dDE6IFwi54K66Ieq5bex5ZKM5a625Lq65bCL5om+5aO55Lu95L+d6ZqcXCIsXG5cdFx0XHR9LFxuXHRcdFx0aXRlbTI6IHtcblx0XHRcdFx0YnRuOiBcIueri+WNs+mgkOe0hFwiLFxuXHRcdFx0XHR0MTogXCLlnKjnt5rpoJDntIQg5bCI5qWt5pyN5YuZXCIsXG5cdFx0XHR9LFxuXHRcdFx0aXRlbTM6IHtcblx0XHRcdFx0YnRuOiBcIuWuouaIt+acjeWKoVwiLFxuXHRcdFx0XHR0MTogXCLlsIjmpa3lrqLmnI3ngrrlprPmnI3li5lcIixcblx0XHRcdFx0dDI6IFwi5oOz5LqG6Kej5pu05aSa77yM5Y+v6Ie06Zu7XCIsXG5cdFx0XHRcdHQzOiBcIjk1NTExXCIsXG5cdFx0XHRcdHQ0OiBcIuiBr+e1oeaIkeWAke+8jOaIlumAsuWFpVwiLFxuXHRcdFx0fVxuXHRcdH0sXG5cdH0sXG5cdGNvbXBsYWludEFjY2VwdGFuY2U6IHtcblx0XHRuYW1lOiBcIk5hbWVcIixcblx0XHRuYW1lUGxhY2Vob2xkZXI6IFwiTmFtZVwiLFxuXHRcdGNvbnRhY3RUeXBlOiBcIlByZWZlcnJlZCBXYXkgb2YgQ29udGFjdFwiLFxuXHRcdGVtYWlsOiBcIkUtbWFpbFwiLFxuXHRcdHF1ZXN0aW9uOiBcIlF1ZXN0aW9uLyBPcGluaW9uXCIsXG5cdFx0cXVlc3Rpb25QbGFjZUhvbGRlcjogXCJObyBtb3JlIHRoYW4gNTAwIHdvcmRzXCIsXG5cdFx0b3JkZXJObzogXCJQb2xpY3kgTm9cIixcblx0XHRvcmRlck5vUGxhY2VIb2xkZXI6IFwiSWYgeW91IGFyZSBQaW5nIEFuIGN1c3RvbWVyLCBwbGVhc2UgcHJvdmlkZSB0aGUgcG9saWN5IG51bWJlclwiLFxuXHRcdGNvbnRhY3RUaW1lOiBcIlByZWZlcnJlZCBDb250YWN0IERhdGVcIixcblx0XHRub3RpY2UxOiBcIlRoZSBwZXJzb25hbCBkYXRhIGNvbGxlY3RlZCBpbiB0aGlzIGZvcm0gaXMgcHJvY2Vzc2VkIGluIGFjY29yZGFuY2Ugd2l0aCBQaW5nIEFuIExpZmUgSW5zdXJhbmNlIENvbXBhbnkgb2YgQ2hpbmEgKEhLKSwgTHRkIFBlcnNvbmFsIEluZm9ybWF0aW9uIENvbGxlY3Rpb24gU3RhdGVtZW50IGFuZCB3aWxsIG9ubHkgYmUgdXNlZCB0byBjb250YWN0IHlvdS4gSG93ZXZlciwgdGhlIHBlcnNvbmFsIGRhdGEgY29sbGVjdGVkIHdpbGwgbm90IGJlIHRyYW5zZmVycmVkIHRvIHRoaXJkLXBhcnR5IG9yZ2FuaXphdGlvbnMgb3RoZXIgdGhhbiB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlIFxcXCJQaW5nIEFuIExpZmUgSW5zdXJhbmNlIENvbXBhbnkgb2YgQ2hpbmEgKEhLKSwgTHRkIFBlcnNvbmFsIERhdGEgQ29sbGVjdGlvbiBTdGF0ZW1lbnRcXFwiIHdpdGhvdXQgeW91ciBleHBsaWNpdCBhdXRob3JpemF0aW9uLiBZb3UgY2FuIGNob29zZSBub3QgdG8gcHJvdmlkZSB1cyB3aXRoIHRoZSByZXF1aXJlZCBwZXJzb25hbCBpbmZvcm1hdGlvbiwgYnV0IHRoaXMgbWF5IHByZXZlbnQgdXMgZnJvbSBjb250YWN0aW5nIHlvdS4gWW91IGNhbiBhbHNvIGFjY2VzcyBhbmQgY29ycmVjdCB5b3VyIHBlcnNvbmFsIGRhdGEgaW4gYWNjb3JkYW5jZSB3aXRoIFBpbmcgQW4gTGlmZSBJbnN1cmFuY2UgQ29tcGFueSBvZiBDaGluYSAoSEspLCBMdGQgUGVyc29uYWwgRGF0YSBDb2xsZWN0aW9uIFN0YXRlbWVudOOAglwiLFxuXHRcdG5vdGljZTI6IFwiSSBoZXJlYnkgY29uZmlybSB0aGF0IEkgdW5kZXJzdGFuZCBhbmQgYWdyZWUgdGhhdCBteSBwZXJzb25hbCBkYXRhIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGFib3ZlIHB1cnBvc2VzIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgUGluZyBBbiBMaWZlIEluc3VyYW5jZSBDb21wYW55IG9mIENoaW5hIChISykgUGVyc29uYWwgRGF0YSBDb2xsZWN0aW9uIFN0YXRlbWVudC5cIixcblx0XHRjb250YWN0VHlwZXM6IFt7IG5hbWU6ICdNb2JpbGUnLCB2YWx1ZTogMSB9LCB7IG5hbWU6ICdFbWFpbCcsIHZhbHVlOiAyIH1dLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwiUGxlYXNlIGZpbGwgaW4gdGhpcyBpdGVtXCIsXG5cdFx0XHRlMjogXCJQbGVhc2UgZmlsbCBpbiB0aGUgY29ycmVjdCBjb250YWN0IGluZm9ybWF0aW9uXCJcblx0XHR9LFxuXHRcdHN1Y2Nlc3M6IFwiVGhhbmsgeW91IGZvciB5b3VyIGNvbW1lbnRzXCJcblx0fSxcblx0cmVzZXJ2YXRpb246IHtcblx0XHRuYW1lOiBcIk5hbWVcIixcblx0XHRuYW1lUGxhY2Vob2xkZXI6IFwiTmFtZVwiLFxuXHRcdGNvbnRhY3RUeXBlOiBcIlByZWZlcnJlZCB3YXkgb2YgY29udGFjdFwiLFxuXHRcdGNvbnRhY3RUeXBlQ2FkaWRhdGVzOiBbeyBuYW1lOiBcInBob25lIG5vXCIsIHZhbHVlOiAxIH1dLFxuXHRcdGNvbnRhY3Q6IFwiQ29udGFjdCBOdW1iZXJcIixcblx0XHRjb250YWN0UGxhY2Vob2xkZXI6IFwi77yISEsgTm8uLyBNYWlubGFuZCBOby7vvIlcIixcblx0XHRyZXNlcnZhdGlvblR5cGU6IFwiVHlwZSBvZiBSZXNlcnZhdGlvblwiLFxuXHRcdHJlc2VydmF0aW9uQ2FuZGlkYXRlczogW1xuXHRcdFx0eyBuYW1lOiBcIkluc3VyYW5jZSBjb25zdWx0YXRpb25cIiwgdmFsdWU6IFwi5oqV5L+d6Kuu6KmiXCIgfSxcblx0XHRcdHsgbmFtZTogXCJBZ2VudCBjaGFuZ2VcIiwgdmFsdWU6IFwi5Luj5Yqe5L+d5Y2V5Y+Y5pu0XCIgfVxuXHRcdF0sXG5cdFx0cmVzZXJ2YXRpb25SZW1hcms6IFwiUmVzZXJ2YXRpb24gRGVzY3JpcHRpb25cIixcblx0XHRyZXNlcnZhdGlvblJlbWFya1BsYWNlaG9sZGVyOiBcIk9wdGlvbmFsLCBubyBtb3JlIHRoYW4gNTAwIHdvcmRzLCBwcm9tcHQgdGV4dCBcXFwiUGxlYXNlIGJyaWVmbHkgZXhwbGFpbiB0aGUgaW5zdXJhbmNlIHR5cGUgb3IgYnVzaW5lc3MgeW91IHdhbnQgdG8gY29uc3VsdFwiLFxuXHRcdGhrQ2xpZW50OiBcIkN1cnJlbnQgUGluZ2FuIEhLIEN1c3RvbWVyXCIsXG5cdFx0eWVzOiBcIlllc1wiLFxuXHRcdG5vOiBcIk5vXCIsXG5cdFx0Y29udGFjdFRpbWU6IFwiUHJlZmVycmVkIENvbnRhY3QgRGF0ZVwiLFxuXHRcdG5vdGljZTE6IFwiVGhlIHBlcnNvbmFsIGRhdGEgY29sbGVjdGVkIGluIHRoaXMgZm9ybSBpcyBwcm9jZXNzZWQgaW4gYWNjb3JkYW5jZSB3aXRoIFBpbmcgQW4gTGlmZSBJbnN1cmFuY2UgQ29tcGFueSBvZiBDaGluYSAoSEspLCBMdGQgUGVyc29uYWwgSW5mb3JtYXRpb24gQ29sbGVjdGlvbiBTdGF0ZW1lbnQgYW5kIHdpbGwgb25seSBiZSB1c2VkIHRvIGNvbnRhY3QgeW91LiBIb3dldmVyLCB0aGUgcGVyc29uYWwgZGF0YSBjb2xsZWN0ZWQgd2lsbCBub3QgYmUgdHJhbnNmZXJyZWQgdG8gdGhpcmQtcGFydHkgb3JnYW5pemF0aW9ucyBvdGhlciB0aGFuIHRob3NlIHNwZWNpZmllZCBpbiB0aGUgXFxcIlBpbmcgQW4gTGlmZSBJbnN1cmFuY2UgQ29tcGFueSBvZiBDaGluYSAoSEspLCBMdGQgUGVyc29uYWwgRGF0YSBDb2xsZWN0aW9uIFN0YXRlbWVudFxcXCIgd2l0aG91dCB5b3VyIGV4cGxpY2l0IGF1dGhvcml6YXRpb24uIFlvdSBjYW4gY2hvb3NlIG5vdCB0byBwcm92aWRlIHVzIHdpdGggdGhlIHJlcXVpcmVkIHBlcnNvbmFsIGluZm9ybWF0aW9uLCBidXQgdGhpcyBtYXkgcHJldmVudCB1cyBmcm9tIGNvbnRhY3RpbmcgeW91LiBZb3UgY2FuIGFsc28gYWNjZXNzIGFuZCBjb3JyZWN0IHlvdXIgcGVyc29uYWwgZGF0YSBpbiBhY2NvcmRhbmNlIHdpdGggUGluZyBBbiBMaWZlIEluc3VyYW5jZSBDb21wYW55IG9mIENoaW5hIChISyksIEx0ZCBQZXJzb25hbCBEYXRhIENvbGxlY3Rpb24gU3RhdGVtZW5044CCXCIsXG5cdFx0bm90aWNlMjogXCJJIGhlcmVieSBjb25maXJtIHRoYXQgSSB1bmRlcnN0YW5kIGFuZCBhZ3JlZSB0aGF0IG15IHBlcnNvbmFsIGRhdGEgd2lsbCBiZSB1c2VkIGZvciB0aGUgYWJvdmUgcHVycG9zZXMgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBQaW5nIEFuIExpZmUgSW5zdXJhbmNlIENvbXBhbnkgb2YgQ2hpbmEgKEhLKSBQZXJzb25hbCBEYXRhIENvbGxlY3Rpb24gU3RhdGVtZW50LlwiLFxuXHRcdHN1Y2Nlc3M6IFwiU3VjY2Vzc1wiLFxuXHRcdHN1Ym1pdEJ0bjogJ0NvbmZpcm0nLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwiUGxlYXNlIGZpbGwgaW4gdGhpcyBpdGVtXCIsXG5cdFx0XHRlMjogXCJQbGVhc2UgZmlsbCBpbiB0aGUgY29ycmVjdCBjb250YWN0IGluZm9ybWF0aW9uXCJcblx0XHR9XG5cdH0sXG5cdHBheW1lbnRUeXBlOiB7XG5cdFx0bWVudTE6IFwiUGF5bWVudCBpbiBQZXJzb24gYXQgQ2FzaGllclwiLFxuXHRcdG1lbnUyOiBcIkludGVybmV0IEJhbmtpbmdcIixcblx0XHRtZW51MzogXCJUZWxlZ3JhcGdpYyBUcmFuc2ZlclwiLFxuXHRcdG1lbnU0OiBcIkpFVENPIEFUTVwiLFxuXHRcdG1lbnU1OiBcIlBQU1wiLFxuXHRcdG1lbnU2OiBcIkhvbmcgS29uZyBQb3N0XCIsXG5cdH0sXG5cdHByb2R1Y3Q6IHtcblx0XHRidG5Qb3NpdGlvbjogXCJCb29raW5nIHNlcnZpY2VcIixcblx0XHRpY29uUHJvYmxlbTogXCJDb21tb24gcHJvYmxlbVwiLFxuXHRcdGljb25Qcm9jZXNzOiBcIkluc3VyYW5jZSBwcm9jZXNzXCIsXG5cdFx0aWNvblByb2R1Y3Q6IFwiUHJvZHVjdCBkZXRhaWxzXCJcblx0fSxcblx0Y3VzdG9tUHJvZHVjdDoge1xuXHRcdG1lbnUxOiBcIkNvbnRhY3QgdXNcIixcblx0XHRtZW51MjogXCJQYXkgcHJlbWl1bVwiLFxuXHRcdG1lbnUzOiBcIlF1ZXJ5IHBvbGljeVwiLFxuXHRcdG1lbnU0OiBcIkNoYW5nZSBwb2xpY3lcIixcblx0XHRtZW51NTogXCJDbGFpbSByZXBvcnRcIixcblx0XHRtZW51NjogXCJSZXNlcnZhdGlvbiBzZXJ2aWNlXCIsXG5cdFx0bWVudTc6IFwiU3VnZ2VzdGlvbnNcIixcblx0XHRtZW51ODogXCJDb21tb24gZm9ybVwiLFxuXHR9LFxuXHRjb21tb25Gb3JtOiB7XG5cdFx0aGVhZDE6IFwiVHlwZSBvZiBGb3Jtc1wiLFxuXHRcdGhlYWQyOiBcIkZvcm1zXCIsXG5cdFx0aGVhZDM6IFwiUHVycG9zZVwiLFxuXHRcdGhlYWQ0OiBcIkF0dGFjaG1lbnRcIixcblx0XHRkb3dubG9hZDogXCJEb3dubG9hZFwiLFxuXHRcdGZvcm06IFt7XG5cdFx0XHR0eXBlOiBcIlBheW1lbnRcIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi44CMRS1hY2NvdW50IFNlcnZpY2XjgI1hbmQgRGlyZWN0IERlYml0IEF1dGhvcml6YXRpb24gQXBwbGljYXRpb24gZm9yIEJhbmsgQWNjb3VudFwiLFxuXHRcdFx0XHRkZXNjOiBcIkZvciBhcHBseWluZyBlLXNlcnZpY2UgYWNjb3VudCBhbmQgZGlyZWN0IGRlYml0IGF1dGhvcml6YXRpb25cIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkNyZWRpdCBDYXJkIEFjY291bnQgRGlyZWN0IERlYml0IEF1dGhvcml6YXRpb25cIixcblx0XHRcdFx0ZGVzYzogXCJBcHBsaWNhdGlvbiBmb3IgY3JlZGl0IGNhcmQgZGlyZWN0IGRlYml0XCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dHlwZTogXCJDaGFuZ2Ugb2YgUG9saWN5XCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIlBvbGljeSBUZXJtaW5hdGlvbiBBcHBsaWNhdGlvbiBGb3JtXCIsXG5cdFx0XHRcdGRlc2M6IFwiUG9saWN5IHN1cnJlbmRlclwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiQXBwbGljYXRpb24gZm9yIENoYW5nZSBvZiBQb2xpY3kgRm9ybe+8iFBvbGljeSBMb2FuIFJlcGF5bWVudO+8iVwiLFxuXHRcdFx0XHRkZXNjOiBcIlBvbGljeSBsb2FuXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJBcHBsaWNhdGlvbiBmb3IgQ2hhbmdlIG9mIFBvbGljeSBGb3Jt77yIQ2hhbmdlIG9mIFBvbGljee+8iVwiLFxuXHRcdFx0XHRkZXNjOiBcIk5ld2x5IGFkZGVkIHByZW1pdW0sIGRlZHVjdGVkIHByZW1pdW1cIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkFwcGxpY2F0aW9uIGZvciBDaGFuZ2Ugb2YgUG9saWN5IEZvcm3vvIhDaGFuZ2Ugb2YgQ3VzdG9tZXIgSW5mb3JtYXRpb27vvIlcIixcblx0XHRcdFx0ZGVzYzogXCJCYXNpYyBJbmZvcm1hdGlvbiBDaGFuZ2VcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkFwcGxpY2F0aW9uIGZvciBDaGFuZ2Ugb2YgUG9saWN5IEZvcm3vvIhDaGFuZ2Ugb2YgQmVuZWZpY2lhcnnvvIlcIixcblx0XHRcdFx0ZGVzYzogXCJNb2RlIG9mIHBheW1lbnQsIHNlbGYtcmVwbGFjZW1lbnQgYW5kIHJlaXNzdWVzXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJBdXRob3JpemF0aW9uIExldHRlclwiLFxuXHRcdFx0XHRkZXNjOiBcIlRvIGF1dGhvcml6ZSAzcmQgcGFydHkgdG8gaGFuZGxlIG9uIGJlaGFsZiBvZiBwb2xpY3kgb3duZXJcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIlRheCBTdGF0ZW1lbnRcIixcblx0XHRcdFx0ZGVzYzogXCJDUlNcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkhlYWx0aCBEZWNsYXJhdGlvblwiLFxuXHRcdFx0XHRkZXNjOiBcIkZvciB1bmRlcndyaXRpbmcgcHVycG9zZVwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH1cblx0XHRcdF1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHR5cGU6IFwiQ2xhaW1zXCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIkNsYWltcyBGb3JtXCIsXG5cdFx0XHRcdGRlc2M6IFwiRm9yIHdyaXR0ZW4gY2xhaW1zIGFwcGxpY2F0aW9uXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fV1cblx0XHR9LFxuXHRcdF1cblx0fSxcblx0cG9saWN5Q2hhbmdlR3VpZGU6IHtcblx0XHRcblx0XHRub3RpY2U6IFwiSWYgeW91IG5lZWQgdG8gbW9kaWZ5IHBsZWFzZVwiLFxuXHRcdG5vdGljZUxpbms6IFwiY29udGFjdCBjdXN0b21lciBzZXJ2aWNlXCIsXG5cdFx0aGVhZDE6IFwiSXRlbVwiLFxuXHRcdGhlYWQyOiBcIkRldGFpbHNcIixcblx0XHRoZWFkMzogXCJBcHBsaWNhbnRcIixcblx0XHRoZWFkNDogXCJEZWFkbGluZVwiLFxuXHRcdGhlYWQ1OiBcIk1hdGVyaWFscyB0byBiZSBzdWJtaXR0ZWRcIixcblx0XHRkb3dubG9hZDogXCLkuIvovInmlofmqpRcIixcblx0XHRmb3JtOiBbe1xuXHRcdFx0cHJvamVjdDogXCJQb2xpY3kgU3VycmVuZGVyXCIsXG5cdFx0XHRjb250ZW50OiBcIkNhbmNlbGxhdGlvbiBvZiBjb250cmFjdCBhZnRlciB0aGUgY29vbGluZy1vZmYgcGVyaW9kLCB0aGUgY29tcGFueSB3aWxsIHJlZnVuZCB0aGUgcG9saWN5IGNhc2ggdmFsdWVcIixcblx0XHRcdGFwcGxpY2FudDogXCJQb2xpY3kgT3duZXJcIixcblx0XHRcdHJlY2VwdGlvblRpbWU6IFwiQmVmb3JlIFBvbGljeSBFeHBpcmVzXCIsXG5cdFx0XHRtYXRlcmlhbExpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwiUG9saWN5XCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkFwcGxpY2F0aW9uIGZvcm1cIixcblx0XHRcdFx0dHlwZTogMSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiSUQgY2FyZCBvZiBQb2xpY3kgT3duZXJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiQmFuayBpbmZvcm1hdGlvblwiLFxuXHRcdFx0fV0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwcm9qZWN0OiBcIlBvbGljeSBTdXJyZW5kZXIgd2l0aGluIGNvb2wgb2ZmIHBlcmlvZFwiLFxuXHRcdFx0Y29udGVudDogXCJJZiB0aGUgY29udHJhY3QgaXMgY2FuY2VsbGVkIHdpdGhpbiB0aGUgY29vbGluZy1vZmYgcGVyaW9kLCB0aGUgY29tcGFueSB3aWxsIHJlZnVuZCB0aGUgZW50aXJlIHByZW1pdW0gd2l0aG91dCBpbnRlcmVzdC5cIixcblx0XHRcdGFwcGxpY2FudDogXCJQb2xpY3kgT3duZXJcIixcblx0XHRcdHJlY2VwdGlvblRpbWU6IFwiQmVmb3JlIGNvb2wgb2ZmIHBlcmlvZFwiLFxuXHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIlBvbGljeVwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJBcHBsaWNhdGlvbiBmb3JtXCIsXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIklEIGNhcmQgb2YgUG9saWN5IE93bmVyXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkJhbmsgaW5mb3JtYXRpb25cIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiRmlyc3QgcHJlbWl1bSByZWNlaXB0XCIsXG5cdFx0XHR9XG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cHJvamVjdDogXCJDaGFuZ2Ugb2YgQ3VzdG9tZXIgSW5mb3JtYXRpb25cIixcblx0XHRcdHByb2plY3RUeXBlOiAxLFxuXHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2VcIixcblx0XHRcdHF1ZXJ5OiB7XG5cdFx0XHRcdHE6IFwibTQyXCJcblx0XHRcdH0sXG5cdFx0XHRjb250ZW50OiBcIkNoYW5nZSBvZiBQb2xpY3kgT3duZXIsIEluc3VyZWQgYW5kIEJlbmVmaWNpYXJ5IGluZm9ybWF0XCIsXG5cdFx0XHRhcHBsaWNhbnQ6IFwiUG9saWN5IE93bmVyXCIsXG5cdFx0XHRyZWNlcHRpb25UaW1lOiBcIkFueXRpbWVcIixcblx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCJBcHBsaWNhdGlvbiBmb3JtXCIsXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIk90aGVyIG5lY2Vzc2FyeSBwcm92aW5nIGRvY3VtZW50c1wiLFxuXHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHByb2plY3Q6IFwiQ2hhbmdlIG9mIENvbnRhY3QgSW5mb3JtYXRpb25cIixcblx0XHRcdHByb2plY3RUeXBlOiAxLFxuXHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2VcIixcblx0XHRcdHF1ZXJ5OiB7XG5cdFx0XHRcdHE6IFwibTQzXCJcblx0XHRcdH0sXG5cdFx0XHRjb250ZW50OiBcIkNoYW5nZSBvZiBhZGRyZXNzLCBjb250YWN0IG5vLlwiLFxuXHRcdFx0YXBwbGljYW50OiBcIlBvbGljeSBPd25lclwiLFxuXHRcdFx0cmVjZXB0aW9uVGltZTogXCJBbnl0aW1lXCIsXG5cdFx0XHRtYXRlcmlhbExpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwiQXBwbGljYXRpb24gZm9ybVwiLFxuXHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJJRCBjYXJkIG9mIFBvbGljeSBPd25lclwiLFxuXHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHByb2plY3Q6IFwiQ2hhbmdlIG9mIFBheW1lbnQgSW5mb3JtYXRpb25cIixcblx0XHRcdGNvbnRlbnQ6IFwiQ2hhbmdlIG9mIG1vZGUgb2YgcGF5bWVudCBvciBwYXllbWVudCBhY2NvdW50XCIsXG5cdFx0XHRhcHBsaWNhbnQ6IFwiUG9saWN5IE93bmVyXCIsXG5cdFx0XHRyZWNlcHRpb25UaW1lOiBcIkJlZm9yZSB0aGUgZXhwaXJhdGlvbiBvZiBwb2xpY3kgcGF5bWVudFwiLFxuXHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIkFwcGxpY2F0aW9uIGZvcm1cIixcblx0XHRcdFx0dHlwZTogMSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiUG9saWN5XCIsXG5cdFx0XHR9XG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0XVxuXHR9LFxuXHRwb2xpY3lDaGFuZ2VDb250YWN0OiB7XG5cdFx0cGhvbmU6IFwiQ29udGFjdCBOdW1iZXJcIixcblx0XHRhZGRyZXNzOiBcIkNvcnJlc3BvbmRlbmNlIEFkZHJlc3NcIixcblx0XHRlbWFpbDogXCJFLU1haWxcIixcblx0XHRjaGVja1RpcHM6IFwiSSBkbyBub3QgYWdyZWUgdG8gcmVjZWl2ZSBwcm9tb3Rpb25hbCBpbmZvcm1hdGlvblwiLFxuXHRcdHN1Ym1pdDogXCJTYXZlXCIsXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCJQbGVhc2UgZW50ZXIgdGhlIGNvbGxlY3QgbW9iaWxlIG5vXCIsXG5cdFx0XHRlMjogXCLoq4vloavlr6voga/nuavlnLDlnYBcIixcblx0XHRcdGUzOiBcIlBsZWFzZSBlbnRlciB0aGUgY29sbGVjdCBFLW1haWxcIlxuXHRcdH0sXG5cdFx0c3VjY2VzczogXCJTdWNjZXNzXCIsXG5cdH0sXG5cdHBvbGljeUNoYW5nZUluZm9ybWF0aW9uOiB7XG5cdFx0dGl0bGU6IFwiQ2hhbmdlIG9mIEN1c3RvbWVyIEluZm9ybWF0aW9uXCIsXG5cdFx0b3duZXI6IFwiUG9saWN5IE93bmVyXCIsXG5cdFx0aW5zdXJlZDogXCJJbnN1cmVkXCIsXG5cdFx0b2JqOiBcIlNlbGVjdCBmb3IgY2hhbmdlXCIsXG5cdFx0bmFtZTogXCJOYW1lXCIsXG5cdFx0c2V4OiBcIlNleFwiLFxuXHRcdGJpcnRoOiBcIkRhdGUgb2YgQmlydGhcIixcblx0XHR0eXBlOiBcIlR5cGUgb2YgSWRlbnRpZmljYXRpb24gRG9jdW1lbnRcIixcblx0XHROTzogXCJJRCBOby5cIixcblx0XHR2YWxpZGl0eVBlcmlvZDogXCJJRCBWYWxpZGF0aW9uIERhdGVcIixcblx0XHRuYXRpb25hbGl0eTogXCJOYXRpb25hbGl0eVwiLFxuXHRcdGVtcGxveWVyOiBcIkVtcGxveWVyXCIsXG5cdFx0bWFyaXRhbFN0YXR1czogXCJNYXJpdGFsIFN0YXR1c1wiLFxuXHRcdHN1Ym1pdDogXCJTYXZlXCIsXG5cdFx0dXBsb2FkOiBcIlVwbG9hZCBBdHRhY2htZW50XCIsXG5cdFx0bW9kaWZ5VGlwczE6IFwiSWYgeW91IG5lZWQgdG8gbW9kaWZ5IHBsZWFzZVwiLFxuXHRcdG1vZGlmeVRpcHMyOiBcImNvbnRhY3QgY3VzdG9tZXIgc2VydmljZVwiLFxuXHRcdHN1Y2Nlc3M6IFwiU3VjY2Vzc1wiLFxuXHR9LFxuXHRjb250YWN0VXM6IHtcblx0XHRzZXJ2aWNlOiB7XG5cdFx0XHRjZW50ZXI6IHtcblx0XHRcdFx0dGl0bGU6IFwiQ3VzdG9tZXIgU2VydmljZSBDZW50ZXJcIixcblx0XHRcdFx0YWRkcmVzczogXCJBZGRyZXNzOiBVbml0IDM1MDEgLSA3ICYgMTQsIEZsb29yIDM1LCBUaGUgR2F0ZXdheSBUb3dlciA1LCBUc2ltIFNoYSBUc3VpLCBIb25nIEtvbmdcIixcblx0XHRcdFx0dGltZTogXCJTZXJ2aWNlIEhvdXLvvJo5IGEubS4gIC0gNiBwLm0uICwgTW9uZGF5IHRvIEZyaWRheVwiLFxuXHRcdFx0fSxcblx0XHRcdGhvdGxpbmU6IHtcblx0XHRcdFx0dGl0bGU6IFwiQ3VzdG9tZXIgU2VydmljZSBIb3RsaW5lXCIsXG5cdFx0XHRcdGhrOiBcIkhvbmcgS29uZ++8mig4NTIpICAyOTgzIDg4NjZcIixcblx0XHRcdFx0Y246IFwiTWFpbmxhbmTvvJooODYpIDQwMDc4IDk1NTExXCIsXG5cdFx0XHRcdHRpbWU6IFwiU2VydmljZSBIb3Vy77yaOSBhLm0uICAtIDYgcC5tLiAsIE1vbmRheSB0byBGcmlkYXlcIlxuXHRcdFx0fSxcblx0XHRcdG1haWw6IHtcblx0XHRcdFx0dGl0bGU6IFwiQ3VzdG9tZXIgU2VydmljZSBFbWFpbFwiLFxuXHRcdFx0XHRtYWlsOiBcImNzQHBpbmdhbi5jb20uaGtcIlxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cHVsYmljOiB7XG5cdFx0XHR0aXRsZTogXCJPZmZpY2lhbCBXZUNoYXQgQWNjb3VudFwiLFxuXHRcdFx0bTE6IFwiTG9naW4gdG8gdGhlIFxcXCJXZUNoYXRcXFwiIEFQUCwgcHJlc3MgdGhlIFxcXCIrXFxcIiBidXR0b24gaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBhbmQgc2VsZWN0IFxcXCJBZGQgRnJpZW5kXFxcIiwgc2VsZWN0IFxcXCJQdWJsaWMgQWNjb3VudFxcXCIgRW50ZXIgYW5kIHNlYXJjaCBcXFwiUGluZyBBbiBMaWZlIEhvbmcgS29uZ1xcXCJcIixcblx0XHRcdG0yOiBcIkxvZyBpbiB0byB0aGUgV2VDaGF0IEFQUCwgcHJlc3MgdGhlIFxcXCIrXFxcIiBidXR0b24gaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBhbmQgc2VsZWN0IFxcXCJTY2FuXFxcIiB0byBzY2FuIHRoZSBRUiBjb2RlIGJlbG9377yIUVIgQ29kZSBoZXJl77yJXCJcblx0XHR9LFxuXHRcdHFyY29kZToge1xuXHRcdFx0dGl0bGU6IFwiT2ZmaWNpYWwgV2VDaGF0IEFjY291bnRcIlxuXHRcdH1cblx0fSxcblx0Y3VzdG9tU2VydmljZToge1xuXHRcdG5hbWU6IFwiQ3VzdG9tZXIgc2VydmljZVwiLFxuXHRcdG1lbnUxOiBcIkNvbnRhY3QgVXNcIixcblx0XHRtZW51MjogXCJPbmxpbmUgUHJlbWl1bSBQYXltZW50XCIsXG5cdFx0bWVudTM6IFwiUG9saWN5IElucXVpcnlcIixcblx0XHRtZW51NDogXCJQb2xpY3kgQ2hhbmdlXCIsXG5cdFx0bWVudTQxOiBcIlBvbGljeSBDaGFuZ2UgR3VpZGVsaW5lXCIsXG5cdFx0bWVudTQyOiBcIkNoYW5nZSBvZiBDb250YWN0IEluZm9ybWF0aW9uXCIsXG5cdFx0bWVudTQzOiBcIkNoYW5nZSBvZiBDdXN0b21lciBJbmZvcm1hdGlvblwiLFxuXHRcdG1lbnU1OiBcIkNsYWltc1wiLFxuXHRcdG1lbnU2OiBcIkUtcmVzZXJ2YXRpb25cIixcblx0XHRtZW51NzogXCJDb21wbGFpbnRzXCIsXG5cdFx0bWVudTg6IFwiVXNlZnVsIEZvcm1zXCIsXG5cdFx0aW5zdXJhbmNlUXVlcnk6IHtcblx0XHRcdG1vZGlmeTogXCJtb2RpZnlcIixcblxuXHRcdFx0SW5zdXJhbnROdW1iZXI6IFwiUG9saWN5IE51bWJlclwiLFxuXHRcdFx0SW5zdXJhbnQ6IFwiSW5zdXJlZFwiLFxuXHRcdFx0SW5zdXJhbnROYW1lOiBcIlBvbGljeSBUeXBlXCIsXG5cdFx0XHRJbnN1cmFudEFtb3VudDogXCJTdW0gSW5zdXJlZFwiLFxuXHRcdFx0ZWZmZWN0aXZlRGF0ZTogXCJQcmVtaXVtIER1ZSBEYXRlXCIsXG5cdFx0XHRwZXJpb2Q6IFwiUHJvdGVjdGlvbiBEdXJhdGlvblwiLFxuXG5cblx0XHRcdHQyVGl0bGU6IFwiUG9saWN5IEluZm9ybWF0aW9uXCIsXG5cdFx0XHR0Mm4xOiBcIlBvbGljeSBUeXBlXCIsXG5cdFx0XHR0Mm4yOiBcIlN1bSBJbnN1cmVkXCIsXG5cdFx0XHR0Mm4zOiBcIkVmZmVjdGl2ZSBEYXRlXCIsXG5cdFx0XHR0Mm40OiBcIlByb3RlY3Rpb24gRHVyYXRpb25cIixcblx0XHRcdHQybjU6IFwiTmFtZSBvZiBJbnN1cmVk77yIQ2hpbmVzZe+8iVwiLFxuXHRcdFx0dDJuNjogXCJOYW1lIG9mIEluc3VyZWQgKEVuZ2xpc2gpIFwiLFxuXHRcdFx0dDJuNzogXCJEYXRlIG9mIEJpcnRoXCIsXG5cdFx0XHR0Mm44OiBcIklEIE5vXCIsXG5cblxuXHRcdFx0dDNUaXRsZTogXCJDdXN0b21lciBJbmZvcm1hdGlvblwiLFxuXHRcdFx0dDNuMTogXCJOYW1lIG9mIFBvbGljeSBPd25lcu+8iENoaW5lc2XvvIlcIixcblx0XHRcdHQzbjI6IFwiTmFtZSBvZiBQb2xpY3kgT3duZXLvvIhFbmdsaXNo77yJXCIsXG5cdFx0XHR0M24zOiBcIkRhdGUgb2YgQmlydGhcIixcblx0XHRcdHQzbjQ6IFwiSUQgTm9cIixcblx0XHRcdHQzbjU6IFwiUG9zdGFsIEFkZHJlc3NcIixcblx0XHRcdHQzbjY6IFwiUmVzaWRlbnRpYWwgQWRkcmVzc1wiLFxuXHRcdFx0dDNuNzogXCJNb2JpbGUgTm8uXCIsXG5cdFx0XHR0M244OiBcIkVtYWlsXCIsXG5cblx0XHRcdHQ0VGl0bGU6IFwiQmVuZWZpY2lhcnkgaW5mb3JtYXRpb25cIixcblx0XHRcdHQ0TmFtZUNuOiBcIk5hbWXvvIhDaGluZXNl77yJXCIsXG5cdFx0XHR0NE5hbWVFbjogXCJOYW1lIChFbmdsaXNoKVwiLFxuXHRcdFx0dDRSZWxhdGlvbjogXCJSZWxhdGlvbnNoaXAgd2l0aCBJbnN1cmVkXCIsXG5cdFx0XHR0NEFsbG9jYXRpb246IFwiRGlzdHJpYnV0aW9uIHJhdGlvXCIsXG5cblx0XHRcdHQ1VGl0bGU6IFwiUGF5bWVudCBpbmZvcm1hdGlvblwiLFxuXHRcdFx0dDVQYXltZW50UGVyaW9kOiBcIlBheW1lbnQgcGVyaW9kXCIsXG5cdFx0XHR0NVBheW1lbnRNZXRob2Q6IFwiTW9kZSBvZiBQYXltZW50XCIsXG5cdFx0XHR0NVBheW1lbnRDdXJyZW5jeTogXCJDdXJyZW5jeVwiLFxuXHRcdFx0dDVDdXJyZW50UHJlbWl1bTogXCJDdXJyZW50IHByZW1pdW1cIixcblx0XHRcdHQ1UGF5bWVudEJhbms6IFwiQmFua1wiLFxuXHRcdFx0dDVQYXltZW50QWNjb3VudDogXCJQYXltZW50IEFjY291bnRcIixcblxuXHRcdFx0dDZUaXRsZTogXCJQYXltZW50IEhpc3RvcnlcIixcblx0XHRcdHQ2UGF5bWVudFBlcmlvZDogXCJJbnN0YWxsbWVudFwiLFxuXHRcdFx0dDZQYXltZW50TWV0aG9kOiBcIk1vZGUgb2YgUGF5bWVudFwiLFxuXHRcdFx0dDZDbG9zaW5nRGF0ZTogXCJSZWNlaXZlZCBEYXRlXCIsXG5cdFx0XHR0NlBheW1lbnRBbW91bnQ6IFwiQW1vdW50XCIsXG5cblx0XHRcdHNob3dNb3JlOiBcIlNob3cgQWxsIFBvbGljaWVzXCIsXG5cdFx0XHRub1BvbGljeTogXCJZb3UgaGF2ZW4ndCBib3VnaHQgYW55IHBvbGljeSwgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBwbGVhc2VcIixcblx0XHRcdGN1c3RvbVNlcnZpY2U6IFwiIGNvbnRhY3QgY3VzdG9tZXIgc2VydmljZVwiLFxuXHRcdH0sXG5cdFx0dW5hdXRoOiB7XG5cdFx0XHR0aXBzOiBcIklmIHlvdSBoYXZlIGEgcGluZyBhbiBhbGwgaW4gb25lIGFjY291bnQgYWNjb3VudCwgaXQgY2FuIGhlbHAgdXMgcHJvdmlkZSBiZXR0ZXIgc2VydmljZXMgZm9yIHlvdVwiLFxuXHRcdFx0b3I6IFwib3JcIixcblx0XHRcdGxvZ2luOiBcIiBsb2dpblwiLFxuXHRcdFx0cmVnaXN0ZXI6IFwiIHJlZ2lzdGVyXCIsXG5cdFx0XHRiYXNlSW5mb1RpcDogXCJZb3VyIGNvbXBsZXRlIGluZm9ybWF0aW9uIGNhbiBoZWxwIHVzIHRvIHByb3ZpZGUgeW91IHdpdGggY29tcGxldGUgc2VydmljZXNcIixcblx0XHRcdGluZm9CdG46IFwiIEdvIHRvIHBlcmZlY3Rpb25cIlxuXHRcdH1cblx0fSxcblx0cGFnaW5hdGlvbjoge1xuXHRcdGZpcnN0UGFnZTogXCJmaXJzdFwiLFxuXHRcdG5leHRQYWdlOiBcIm5leHRcIixcblx0XHRnb3RvOiBcIkdvIHRvXCIsXG5cdFx0cGVyOiBcInBhZ2VcIixcblx0XHRwYWdlOiBcIlwiXG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFKQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQTFCQTtBQWtDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUZBO0FBUkE7QUFjQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFwQ0E7QUEyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBbEJBO0FBd0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQVBBO0FBakhBO0FBK0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFoQkE7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFuQkE7QUFnQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUExQkE7QUF5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQTFCQTtBQXFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFGQTtBQTdCQTtBQWtDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQW5EQTtBQTZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBYkE7QUFIQTtBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFqQkE7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQXRCQTtBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBUEE7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQXJDQTtBQTZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFGQTtBQWhFQTtBQTBFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSUE7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQUlBO0FBREE7QUFmQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFJQTtBQURBO0FBSUE7QUFEQTtBQWxCQTtBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFkQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFkQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFEQTtBQVRBO0FBMUZBO0FBMEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQVhBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsQkE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFGQTtBQVpBO0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBREE7QUF2QkE7QUEyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQXREQTtBQXdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBckVBO0FBOEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBM3ZCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/common/lang/en.js\n");

/***/ }),

/***/ "./src/common/lang/tc.js":
/*!*******************************!*\
  !*** ./src/common/lang/tc.js ***!
  \*******************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = {\n  message: {\n    login: 'Login',\n    Username: 'Username',\n    Password: 'Password',\n    Captcha: 'Captcha',\n    Language: 'Language',\n    zh: 'Chinese',\n    en: 'English'\n  },\n  glbalTips: {\n    sessionLost: \"為了更好的體驗,需要您登錄後再進行此操作\"\n  },\n  form: {\n    datePicker: {\n      datePlaceholder: \"请选择日期\"\n    },\n    modalUploadCard: {\n      tit: \"請上傳證件資料\",\n      front: \"證件正面\",\n      back: \"證件反面\"\n    }\n  },\n  nav: {\n    loginData: {\n      name: \"登入\",\n      path: \"\",\n      list: [{\n        name: \"註冊\",\n        path: \"/register\",\n        type: \"noAuth\",\n        value: \"\"\n      }, {\n        name: \"登入\",\n        path: \"/login\",\n        type: \"noAuth\",\n        value: \"\"\n      }, {\n        name: \"修改密碼\",\n        path: \"/password/reset\",\n        type: \"auth\",\n        value: \"\"\n      }, {\n        name: \"個人信息\",\n        path: \"/infomation/improve\",\n        type: \"auth\",\n        value: \"\"\n      }, {\n        name: \"登出\",\n        path: \"\",\n        type: \"auth\",\n        value: \"logout\"\n      }]\n    },\n    navList: [{\n      name: \"產品介紹\",\n      path: \"\",\n      list: [{\n        name: \"VHIS\",\n        path: \"\",\n        value: \"gotoVHIS\"\n      }, {\n        name: \"分紅終身\",\n        path: \"/product\"\n      }]\n    }, {\n      name: \"客戶服務\",\n      path: \"\",\n      list: [{\n        name: \"客戶服務導航\",\n        path: \"/custom/product\"\n      }, {\n        name: \"聯系我們\",\n        path: \"/custom/service?q=m1\"\n      }, {\n        name: \"繳付保費\",\n        path: \"/custom/service?q=m2\"\n      }, {\n        name: \"保單查詢\",\n        path: \"/custom/service?q=m3\"\n      }, {\n        name: \"保單變更\",\n        path: \"/custom/service?q=m41\"\n      }, {\n        name: \"理賠申請\",\n        path: \"/custom/service?q=m5\"\n      }, {\n        name: \"預約服務\",\n        path: \"/custom/service?q=m6\"\n      }, {\n        name: \"投訴受理\",\n        path: \"/custom/service?q=m7\"\n      }, {\n        name: \"常用表格\",\n        path: \"/custom/service?q=m8\"\n      }]\n    }, {\n      name: \"關於我們\",\n      path: \"\",\n      list: [{\n        name: \"平安人壽香港\",\n        path: \"/profile\"\n      }, {\n        name: \"公司活動\",\n        path: \"/empty\"\n      }, {\n        name: \"新聞中心\",\n        path: \"/news/list\"\n      }, {\n        name: \"企業社會責任\",\n        path: \"/empty\"\n      }, {\n        name: \"獎項殊榮\",\n        path: \"/empty\"\n      }]\n    }, {\n      name: \"加入我們\",\n      path: \"\",\n      list: [{\n        name: \"企業文化\",\n        path: \"/empty\"\n      }, {\n        name: \"事業發展機會\",\n        path: \"/empty\"\n      }]\n    }]\n  },\n  footer: {\n    hkPhone: \"香港号码\",\n    cnPhone: \"内地号码\",\n    aboutUs: \"關於我們\",\n    companyIntroduction: \"集團介紹\",\n    news: \"新聞資訊\",\n    joinUs: \"加入我們\",\n    helpCenter: \"幫助中心\",\n    privacy: \"隱私政策\",\n    terms: \"使用條款\",\n    protocol: \"個人資料收集聲明\",\n    map: \"網站地圖\",\n    contactUs: \"聯絡我們\",\n    contactInformation: \"聯繫方式\",\n    service: \"服務網絡\",\n    qrcode: \"社交媒體\",\n    copyright: \"版權所有 © 中國平安保險(集團)股份有限公司未經許可不得復制、轉載或摘編,違者必究!\"\n  },\n  login: {\n    title: \"平安一賬通\",\n    loginType1: \"賬密登錄\",\n    loginType2: \"動態密碼登录\",\n    account: \"賬號\",\n    accountPlaceholder: \"請輸入證件號/一賬通用戶名/手機號\",\n    password: \"密碼\",\n    passwordPlaceholder: \"輸入登錄密碼\",\n    verifyPlaceholder: \"請輸入驗證碼\",\n    agree: \"同意\",\n    protocol: \"《平安一賬通會員服務協議》\",\n    login: \"登入\",\n    register: \"註冊\",\n    forget: \"忘記密碼\",\n    mobile: \"手機號\",\n    mobilePlaceholder: \"手機號\",\n    verifyCode: \"驗證碼\",\n    verifyCodePlaceholder: \"驗證碼\",\n    verifyCodeGet: \"獲取驗證碼\",\n    tips: {\n      e1: \"請輸入賬號信息\",\n      e2: \"請輸入密碼\",\n      e3: \"請輸入圖像驗證碼\",\n      e4: \"請同意《平安一賬通會員服務協議》\",\n      e5: \"賬號或密碼不正確\",\n      oe0: \"請輸入正確的手機號\",\n      oe1: \"請先獲取短信驗證碼\",\n      oe2: \"請輸入圖片驗證碼\",\n      oe3: \"請輸入短信驗證碼\",\n      oe4: \"短信驗證碼不正確\"\n    }\n  },\n  register: {\n    mobileOptions: [{\n      type: \"hk\",\n      name: \"香港手機號\",\n      placeHolder: \"請輸入8位手機號碼\",\n      areaCode: \"+852\"\n    }, {\n      type: \"zh\",\n      name: \"大陸手機號\",\n      placeHolder: \"請輸入11位手機號碼\",\n      areaCode: \"+86\"\n    }],\n    coutTips: \"{second}秒後重新獲取\",\n    title: \"歡迎註冊\",\n    title2: \"請設置新的密碼\",\n    mobilePlaceholder: \"請輸入8位手機號碼\",\n    verifyCodePlaceholder: \"請輸入驗證碼\",\n    verifyCodeGet: \"獲取驗證碼\",\n    agree: \"同意\",\n    protocol: \"《平安一賬通會員服務協議》\",\n    register: \"點擊註冊\",\n    newPassword: \"新密碼\",\n    newPasswordPlaceholder: \"輸入登錄密碼\",\n    newPasswordSure: \"確認密碼\",\n    newPasswordSurePlaceholder: \"輸入登錄密碼\",\n    sure: \"確認\",\n    tips: {\n      e1: \"手機號不正確,請輸入正確的手機號\",\n      e2: \"請同意《平安一賬通會員服務協議》\",\n      e3: \"短信驗證碼不正確\",\n      e4: \"請先獲取短信驗證碼\",\n      e5: \"手機號已經被註冊,請使用其他手機號註冊或直接登錄\",\n      e6: \"請輸入圖片驗證碼\",\n      e7: \"密碼長度不能少於8位\",\n      e8: \"密碼中必須包含數字、字符以及特殊號碼\",\n      e9: \"兩次密碼不一致,請確認後重新輸入\",\n      e10: \"驗證碼過期,請重新申請驗證碼\",\n      e11: \"註冊失敗,請聯繫工作人員\",\n      e12: \"註冊成功\"\n    }\n  },\n  session: {\n    sidExpire: \"長時間未操作,為了您賬戶的安全,請登錄後再操作\"\n  },\n  passwordCheck: {\n    error1: \"密碼長度不少於8位\",\n    error2: \"密碼中必須包含數字、字符以及特殊號碼\",\n    error3: \"兩次密碼不一致,請確認後重新輸入\",\n    error4: \"密碼修改失敗,請稍後再試,或撥打客服電話95511解決\",\n    error5: \"舊密碼不正確,請重新輸入\",\n    success: \"密碼修改成功\"\n  },\n  passwordReset: {\n    oldPwd: \"舊密碼\",\n    oldPwdPlaceholde: \"請輸入舊密碼\",\n    cidExpire: \"長時間未操作,為了您賬戶的安全,請重新開始\",\n    type1: {\n      title: \"密碼找回\",\n      t1: \"用戶輸入信息\",\n      t1Placeholder: \"手機號/證件號\",\n      submit: \"確認\",\n      error: \"您的手機號或證件號輸入錯誤,請核對后重新輸入\"\n    },\n    type2: {\n      title: \"密碼找回\",\n      t1: \"手機短信驗證碼\",\n      t1Placeholder: \"請輸入驗證碼\",\n      submit: \"確認\",\n      error1: \"短信驗證碼輸入錯誤,請核對後重新輸入\",\n      error2: \"短信驗證碼已經過期,請重新獲取驗證碼\",\n      error3: \"短信驗證碼發放時間少於1分鐘,請稍後再試\"\n    },\n    type3: {\n      title: \"密碼找回\",\n      t1: \"核對身份證信息\",\n      t1Placeholder: \"\",\n      submit: \"確認\"\n    },\n    type4: {\n      title: \"請設置新的密碼\",\n      t1: \"新密碼\",\n      t1Placeholder: \"請輸入新密碼\",\n      t2: \"確認密碼\",\n      t2Placeholder: \"請重新輸入新密碼\",\n      submit: \"確認\"\n    }\n  },\n  infomationImprove: {\n    title: \"請完善您的信息\",\n    t1: \"姓名\",\n    t1c1: \"姓\",\n    t1c2: \"名\",\n    t1Placeholder: \"\",\n    t2: \"性別\",\n    t2Placeholder: \"\",\n    t3: \"出生日期\",\n    t3Placeholder: \"\",\n    t4: \"證件類型\",\n    t4Placeholder: \"\",\n    t5: \"證件號碼\",\n    t5Placeholder: \"\",\n    submit: \"確認\",\n    cancel: \"跳過\",\n    candidates: {\n      sex: [{\n        name: \"男\",\n        value: \"M\"\n      }, {\n        name: \"女\",\n        value: \"F\"\n      }],\n      idType: [{\n        name: \"身份證\",\n        value: \"1\"\n      }, {\n        name: \"護照\",\n        value: \"2\"\n      }, {\n        name: \"軍官證或士兵證\",\n        value: \"3\"\n      }, {\n        name: \"港澳通行證/回鄉證或台胞證\",\n        value: \"6\"\n      }, {\n        name: \"外國人永久居留身份證\",\n        value: \"O\"\n      }, {\n        name: \"港澳台居民居住證\",\n        value: \"V\"\n      }, {\n        name: \"台灣居民居住證\",\n        value: \"W\"\n      }, {\n        name: \"其他\",\n        value: \"0\"\n      }]\n    },\n    successMsg: \"更新成功\",\n    errorTips: {\n      e1: \"請填寫姓名信息\",\n      e2: \"請選擇性別\",\n      e3: \"請選擇生日\",\n      e4: \"請選擇證件類型\",\n      e5: \"請填寫證件號碼\",\n      e6: \"您填寫的證件號碼有誤\",\n      e7: \"您填寫的信息有誤,請核實後重新提交\"\n    }\n  },\n  index: {\n    news: \"新聞資訊\",\n    newMore: \"查看更多\",\n    recommend: {\n      t1: \"在線報價\",\n      t2: \"客戶服務\",\n      t3: \"產品介紹\",\n      t4: \"最新消息\",\n      item1: {\n        btn: \"了解更多產品\",\n        t1: \"為自己和家人尋找壹份保障\"\n      },\n      item2: {\n        btn: \"立即預約\",\n        t1: \"在線預約 專業服務\"\n      },\n      item3: {\n        btn: \"客戶服務\",\n        t1: \"專業客服為妳服務\",\n        t2: \"想了解更多,可致電\",\n        t3: \"95511\",\n        t4: \"聯絡我們,或進入\"\n      }\n    }\n  },\n  complaintAcceptance: {\n    name: \"姓名\",\n    namePlaceholder: \"姓名\",\n    contactType: \"聯絡方式\",\n    email: \"電郵地址\",\n    question: \"問題或意見\",\n    questionPlaceHolder: \"(字數不超過500字)\",\n    orderNo: \"保單編號\",\n    orderNoPlaceHolder: \"如您為平安客戶,請提供保單編號\",\n    contactTime: \"期望聯絡時間\",\n    notice1: \"本表格所收集的個人資料根據「平安人壽香港個人資料收集聲明」處理及只會被用作於聯絡 閣下之用。然而所收集的個人資料未經您明確授權將不會轉移至「平安人壽香港個人資料收集聲明」列明以外之第三者機構。您可選擇不向我們提供所需的個人資料,惟這樣可能導致我們不能聯絡您。您亦可根據「平安人壽香港個人資料收集聲明」之權利查閱及更正個人資料。\",\n    notice2: \"本人現確認明白並同意本人的個人資料根據中銀人壽個人資料收集聲明作以上述用途。\",\n    contactTypes: [{\n      name: '電話',\n      value: 1\n    }, {\n      name: '電郵',\n      value: 2\n    }],\n    errorTips: {\n      e1: \"請填寫該項內容\",\n      e2: \"請填寫正確的聯繫方式\"\n    },\n    success: \"感謝您的寶貴意見\"\n  },\n  reservation: {\n    name: \"姓名\",\n    namePlaceholder: \"姓名\",\n    contactType: \"聯絡方式\",\n    contactTypeCadidates: [{\n      name: \"電話\",\n      value: 1\n    }],\n    contact: \"聯絡電話\",\n    contactPlaceholder: \"香港號碼/內地號碼\",\n    reservationType: \"預約類型\",\n    reservationCandidates: [{\n      name: \"投保諮詢\",\n      value: \"投保諮詢\"\n    }, {\n      name: \"代辦保單變更\",\n      value: \"代办保单变更\"\n    }],\n    reservationRemark: \"預約說明\",\n    reservationRemarkPlaceholder: \"請簡單說明您想要咨詢的產品或業務\",\n    hkClient: \"是否平安香港客戶\",\n    yes: \"是\",\n    no: \"否\",\n    contactTime: \"期望聯絡時間\",\n    notice1: \"本表格所收集的個人資料根據「平安人壽香港個人資料收集聲明」處理及只會被用作於聯絡 閣下之用。然而所收集的個人資料未經您明確授權將不會轉移至「平安人壽香港個人資料收集聲明」列明以外之第三者機構。您可選擇不向我們提供所需的個人資料,惟這樣可能導致我們不能聯絡您。您亦可根據「平安人壽香港個人資料收集聲明」之權利查閱及更正個人資料。\",\n    notice2: \"本人現確認明白並同意本人的個人資料根據中銀人壽個人資料收集聲明作以上述用途。\",\n    success: \"提交成功\",\n    submitBtn: '确认',\n    errorTips: {\n      e1: \"請填寫該項內容\",\n      e2: \"請填寫正確的聯繫方式\"\n    }\n  },\n  paymentType: {\n    menu1: \"親臨客服中心付款\",\n    menu2: \"網銀付款\",\n    menu3: \"電匯付款\",\n    menu4: \"櫃員機付款\",\n    menu5: \"「繳費靈」付款\",\n    menu6: \"香港郵政局\"\n  },\n  product: {\n    btnPosition: \"預約服務\",\n    iconProblem: \"常見問題\",\n    iconProcess: \"投保流程\",\n    iconProduct: \"產品詳情\"\n  },\n  customProduct: {\n    menu1: \"聯繫我們\",\n    menu2: \"繳付保費\",\n    menu3: \"保單查詢\",\n    menu4: \"保單變更\",\n    menu5: \"理賠申請\",\n    menu6: \"預約服務\",\n    menu7: \"投訴受理\",\n    menu8: \"常用表格\"\n  },\n  commonForm: {\n    head1: \"表格類型\",\n    head2: \"表格名稱\",\n    head3: \"使用說明\",\n    head4: \"附件\",\n    download: \"下載文檔\",\n    form: [{\n      type: \"繳費類\",\n      list: [{\n        name: \"「電子入賬服務」及銀行戶口<br>直接付款授權申請\",\n        desc: \"申請設立「 電子入賬服務」 及銀行戶口<br>直接付款授權時須提供\",\n        download: \"\"\n      }, {\n        name: \"信用卡戶口直接付款授權書\",\n        desc: \"申請信用卡戶口直接付款授權時須提供\",\n        download: \"\"\n      }]\n    }, {\n      type: \"保單變更類\",\n      list: [{\n        name: \"保險合同解除申請書\",\n        desc: \"退保、冷靜期退保業務適用\",\n        download: \"\"\n      }, {\n        name: \"保險合同變更申請書( 保單貸款還款類)\",\n        desc: \"保單貸款、還款業務適用\",\n        download: \"\"\n      }, {\n        name: \"保險合同變更申請書( 保險合同計劃變更類)\",\n        desc: \"加保、減保、新增附險、復效等業務適用\",\n        download: \"\"\n      }, {\n        name: \"保險合同變更申請書( 客戶信息變更類)\",\n        desc: \"基本資訊變更業務適用\",\n        download: \"\"\n      }, {\n        name: \"保險合同變更申請書( 客戶權益變更類)\",\n        desc: \"交費方式、自墊選擇權變更、補發等業務適用\",\n        download: \"\"\n      }, {\n        name: \"授權委托書\",\n        desc: \"委托他人代辦時須提供\",\n        download: \"\"\n      }, {\n        name: \"稅收聲明\",\n        desc: \"CRS要求\",\n        download: \"\"\n      }, {\n        name: \"健康告知\",\n        desc: \"須二次核保的業務須提供\",\n        download: \"\"\n      }]\n    }, {\n      type: \"理賠類\",\n      list: [{\n        name: \"理賠申請書\",\n        desc: \"紙質申請的應備文件\",\n        download: \"\"\n      }]\n    }]\n  },\n  policyChangeGuide: {\n    notice: \"如需做其他保單變更\",\n    noticeLink: \"聯繫客服\",\n    head1: \"項目\",\n    head2: \"具體內容\",\n    head3: \"申請資格人\",\n    head4: \"受理時間\",\n    head5: \"應備材料\",\n    download: \"下載文檔\",\n    form: [{\n      project: \"退保\",\n      content: \"在冷靜期後解除合同,公司將退還保單現金價值或未滿期凈保費。(待產品精算確認)\",\n      applicant: \"投保人\",\n      receptionTime: \"保單效力終止前\",\n      materialList: [{\n        name: \"保險單\"\n      }, {\n        name: \"申請書\",\n        type: 1\n      }, {\n        name: \"投保人有效身份證件\"\n      }, {\n        name: \"存折银行卡相关\"\n      }]\n    }, {\n      project: \"冷靜期退保\",\n      content: \"在冷靜期內提出解除合同,公司會無息退還全部保費\",\n      applicant: \"投保人\",\n      receptionTime: \"冷靜期結束前\",\n      materialList: [{\n        name: \"保險單\"\n      }, {\n        name: \"申請書\",\n        type: 1\n      }, {\n        name: \"投保人有效身份證件\"\n      }, {\n        name: \"存折银行卡相关\"\n      }, {\n        name: \"首期保費發票\"\n      }]\n    }, {\n      project: \"客戶資料變更\",\n      projectType: 1,\n      path: \"/custom/service\",\n      query: {\n        q: \"m42\"\n      },\n      content: \"投保人、受保人、受益人的個人信息變更\",\n      applicant: \"投保人\",\n      receptionTime: \"不限\",\n      materialList: [{\n        name: \"申請書\",\n        type: 1\n      }, {\n        name: \"必要的證明材料\"\n      }]\n    }, {\n      project: \"聯系方式變更\",\n      projectType: 1,\n      path: \"/custom/service\",\n      query: {\n        q: \"m43\"\n      },\n      content: \"地址、電話等信息的變更\",\n      applicant: \"投保人\",\n      receptionTime: \"不限\",\n      materialList: [{\n        name: \"申請書\",\n        type: 1\n      }, {\n        name: \"投保人有效身份證件\"\n      }]\n    }, {\n      project: \"交費方式變更\",\n      content: \"更改保單的續期交費方式或交費賬號\",\n      applicant: \"投保人\",\n      receptionTime: \"保單交費期滿前\",\n      materialList: [{\n        name: \"申請書\",\n        type: 1\n      }, {\n        name: \"保險單\"\n      }]\n    }]\n  },\n  policyChangeContact: {\n    phone: \"聯繫電話\",\n    address: \"聯繫地址\",\n    email: \"E-Mail\",\n    checkTips: \"本人不同意接收宣傳信息\",\n    submit: \"確認修改\",\n    errorTips: {\n      e1: \"請填寫正確的聯繫電話\",\n      e2: \"請填寫聯繫地址\",\n      e3: \"請填寫正確的E-Mail地址\"\n    },\n    success: \"更新成功\"\n  },\n  policyChangeInformation: {\n    title: \"客戶資料變更\",\n    owner: \"投保人\",\n    insured: \"受保人\",\n    obj: \"變更對象\",\n    name: \"姓名\",\n    sex: \"性别\",\n    birth: \"出生日期\",\n    type: \"證件類型\",\n    NO: \"證件號碼\",\n    validityPeriod: \"證件有效期\",\n    nationality: \"國籍\",\n    employer: \"工作單位\",\n    maritalStatus: \"婚姻狀況\",\n    submit: \"確認修改\",\n    upload: \"附件上傳\",\n    modifyTips1: \"如需修改請\",\n    modifyTips2: \"聯繫客服\",\n    success: \"更新成功\"\n  },\n  contactUs: {\n    service: {\n      center: {\n        title: \"客戶服務中心\",\n        address: \"地址:香港尖沙嘴港威永金融大樓\",\n        time: \"服務時間:星期壹至五9:00-18:00\"\n      },\n      hotline: {\n        title: \"客戶服務熱線\",\n        hk: \"香港號碼:(852)2983 8866\",\n        cn: \"內地號碼:(86)40078 95511\",\n        time: \"服務時間:星期壹至五9:00-18:00\"\n      },\n      mail: {\n        title: \"客戶服務電郵\",\n        mail: \"cs@pingan.com.hk\"\n      }\n    },\n    pulbic: {\n      title: \"微信公眾號\",\n      m1: \"登陸「微信」APP, 按右上角的「+」按鈕並選擇「添加朋友」,選擇「公眾號」 輸入並搜索「平安人壽香港」\",\n      m2: \"登陸「微信」APP, 按右上角的「+」按鈕並選擇「掃壹掃」掃描下方二維碼(放置二維碼)\"\n    },\n    qrcode: {\n      title: \"官方公眾號\"\n    }\n  },\n  customService: {\n    name: \"客戶服務\",\n    menu1: \"聯繫我們\",\n    menu2: \"繳付保費\",\n    menu3: \"保單查詢\",\n    menu4: \"保單變更\",\n    menu41: \"保單變更指引\",\n    menu42: \"聯系方式變更\",\n    menu43: \"客戶資料變更\",\n    menu5: \"理賠申請\",\n    menu6: \"預約服務\",\n    menu7: \"投訴受理\",\n    menu8: \"常用表格\",\n    insuranceQuery: {\n      modify: \"修改\",\n      InsurantNumber: \"保單號碼\",\n      Insurant: \"受保人\",\n      InsurantName: \"險種名稱\",\n      InsurantAmount: \"保額\",\n      effectiveDate: \"保費到期日\",\n      period: \"保障年期\",\n      t2Title: \"保單信息\",\n      t2n1: \"險種名稱\",\n      t2n2: \"保額\",\n      t2n3: \"生效日期\",\n      t2n4: \"保障年期\",\n      t2n5: \"受保人姓名(中文)\",\n      t2n6: \"受保人姓名(英文)\",\n      t2n7: \"出生日期\",\n      t2n8: \"證件號碼\",\n      t3Title: \"客戶資料\",\n      t3n1: \"投保人姓名(中文)\",\n      t3n2: \"投保人姓名(英文)\",\n      t3n3: \"出生日期\",\n      t3n4: \"證件號碼\",\n      t3n5: \"聯繫地址\",\n      t3n6: \"居住地址\",\n      t3n7: \"手提電話\",\n      t3n8: \"電子郵箱\",\n      t4Title: \"受益人資料\",\n      // t4BeneficiaryInformation\n      t4NameCn: \"姓名(中文)\",\n      t4NameEn: \"姓名(英文)\",\n      t4Relation: \"與受保人關係\",\n      t4Allocation: \"分配比例\",\n      t5Title: \"繳費資料\",\n      t5PaymentPeriod: \"續費年期\",\n      t5PaymentMethod: \"繳費方式\",\n      t5PaymentCurrency: \"繳費幣種\",\n      t5CurrentPremium: \"當期保費\",\n      t5PaymentBank: \"繳費銀行\",\n      t5PaymentAccount: \"繳費帳號\",\n      t6Title: \"繳費記錄\",\n      t6PaymentPeriod: \"繳費期\",\n      t6PaymentMethod: \"繳費方式\",\n      t6ClosingDate: \"實收日期\",\n      t6PaymentAmount: \"繳費金額\",\n      showMore: \"顯示所有保單\",\n      noPolicy: \"您還未購買保單,如有疑問請\",\n      customService: \"聯繫客服\"\n    },\n    unauth: {\n      tips: \"如您有平安一賬通賬戶,可幫助我們更好地為您提供服務\",\n      or: \"或\",\n      login: \"登錄\",\n      register: \"註冊\",\n      baseInfoTip: \"您的完整信息可幫助我們為你提供完整服務\",\n      infoBtn: \"前往完善\"\n    }\n  },\n  pagination: {\n    firstPage: \"第一頁\",\n    nextPage: \"下一頁\",\n    goto: \"跳轉\",\n    per: \"第\",\n    page: \"頁\"\n  }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tbW9uL2xhbmcvdGMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL2xhbmcvdGMuanM/ZDNmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcblx0bWVzc2FnZToge1xuXHRcdGxvZ2luOiAnTG9naW4nLFxuXHRcdFVzZXJuYW1lOiAnVXNlcm5hbWUnLFxuXHRcdFBhc3N3b3JkOiAnUGFzc3dvcmQnLFxuXHRcdENhcHRjaGE6ICdDYXB0Y2hhJyxcblx0XHRMYW5ndWFnZTogJ0xhbmd1YWdlJyxcblx0XHR6aDogJ0NoaW5lc2UnLFxuXHRcdGVuOiAnRW5nbGlzaCdcblx0fSxcblx0Z2xiYWxUaXBzOiB7XG5cdFx0c2Vzc2lvbkxvc3Q6IFwi54K65LqG5pu05aW955qE6auU6amX77yM6ZyA6KaB5oKo55m76YyE5b6M5YaN6YCy6KGM5q2k5pON5L2cXCJcblx0fSxcblx0Zm9ybToge1xuXHRcdGRhdGVQaWNrZXI6IHtcblx0XHRcdGRhdGVQbGFjZWhvbGRlcjogXCLor7fpgInmi6nml6XmnJ9cIlxuXHRcdH0sXG5cdFx0bW9kYWxVcGxvYWRDYXJkOntcblx0XHRcdHRpdDpcIuiri+S4iuWCs+itieS7tuizh+aWmVwiLFxuXHRcdFx0ZnJvbnQ6XCLorYnku7bmraPpnaJcIixcblx0XHRcdGJhY2s6XCLorYnku7blj43pnaJcIixcblx0XHR9XG5cdH0sXG5cdG5hdjoge1xuXHRcdGxvZ2luRGF0YToge1xuXHRcdFx0bmFtZTogXCLnmbvlhaVcIixcblx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRcdG5hbWU6IFwi6Ki75YaKXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvcmVnaXN0ZXJcIixcblx0XHRcdFx0XHR0eXBlOiBcIm5vQXV0aFwiLFxuXHRcdFx0XHRcdHZhbHVlOiBcIlwiXG5cdFx0XHRcdH0sIHtcblx0XHRcdFx0XHRuYW1lOiBcIueZu+WFpVwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2xvZ2luXCIsXG5cdFx0XHRcdFx0dHlwZTogXCJub0F1dGhcIixcblx0XHRcdFx0XHR2YWx1ZTogXCJcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCLkv67mlLnlr4bnorxcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9wYXNzd29yZC9yZXNldFwiLFxuXHRcdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHRcdHZhbHVlOiBcIlwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIuWAi+S6uuS/oeaBr1wiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2luZm9tYXRpb24vaW1wcm92ZVwiLFxuXHRcdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHRcdHZhbHVlOiBcIlwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIueZu+WHulwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdFx0dHlwZTogXCJhdXRoXCIsXG5cdFx0XHRcdFx0dmFsdWU6IFwibG9nb3V0XCJcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0bmF2TGlzdDogW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIueUouWTgeS7i+e0uVwiLFxuXHRcdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRcdG5hbWU6IFwiVkhJU1wiLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdFx0dmFsdWU6IFwiZ290b1ZISVNcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCLliIbntIXntYLouqtcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9wcm9kdWN0XCJcblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5a6i5oi25pyN5YuZXCIsXG5cdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIuWuouaItuacjeWLmeWwjuiIqlwiLFxuXHRcdFx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3Byb2R1Y3RcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLoga/ns7vmiJHlgJFcIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTFcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLnubPku5jkv53osrtcIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTJcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLkv53llq7mn6XoqaJcIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTNcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLkv53llq7orormm7RcIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTQxXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi55CG6LOg55Sz6KuLXCIsXG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW01XCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi6aCQ57SE5pyN5YuZXCIsXG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW02XCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5oqV6Ki05Y+X55CGXCIsXG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW03XCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5bi455So6KGo5qC8XCIsXG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW04XCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIumXnOaWvOaIkeWAkVwiLFxuXHRcdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRcdG5hbWU6IFwi5bmz5a6J5Lq65aO96aaZ5rivXCIsXG5cdFx0XHRcdFx0cGF0aDogXCIvcHJvZmlsZVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIuWFrOWPuOa0u+WLlVwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2VtcHR5XCJcblx0XHRcdFx0fSx7XG5cdFx0XHRcdFx0bmFtZTogXCLmlrDogZ7kuK3lv4NcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9uZXdzL2xpc3RcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogXCLkvIHmpa3npL7mnIPosqzku7tcIixcblx0XHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiBcIueNjumgheauiuamrlwiLFxuXHRcdFx0XHRcdHBhdGg6IFwiL2VtcHR5XCJcblx0XHRcdFx0fV1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5Yqg5YWl5oiR5YCRXCIsXG5cdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIuS8gealreaWh+WMllwiLFxuXHRcdFx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLkuovmpa3nmbzlsZXmqZ/mnINcIixcblx0XHRcdFx0XHRcdHBhdGg6IFwiL2VtcHR5XCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdXG5cdFx0XHR9XG5cdFx0XVxuXHR9LFxuXHRmb290ZXI6IHtcblx0XHRoa1Bob25lOiBcIummmea4r+WPt+eggVwiLFxuXHRcdGNuUGhvbmU6IFwi5YaF5Zyw5Y+356CBXCIsXG5cdFx0YWJvdXRVczogXCLpl5zmlrzmiJHlgJFcIixcblx0XHRjb21wYW55SW50cm9kdWN0aW9uOiBcIumbhuWcmOS7i+e0uVwiLFxuXHRcdG5ld3M6IFwi5paw6IGe6LOH6KiKXCIsXG5cdFx0am9pblVzOiBcIuWKoOWFpeaIkeWAkVwiLFxuXHRcdGhlbHBDZW50ZXI6IFwi5bmr5Yqp5Lit5b+DXCIsXG5cdFx0cHJpdmFjeTogXCLpmrHnp4HmlL/nrZZcIixcblx0XHR0ZXJtczogXCLkvb/nlKjmop3mrL5cIixcblx0XHRwcm90b2NvbDogXCLlgIvkurros4fmlpnmlLbpm4bogbLmmI5cIixcblx0XHRtYXA6IFwi57ay56uZ5Zyw5ZyWXCIsXG5cdFx0Y29udGFjdFVzOiBcIuiBr+e1oeaIkeWAkVwiLFxuXHRcdGNvbnRhY3RJbmZvcm1hdGlvbjogXCLoga/nuavmlrnlvI9cIixcblx0XHRzZXJ2aWNlOiBcIuacjeWLmee2sue1oVwiLFxuXHRcdHFyY29kZTogXCLnpL7kuqTlqpLpq5RcIixcblx0XHRjb3B5cmlnaHQ6IFwi54mI5qyK5omA5pyJIMKpIOS4reWci+W5s+WuieS/nemaqu+8iOmbhuWcmO+8ieiCoeS7veaciemZkOWFrOWPuOacque2k+ioseWPr+S4jeW+l+W+qeWItuOAgei9iei8ieaIluaRmOe3qO+8jOmBleiAheW/heeptiFcIlxuXHR9LFxuXHRsb2dpbjoge1xuXHRcdHRpdGxlOiBcIuW5s+WuieS4gOizrOmAmlwiLFxuXHRcdGxvZ2luVHlwZTE6IFwi6LOs5a+G55m76YyEXCIsXG5cdFx0bG9naW5UeXBlMjogXCLli5XmhYvlr4bnorznmbvlvZVcIixcblx0XHRhY2NvdW50OiBcIuizrOiZn1wiLFxuXHRcdGFjY291bnRQbGFjZWhvbGRlcjogXCLoq4vovLjlhaXorYnku7bomZ8v5LiA6LOs6YCa55So5oi25ZCNL+aJi+apn+iZn1wiLFxuXHRcdHBhc3N3b3JkOiBcIuWvhueivFwiLFxuXHRcdHBhc3N3b3JkUGxhY2Vob2xkZXI6IFwi6Ly45YWl55m76YyE5a+G56K8XCIsXG5cdFx0dmVyaWZ5UGxhY2Vob2xkZXI6IFwi6KuL6Ly45YWl6amX6K2J56K8XCIsXG5cdFx0YWdyZWU6IFwi5ZCM5oSPXCIsXG5cdFx0cHJvdG9jb2w6IFwi44CK5bmz5a6J5LiA6LOs6YCa5pyD5ZOh5pyN5YuZ5Y2U6K2w44CLXCIsXG5cdFx0bG9naW46IFwi55m75YWlXCIsXG5cdFx0cmVnaXN0ZXI6IFwi6Ki75YaKXCIsXG5cdFx0Zm9yZ2V0OiBcIuW/mOiomOWvhueivFwiLFxuXHRcdG1vYmlsZTogXCLmiYvmqZ/omZ9cIixcblx0XHRtb2JpbGVQbGFjZWhvbGRlcjogXCLmiYvmqZ/omZ9cIixcblx0XHR2ZXJpZnlDb2RlOiBcIumpl+itieeivFwiLFxuXHRcdHZlcmlmeUNvZGVQbGFjZWhvbGRlcjogXCLpqZforYnnorxcIixcblx0XHR2ZXJpZnlDb2RlR2V0OiBcIueNsuWPlumpl+itieeivFwiLFxuXHRcdHRpcHM6IHtcblx0XHRcdGUxOiBcIuiri+i8uOWFpeizrOiZn+S/oeaBr1wiLFxuXHRcdFx0ZTI6IFwi6KuL6Ly45YWl5a+G56K8XCIsXG5cdFx0XHRlMzogXCLoq4vovLjlhaXlnJblg4/pqZforYnnorxcIixcblx0XHRcdGU0OiBcIuiri+WQjOaEj+OAiuW5s+WuieS4gOizrOmAmuacg+WToeacjeWLmeWNlOitsOOAi1wiLFxuXHRcdFx0ZTU6IFwi6LOs6Jmf5oiW5a+G56K85LiN5q2j56K6XCIsXG5cdFx0XHRvZTA6IFwi6KuL6Ly45YWl5q2j56K655qE5omL5qmf6JmfXCIsXG5cdFx0XHRvZTE6IFwi6KuL5YWI542y5Y+W55+t5L+h6amX6K2J56K8XCIsXG5cdFx0XHRvZTI6IFwi6KuL6Ly45YWl5ZyW54mH6amX6K2J56K8XCIsXG5cdFx0XHRvZTM6IFwi6KuL6Ly45YWl55+t5L+h6amX6K2J56K8XCIsXG5cdFx0XHRvZTQ6IFwi55+t5L+h6amX6K2J56K85LiN5q2j56K6XCIsXG5cdFx0fSxcblx0fSxcblx0cmVnaXN0ZXI6IHtcblx0XHRtb2JpbGVPcHRpb25zOiBbe1xuXHRcdFx0dHlwZTogXCJoa1wiLFxuXHRcdFx0bmFtZTogXCLpppnmuK/miYvmqZ/omZ9cIixcblx0XHRcdHBsYWNlSG9sZGVyOiBcIuiri+i8uOWFpTjkvY3miYvmqZ/omZ/norxcIixcblx0XHRcdGFyZWFDb2RlOiBcIis4NTJcIlxuXHRcdH0sIHtcblx0XHRcdHR5cGU6IFwiemhcIixcblx0XHRcdG5hbWU6IFwi5aSn6Zm45omL5qmf6JmfXCIsXG5cdFx0XHRwbGFjZUhvbGRlcjogXCLoq4vovLjlhaUxMeS9jeaJi+apn+iZn+eivFwiLFxuXHRcdFx0YXJlYUNvZGU6IFwiKzg2XCJcblx0XHR9XSxcblx0XHRjb3V0VGlwczogXCJ7c2Vjb25kfeenkuW+jOmHjeaWsOeNsuWPllwiLFxuXHRcdHRpdGxlOiBcIuatoei/juiou+WGilwiLFxuXHRcdHRpdGxlMjogXCLoq4voqK3nva7mlrDnmoTlr4bnorxcIixcblx0XHRtb2JpbGVQbGFjZWhvbGRlcjogXCLoq4vovLjlhaU45L2N5omL5qmf6Jmf56K8XCIsXG5cdFx0dmVyaWZ5Q29kZVBsYWNlaG9sZGVyOiBcIuiri+i8uOWFpempl+itieeivFwiLFxuXHRcdHZlcmlmeUNvZGVHZXQ6IFwi542y5Y+W6amX6K2J56K8XCIsXG5cdFx0YWdyZWU6IFwi5ZCM5oSPXCIsXG5cdFx0cHJvdG9jb2w6IFwi44CK5bmz5a6J5LiA6LOs6YCa5pyD5ZOh5pyN5YuZ5Y2U6K2w44CLXCIsXG5cdFx0cmVnaXN0ZXI6IFwi6bue5pOK6Ki75YaKXCIsXG5cdFx0bmV3UGFzc3dvcmQ6IFwi5paw5a+G56K8XCIsXG5cdFx0bmV3UGFzc3dvcmRQbGFjZWhvbGRlcjogXCLovLjlhaXnmbvpjITlr4bnorxcIixcblx0XHRuZXdQYXNzd29yZFN1cmU6IFwi56K66KqN5a+G56K8XCIsXG5cdFx0bmV3UGFzc3dvcmRTdXJlUGxhY2Vob2xkZXI6IFwi6Ly45YWl55m76YyE5a+G56K8XCIsXG5cdFx0c3VyZTogXCLnorroqo1cIixcblx0XHR0aXBzOiB7XG5cdFx0XHRlMTogXCLmiYvmqZ/omZ/kuI3mraPnorrvvIzoq4vovLjlhaXmraPnorrnmoTmiYvmqZ/omZ9cIixcblx0XHRcdGUyOiBcIuiri+WQjOaEj+OAiuW5s+WuieS4gOizrOmAmuacg+WToeacjeWLmeWNlOitsOOAi1wiLFxuXHRcdFx0ZTM6IFwi55+t5L+h6amX6K2J56K85LiN5q2j56K6XCIsXG5cdFx0XHRlNDogXCLoq4vlhYjnjbLlj5bnn63kv6HpqZforYnnorxcIixcblx0XHRcdGU1OiBcIuaJi+apn+iZn+W3sue2k+iiq+iou+WGiu+8jOiri+S9v+eUqOWFtuS7luaJi+apn+iZn+iou+WGiuaIluebtOaOpeeZu+mMhFwiLFxuXHRcdFx0ZTY6IFwi6KuL6Ly45YWl5ZyW54mH6amX6K2J56K8XCIsXG5cdFx0XHRlNzogXCLlr4bnorzplbfluqbkuI3og73lsJHmlrw45L2NXCIsXG5cdFx0XHRlODogXCLlr4bnorzkuK3lv4XpoIjljIXlkKvmlbjlrZfjgIHlrZfnrKbku6Xlj4rnibnmroromZ/norxcIixcblx0XHRcdGU5OiBcIuWFqeasoeWvhueivOS4jeS4gOiHtO+8jOiri+eiuuiqjeW+jOmHjeaWsOi8uOWFpVwiLFxuXHRcdFx0ZTEwOiBcIumpl+itieeivOmBjuacn++8jOiri+mHjeaWsOeUs+iri+mpl+itieeivFwiLFxuXHRcdFx0ZTExOiBcIuiou+WGiuWkseaVl++8jOiri+iBr+e5q+W3peS9nOS6uuWToVwiLFxuXHRcdFx0ZTEyOiBcIuiou+WGiuaIkOWKn1wiLFxuXHRcdH1cblx0fSxcblx0c2Vzc2lvbjoge1xuXHRcdHNpZEV4cGlyZTogXCLplbfmmYLplpPmnKrmk43kvZzvvIzngrrkuobmgqjos6zmiLbnmoTlronlhajvvIzoq4vnmbvpjITlvozlho3mk43kvZxcIixcblx0fSxcblx0cGFzc3dvcmRDaGVjazoge1xuXHRcdGVycm9yMTogXCLlr4bnorzplbfluqbkuI3lsJHmlrw45L2NXCIsXG5cdFx0ZXJyb3IyOiBcIuWvhueivOS4reW/hemgiOWMheWQq+aVuOWtl+OAgeWtl+espuS7peWPiueJueauiuiZn+eivFwiLFxuXHRcdGVycm9yMzogXCLlhanmrKHlr4bnorzkuI3kuIDoh7TvvIzoq4vnorroqo3lvozph43mlrDovLjlhaVcIixcblx0XHRlcnJvcjQ6IFwi5a+G56K85L+u5pS55aSx5pWX77yM6KuL56iN5b6M5YaN6Kmm77yM5oiW5pKl5omT5a6i5pyN6Zu76KmxOTU1MTHop6PmsbpcIixcblx0XHRlcnJvcjU6IFwi6IiK5a+G56K85LiN5q2j56K677yM6KuL6YeN5paw6Ly45YWlXCIsXG5cdFx0c3VjY2VzczogXCLlr4bnorzkv67mlLnmiJDlip9cIlxuXHR9LFxuXHRwYXNzd29yZFJlc2V0OiB7XG5cdFx0b2xkUHdkOiBcIuiIiuWvhueivFwiLFxuXHRcdG9sZFB3ZFBsYWNlaG9sZGU6IFwi6KuL6Ly45YWl6IiK5a+G56K8XCIsXG5cdFx0Y2lkRXhwaXJlOiBcIumVt+aZgumWk+acquaTjeS9nO+8jOeCuuS6huaCqOizrOaItueahOWuieWFqO+8jOiri+mHjeaWsOmWi+Wni1wiLFxuXHRcdHR5cGUxOiB7XG5cdFx0XHR0aXRsZTogXCLlr4bnorzmib7lm55cIixcblx0XHRcdHQxOiBcIueUqOaItui8uOWFpeS/oeaBr1wiLFxuXHRcdFx0dDFQbGFjZWhvbGRlcjogXCLmiYvmqZ/omZ8v6K2J5Lu26JmfXCIsXG5cdFx0XHRzdWJtaXQ6IFwi56K66KqNXCIsXG5cdFx0XHRlcnJvcjogXCLmgqjnmoTmiYvmqZ/omZ/miJborYnku7bomZ/ovLjlhaXpjK/oqqTvvIzoq4vmoLjlsI3lkI7ph43mlrDovLjlhaVcIixcblx0XHR9LFxuXHRcdHR5cGUyOiB7XG5cdFx0XHR0aXRsZTogXCLlr4bnorzmib7lm55cIixcblx0XHRcdHQxOiBcIuaJi+apn+efreS/oempl+itieeivFwiLFxuXHRcdFx0dDFQbGFjZWhvbGRlcjogXCLoq4vovLjlhaXpqZforYnnorxcIixcblx0XHRcdHN1Ym1pdDogXCLnorroqo1cIixcblx0XHRcdGVycm9yMTogXCLnn63kv6HpqZforYnnorzovLjlhaXpjK/oqqTvvIzoq4vmoLjlsI3lvozph43mlrDovLjlhaVcIixcblx0XHRcdGVycm9yMjogXCLnn63kv6HpqZforYnnorzlt7LntpPpgY7mnJ/vvIzoq4vph43mlrDnjbLlj5bpqZforYnnorxcIixcblx0XHRcdGVycm9yMzogXCLnn63kv6HpqZforYnnorznmbzmlL7mmYLplpPlsJHmlrwx5YiG6ZCY77yM6KuL56iN5b6M5YaN6KmmXCIsXG5cdFx0fSxcblx0XHR0eXBlMzoge1xuXHRcdFx0dGl0bGU6IFwi5a+G56K85om+5ZueXCIsXG5cdFx0XHR0MTogXCLmoLjlsI3ouqvku73orYnkv6Hmga9cIixcblx0XHRcdHQxUGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0XHRzdWJtaXQ6IFwi56K66KqNXCIsXG5cdFx0fSxcblx0XHR0eXBlNDoge1xuXHRcdFx0dGl0bGU6IFwi6KuL6Kit572u5paw55qE5a+G56K8XCIsXG5cdFx0XHR0MTogXCLmlrDlr4bnorxcIixcblx0XHRcdHQxUGxhY2Vob2xkZXI6IFwi6KuL6Ly45YWl5paw5a+G56K8XCIsXG5cdFx0XHR0MjogXCLnorroqo3lr4bnorxcIixcblx0XHRcdHQyUGxhY2Vob2xkZXI6IFwi6KuL6YeN5paw6Ly45YWl5paw5a+G56K8XCIsXG5cdFx0XHRzdWJtaXQ6IFwi56K66KqNXCIsXG5cdFx0fVxuXHR9LFxuXHRpbmZvbWF0aW9uSW1wcm92ZToge1xuXHRcdHRpdGxlOiBcIuiri+WujOWWhOaCqOeahOS/oeaBr1wiLFxuXHRcdHQxOiBcIuWnk+WQjVwiLFxuXHRcdHQxYzE6IFwi5aeTXCIsXG5cdFx0dDFjMjogXCLlkI1cIixcblx0XHR0MVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHQyOiBcIuaAp+WIpVwiLFxuXHRcdHQyUGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0dDM6IFwi5Ye655Sf5pel5pyfXCIsXG5cdFx0dDNQbGFjZWhvbGRlcjogXCJcIixcblx0XHR0NDogXCLorYnku7bpoZ7lnotcIixcblx0XHR0NFBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHQ1OiBcIuitieS7tuiZn+eivFwiLFxuXHRcdHQ1UGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0c3VibWl0OiBcIueiuuiqjVwiLFxuXHRcdGNhbmNlbDogXCLot7PpgY5cIixcblx0XHRjYW5kaWRhdGVzOiB7XG5cdFx0XHRzZXg6IFt7XG5cdFx0XHRcdG5hbWU6IFwi55S3XCIsXG5cdFx0XHRcdHZhbHVlOiBcIk1cIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWls1wiLFxuXHRcdFx0XHR2YWx1ZTogXCJGXCJcblx0XHRcdH1dLFxuXHRcdFx0aWRUeXBlOiBbe1xuXHRcdFx0XHRuYW1lOiBcIui6q+S7veitiVwiLFxuXHRcdFx0XHR2YWx1ZTogXCIxXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLorbfnhadcIixcblx0XHRcdFx0dmFsdWU6IFwiMlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi6LuN5a6Y6K2J5oiW5aOr5YW16K2JXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjNcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIua4r+a+s+mAmuihjOitiS/lm57phInorYnmiJblj7Dog57orYlcIixcblx0XHRcdFx0dmFsdWU6IFwiNlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5aSW5ZyL5Lq65rC45LmF5bGF55WZ6Lqr5Lu96K2JXCIsXG5cdFx0XHRcdHZhbHVlOiBcIk9cIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIua4r+a+s+WPsOWxheawkeWxheS9j+itiVwiLFxuXHRcdFx0XHR2YWx1ZTogXCJWXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLlj7DngaPlsYXmsJHlsYXkvY/orYlcIixcblx0XHRcdFx0dmFsdWU6IFwiV1wiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5YW25LuWXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjBcIlxuXHRcdFx0fV1cblx0XHR9LFxuXHRcdHN1Y2Nlc3NNc2c6IFwi5pu05paw5oiQ5YqfXCIsXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCLoq4vloavlr6vlp5PlkI3kv6Hmga9cIixcblx0XHRcdGUyOiBcIuiri+mBuOaTh+aAp+WIpVwiLFxuXHRcdFx0ZTM6IFwi6KuL6YG45pOH55Sf5pelXCIsXG5cdFx0XHRlNDogXCLoq4vpgbjmk4forYnku7bpoZ7lnotcIixcblx0XHRcdGU1OiBcIuiri+Whq+Wvq+itieS7tuiZn+eivFwiLFxuXHRcdFx0ZTY6IFwi5oKo5aGr5a+r55qE6K2J5Lu26Jmf56K85pyJ6KqkXCIsXG5cdFx0XHRlNzogXCLmgqjloavlr6vnmoTkv6Hmga/mnInoqqTvvIzoq4vmoLjlr6blvozph43mlrDmj5DkuqRcIixcblx0XHR9XG5cdH0sXG5cdGluZGV4OiB7XG5cdFx0bmV3czogXCLmlrDogZ7os4foqIpcIixcblx0XHRuZXdNb3JlOiBcIuafpeeci+abtOWkmlwiLFxuXHRcdHJlY29tbWVuZDoge1xuXHRcdFx0dDE6IFwi5Zyo57ea5aCx5YO5XCIsXG5cdFx0XHR0MjogXCLlrqLmiLbmnI3li5lcIixcblx0XHRcdHQzOiBcIueUouWTgeS7i+e0uVwiLFxuXHRcdFx0dDQ6IFwi5pyA5paw5raI5oGvXCIsXG5cdFx0XHRpdGVtMToge1xuXHRcdFx0XHRidG46IFwi5LqG6Kej5pu05aSa55Si5ZOBXCIsXG5cdFx0XHRcdHQxOiBcIueCuuiHquW3seWSjOWutuS6uuWwi+aJvuWjueS7veS/nemanFwiLFxuXHRcdFx0fSxcblx0XHRcdGl0ZW0yOiB7XG5cdFx0XHRcdGJ0bjogXCLnq4vljbPpoJDntIRcIixcblx0XHRcdFx0dDE6IFwi5Zyo57ea6aCQ57SEIOWwiOalreacjeWLmVwiLFxuXHRcdFx0fSxcblx0XHRcdGl0ZW0zOiB7XG5cdFx0XHRcdGJ0bjogXCLlrqLmiLbmnI3li5lcIixcblx0XHRcdFx0dDE6IFwi5bCI5qWt5a6i5pyN54K65aaz5pyN5YuZXCIsXG5cdFx0XHRcdHQyOiBcIuaDs+S6huino+abtOWkmu+8jOWPr+iHtOmbu1wiLFxuXHRcdFx0XHR0MzogXCI5NTUxMVwiLFxuXHRcdFx0XHR0NDogXCLoga/ntaHmiJHlgJHvvIzmiJbpgLLlhaVcIixcblx0XHRcdH1cblx0XHR9LFxuXHR9LFxuXHRjb21wbGFpbnRBY2NlcHRhbmNlOiB7XG5cdFx0bmFtZTogXCLlp5PlkI1cIixcblx0XHRuYW1lUGxhY2Vob2xkZXI6IFwi5aeT5ZCNXCIsXG5cdFx0Y29udGFjdFR5cGU6IFwi6IGv57Wh5pa55byPXCIsXG5cdFx0ZW1haWw6IFwi6Zu76YO15Zyw5Z2AXCIsXG5cdFx0cXVlc3Rpb246IFwi5ZWP6aGM5oiW5oSP6KaLXCIsXG5cdFx0cXVlc3Rpb25QbGFjZUhvbGRlcjogXCLvvIjlrZfmlbjkuI3otoXpgY41MDDlrZfvvIlcIixcblx0XHRvcmRlck5vOiBcIuS/neWWrue3qOiZn1wiLFxuXHRcdG9yZGVyTm9QbGFjZUhvbGRlcjogXCLlpoLmgqjngrrlubPlronlrqLmiLbvvIzoq4vmj5Dkvpvkv53llq7nt6jomZ9cIixcblx0XHRjb250YWN0VGltZTogXCLmnJ/mnJvoga/ntaHmmYLplpNcIixcblx0XHRub3RpY2UxOiBcIuacrOihqOagvOaJgOaUtumbhueahOWAi+S6uuizh+aWmeagueaTmuOAjOW5s+WuieS6uuWjvemmmea4r+WAi+S6uuizh+aWmeaUtumbhuiBsuaYjuOAjeiZleeQhuWPiuWPquacg+iiq+eUqOS9nOaWvOiBr+e1oSDplqPkuIvkuYvnlKjjgILnhLbogIzmiYDmlLbpm4bnmoTlgIvkurros4fmlpnmnKrntpPmgqjmmI7norrmjojmrIrlsIfkuI3mnIPovYnnp7voh7PjgIzlubPlronkurrlo73pppnmuK/lgIvkurros4fmlpnmlLbpm4bogbLmmI7jgI3liJfmmI7ku6XlpJbkuYvnrKzkuInogIXmqZ/mp4vjgILmgqjlj6/pgbjmk4fkuI3lkJHmiJHlgJHmj5DkvpvmiYDpnIDnmoTlgIvkurros4fmlpnvvIzmg5/pgJnmqKPlj6/og73lsI7oh7TmiJHlgJHkuI3og73oga/ntaHmgqjjgILmgqjkuqblj6/moLnmk5rjgIzlubPlronkurrlo73pppnmuK/lgIvkurros4fmlpnmlLbpm4bogbLmmI7jgI3kuYvmrIrliKnmn6XplrHlj4rmm7TmraPlgIvkurros4fmlpnjgIJcIixcblx0XHRub3RpY2UyOiBcIuacrOS6uuePvueiuuiqjeaYjueZveS4puWQjOaEj+acrOS6uueahOWAi+S6uuizh+aWmeagueaTmuS4remKgOS6uuWjveWAi+S6uuizh+aWmeaUtumbhuiBsuaYjuS9nOS7peS4iui/sOeUqOmAlOOAglwiLFxuXHRcdGNvbnRhY3RUeXBlczogW3sgbmFtZTogJ+mbu+ipsScsIHZhbHVlOiAxIH0sIHsgbmFtZTogJ+mbu+mDtScsIHZhbHVlOiAyIH1dLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwi6KuL5aGr5a+r6Kmy6aCF5YWn5a65XCIsXG5cdFx0XHRlMjogXCLoq4vloavlr6vmraPnorrnmoToga/nuavmlrnlvI9cIlxuXHRcdH0sXG5cdFx0c3VjY2VzcyA6IFwi5oSf6Kyd5oKo55qE5a+26LK05oSP6KaLXCJcblx0fSxcblx0cmVzZXJ2YXRpb246IHtcblx0XHRuYW1lOiBcIuWnk+WQjVwiLFxuXHRcdG5hbWVQbGFjZWhvbGRlcjogXCLlp5PlkI1cIixcblx0XHRjb250YWN0VHlwZTogXCLoga/ntaHmlrnlvI9cIixcblx0XHRjb250YWN0VHlwZUNhZGlkYXRlczogW3sgbmFtZTogXCLpm7voqbFcIiwgdmFsdWU6IDEgfV0sXG5cdFx0Y29udGFjdDogXCLoga/ntaHpm7voqbFcIixcblx0XHRjb250YWN0UGxhY2Vob2xkZXI6IFwi6aaZ5riv6Jmf56K8L+WFp+WcsOiZn+eivFwiLFxuXHRcdHJlc2VydmF0aW9uVHlwZTogXCLpoJDntITpoZ7lnotcIixcblx0XHRyZXNlcnZhdGlvbkNhbmRpZGF0ZXM6IFtcblx0XHRcdHsgbmFtZTogXCLmipXkv53oq67oqaJcIiwgdmFsdWU6IFwi5oqV5L+d6Kuu6KmiXCIgfSxcblx0XHRcdHsgbmFtZTogXCLku6Povqbkv53llq7orormm7RcIiwgdmFsdWU6IFwi5Luj5Yqe5L+d5Y2V5Y+Y5pu0XCIgfVxuXHRcdF0sXG5cdFx0cmVzZXJ2YXRpb25SZW1hcms6IFwi6aCQ57SE6Kqq5piOXCIsXG5cdFx0cmVzZXJ2YXRpb25SZW1hcmtQbGFjZWhvbGRlcjogXCLoq4vnsKHllq7oqqrmmI7mgqjmg7PopoHlkqjoqaLnmoTnlKLlk4HmiJbmpa3li5lcIixcblx0XHRoa0NsaWVudDogXCLmmK/lkKblubPlronpppnmuK/lrqLmiLZcIixcblx0XHR5ZXM6IFwi5pivXCIsXG5cdFx0bm86IFwi5ZCmXCIsXG5cdFx0Y29udGFjdFRpbWU6IFwi5pyf5pyb6IGv57Wh5pmC6ZaTXCIsXG5cdFx0bm90aWNlMTogXCLmnKzooajmoLzmiYDmlLbpm4bnmoTlgIvkurros4fmlpnmoLnmk5rjgIzlubPlronkurrlo73pppnmuK/lgIvkurros4fmlpnmlLbpm4bogbLmmI7jgI3omZXnkIblj4rlj6rmnIPooqvnlKjkvZzmlrzoga/ntaEg6Zaj5LiL5LmL55So44CC54S26ICM5omA5pS26ZuG55qE5YCL5Lq66LOH5paZ5pyq57aT5oKo5piO56K65o6I5qyK5bCH5LiN5pyD6L2J56e76Iez44CM5bmz5a6J5Lq65aO96aaZ5riv5YCL5Lq66LOH5paZ5pS26ZuG6IGy5piO44CN5YiX5piO5Lul5aSW5LmL56ys5LiJ6ICF5qmf5qeL44CC5oKo5Y+v6YG45pOH5LiN5ZCR5oiR5YCR5o+Q5L6b5omA6ZyA55qE5YCL5Lq66LOH5paZ77yM5oOf6YCZ5qij5Y+v6IO95bCO6Ie05oiR5YCR5LiN6IO96IGv57Wh5oKo44CC5oKo5Lqm5Y+v5qC55pOa44CM5bmz5a6J5Lq65aO96aaZ5riv5YCL5Lq66LOH5paZ5pS26ZuG6IGy5piO44CN5LmL5qyK5Yip5p+l6Zax5Y+K5pu05q2j5YCL5Lq66LOH5paZ44CCXCIsXG5cdFx0bm90aWNlMjogXCLmnKzkurrnj77norroqo3mmI7nmb3kuKblkIzmhI/mnKzkurrnmoTlgIvkurros4fmlpnmoLnmk5rkuK3pioDkurrlo73lgIvkurros4fmlpnmlLbpm4bogbLmmI7kvZzku6XkuIrov7DnlKjpgJTjgIJcIixcblx0XHRzdWNjZXNzIDogXCLmj5DkuqTmiJDlip9cIixcblx0XHRzdWJtaXRCdG46ICfnoa7orqQnLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwi6KuL5aGr5a+r6Kmy6aCF5YWn5a65XCIsXG5cdFx0XHRlMjogXCLoq4vloavlr6vmraPnorrnmoToga/nuavmlrnlvI9cIlxuXHRcdH1cblx0fSxcblx0cGF5bWVudFR5cGU6IHtcblx0XHRtZW51MTogXCLopqroh6jlrqLmnI3kuK3lv4Pku5jmrL5cIixcblx0XHRtZW51MjogXCLntrLpioDku5jmrL5cIixcblx0XHRtZW51MzogXCLpm7vljK/ku5jmrL5cIixcblx0XHRtZW51NDogXCLmq4Plk6HmqZ/ku5jmrL5cIixcblx0XHRtZW51NTogXCLjgIznubPosrvpnYjjgI3ku5jmrL5cIixcblx0XHRtZW51NjogXCLpppnmuK/pg7XmlL/lsYBcIixcblx0fSxcblx0cHJvZHVjdDoge1xuXHRcdGJ0blBvc2l0aW9uOiBcIumgkOe0hOacjeWLmVwiLFxuXHRcdGljb25Qcm9ibGVtOiBcIuW4uOimi+WVj+mhjFwiLFxuXHRcdGljb25Qcm9jZXNzOiBcIuaKleS/nea1geeoi1wiLFxuXHRcdGljb25Qcm9kdWN0OiBcIueUouWTgeips+aDhVwiXG5cdH0sXG5cdGN1c3RvbVByb2R1Y3Q6IHtcblx0XHRtZW51MTogXCLoga/nuavmiJHlgJFcIixcblx0XHRtZW51MjogXCLnubPku5jkv53osrtcIixcblx0XHRtZW51MzogXCLkv53llq7mn6XoqaJcIixcblx0XHRtZW51NDogXCLkv53llq7orormm7RcIixcblx0XHRtZW51NTogXCLnkIbos6DnlLPoq4tcIixcblx0XHRtZW51NjogXCLpoJDntITmnI3li5lcIixcblx0XHRtZW51NzogXCLmipXoqLTlj5fnkIZcIixcblx0XHRtZW51ODogXCLluLjnlKjooajmoLxcIixcblx0fSxcblx0Y29tbW9uRm9ybToge1xuXHRcdGhlYWQxOiBcIuihqOagvOmhnuWei1wiLFxuXHRcdGhlYWQyOiBcIuihqOagvOWQjeeosVwiLFxuXHRcdGhlYWQzOiBcIuS9v+eUqOiqquaYjlwiLFxuXHRcdGhlYWQ0OiBcIumZhOS7tlwiLFxuXHRcdGRvd25sb2FkOiBcIuS4i+i8ieaWh+aqlFwiLFxuXHRcdGZvcm06IFt7XG5cdFx0XHRcdHR5cGU6IFwi57mz6LK76aGeXCIsXG5cdFx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIuOAjOmbu+WtkOWFpeizrOacjeWLmeOAjeWPiumKgOihjOaItuWPozxicj7nm7TmjqXku5jmrL7mjojmrIrnlLPoq4tcIixcblx0XHRcdFx0XHRcdGRlc2M6IFwi55Sz6KuL6Kit56uL44CMIOmbu+WtkOWFpeizrOacjeWLmeOAjSDlj4rpioDooYzmiLblj6M8YnI+55u05o6l5LuY5qy+5o6I5qyK5pmC6aCI5o+Q5L6bXCIsXG5cdFx0XHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5L+h55So5Y2h5oi25Y+j55u05o6l5LuY5qy+5o6I5qyK5pu4XCIsXG5cdFx0XHRcdFx0XHRkZXNjOiBcIueUs+iri+S/oeeUqOWNoeaItuWPo+ebtOaOpeS7mOasvuaOiOasiuaZgumgiOaPkOS+m1wiLFxuXHRcdFx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiBcIuS/neWWruiuiuabtOmhnlwiLFxuXHRcdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRcdFx0bmFtZTogXCLkv53pmqrlkIjlkIzop6PpmaTnlLPoq4vmm7hcIixcblx0XHRcdFx0XHRcdGRlc2M6IFwi6YCA5L+d44CB5Ya36Z2c5pyf6YCA5L+d5qWt5YuZ6YGp55SoXCIsXG5cdFx0XHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5L+d6Zqq5ZCI5ZCM6K6K5pu055Sz6KuL5pu477yIIOS/neWWruiyuOasvumChOasvumhnu+8iVwiLFxuXHRcdFx0XHRcdFx0ZGVzYzogXCLkv53llq7osrjmrL7jgIHpgoTmrL7mpa3li5npgannlKhcIixcblx0XHRcdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLkv53pmqrlkIjlkIzorormm7TnlLPoq4vmm7jvvIgg5L+d6Zqq5ZCI5ZCM6KiI5YqD6K6K5pu06aGe77yJXCIsXG5cdFx0XHRcdFx0XHRkZXNjOiBcIuWKoOS/neOAgea4m+S/neOAgeaWsOWinumZhOmaquOAgeW+qeaViOetiealreWLmemBqeeUqFwiLFxuXHRcdFx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIuS/nemaquWQiOWQjOiuiuabtOeUs+iri+abuO+8iCDlrqLmiLbkv6Hmga/orormm7TpoZ7vvIlcIixcblx0XHRcdFx0XHRcdGRlc2M6IFwi5Z+65pys6LOH6KiK6K6K5pu05qWt5YuZ6YGp55SoXCIsXG5cdFx0XHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5L+d6Zqq5ZCI5ZCM6K6K5pu055Sz6KuL5pu477yIIOWuouaItuasiuebiuiuiuabtOmhnu+8iVwiLFxuXHRcdFx0XHRcdFx0ZGVzYzogXCLkuqTosrvmlrnlvI/jgIHoh6rloorpgbjmk4fmrIrorormm7TjgIHoo5znmbznrYnmpa3li5npgannlKhcIixcblx0XHRcdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLmjojmrIrlp5TmiZjmm7hcIixcblx0XHRcdFx0XHRcdGRlc2M6IFwi5aeU5omY5LuW5Lq65Luj6L6m5pmC6aCI5o+Q5L6bXCIsXG5cdFx0XHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi56iF5pS26IGy5piOXCIsXG5cdFx0XHRcdFx0XHRkZXNjOiBcIkNSU+imgeaxglwiLFxuXHRcdFx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIuWBpeW6t+WRiuefpVwiLFxuXHRcdFx0XHRcdFx0ZGVzYzogXCLpoIjkuozmrKHmoLjkv53nmoTmpa3li5npoIjmj5DkvptcIixcblx0XHRcdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogXCLnkIbos6DpoZ5cIixcblx0XHRcdFx0bGlzdDogW3tcblx0XHRcdFx0XHRuYW1lOiBcIueQhuizoOeUs+iri+abuFwiLFxuXHRcdFx0XHRcdGRlc2M6IFwi57SZ6LOq55Sz6KuL55qE5oeJ5YKZ5paH5Lu2XCIsXG5cdFx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHRcdH1dXG5cdFx0XHR9LFxuXHRcdF1cblx0fSxcblx0cG9saWN5Q2hhbmdlR3VpZGU6IHtcblx0XHRub3RpY2U6IFwi5aaC6ZyA5YGa5YW25LuW5L+d5Zau6K6K5pu0XCIsXG5cdFx0bm90aWNlTGluazogXCLoga/nuavlrqLmnI1cIixcblx0XHRoZWFkMTogXCLpoIXnm65cIixcblx0XHRoZWFkMjogXCLlhbfpq5TlhaflrrlcIixcblx0XHRoZWFkMzogXCLnlLPoq4vos4fmoLzkurpcIixcblx0XHRoZWFkNDogXCLlj5fnkIbmmYLplpNcIixcblx0XHRoZWFkNTogXCLmh4nlgpnmnZDmlplcIixcblx0XHRkb3dubG9hZDogXCLkuIvovInmlofmqpRcIixcblx0XHRmb3JtOiBbe1xuXHRcdFx0XHRwcm9qZWN0OiBcIumAgOS/nVwiLFxuXHRcdFx0XHRjb250ZW50OiBcIuWcqOWGt+mdnOacn+W+jOino+mZpOWQiOWQjO+8jOWFrOWPuOWwh+mAgOmChOS/neWWruePvumHkeWDueWAvOaIluacqua7v+acn+WHiOS/neiyu+OAgu+8iOW+heeUouWTgeeyvueul+eiuuiqje+8iVwiLFxuXHRcdFx0XHRhcHBsaWNhbnQ6IFwi5oqV5L+d5Lq6XCIsXG5cdFx0XHRcdHJlY2VwdGlvblRpbWU6IFwi5L+d5Zau5pWI5Yqb57WC5q2i5YmNXCIsXG5cdFx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0XHRcdG5hbWU6IFwi5L+d6Zqq5ZauXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIueUs+iri+abuFwiLFxuXHRcdFx0XHRcdFx0dHlwZTogMSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5oqV5L+d5Lq65pyJ5pWI6Lqr5Lu96K2J5Lu2XCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIuWtmOaKmOmTtuihjOWNoeebuOWFs1wiLFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHByb2plY3Q6IFwi5Ya36Z2c5pyf6YCA5L+dXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFwi5Zyo5Ya36Z2c5pyf5YWn5o+Q5Ye66Kej6Zmk5ZCI5ZCM77yM5YWs5Y+45pyD54Sh5oGv6YCA6YKE5YWo6YOo5L+d6LK7XCIsXG5cdFx0XHRcdGFwcGxpY2FudDogXCLmipXkv53kurpcIixcblx0XHRcdFx0cmVjZXB0aW9uVGltZTogXCLlhrfpnZzmnJ/ntZDmnZ/liY1cIixcblx0XHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRcdFx0bmFtZTogXCLkv53pmqrllq5cIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi55Sz6KuL5pu4XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLmipXkv53kurrmnInmlYjouqvku73orYnku7ZcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5a2Y5oqY6ZO26KGM5Y2h55u45YWzXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIummluacn+S/neiyu+eZvOelqFwiLFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHByb2plY3Q6IFwi5a6i5oi26LOH5paZ6K6K5pu0XCIsXG5cdFx0XHRcdHByb2plY3RUeXBlOiAxLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZVwiLFxuXHRcdFx0XHRxdWVyeToge1xuXHRcdFx0XHRcdHE6IFwibTQyXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0Y29udGVudDogXCLmipXkv53kurrjgIHlj5fkv53kurrjgIHlj5fnm4rkurrnmoTlgIvkurrkv6Hmga/orormm7RcIixcblx0XHRcdFx0YXBwbGljYW50OiBcIuaKleS/neS6ulwiLFxuXHRcdFx0XHRyZWNlcHRpb25UaW1lOiBcIuS4jemZkFwiLFxuXHRcdFx0XHRtYXRlcmlhbExpc3Q6IFt7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIueUs+iri+abuFwiLFxuXHRcdFx0XHRcdFx0dHlwZTogMSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwi5b+F6KaB55qE6K2J5piO5p2Q5paZXCIsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cHJvamVjdDogXCLoga/ns7vmlrnlvI/orormm7RcIixcblx0XHRcdFx0cHJvamVjdFR5cGU6IDEsXG5cdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlXCIsXG5cdFx0XHRcdHF1ZXJ5OiB7XG5cdFx0XHRcdFx0cTogXCJtNDNcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb250ZW50OiBcIuWcsOWdgOOAgembu+ipseetieS/oeaBr+eahOiuiuabtFwiLFxuXHRcdFx0XHRhcHBsaWNhbnQ6IFwi5oqV5L+d5Lq6XCIsXG5cdFx0XHRcdHJlY2VwdGlvblRpbWU6IFwi5LiN6ZmQXCIsXG5cdFx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0XHRcdG5hbWU6IFwi55Sz6KuL5pu4XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLmipXkv53kurrmnInmlYjouqvku73orYnku7ZcIixcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0sXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwcm9qZWN0OiBcIuS6pOiyu+aWueW8j+iuiuabtFwiLFxuXHRcdFx0XHRjb250ZW50OiBcIuabtOaUueS/neWWrueahOe6jOacn+S6pOiyu+aWueW8j+aIluS6pOiyu+izrOiZn1wiLFxuXHRcdFx0XHRhcHBsaWNhbnQ6IFwi5oqV5L+d5Lq6XCIsXG5cdFx0XHRcdHJlY2VwdGlvblRpbWU6IFwi5L+d5Zau5Lqk6LK75pyf5ru/5YmNXCIsXG5cdFx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0XHRcdG5hbWU6IFwi55Sz6KuL5pu4XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCLkv53pmqrllq5cIixcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0sXG5cdFx0XHR9LFxuXHRcdF1cblx0fSxcblx0cG9saWN5Q2hhbmdlQ29udGFjdDoge1xuXHRcdHBob25lOiBcIuiBr+e5q+mbu+ipsVwiLFxuXHRcdGFkZHJlc3M6IFwi6IGv57mr5Zyw5Z2AXCIsXG5cdFx0ZW1haWw6IFwiRS1NYWlsXCIsXG5cdFx0Y2hlY2tUaXBzOiBcIuacrOS6uuS4jeWQjOaEj+aOpeaUtuWuo+WCs+S/oeaBr1wiLFxuXHRcdHN1Ym1pdDogXCLnorroqo3kv67mlLlcIixcblx0XHRlcnJvclRpcHM6IHtcblx0XHRcdGUxOiBcIuiri+Whq+Wvq+ato+eiuueahOiBr+e5q+mbu+ipsVwiLFxuXHRcdFx0ZTI6IFwi6KuL5aGr5a+r6IGv57mr5Zyw5Z2AXCIsXG5cdFx0XHRlMzogXCLoq4vloavlr6vmraPnorrnmoRFLU1haWzlnLDlnYBcIlxuXHRcdH0sXG5cdFx0c3VjY2VzcyA6IFwi5pu05paw5oiQ5YqfXCIsXG5cdH0sXG5cdHBvbGljeUNoYW5nZUluZm9ybWF0aW9uOiB7XG5cdFx0dGl0bGUgOiBcIuWuouaItuizh+aWmeiuiuabtFwiLFxuXHRcdG93bmVyOiBcIuaKleS/neS6ulwiLFxuXHRcdGluc3VyZWQ6IFwi5Y+X5L+d5Lq6XCIsXG5cdFx0b2JqOiBcIuiuiuabtOWwjeixoVwiLFxuXHRcdG5hbWU6IFwi5aeT5ZCNXCIsXG5cdFx0c2V4OiBcIuaAp+WIq1wiLFxuXHRcdGJpcnRoOiBcIuWHuueUn+aXpeacn1wiLFxuXHRcdHR5cGU6IFwi6K2J5Lu26aGe5Z6LXCIsXG5cdFx0Tk86IFwi6K2J5Lu26Jmf56K8XCIsXG5cdFx0dmFsaWRpdHlQZXJpb2Q6IFwi6K2J5Lu25pyJ5pWI5pyfXCIsXG5cdFx0bmF0aW9uYWxpdHk6IFwi5ZyL57GNXCIsXG5cdFx0ZW1wbG95ZXI6IFwi5bel5L2c5Zau5L2NXCIsXG5cdFx0bWFyaXRhbFN0YXR1czogXCLlqZrlp7vni4Dms4FcIixcblx0XHRzdWJtaXQ6IFwi56K66KqN5L+u5pS5XCIsXG5cdFx0dXBsb2FkOiBcIumZhOS7tuS4iuWCs1wiLFxuXHRcdG1vZGlmeVRpcHMxOiBcIuWmgumcgOS/ruaUueiri1wiLFxuXHRcdG1vZGlmeVRpcHMyOiBcIuiBr+e5q+WuouacjVwiLFxuXHRcdHN1Y2Nlc3MgOiBcIuabtOaWsOaIkOWKn1wiLFxuXHR9LFxuXHRjb250YWN0VXM6IHtcblx0XHRzZXJ2aWNlOiB7XG5cdFx0XHRjZW50ZXI6IHtcblx0XHRcdFx0dGl0bGU6IFwi5a6i5oi25pyN5YuZ5Lit5b+DXCIsXG5cdFx0XHRcdGFkZHJlc3M6IFwi5Zyw5Z2A77ya6aaZ5riv5bCW5rKZ5Zi05riv5aiB5rC46YeR6J6N5aSn5qiTXCIsXG5cdFx0XHRcdHRpbWU6IFwi5pyN5YuZ5pmC6ZaT77ya5pif5pyf5aO56Iez5LqUOTowMC0xODowMFwiLFxuXHRcdFx0fSxcblx0XHRcdGhvdGxpbmU6IHtcblx0XHRcdFx0dGl0bGU6IFwi5a6i5oi25pyN5YuZ54ax57eaXCIsXG5cdFx0XHRcdGhrOiBcIummmea4r+iZn+eivO+8mig4NTIpMjk4MyA4ODY2XCIsXG5cdFx0XHRcdGNuOiBcIuWFp+WcsOiZn+eivO+8mig4Nik0MDA3OCA5NTUxMVwiLFxuXHRcdFx0XHR0aW1lOiBcIuacjeWLmeaZgumWk++8muaYn+acn+WjueiHs+S6lDk6MDAtMTg6MDBcIlxuXHRcdFx0fSxcblx0XHRcdG1haWw6IHtcblx0XHRcdFx0dGl0bGU6IFwi5a6i5oi25pyN5YuZ6Zu76YO1XCIsXG5cdFx0XHRcdG1haWw6IFwiY3NAcGluZ2FuLmNvbS5oa1wiXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRwdWxiaWM6IHtcblx0XHRcdHRpdGxlOiBcIuW+ruS/oeWFrOecvuiZn1wiLFxuXHRcdFx0bTE6IFwi55m76Zm444CM5b6u5L+h44CNQVBQ77yMIOaMieWPs+S4iuinkueahOOAjCvjgI3mjInpiJXkuKbpgbjmk4fjgIzmt7vliqDmnIvlj4vjgI3vvIzpgbjmk4fjgIzlhaznnL7omZ/jgI0g6Ly45YWl5Lim5pCc57Si44CM5bmz5a6J5Lq65aO96aaZ5riv44CNXCIsXG5cdFx0XHRtMjogXCLnmbvpmbjjgIzlvq7kv6HjgI1BUFDvvIwg5oyJ5Y+z5LiK6KeS55qE44CMK+OAjeaMiemIleS4pumBuOaTh+OAjOaOg+WjueaOg+OAjeaOg+aPj+S4i+aWueS6jOe2reeivO+8iOaUvue9ruS6jOe2reeivO+8iVwiXG5cdFx0fSxcblx0XHRxcmNvZGU6IHtcblx0XHRcdHRpdGxlOiBcIuWumOaWueWFrOecvuiZn1wiXG5cdFx0fVxuXHR9LFxuXHRjdXN0b21TZXJ2aWNlOiB7XG5cdFx0bmFtZTogXCLlrqLmiLbmnI3li5lcIixcblx0XHRtZW51MTogXCLoga/nuavmiJHlgJFcIixcblx0XHRtZW51MjogXCLnubPku5jkv53osrtcIixcblx0XHRtZW51MzogXCLkv53llq7mn6XoqaJcIixcblx0XHRtZW51NDogXCLkv53llq7orormm7RcIixcblx0XHRtZW51NDE6IFwi5L+d5Zau6K6K5pu05oyH5byVXCIsXG5cdFx0bWVudTQyOiBcIuiBr+ezu+aWueW8j+iuiuabtFwiLFxuXHRcdG1lbnU0MzogXCLlrqLmiLbos4fmlpnorormm7RcIixcblx0XHRtZW51NTogXCLnkIbos6DnlLPoq4tcIixcblx0XHRtZW51NjogXCLpoJDntITmnI3li5lcIixcblx0XHRtZW51NzogXCLmipXoqLTlj5fnkIZcIixcblx0XHRtZW51ODogXCLluLjnlKjooajmoLxcIixcblx0XHRpbnN1cmFuY2VRdWVyeToge1xuXHRcdFx0bW9kaWZ5IDogXCLkv67mlLlcIixcblxuXHRcdFx0SW5zdXJhbnROdW1iZXI6IFwi5L+d5Zau6Jmf56K8XCIsXG5cdFx0XHRJbnN1cmFudDogXCLlj5fkv53kurpcIixcblx0XHRcdEluc3VyYW50TmFtZTogXCLpmqrnqK7lkI3nqLFcIixcblx0XHRcdEluc3VyYW50QW1vdW50OiBcIuS/nemhjVwiLFxuXHRcdFx0ZWZmZWN0aXZlRGF0ZTogXCLkv53osrvliLDmnJ/ml6VcIixcblx0XHRcdHBlcmlvZDogXCLkv53pmpzlubTmnJ9cIixcblxuXHRcdFx0dDJUaXRsZTogXCLkv53llq7kv6Hmga9cIixcblx0XHRcdHQybjE6IFwi6Zqq56iu5ZCN56ixXCIsXG5cdFx0XHR0Mm4yOiBcIuS/nemhjVwiLFxuXHRcdFx0dDJuMzogXCLnlJ/mlYjml6XmnJ9cIixcblx0XHRcdHQybjQ6IFwi5L+d6Zqc5bm05pyfXCIsXG5cdFx0XHR0Mm41OiBcIuWPl+S/neS6uuWnk+WQje+8iOS4reaWh++8iVwiLFxuXHRcdFx0dDJuNjogXCLlj5fkv53kurrlp5PlkI3vvIjoi7HmlofvvIlcIixcblx0XHRcdHQybjc6IFwi5Ye655Sf5pel5pyfXCIsXG5cdFx0XHR0Mm44OiBcIuitieS7tuiZn+eivFwiLFxuXG5cblx0XHRcdHQzVGl0bGU6IFwi5a6i5oi26LOH5paZXCIsXG5cdFx0XHR0M24xOiBcIuaKleS/neS6uuWnk+WQje+8iOS4reaWh++8iVwiLFxuXHRcdFx0dDNuMjogXCLmipXkv53kurrlp5PlkI3vvIjoi7HmlofvvIlcIixcblx0XHRcdHQzbjM6IFwi5Ye655Sf5pel5pyfXCIsXG5cdFx0XHR0M240OiBcIuitieS7tuiZn+eivFwiLFxuXHRcdFx0dDNuNTogXCLoga/nuavlnLDlnYBcIixcblx0XHRcdHQzbjY6IFwi5bGF5L2P5Zyw5Z2AXCIsXG5cdFx0XHR0M243OiBcIuaJi+aPkOmbu+ipsVwiLFxuXHRcdFx0dDNuODogXCLpm7vlrZDpg7XnrrFcIixcblxuXHRcdFx0dDRUaXRsZTogXCLlj5fnm4rkurros4fmlplcIiwgLy8gdDRCZW5lZmljaWFyeUluZm9ybWF0aW9uXG5cdFx0XHR0NE5hbWVDbjogXCLlp5PlkI3vvIjkuK3mlofvvIlcIixcblx0XHRcdHQ0TmFtZUVuOiBcIuWnk+WQje+8iOiLseaWh++8iVwiLFxuXHRcdFx0dDRSZWxhdGlvbjogXCLoiIflj5fkv53kurrpl5zkv4JcIixcblx0XHRcdHQ0QWxsb2NhdGlvbjogXCLliIbphY3mr5TkvotcIixcblxuXHRcdFx0dDVUaXRsZTogXCLnubPosrvos4fmlplcIixcblx0XHRcdHQ1UGF5bWVudFBlcmlvZDogXCLnuozosrvlubTmnJ9cIixcblx0XHRcdHQ1UGF5bWVudE1ldGhvZDogXCLnubPosrvmlrnlvI9cIixcblx0XHRcdHQ1UGF5bWVudEN1cnJlbmN5OiBcIue5s+iyu+W5o+eorlwiLFxuXHRcdFx0dDVDdXJyZW50UHJlbWl1bTogXCLnlbbmnJ/kv53osrtcIixcblx0XHRcdHQ1UGF5bWVudEJhbms6IFwi57mz6LK76YqA6KGMXCIsXG5cdFx0XHR0NVBheW1lbnRBY2NvdW50OiBcIue5s+iyu+W4s+iZn1wiLFxuXG5cdFx0XHR0NlRpdGxlOiBcIue5s+iyu+iomOmMhFwiLFxuXHRcdFx0dDZQYXltZW50UGVyaW9kOiBcIue5s+iyu+acn1wiLFxuXHRcdFx0dDZQYXltZW50TWV0aG9kOiBcIue5s+iyu+aWueW8j1wiLFxuXHRcdFx0dDZDbG9zaW5nRGF0ZTogXCLlr6bmlLbml6XmnJ9cIixcblx0XHRcdHQ2UGF5bWVudEFtb3VudDogXCLnubPosrvph5HpoY1cIixcblxuXHRcdFx0c2hvd01vcmUgOiBcIumhr+ekuuaJgOacieS/neWWrlwiLFxuXHRcdFx0bm9Qb2xpY3k6IFwi5oKo6YKE5pyq6LO86LK35L+d5Zau77yM5aaC5pyJ55aR5ZWP6KuLXCIsXG5cdFx0XHRjdXN0b21TZXJ2aWNlIDogXCLoga/nuavlrqLmnI1cIixcblx0XHR9LFxuXHRcdHVuYXV0aDoge1xuXHRcdFx0dGlwczogXCLlpoLmgqjmnInlubPlronkuIDos6zpgJros6zmiLbvvIzlj6/luavliqnmiJHlgJHmm7Tlpb3lnLDngrrmgqjmj5DkvpvmnI3li5lcIixcblx0XHRcdG9yOiBcIuaIllwiLFxuXHRcdFx0bG9naW46IFwi55m76YyEXCIsXG5cdFx0XHRyZWdpc3RlcjogXCLoqLvlhopcIixcblx0XHRcdGJhc2VJbmZvVGlwIDogXCLmgqjnmoTlrozmlbTkv6Hmga/lj6/luavliqnmiJHlgJHngrrkvaDmj5DkvpvlrozmlbTmnI3li5lcIixcblx0XHRcdGluZm9CdG4gOiBcIuWJjeW+gOWujOWWhFwiXG5cdFx0fVxuXHR9LFxuXHRwYWdpbmF0aW9uOiB7XG5cdFx0Zmlyc3RQYWdlOiBcIuesrOS4gOmggVwiLFxuXHRcdG5leHRQYWdlOiBcIuS4i+S4gOmggVwiLFxuXHRcdGdvdG86IFwi6Lez6L2JXCIsXG5cdFx0cGVyOiBcIuesrFwiLFxuXHRcdHBhZ2U6IFwi6aCBXCJcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUpBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBMUJBO0FBa0NBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBRkE7QUFSQTtBQWNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQXBDQTtBQTJDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFsQkE7QUF3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBUEE7QUFsSEE7QUFpSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQTtBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQW5CQTtBQWdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQTFCQTtBQXlDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUExQkE7QUFtQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUE3QkE7QUFrQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFuREE7QUE2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQWJBO0FBSEE7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBakJBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUF0QkE7QUEyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQVBBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFyQ0E7QUE2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBRkE7QUFoRUE7QUEwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFJQTtBQURBO0FBZkE7QUFxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBSUE7QUFEQTtBQUlBO0FBREE7QUFsQkE7QUF3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBZEE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBZEE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFUQTtBQTFGQTtBQTBHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFYQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbEJBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBRkE7QUFaQTtBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQURBO0FBdkJBO0FBMkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQXJEQTtBQXVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBcEVBO0FBNkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBMXZCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/common/lang/tc.js\n");

/***/ }),

/***/ "./src/common/lang/zh.js":
/*!*******************************!*\
  !*** ./src/common/lang/zh.js ***!
  \*******************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("module.exports = {\n  message: {\n    login: '登录',\n    Username: '用户名',\n    Password: '密码',\n    Captcha: '验证码',\n    Language: '语言',\n    zh: '中文',\n    en: '英文'\n  },\n  glbalTips: {\n    sessionLost: \"为了更好的体验,需要您登录后再进行此操作\"\n  },\n  form: {\n    datePicker: {\n      datePlaceholder: \"请选择日期\"\n    },\n    modalUploadCard: {\n      tit: \"请上传证件资料\",\n      front: \"证件正面\",\n      back: \"证件反面\"\n    }\n  },\n  nav: {\n    loginData: {\n      name: \"登陆\",\n      path: \"\",\n      list: [{\n        name: \"注册\",\n        path: \"/register\",\n        type: \"noAuth\",\n        value: \"\"\n      }, {\n        name: \"登陆\",\n        path: \"/login\",\n        type: \"noAuth\",\n        value: \"\"\n      }, {\n        name: \"修改密码\",\n        path: \"/password/reset\",\n        type: \"auth\",\n        value: \"\"\n      }, {\n        name: \"个人信息\",\n        path: \"/infomation/improve\",\n        type: \"auth\",\n        value: \"\"\n      }, {\n        name: \"登出\",\n        path: \"\",\n        type: \"auth\",\n        value: \"logout\"\n      }]\n    },\n    navList: [{\n      name: \"产品介绍\",\n      path: \"\",\n      list: [{\n        name: \"自愿医保基本计划\",\n        path: \"\",\n        value: \"gotoVHIS\"\n      }, {\n        name: \"分红终身寿险\",\n        path: \"/product\"\n      }]\n    }, {\n      name: \"客户服务\",\n      path: \"\",\n      list: [{\n        name: \"客户服务导航\",\n        path: \"/custom/product\"\n      }, {\n        name: \"联系我们\",\n        path: \"/custom/service?q=m1\"\n      }, {\n        name: \"缴付保费\",\n        path: \"/custom/service?q=m2\"\n      }, {\n        name: \"保单查询\",\n        path: \"/custom/service?q=m3\"\n      }, {\n        name: \"保单变更\",\n        path: \"/custom/service?q=m41\"\n      }, {\n        name: \"理赔申请\",\n        path: \"/custom/service?q=m5\"\n      }, {\n        name: \"预约服务\",\n        path: \"/custom/service?q=m6\"\n      }, {\n        name: \"投诉受理\",\n        path: \"/custom/service?q=m7\"\n      }, {\n        name: \"常用表格\",\n        path: \"/custom/service?q=m8\"\n      }]\n    }, {\n      name: \"关于我们\",\n      path: \"\",\n      list: [{\n        name: \"平安人寿香港\",\n        path: \"/profile\"\n      }, {\n        name: \"公司活动\",\n        path: \"/empty\"\n      }, {\n        name: \"新闻中心\",\n        path: \"/news/list\"\n      }, {\n        name: \"企业社会责任\",\n        path: \"/empty\"\n      }, {\n        name: \"奖项殊荣\",\n        path: \"/empty\"\n      }]\n    }, {\n      name: \"加入我们\",\n      path: \"\",\n      list: [{\n        name: \"企业文化\",\n        path: \"/empty\"\n      }, {\n        name: \"事业发展机会\",\n        path: \"/empty\"\n      }]\n    }]\n  },\n  footer: {\n    hkPhone: \"香港号码\",\n    cnPhone: \"内地号码\",\n    aboutUs: \"关于我们\",\n    companyIntroduction: \"集团介绍\",\n    news: \"新闻资讯\",\n    joinUs: \"加入我们\",\n    helpCenter: \"帮助中心\",\n    privacy: \"隐私政策\",\n    terms: \"使用条款\",\n    protocol: \"个人资料收集声明\",\n    map: \"网站地图\",\n    contactUs: \"联络我们\",\n    contactInformation: \"联系方式\",\n    service: \"服务网络\",\n    qrcode: \"社交媒體\",\n    copyright: \"版权所有 © 中国平安保险(集团)股份有限公司未经许可不得复制、转载或摘编,违者必究!\"\n  },\n  login: {\n    title: \"平安一账通\",\n    loginType1: \"账密登录\",\n    loginType2: \"动态密码登录\",\n    account: \"账号\",\n    accountPlaceholder: \"请输入证件号/一账通用户名/手机号\",\n    password: \"密码\",\n    passwordPlaceholder: \"输入登录密码\",\n    verifyPlaceholder: \"请输入验证码\",\n    agree: \"同意\",\n    protocol: \"《平安一账通会员服务协议》\",\n    login: \"登入\",\n    register: \"注册\",\n    forget: \"忘记密码\",\n    mobile: \"手机号\",\n    mobilePlaceholder: \"手机号\",\n    verifyCode: \"验证码\",\n    verifyCodePlaceholder: \"验证码\",\n    verifyCodeGet: \"获取验证码\",\n    tips: {\n      e1: \"请输入账号信息\",\n      e2: \"请输入密码\",\n      e3: \"请输入图像验证码\",\n      e4: \"请同意《平安一账通会员服务协议》\",\n      e5: \"账号或密码不正确\",\n      oe0: \"请输入正确的手机号\",\n      oe1: \"请先获取短信验证码\",\n      oe2: \"请输入图片验证码\",\n      oe3: \"请输入短信验证码\",\n      oe4: \"短信验证码不正确\"\n    }\n  },\n  session: {\n    sidExpire: \"长时间未操作,为了您的账户安全,请登录后再操作\"\n  },\n  register: {\n    mobileOptions: [{\n      type: \"hk\",\n      name: \"香港手机号\",\n      placeHolder: \"请输入8位手机号码\",\n      areaCode: \"+852\"\n    }, {\n      type: \"zh\",\n      name: \"大陆手机号\",\n      placeHolder: \"请输入11位手机号码\",\n      areaCode: \"+86\"\n    }],\n    coutTips: \"{second}秒后重新获取\",\n    title: \"欢迎注册\",\n    title2: \"请设置新的密码\",\n    mobilePlaceholder: \"请输入8位手机号码\",\n    verifyCodePlaceholder: \"请输入验证码\",\n    verifyCodeGet: \"获取验证码\",\n    agree: \"同意\",\n    protocol: \"《平安一账通会员服务协议》\",\n    register: \"点击注册\",\n    newPassword: \"新密码\",\n    newPasswordPlaceholder: \"输入登录密码\",\n    newPasswordSure: \"确认密码\",\n    newPasswordSurePlaceholder: \"输入登录密码\",\n    sure: \"确认\",\n    tips: {\n      e1: \"手机号不正确,请输入正确的手机号\",\n      e2: \"请同意《平安一账通会员服务协议》\",\n      e3: \"短信验证码不正确\",\n      e4: \"请先获取短信验证码\",\n      e5: \"手机号已经被注册,请使用其他手机号注册或直接登录\",\n      e6: \"请输入图片验证码\",\n      e7: \"密码长度不能少于8位\",\n      e8: \"密码必须同时包含数字、字母、特殊字符\",\n      e9: \"两次输入的密码不一致\",\n      e10: \"验证码过期,请重新申请验证码\",\n      e11: \"注册失败,请联系工作人员\",\n      e12: \"註冊成功\"\n    }\n  },\n  passwordCheck: {\n    error1: \"密码长度不少于8位\",\n    error2: \"密码中必须包含数字、字符以及特殊号码\",\n    error3: \"两次密码不一致,请确认后重新输入\",\n    error4: \"密码修改失败,请稍后再试,或拨打客服电话95511解决\",\n    error5: \"旧密码不正确,请重新输入\",\n    success: \"密码修改成功\"\n  },\n  passwordReset: {\n    oldPwd: \"旧密码\",\n    oldPwdPlaceholde: \"请输入旧密码\",\n    cidExpire: \"长时间未操作,为了您的账户安全,请重新开始\",\n    type1: {\n      title: \"密码找回\",\n      t1: \"用户输入信息\",\n      t1Placeholder: \"手机号/证件号\",\n      submit: \"确认\",\n      error: \"您的手机号或证件号输入错误,请核对后重新输入\"\n    },\n    type2: {\n      title: \"密码找回\",\n      t1: \"手机短信验证码\",\n      t1Placeholder: \"请输入验证码\",\n      submit: \"确认\",\n      error1: \"短信验证码输入错误,请核对后重新输入\",\n      error2: \"短信验证码已经过期,请重新获取验证码\",\n      error3: \"短信验证码发放时间少于1分钟,请稍后再试\"\n    },\n    type3: {\n      title: \"密码找回\",\n      t1: \"核对身份证信息\",\n      t1Placeholder: \"\",\n      submit: \"确认\"\n    },\n    type4: {\n      title: \"请设置新的密码\",\n      t1: \"新密码\",\n      t1Placeholder: \"请输入新密码\",\n      t2: \"确认密码\",\n      t2Placeholder: \"请重新输入新密码\",\n      submit: \"确认\"\n    }\n  },\n  infomationImprove: {\n    title: \"请完善您的信息\",\n    t1: \"姓名\",\n    t1c1: \"姓\",\n    t1c2: \"名\",\n    t1Placeholder: \"\",\n    t2: \"性别\",\n    t2Placeholder: \"\",\n    t3: \"出生日期\",\n    t3Placeholder: \"\",\n    t4: \"证件类型\",\n    t4Placeholder: \"\",\n    t5: \"证件号码\",\n    t5Placeholder: \"\",\n    submit: \"确认\",\n    cancel: \"跳过\",\n    candidates: {\n      sex: [{\n        name: \"男\",\n        value: \"M\"\n      }, {\n        name: \"女\",\n        value: \"F\"\n      }],\n      idType: [{\n        name: \"身份证\",\n        value: \"1\"\n      }, {\n        name: \"护照\",\n        value: \"2\"\n      }, {\n        name: \"军官证或士兵证\",\n        value: \"3\"\n      }, {\n        name: \"港澳通行证/回乡证或台胞证\",\n        value: \"6\"\n      }, {\n        name: \"外国人永久居留身份证\",\n        value: \"O\"\n      }, {\n        name: \"港澳居民居住证\",\n        value: \"V\"\n      }, {\n        name: \"台湾居民居住证\",\n        value: \"W\"\n      }, {\n        name: \"其他\",\n        value: \"0\"\n      }]\n    },\n    successMsg: \"更新成功\",\n    errorTips: {\n      e1: \"请填写姓名信息\",\n      e2: \"请选择性别\",\n      e3: \"请选择生日\",\n      e4: \"请选择证件类型\",\n      e5: \"请填写证件号码\",\n      e6: \"您填写的证件号码有误\",\n      e7: \"您填写的信息有误,请核实后重新提交\"\n    }\n  },\n  index: {\n    news: \"新闻资讯\",\n    newMore: \"查看更多\",\n    recommend: {\n      t1: \"在线报价\",\n      t2: \"客户服务\",\n      t3: \"产品介绍\",\n      t4: \"最新消息\",\n      item1: {\n        btn: \"了解更多产品\",\n        t1: \"为自己和家人寻找一份保障\"\n      },\n      item2: {\n        btn: \"立即预约\",\n        t1: \"在线预约 专业服务\"\n      },\n      item3: {\n        btn: \"客户服务\",\n        t1: \"专业客服为你服务\",\n        t2: \"想了解更多,可致电\",\n        t3: \"95511\",\n        t4: \"联络我们,或进入\"\n      }\n    }\n  },\n  complaintAcceptance: {\n    name: \"姓名\",\n    namePlaceholder: \"姓名\",\n    contactType: \"联络方式\",\n    email: \"电邮地址\",\n    question: \"问题或意见\",\n    questionPlaceHolder: \"(字数不超过500字)\",\n    orderNo: \"保单编号\",\n    orderNoPlaceHolder: \"如您为平安客户,请提供保单编号\",\n    contactTime: \"期望联络时间\",\n    notice1: \"本表格所收集的个人资料根据「平安人寿香港个人资料收集声明」处理及只会被用作于联络 阁下之用。然而所收集的个人资料未经您明确授权将不会转移至「平安人寿香港个人资料收集声明」列明以外之第三者机构。您可选择不向我们提供所需的个人资料,惟这样可能导致我们不能联络您。您亦可根据「平安人寿香港个人资料收集声明」之权利查阅及更正个人资料。\",\n    notice2: \"本人现确认明白并同意本人的个人资料根据中银人寿个人资料收集声明作以上述用途。\",\n    contactTypes: [{\n      name: '电话',\n      value: 1\n    }, {\n      name: '电邮',\n      value: 2\n    }],\n    errorTips: {\n      e1: \"请填写该项内容\",\n      e2: \"请填写正确的联系方式\"\n    },\n    success: \"感谢您的宝贵意见\"\n  },\n  reservation: {\n    name: \"姓名\",\n    namePlaceholder: \"姓名\",\n    contactType: \"联络方式\",\n    contactTypeCadidates: [{\n      name: \"电话\",\n      value: 1\n    }],\n    contact: \"联络电话\",\n    contactPlaceholder: \"香港号码/内地号码\",\n    reservationType: \"预约类型\",\n    reservationCandidates: [{\n      name: \"投保咨询\",\n      value: \"投保咨询\"\n    }, {\n      name: \"代办保单变更\",\n      value: \"代办保单变更\"\n    }],\n    reservationRemark: \"预约说明\",\n    reservationRemarkPlaceholder: \"请简单说明您想要咨询的产品或业务\",\n    hkClient: \"是否平安香港客户\",\n    yes: \"是\",\n    no: \"否\",\n    contactTime: \"期望联络时间\",\n    notice1: \"本表格所收集的个人资料根据「平安人寿香港个人资料收集声明」处理及只会被用作于联络 阁下之用。然而所收集的个人资料未经您明确授权将不会转移至「平安人寿香港个人资料收集声明」列明以外之第三者机构。您可选择不向我们提供所需的个人资料,惟这样可能导致我们不能联络您。您亦可根据「平安人寿香港个人资料收集声明」之权利查阅及更正个人资料。\",\n    notice2: \"本人现确认明白并同意本人的个人资料根据中银人寿个人资料收集声明作以上述用途。\",\n    success: \"提交成功\",\n    submitBtn: '确认',\n    errorTips: {\n      e1: \"请填写该项内容\",\n      e2: \"请填写正确的联系方式\"\n    }\n  },\n  paymentType: {\n    menu1: \"亲临客服中心付款\",\n    menu2: \"网银付款\",\n    menu3: \"电汇付款\",\n    menu4: \"柜员机付款\",\n    menu5: \"「缴费灵」付款\",\n    menu6: \"香港邮政局\"\n  },\n  product: {\n    btnPosition: \"预约服务\",\n    iconProblem: \"常见问题\",\n    iconProcess: \"投保流程\",\n    iconProduct: \"产品详情\"\n  },\n  customProduct: {\n    menu1: \"联系我们\",\n    menu2: \"缴付保费\",\n    menu3: \"保单查询\",\n    menu4: \"保单变更\",\n    menu5: \"理赔申请\",\n    menu6: \"预约服务\",\n    menu7: \"投诉受理\",\n    menu8: \"常用表格\"\n  },\n  commonForm: {\n    head1: \"表格类型\",\n    head2: \"表格名称\",\n    head3: \"使用说明\",\n    head4: \"附件\",\n    download: \"下载文档\",\n    form: [{\n      type: \"缴费类\",\n      list: [{\n        name: \"「电子入账服务」及银行户口<br>直接付款授权申请\",\n        desc: \"申请设立「电子入账服务」及银行户口<br>直接付款授权时须提供\",\n        download: \"\"\n      }, {\n        name: \"信用卡户口直接付款授权书\",\n        desc: \"申请信用卡户口直接付款授权时须提供\",\n        download: \"\"\n      }]\n    }, {\n      type: \"保单变更类\",\n      list: [{\n        name: \"保险合同解除申请书\",\n        desc: \"退保、冷静期退保业务适用\",\n        download: \"\"\n      }, {\n        name: \"保险合同变更申请书(保单贷款还款类)\",\n        desc: \"保单贷款、还款业务适用\",\n        download: \"\"\n      }, {\n        name: \"保险合同变更申请书(保险合同计划变更类)\",\n        desc: \"加保、减保、新增附险、复效等业务适用\",\n        download: \"\"\n      }, {\n        name: \"保险合同变更申请书(客户信息变更类)\",\n        desc: \"基本信息变更业务适用\",\n        download: \"\"\n      }, {\n        name: \"保险合同变更申请书(客户权益变更类)\",\n        desc: \"交费方式、自垫选择权变更、补发等业务适用\",\n        download: \"\"\n      }, {\n        name: \"授权委托书\",\n        desc: \"委托他人代办时须提供\",\n        download: \"\"\n      }, {\n        name: \"税收声明\",\n        desc: \"CRS要求\",\n        download: \"\"\n      }, {\n        name: \"健康告知\",\n        desc: \"须二次核保的业务须提供\",\n        download: \"\"\n      }]\n    }, {\n      type: \"理赔类\",\n      list: [{\n        name: \"理赔申请书\",\n        desc: \"纸质申请的应备文件\",\n        download: \"\"\n      }]\n    }]\n  },\n  policyChangeGuide: {\n    notice: \"如需做其他保单变更\",\n    noticeLink: \"联系客服\",\n    head1: \"项目\",\n    head2: \"具体内容\",\n    head3: \"申请资格人\",\n    head4: \"受理时间\",\n    head5: \"应备材料\",\n    download: \"下载文档\",\n    form: [{\n      project: \"退保\",\n      content: \"在冷静期后解除合同,公司将退还保单现金价值或未满期净保费。(待产品精算确认)\",\n      applicant: \"投保人\",\n      receptionTime: \"保单效力终止前\",\n      materialList: [{\n        name: \"保险单\"\n      }, {\n        name: \"申请书\",\n        type: 1\n      }, {\n        name: \"投保人有效身份证件\"\n      }, {\n        name: \"存折银行卡相关\"\n      }]\n    }, {\n      project: \"冷静期退保\",\n      content: \"在冷静期内提出解除合同,公司会无息退还全部保费\",\n      applicant: \"投保人\",\n      receptionTime: \"冷静期结束前\",\n      materialList: [{\n        name: \"保险单\"\n      }, {\n        name: \"申请书\",\n        type: 1\n      }, {\n        name: \"投保人有效身份证件\"\n      }, {\n        name: \"存折银行卡相关\"\n      }, {\n        name: \"首期保费发票\"\n      }]\n    }, {\n      project: \"客户资料变更\",\n      projectType: 1,\n      path: \"/custom/service\",\n      query: {\n        q: \"m42\"\n      },\n      content: \"投保人、受保人、受益人的个人信息变更\",\n      applicant: \"投保人\",\n      receptionTime: \"不限\",\n      materialList: [{\n        name: \"申请书\",\n        type: 1\n      }, {\n        name: \"必要的证明材料\"\n      }]\n    }, {\n      project: \"联系信息变更\",\n      projectType: 1,\n      path: \"/custom/service\",\n      query: {\n        q: \"m43\"\n      },\n      content: \"地址、电话等信息的变更\",\n      applicant: \"投保人\",\n      receptionTime: \"不限\",\n      materialList: [{\n        name: \"申请书\",\n        type: 1\n      }, {\n        name: \"投保人有效身份证件\"\n      }]\n    }, {\n      project: \"交费方式变更\",\n      content: \"更改保单的续期交费方式或交费账号\",\n      applicant: \"投保人\",\n      receptionTime: \"保单交费期满前\",\n      materialList: [{\n        name: \"申请书\",\n        type: 1\n      }, {\n        name: \"保险单\"\n      }]\n    }]\n  },\n  policyChangeContact: {\n    phone: \"联系电话\",\n    address: \"联系地址\",\n    email: \"E-Mail\",\n    checkTips: \"本人不同意接收宣传信息\",\n    submit: \"确认修改\",\n    errorTips: {\n      e1: \"請填寫正確的聯繫電話\",\n      e2: \"請填寫聯繫地址\",\n      e3: \"請填寫正確的E-Mail地址\"\n    },\n    success: \"更新成功\"\n  },\n  policyChangeInformation: {\n    title: \"客户资料变更\",\n    owner: \"投保人\",\n    insured: \"受保人\",\n    obj: \"变更对象\",\n    name: \"姓名\",\n    sex: \"性别\",\n    birth: \"出生日期\",\n    type: \"证件类型\",\n    NO: \"证件号码\",\n    validityPeriod: \"证件有效期\",\n    nationality: \"国籍\",\n    employer: \"工作单位\",\n    maritalStatus: \"婚姻状况\",\n    submit: \"确认修改\",\n    upload: \"附件上传\",\n    modifyTips1: \"如需修改请\",\n    modifyTips2: \"联系客服\",\n    success: \"更新成功\"\n  },\n  contactUs: {\n    service: {\n      center: {\n        title: \"客户服务中心\",\n        address: \"地址:香港尖沙嘴港威永金融大楼\",\n        time: \"服务时间:星期一至五9:00-18:00\"\n      },\n      hotline: {\n        title: \"客户服务热线\",\n        hk: \"香港号码:(852)2983 8866\",\n        cn: \"内地号码:(86)40078 95511\",\n        time: \"服务时间:星期一至五9:00-18:00\"\n      },\n      mail: {\n        title: \"客户服务电邮\",\n        mail: \"cs@pingan.com.hk\"\n      }\n    },\n    pulbic: {\n      title: \"微信公众号\",\n      m1: \"登陆「微信」APP, 按右上角的「+」按钮並选择「添加朋友」,选择「公众号」 输入并搜索「平安人寿香港」\",\n      m2: \"登陆「微信」APP, 按右上角的「+」按钮並选择「扫一扫」扫描下方二维码(放置二维码)\"\n    },\n    qrcode: {\n      title: \"官方公众号\"\n    }\n  },\n  customService: {\n    name: \"客户服务\",\n    menu1: \"联系我们\",\n    menu2: \"缴付保费\",\n    menu3: \"保单查询\",\n    menu4: \"保单变更\",\n    menu41: \"保单变更指引\",\n    menu42: \"联系方式变更\",\n    menu43: \"客户资料变更\",\n    menu5: \"理赔申请\",\n    menu6: \"预约服务\",\n    menu7: \"投诉受理\",\n    menu8: \"常用表格\",\n    insuranceQuery: {\n      modify: \"修改\",\n      InsurantNumber: \"保单号码\",\n      Insurant: \"受保人\",\n      InsurantName: \"险种名称\",\n      InsurantAmount: \"保额\",\n      effectiveDate: \"保费到期日\",\n      period: \"保障年期\",\n      t2Title: \"保單信息\",\n      t2n1: \"险种名称\",\n      t2n2: \"保额\",\n      t2n3: \"生效日期\",\n      t2n4: \"保障年期\",\n      t2n5: \"受保人姓名(中文)\",\n      t2n6: \"受保人姓名(英文)\",\n      t2n7: \"出生日期\",\n      t2n8: \"证件号码\",\n      t3Title: \"客户资料\",\n      t3n1: \"投保人姓名(中文)\",\n      t3n2: \"投保人姓名(英文)\",\n      t3n3: \"出生日期\",\n      t3n4: \"证件号码\",\n      t3n5: \"联系地址\",\n      t3n6: \"居住地址\",\n      t3n7: \"手提电话\",\n      t3n8: \"电子邮箱\",\n      t4Title: \"受益人资料\",\n      // t4BeneficiaryInformation\n      t4NameCn: \"姓名(中文)\",\n      t4NameEn: \"姓名(英文)\",\n      t4Relation: \"与受保人关系\",\n      t4Allocation: \"分配比例\",\n      t5Title: \"缴费资料\",\n      t5PaymentPeriod: \"缴费年期\",\n      t5PaymentMethod: \"缴费方式\",\n      t5PaymentCurrency: \"缴费币种\",\n      t5CurrentPremium: \"当期保费\",\n      t5PaymentBank: \"缴费银行\",\n      t5PaymentAccount: \"缴费账号\",\n      t6Title: \"缴费记录\",\n      t6PaymentPeriod: \"缴费期\",\n      t6PaymentMethod: \"缴费方式\",\n      t6ClosingDate: \"实收日期\",\n      t6PaymentAmount: \"缴费金额\",\n      showMore: \"显示所有保单\",\n      noPolicy: \"您还未购买保单,如有疑问请\",\n      customService: \"联系客服\"\n    },\n    unauth: {\n      tips: \"如您有平安一账通账户,可帮助我们更好地为您提供服务\",\n      or: \"或\",\n      login: \"登录\",\n      register: \"注册\",\n      baseInfoTip: \"您的完整信息可帮助我们为您提供完整服务\",\n      infoBtn: \"前往完善\"\n    }\n  },\n  pagination: {\n    firstPage: \"上一页\",\n    nextPage: \"下一页\",\n    goto: \"跳转\",\n    per: \"第\",\n    page: \"页\"\n  }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tbW9uL2xhbmcvemguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tbW9uL2xhbmcvemguanM/MjNkMCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcblx0bWVzc2FnZToge1xuXHRcdGxvZ2luOiAn55m75b2VJyxcblx0XHRVc2VybmFtZTogJ+eUqOaIt+WQjScsXG5cdFx0UGFzc3dvcmQ6ICflr4bnoIEnLFxuXHRcdENhcHRjaGE6ICfpqozor4HnoIEnLFxuXHRcdExhbmd1YWdlOiAn6K+t6KiAJyxcblx0XHR6aDogJ+S4reaWhycsXG5cdFx0ZW46ICfoi7HmlocnXG5cdH0sXG5cdGdsYmFsVGlwczoge1xuXHRcdHNlc3Npb25Mb3N0OiBcIuS4uuS6huabtOWlveeahOS9k+mqjO+8jOmcgOimgeaCqOeZu+W9leWQjuWGjei/m+ihjOatpOaTjeS9nFwiXG5cdH0sXG5cdGZvcm06IHtcblx0XHRkYXRlUGlja2VyOiB7XG5cdFx0XHRkYXRlUGxhY2Vob2xkZXI6IFwi6K+36YCJ5oup5pel5pyfXCJcblx0XHR9LFxuXHRcdG1vZGFsVXBsb2FkQ2FyZDoge1xuXHRcdFx0dGl0OiBcIuivt+S4iuS8oOivgeS7tui1hOaWmVwiLFxuXHRcdFx0ZnJvbnQ6IFwi6K+B5Lu25q2j6Z2iXCIsXG5cdFx0XHRiYWNrOiBcIuivgeS7tuWPjemdolwiLFxuXHRcdH1cblx0fSxcblx0bmF2OiB7XG5cdFx0bG9naW5EYXRhOiB7XG5cdFx0XHRuYW1lOiBcIueZu+mZhlwiLFxuXHRcdFx0cGF0aDogXCJcIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi5rOo5YaMXCIsXG5cdFx0XHRcdHBhdGg6IFwiL3JlZ2lzdGVyXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9BdXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBcIlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi55m76ZmGXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2xvZ2luXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9BdXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBcIlwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/ruaUueWvhueggVwiLFxuXHRcdFx0XHRwYXRoOiBcIi9wYXNzd29yZC9yZXNldFwiLFxuXHRcdFx0XHR0eXBlOiBcImF1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5Liq5Lq65L+h5oGvXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2luZm9tYXRpb24vaW1wcm92ZVwiLFxuXHRcdFx0XHR0eXBlOiBcImF1dGhcIixcblx0XHRcdFx0dmFsdWU6IFwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi55m75Ye6XCIsXG5cdFx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRcdHR5cGU6IFwiYXV0aFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJsb2dvdXRcIlxuXHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0bmF2TGlzdDogW3tcblx0XHRcdG5hbWU6IFwi5Lqn5ZOB5LuL57uNXCIsXG5cdFx0XHRwYXRoOiBcIlwiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLoh6rmhL/ljLvkv53ln7rmnKzorqHliJJcIixcblx0XHRcdFx0cGF0aDogXCJcIixcblx0XHRcdFx0dmFsdWU6IFwiZ290b1ZISVNcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLliIbnuqLnu4jouqvlr7/pmalcIixcblx0XHRcdFx0cGF0aDogXCIvcHJvZHVjdFwiXG5cdFx0XHR9XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bmFtZTogXCLlrqLmiLfmnI3liqFcIixcblx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIuWuouaIt+acjeWKoeWvvOiIqlwiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vcHJvZHVjdFwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuiBlOezu+aIkeS7rFwiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW0xXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi57y05LuY5L+d6LS5XCIsXG5cdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTJcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLkv53ljZXmn6Xor6JcIixcblx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tM1wiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/neWNleWPmOabtFwiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW00MVwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIueQhui1lOeUs+ivt1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW01XCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi6aKE57qm5pyN5YqhXCIsXG5cdFx0XHRcdHBhdGg6IFwiL2N1c3RvbS9zZXJ2aWNlP3E9bTZcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLmipXor4nlj5fnkIZcIixcblx0XHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2U/cT1tN1wiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuW4uOeUqOihqOagvFwiLFxuXHRcdFx0XHRwYXRoOiBcIi9jdXN0b20vc2VydmljZT9xPW04XCJcblx0XHRcdH0sXG5cdFx0XHRdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRuYW1lOiBcIuWFs+S6juaIkeS7rFwiLFxuXHRcdFx0cGF0aDogXCJcIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi5bmz5a6J5Lq65a+/6aaZ5rivXCIsXG5cdFx0XHRcdHBhdGg6IFwiL3Byb2ZpbGVcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLlhazlj7jmtLvliqhcIixcblx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuaWsOmXu+S4reW/g1wiLFxuXHRcdFx0XHRwYXRoOiBcIi9uZXdzL2xpc3RcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLkvIHkuJrnpL7kvJrotKPku7tcIixcblx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLlpZbpobnmrorojaNcIixcblx0XHRcdFx0cGF0aDogXCIvZW1wdHlcIlxuXHRcdFx0fVxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bmFtZTogXCLliqDlhaXmiJHku6xcIixcblx0XHRcdHBhdGg6IFwiXCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIuS8geS4muaWh+WMllwiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS6i+S4muWPkeWxleacuuS8mlwiLFxuXHRcdFx0XHRwYXRoOiBcIi9lbXB0eVwiXG5cdFx0XHR9LFxuXHRcdFx0XVxuXHRcdH1cblx0XHRdXG5cdH0sXG5cdGZvb3Rlcjoge1xuXHRcdGhrUGhvbmU6IFwi6aaZ5riv5Y+356CBXCIsXG5cdFx0Y25QaG9uZTogXCLlhoXlnLDlj7fnoIFcIixcblx0XHRhYm91dFVzOiBcIuWFs+S6juaIkeS7rFwiLFxuXHRcdGNvbXBhbnlJbnRyb2R1Y3Rpb246IFwi6ZuG5Zui5LuL57uNXCIsXG5cdFx0bmV3czogXCLmlrDpl7votYTorq9cIixcblx0XHRqb2luVXM6IFwi5Yqg5YWl5oiR5LusXCIsXG5cdFx0aGVscENlbnRlcjogXCLluK7liqnkuK3lv4NcIixcblx0XHRwcml2YWN5OiBcIumakOengeaUv+etllwiLFxuXHRcdHRlcm1zOiBcIuS9v+eUqOadoeasvlwiLFxuXHRcdHByb3RvY29sOiBcIuS4quS6uui1hOaWmeaUtumbhuWjsOaYjlwiLFxuXHRcdG1hcDogXCLnvZHnq5nlnLDlm75cIixcblx0XHRjb250YWN0VXM6IFwi6IGU57uc5oiR5LusXCIsXG5cdFx0Y29udGFjdEluZm9ybWF0aW9uOiBcIuiBlOezu+aWueW8j1wiLFxuXHRcdHNlcnZpY2U6IFwi5pyN5Yqh572R57ucXCIsXG5cdFx0cXJjb2RlOiBcIuekvuS6pOWqkumrlFwiLFxuXHRcdGNvcHlyaWdodDogXCLniYjmnYPmiYDmnIkgwqkg5Lit5Zu95bmz5a6J5L+d6Zmp77yI6ZuG5Zui77yJ6IKh5Lu95pyJ6ZmQ5YWs5Y+45pyq57uP6K645Y+v5LiN5b6X5aSN5Yi244CB6L2s6L295oiW5pGY57yW77yM6L+d6ICF5b+F56m2IVwiXG5cdH0sXG5cdGxvZ2luOiB7XG5cdFx0dGl0bGU6IFwi5bmz5a6J5LiA6LSm6YCaXCIsXG5cdFx0bG9naW5UeXBlMTogXCLotKblr4bnmbvlvZVcIixcblx0XHRsb2dpblR5cGUyOiBcIuWKqOaAgeWvhueggeeZu+W9lVwiLFxuXHRcdGFjY291bnQ6IFwi6LSm5Y+3XCIsXG5cdFx0YWNjb3VudFBsYWNlaG9sZGVyOiBcIuivt+i+k+WFpeivgeS7tuWPty/kuIDotKbpgJrnlKjmiLflkI0v5omL5py65Y+3XCIsXG5cdFx0cGFzc3dvcmQ6IFwi5a+G56CBXCIsXG5cdFx0cGFzc3dvcmRQbGFjZWhvbGRlcjogXCLovpPlhaXnmbvlvZXlr4bnoIFcIixcblx0XHR2ZXJpZnlQbGFjZWhvbGRlcjogXCLor7fovpPlhaXpqozor4HnoIFcIixcblx0XHRhZ3JlZTogXCLlkIzmhI9cIixcblx0XHRwcm90b2NvbDogXCLjgIrlubPlronkuIDotKbpgJrkvJrlkZjmnI3liqHljY/orq7jgItcIixcblx0XHRsb2dpbjogXCLnmbvlhaVcIixcblx0XHRyZWdpc3RlcjogXCLms6jlhoxcIixcblx0XHRmb3JnZXQ6IFwi5b+Y6K6w5a+G56CBXCIsXG5cdFx0bW9iaWxlOiBcIuaJi+acuuWPt1wiLFxuXHRcdG1vYmlsZVBsYWNlaG9sZGVyOiBcIuaJi+acuuWPt1wiLFxuXHRcdHZlcmlmeUNvZGU6IFwi6aqM6K+B56CBXCIsXG5cdFx0dmVyaWZ5Q29kZVBsYWNlaG9sZGVyOiBcIumqjOivgeeggVwiLFxuXHRcdHZlcmlmeUNvZGVHZXQ6IFwi6I635Y+W6aqM6K+B56CBXCIsXG5cdFx0dGlwczoge1xuXHRcdFx0ZTE6IFwi6K+36L6T5YWl6LSm5Y+35L+h5oGvXCIsXG5cdFx0XHRlMjogXCLor7fovpPlhaXlr4bnoIFcIixcblx0XHRcdGUzOiBcIuivt+i+k+WFpeWbvuWDj+mqjOivgeeggVwiLFxuXHRcdFx0ZTQ6IFwi6K+35ZCM5oSP44CK5bmz5a6J5LiA6LSm6YCa5Lya5ZGY5pyN5Yqh5Y2P6K6u44CLXCIsXG5cdFx0XHRlNTogXCLotKblj7fmiJblr4bnoIHkuI3mraPnoa5cIixcblx0XHRcdG9lMDogXCLor7fovpPlhaXmraPnoa7nmoTmiYvmnLrlj7dcIixcblx0XHRcdG9lMTogXCLor7flhYjojrflj5bnn63kv6Hpqozor4HnoIFcIixcblx0XHRcdG9lMjogXCLor7fovpPlhaXlm77niYfpqozor4HnoIFcIixcblx0XHRcdG9lMzogXCLor7fovpPlhaXnn63kv6Hpqozor4HnoIFcIixcblx0XHRcdG9lNDogXCLnn63kv6Hpqozor4HnoIHkuI3mraPnoa5cIixcblx0XHR9XG5cdH0sXG5cdHNlc3Npb246IHtcblx0XHRzaWRFeHBpcmU6IFwi6ZW/5pe26Ze05pyq5pON5L2c77yM5Li65LqG5oKo55qE6LSm5oi35a6J5YWo77yM6K+355m75b2V5ZCO5YaN5pON5L2cXCIsXG5cdH0sXG5cdHJlZ2lzdGVyOiB7XG5cdFx0bW9iaWxlT3B0aW9uczogW3tcblx0XHRcdHR5cGU6IFwiaGtcIixcblx0XHRcdG5hbWU6IFwi6aaZ5riv5omL5py65Y+3XCIsXG5cdFx0XHRwbGFjZUhvbGRlcjogXCLor7fovpPlhaU45L2N5omL5py65Y+356CBXCIsXG5cdFx0XHRhcmVhQ29kZTogXCIrODUyXCJcblx0XHR9LCB7XG5cdFx0XHR0eXBlOiBcInpoXCIsXG5cdFx0XHRuYW1lOiBcIuWkp+mZhuaJi+acuuWPt1wiLFxuXHRcdFx0cGxhY2VIb2xkZXI6IFwi6K+36L6T5YWlMTHkvY3miYvmnLrlj7fnoIFcIixcblx0XHRcdGFyZWFDb2RlOiBcIis4NlwiXG5cdFx0fV0sXG5cdFx0Y291dFRpcHM6IFwie3NlY29uZH3np5LlkI7ph43mlrDojrflj5ZcIixcblx0XHR0aXRsZTogXCLmrKLov47ms6jlhoxcIixcblx0XHR0aXRsZTI6IFwi6K+36K6+572u5paw55qE5a+G56CBXCIsXG5cdFx0bW9iaWxlUGxhY2Vob2xkZXI6IFwi6K+36L6T5YWlOOS9jeaJi+acuuWPt+eggVwiLFxuXHRcdHZlcmlmeUNvZGVQbGFjZWhvbGRlcjogXCLor7fovpPlhaXpqozor4HnoIFcIixcblx0XHR2ZXJpZnlDb2RlR2V0OiBcIuiOt+WPlumqjOivgeeggVwiLFxuXHRcdGFncmVlOiBcIuWQjOaEj1wiLFxuXHRcdHByb3RvY29sOiBcIuOAiuW5s+WuieS4gOi0pumAmuS8muWRmOacjeWKoeWNj+iuruOAi1wiLFxuXHRcdHJlZ2lzdGVyOiBcIueCueWHu+azqOWGjFwiLFxuXHRcdG5ld1Bhc3N3b3JkOiBcIuaWsOWvhueggVwiLFxuXHRcdG5ld1Bhc3N3b3JkUGxhY2Vob2xkZXI6IFwi6L6T5YWl55m75b2V5a+G56CBXCIsXG5cdFx0bmV3UGFzc3dvcmRTdXJlOiBcIuehruiupOWvhueggVwiLFxuXHRcdG5ld1Bhc3N3b3JkU3VyZVBsYWNlaG9sZGVyOiBcIui+k+WFpeeZu+W9leWvhueggVwiLFxuXHRcdHN1cmU6IFwi56Gu6K6kXCIsXG5cdFx0dGlwczoge1xuXHRcdFx0ZTE6IFwi5omL5py65Y+35LiN5q2j56Gu77yM6K+36L6T5YWl5q2j56Gu55qE5omL5py65Y+3XCIsXG5cdFx0XHRlMjogXCLor7flkIzmhI/jgIrlubPlronkuIDotKbpgJrkvJrlkZjmnI3liqHljY/orq7jgItcIixcblx0XHRcdGUzOiBcIuefreS/oemqjOivgeeggeS4jeato+ehrlwiLFxuXHRcdFx0ZTQ6IFwi6K+35YWI6I635Y+W55+t5L+h6aqM6K+B56CBXCIsXG5cdFx0XHRlNTogXCLmiYvmnLrlj7flt7Lnu4/ooqvms6jlhozvvIzor7fkvb/nlKjlhbbku5bmiYvmnLrlj7fms6jlhozmiJbnm7TmjqXnmbvlvZVcIixcblx0XHRcdGU2OiBcIuivt+i+k+WFpeWbvueJh+mqjOivgeeggVwiLFxuXHRcdFx0ZTc6IFwi5a+G56CB6ZW/5bqm5LiN6IO95bCR5LqOOOS9jVwiLFxuXHRcdFx0ZTg6IFwi5a+G56CB5b+F6aG75ZCM5pe25YyF5ZCr5pWw5a2X44CB5a2X5q+N44CB54m55q6K5a2X56ymXCIsXG5cdFx0XHRlOTogXCLkuKTmrKHovpPlhaXnmoTlr4bnoIHkuI3kuIDoh7RcIixcblx0XHRcdGUxMDogXCLpqozor4HnoIHov4fmnJ/vvIzor7fph43mlrDnlLPor7fpqozor4HnoIFcIixcblx0XHRcdGUxMTogXCLms6jlhozlpLHotKXvvIzor7fogZTns7vlt6XkvZzkurrlkZhcIixcblx0XHRcdGUxMjogXCLoqLvlhormiJDlip9cIixcblx0XHR9XG5cdH0sXG5cdHBhc3N3b3JkQ2hlY2s6IHtcblx0XHRlcnJvcjE6IFwi5a+G56CB6ZW/5bqm5LiN5bCR5LqOOOS9jVwiLFxuXHRcdGVycm9yMjogXCLlr4bnoIHkuK3lv4XpobvljIXlkKvmlbDlrZfjgIHlrZfnrKbku6Xlj4rnibnmrorlj7fnoIFcIixcblx0XHRlcnJvcjM6IFwi5Lik5qyh5a+G56CB5LiN5LiA6Ie077yM6K+356Gu6K6k5ZCO6YeN5paw6L6T5YWlXCIsXG5cdFx0ZXJyb3I0OiBcIuWvhueggeS/ruaUueWksei0pe+8jOivt+eojeWQjuWGjeivle+8jOaIluaLqOaJk+WuouacjeeUteivnTk1NTEx6Kej5YazXCIsXG5cdFx0ZXJyb3I1OiBcIuaXp+WvhueggeS4jeato+ehru+8jOivt+mHjeaWsOi+k+WFpVwiLFxuXHRcdHN1Y2Nlc3M6IFwi5a+G56CB5L+u5pS55oiQ5YqfXCJcblx0fSxcblx0cGFzc3dvcmRSZXNldDoge1xuXHRcdG9sZFB3ZDogXCLml6flr4bnoIFcIixcblx0XHRvbGRQd2RQbGFjZWhvbGRlOiBcIuivt+i+k+WFpeaXp+WvhueggVwiLFxuXHRcdGNpZEV4cGlyZTogXCLplb/ml7bpl7TmnKrmk43kvZzvvIzkuLrkuobmgqjnmoTotKbmiLflronlhajvvIzor7fph43mlrDlvIDlp4tcIixcblx0XHR0eXBlMToge1xuXHRcdFx0dGl0bGU6IFwi5a+G56CB5om+5ZueXCIsXG5cdFx0XHR0MTogXCLnlKjmiLfovpPlhaXkv6Hmga9cIixcblx0XHRcdHQxUGxhY2Vob2xkZXI6IFwi5omL5py65Y+3L+ivgeS7tuWPt1wiLFxuXHRcdFx0c3VibWl0OiBcIuehruiupFwiLFxuXHRcdFx0ZXJyb3I6IFwi5oKo55qE5omL5py65Y+35oiW6K+B5Lu25Y+36L6T5YWl6ZSZ6K+v77yM6K+35qC45a+55ZCO6YeN5paw6L6T5YWlXCIsXG5cdFx0fSxcblx0XHR0eXBlMjoge1xuXHRcdFx0dGl0bGU6IFwi5a+G56CB5om+5ZueXCIsXG5cdFx0XHR0MTogXCLmiYvmnLrnn63kv6Hpqozor4HnoIFcIixcblx0XHRcdHQxUGxhY2Vob2xkZXI6IFwi6K+36L6T5YWl6aqM6K+B56CBXCIsXG5cdFx0XHRzdWJtaXQ6IFwi56Gu6K6kXCIsXG5cdFx0XHRlcnJvcjE6IFwi55+t5L+h6aqM6K+B56CB6L6T5YWl6ZSZ6K+v77yM6K+35qC45a+55ZCO6YeN5paw6L6T5YWlXCIsXG5cdFx0XHRlcnJvcjI6IFwi55+t5L+h6aqM6K+B56CB5bey57uP6L+H5pyf77yM6K+36YeN5paw6I635Y+W6aqM6K+B56CBXCIsXG5cdFx0XHRlcnJvcjM6IFwi55+t5L+h6aqM6K+B56CB5Y+R5pS+5pe26Ze05bCR5LqOMeWIhumSn++8jOivt+eojeWQjuWGjeivlVwiLFxuXHRcdH0sXG5cdFx0dHlwZTM6IHtcblx0XHRcdHRpdGxlOiBcIuWvhueggeaJvuWbnlwiLFxuXHRcdFx0dDE6IFwi5qC45a+56Lqr5Lu96K+B5L+h5oGvXCIsXG5cdFx0XHR0MVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdFx0c3VibWl0OiBcIuehruiupFwiLFxuXHRcdH0sXG5cdFx0dHlwZTQ6IHtcblx0XHRcdHRpdGxlOiBcIuivt+iuvue9ruaWsOeahOWvhueggVwiLFxuXHRcdFx0dDE6IFwi5paw5a+G56CBXCIsXG5cdFx0XHR0MVBsYWNlaG9sZGVyOiBcIuivt+i+k+WFpeaWsOWvhueggVwiLFxuXHRcdFx0dDI6IFwi56Gu6K6k5a+G56CBXCIsXG5cdFx0XHR0MlBsYWNlaG9sZGVyOiBcIuivt+mHjeaWsOi+k+WFpeaWsOWvhueggVwiLFxuXHRcdFx0c3VibWl0OiBcIuehruiupFwiLFxuXHRcdH1cblx0fSxcblx0aW5mb21hdGlvbkltcHJvdmU6IHtcblx0XHR0aXRsZTogXCLor7flrozlloTmgqjnmoTkv6Hmga9cIixcblx0XHR0MTogXCLlp5PlkI1cIixcblx0XHR0MWMxOiBcIuWnk1wiLFxuXHRcdHQxYzI6IFwi5ZCNXCIsXG5cdFx0dDFQbGFjZWhvbGRlcjogXCJcIixcblx0XHR0MjogXCLmgKfliKtcIixcblx0XHR0MlBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHQzOiBcIuWHuueUn+aXpeacn1wiLFxuXHRcdHQzUGxhY2Vob2xkZXI6IFwiXCIsXG5cdFx0dDQ6IFwi6K+B5Lu257G75Z6LXCIsXG5cdFx0dDRQbGFjZWhvbGRlcjogXCJcIixcblx0XHR0NTogXCLor4Hku7blj7fnoIFcIixcblx0XHR0NVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdHN1Ym1pdDogXCLnoa7orqRcIixcblx0XHRjYW5jZWw6IFwi6Lez6L+HXCIsXG5cdFx0Y2FuZGlkYXRlczoge1xuXHRcdFx0c2V4OiBbe1xuXHRcdFx0XHRuYW1lOiBcIueUt1wiLFxuXHRcdFx0XHR2YWx1ZTogXCJNXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLlpbNcIixcblx0XHRcdFx0dmFsdWU6IFwiRlwiXG5cdFx0XHR9XSxcblx0XHRcdGlkVHlwZTogW3tcblx0XHRcdFx0bmFtZTogXCLouqvku73or4FcIixcblx0XHRcdFx0dmFsdWU6IFwiMVwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5oqk54WnXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjJcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWGm+WumOivgeaIluWjq+WFteivgVwiLFxuXHRcdFx0XHR2YWx1ZTogXCIzXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLmuK/mvrPpgJrooYzor4Ev5Zue5Lmh6K+B5oiW5Y+w6IOe6K+BXCIsXG5cdFx0XHRcdHZhbHVlOiBcIjZcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWkluWbveS6uuawuOS5heWxheeVmei6q+S7veivgVwiLFxuXHRcdFx0XHR2YWx1ZTogXCJPXCJcblx0XHRcdH0sIHtcblx0XHRcdFx0bmFtZTogXCLmuK/mvrPlsYXmsJHlsYXkvY/or4FcIixcblx0XHRcdFx0dmFsdWU6IFwiVlwiXG5cdFx0XHR9LCB7XG5cdFx0XHRcdG5hbWU6IFwi5Y+w5rm+5bGF5rCR5bGF5L2P6K+BXCIsXG5cdFx0XHRcdHZhbHVlOiBcIldcIlxuXHRcdFx0fSwge1xuXHRcdFx0XHRuYW1lOiBcIuWFtuS7llwiLFxuXHRcdFx0XHR2YWx1ZTogXCIwXCJcblx0XHRcdH1dXG5cdFx0fSxcblx0XHRzdWNjZXNzTXNnOiBcIuabtOaWsOaIkOWKn1wiLFxuXHRcdGVycm9yVGlwczoge1xuXHRcdFx0ZTE6IFwi6K+35aGr5YaZ5aeT5ZCN5L+h5oGvXCIsXG5cdFx0XHRlMjogXCLor7fpgInmi6nmgKfliKtcIixcblx0XHRcdGUzOiBcIuivt+mAieaLqeeUn+aXpVwiLFxuXHRcdFx0ZTQ6IFwi6K+36YCJ5oup6K+B5Lu257G75Z6LXCIsXG5cdFx0XHRlNTogXCLor7floavlhpnor4Hku7blj7fnoIFcIixcblx0XHRcdGU2OiBcIuaCqOWhq+WGmeeahOivgeS7tuWPt+eggeacieivr1wiLFxuXHRcdFx0ZTc6IFwi5oKo5aGr5YaZ55qE5L+h5oGv5pyJ6K+v77yM6K+35qC45a6e5ZCO6YeN5paw5o+Q5LqkXCIsXG5cdFx0fVxuXHR9LFxuXHRpbmRleDoge1xuXHRcdG5ld3M6IFwi5paw6Ze76LWE6K6vXCIsXG5cdFx0bmV3TW9yZTogXCLmn6XnnIvmm7TlpJpcIixcblx0XHRyZWNvbW1lbmQ6IHtcblx0XHRcdHQxOiBcIuWcqOe6v+aKpeS7t1wiLFxuXHRcdFx0dDI6IFwi5a6i5oi35pyN5YqhXCIsXG5cdFx0XHR0MzogXCLkuqflk4Hku4vnu41cIixcblx0XHRcdHQ0OiBcIuacgOaWsOa2iOaBr1wiLFxuXHRcdFx0aXRlbTE6IHtcblx0XHRcdFx0YnRuOiBcIuS6huino+abtOWkmuS6p+WTgVwiLFxuXHRcdFx0XHR0MTogXCLkuLroh6rlt7Hlkozlrrbkurrlr7vmib7kuIDku73kv53pmpxcIixcblx0XHRcdH0sXG5cdFx0XHRpdGVtMjoge1xuXHRcdFx0XHRidG46IFwi56uL5Y2z6aKE57qmXCIsXG5cdFx0XHRcdHQxOiBcIuWcqOe6v+mihOe6piDkuJPkuJrmnI3liqFcIixcblx0XHRcdH0sXG5cdFx0XHRpdGVtMzoge1xuXHRcdFx0XHRidG46IFwi5a6i5oi35pyN5YqhXCIsXG5cdFx0XHRcdHQxOiBcIuS4k+S4muWuouacjeS4uuS9oOacjeWKoVwiLFxuXHRcdFx0XHR0MjogXCLmg7Pkuobop6Pmm7TlpJrvvIzlj6/oh7TnlLVcIixcblx0XHRcdFx0dDM6IFwiOTU1MTFcIixcblx0XHRcdFx0dDQ6IFwi6IGU57uc5oiR5Lus77yM5oiW6L+b5YWlXCIsXG5cdFx0XHR9XG5cdFx0fSxcblx0fSxcblx0Y29tcGxhaW50QWNjZXB0YW5jZToge1xuXHRcdG5hbWU6IFwi5aeT5ZCNXCIsXG5cdFx0bmFtZVBsYWNlaG9sZGVyOiBcIuWnk+WQjVwiLFxuXHRcdGNvbnRhY3RUeXBlOiBcIuiBlOe7nOaWueW8j1wiLFxuXHRcdGVtYWlsOiBcIueUtemCruWcsOWdgFwiLFxuXHRcdHF1ZXN0aW9uOiBcIumXrumimOaIluaEj+ingVwiLFxuXHRcdHF1ZXN0aW9uUGxhY2VIb2xkZXI6IFwi77yI5a2X5pWw5LiN6LaF6L+HNTAw5a2X77yJXCIsXG5cdFx0b3JkZXJObzogXCLkv53ljZXnvJblj7dcIixcblx0XHRvcmRlck5vUGxhY2VIb2xkZXI6IFwi5aaC5oKo5Li65bmz5a6J5a6i5oi377yM6K+35o+Q5L6b5L+d5Y2V57yW5Y+3XCIsXG5cdFx0Y29udGFjdFRpbWU6IFwi5pyf5pyb6IGU57uc5pe26Ze0XCIsXG5cdFx0bm90aWNlMTogXCLmnKzooajmoLzmiYDmlLbpm4bnmoTkuKrkurrotYTmlpnmoLnmja7jgIzlubPlronkurrlr7/pppnmuK/kuKrkurrotYTmlpnmlLbpm4blo7DmmI7jgI3lpITnkIblj4rlj6rkvJrooqvnlKjkvZzkuo7ogZTnu5wg6ZiB5LiL5LmL55So44CC54S26ICM5omA5pS26ZuG55qE5Liq5Lq66LWE5paZ5pyq57uP5oKo5piO56Gu5o6I5p2D5bCG5LiN5Lya6L2s56e76Iez44CM5bmz5a6J5Lq65a+/6aaZ5riv5Liq5Lq66LWE5paZ5pS26ZuG5aOw5piO44CN5YiX5piO5Lul5aSW5LmL56ys5LiJ6ICF5py65p6E44CC5oKo5Y+v6YCJ5oup5LiN5ZCR5oiR5Lus5o+Q5L6b5omA6ZyA55qE5Liq5Lq66LWE5paZ77yM5oOf6L+Z5qC35Y+v6IO95a+86Ie05oiR5Lus5LiN6IO96IGU57uc5oKo44CC5oKo5Lqm5Y+v5qC55o2u44CM5bmz5a6J5Lq65a+/6aaZ5riv5Liq5Lq66LWE5paZ5pS26ZuG5aOw5piO44CN5LmL5p2D5Yip5p+l6ZiF5Y+K5pu05q2j5Liq5Lq66LWE5paZ44CCXCIsXG5cdFx0bm90aWNlMjogXCLmnKzkurrnjrDnoa7orqTmmI7nmb3lubblkIzmhI/mnKzkurrnmoTkuKrkurrotYTmlpnmoLnmja7kuK3pk7bkurrlr7/kuKrkurrotYTmlpnmlLbpm4blo7DmmI7kvZzku6XkuIrov7DnlKjpgJTjgIJcIixcblx0XHRjb250YWN0VHlwZXM6IFt7IG5hbWU6ICfnlLXor50nLCB2YWx1ZTogMSB9LCB7IG5hbWU6ICfnlLXpgq4nLCB2YWx1ZTogMiB9XSxcblx0XHRlcnJvclRpcHM6IHtcblx0XHRcdGUxOiBcIuivt+Whq+WGmeivpemhueWGheWuuVwiLFxuXHRcdFx0ZTI6IFwi6K+35aGr5YaZ5q2j56Gu55qE6IGU57O75pa55byPXCJcblx0XHR9LFxuXHRcdHN1Y2Nlc3M6IFwi5oSf6LCi5oKo55qE5a6d6LS15oSP6KeBXCJcblx0fSxcblx0cmVzZXJ2YXRpb246IHtcblx0XHRuYW1lOiBcIuWnk+WQjVwiLFxuXHRcdG5hbWVQbGFjZWhvbGRlcjogXCLlp5PlkI1cIixcblx0XHRjb250YWN0VHlwZTogXCLogZTnu5zmlrnlvI9cIixcblx0XHRjb250YWN0VHlwZUNhZGlkYXRlczogW3sgbmFtZTogXCLnlLXor51cIiwgdmFsdWU6IDEgfV0sXG5cdFx0Y29udGFjdDogXCLogZTnu5znlLXor51cIixcblx0XHRjb250YWN0UGxhY2Vob2xkZXI6IFwi6aaZ5riv5Y+356CBL+WGheWcsOWPt+eggVwiLFxuXHRcdHJlc2VydmF0aW9uVHlwZTogXCLpooTnuqbnsbvlnotcIixcblx0XHRyZXNlcnZhdGlvbkNhbmRpZGF0ZXM6IFtcblx0XHRcdHsgbmFtZTogXCLmipXkv53lkqjor6JcIiwgdmFsdWU6IFwi5oqV5L+d5ZKo6K+iXCIgfSxcblx0XHRcdHsgbmFtZTogXCLku6Plip7kv53ljZXlj5jmm7RcIiwgdmFsdWU6IFwi5Luj5Yqe5L+d5Y2V5Y+Y5pu0XCIgfVxuXHRcdF0sXG5cdFx0cmVzZXJ2YXRpb25SZW1hcms6IFwi6aKE57qm6K+05piOXCIsXG5cdFx0cmVzZXJ2YXRpb25SZW1hcmtQbGFjZWhvbGRlcjogXCLor7fnroDljZXor7TmmI7mgqjmg7PopoHlkqjor6LnmoTkuqflk4HmiJbkuJrliqFcIixcblx0XHRoa0NsaWVudDogXCLmmK/lkKblubPlronpppnmuK/lrqLmiLdcIixcblx0XHR5ZXM6IFwi5pivXCIsXG5cdFx0bm86IFwi5ZCmXCIsXG5cdFx0Y29udGFjdFRpbWU6IFwi5pyf5pyb6IGU57uc5pe26Ze0XCIsXG5cdFx0bm90aWNlMTogXCLmnKzooajmoLzmiYDmlLbpm4bnmoTkuKrkurrotYTmlpnmoLnmja7jgIzlubPlronkurrlr7/pppnmuK/kuKrkurrotYTmlpnmlLbpm4blo7DmmI7jgI3lpITnkIblj4rlj6rkvJrooqvnlKjkvZzkuo7ogZTnu5wg6ZiB5LiL5LmL55So44CC54S26ICM5omA5pS26ZuG55qE5Liq5Lq66LWE5paZ5pyq57uP5oKo5piO56Gu5o6I5p2D5bCG5LiN5Lya6L2s56e76Iez44CM5bmz5a6J5Lq65a+/6aaZ5riv5Liq5Lq66LWE5paZ5pS26ZuG5aOw5piO44CN5YiX5piO5Lul5aSW5LmL56ys5LiJ6ICF5py65p6E44CC5oKo5Y+v6YCJ5oup5LiN5ZCR5oiR5Lus5o+Q5L6b5omA6ZyA55qE5Liq5Lq66LWE5paZ77yM5oOf6L+Z5qC35Y+v6IO95a+86Ie05oiR5Lus5LiN6IO96IGU57uc5oKo44CC5oKo5Lqm5Y+v5qC55o2u44CM5bmz5a6J5Lq65a+/6aaZ5riv5Liq5Lq66LWE5paZ5pS26ZuG5aOw5piO44CN5LmL5p2D5Yip5p+l6ZiF5Y+K5pu05q2j5Liq5Lq66LWE5paZ44CCXCIsXG5cdFx0bm90aWNlMjogXCLmnKzkurrnjrDnoa7orqTmmI7nmb3lubblkIzmhI/mnKzkurrnmoTkuKrkurrotYTmlpnmoLnmja7kuK3pk7bkurrlr7/kuKrkurrotYTmlpnmlLbpm4blo7DmmI7kvZzku6XkuIrov7DnlKjpgJTjgIJcIixcblx0XHRzdWNjZXNzOiBcIuaPkOS6pOaIkOWKn1wiLFxuXHRcdHN1Ym1pdEJ0bjogJ+ehruiupCcsXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCLor7floavlhpnor6XpobnlhoXlrrlcIixcblx0XHRcdGUyOiBcIuivt+Whq+WGmeato+ehrueahOiBlOezu+aWueW8j1wiXG5cdFx0fVxuXHR9LFxuXHRwYXltZW50VHlwZToge1xuXHRcdG1lbnUxOiBcIuS6suS4tOWuouacjeS4reW/g+S7mOasvlwiLFxuXHRcdG1lbnUyOiBcIue9kemTtuS7mOasvlwiLFxuXHRcdG1lbnUzOiBcIueUteaxh+S7mOasvlwiLFxuXHRcdG1lbnU0OiBcIuafnOWRmOacuuS7mOasvlwiLFxuXHRcdG1lbnU1OiBcIuOAjOe8tOi0ueeBteOAjeS7mOasvlwiLFxuXHRcdG1lbnU2OiBcIummmea4r+mCruaUv+WxgFwiLFxuXHR9LFxuXHRwcm9kdWN0OiB7XG5cdFx0YnRuUG9zaXRpb246IFwi6aKE57qm5pyN5YqhXCIsXG5cdFx0aWNvblByb2JsZW06IFwi5bi46KeB6Zeu6aKYXCIsXG5cdFx0aWNvblByb2Nlc3M6IFwi5oqV5L+d5rWB56iLXCIsXG5cdFx0aWNvblByb2R1Y3Q6IFwi5Lqn5ZOB6K+m5oOFXCJcblx0fSxcblx0Y3VzdG9tUHJvZHVjdDoge1xuXHRcdG1lbnUxOiBcIuiBlOezu+aIkeS7rFwiLFxuXHRcdG1lbnUyOiBcIue8tOS7mOS/nei0uVwiLFxuXHRcdG1lbnUzOiBcIuS/neWNleafpeivolwiLFxuXHRcdG1lbnU0OiBcIuS/neWNleWPmOabtFwiLFxuXHRcdG1lbnU1OiBcIueQhui1lOeUs+ivt1wiLFxuXHRcdG1lbnU2OiBcIumihOe6puacjeWKoVwiLFxuXHRcdG1lbnU3OiBcIuaKleivieWPl+eQhlwiLFxuXHRcdG1lbnU4OiBcIuW4uOeUqOihqOagvFwiLFxuXHR9LFxuXHRjb21tb25Gb3JtOiB7XG5cdFx0aGVhZDE6IFwi6KGo5qC857G75Z6LXCIsXG5cdFx0aGVhZDI6IFwi6KGo5qC85ZCN56ewXCIsXG5cdFx0aGVhZDM6IFwi5L2/55So6K+05piOXCIsXG5cdFx0aGVhZDQ6IFwi6ZmE5Lu2XCIsXG5cdFx0ZG93bmxvYWQ6IFwi5LiL6L295paH5qGjXCIsXG5cdFx0Zm9ybTogW3tcblx0XHRcdHR5cGU6IFwi57y06LS557G7XCIsXG5cdFx0XHRsaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIuOAjOeUteWtkOWFpei0puacjeWKoeOAjeWPiumTtuihjOaIt+WPozxicj7nm7TmjqXku5jmrL7mjojmnYPnlLPor7dcIixcblx0XHRcdFx0ZGVzYzogXCLnlLPor7forr7nq4vjgIznlLXlrZDlhaXotKbmnI3liqHjgI3lj4rpk7booYzmiLflj6M8YnI+55u05o6l5LuY5qy+5o6I5p2D5pe26aG75o+Q5L6bXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLkv6HnlKjljaHmiLflj6Pnm7TmjqXku5jmrL7mjojmnYPkuaZcIixcblx0XHRcdFx0ZGVzYzogXCLnlLPor7fkv6HnlKjljaHmiLflj6Pnm7TmjqXku5jmrL7mjojmnYPml7bpobvmj5DkvptcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9XG5cdFx0XHRdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0eXBlOiBcIuS/neWNleWPmOabtOexu1wiLFxuXHRcdFx0bGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLkv53pmanlkIjlkIzop6PpmaTnlLPor7fkuaZcIixcblx0XHRcdFx0ZGVzYzogXCLpgIDkv53jgIHlhrfpnZnmnJ/pgIDkv53kuJrliqHpgILnlKhcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/nemZqeWQiOWQjOWPmOabtOeUs+ivt+S5pu+8iOS/neWNlei0t+asvui/mOasvuexu++8iVwiLFxuXHRcdFx0XHRkZXNjOiBcIuS/neWNlei0t+asvuOAgei/mOasvuS4muWKoemAgueUqFwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5L+d6Zmp5ZCI5ZCM5Y+Y5pu055Sz6K+35Lmm77yI5L+d6Zmp5ZCI5ZCM6K6h5YiS5Y+Y5pu057G777yJXCIsXG5cdFx0XHRcdGRlc2M6IFwi5Yqg5L+d44CB5YeP5L+d44CB5paw5aKe6ZmE6Zmp44CB5aSN5pWI562J5Lia5Yqh6YCC55SoXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLkv53pmanlkIjlkIzlj5jmm7TnlLPor7fkuabvvIjlrqLmiLfkv6Hmga/lj5jmm7TnsbvvvIlcIixcblx0XHRcdFx0ZGVzYzogXCLln7rmnKzkv6Hmga/lj5jmm7TkuJrliqHpgILnlKhcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuS/nemZqeWQiOWQjOWPmOabtOeUs+ivt+S5pu+8iOWuouaIt+adg+ebiuWPmOabtOexu++8iVwiLFxuXHRcdFx0XHRkZXNjOiBcIuS6pOi0ueaWueW8j+OAgeiHquWeq+mAieaLqeadg+WPmOabtOOAgeihpeWPkeetieS4muWKoemAgueUqFwiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5o6I5p2D5aeU5omY5LmmXCIsXG5cdFx0XHRcdGRlc2M6IFwi5aeU5omY5LuW5Lq65Luj5Yqe5pe26aG75o+Q5L6bXCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLnqI7mlLblo7DmmI5cIixcblx0XHRcdFx0ZGVzYzogXCJDUlPopoHmsYJcIixcblx0XHRcdFx0ZG93bmxvYWQ6IFwiXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuWBpeW6t+WRiuefpVwiLFxuXHRcdFx0XHRkZXNjOiBcIumhu+S6jOasoeaguOS/neeahOS4muWKoemhu+aPkOS+m1wiLFxuXHRcdFx0XHRkb3dubG9hZDogXCJcIixcblx0XHRcdH1cblxuXHRcdFx0XVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dHlwZTogXCLnkIbotZTnsbtcIixcblx0XHRcdGxpc3Q6IFt7XG5cdFx0XHRcdG5hbWU6IFwi55CG6LWU55Sz6K+35LmmXCIsXG5cdFx0XHRcdGRlc2M6IFwi57q46LSo55Sz6K+355qE5bqU5aSH5paH5Lu2XCIsXG5cdFx0XHRcdGRvd25sb2FkOiBcIlwiLFxuXHRcdFx0fV1cblx0XHR9LFxuXHRcdF1cblx0fSxcblx0cG9saWN5Q2hhbmdlR3VpZGU6IHtcblx0XHRub3RpY2U6IFwi5aaC6ZyA5YGa5YW25LuW5L+d5Y2V5Y+Y5pu0XCIsXG5cdFx0bm90aWNlTGluazogXCLogZTns7vlrqLmnI1cIixcblx0XHRoZWFkMTogXCLpobnnm65cIixcblx0XHRoZWFkMjogXCLlhbfkvZPlhoXlrrlcIixcblx0XHRoZWFkMzogXCLnlLPor7fotYTmoLzkurpcIixcblx0XHRoZWFkNDogXCLlj5fnkIbml7bpl7RcIixcblx0XHRoZWFkNTogXCLlupTlpIfmnZDmlplcIixcblx0XHRkb3dubG9hZDogXCLkuIvovb3mlofmoaNcIixcblx0XHRmb3JtOiBbe1xuXHRcdFx0cHJvamVjdDogXCLpgIDkv51cIixcblx0XHRcdGNvbnRlbnQ6IFwi5Zyo5Ya36Z2Z5pyf5ZCO6Kej6Zmk5ZCI5ZCM77yM5YWs5Y+45bCG6YCA6L+Y5L+d5Y2V546w6YeR5Lu35YC85oiW5pyq5ruh5pyf5YeA5L+d6LS544CC77yI5b6F5Lqn5ZOB57K+566X56Gu6K6k77yJXCIsXG5cdFx0XHRhcHBsaWNhbnQ6IFwi5oqV5L+d5Lq6XCIsXG5cdFx0XHRyZWNlcHRpb25UaW1lOiBcIuS/neWNleaViOWKm+e7iOatouWJjVwiLFxuXHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIuS/nemZqeWNlVwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLnlLPor7fkuaZcIixcblx0XHRcdFx0dHlwZTogMSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5oqV5L+d5Lq65pyJ5pWI6Lqr5Lu96K+B5Lu2XCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuWtmOaKmOmTtuihjOWNoeebuOWFs1wiLFxuXHRcdFx0fVxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHByb2plY3Q6IFwi5Ya36Z2Z5pyf6YCA5L+dXCIsXG5cdFx0XHRjb250ZW50OiBcIuWcqOWGt+mdmeacn+WGheaPkOWHuuino+mZpOWQiOWQjO+8jOWFrOWPuOS8muaXoOaBr+mAgOi/mOWFqOmDqOS/nei0uVwiLFxuXHRcdFx0YXBwbGljYW50OiBcIuaKleS/neS6ulwiLFxuXHRcdFx0cmVjZXB0aW9uVGltZTogXCLlhrfpnZnmnJ/nu5PmnZ/liY1cIixcblx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLkv53pmanljZVcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi55Sz6K+35LmmXCIsXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIuaKleS/neS6uuacieaViOi6q+S7veivgeS7tlwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLlrZjmipjpk7booYzljaHnm7jlhbNcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi6aaW5pyf5L+d6LS55Y+R56WoXCIsXG5cdFx0XHR9XG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cHJvamVjdDogXCLlrqLmiLfotYTmlpnlj5jmm7RcIixcblx0XHRcdHByb2plY3RUeXBlOiAxLFxuXHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2VcIixcblx0XHRcdHF1ZXJ5OiB7XG5cdFx0XHRcdHE6IFwibTQyXCJcblx0XHRcdH0sXG5cdFx0XHRjb250ZW50OiBcIuaKleS/neS6uuOAgeWPl+S/neS6uuOAgeWPl+ebiuS6uueahOS4quS6uuS/oeaBr+WPmOabtFwiLFxuXHRcdFx0YXBwbGljYW50OiBcIuaKleS/neS6ulwiLFxuXHRcdFx0cmVjZXB0aW9uVGltZTogXCLkuI3pmZBcIixcblx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLnlLPor7fkuaZcIixcblx0XHRcdFx0dHlwZTogMSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5b+F6KaB55qE6K+B5piO5p2Q5paZXCIsXG5cdFx0XHR9XG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cHJvamVjdDogXCLogZTns7vkv6Hmga/lj5jmm7RcIixcblx0XHRcdHByb2plY3RUeXBlOiAxLFxuXHRcdFx0cGF0aDogXCIvY3VzdG9tL3NlcnZpY2VcIixcblx0XHRcdHF1ZXJ5OiB7XG5cdFx0XHRcdHE6IFwibTQzXCJcblx0XHRcdH0sXG5cdFx0XHRjb250ZW50OiBcIuWcsOWdgOOAgeeUteivneetieS/oeaBr+eahOWPmOabtFwiLFxuXHRcdFx0YXBwbGljYW50OiBcIuaKleS/neS6ulwiLFxuXHRcdFx0cmVjZXB0aW9uVGltZTogXCLkuI3pmZBcIixcblx0XHRcdG1hdGVyaWFsTGlzdDogW3tcblx0XHRcdFx0bmFtZTogXCLnlLPor7fkuaZcIixcblx0XHRcdFx0dHlwZTogMSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwi5oqV5L+d5Lq65pyJ5pWI6Lqr5Lu96K+B5Lu2XCIsXG5cdFx0XHR9XG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cHJvamVjdDogXCLkuqTotLnmlrnlvI/lj5jmm7RcIixcblx0XHRcdGNvbnRlbnQ6IFwi5pu05pS55L+d5Y2V55qE57ut5pyf5Lqk6LS55pa55byP5oiW5Lqk6LS56LSm5Y+3XCIsXG5cdFx0XHRhcHBsaWNhbnQ6IFwi5oqV5L+d5Lq6XCIsXG5cdFx0XHRyZWNlcHRpb25UaW1lOiBcIuS/neWNleS6pOi0ueacn+a7oeWJjVwiLFxuXHRcdFx0bWF0ZXJpYWxMaXN0OiBbe1xuXHRcdFx0XHRuYW1lOiBcIueUs+ivt+S5plwiLFxuXHRcdFx0XHR0eXBlOiAxLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCLkv53pmanljZVcIixcblx0XHRcdH1cblx0XHRcdF0sXG5cdFx0fSxcblx0XHRdXG5cdH0sXG5cdHBvbGljeUNoYW5nZUNvbnRhY3Q6IHtcblx0XHRwaG9uZTogXCLogZTns7vnlLXor51cIixcblx0XHRhZGRyZXNzOiBcIuiBlOezu+WcsOWdgFwiLFxuXHRcdGVtYWlsOiBcIkUtTWFpbFwiLFxuXHRcdGNoZWNrVGlwczogXCLmnKzkurrkuI3lkIzmhI/mjqXmlLblrqPkvKDkv6Hmga9cIixcblx0XHRzdWJtaXQ6IFwi56Gu6K6k5L+u5pS5XCIsXG5cdFx0ZXJyb3JUaXBzOiB7XG5cdFx0XHRlMTogXCLoq4vloavlr6vmraPnorrnmoToga/nuavpm7voqbFcIixcblx0XHRcdGUyOiBcIuiri+Whq+Wvq+iBr+e5q+WcsOWdgFwiLFxuXHRcdFx0ZTM6IFwi6KuL5aGr5a+r5q2j56K655qERS1NYWls5Zyw5Z2AXCJcblx0XHR9LFxuXHRcdHN1Y2Nlc3M6IFwi5pu05paw5oiQ5YqfXCIsXG5cdH0sXG5cdHBvbGljeUNoYW5nZUluZm9ybWF0aW9uOiB7XG5cdFx0dGl0bGU6IFwi5a6i5oi36LWE5paZ5Y+Y5pu0XCIsXG5cdFx0b3duZXI6IFwi5oqV5L+d5Lq6XCIsXG5cdFx0aW5zdXJlZDogXCLlj5fkv53kurpcIixcblx0XHRvYmo6IFwi5Y+Y5pu05a+56LGhXCIsXG5cdFx0bmFtZTogXCLlp5PlkI1cIixcblx0XHRzZXg6IFwi5oCn5YirXCIsXG5cdFx0YmlydGg6IFwi5Ye655Sf5pel5pyfXCIsXG5cdFx0dHlwZTogXCLor4Hku7bnsbvlnotcIixcblx0XHROTzogXCLor4Hku7blj7fnoIFcIixcblx0XHR2YWxpZGl0eVBlcmlvZDogXCLor4Hku7bmnInmlYjmnJ9cIixcblx0XHRuYXRpb25hbGl0eTogXCLlm73nsY1cIixcblx0XHRlbXBsb3llcjogXCLlt6XkvZzljZXkvY1cIixcblx0XHRtYXJpdGFsU3RhdHVzOiBcIuWpmuWnu+eKtuWGtVwiLFxuXHRcdHN1Ym1pdDogXCLnoa7orqTkv67mlLlcIixcblx0XHR1cGxvYWQ6IFwi6ZmE5Lu25LiK5LygXCIsXG5cdFx0bW9kaWZ5VGlwczE6IFwi5aaC6ZyA5L+u5pS56K+3XCIsXG5cdFx0bW9kaWZ5VGlwczI6IFwi6IGU57O75a6i5pyNXCIsXG5cdFx0c3VjY2VzczogXCLmm7TmlrDmiJDlip9cIixcblx0fSxcblx0Y29udGFjdFVzOiB7XG5cdFx0c2VydmljZToge1xuXHRcdFx0Y2VudGVyOiB7XG5cdFx0XHRcdHRpdGxlOiBcIuWuouaIt+acjeWKoeS4reW/g1wiLFxuXHRcdFx0XHRhZGRyZXNzOiBcIuWcsOWdgO+8mummmea4r+WwluaymeWYtOa4r+WogeawuOmHkeiejeWkp+alvFwiLFxuXHRcdFx0XHR0aW1lOiBcIuacjeWKoeaXtumXtO+8muaYn+acn+S4gOiHs+S6lDk6MDAtMTg6MDBcIixcblx0XHRcdH0sXG5cdFx0XHRob3RsaW5lOiB7XG5cdFx0XHRcdHRpdGxlOiBcIuWuouaIt+acjeWKoeeDree6v1wiLFxuXHRcdFx0XHRoazogXCLpppnmuK/lj7fnoIHvvJooODUyKTI5ODMgODg2NlwiLFxuXHRcdFx0XHRjbjogXCLlhoXlnLDlj7fnoIHvvJooODYpNDAwNzggOTU1MTFcIixcblx0XHRcdFx0dGltZTogXCLmnI3liqHml7bpl7TvvJrmmJ/mnJ/kuIDoh7PkupQ5OjAwLTE4OjAwXCJcblx0XHRcdH0sXG5cdFx0XHRtYWlsOiB7XG5cdFx0XHRcdHRpdGxlOiBcIuWuouaIt+acjeWKoeeUtemCrlwiLFxuXHRcdFx0XHRtYWlsOiBcImNzQHBpbmdhbi5jb20uaGtcIlxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cHVsYmljOiB7XG5cdFx0XHR0aXRsZTogXCLlvq7kv6HlhazkvJflj7dcIixcblx0XHRcdG0xOiBcIueZu+mZhuOAjOW+ruS/oeOAjUFQUO+8jCDmjInlj7PkuIrop5LnmoTjgIwr44CN5oyJ6ZKu5Lim6YCJ5oup44CM5re75Yqg5pyL5Y+L44CN77yM6YCJ5oup44CM5YWs5LyX5Y+344CNIOi+k+WFpeW5tuaQnOe0ouOAjOW5s+WuieS6uuWvv+mmmea4r+OAjVwiLFxuXHRcdFx0bTI6IFwi55m76ZmG44CM5b6u5L+h44CNQVBQ77yMIOaMieWPs+S4iuinkueahOOAjCvjgI3mjInpkq7kuKbpgInmi6njgIzmiavkuIDmiavjgI3miavmj4/kuIvmlrnkuoznu7TnoIHvvIjmlL7nva7kuoznu7TnoIHvvIlcIlxuXHRcdH0sXG5cdFx0cXJjb2RlOiB7XG5cdFx0XHR0aXRsZTogXCLlrpjmlrnlhazkvJflj7dcIlxuXHRcdH1cblx0fSxcblx0Y3VzdG9tU2VydmljZToge1xuXHRcdG5hbWU6IFwi5a6i5oi35pyN5YqhXCIsXG5cdFx0bWVudTE6IFwi6IGU57O75oiR5LusXCIsXG5cdFx0bWVudTI6IFwi57y05LuY5L+d6LS5XCIsXG5cdFx0bWVudTM6IFwi5L+d5Y2V5p+l6K+iXCIsXG5cdFx0bWVudTQ6IFwi5L+d5Y2V5Y+Y5pu0XCIsXG5cdFx0bWVudTQxOiBcIuS/neWNleWPmOabtOaMh+W8lVwiLFxuXHRcdG1lbnU0MjogXCLogZTns7vmlrnlvI/lj5jmm7RcIixcblx0XHRtZW51NDM6IFwi5a6i5oi36LWE5paZ5Y+Y5pu0XCIsXG5cdFx0bWVudTU6IFwi55CG6LWU55Sz6K+3XCIsXG5cdFx0bWVudTY6IFwi6aKE57qm5pyN5YqhXCIsXG5cdFx0bWVudTc6IFwi5oqV6K+J5Y+X55CGXCIsXG5cdFx0bWVudTg6IFwi5bi455So6KGo5qC8XCIsXG5cdFx0aW5zdXJhbmNlUXVlcnk6IHtcblx0XHRcdG1vZGlmeSA6IFwi5L+u5pS5XCIsXG5cdFx0XHRcblx0XHRcdEluc3VyYW50TnVtYmVyOiBcIuS/neWNleWPt+eggVwiLFxuXHRcdFx0SW5zdXJhbnQ6IFwi5Y+X5L+d5Lq6XCIsXG5cdFx0XHRJbnN1cmFudE5hbWU6IFwi6Zmp56eN5ZCN56ewXCIsXG5cdFx0XHRJbnN1cmFudEFtb3VudDogXCLkv53pop1cIixcblx0XHRcdGVmZmVjdGl2ZURhdGU6IFwi5L+d6LS55Yiw5pyf5pelXCIsXG5cdFx0XHRwZXJpb2Q6IFwi5L+d6Zqc5bm05pyfXCIsXG5cblxuXHRcdFx0dDJUaXRsZTogXCLkv53llq7kv6Hmga9cIixcblx0XHRcdHQybjE6IFwi6Zmp56eN5ZCN56ewXCIsXG5cdFx0XHR0Mm4yOiBcIuS/neminVwiLFxuXHRcdFx0dDJuMzogXCLnlJ/mlYjml6XmnJ9cIixcblx0XHRcdHQybjQ6IFwi5L+d6Zqc5bm05pyfXCIsXG5cdFx0XHR0Mm41OiBcIuWPl+S/neS6uuWnk+WQje+8iOS4reaWh++8iVwiLFxuXHRcdFx0dDJuNjogXCLlj5fkv53kurrlp5PlkI3vvIjoi7HmlofvvIlcIixcblx0XHRcdHQybjc6IFwi5Ye655Sf5pel5pyfXCIsXG5cdFx0XHR0Mm44OiBcIuivgeS7tuWPt+eggVwiLFxuXG5cdFx0XHR0M1RpdGxlOiBcIuWuouaIt+i1hOaWmVwiLFxuXHRcdFx0dDNuMTogXCLmipXkv53kurrlp5PlkI3vvIjkuK3mlofvvIlcIixcblx0XHRcdHQzbjI6IFwi5oqV5L+d5Lq65aeT5ZCN77yI6Iux5paH77yJXCIsXG5cdFx0XHR0M24zOiBcIuWHuueUn+aXpeacn1wiLFxuXHRcdFx0dDNuNDogXCLor4Hku7blj7fnoIFcIixcblx0XHRcdHQzbjU6IFwi6IGU57O75Zyw5Z2AXCIsXG5cdFx0XHR0M242OiBcIuWxheS9j+WcsOWdgFwiLFxuXHRcdFx0dDNuNzogXCLmiYvmj5DnlLXor51cIixcblx0XHRcdHQzbjg6IFwi55S15a2Q6YKu566xXCIsXG5cblx0XHRcdHQ0VGl0bGU6IFwi5Y+X55uK5Lq66LWE5paZXCIsIC8vIHQ0QmVuZWZpY2lhcnlJbmZvcm1hdGlvblxuXHRcdFx0dDROYW1lQ246IFwi5aeT5ZCN77yI5Lit5paH77yJXCIsXG5cdFx0XHR0NE5hbWVFbjogXCLlp5PlkI3vvIjoi7HmlofvvIlcIixcblx0XHRcdHQ0UmVsYXRpb246IFwi5LiO5Y+X5L+d5Lq65YWz57O7XCIsXG5cdFx0XHR0NEFsbG9jYXRpb246IFwi5YiG6YWN5q+U5L6LXCIsXG5cblx0XHRcdHQ1VGl0bGU6IFwi57y06LS56LWE5paZXCIsXG5cdFx0XHR0NVBheW1lbnRQZXJpb2Q6IFwi57y06LS55bm05pyfXCIsXG5cdFx0XHR0NVBheW1lbnRNZXRob2Q6IFwi57y06LS55pa55byPXCIsXG5cdFx0XHR0NVBheW1lbnRDdXJyZW5jeTogXCLnvLTotLnluIHnp41cIixcblx0XHRcdHQ1Q3VycmVudFByZW1pdW06IFwi5b2T5pyf5L+d6LS5XCIsXG5cdFx0XHR0NVBheW1lbnRCYW5rOiBcIue8tOi0uemTtuihjFwiLFxuXHRcdFx0dDVQYXltZW50QWNjb3VudDogXCLnvLTotLnotKblj7dcIixcblxuXHRcdFx0dDZUaXRsZTogXCLnvLTotLnorrDlvZVcIixcblx0XHRcdHQ2UGF5bWVudFBlcmlvZDogXCLnvLTotLnmnJ9cIixcblx0XHRcdHQ2UGF5bWVudE1ldGhvZDogXCLnvLTotLnmlrnlvI9cIixcblx0XHRcdHQ2Q2xvc2luZ0RhdGU6IFwi5a6e5pS25pel5pyfXCIsXG5cdFx0XHR0NlBheW1lbnRBbW91bnQ6IFwi57y06LS56YeR6aKdXCIsXG5cblx0XHRcdHNob3dNb3JlOiBcIuaYvuekuuaJgOacieS/neWNlVwiLFxuXHRcdFx0bm9Qb2xpY3k6IFwi5oKo6L+Y5pyq6LSt5Lmw5L+d5Y2V77yM5aaC5pyJ55aR6Zeu6K+3XCIsXG5cdFx0XHRjdXN0b21TZXJ2aWNlOiBcIuiBlOezu+WuouacjVwiLFxuXHRcdH0sXG5cdFx0dW5hdXRoOiB7XG5cdFx0XHR0aXBzOiBcIuWmguaCqOacieW5s+WuieS4gOi0pumAmui0puaIt++8jOWPr+W4ruWKqeaIkeS7rOabtOWlveWcsOS4uuaCqOaPkOS+m+acjeWKoVwiLFxuXHRcdFx0b3I6IFwi5oiWXCIsXG5cdFx0XHRsb2dpbjogXCLnmbvlvZVcIixcblx0XHRcdHJlZ2lzdGVyOiBcIuazqOWGjFwiLFxuXHRcdFx0YmFzZUluZm9UaXA6IFwi5oKo55qE5a6M5pW05L+h5oGv5Y+v5biu5Yqp5oiR5Lus5Li65oKo5o+Q5L6b5a6M5pW05pyN5YqhXCIsXG5cdFx0XHRpbmZvQnRuOiBcIuWJjeW+gOWujOWWhFwiXG5cdFx0fVxuXHR9LFxuXHRwYWdpbmF0aW9uOiB7XG5cdFx0Zmlyc3RQYWdlOiBcIuS4iuS4gOmhtVwiLFxuXHRcdG5leHRQYWdlOiBcIuS4i+S4gOmhtVwiLFxuXHRcdGdvdG86IFwi6Lez6L2sXCIsXG5cdFx0cGVyOiBcIuesrFwiLFxuXHRcdHBhZ2U6IFwi6aG1XCJcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUpBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBMUJBO0FBa0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBRkE7QUFSQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFGQTtBQW5DQTtBQTBDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBRkE7QUFsQkE7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBUEE7QUFqSEE7QUFnSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQTtBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQW5CQTtBQWdDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQTFCQTtBQXlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUExQkE7QUFtQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBRkE7QUE3QkE7QUFrQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFuREE7QUE2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQWJBO0FBSEE7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBakJBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUF0QkE7QUEyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQVBBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBSEE7QUFyQ0E7QUE4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBRkE7QUFqRUE7QUEyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFJQTtBQURBO0FBZkE7QUFxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBSUE7QUFEQTtBQUlBO0FBREE7QUFsQkE7QUF3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBZEE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQURBO0FBZEE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBREE7QUFUQTtBQTFGQTtBQTBHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFYQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbEJBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBRkE7QUFaQTtBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQURBO0FBdkJBO0FBMkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQXJEQTtBQXVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBcEVBO0FBNkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBMXZCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/common/lang/zh.js\n");

/***/ }),

/***/ "./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&":
/*!***************************************************************************!*\
  !*** ./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js& ***!
  \***************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./dropdown.js?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24uanM/ZjBjYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0xMi0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fYmFiZWwtbG9hZGVyQDguMC42QGJhYmVsLWxvYWRlci9saWIvaW5kZXguanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19lc2xpbnQtbG9hZGVyQDIuMi4xQGVzbGludC1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTMtMCEuL2Ryb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0xMi0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fYmFiZWwtbG9hZGVyQDguMC42QGJhYmVsLWxvYWRlci9saWIvaW5kZXguanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19lc2xpbnQtbG9hZGVyQDIuMi4xQGVzbGludC1sb2FkZXIvaW5kZXguanM/P3JlZi0tMTMtMCEuL2Ryb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./src/components/home/dropdown/dropdown.vue":
/*!***************************************************!*\
  !*** ./src/components/home/dropdown/dropdown.vue ***!
  \***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& */ \"./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\");\n/* harmony import */ var _dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dropdown.js?vue&type=script&lang=js& */ \"./src/components/home/dropdown/dropdown.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n  _dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n  _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n  false,\n  null,\n  \"3b4f35af\",\n  null\n  \n)\n\n/* hot reload */\nif (true) {\n  var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n  api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n  if (api.compatible) {\n    module.hot.accept()\n    if (!api.isRecorded('3b4f35af')) {\n      api.createRecord('3b4f35af', component.options)\n    } else {\n      api.reload('3b4f35af', component.options)\n    }\n    module.hot.accept(/*! ./dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& */ \"./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& */ \"./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\");\n(function () {\n      api.rerender('3b4f35af', {\n        render: _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n        staticRenderFns: _dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n      })\n    })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n  }\n}\ncomponent.options.__file = \"src/components/home/dropdown/dropdown.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZHJvcGRvd24vZHJvcGRvd24udnVlPzI1YWMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSBmcm9tIFwiLi9kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9M2I0ZjM1YWYmc2NvcGVkPXRydWUmXCJcbmltcG9ydCBzY3JpcHQgZnJvbSBcIi4vZHJvcGRvd24uanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Ryb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5pbXBvcnQgc3R5bGUwIGZyb20gXCIuL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcIlxudmFyIGNvbXBvbmVudCA9IG5vcm1hbGl6ZXIoXG4gIHNjcmlwdCxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBcIjNiNGYzNWFmXCIsXG4gIG51bGxcbiAgXG4pXG5cbi8qIGhvdCByZWxvYWQgKi9cbmlmIChtb2R1bGUuaG90KSB7XG4gIHZhciBhcGkgPSByZXF1aXJlKFwiL1VzZXJzL2pvZS9Eb2N1bWVudHMvZ2l0L3Bpbmdhbi9oa2xpZmUvcGluZ2FuLWxpZmUtaW5kZXgtcHJvL25vZGVfbW9kdWxlcy9fdnVlLWhvdC1yZWxvYWQtYXBpQDIuMy40QHZ1ZS1ob3QtcmVsb2FkLWFwaS9kaXN0L2luZGV4LmpzXCIpXG4gIGFwaS5pbnN0YWxsKHJlcXVpcmUoJ3Z1ZScpKVxuICBpZiAoYXBpLmNvbXBhdGlibGUpIHtcbiAgICBtb2R1bGUuaG90LmFjY2VwdCgpXG4gICAgaWYgKCFhcGkuaXNSZWNvcmRlZCgnM2I0ZjM1YWYnKSkge1xuICAgICAgYXBpLmNyZWF0ZVJlY29yZCgnM2I0ZjM1YWYnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbG9hZCgnM2I0ZjM1YWYnLCBjb21wb25lbnQub3B0aW9ucylcbiAgICB9XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoXCIuL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zYjRmMzVhZiZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCczYjRmMzVhZicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvaG9tZS9kcm9wZG93bi9kcm9wZG93bi52dWVcIlxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/components/home/dropdown/dropdown.vue\n");

/***/ }),

/***/ "./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&":
/*!*************************************************************************************************************!*\
  !*** ./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& ***!
  \*************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_style_index_0_id_3b4f35af_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT9iY2E3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9M2I0ZjM1YWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTNiNGYzNWFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/dropdown/dropdown.vue?vue&type=style&index=0&id=3b4f35af&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&":
/*!**********************************************************************************************!*\
  !*** ./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& ***!
  \**********************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./dropdown.vue?vue&type=template&id=3b4f35af&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"274ecb62-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_dropdown_vue_vue_type_template_id_3b4f35af_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zYjRmMzVhZiZzY29wZWQ9dHJ1ZSYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL2Ryb3Bkb3duL2Ryb3Bkb3duLnZ1ZT9hMTA1Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCItIWNhY2hlLWxvYWRlcj97XFxcImNhY2hlRGlyZWN0b3J5XFxcIjpcXFwibm9kZV9tb2R1bGVzLy5jYWNoZS92dWUtbG9hZGVyXFxcIixcXFwiY2FjaGVJZGVudGlmaWVyXFxcIjpcXFwiMjc0ZWNiNjItdnVlLWxvYWRlci10ZW1wbGF0ZVxcXCJ9IS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTNiNGYzNWFmJnNjb3BlZD10cnVlJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/components/home/dropdown/dropdown.vue?vue&type=template&id=3b4f35af&scoped=true&\n");

/***/ }),

/***/ "./src/components/home/footer/footer.js?vue&type=script&lang=js&":
/*!***********************************************************************!*\
  !*** ./src/components/home/footer/footer.js?vue&type=script&lang=js& ***!
  \***********************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_footer_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./footer.js?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/footer/footer.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_footer_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9mb290ZXIvZm9vdGVyLmpzPzlmNmMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9mb290ZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2VzbGludC1sb2FkZXJAMi4yLjFAZXNsaW50LWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMy0wIS4vZm9vdGVyLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/footer/footer.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./src/components/home/footer/footer.vue":
/*!***********************************************!*\
  !*** ./src/components/home/footer/footer.vue ***!
  \***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./footer.vue?vue&type=template&id=f678fc22&scoped=true& */ \"./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\");\n/* harmony import */ var _footer_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./footer.js?vue&type=script&lang=js& */ \"./src/components/home/footer/footer.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n  _footer_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n  _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n  false,\n  null,\n  \"f678fc22\",\n  null\n  \n)\n\n/* hot reload */\nif (true) {\n  var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n  api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n  if (api.compatible) {\n    module.hot.accept()\n    if (!api.isRecorded('f678fc22')) {\n      api.createRecord('f678fc22', component.options)\n    } else {\n      api.reload('f678fc22', component.options)\n    }\n    module.hot.accept(/*! ./footer.vue?vue&type=template&id=f678fc22&scoped=true& */ \"./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./footer.vue?vue&type=template&id=f678fc22&scoped=true& */ \"./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\");\n(function () {\n      api.rerender('f678fc22', {\n        render: _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n        staticRenderFns: _footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n      })\n    })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n  }\n}\ncomponent.options.__file = \"src/components/home/footer/footer.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9mb290ZXIvZm9vdGVyLnZ1ZT8xZDIzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vZm9vdGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1mNjc4ZmMyMiZzY29wZWQ9dHJ1ZSZcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9mb290ZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvb3Rlci5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIFwiZjY3OGZjMjJcIixcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgdmFyIGFwaSA9IHJlcXVpcmUoXCIvVXNlcnMvam9lL0RvY3VtZW50cy9naXQvcGluZ2FuL2hrbGlmZS9waW5nYW4tbGlmZS1pbmRleC1wcm8vbm9kZV9tb2R1bGVzL192dWUtaG90LXJlbG9hZC1hcGlAMi4zLjRAdnVlLWhvdC1yZWxvYWQtYXBpL2Rpc3QvaW5kZXguanNcIilcbiAgYXBpLmluc3RhbGwocmVxdWlyZSgndnVlJykpXG4gIGlmIChhcGkuY29tcGF0aWJsZSkge1xuICAgIG1vZHVsZS5ob3QuYWNjZXB0KClcbiAgICBpZiAoIWFwaS5pc1JlY29yZGVkKCdmNjc4ZmMyMicpKSB7XG4gICAgICBhcGkuY3JlYXRlUmVjb3JkKCdmNjc4ZmMyMicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVsb2FkKCdmNjc4ZmMyMicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH1cbiAgICBtb2R1bGUuaG90LmFjY2VwdChcIi4vZm9vdGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD1mNjc4ZmMyMiZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCdmNjc4ZmMyMicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvaG9tZS9mb290ZXIvZm9vdGVyLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/footer/footer.vue\n");

/***/ }),

/***/ "./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&":
/*!*********************************************************************************************************!*\
  !*** ./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& ***!
  \*********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_style_index_0_id_f678fc22_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9ZjY3OGZjMjImbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/MmUzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2Zvb3Rlci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD1mNjc4ZmMyMiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZm9vdGVyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPWY2NzhmYzIyJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/footer/footer.vue?vue&type=style&index=0&id=f678fc22&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&":
/*!******************************************************************************************!*\
  !*** ./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true& ***!
  \******************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./footer.vue?vue&type=template&id=f678fc22&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"274ecb62-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_footer_vue_vue_type_template_id_f678fc22_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2Zvb3Rlci9mb290ZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPWY2NzhmYzIyJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvZm9vdGVyL2Zvb3Rlci52dWU/NzZiOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLSFjYWNoZS1sb2FkZXI/e1xcXCJjYWNoZURpcmVjdG9yeVxcXCI6XFxcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclxcXCIsXFxcImNhY2hlSWRlbnRpZmllclxcXCI6XFxcIjI3NGVjYjYyLXZ1ZS1sb2FkZXItdGVtcGxhdGVcXFwifSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2Zvb3Rlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9ZjY3OGZjMjImc2NvcGVkPXRydWUmXCIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/footer/footer.vue?vue&type=template&id=f678fc22&scoped=true&\n");

/***/ }),

/***/ "./src/components/home/header/header.js?vue&type=script&lang=js&":
/*!***********************************************************************!*\
  !*** ./src/components/home/header/header.js?vue&type=script&lang=js& ***!
  \***********************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_header_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./header.js?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/header/header.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_header_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9oZWFkZXIvaGVhZGVyLmpzPzIyZDMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9oZWFkZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2VzbGludC1sb2FkZXJAMi4yLjFAZXNsaW50LWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMy0wIS4vaGVhZGVyLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/header/header.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./src/components/home/header/header.vue":
/*!***********************************************!*\
  !*** ./src/components/home/header/header.vue ***!
  \***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./header.vue?vue&type=template&id=6fba8daf&scoped=true& */ \"./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\");\n/* harmony import */ var _header_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./header.js?vue&type=script&lang=js& */ \"./src/components/home/header/header.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n  _header_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n  _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n  false,\n  null,\n  \"6fba8daf\",\n  null\n  \n)\n\n/* hot reload */\nif (true) {\n  var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n  api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n  if (api.compatible) {\n    module.hot.accept()\n    if (!api.isRecorded('6fba8daf')) {\n      api.createRecord('6fba8daf', component.options)\n    } else {\n      api.reload('6fba8daf', component.options)\n    }\n    module.hot.accept(/*! ./header.vue?vue&type=template&id=6fba8daf&scoped=true& */ \"./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./header.vue?vue&type=template&id=6fba8daf&scoped=true& */ \"./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\");\n(function () {\n      api.rerender('6fba8daf', {\n        render: _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n        staticRenderFns: _header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n      })\n    })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n  }\n}\ncomponent.options.__file = \"src/components/home/header/header.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9oZWFkZXIvaGVhZGVyLnZ1ZT9lOTM1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vaGVhZGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02ZmJhOGRhZiZzY29wZWQ9dHJ1ZSZcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9oZWFkZXIuanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRlci5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJlwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIFwiNmZiYThkYWZcIixcbiAgbnVsbFxuICBcbilcblxuLyogaG90IHJlbG9hZCAqL1xuaWYgKG1vZHVsZS5ob3QpIHtcbiAgdmFyIGFwaSA9IHJlcXVpcmUoXCIvVXNlcnMvam9lL0RvY3VtZW50cy9naXQvcGluZ2FuL2hrbGlmZS9waW5nYW4tbGlmZS1pbmRleC1wcm8vbm9kZV9tb2R1bGVzL192dWUtaG90LXJlbG9hZC1hcGlAMi4zLjRAdnVlLWhvdC1yZWxvYWQtYXBpL2Rpc3QvaW5kZXguanNcIilcbiAgYXBpLmluc3RhbGwocmVxdWlyZSgndnVlJykpXG4gIGlmIChhcGkuY29tcGF0aWJsZSkge1xuICAgIG1vZHVsZS5ob3QuYWNjZXB0KClcbiAgICBpZiAoIWFwaS5pc1JlY29yZGVkKCc2ZmJhOGRhZicpKSB7XG4gICAgICBhcGkuY3JlYXRlUmVjb3JkKCc2ZmJhOGRhZicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVsb2FkKCc2ZmJhOGRhZicsIGNvbXBvbmVudC5vcHRpb25zKVxuICAgIH1cbiAgICBtb2R1bGUuaG90LmFjY2VwdChcIi4vaGVhZGVyLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD02ZmJhOGRhZiZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCc2ZmJhOGRhZicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvaG9tZS9oZWFkZXIvaGVhZGVyLnZ1ZVwiXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/header/header.vue\n");

/***/ }),

/***/ "./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&":
/*!*********************************************************************************************************!*\
  !*** ./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& ***!
  \*********************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_style_index_0_id_6fba8daf_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmZiYThkYWYmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/NDEzYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2hlYWRlci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD02ZmJhOGRhZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtc3R5bGUtbG9hZGVyQDQuMS4yQHZ1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jc3MtbG9hZGVyQDEuMC4xQGNzcy1sb2FkZXIvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Bvc3Rjc3MtbG9hZGVyQDMuMC4wQHBvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Nhc3MtbG9hZGVyQDcuMy4xQHNhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTgtb25lT2YtMS0zIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY2FjaGUtbG9hZGVyQDIuMC4xQGNhY2hlLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0wLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vaGVhZGVyLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTZmYmE4ZGFmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/header/header.vue?vue&type=style&index=0&id=6fba8daf&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&":
/*!******************************************************************************************!*\
  !*** ./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true& ***!
  \******************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./header.vue?vue&type=template&id=6fba8daf&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"274ecb62-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_header_vue_vue_type_template_id_6fba8daf_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL2hlYWRlci9oZWFkZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZmYmE4ZGFmJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hvbWUvaGVhZGVyL2hlYWRlci52dWU/ZTljYSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLSFjYWNoZS1sb2FkZXI/e1xcXCJjYWNoZURpcmVjdG9yeVxcXCI6XFxcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclxcXCIsXFxcImNhY2hlSWRlbnRpZmllclxcXCI6XFxcIjI3NGVjYjYyLXZ1ZS1sb2FkZXItdGVtcGxhdGVcXFwifSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2hlYWRlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NmZiYThkYWYmc2NvcGVkPXRydWUmXCIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/header/header.vue?vue&type=template&id=6fba8daf&scoped=true&\n");

/***/ }),

/***/ "./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&":
/*!*******************************************************************************!*\
  !*** ./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js& ***!
  \*******************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_m_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!./m-dropdown.js?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_m_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi5qcz8wMTU4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTEyLTAhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19iYWJlbC1sb2FkZXJAOC4wLjZAYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcyEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2VzbGludC1sb2FkZXJAMi4yLjFAZXNsaW50LWxvYWRlci9pbmRleC5qcz8/cmVmLS0xMy0wIS4vbS1kcm9wZG93bi5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9tLWRyb3Bkb3duLmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./src/components/home/m-dropdown/m-dropdown.vue":
/*!*******************************************************!*\
  !*** ./src/components/home/m-dropdown/m-dropdown.vue ***!
  \*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& */ \"./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\");\n/* harmony import */ var _m_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./m-dropdown.js?vue&type=script&lang=js& */ \"./src/components/home/m-dropdown/m-dropdown.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n  _m_dropdown_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n  _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n  false,\n  null,\n  \"04c55e2f\",\n  null\n  \n)\n\n/* hot reload */\nif (true) {\n  var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n  api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n  if (api.compatible) {\n    module.hot.accept()\n    if (!api.isRecorded('04c55e2f')) {\n      api.createRecord('04c55e2f', component.options)\n    } else {\n      api.reload('04c55e2f', component.options)\n    }\n    module.hot.accept(/*! ./m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& */ \"./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& */ \"./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\");\n(function () {\n      api.rerender('04c55e2f', {\n        render: _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n        staticRenderFns: _m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n      })\n    })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n  }\n}\ncomponent.options.__file = \"src/components/home/m-dropdown/m-dropdown.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/MWU0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL20tZHJvcGRvd24udnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTA0YzU1ZTJmJnNjb3BlZD10cnVlJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL20tZHJvcGRvd24uanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL20tZHJvcGRvd24uanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wNGM1NWUyZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCJcblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5pbXBvcnQgbm9ybWFsaXplciBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgXCIwNGM1NWUyZlwiLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAobW9kdWxlLmhvdCkge1xuICB2YXIgYXBpID0gcmVxdWlyZShcIi9Vc2Vycy9qb2UvRG9jdW1lbnRzL2dpdC9waW5nYW4vaGtsaWZlL3Bpbmdhbi1saWZlLWluZGV4LXByby9ub2RlX21vZHVsZXMvX3Z1ZS1ob3QtcmVsb2FkLWFwaUAyLjMuNEB2dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qc1wiKVxuICBhcGkuaW5zdGFsbChyZXF1aXJlKCd2dWUnKSlcbiAgaWYgKGFwaS5jb21wYXRpYmxlKSB7XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICAgIGlmICghYXBpLmlzUmVjb3JkZWQoJzA0YzU1ZTJmJykpIHtcbiAgICAgIGFwaS5jcmVhdGVSZWNvcmQoJzA0YzU1ZTJmJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZWxvYWQoJzA0YzU1ZTJmJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfVxuICAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNGM1NWUyZiZzY29wZWQ9dHJ1ZSZcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgYXBpLnJlcmVuZGVyKCcwNGM1NWUyZicsIHtcbiAgICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICAgIHN0YXRpY1JlbmRlckZuczogc3RhdGljUmVuZGVyRm5zXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbmNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9IFwic3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlXCJcbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/m-dropdown/m-dropdown.vue\n");

/***/ }),

/***/ "./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&":
/*!*****************************************************************************************************************!*\
  !*** ./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& ***!
  \*****************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_style_index_0_id_04c55e2f_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wNGM1NWUyZiZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlPzg0MDEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTA0YzU1ZTJmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTA0YzU1ZTJmJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/m-dropdown/m-dropdown.vue?vue&type=style&index=0&id=04c55e2f&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&":
/*!**************************************************************************************************!*\
  !*** ./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& ***!
  \**************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"274ecb62-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_m_dropdown_vue_vue_type_template_id_04c55e2f_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvY29tcG9uZW50cy9ob21lL20tZHJvcGRvd24vbS1kcm9wZG93bi52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MDRjNTVlMmYmc2NvcGVkPXRydWUmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaG9tZS9tLWRyb3Bkb3duL20tZHJvcGRvd24udnVlPzQ2OGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi0hY2FjaGUtbG9hZGVyP3tcXFwiY2FjaGVEaXJlY3RvcnlcXFwiOlxcXCJub2RlX21vZHVsZXMvLmNhY2hlL3Z1ZS1sb2FkZXJcXFwiLFxcXCJjYWNoZUlkZW50aWZpZXJcXFwiOlxcXCIyNzRlY2I2Mi12dWUtbG9hZGVyLXRlbXBsYXRlXFxcIn0hLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL192dWUtbG9hZGVyQDE1LjcuMUB2dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3RlbXBsYXRlTG9hZGVyLmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9tLWRyb3Bkb3duLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0wNGM1NWUyZiZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/components/home/m-dropdown/m-dropdown.vue?vue&type=template&id=04c55e2f&scoped=true&\n");

/***/ }),

/***/ "./src/main.js":
/*!*********************!*\
  !*** ./src/main.js ***!
  \*********************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vant_es_icon_style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vant/es/icon/style */ \"./node_modules/_vant@2.2.16@vant/es/icon/style/index.js\");\n/* harmony import */ var vant_es_icon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vant/es/icon */ \"./node_modules/_vant@2.2.16@vant/es/icon/index.js\");\n/* harmony import */ var vant_es_collapse_style__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vant/es/collapse/style */ \"./node_modules/_vant@2.2.16@vant/es/collapse/style/index.js\");\n/* harmony import */ var vant_es_collapse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vant/es/collapse */ \"./node_modules/_vant@2.2.16@vant/es/collapse/index.js\");\n/* harmony import */ var vant_es_collapse_item_style__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vant/es/collapse-item/style */ \"./node_modules/_vant@2.2.16@vant/es/collapse-item/style/index.js\");\n/* harmony import */ var vant_es_collapse_item__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vant/es/collapse-item */ \"./node_modules/_vant@2.2.16@vant/es/collapse-item/index.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_array_iterator_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.array.iterator.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_array_iterator_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_array_iterator_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_promise_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.promise.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_promise_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_promise_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_object_assign_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.assign.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_object_assign_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es6_object_assign_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es7_promise_finally_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js */ \"./node_modules/_core-js@2.6.10@core-js/modules/es7.promise.finally.js\");\n/* harmony import */ var _Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es7_promise_finally_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_Users_joe_Documents_git_pingan_hklife_pingan_life_index_pro_node_modules_core_js_2_6_10_core_js_modules_es7_promise_finally_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var vue_i18n__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! vue-i18n */ \"./node_modules/_vue-i18n@8.15.0@vue-i18n/dist/vue-i18n.esm.js\");\n/* harmony import */ var _App_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./App.vue */ \"./src/App.vue\");\n/* harmony import */ var _router__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./router */ \"./src/router.js\");\n/* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./store/index */ \"./src/store/index.js\");\n/* harmony import */ var vue_awesome_swiper__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! vue-awesome-swiper */ \"./node_modules/_vue-awesome-swiper@3.1.3@vue-awesome-swiper/dist/vue-awesome-swiper.js\");\n/* harmony import */ var vue_awesome_swiper__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(vue_awesome_swiper__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var swiper_dist_css_swiper_css__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! swiper/dist/css/swiper.css */ \"./node_modules/_swiper@4.5.1@swiper/dist/css/swiper.css\");\n/* harmony import */ var swiper_dist_css_swiper_css__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(swiper_dist_css_swiper_css__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mock__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./mock */ \"./src/mock/index.js\");\n/* harmony import */ var vue_video_player__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! vue-video-player */ \"./node_modules/_vue-video-player@5.0.2@vue-video-player/dist/vue-video-player.js\");\n/* harmony import */ var vue_video_player__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(vue_video_player__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var video_js_dist_video_js_css__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! video.js/dist/video-js.css */ \"./node_modules/_video.js@7.6.6@video.js/dist/video-js.css\");\n/* harmony import */ var video_js_dist_video_js_css__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(video_js_dist_video_js_css__WEBPACK_IMPORTED_MODULE_19__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vue_awesome_swiper__WEBPACK_IMPORTED_MODULE_15___default.a); // vant\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vant_es_collapse__WEBPACK_IMPORTED_MODULE_3__[\"default\"]).use(vant_es_collapse_item__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vant_es_icon__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n_mock__WEBPACK_IMPORTED_MODULE_17__[\"default\"].bootstrap(); // 视频\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vue_video_player__WEBPACK_IMPORTED_MODULE_18___default.a); // import 'amfe-flexible';\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].config.productionTip = false; // Purecss\n// import Purecss from 'purecss'\n// Vue.use(Purecss);\n// 国际化\n\nvue__WEBPACK_IMPORTED_MODULE_10__[\"default\"].use(vue_i18n__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\nvar i18n = new vue_i18n__WEBPACK_IMPORTED_MODULE_11__[\"default\"]({\n  locale: localStorage.getItem(\"lang\") || 'tc',\n  // 语言标识\n  //this.$i18n.locale // 通过切换locale的值来实现语言切换\n  messages: {\n    'tc': __webpack_require__(/*! @/common/lang/tc */ \"./src/common/lang/tc.js\"),\n    // 繁体语言包\n    'zh': __webpack_require__(/*! @/common/lang/zh */ \"./src/common/lang/zh.js\"),\n    // 简体语言包\n    'en': __webpack_require__(/*! @/common/lang/en */ \"./src/common/lang/en.js\") // 英文语言包\n\n  }\n});\nnew vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]({\n  i18n: i18n,\n  router: _router__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n  store: _store_index__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n  render: function render(h) {\n    return h(_App_vue__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\n  },\n  mounted: function mounted() {\n    document.dispatchEvent(new Event('render-event'));\n  },\n  data: {\n    bus: new vue__WEBPACK_IMPORTED_MODULE_10__[\"default\"]()\n  }\n}).$mount('#app');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbWFpbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9tYWluLmpzPzU2ZDciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZ1ZSBmcm9tICd2dWUnO1xuaW1wb3J0IFZ1ZUkxOG4gZnJvbSAndnVlLWkxOG4nO1xuaW1wb3J0IEFwcCBmcm9tICcuL0FwcC52dWUnO1xuaW1wb3J0IHJvdXRlciBmcm9tICcuL3JvdXRlcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZS9pbmRleCc7XG5cbmltcG9ydCBWdWVBd2Vzb21lU3dpcGVyIGZyb20gJ3Z1ZS1hd2Vzb21lLXN3aXBlcidcbmltcG9ydCAnc3dpcGVyL2Rpc3QvY3NzL3N3aXBlci5jc3MnXG5WdWUudXNlKFZ1ZUF3ZXNvbWVTd2lwZXIpXG5cbi8vIHZhbnRcbmltcG9ydCB7XG5cdENvbGxhcHNlLFxuXHRDb2xsYXBzZUl0ZW0sXG5cdEljb25cbn0gZnJvbSAndmFudCc7XG5WdWUudXNlKENvbGxhcHNlKS51c2UoQ29sbGFwc2VJdGVtKTtcblZ1ZS51c2UoSWNvbik7XG5cbmltcG9ydCBNb2NrIGZyb20gJy4vbW9jaydcbk1vY2suYm9vdHN0cmFwKCk7XG5cbi8vIOinhumikVxuaW1wb3J0IFZ1ZVZpZGVvUGxheWVyIGZyb20gJ3Z1ZS12aWRlby1wbGF5ZXInXG5pbXBvcnQgJ3ZpZGVvLmpzL2Rpc3QvdmlkZW8tanMuY3NzJ1xuVnVlLnVzZShWdWVWaWRlb1BsYXllcilcblxuLy8gaW1wb3J0ICdhbWZlLWZsZXhpYmxlJztcblZ1ZS5jb25maWcucHJvZHVjdGlvblRpcCA9IGZhbHNlXG5cbi8vIFB1cmVjc3Ncbi8vIGltcG9ydCBQdXJlY3NzIGZyb20gJ3B1cmVjc3MnXG4vLyBWdWUudXNlKFB1cmVjc3MpO1xuXG4vLyDlm73pmYXljJZcblZ1ZS51c2UoVnVlSTE4bilcbmNvbnN0IGkxOG4gPSBuZXcgVnVlSTE4bih7XG5cdGxvY2FsZTogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsYW5nXCIpIHx8ICd0YycsIC8vIOivreiogOagh+ivhlxuXHQvL3RoaXMuJGkxOG4ubG9jYWxlIC8vIOmAmui/h+WIh+aNomxvY2FsZeeahOWAvOadpeWunueOsOivreiogOWIh+aNolxuXHRtZXNzYWdlczoge1xuXHRcdCd0Yyc6IHJlcXVpcmUoJ0AvY29tbW9uL2xhbmcvdGMnKSwgLy8g57mB5L2T6K+t6KiA5YyFXG5cdFx0J3poJzogcmVxdWlyZSgnQC9jb21tb24vbGFuZy96aCcpLCAvLyDnroDkvZPor63oqIDljIVcblx0XHQnZW4nOiByZXF1aXJlKCdAL2NvbW1vbi9sYW5nL2VuJyksIC8vIOiLseaWh+ivreiogOWMhVxuXHR9XG59KVxuXG5cblxubmV3IFZ1ZSh7XG5cdGkxOG4sXG5cdHJvdXRlcixcblx0c3RvcmUsXG5cdHJlbmRlcjogaCA9PiBoKEFwcCksXG5cdG1vdW50ZWQ6ICgpID0+IHtcblx0XHRkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVuZGVyLWV2ZW50JykpO1xuXHR9LFxuXHRkYXRhOiB7XG5cdFx0YnVzOiBuZXcgVnVlKClcblx0fVxufSkuJG1vdW50KCcjYXBwJylcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUpBO0FBSEE7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQVJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/main.js\n");

/***/ }),

/***/ "./src/mock/data/user.js":
/*!*******************************!*\
  !*** ./src/mock/data/user.js ***!
  \*******************************/
/*! exports provided: LoginUsers, Users */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LoginUsers\", function() { return LoginUsers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Users\", function() { return Users; });\n/* harmony import */ var mockjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mockjs */ \"./node_modules/_mockjs@1.1.0@mockjs/dist/mock.js\");\n/* harmony import */ var mockjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(mockjs__WEBPACK_IMPORTED_MODULE_0__);\n\nvar LoginUsers = [{\n  id: 1,\n  username: 'admin',\n  password: 'admin',\n  avatar: 'https://raw.githubusercontent.com/taylorchen709/markdown-images/master/vueadmin/user.png',\n  name: '张某某'\n}];\nvar Users = [];\n\nfor (var i = 0; i < 5; i++) {\n  Users.push(mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.mock({\n    id: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.guid(),\n    province: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.province(),\n    city: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.city(),\n    fieldName: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.cname(),\n    address: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.mock('@county(true)'),\n    'age|18-60': 1,\n    birth: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.date(),\n    sex: mockjs__WEBPACK_IMPORTED_MODULE_0___default.a.Random.integer(0, 1)\n  }));\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9jay9kYXRhL3VzZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbW9jay9kYXRhL3VzZXIuanM/MWUxMyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTW9jayBmcm9tICdtb2NranMnO1xuY29uc3QgTG9naW5Vc2VycyA9IFtcbiAge1xuICAgIGlkOiAxLFxuICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxuICAgIHBhc3N3b3JkOiAnYWRtaW4nLFxuICAgIGF2YXRhcjogJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS90YXlsb3JjaGVuNzA5L21hcmtkb3duLWltYWdlcy9tYXN0ZXIvdnVlYWRtaW4vdXNlci5wbmcnLFxuICAgIG5hbWU6ICflvKDmn5Dmn5AnXG4gIH1cbl07XG5cbmNvbnN0IFVzZXJzID0gW107XG5cbmZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gIFVzZXJzLnB1c2goTW9jay5tb2NrKHtcbiAgICBpZDogTW9jay5SYW5kb20uZ3VpZCgpLFxuICAgIHByb3ZpbmNlOiBNb2NrLlJhbmRvbS5wcm92aW5jZSgpLFxuICAgIGNpdHk6IE1vY2suUmFuZG9tLmNpdHkoKSxcbiAgICBmaWVsZE5hbWU6IE1vY2suUmFuZG9tLmNuYW1lKCksXG4gICAgYWRkcmVzczogTW9jay5tb2NrKCdAY291bnR5KHRydWUpJyksXG4gICAgJ2FnZXwxOC02MCc6IDEsXG4gICAgYmlydGg6IE1vY2suUmFuZG9tLmRhdGUoKSxcbiAgICBzZXg6IE1vY2suUmFuZG9tLmludGVnZXIoMCwgMSlcbiAgfSkpO1xufVxuXG5leHBvcnQgeyBMb2dpblVzZXJzLCBVc2VycyB9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/mock/data/user.js\n");

/***/ }),

/***/ "./src/mock/index.js":
/*!***************************!*\
  !*** ./src/mock/index.js ***!
  \***************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mock */ \"./src/mock/mock.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_mock__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9jay9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9tb2NrL2luZGV4LmpzPzI0NWEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vY2sgZnJvbSAnLi9tb2NrJztcblxuZXhwb3J0IGRlZmF1bHQgbW9jaztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBRUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/mock/index.js\n");

/***/ }),

/***/ "./src/mock/mock.js":
/*!**************************!*\
  !*** ./src/mock/mock.js ***!
  \**************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! axios */ \"./node_modules/_axios@0.19.0@axios/index.js\");\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var axios_mock_adapter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! axios-mock-adapter */ \"./node_modules/_axios-mock-adapter@1.17.0@axios-mock-adapter/src/index.js\");\n/* harmony import */ var axios_mock_adapter__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(axios_mock_adapter__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _data_user__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./data/user */ \"./src/mock/data/user.js\");\n\n\n\nvar _Users = _data_user__WEBPACK_IMPORTED_MODULE_2__[\"Users\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  /**\n   * mock bootstrap\n   */\n  bootstrap: function bootstrap() {\n    return; // 紧在dev环境下使用\n\n    if (true) {\n      return;\n    }\n\n    var mock = new axios_mock_adapter__WEBPACK_IMPORTED_MODULE_1___default.a(axios__WEBPACK_IMPORTED_MODULE_0___default.a); // mock success request\n\n    mock.onGet('/success').reply(200, {\n      msg: 'success'\n    }); // mock error request\n\n    mock.onGet('/error').reply(500, {\n      msg: 'failure'\n    }); // 拦截 get方法demo\n\n    mock.onGet('/path1/path2/getdemo').reply(function (config) {\n      // 拦截参数\n      var _config$params = config.params,\n          params1 = _config$params.params1,\n          params2 = _config$params.params2;\n      return new Promise(function (resolve, reject) {\n        var content = {};\n        var success = true;\n        resolve([200, {\n          code: 2000,\n          msg: '请求成功',\n          success: success,\n          content: content\n        }]);\n      });\n    }); // 拦截post方法demo\n\n    mock.onPost('/path1/path2/postdemo').reply(function (config) {\n      var _JSON$parse = JSON.parse(config.data),\n          params1 = _JSON$parse.params1,\n          params2 = _JSON$parse.params2;\n\n      return new Promise(function (resolve, reject) {\n        var content = {};\n        var success = true;\n        resolve([200, {\n          code: 2000,\n          msg: '请求成功',\n          success: success,\n          content: content\n        }]);\n      });\n    });\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9jay9tb2NrLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL21vY2svbW9jay5qcz85NTIzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgTW9ja0FkYXB0ZXIgZnJvbSAnYXhpb3MtbW9jay1hZGFwdGVyJztcbmltcG9ydCB7XG4gIExvZ2luVXNlcnMsXG4gIFVzZXJzXG59IGZyb20gJy4vZGF0YS91c2VyJztcbmxldCBfVXNlcnMgPSBVc2VycztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogbW9jayBib290c3RyYXBcbiAgICovXG4gIGJvb3RzdHJhcCgpIHtcbiAgICByZXR1cm47XG4gICAgLy8g57Sn5ZyoZGV2546v5aKD5LiL5L2/55SoXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1vY2sgPSBuZXcgTW9ja0FkYXB0ZXIoYXhpb3MpO1xuXG4gICAgLy8gbW9jayBzdWNjZXNzIHJlcXVlc3RcbiAgICBtb2NrLm9uR2V0KCcvc3VjY2VzcycpLnJlcGx5KDIwMCwge1xuICAgICAgbXNnOiAnc3VjY2VzcydcbiAgICB9KTtcblxuICAgIC8vIG1vY2sgZXJyb3IgcmVxdWVzdFxuICAgIG1vY2sub25HZXQoJy9lcnJvcicpLnJlcGx5KDUwMCwge1xuICAgICAgbXNnOiAnZmFpbHVyZSdcbiAgICB9KTtcblxuICAgIC8vIOaLpuaIqiBnZXTmlrnms5VkZW1vXG4gICAgbW9jay5vbkdldCgnL3BhdGgxL3BhdGgyL2dldGRlbW8nKS5yZXBseShjb25maWcgPT4ge1xuICAgICAgLy8g5oum5oiq5Y+C5pWwXG4gICAgICBsZXQge1xuICAgICAgICBwYXJhbXMxLFxuICAgICAgICBwYXJhbXMyXG4gICAgICB9ID0gY29uZmlnLnBhcmFtcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBjb250ZW50ID0ge307XG4gICAgICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZShbMjAwLCB7XG4gICAgICAgICAgY29kZTogMjAwMCxcbiAgICAgICAgICBtc2c6ICfor7fmsYLmiJDlip8nLFxuICAgICAgICAgIHN1Y2Nlc3MsXG4gICAgICAgICAgY29udGVudFxuICAgICAgICB9XSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIOaLpuaIqnBvc3Tmlrnms5VkZW1vXG4gICAgbW9jay5vblBvc3QoJy9wYXRoMS9wYXRoMi9wb3N0ZGVtbycpLnJlcGx5KGNvbmZpZyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBwYXJhbXMxLFxuICAgICAgICBwYXJhbXMyXG4gICAgICB9ID0gSlNPTi5wYXJzZShjb25maWcuZGF0YSk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgY29udGVudCA9IHt9O1xuICAgICAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgIHJlc29sdmUoWzIwMCwge1xuICAgICAgICAgIGNvZGU6IDIwMDAsXG4gICAgICAgICAgbXNnOiAn6K+35rGC5oiQ5YqfJyxcbiAgICAgICAgICBzdWNjZXNzLFxuICAgICAgICAgIGNvbnRlbnRcbiAgICAgICAgfV0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBREE7QUFDQTtBQUlBO0FBQ0E7QUFEQTtBQUNBO0FBSUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBRUE7QUEzREEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/mock/mock.js\n");

/***/ }),

/***/ "./src/pages/index/index.js?vue&type=script&lang=js&":
/*!**************************************************!*\
  !*** ./src/pages/index?vue&type=script&lang=js& ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_index_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/_babel-loader@8.0.6@babel-loader/lib!../../../node_modules/_eslint-loader@2.2.1@eslint-loader??ref--13-0!.?vue&type=script&lang=js& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_babel-loader@8.0.6@babel-loader/lib/index.js!./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js?!./src/pages/index/index.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_8_0_6_babel_loader_lib_index_js_node_modules_eslint_loader_2_2_1_eslint_loader_index_js_ref_13_0_index_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXguanM/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL2luZGV4PzQ5OTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9pbmRleC5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMTItMCEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2JhYmVsLWxvYWRlckA4LjAuNkBiYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fZXNsaW50LWxvYWRlckAyLjIuMUBlc2xpbnQtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTEzLTAhLi9pbmRleC5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/pages/index/index.js?vue&type=script&lang=js&\n");

/***/ }),

/***/ "./src/pages/index/index.vue":
/*!***********************************!*\
  !*** ./src/pages/index/index.vue ***!
  \***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.vue?vue&type=template&id=1badc801&scoped=true& */ \"./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\");\n/* harmony import */ var _index_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! .?vue&type=script&lang=js& */ \"./src/pages/index/index.js?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/_vue-loader@15.7.1@vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_15_7_1_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n  _index_js_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n  _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n  false,\n  null,\n  \"1badc801\",\n  null\n  \n)\n\n/* hot reload */\nif (true) {\n  var api = __webpack_require__(/*! ./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js */ \"./node_modules/_vue-hot-reload-api@2.3.4@vue-hot-reload-api/dist/index.js\")\n  api.install(__webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\"))\n  if (api.compatible) {\n    module.hot.accept()\n    if (!api.isRecorded('1badc801')) {\n      api.createRecord('1badc801', component.options)\n    } else {\n      api.reload('1badc801', component.options)\n    }\n    module.hot.accept(/*! ./index.vue?vue&type=template&id=1badc801&scoped=true& */ \"./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\", function(__WEBPACK_OUTDATED_DEPENDENCIES__) { /* harmony import */ _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.vue?vue&type=template&id=1badc801&scoped=true& */ \"./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\");\n(function () {\n      api.rerender('1badc801', {\n        render: _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n        staticRenderFns: _index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]\n      })\n    })(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this))\n  }\n}\ncomponent.options.__file = \"src/pages/index/index.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL2luZGV4L2luZGV4LnZ1ZT80NjNlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vaW5kZXgudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTFiYWRjODAxJnNjb3BlZD10cnVlJlwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL2luZGV4LmpzP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbmRleC5qcz92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9pbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0xYmFkYzgwMSZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCJcblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5pbXBvcnQgbm9ybWFsaXplciBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgXCIxYmFkYzgwMVwiLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAobW9kdWxlLmhvdCkge1xuICB2YXIgYXBpID0gcmVxdWlyZShcIi9Vc2Vycy9qb2UvRG9jdW1lbnRzL2dpdC9waW5nYW4vaGtsaWZlL3Bpbmdhbi1saWZlLWluZGV4LXByby9ub2RlX21vZHVsZXMvX3Z1ZS1ob3QtcmVsb2FkLWFwaUAyLjMuNEB2dWUtaG90LXJlbG9hZC1hcGkvZGlzdC9pbmRleC5qc1wiKVxuICBhcGkuaW5zdGFsbChyZXF1aXJlKCd2dWUnKSlcbiAgaWYgKGFwaS5jb21wYXRpYmxlKSB7XG4gICAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuICAgIGlmICghYXBpLmlzUmVjb3JkZWQoJzFiYWRjODAxJykpIHtcbiAgICAgIGFwaS5jcmVhdGVSZWNvcmQoJzFiYWRjODAxJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZWxvYWQoJzFiYWRjODAxJywgY29tcG9uZW50Lm9wdGlvbnMpXG4gICAgfVxuICAgIG1vZHVsZS5ob3QuYWNjZXB0KFwiLi9pbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MWJhZGM4MDEmc2NvcGVkPXRydWUmXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwaS5yZXJlbmRlcignMWJhZGM4MDEnLCB7XG4gICAgICAgIHJlbmRlcjogcmVuZGVyLFxuICAgICAgICBzdGF0aWNSZW5kZXJGbnM6IHN0YXRpY1JlbmRlckZuc1xuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSBcInNyYy9wYWdlcy9pbmRleC9pbmRleC52dWVcIlxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/pages/index/index.vue\n");

/***/ }),

/***/ "./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&":
/*!*********************************************************************************************!*\
  !*** ./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& ***!
  \*********************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/_vue-style-loader@4.1.2@vue-style-loader??ref--8-oneOf-1-0!../../../node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-1-1!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-1-2!../../../node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true& */ \"./node_modules/_vue-style-loader@4.1.2@vue-style-loader/index.js?!./node_modules/_css-loader@1.0.1@css-loader/index.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/stylePostLoader.js!./node_modules/_postcss-loader@3.0.0@postcss-loader/src/index.js?!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\");\n/* harmony import */ var _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_4_1_2_vue_style_loader_index_js_ref_8_oneOf_1_0_node_modules_css_loader_1_0_1_css_loader_index_js_ref_8_oneOf_1_1_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_3_0_0_postcss_loader_src_index_js_ref_8_oneOf_1_2_node_modules_sass_loader_7_3_1_sass_loader_dist_cjs_js_ref_8_oneOf_1_3_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_1badc801_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MWJhZGM4MDEmbGFuZz1zY3NzJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/YzA3ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLXN0eWxlLWxvYWRlckA0LjEuMkB2dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0wIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fY3NzLWxvYWRlckAxLjAuMUBjc3MtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0xIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19wb3N0Y3NzLWxvYWRlckAzLjAuMEBwb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tOC1vbmVPZi0xLTIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19zYXNzLWxvYWRlckA3LjMuMUBzYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS04LW9uZU9mLTEtMyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTFiYWRjODAxJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZSZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1zdHlsZS1sb2FkZXJANC4xLjJAdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMCEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2Nzcy1sb2FkZXJAMS4wLjFAY3NzLWxvYWRlci9pbmRleC5qcz8/cmVmLS04LW9uZU9mLTEtMSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fcG9zdGNzcy1sb2FkZXJAMy4wLjBAcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTgtb25lT2YtMS0yIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fc2Fzcy1sb2FkZXJANy4zLjFAc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tOC1vbmVPZi0xLTMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL19jYWNoZS1sb2FkZXJAMi4wLjFAY2FjaGUtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTAtMCEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9pbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0xYmFkYzgwMSZsYW5nPXNjc3Mmc2NvcGVkPXRydWUmXCIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/pages/index/index.vue?vue&type=style&index=0&id=1badc801&lang=scss&scoped=true&\n");

/***/ }),

/***/ "./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&":
/*!******************************************************************************!*\
  !*** ./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true& ***!
  \******************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!cache-loader?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"274ecb62-vue-loader-template\"}!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/_vue-loader@15.7.1@vue-loader/lib??vue-loader-options!./index.vue?vue&type=template&id=1badc801&scoped=true& */ \"./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"274ecb62-vue-loader-template\\\"}!./node_modules/_vue-loader@15.7.1@vue-loader/lib/loaders/templateLoader.js?!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?!./node_modules/_vue-loader@15.7.1@vue-loader/lib/index.js?!./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _cache_loader_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_274ecb62_vue_loader_template_node_modules_vue_loader_15_7_1_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_2_0_1_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_15_7_1_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_template_id_1badc801_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGFnZXMvaW5kZXgvaW5kZXgudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTFiYWRjODAxJnNjb3BlZD10cnVlJi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wYWdlcy9pbmRleC9pbmRleC52dWU/MWJhYiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLSFjYWNoZS1sb2FkZXI/e1xcXCJjYWNoZURpcmVjdG9yeVxcXCI6XFxcIm5vZGVfbW9kdWxlcy8uY2FjaGUvdnVlLWxvYWRlclxcXCIsXFxcImNhY2hlSWRlbnRpZmllclxcXCI6XFxcIjI3NGVjYjYyLXZ1ZS1sb2FkZXItdGVtcGxhdGVcXFwifSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX3Z1ZS1sb2FkZXJAMTUuNy4xQHZ1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvX2NhY2hlLWxvYWRlckAyLjAuMUBjYWNoZS1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMC0wIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9fdnVlLWxvYWRlckAxNS43LjFAdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2luZGV4LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0xYmFkYzgwMSZzY29wZWQ9dHJ1ZSZcIiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/pages/index/index.vue?vue&type=template&id=1badc801&scoped=true&\n");

/***/ }),

/***/ "./src/router.js":
/*!***********************!*\
  !*** ./src/router.js ***!
  \***********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.function.name */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var vue_router__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue-router */ \"./node_modules/_vue-router@3.1.3@vue-router/dist/vue-router.esm.js\");\n/* harmony import */ var _pages_index_index_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pages/index/index.vue */ \"./src/pages/index/index.vue\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_2__[\"default\"].use(vue_router__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n/**\n * 重写路由的push方法\n */\n\nvar routerPush = vue_router__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype.push;\n\nvue_router__WEBPACK_IMPORTED_MODULE_3__[\"default\"].prototype.push = function push(location) {\n  return routerPush.call(this, location).catch(function (error) {\n    return error;\n  });\n};\n\nvar routes = [{\n  path: '/',\n  name: 'index',\n  component: _pages_index_index_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n  meta: {\n    title: '平安人寿保险官网'\n  }\n}, {\n  path: '/login',\n  name: 'login',\n  component: function component() {\n    return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(4), __webpack_require__.e(8)]).then(__webpack_require__.bind(null, /*! ./pages/login/login.vue */ \"./src/pages/login/login.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/register',\n  name: 'register',\n  component: function component() {\n    return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(9)]).then(__webpack_require__.bind(null, /*! ./pages/register/register.vue */ \"./src/pages/register/register.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/password/find',\n  name: 'passwordFind',\n  component: function component() {\n    return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(12)]).then(__webpack_require__.bind(null, /*! ./pages/password-find/password-find.vue */ \"./src/pages/password-find/password-find.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/password/reset',\n  name: 'passwordReset',\n  component: function component() {\n    return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(3), __webpack_require__.e(13)]).then(__webpack_require__.bind(null, /*! ./pages/password-reset/password-reset.vue */ \"./src/pages/password-reset/password-reset.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/infomation/improve',\n  name: 'infomationImprove',\n  component: function component() {\n    return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(2), __webpack_require__.e(3), __webpack_require__.e(11)]).then(__webpack_require__.bind(null, /*! ./pages/infomation-improve/infomation-improve.vue */ \"./src/pages/infomation-improve/infomation-improve.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/profile',\n  name: 'profile',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 18).then(__webpack_require__.bind(null, /*! ./pages/profile/profile.vue */ \"./src/pages/profile/profile.vue\"));\n  },\n  meta: {\n    title: '公司简介'\n  }\n}, {\n  path: '/terms',\n  name: 'terms',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 20).then(__webpack_require__.bind(null, /*! ./pages/terms/terms.vue */ \"./src/pages/terms/terms.vue\"));\n  },\n  meta: {\n    title: '使用条款'\n  }\n}, {\n  path: '/privacy',\n  name: 'privacy',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 17).then(__webpack_require__.bind(null, /*! ./pages/privacy/privacy.vue */ \"./src/pages/privacy/privacy.vue\"));\n  },\n  meta: {\n    title: '隐私政策'\n  }\n}, {\n  path: '/personal/data/collection',\n  name: 'personalDataCollection',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 16).then(__webpack_require__.bind(null, /*! ./pages/personal-data-collection/personal-data-collection.vue */ \"./src/pages/personal-data-collection/personal-data-collection.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/protocol',\n  name: 'protocol',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 19).then(__webpack_require__.bind(null, /*! ./pages/protocol/protocol.vue */ \"./src/pages/protocol/protocol.vue\"));\n  },\n  meta: {\n    title: '平安一賬通會員服務協議'\n  }\n}, {\n  path: '/news/list',\n  name: 'newsList',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 6).then(__webpack_require__.bind(null, /*! ./pages/news-list/news-list.vue */ \"./src/pages/news-list/news-list.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/news/detail',\n  name: 'newsDetail',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 14).then(__webpack_require__.bind(null, /*! ./pages/news-detail/news-detail.vue */ \"./src/pages/news-detail/news-detail.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/product',\n  name: 'product',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 7).then(__webpack_require__.bind(null, /*! ./pages/product/product.vue */ \"./src/pages/product/product.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/custom/service',\n  name: 'customService',\n  component: function component() {\n    return Promise.all(/*! import() */[__webpack_require__.e(0), __webpack_require__.e(2), __webpack_require__.e(3), __webpack_require__.e(4), __webpack_require__.e(5)]).then(__webpack_require__.bind(null, /*! ./pages/custom-service/custom-service.vue */ \"./src/pages/custom-service/custom-service.vue\"));\n  },\n  meta: {\n    title: '保单查询'\n  }\n}, {\n  path: '/custom/product',\n  name: 'customProduct',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 10).then(__webpack_require__.bind(null, /*! ./pages/custom-product/custom-product.vue */ \"./src/pages/custom-product/custom-product.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/demo',\n  name: 'demo',\n  component: function component() {\n    return Promise.all(/*! import() */[__webpack_require__.e(2), __webpack_require__.e(15)]).then(__webpack_require__.bind(null, /*! ./pages/demo/index.vue */ \"./src/pages/demo/index.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/about',\n  name: 'about',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 21).then(__webpack_require__.bind(null, /*! ./pages/About.vue */ \"./src/pages/About.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n}, {\n  path: '/empty',\n  name: 'empty',\n  component: function component() {\n    return __webpack_require__.e(/*! import() */ 22).then(__webpack_require__.bind(null, /*! ./pages/empty/empty.vue */ \"./src/pages/empty/empty.vue\"));\n  },\n  meta: {\n    title: ''\n  }\n} // 404页面\n// {\n// \tpath: '*', // * 表示上面路径匹配不到的都显示这个页面\n// \tname: '404',\n// \tcomponent: Index\n// },\n]; // add route path\n\nroutes.forEach(function (route) {\n  route.path = route.path || '/' + (route.name || '');\n});\nvar router = new vue_router__WEBPACK_IMPORTED_MODULE_3__[\"default\"]({\n  routes: routes // mode: 'history',\n\n});\nrouter.beforeEach(function (to, from, next) {\n  var title = to.meta && to.meta.title;\n\n  if (title) {\n    document.title = title;\n  } // const scrollTopList = [\n  // \t\"newsList\", \"newsDetail\", \"protocol\", \"privacy\", \"terms\", \"paymentType\", \"reservation\"\n  // ]\n\n\n  document.documentElement.scrollTop = 0;\n  document.body.scrollTop = 0;\n  next();\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (router);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcm91dGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3JvdXRlci5qcz80MWNiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBWdWUgZnJvbSAndnVlJ1xuaW1wb3J0IFJvdXRlciBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IEluZGV4IGZyb20gJy4vcGFnZXMvaW5kZXgvaW5kZXgudnVlJ1xuXG5WdWUudXNlKFJvdXRlcilcblxuLyoqXG4gKiDph43lhpnot6/nlLHnmoRwdXNo5pa55rOVXG4gKi9cbmNvbnN0IHJvdXRlclB1c2ggPSBSb3V0ZXIucHJvdG90eXBlLnB1c2hcblJvdXRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2gobG9jYXRpb24pIHtcblx0cmV0dXJuIHJvdXRlclB1c2guY2FsbCh0aGlzLCBsb2NhdGlvbikuY2F0Y2goZXJyb3IgPT4gZXJyb3IpXG59XG5cbmNvbnN0IHJvdXRlcyA9IFtcblxuXHR7XG5cdFx0cGF0aDogJy8nLFxuXHRcdG5hbWU6ICdpbmRleCcsXG5cdFx0Y29tcG9uZW50OiBJbmRleCxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJ+W5s+WuieS6uuWvv+S/nemZqeWumOe9kSdcblx0XHR9XG5cdH0sXG5cdHtcblx0XHRwYXRoOiAnL2xvZ2luJyxcblx0XHRuYW1lOiAnbG9naW4nLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL2xvZ2luL2xvZ2luLnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAnJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvcmVnaXN0ZXInLFxuXHRcdG5hbWU6ICdyZWdpc3RlcicsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvcmVnaXN0ZXIvcmVnaXN0ZXIudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICcnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9wYXNzd29yZC9maW5kJyxcblx0XHRuYW1lOiAncGFzc3dvcmRGaW5kJyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9wYXNzd29yZC1maW5kL3Bhc3N3b3JkLWZpbmQudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICcnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9wYXNzd29yZC9yZXNldCcsXG5cdFx0bmFtZTogJ3Bhc3N3b3JkUmVzZXQnLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL3Bhc3N3b3JkLXJlc2V0L3Bhc3N3b3JkLXJlc2V0LnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAnJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvaW5mb21hdGlvbi9pbXByb3ZlJyxcblx0XHRuYW1lOiAnaW5mb21hdGlvbkltcHJvdmUnLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL2luZm9tYXRpb24taW1wcm92ZS9pbmZvbWF0aW9uLWltcHJvdmUudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICcnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9wcm9maWxlJyxcblx0XHRuYW1lOiAncHJvZmlsZScsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvcHJvZmlsZS9wcm9maWxlLnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAn5YWs5Y+4566A5LuLJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvdGVybXMnLFxuXHRcdG5hbWU6ICd0ZXJtcycsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvdGVybXMvdGVybXMudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICfkvb/nlKjmnaHmrL4nXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9wcml2YWN5Jyxcblx0XHRuYW1lOiAncHJpdmFjeScsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvcHJpdmFjeS9wcml2YWN5LnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAn6ZqQ56eB5pS/562WJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvcGVyc29uYWwvZGF0YS9jb2xsZWN0aW9uJyxcblx0XHRuYW1lOiAncGVyc29uYWxEYXRhQ29sbGVjdGlvbicsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvcGVyc29uYWwtZGF0YS1jb2xsZWN0aW9uL3BlcnNvbmFsLWRhdGEtY29sbGVjdGlvbi52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJydcblx0XHR9XG5cdH0sXG5cdHtcblx0XHRwYXRoOiAnL3Byb3RvY29sJyxcblx0XHRuYW1lOiAncHJvdG9jb2wnLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL3Byb3RvY29sL3Byb3RvY29sLnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAn5bmz5a6J5LiA6LOs6YCa5pyD5ZOh5pyN5YuZ5Y2U6K2wJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvbmV3cy9saXN0Jyxcblx0XHRuYW1lOiAnbmV3c0xpc3QnLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL25ld3MtbGlzdC9uZXdzLWxpc3QudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICcnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9uZXdzL2RldGFpbCcsXG5cdFx0bmFtZTogJ25ld3NEZXRhaWwnLFxuXHRcdGNvbXBvbmVudDogKCkgPT4gaW1wb3J0KCcuL3BhZ2VzL25ld3MtZGV0YWlsL25ld3MtZGV0YWlsLnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAnJ1xuXHRcdH1cblx0fSxcblxuXHR7XG5cdFx0cGF0aDogJy9wcm9kdWN0Jyxcblx0XHRuYW1lOiAncHJvZHVjdCcsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvcHJvZHVjdC9wcm9kdWN0LnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAnJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvY3VzdG9tL3NlcnZpY2UnLFxuXHRcdG5hbWU6ICdjdXN0b21TZXJ2aWNlJyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9jdXN0b20tc2VydmljZS9jdXN0b20tc2VydmljZS52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJ+S/neWNleafpeivoidcblx0XHR9XG5cdH0sXG5cdHtcblx0XHRwYXRoOiAnL2N1c3RvbS9wcm9kdWN0Jyxcblx0XHRuYW1lOiAnY3VzdG9tUHJvZHVjdCcsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvY3VzdG9tLXByb2R1Y3QvY3VzdG9tLXByb2R1Y3QudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICcnXG5cdFx0fVxuXHR9LFxuXG5cdHtcblx0XHRwYXRoOiAnL2RlbW8nLFxuXHRcdG5hbWU6ICdkZW1vJyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9kZW1vL2luZGV4LnZ1ZScpLFxuXHRcdG1ldGE6IHtcblx0XHRcdHRpdGxlOiAnJ1xuXHRcdH1cblx0fSxcblx0e1xuXHRcdHBhdGg6ICcvYWJvdXQnLFxuXHRcdG5hbWU6ICdhYm91dCcsXG5cdFx0Y29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vcGFnZXMvQWJvdXQudnVlJyksXG5cdFx0bWV0YToge1xuXHRcdFx0dGl0bGU6ICcnXG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0cGF0aDogJy9lbXB0eScsXG5cdFx0bmFtZTogJ2VtcHR5Jyxcblx0XHRjb21wb25lbnQ6ICgpID0+IGltcG9ydCgnLi9wYWdlcy9lbXB0eS9lbXB0eS52dWUnKSxcblx0XHRtZXRhOiB7XG5cdFx0XHR0aXRsZTogJydcblx0XHR9XG5cdH0sXG5cdC8vIDQwNOmhtemdolxuXHQvLyB7XG5cdC8vIFx0cGF0aDogJyonLCAvLyAqIOihqOekuuS4iumdoui3r+W+hOWMuemFjeS4jeWIsOeahOmDveaYvuekuui/meS4qumhtemdolxuXHQvLyBcdG5hbWU6ICc0MDQnLFxuXHQvLyBcdGNvbXBvbmVudDogSW5kZXhcblx0Ly8gfSxcbl1cblxuLy8gYWRkIHJvdXRlIHBhdGhcbnJvdXRlcy5mb3JFYWNoKHJvdXRlID0+IHtcblx0cm91dGUucGF0aCA9IHJvdXRlLnBhdGggfHwgJy8nICsgKHJvdXRlLm5hbWUgfHwgJycpO1xufSk7XG5cbmNvbnN0IHJvdXRlciA9IG5ldyBSb3V0ZXIoe1xuXHRyb3V0ZXMsXG5cdC8vIG1vZGU6ICdoaXN0b3J5Jyxcbn0pO1xuXG5yb3V0ZXIuYmVmb3JlRWFjaCgodG8sIGZyb20sIG5leHQpID0+IHtcblx0Y29uc3QgdGl0bGUgPSB0by5tZXRhICYmIHRvLm1ldGEudGl0bGU7XG5cdGlmICh0aXRsZSkge1xuXHRcdGRvY3VtZW50LnRpdGxlID0gdGl0bGU7XG5cdH1cblx0Ly8gY29uc3Qgc2Nyb2xsVG9wTGlzdCA9IFtcblx0Ly8gXHRcIm5ld3NMaXN0XCIsIFwibmV3c0RldGFpbFwiLCBcInByb3RvY29sXCIsIFwicHJpdmFjeVwiLCBcInRlcm1zXCIsIFwicGF5bWVudFR5cGVcIiwgXCJyZXNlcnZhdGlvblwiXG5cdC8vIF1cblx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG5cdGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gMDtcblx0bmV4dCgpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHJvdXRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFqS0E7QUFDQTtBQW9LQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFFQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/router.js\n");

/***/ }),

/***/ "./src/store/actions.js":
/*!******************************!*\
  !*** ./src/store/actions.js ***!
  \******************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("// import request from '@/service'\n// export const banner = async (store, params) => {\n//   return await request.get('/api/v1/get_banner', { params: params })\n// }\n// export const categories = async (store, params) => {\n//   return await request.get('/japi/v1/categories', { params: params })\n// }\n// export const recommend = async (store, params) => {\n//   return await request.post('/wapi/v1/query', params)\n// }\n// export const entries = async (store, params) => {\n//   return await request.get('/tapi/v1/get_entry_by_rank', { params: params })\n// }\n// export const getListByLastTime = async (store, params) => {\n//   return await request.get('/xapi/v1/getListByLastTime', { params: params })\n// }\n// export const increment = ({\n// \tcommit\n// }) => {\n// \tcommit('INCREMENT')\n// }\n// export const pcorphone = ({\n// \tcommit\n// }) => {\n// \tcommit('PCORPHONE')\n// }//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3RvcmUvYWN0aW9ucy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9zdG9yZS9hY3Rpb25zLmpzPzYzZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHJlcXVlc3QgZnJvbSAnQC9zZXJ2aWNlJ1xuXG4vLyBleHBvcnQgY29uc3QgYmFubmVyID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QuZ2V0KCcvYXBpL3YxL2dldF9iYW5uZXInLCB7IHBhcmFtczogcGFyYW1zIH0pXG4vLyB9XG5cbi8vIGV4cG9ydCBjb25zdCBjYXRlZ29yaWVzID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QuZ2V0KCcvamFwaS92MS9jYXRlZ29yaWVzJywgeyBwYXJhbXM6IHBhcmFtcyB9KVxuLy8gfVxuXG4vLyBleHBvcnQgY29uc3QgcmVjb21tZW5kID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucG9zdCgnL3dhcGkvdjEvcXVlcnknLCBwYXJhbXMpXG4vLyB9XG5cbi8vIGV4cG9ydCBjb25zdCBlbnRyaWVzID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QuZ2V0KCcvdGFwaS92MS9nZXRfZW50cnlfYnlfcmFuaycsIHsgcGFyYW1zOiBwYXJhbXMgfSlcbi8vIH1cblxuLy8gZXhwb3J0IGNvbnN0IGdldExpc3RCeUxhc3RUaW1lID0gYXN5bmMgKHN0b3JlLCBwYXJhbXMpID0+IHtcbi8vICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QuZ2V0KCcveGFwaS92MS9nZXRMaXN0QnlMYXN0VGltZScsIHsgcGFyYW1zOiBwYXJhbXMgfSlcbi8vIH1cblxuXG4vLyBleHBvcnQgY29uc3QgaW5jcmVtZW50ID0gKHtcbi8vIFx0Y29tbWl0XG4vLyB9KSA9PiB7XG4vLyBcdGNvbW1pdCgnSU5DUkVNRU5UJylcbi8vIH1cblxuLy8gZXhwb3J0IGNvbnN0IHBjb3JwaG9uZSA9ICh7XG4vLyBcdGNvbW1pdFxuLy8gfSkgPT4ge1xuLy8gXHRjb21taXQoJ1BDT1JQSE9ORScpXG4vLyB9XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/store/actions.js\n");

/***/ }),

/***/ "./src/store/index.js":
/*!****************************!*\
  !*** ./src/store/index.js ***!
  \****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/_vue@2.6.10@vue/dist/vue.runtime.esm.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/_vuex@3.1.1@vuex/dist/vuex.esm.js\");\n/* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ \"./src/store/state.js\");\n/* harmony import */ var _mutations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mutations */ \"./src/store/mutations.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actions */ \"./src/store/actions.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_actions__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\nvar store = function store() {\n  return new vuex__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Store({\n    state: _state__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n    mutations: _mutations__WEBPACK_IMPORTED_MODULE_3__,\n    actions: _actions__WEBPACK_IMPORTED_MODULE_4__\n  });\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (store);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3RvcmUvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvc3RvcmUvaW5kZXguanM/NDM2MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVnVlIGZyb20gJ3Z1ZSdcbmltcG9ydCBWdWV4IGZyb20gJ3Z1ZXgnXG5pbXBvcnQgc3RhdGUgZnJvbSAnLi9zdGF0ZSdcbmltcG9ydCAqIGFzIG11dGF0aW9ucyBmcm9tICcuL211dGF0aW9ucydcbmltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnLi9hY3Rpb25zJ1xuXG5WdWUudXNlKFZ1ZXgpXG5cbmNvbnN0IHN0b3JlID0gKCkgPT4gbmV3IFZ1ZXguU3RvcmUoe1xuICBzdGF0ZSxcbiAgbXV0YXRpb25zLFxuICBhY3Rpb25zXG59KVxuXG5leHBvcnQgZGVmYXVsdCBzdG9yZVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFDQTtBQUtBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/store/index.js\n");

/***/ }),

/***/ "./src/store/mutations.js":
/*!********************************!*\
  !*** ./src/store/mutations.js ***!
  \********************************/
/*! exports provided: INCREMENT, IS_MOBILE, IS_SMALL_SCREEN, SET_USER_INFO, CACHE_POLICY_LIST */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"INCREMENT\", function() { return INCREMENT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"IS_MOBILE\", function() { return IS_MOBILE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"IS_SMALL_SCREEN\", function() { return IS_SMALL_SCREEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SET_USER_INFO\", function() { return SET_USER_INFO; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CACHE_POLICY_LIST\", function() { return CACHE_POLICY_LIST; });\n/* harmony import */ var _utils_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/utils/utils.js */ \"./src/utils/utils.js\");\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ \"./node_modules/_node-libs-browser@2.2.1@node-libs-browser/mock/empty.js\");\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__);\n\n\nfunction INCREMENT(state) {\n  state.counter++;\n}\nfunction IS_MOBILE(state, bool) {\n  state.isMobile = bool;\n}\nfunction IS_SMALL_SCREEN(state, bool) {\n  state.isSmallScreen = bool;\n}\nfunction SET_USER_INFO(state, val) {\n  if (val) {\n    Object(_utils_utils_js__WEBPACK_IMPORTED_MODULE_0__[\"setCookie\"])(\"_user_profile\", encodeURIComponent(JSON.stringify(val)), 7200);\n    state.userInfo = val;\n  } else {\n    Object(_utils_utils_js__WEBPACK_IMPORTED_MODULE_0__[\"setCookie\"])(\"_user_profile\", \"\", 1);\n    state.userInfo = null;\n    state.policyList = null;\n  }\n}\nfunction CACHE_POLICY_LIST(state, val) {\n  state.policyList = val;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3RvcmUvbXV0YXRpb25zLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3N0b3JlL211dGF0aW9ucy5qcz8wNDM5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNldENvb2tpZSwgZ2V0Q29va2llIH0gZnJvbSAnQC91dGlscy91dGlscy5qcydcbmltcG9ydCB7IHN0YXQgfSBmcm9tICdmcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBJTkNSRU1FTlQoc3RhdGUpIHtcblx0c3RhdGUuY291bnRlcisrXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJU19NT0JJTEUoc3RhdGUsIGJvb2wpIHtcblx0c3RhdGUuaXNNb2JpbGUgPSBib29sXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJU19TTUFMTF9TQ1JFRU4oc3RhdGUsIGJvb2wpIHtcblx0c3RhdGUuaXNTbWFsbFNjcmVlbiA9IGJvb2xcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNFVF9VU0VSX0lORk8oc3RhdGUsIHZhbCkge1xuXHRpZiAodmFsKSB7XG5cdFx0c2V0Q29va2llKFwiX3VzZXJfcHJvZmlsZVwiLCBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkodmFsKSksIDcyMDApO1xuXHRcdHN0YXRlLnVzZXJJbmZvID0gdmFsO1xuXHR9IGVsc2Uge1xuXHRcdHNldENvb2tpZShcIl91c2VyX3Byb2ZpbGVcIiwgXCJcIiwgMSk7XG5cdFx0c3RhdGUudXNlckluZm8gPSBudWxsO1xuXHRcdHN0YXRlLnBvbGljeUxpc3QgPSBudWxsO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDQUNIRV9QT0xJQ1lfTElTVChzdGF0ZSwgdmFsKSB7XG5cdHN0YXRlLnBvbGljeUxpc3QgPSB2YWw7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/store/mutations.js\n");

/***/ }),

/***/ "./src/store/state.js":
/*!****************************!*\
  !*** ./src/store/state.js ***!
  \****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  counter: 2,\n  // 例子\n  isMobile: false,\n  //是否手机访问\n  isSmallScreen: false,\n  // 是否小屏幕 (PC时,小屏幕机导航栏会改变))\n  userInfo: {\n    sid: \"\",\n    name: \"\",\n    hadFullInfo: \"\"\n  },\n  policyList: []\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3RvcmUvc3RhdGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvc3RvcmUvc3RhdGUuanM/ZmNjMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XG5cdGNvdW50ZXI6IDIsIC8vIOS+i+WtkFxuXHRpc01vYmlsZTogZmFsc2UsIC8v5piv5ZCm5omL5py66K6/6ZeuXG5cdGlzU21hbGxTY3JlZW46IGZhbHNlLCAvLyDmmK/lkKblsI/lsY/luZUgKFBD5pe277yM5bCP5bGP5bmV5py65a+86Iiq5qCP5Lya5pS55Y+YKSlcblxuXHR1c2VySW5mbzoge1xuXHRcdHNpZDogXCJcIixcblx0XHRuYW1lOiBcIlwiLFxuXHRcdGhhZEZ1bGxJbmZvOiBcIlwiLFxuXHR9LFxuXHRwb2xpY3lMaXN0OiBbXVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBVkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/store/state.js\n");

/***/ }),

/***/ "./src/utils/biz.js":
/*!**************************!*\
  !*** ./src/utils/biz.js ***!
  \**************************/
/*! exports provided: gotoVHIS */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gotoVHIS\", function() { return gotoVHIS; });\n/**\n * \n * @param {string} lan 语言\n */\nfunction gotoVHIS(lan) {\n  var url = \"https://icpois-stg1.pingan.com/vhis/insurIndex\";\n\n  switch (lan) {\n    case 'zh':\n      url += \"?language=zh-cn\";\n      break;\n\n    case 'en':\n      url += \"?language=en\";\n      break;\n\n    default:\n      url += \"?language=zh-hk\";\n      break;\n  }\n\n  url += \"&partnerId=PA001&productCode=VHIS001\";\n  window.location.href = url;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbHMvYml6LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2Jpei5qcz83MWUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuIOivreiogFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ290b1ZISVMobGFuKSB7XG4gICAgbGV0IHVybCA9IFwiaHR0cHM6Ly9pY3BvaXMtc3RnMS5waW5nYW4uY29tL3ZoaXMvaW5zdXJJbmRleFwiO1xuICAgIHN3aXRjaCAobGFuKSB7XG4gICAgICAgIGNhc2UgJ3poJzpcbiAgICAgICAgICAgIHVybCArPSBcIj9sYW5ndWFnZT16aC1jblwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VuJzpcbiAgICAgICAgICAgIHVybCArPSBcIj9sYW5ndWFnZT1lblwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB1cmwgKz0gXCI/bGFuZ3VhZ2U9emgtaGtcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB1cmwgKz0gXCImcGFydG5lcklkPVBBMDAxJnByb2R1Y3RDb2RlPVZISVMwMDFcIjtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQVRBO0FBQ0E7QUFVQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/utils/biz.js\n");

/***/ }),

/***/ "./src/utils/utils.js":
/*!****************************!*\
  !*** ./src/utils/utils.js ***!
  \****************************/
/*! exports provided: REGEXPS, checkMobile, param2Obj, getCookie, setCookie, delCookie, getEnv, setTitle, addQuery, getPath, getQuery, getObjByListKeyValue, formatBr, debounce, throttle, contactMethodCheck */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"REGEXPS\", function() { return REGEXPS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkMobile\", function() { return checkMobile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"param2Obj\", function() { return param2Obj; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCookie\", function() { return getCookie; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setCookie\", function() { return setCookie; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"delCookie\", function() { return delCookie; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getEnv\", function() { return getEnv; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setTitle\", function() { return setTitle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addQuery\", function() { return addQuery; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getPath\", function() { return getPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getQuery\", function() { return getQuery; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getObjByListKeyValue\", function() { return getObjByListKeyValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formatBr\", function() { return formatBr; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"debounce\", function() { return debounce; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"throttle\", function() { return throttle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"contactMethodCheck\", function() { return contactMethodCheck; });\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es6.object.keys */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.object.keys.js\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom.iterable */ \"./node_modules/_core-js@2.6.10@core-js/modules/web.dom.iterable.js\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_regexp_match__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es6.regexp.match */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.match.js\");\n/* harmony import */ var core_js_modules_es6_regexp_match__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_match__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_regexp_constructor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es6.regexp.constructor */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.constructor.js\");\n/* harmony import */ var core_js_modules_es6_regexp_constructor__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_constructor__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es6.regexp.replace */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.replace.js\");\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es6.regexp.split */ \"./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.split.js\");\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\n// 正在表达式\nvar REGEXPS = {\n  \"mobile\": /^1\\d{10}$/\n}; // 验证手机\n\nfunction checkMobile(str) {\n  return REGEXPS.mobile.test(str);\n}\n/**\n * 链接参数转换为obj\n * 入参 完整链接\n * @param {*} url\n */\n\nfunction param2Obj(url) {\n  var search = url.split('?')[1];\n\n  if (!search) {\n    return {};\n  }\n\n  return JSON.parse('{\"' + decodeURIComponent(search).replace(/\"/g, '\\\\\"').replace(/&/g, '\",\"').replace(/=/g, '\":\"') + '\"}');\n} //获取cookie、\n\nfunction getCookie(name) {\n  var arr,\n      reg = new RegExp(\"(^| )\" + name + \"=([^;]*)(;|$)\");\n  if (arr = document.cookie.match(reg)) return arr[2];else return null;\n} //设置cookie\n\nfunction setCookie(c_name, value, second) {\n  var exdate = new Date();\n  exdate.setTime(exdate.getTime() + second * 1000);\n  document.cookie = c_name + \"=\" + escape(value) + (second == null ? \"\" : \";expires=\" + exdate.toGMTString());\n}\n; //删除cookie\n\nfunction delCookie(name) {\n  var exp = new Date();\n  exp.setTime(exp.getTime() - 1);\n  var cval = getCookie(name);\n  if (cval != null) document.cookie = name + \"=\" + cval + \";expires=\" + exp.toGMTString();\n}\n;\n/**\n * 获取环境信息\n * @return {Object} 环境信息对象\n */\n\nfunction getEnv() {\n  var nav = window.navigator;\n  var env = {\n    \"iphone\": false,\n    \"ipad\": false,\n    \"android\": false,\n    \"pc\": false,\n    \"ios\": false,\n    \"ver\": \"0\"\n  };\n  var ua = nav.userAgent;\n  var android = ua.match(/(Android)\\s+([\\d.]+)/);\n  var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n  var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\n\n  if (ipad) {\n    env.ipad = ipad[1] && true || false;\n    env.ver = ipad[2] && ipad[2].replace(/-/g, \".\") || \"\";\n    env.ios = true;\n  } else if (iphone) {\n    env.iphone = iphone[1] && true || false;\n    env.ver = iphone[2] && iphone[2].replace(/-/g, \".\") || \"\";\n    env.ios = true;\n  } else if (android) {\n    env.android = android[1] && true || false;\n    env.ver = android[2];\n  } else {\n    env.pc = true;\n  }\n\n  return env;\n}\n/**\n * 设定页面 title\n * @param {[type]} title [description]\n */\n\nfunction setTitle(title) {\n  if (!title) {\n    return;\n  }\n\n  document.title = title; // if (ENV.ios && navigator.userAgent.toLowerCase().indexOf(\"micromessenger\") !== -1) {\n  // 修复微信端IOS无法修改document.title的情况\n\n  if (getEnv().ios && (navigator.userAgent.toLowerCase().indexOf(\"micromessenger\") !== -1 || navigator.userAgent.toLowerCase().indexOf(\"alipay\") !== -1)) {\n    //修复IOS微信端和支付宝无法修改document.title的情况\n    var $iframe = document.createElement('iframe');\n    $iframe.className = \"C-hiddenIframe\";\n    $iframe.src = \"/\" + location.pathname.split('/')[1] + \"/favicon.ico\";\n    $iframe.style.visibility = 'hidden';\n    $iframe.style.width = '1px';\n    $iframe.style.height = '1px';\n\n    $iframe.onload = function onIframeLoad() {\n      setTimeout(function () {\n        $iframe.onload = null;\n        onIframeLoad = null;\n        document.body.removeChild($iframe);\n        $iframe = null;\n      }, 0);\n    };\n\n    document.body.appendChild($iframe);\n  }\n} // 为链接添加参数\n\nfunction addQuery(url, query) {\n  query = query || {};\n\n  query = function (query) {\n    var q = [];\n    Object.keys(query).forEach(function (_q) {\n      q.push(_q + '=' + query[_q]);\n    });\n    return q.join('&');\n  }(query);\n\n  if (url.indexOf('?') !== -1) {\n    url += '&' + query;\n  } else {\n    url += '?' + query;\n  }\n\n  return url;\n}\n/**\n * 获得当前页面的path\n * @return {String} 页面path\n */\n\nfunction getPath() {\n  var path = window.location.hash;\n  path = path || \"#/\";\n  path = path === \"#/\" ? \"#/index\" : path;\n  path = path.split(\"?\");\n  return path[0];\n} // 获取 url 参数\n\nfunction getQuery(name) {\n  return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, \"\"])[1].replace(/\\+/g, '%20')) || null;\n}\n/**\n * 从数组中获取 key未value的对象\n * @param {*} value\n * @param {*} key\n * @param {*} list\n */\n\nfunction getObjByListKeyValue(value, key, list) {\n  var result = null;\n  list.forEach(function (element) {\n    if (element[key + \"\"] == value) {\n      result = element;\n    }\n  });\n  return result;\n}\n/**\n * 把 \\n换行符转换成<br>\n * 转换后需要用 v-html渲染\n * 用{{}}会当成字符串把 html渲染出来\n */\n\nfunction formatBr(str) {\n  str = str.replace(/\\n/g, '<br/>');\n  return str;\n}\n;\n/**\n * @desc 函数防抖\n * @param func 函数\n * @param wait 延迟执行毫秒数\n * @param immediate true 表立即执行,false 表非立即执行\n */\n\nfunction debounce(func, wait, immediate) {\n  var timeout;\n  return function () {\n    var context = this;\n    var args = arguments;\n    if (timeout) clearTimeout(timeout);\n\n    if (immediate) {\n      var callNow = !timeout;\n      timeout = setTimeout(function () {\n        timeout = null;\n      }, wait);\n      if (callNow) func.apply(context, args);\n    } else {\n      timeout = setTimeout(function () {\n        func.apply(context, args);\n      }, wait);\n    }\n  };\n}\n/**\n * @desc 函数节流\n * @param func 函数\n * @param wait 延迟执行毫秒数\n * @param type 1 表时间戳版,2 表定时器版\n * 时间戳版的函数触发是在时间段内开始的时候,而定时器版的函数触发是在时间段内结束的时候。\n */\n\nfunction throttle(func, wait, type) {\n  if (type === 1) {\n    var previous = 0;\n  } else if (type === 2) {\n    var timeout;\n  }\n\n  return function () {\n    var context = this;\n    var args = arguments;\n\n    if (type === 1) {\n      var now = Date.now();\n\n      if (now - previous > wait) {\n        func.apply(context, args);\n        previous = now;\n      }\n    } else if (type === 2) {\n      if (!timeout) {\n        timeout = setTimeout(function () {\n          timeout = null;\n          func.apply(context, args);\n        }, wait);\n      }\n    }\n  };\n}\n/**\n * 几种常用的校验方式\n * @param {string} type \n * @param {string} value \n */\n\nfunction contactMethodCheck(type, value) {\n  if (type == 'hkmobile') {\n    return /^[5689]{1}\\d{7}$/.test(value);\n  }\n\n  if (type == 'mobile') {\n    return /^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$/.test(value);\n  }\n\n  if (type == 'email') {\n    return /^(\\w-*\\.*)+@(\\w-?)+(\\.\\w{2,})+$/.test(value);\n  }\n\n  return true;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbHMvdXRpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvdXRpbHMuanM/ZmE3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyDmraPlnKjooajovr7lvI9cbmV4cG9ydCBjb25zdCBSRUdFWFBTID0ge1xuICBcIm1vYmlsZVwiOiAvXjFcXGR7MTB9JC9cbn1cblxuLy8g6aqM6K+B5omL5py6XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tNb2JpbGUoc3RyKSB7XG4gIHJldHVybiBSRUdFWFBTLm1vYmlsZS50ZXN0KHN0cik7XG59XG5cbi8qKlxuICog6ZO+5o6l5Y+C5pWw6L2s5o2i5Li6b2JqXG4gKiDlhaXlj4Ig5a6M5pW06ZO+5o6lXG4gKiBAcGFyYW0geyp9IHVybFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyYW0yT2JqKHVybCkge1xuICBjb25zdCBzZWFyY2ggPSB1cmwuc3BsaXQoJz8nKVsxXVxuICBpZiAoIXNlYXJjaCkge1xuICAgIHJldHVybiB7fVxuICB9XG4gIHJldHVybiBKU09OLnBhcnNlKFxuICAgICd7XCInICtcbiAgICBkZWNvZGVVUklDb21wb25lbnQoc2VhcmNoKVxuICAgICAgLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxuICAgICAgLnJlcGxhY2UoLyYvZywgJ1wiLFwiJylcbiAgICAgIC5yZXBsYWNlKC89L2csICdcIjpcIicpICtcbiAgICAnXCJ9J1xuICApXG59XG5cblxuXG4vL+iOt+WPlmNvb2tpZeOAgVxuZXhwb3J0IGZ1bmN0aW9uIGdldENvb2tpZShuYW1lKSB7XG4gIHZhciBhcnIsIHJlZyA9IG5ldyBSZWdFeHAoXCIoXnwgKVwiICsgbmFtZSArIFwiPShbXjtdKikoO3wkKVwiKTtcbiAgaWYgKGFyciA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChyZWcpKVxuICAgIHJldHVybiAoYXJyWzJdKTtcbiAgZWxzZVxuICAgIHJldHVybiBudWxsO1xufVxuXG4vL+iuvue9rmNvb2tpZVxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZShjX25hbWUsIHZhbHVlLCBzZWNvbmQpIHtcbiAgdmFyIGV4ZGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGV4ZGF0ZS5zZXRUaW1lKGV4ZGF0ZS5nZXRUaW1lKCkgKyBzZWNvbmQgKiAxMDAwKTtcbiAgZG9jdW1lbnQuY29va2llID0gY19uYW1lICsgXCI9XCIgKyBlc2NhcGUodmFsdWUpICsgKChzZWNvbmQgPT0gbnVsbCkgPyBcIlwiIDogXCI7ZXhwaXJlcz1cIiArIGV4ZGF0ZS50b0dNVFN0cmluZygpKTtcbn07XG5cbi8v5Yig6ZmkY29va2llXG5leHBvcnQgZnVuY3Rpb24gZGVsQ29va2llKG5hbWUpIHtcbiAgdmFyIGV4cCA9IG5ldyBEYXRlKCk7XG4gIGV4cC5zZXRUaW1lKGV4cC5nZXRUaW1lKCkgLSAxKTtcbiAgdmFyIGN2YWwgPSBnZXRDb29raWUobmFtZSk7XG4gIGlmIChjdmFsICE9IG51bGwpXG4gICAgZG9jdW1lbnQuY29va2llID0gbmFtZSArIFwiPVwiICsgY3ZhbCArIFwiO2V4cGlyZXM9XCIgKyBleHAudG9HTVRTdHJpbmcoKTtcbn07XG5cblxuLyoqXG4gKiDojrflj5bnjq/looPkv6Hmga9cbiAqIEByZXR1cm4ge09iamVjdH0g546v5aKD5L+h5oGv5a+56LGhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnYoKSB7XG4gIHZhciBuYXYgPSB3aW5kb3cubmF2aWdhdG9yO1xuICB2YXIgZW52ID0ge1xuICAgIFwiaXBob25lXCI6IGZhbHNlLFxuICAgIFwiaXBhZFwiOiBmYWxzZSxcbiAgICBcImFuZHJvaWRcIjogZmFsc2UsXG4gICAgXCJwY1wiOiBmYWxzZSxcbiAgICBcImlvc1wiOiBmYWxzZSxcbiAgICBcInZlclwiOiBcIjBcIlxuICB9O1xuXG4gIHZhciB1YSA9IG5hdi51c2VyQWdlbnQ7XG4gIHZhciBhbmRyb2lkID0gdWEubWF0Y2goLyhBbmRyb2lkKVxccysoW1xcZC5dKykvKTtcbiAgdmFyIGlwYWQgPSB1YS5tYXRjaCgvKGlQYWQpLipPU1xccyhbXFxkX10rKS8pO1xuICB2YXIgaXBob25lID0gIWlwYWQgJiYgdWEubWF0Y2goLyhpUGhvbmVcXHNPUylcXHMoW1xcZF9dKykvKTtcbiAgaWYgKGlwYWQpIHtcbiAgICBlbnYuaXBhZCA9IGlwYWRbMV0gJiYgdHJ1ZSB8fCBmYWxzZTtcbiAgICBlbnYudmVyID0gaXBhZFsyXSAmJiBpcGFkWzJdLnJlcGxhY2UoLy0vZywgXCIuXCIpIHx8IFwiXCI7XG4gICAgZW52LmlvcyA9IHRydWU7XG4gIH0gZWxzZSBpZiAoaXBob25lKSB7XG4gICAgZW52LmlwaG9uZSA9IGlwaG9uZVsxXSAmJiB0cnVlIHx8IGZhbHNlO1xuICAgIGVudi52ZXIgPSBpcGhvbmVbMl0gJiYgaXBob25lWzJdLnJlcGxhY2UoLy0vZywgXCIuXCIpIHx8IFwiXCI7XG4gICAgZW52LmlvcyA9IHRydWU7XG4gIH0gZWxzZSBpZiAoYW5kcm9pZCkge1xuICAgIGVudi5hbmRyb2lkID0gYW5kcm9pZFsxXSAmJiB0cnVlIHx8IGZhbHNlO1xuICAgIGVudi52ZXIgPSBhbmRyb2lkWzJdO1xuICB9IGVsc2Uge1xuICAgIGVudi5wYyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gZW52O1xufVxuXG4vKipcbiAqIOiuvuWumumhtemdoiB0aXRsZVxuICogQHBhcmFtIHtbdHlwZV19IHRpdGxlIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRpdGxlKHRpdGxlKSB7XG4gIGlmICghdGl0bGUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZG9jdW1lbnQudGl0bGUgPSB0aXRsZTtcbiAgLy8gaWYgKEVOVi5pb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJtaWNyb21lc3NlbmdlclwiKSAhPT0gLTEpIHtcbiAgLy8g5L+u5aSN5b6u5L+h56uvSU9T5peg5rOV5L+u5pS5ZG9jdW1lbnQudGl0bGXnmoTmg4XlhrVcbiAgaWYgKGdldEVudigpLmlvcyAmJiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJtaWNyb21lc3NlbmdlclwiKSAhPT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJhbGlwYXlcIikgIT09IC0xKSkge1xuICAgIC8v5L+u5aSNSU9T5b6u5L+h56uv5ZKM5pSv5LuY5a6d5peg5rOV5L+u5pS5ZG9jdW1lbnQudGl0bGXnmoTmg4XlhrVcbiAgICB2YXIgJGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICRpZnJhbWUuY2xhc3NOYW1lID0gXCJDLWhpZGRlbklmcmFtZVwiO1xuICAgICRpZnJhbWUuc3JjID0gXCIvXCIgKyBsb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpWzFdICsgXCIvZmF2aWNvbi5pY29cIjtcbiAgICAkaWZyYW1lLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAkaWZyYW1lLnN0eWxlLndpZHRoID0gJzFweCc7XG4gICAgJGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMXB4JztcbiAgICAkaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uIG9uSWZyYW1lTG9hZCgpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAkaWZyYW1lLm9ubG9hZCA9IG51bGw7XG4gICAgICAgIG9uSWZyYW1lTG9hZCA9IG51bGw7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoJGlmcmFtZSk7XG4gICAgICAgICRpZnJhbWUgPSBudWxsO1xuICAgICAgfSwgMCk7XG4gICAgfTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCRpZnJhbWUpO1xuICB9XG59XG5cbi8vIOS4uumTvuaOpea3u+WKoOWPguaVsFxuZXhwb3J0IGZ1bmN0aW9uIGFkZFF1ZXJ5KHVybCwgcXVlcnkpIHtcbiAgcXVlcnkgPSBxdWVyeSB8fCB7fVxuICBxdWVyeSA9IChmdW5jdGlvbiAocXVlcnkpIHtcbiAgICB2YXIgcSA9IFtdXG4gICAgT2JqZWN0LmtleXMocXVlcnkpLmZvckVhY2goZnVuY3Rpb24gKF9xKSB7XG4gICAgICBxLnB1c2goX3EgKyAnPScgKyBxdWVyeVtfcV0pXG4gICAgfSlcbiAgICByZXR1cm4gcS5qb2luKCcmJylcbiAgfSkocXVlcnkpXG4gIGlmICh1cmwuaW5kZXhPZignPycpICE9PSAtMSkge1xuICAgIHVybCArPSAnJicgKyBxdWVyeVxuICB9IGVsc2Uge1xuICAgIHVybCArPSAnPycgKyBxdWVyeVxuICB9XG4gIHJldHVybiB1cmxcbn1cblxuXG4vKipcbiAqIOiOt+W+l+W9k+WJjemhtemdoueahHBhdGhcbiAqIEByZXR1cm4ge1N0cmluZ30g6aG16Z2icGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aCgpIHtcbiAgdmFyIHBhdGggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcbiAgcGF0aCA9IHBhdGggfHwgXCIjL1wiO1xuICBwYXRoID0gcGF0aCA9PT0gXCIjL1wiID8gXCIjL2luZGV4XCIgOiBwYXRoO1xuICBwYXRoID0gcGF0aC5zcGxpdChcIj9cIik7XG4gIHJldHVybiBwYXRoWzBdO1xufVxuXG4vLyDojrflj5YgdXJsIOWPguaVsFxuZXhwb3J0IGZ1bmN0aW9uIGdldFF1ZXJ5KG5hbWUpIHtcbiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCgobmV3IFJlZ0V4cCgnWz98Jl0nICsgbmFtZSArICc9JyArICcoW14mO10rPykoJnwjfDt8JCknKS5leGVjKGxvY2F0aW9uLmhyZWYpIHx8IFssIFwiXCJdKVsxXS5yZXBsYWNlKC9cXCsvZywgJyUyMCcpKSB8fCBudWxsO1xufVxuXG4vKipcbiAqIOS7juaVsOe7hOS4reiOt+WPliBrZXnmnKp2YWx1ZeeahOWvueixoVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JqQnlMaXN0S2V5VmFsdWUodmFsdWUsIGtleSwgbGlzdCkge1xuICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgbGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGlmIChlbGVtZW50W2tleSArIFwiXCJdID09IHZhbHVlKSB7XG4gICAgICByZXN1bHQgPSBlbGVtZW50O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICog5oqKIFxcbuaNouihjOespui9rOaNouaIkDxicj5cbiAqIOi9rOaNouWQjumcgOimgeeUqCB2LWh0bWzmuLLmn5NcbiAqIOeUqHt7fX3kvJrlvZPmiJDlrZfnrKbkuLLmioogaHRtbOa4suafk+WHuuadpVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QnIoc3RyKSB7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9cXG4vZywgJzxici8+JylcbiAgcmV0dXJuIHN0clxufTtcblxuXG4vKipcbiAqIEBkZXNjIOWHveaVsOmYsuaKllxuICogQHBhcmFtIGZ1bmMg5Ye95pWwXG4gKiBAcGFyYW0gd2FpdCDlu7bov5/miafooYzmr6vnp5LmlbBcbiAqIEBwYXJhbSBpbW1lZGlhdGUgdHJ1ZSDooajnq4vljbPmiafooYzvvIxmYWxzZSDooajpnZ7nq4vljbPmiafooYxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuICBsZXQgdGltZW91dDtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGxldCBjb250ZXh0ID0gdGhpcztcbiAgICBsZXQgYXJncyA9IGFyZ3VtZW50cztcblxuICAgIGlmICh0aW1lb3V0KSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgdmFyIGNhbGxOb3cgPSAhdGltZW91dDtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICB9LCB3YWl0KVxuICAgICAgaWYgKGNhbGxOb3cpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgICB9LCB3YWl0KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzYyDlh73mlbDoioLmtYFcbiAqIEBwYXJhbSBmdW5jIOWHveaVsFxuICogQHBhcmFtIHdhaXQg5bu26L+f5omn6KGM5q+r56eS5pWwXG4gKiBAcGFyYW0gdHlwZSAxIOihqOaXtumXtOaIs+eJiO+8jDIg6KGo5a6a5pe25Zmo54mIXG4gKiDml7bpl7TmiLPniYjnmoTlh73mlbDop6blj5HmmK/lnKjml7bpl7TmrrXlhoXlvIDlp4vnmoTml7blgJnvvIzogIzlrprml7blmajniYjnmoTlh73mlbDop6blj5HmmK/lnKjml7bpl7TmrrXlhoXnu5PmnZ/nmoTml7blgJnjgIJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICB2YXIgcHJldmlvdXMgPSAwO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IDIpIHtcbiAgICB2YXIgdGltZW91dDtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGxldCBjb250ZXh0ID0gdGhpcztcbiAgICBsZXQgYXJncyA9IGFyZ3VtZW50cztcbiAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgIGlmIChub3cgLSBwcmV2aW91cyA+IHdhaXQpIHtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAyKSB7XG4gICAgICBpZiAoIXRpbWVvdXQpIHtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncylcbiAgICAgICAgfSwgd2FpdClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiDlh6Dnp43luLjnlKjnmoTmoKHpqozmlrnlvI9cbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGFjdE1ldGhvZENoZWNrKHR5cGUsIHZhbHVlKSB7XG4gIGlmICh0eXBlID09ICdoa21vYmlsZScpIHtcbiAgICByZXR1cm4gL15bNTY4OV17MX1cXGR7N30kLy50ZXN0KHZhbHVlKTtcbiAgfVxuXG4gIGlmICh0eXBlID09ICdtb2JpbGUnKSB7XG4gICAgcmV0dXJuIC9eKCgxM1swLTldKXwoMTRbNSw3LDldKXwoMTUoWzAtM118WzUtOV0pKXwoMTY2KXwoMTdbMC05XSl8KDE4WzAtOV0pfCgxOVswLTldKSlcXGR7OH0kLy50ZXN0KHZhbHVlKTtcbiAgfVxuXG4gIGlmICh0eXBlID09ICdlbWFpbCcpIHtcbiAgICByZXR1cm4gL14oXFx3LSpcXC4qKStAKFxcdy0/KSsoXFwuXFx3ezIsfSkrJC8udGVzdCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQVFBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBR0E7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTs7Ozs7OztBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/utils/utils.js\n");

/***/ }),

/***/ 0:
/*!***************************!*\
  !*** multi ./src/main.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__(/*! ./src/main.js */"./src/main.js");


/***/ }),

/***/ 1:
/*!******************************!*\
  !*** min-document (ignored) ***!
  \******************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("/* (ignored) *///# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9taW4tZG9jdW1lbnQgKGlnbm9yZWQpP2Q4ZGEiXSwic291cmNlc0NvbnRlbnQiOlsiLyogKGlnbm9yZWQpICovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n");

/***/ })

/******/ });